Files
inter-hub/workplans/IHUB-WP-0002-ihf-phase2-structured-feedback-and-triage.md
Bernd Worsch 840b0e5c7b 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>
2026-03-29 10:42:56 +00:00

230 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
id: IHUB-WP-0002
type: workplan
title: "IHF Phase 2 — Structured Feedback and Triage"
domain: custodian
repo: inter-hub
status: done
owner: custodian
topic_slug: custodian
created: "2026-03-28"
updated: "2026-03-28"
state_hub_workstream_id: "25d4c92c-b213-4c33-9404-822192899de7"
---
# IHF Phase 2 — Structured Feedback and Triage
## Goal
Transform raw annotations into structured, operable feedback. Introduces
AnnotationThread (grouping), RequirementCandidate (escalation), TriageState
(lifecycle), and ReviewerAssignment (ownership). Operator triage dashboard
with AutoRefresh.
## Background
Phase 1 delivered the minimal interaction core: widget registry, interaction
event capture, annotation system, and hub-level operator dashboard. Phase 2
closes the gap between raw observation and structured, actionable feedback —
enabling operators to group annotations, escalate them into requirement
candidates, and drive them through a triage lifecycle.
**Entry criteria:** Phase 1 complete (T01T12 all done, WP-0001 status=done).
Reference: `docs/ihp-overview.md`, `docs/ihp-data-and-queries.md`,
`docs/ihp-controllers-views-forms.md`, `docs/ihp-realtime.md`,
`docs/ihp-ihf-mapping.md`.
## Phase 2 Exit Criteria
- Annotations can be grouped into AnnotationThreads
- Annotations can be escalated into RequirementCandidates
- RequirementCandidates have a full triage lifecycle (open → in_review → accepted/rejected/deferred)
- Reviewers can be assigned to candidates
- Operator triage dashboard live-updates via AutoRefresh
- All integration tests passing
- SCOPE.md updated to reflect Phase 2 completion
## Data Artifacts Introduced (Phase 2)
`AnnotationThread`, `RequirementCandidate`, `TriageState`, `ReviewerAssignment`
---
## Tasks
### T01 — Schema: AnnotationThread, RequirementCandidate, TriageState, ReviewerAssignment
```task
id: IHUB-WP-0002-T01
status: done
priority: high
state_hub_task_id: "eb267a9e-7e80-4913-b7a3-7f5adb04a0f2"
```
Add Phase 2 tables to `Application/Schema.sql` and write migration. Add
severity/intensity field to annotations table. Define:
- `AnnotationThread` — grouping of related annotations
- `RequirementCandidate` — escalated feedback record
- `TriageState` — per-candidate lifecycle row
- `ReviewerAssignment` — ownership record
Generate IHP types via the IDE code generator.
**Exit criteria:** `migrate` succeeds; IHP generated types compile cleanly.
---
### T02 — Severity markers on Annotation
```task
id: IHUB-WP-0002-T02
status: done
priority: high
state_hub_task_id: "fdcbf823-484e-4f0f-a0ca-28f9222520af"
```
Add severity field (low/medium/high/critical) to annotations table via
migration. Update `AnnotationsController` `CreateAnnotationAction` to accept
and validate severity. Update annotation form and list/show views to display
severity with appropriate visual cues (Tailwind color roles per spec).
**Exit criteria:** Annotations can be created with a severity; severity renders
with correct color coding in list and show views.
---
### T03 — AnnotationThread controller (duplicate grouping)
```task
id: IHUB-WP-0002-T03
status: done
priority: high
state_hub_task_id: "35b989a0-5e2a-4300-990b-f43d67de0727"
```
Scaffold `AnnotationThreadsController`. Allow operator to create a named thread
and manually assign annotations to it (many-to-one via `annotation.thread_id`
FK). Thread list view shows member annotation count, severity distribution, and
dominant category. Enables duplicate/similar-observation grouping.
**Exit criteria:** Threads can be created; annotations can be assigned to a
thread; thread list shows per-thread aggregates.
---
### T04 — RequirementCandidate controller and views
```task
id: IHUB-WP-0002-T04
status: done
priority: high
state_hub_task_id: "4eb2a51c-1b3f-4b36-b945-6bfb14c2e680"
```
Scaffold `RequirementCandidatesController`. CRUD: index, show, new/create,
edit/update (no delete). Fields: title, description, source_widget_id,
source_thread_id (optional), category, status (open). Index: list with status,
widget, category, reviewer. Show: full detail + linked annotations + triage
history.
**Exit criteria:** Candidates can be created manually; index and show pages
render correctly.
---
### T05 — Escalation action: Annotation(s) → RequirementCandidate
```task
id: IHUB-WP-0002-T05
status: done
priority: high
state_hub_task_id: "5c3a154b-38e0-4e40-9e97-57aae1dbc95d"
```
Add `EscalateAnnotationAction` (HTMX POST) on the annotation show/list page.
Pre-populates a new RequirementCandidate form with the annotation body and
category. On submit, creates the candidate and records `source_annotation_id`.
Add a visual indicator on escalated annotations.
**Exit criteria:** Operator can escalate an annotation to a candidate in one
action; escalated annotations show a visual marker.
---
### T06 — TriageState lifecycle per RequirementCandidate
```task
id: IHUB-WP-0002-T06
status: done
priority: high
state_hub_task_id: "cd8c3ef1-e0f7-435f-ae20-e0760df5da83"
```
Implement TriageState table (candidate_id, status, changed_by, changed_at,
notes). Status lifecycle: open → in_review → accepted | rejected | deferred.
Add `UpdateTriageStatusAction` (HTMX). Show full triage history on
RequirementCandidate show page. Validate allowed transitions.
**Exit criteria:** Status transitions work; invalid transitions are rejected;
full history visible on candidate show page.
---
### T07 — ReviewerAssignment: ownership on RequirementCandidate
```task
id: IHUB-WP-0002-T07
status: done
priority: medium
state_hub_task_id: "3dc9bfdb-06d0-48a5-8973-2e39c6e0f78a"
```
Implement ReviewerAssignment (candidate_id, user_id, assigned_by, assigned_at).
Add `AssignReviewerAction`. Show current reviewer on candidate index and show
pages. Filter index by assignee. Reviewer can see their open candidates via a
"My Queue" view under their session.
**Exit criteria:** Reviewer can be assigned; "My Queue" shows open candidates
for the logged-in reviewer.
---
### T08 — Operator triage dashboard (AutoRefresh)
```task
id: IHUB-WP-0002-T08
status: done
priority: high
state_hub_task_id: "82498422-1626-4479-9daa-3d7c7e088d8e"
```
Extend or add a dedicated triage dashboard action wrapped with `autoRefresh do`.
Shows: open RequirementCandidates (count by status), triage queue (oldest open
first), recent escalations (last 20), candidates by category breakdown.
Live-updates on any candidate/triage state change.
**Exit criteria:** Dashboard renders; live-updates on candidate creation and
triage status change without page reload.
---
### T09 — Phase 2 gate: tests, consistency, docs
```task
id: IHUB-WP-0002-T09
status: done
priority: high
state_hub_task_id: "935de4d7-867f-49aa-bddf-6ff9435215de"
```
Integration tests: AnnotationThread CRUD; escalation happy path; triage state
transitions (valid + invalid); reviewer assignment; dashboard AutoRefresh
wrapper present. Consistency sync. Update `SCOPE.md` current state. Write
`docs/phase2-summary.md`. Smoke test: create thread, escalate annotation, triage
candidate, confirm dashboard updates.
**Exit criteria:** All integration tests pass; `SCOPE.md` reflects Phase 2
completion; consistency check passes.