Files
inter-hub/docs/phase7-summary.md
Bernd Worsch 98fb159582
Some checks failed
Test / test (push) Has been cancelled
feat(P7): IHF Phase 7 complete — advanced observability and operational integration
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>
2026-03-29 21:49:22 +00:00

5.0 KiB
Raw Blame History

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 (0100): min 100 (annotationCount*5 + errorEventCount*10 + regressionFlag?20:0 + staleCandidateCount*8)
  • Bands: 019 green, 2039 yellow, 4059 amber, 60+ red
  • Application/Helper/FrictionScore.hscomputeFrictionScore, scoreBand

BottleneckRecord (bottleneck_records)

  • Detected stalls at four pipeline stages
  • Severity: mediumhighcritical based on how far past the threshold
  • resolved_at nullable — partial index on WHERE resolved_at IS NULL for fast active queries
  • Application/Helper/BottleneckDetector.hsdetectBottlenecks
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 SnapshotHubHealthAction inserts a new row
  • Score formula (0100): max 0 (100 - openCandidates*5 - regressedWidgets*10 - staleDecisions*8 - criticalBN*12 - highBN*6)
  • Application/Helper/HubHealth.hscomputeHubHealth, healthScoreBadge

CrossHubPropagation (cross_hub_propagations)

  • Status lifecycle: open → acknowledged → resolved
  • Application/Helper/CrossHubPropagation.hsdetectPropagations
  • Two heuristics:
    • annotation_cluster: same annotation category with ≥3 occurrences in ≥2 hubs within 14 days
    • widget_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 RecomputeFrictionAction for 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 HubHealthSnapshot for 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 RecomputeFrictionAction on all relevant hubs before DetectPropagationsAction, 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.
  • subjectId in BottleneckRecord is untyped UUID. The subject_type column 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:

  • CrossHubPropagation already models multi-hub patterns; Phase 8 routing can act on these
  • HubHealthSnapshot history provides a baseline for measuring federated governance quality
  • The OperationalReviewBoard is 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 HubPolicy table