T01 schema: friction_scores, bottleneck_records, hub_health_snapshots, cross_hub_propagations + migration 1743552000. T02 Widget Pain Heatmap: computeFrictionScore (formula documented), RecomputeFriction action, colour-coded grid view (green/yellow/amber/red). T03 Workflow Bottleneck Analysis: detectBottlenecks across 4 pipeline stages (candidate 30d, requirement 60d, decision 30d, observation 14d), idempotent, severity from age ratio, resolve action. T04 Hub Health Correlation: computeHubHealth (deduction table documented), append-only HubHealthSnapshot, health history view, badge on hub Show page. T05 Cross-Hub Propagation: annotation_cluster + widget_type_friction heuristics, idempotent detection, acknowledge/resolve lifecycle. T06 Operational Review Board: 4-panel AutoRefresh global dashboard — health matrix, top-10 friction, bottleneck stage counts, open propagations. T07 gate: 5 describe blocks in Test/Integration.hs; SCOPE.md updated Phase 7 complete; docs/phase7-summary.md written. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
5.0 KiB
IHF Phase 7 Summary — Advanced Observability and Operational Integration
What Was Built
Phase 7 turns the accumulated interaction data into operational intelligence. Four new data artifacts and five new views/dashboards give hub leaders a clear picture of where friction is concentrated, where the governance pipeline is stalling, and how hub health is trending over time.
Data Artifacts
FrictionScore (friction_scores)
- One row per widget (unique constraint on
widget_id); upserted on recompute - Score formula (0–100):
min 100 (annotationCount*5 + errorEventCount*10 + regressionFlag?20:0 + staleCandidateCount*8) - Bands: 0–19 green, 20–39 yellow, 40–59 amber, 60+ red
Application/Helper/FrictionScore.hs—computeFrictionScore,scoreBand
BottleneckRecord (bottleneck_records)
- Detected stalls at four pipeline stages
- Severity:
medium→high→criticalbased on how far past the threshold resolved_atnullable — partial index onWHERE resolved_at IS NULLfor fast active queriesApplication/Helper/BottleneckDetector.hs—detectBottlenecks
| Stage | Subject | Threshold |
|---|---|---|
candidate |
RequirementCandidate open | 30 days |
requirement |
Requirement without DecisionRecord | 60 days |
decision |
DecisionRecord without DeploymentRecord | 30 days |
observation |
DeploymentRecord without OutcomeSignal | 14 days |
HubHealthSnapshot (hub_health_snapshots)
- Append-only; every
SnapshotHubHealthActioninserts a new row - Score formula (0–100):
max 0 (100 - openCandidates*5 - regressedWidgets*10 - staleDecisions*8 - criticalBN*12 - highBN*6) Application/Helper/HubHealth.hs—computeHubHealth,healthScoreBadge
CrossHubPropagation (cross_hub_propagations)
- Status lifecycle:
open → acknowledged → resolved Application/Helper/CrossHubPropagation.hs—detectPropagations- Two heuristics:
annotation_cluster: same annotation category with ≥3 occurrences in ≥2 hubs within 14 dayswidget_type_friction: same widget type with FrictionScore ≥40 in ≥2 hubs
Views and Actions
Friction Heatmap (FrictionHeatmapAction { hubId })
- Grid of widget cards, colour-coded by score band
- "Recompute" button triggers
RecomputeFrictionActionfor all hub widgets - Linked from hub Show page as "Friction"
Bottleneck Dashboard (BottleneckDashboardAction { hubId })
- Table grouped by pipeline stage; severity badge on each row
- "Detect" button runs
DetectBottlenecksAction - "Resolve" marks
resolved_at; idempotent detection skips existing active records - Linked from hub Show page as "Bottlenecks"
Hub Health History (HubHealthHistoryAction { hubId })
- Latest snapshot shown prominently with component breakdown
- Full history table in reverse chronological order
- "Take Snapshot" triggers
SnapshotHubHealthAction - Linked from hub Show page as "Health"
Operational Review Board (OperationalReviewBoardAction)
- Global view, no hub scope — all hubs, all data
- Panel 1: Hub health matrix — all hubs, latest score, link to history
- Panel 2: Top 10 friction widgets across all hubs
- Panel 3: Active bottleneck counts by pipeline stage
- Panel 4: Open/acknowledged cross-hub propagation events
autoRefresh— live-updates- Linked from global nav as "Ops Review"
Cross-Hub Propagations (CrossHubPropagationsAction)
- Global list of all propagation events with status badges
- "Detect" triggers
DetectPropagationsAction(idempotent) - Acknowledge / Resolve actions per row
- Linked from global nav as "Propagations"
Known Limitations
- Friction scores are not append-only. There is no friction history — only the current score per widget. Use
HubHealthSnapshotfor hub-level trends over time. - Bottleneck detection requires manually triggering. Phase 7 does not introduce scheduled jobs. Detection runs on demand via the UI or
curl. A future phase can layer on a devenv cron task. - Cross-hub detection requires current friction scores. Run
RecomputeFrictionActionon all relevant hubs beforeDetectPropagationsAction, or detection will use stale/absent scores. - OperationalReviewBoard top-10 friction is sorted globally — not scoped to a hub. A widget from a single hub could dominate the list if that hub has very high friction scores.
subjectIdin BottleneckRecord is untyped UUID. Thesubject_typecolumn disambiguates, but there is no FK constraint — subject records can be deleted without cascading. A future phase can add per-stage FK columns.
Phase 8 Readiness
Phase 8 (Federated Hub Maturity) can build on Phase 7:
CrossHubPropagationalready models multi-hub patterns; Phase 8 routing can act on theseHubHealthSnapshothistory provides a baseline for measuring federated governance quality- The
OperationalReviewBoardis already global — Phase 8 can add per-organization or per-team scoping - Bottleneck thresholds are constants in helper modules — Phase 8 can make them configurable per hub via a
HubPolicytable