feat(P2+P3): IHF Phase 2 complete; register Phase 3 workplan

Phase 2 — Structured Feedback and Triage (IHUB-WP-0002):
- Schema: annotation_threads, requirement_candidates, triage_states,
  reviewer_assignments; annotations extended with severity + thread_id
- AnnotationThreadsController: create threads, assign annotations
- RequirementCandidatesController: CRUD, escalation, triage lifecycle,
  reviewer assignment, my-queue
- Annotation severity (low/medium/high/critical) with Tailwind color cues
- TriageDashboardAction on HubsController with autoRefresh
- Integration tests (T01–T09), SCOPE.md updated, docs/phase2-summary.md

Phase 3 — Governance and Decision Linkage (IHUB-WP-0003):
- Workplan registered: 9 tasks, State Hub workstream 5f201ee3

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-28 23:37:34 +00:00
parent cfcf4c81f7
commit 840b0e5c7b
25 changed files with 2136 additions and 29 deletions

View File

@@ -18,11 +18,12 @@ data WebApplication = WebApplication deriving (Eq, Show)
data HubsController
= HubsAction
| NewHubAction
| ShowHubAction { hubId :: !(Id Hub) }
| ShowHubAction { hubId :: !(Id Hub) }
| CreateHubAction
| EditHubAction { hubId :: !(Id Hub) }
| UpdateHubAction { hubId :: !(Id Hub) }
| DeleteHubAction { hubId :: !(Id Hub) }
| EditHubAction { hubId :: !(Id Hub) }
| UpdateHubAction { hubId :: !(Id Hub) }
| DeleteHubAction { hubId :: !(Id Hub) }
| TriageDashboardAction { hubId :: !(Id Hub) }
deriving (Eq, Show, Data)
data WidgetsController
@@ -39,9 +40,31 @@ data InteractionEventsController
deriving (Eq, Show, Data)
data AnnotationsController
= WidgetAnnotationsAction { widgetId :: !(Id Widget) }
| NewAnnotationAction { widgetId :: !(Id Widget) }
| CreateAnnotationAction { widgetId :: !(Id Widget) }
= WidgetAnnotationsAction { widgetId :: !(Id Widget) }
| ShowAnnotationAction { annotationId :: !(Id Annotation) }
| NewAnnotationAction { widgetId :: !(Id Widget) }
| CreateAnnotationAction { widgetId :: !(Id Widget) }
| EscalateAnnotationAction { annotationId :: !(Id Annotation) }
deriving (Eq, Show, Data)
data AnnotationThreadsController
= WidgetAnnotationThreadsAction { widgetId :: !(Id Widget) }
| ShowAnnotationThreadAction { annotationThreadId :: !(Id AnnotationThread) }
| NewAnnotationThreadAction { widgetId :: !(Id Widget) }
| CreateAnnotationThreadAction { widgetId :: !(Id Widget) }
| AssignAnnotationToThreadAction { annotationId :: !(Id Annotation) }
deriving (Eq, Show, Data)
data RequirementCandidatesController
= RequirementCandidatesAction
| ShowRequirementCandidateAction { requirementCandidateId :: !(Id RequirementCandidate) }
| NewRequirementCandidateAction
| CreateRequirementCandidateAction
| EditRequirementCandidateAction { requirementCandidateId :: !(Id RequirementCandidate) }
| UpdateRequirementCandidateAction { requirementCandidateId :: !(Id RequirementCandidate) }
| UpdateTriageStatusAction { requirementCandidateId :: !(Id RequirementCandidate) }
| AssignReviewerAction { requirementCandidateId :: !(Id RequirementCandidate) }
| MyQueueAction
deriving (Eq, Show, Data)
data SessionsController