generated from coulomb/repo-seed
feat(P3): IHF Phase 3 complete — Governance and Decision Linkage
Implements the full governance layer: - Schema: requirements, decision_records, policy_references, implementation_change_references; requirement_candidates gets requirement_id back-reference - RequirementsController (index/show; promotion-only create) - DecisionRecordsController (CRUD + policy/impl ref management) - GovernanceDashboardAction on HubsController (AutoRefresh) - PromoteToRequirementAction + LinkToDecisionAction on candidates - Outcome immutability enforced at controller level (fill excludes outcome) - Full six-outcome vocabulary with Tailwind color roles - Integration tests for all Phase 3 paths - FrontController: registers Phase 2 missing controllers + all Phase 3 - SCOPE.md + docs/phase3-summary.md updated Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
31
Web/Types.hs
31
Web/Types.hs
@@ -18,12 +18,13 @@ 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) }
|
||||
| TriageDashboardAction { hubId :: !(Id Hub) }
|
||||
| EditHubAction { hubId :: !(Id Hub) }
|
||||
| UpdateHubAction { hubId :: !(Id Hub) }
|
||||
| DeleteHubAction { hubId :: !(Id Hub) }
|
||||
| TriageDashboardAction { hubId :: !(Id Hub) }
|
||||
| GovernanceDashboardAction { hubId :: !(Id Hub) }
|
||||
deriving (Eq, Show, Data)
|
||||
|
||||
data WidgetsController
|
||||
@@ -65,6 +66,26 @@ data RequirementCandidatesController
|
||||
| UpdateTriageStatusAction { requirementCandidateId :: !(Id RequirementCandidate) }
|
||||
| AssignReviewerAction { requirementCandidateId :: !(Id RequirementCandidate) }
|
||||
| MyQueueAction
|
||||
| PromoteToRequirementAction { requirementCandidateId :: !(Id RequirementCandidate) }
|
||||
| LinkToDecisionAction { requirementCandidateId :: !(Id RequirementCandidate) }
|
||||
deriving (Eq, Show, Data)
|
||||
|
||||
data RequirementsController
|
||||
= RequirementsAction
|
||||
| ShowRequirementAction { requirementId :: !(Id Requirement) }
|
||||
deriving (Eq, Show, Data)
|
||||
|
||||
data DecisionRecordsController
|
||||
= DecisionRecordsAction
|
||||
| ShowDecisionRecordAction { decisionRecordId :: !(Id DecisionRecord) }
|
||||
| NewDecisionRecordAction
|
||||
| CreateDecisionRecordAction
|
||||
| EditDecisionRecordAction { decisionRecordId :: !(Id DecisionRecord) }
|
||||
| UpdateDecisionRecordAction { decisionRecordId :: !(Id DecisionRecord) }
|
||||
| AddPolicyReferenceAction { decisionRecordId :: !(Id DecisionRecord) }
|
||||
| DeletePolicyReferenceAction { policyReferenceId :: !(Id PolicyReference) }
|
||||
| AddImplementationRefAction { decisionRecordId :: !(Id DecisionRecord) }
|
||||
| DeleteImplementationRefAction { implementationChangeReferenceId :: !(Id ImplementationChangeReference) }
|
||||
deriving (Eq, Show, Data)
|
||||
|
||||
data SessionsController
|
||||
|
||||
Reference in New Issue
Block a user