ADR-005: ITSM Dashboard Data Flow ArchitectureΒΆ
Status: Proposed Date: 2026-01-24 Deciders: @cloud-architect, @product-owner, HITL/Manager
ContextΒΆ
Cloud-Infrastructure project requires ITSM (IT Service Management) dashboard to visualize Jira Service Management tickets from Azure (541 tickets) and AWS (2,458 tickets) projects.
Current StateΒΆ
- Data Source: Excel exports from Jira (manual export workflow)
- Azure: 541 tickets (
dashboards/itsm/architecture/Azure-Tickets.xlsx) - AWS: 2,458 tickets (
dashboards/itsm/architecture/AWS-Tickets.xlsx) - Schema: 17 fields (ticket ID, status, priority, assignee, created, resolved, SLA, etc.)
- Mockup: Dashboard-JSM.png shows KPI cards, trend charts, data tables
- Existing Skill:
jira-itsm-dashboard/SKILL.md(referenced but not found - needs creation) - MCP Config:
.mcp-atlassian.jsonwith atlassian-rovo server (PILOT status, Q2-Q3 2026)
Target StateΒΆ
- Data Sources: 1. Phase 1 (MVP): Excel exports (existing data, immediate value) 2. Phase 2 (Pilot): Atlassian Rovo MCP (real-time API access, Q2-Q3 2026)
- Visualization: Vizro dashboards with KPI cards, trend charts, tables
- Schema: 17-field normalized schema with validation
- Automation: Playwright E2E tests with screenshot evidence
ConstraintsΒΆ
- MUST support Excel imports for immediate MVP delivery (no API dependency blocking)
- MUST NOT expose PII (assignee names) in shared reports (data privacy)
- MUST align with Dashboard-JSM.png mockup (KPI layout, chart types)
- MUST follow Local-First 3-tier testing strategy
- MAY integrate Atlassian Rovo MCP in Phase 2 (Q2-Q3 2026 pilot, not blocking MVP)
ITSM Dashboard Mockup AnalysisΒΆ
From Dashboard-JSM.png: - Top Row: 4 KPI cards (Total Tickets, Open Tickets, SLA Compliance %, Avg Resolution Time) - Second Row: 2 trend charts (Tickets by Status Over Time, Tickets by Priority) - Third Row: 2 bar charts (Top 5 Services, Tickets by Assignee) - Bottom Row: Data table with filters (sortable, searchable, paginated) - Controls: Date range filter, project filter (Azure/AWS/All), status filter
DecisionΒΆ
Adopt a 2-phase hybrid architecture: Excel-first MVP (immediate value) β MCP integration (pilot in Q2-Q3 2026).
Architecture Pattern: Phased Hybrid IntegrationΒΆ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β ITSM DASHBOARD ARCHITECTURE (2-PHASE) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β PHASE 1: MVP (Excel Ground Truth) β β
β β Timeline: Sprint 6 (2026-01-24 to 2026-02-07) β β
β βββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββ β
β β DATA INGESTION LAYER (Excel β JSON) β β
β β β β
β β ββββββββββββββββ ββββββββββββββββ β β
β β β Azure-Ticketsβ β AWS-Tickets β β β
β β β .xlsx β β .xlsx β β β
β β β (541 tickets)β β (2,458 tix) β β β
β β ββββββββ¬ββββββββ ββββββββ¬ββββββββ β β
β β β β β β
β β βββββββββββ¬ββββββββββββββββ β β
β β β β β
β β βββββββββββΌββββββββββ β β
β β β Excel Loader β β β
β β β (pandas/openpyxl)β β β
β β βββββββββββ¬ββββββββββ β β
β β β β β
β β βββββββββββΌββββββββββ β β
β β β Schema Validator β β β
β β β (Pydantic model) β β β
β β βββββββββββ¬ββββββββββ β β
β β β β β
β β βββββββββββΌββββββββββ β β
β β β PII Masking β β β
β β β (Assignee β ID) β β β
β β βββββββββββ¬ββββββββββ β β
β β β β β
β β βββββββββββΌββββββββββ β β
β β β JSON Export β β β
β β β (normalized data)β β β
β β βββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββ β
β β VISUALIZATION LAYER (Vizro Dashboard) β β
β β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β
β β β KPI Cards β β Trend Charts β β Bar Charts β β β
β β β β β β β β β β
β β β β’ Total Tix β β β’ Status/Timeβ β β’ Top Servicesβ β β
β β β β’ Open Tix β β β’ Priority β β β’ Assignees β β β
β β β β’ SLA % β β β β β β β
β β β β’ Avg Resolveβ β β β β β β
β β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β Data Table (Sortable, Filterable) ββ β
β β β Columns: ID, Status, Priority, Created, Resolved... ββ β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β Vizro Core Engine ββ β
β β β (Plotly + Dash + Pydantic + McKinsey Visual Vocab) ββ β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββ β
β β EVIDENCE LAYER (Playwright) β β
β β - Screenshots: tmp/evidence/itsm-dashboard-*.png β β
β β - JSON Data: tmp/evidence/itsm-dashboard-data.json β β
β β - HTML Export: tmp/evidence/itsm-dashboard.html β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β PHASE 2: MCP INTEGRATION (Q2-Q3 2026 PILOT) β β
β β Timeline: Post-Sprint 6, depends on Rovo MCP pilot success β β
β βββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββ β
β β DATA INGESTION LAYER (MCP β JSON) β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β Atlassian Rovo MCP (SSE Transport) ββ β
β β β URL: https://mcp.atlassian.com/v1/sse ββ β
β β β Auth: ATLASSIAN_API_TOKEN (OAuth 2.1) ββ β
β β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ β
β β β β β
β β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ β
β β β MCP Capabilities: ββ β
β β β - jira.issues.search (JQL query) ββ β
β β β - jira.issues.read (ticket details) ββ β
β β β - jira.projects.read (project metadata) ββ β
β β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββ β
β β β β β
β β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ β
β β β Real-Time Data Pipeline: ββ β
β β β 1. JQL Query β Filter by project (AWS/Azure) ββ β
β β β 2. Rate Limit: 60 req/min (IBM Gateway Pattern) ββ β
β β β 3. Schema Transform β Pydantic model ββ β
β β β 4. PII Masking β Assignee ID ββ β
β β β 5. JSON Export β Same format as Excel pipeline ββ β
β β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββ β
β β DUAL-SOURCE VALIDATION (Cross-Validation) β β
β β - Compare Excel data vs MCP data (agreement β₯95%) β β
β β - Detect discrepancies (ticket count, status, SLA) β β
β β - Evidence: tmp/evidence/itsm-cross-validation.json β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
17-Field ITSM Schema (Pydantic Model)ΒΆ
from pydantic import BaseModel, Field
from datetime import datetime
from enum import Enum
from typing import Optional
class IssueType(str, Enum):
INCIDENT = "Incident"
SERVICE_REQUEST = "Service Request"
PROBLEM = "Problem"
CHANGE = "Change"
class Priority(str, Enum):
P1_CRITICAL = "P1-Critical"
P2_HIGH = "P2-High"
P3_MEDIUM = "P3-Medium"
P4_LOW = "P4-Low"
class Status(str, Enum):
OPEN = "Open"
IN_PROGRESS = "In Progress"
RESOLVED = "Resolved"
CLOSED = "Closed"
WAITING_FOR_CUSTOMER = "Waiting for Customer"
class ITSMTicket(BaseModel):
"""17-field normalized ITSM ticket schema"""
# Core identifiers
ticket_id: str = Field(..., description="Jira ticket ID (e.g., AWS-1234)")
project: str = Field(..., description="Project key (AWS or Azure)")
# Ticket classification
issue_type: IssueType
priority: Priority
status: Status
# Assignee (PII-masked in shared reports)
assignee_id: str = Field(..., description="Masked assignee ID (not name)")
assignee_name: Optional[str] = Field(None, description="Real name (internal only)")
# Service context
service: str = Field(..., description="Affected service/component")
summary: str = Field(..., description="Ticket summary")
# Timestamps
created_at: datetime
resolved_at: Optional[datetime] = None
closed_at: Optional[datetime] = None
# SLA metrics
sla_target_hours: int = Field(..., description="SLA target (hours)")
sla_met: bool = Field(..., description="SLA compliance flag")
resolution_hours: Optional[float] = Field(None, description="Actual resolution time")
# Customer context
customer_org: str = Field(..., description="Customer organization")
severity: Optional[int] = Field(None, ge=1, le=5, description="Severity rating 1-5")
File StructureΒΆ
Cloud-Infrastructure/
βββ dashboards/
β βββ itsm/
β βββ architecture/
β β βββ Dashboard-JSM.png (mockup reference)
β β βββ Azure-Tickets.xlsx (ground truth, 541 tickets)
β β βββ AWS-Tickets.xlsx (ground truth, 2,458 tickets)
β βββ config/
β β βββ dashboard-itsm.yaml (Vizro configuration)
β β βββ schema.py (Pydantic model - 17 fields)
β βββ data_sources/
β β βββ excel_loader.py (Phase 1: Excel β JSON)
β β βββ mcp_loader.py (Phase 2: Rovo MCP β JSON)
β βββ components/
β β βββ kpi_cards.py (Total, Open, SLA%, Avg Resolve)
β β βββ trend_charts.py (Status/Time, Priority)
β β βββ bar_charts.py (Top Services, Assignees)
β β βββ data_table.py (Sortable, filterable table)
β βββ validation/
β β βββ cross_validator.py (Excel vs MCP comparison)
β β βββ pii_masker.py (Assignee name β ID)
β βββ app.py (Vizro dashboard entry point)
β βββ Dockerfile (containerized dashboard)
β βββ docker-compose.yml (Local-First development)
βββ .mcp-atlassian.json (Rovo MCP config, PILOT status)
βββ tmp/cloud-infrastructure/itsm/
βββ evidence/
β βββ itsm-dashboard-*.png (Playwright screenshots)
β βββ itsm-dashboard-data.json (normalized data)
β βββ itsm-cross-validation.json (Phase 2: Excel vs MCP)
βββ data/
βββ azure-tickets-normalized.json (Phase 1 output)
βββ aws-tickets-normalized.json (Phase 1 output)
ConsequencesΒΆ
PositiveΒΆ
- Immediate Value: Phase 1 delivers MVP using existing Excel data (no API blocking)
- Data Privacy: PII masking ensures assignee names not exposed in shared reports
- Mockup Alignment: Vizro dashboard matches Dashboard-JSM.png layout
- Future-Proof: Phase 2 MCP integration path defined (not blocking MVP)
- Dual-Source Validation: Excel ground truth enables cross-validation of MCP data (β₯95% agreement)
- Reusable Pattern: Excel β JSON pipeline reusable for other Jira exports
NegativeΒΆ
- Manual Export: Phase 1 requires manual Excel export workflow (not real-time)
- Data Staleness: Excel data is point-in-time snapshot (not live updates)
- Dual Maintenance: Need to maintain both Excel and MCP data loaders (Phase 2)
- MCP Dependency: Phase 2 requires Atlassian Rovo MCP pilot success (Q2-Q3 2026)
- SSE Transport: Rovo MCP uses deprecated SSE (migration to Streamable HTTP required by Q3 2026)
RisksΒΆ
| Risk | Probability | Impact | Mitigation |
|---|---|---|---|
| Excel Schema Drift | Medium | Medium | Validate schema on every import; Fail fast if fields missing |
| PII Leak | Low | High | Enforce PII masking in data loader; Playwright tests verify no names in screenshots |
| Rovo MCP Pilot Failure | Medium | Low | Phase 1 Excel pipeline remains fallback; No MVP blocking |
| SSE Deprecation | High | Medium | Monitor Atlassian migration timeline; Plan HTTP transport upgrade by Q3 2026 |
| Rate Limit Exceeded | Low | Low | IBM Gateway Pattern enforces 60 req/min; Cache responses; Batch queries |
| Data Volume | Low | Medium | 2,999 tickets (541+2,458) manageable; Paginate table; Filter by date range |
Alternatives ConsideredΒΆ
Alternative 1: Direct Jira REST APIΒΆ
- Rejected: No MCP integration; Requires custom authentication; Less ADLC-aligned
- Benefit: Well-documented API; No pilot dependency
- Trade-off: No Claude-native integration; Manual API client development; Higher maintenance
Alternative 2: Jira Data Center Export APIΒΆ
- Rejected: Enterprise feature (not available in Cloud); Overkill for 3k tickets
- Benefit: Bulk export capabilities; Automated scheduling
- Trade-off: Licensing cost; Not applicable to Cloud instances
Alternative 3: Real-Time MCP Only (No Excel)ΒΆ
- Rejected: Blocks MVP on Rovo MCP pilot (Q2-Q3 2026); High risk
- Benefit: Single data source; Always current data
- Trade-off: No immediate value; Pilot dependency; Excel ground truth lost
Alternative 4: CSV Export (Not Excel)ΒΆ
- Rejected: Excel already provided; CSV loses metadata (formulas, types)
- Benefit: Simpler parsing (csv.DictReader)
- Trade-off: Need to regenerate exports; Excel more robust for date/currency types
ReferencesΒΆ
- Atlassian Rovo MCP Documentation
- Vizro Documentation
- ADLC Constitution Principle VI: Governance
- Analytics Dashboard Skill
- Dashboard Mockup
EvidenceΒΆ
- Architecture diagram:
tmp/cloud-infrastructure/architecture-decisions/ADR-005-diagram.txt(this file - ASCII art) - Mockup reference:
dashboards/itsm/architecture/Dashboard-JSM.png(validated) - Ground truth data:
dashboards/itsm/architecture/{Azure|AWS}-Tickets.xlsx(541 + 2,458 tickets) - MCP config:
.mcp-atlassian.json(PILOT status, rate limit 60 req/min) - Schema: 17-field Pydantic model (defined in this ADR)
- Cross-validation target: β₯95% (Excel vs MCP agreement in Phase 2)
ApprovalΒΆ
- cloud-architect: Approved (92% agreement score)
- product-owner: Pending coordination evidence
- HITL/Manager: Pending production deployment approval
- security-compliance-engineer: Pending PII masking validation
Version: 1.0.0 Constitutional Checkpoint: CHK049 (Agentic behavior specification), CHK050 (SOPs defined), CHK033 (Data privacy) Next Phase: Build Phase (Excel loader + Vizro YAML configuration) Phase 2 Trigger: Atlassian Rovo MCP pilot success (Q2-Q3 2026)