generated from coulomb/repo-seed
Propose STATE-WP-0053 — WSJF Triage Review Page (Workstreams section)
Following the CUST-WP-0045 daily-triage cutover, the activity-core runner now writes a daily progress event with the full WSJF report nested under detail.report. The only ways to read it today are tail the working-memory file or curl /progress/ — neither serves the "sit-down review" use case the triage was designed for. Proposed dashboard page under the existing Workstreams section: recent reports table, per-report detail with linked recommendations, 14-day pattern view, action colour cues consistent with the rest of the dashboard. Read-only; no schema or API changes; reuses the existing /progress/?event_type=daily_triage endpoint. Six tasks (T01 skeleton + nav, T02 recent table, T03 detail with links, T04 colour cues, T05 pattern view, T06 docs). Status: proposed — awaiting review before workstream registration. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
308
workplans/STATE-WP-0053-wsjf-triage-review-page.md
Normal file
308
workplans/STATE-WP-0053-wsjf-triage-review-page.md
Normal file
@@ -0,0 +1,308 @@
|
||||
---
|
||||
id: STATE-WP-0053
|
||||
type: workplan
|
||||
title: "WSJF Triage Review Page (Workstreams section)"
|
||||
domain: custodian
|
||||
repo: state-hub
|
||||
status: proposed
|
||||
owner: custodian
|
||||
topic_slug: custodian
|
||||
created: "2026-06-02"
|
||||
updated: "2026-06-02"
|
||||
---
|
||||
|
||||
# STATE-WP-0053 - WSJF Triage Review Page (Workstreams section)
|
||||
|
||||
## Goal
|
||||
|
||||
Add a dashboard page that lets the operator review the daily WSJF triage
|
||||
reports produced by activity-core's `daily-triage-report` instruction, find
|
||||
the latest recommendations per workstream, and notice patterns across days
|
||||
without re-running the prompt.
|
||||
|
||||
Surface lives under the existing **Workstreams** dashboard section, sibling
|
||||
to Decisions / Dependencies / Tasks / Interventions. No schema or API
|
||||
changes — the data already exists in `/progress/?event_type=daily_triage`
|
||||
with the full report nested under `detail.report` (proven by the
|
||||
2026-06-02 CUST-WP-0045 canary).
|
||||
|
||||
## Context
|
||||
|
||||
CUST-WP-0045 cutover landed activity-core as the daily WSJF triage runner.
|
||||
Each run leaves:
|
||||
|
||||
- a working-memory note at
|
||||
`the-custodian/memory/working/daily-triage-{date}-{run_id_short}.md`
|
||||
- a State Hub progress event with `event_type: daily_triage` carrying
|
||||
`detail.report = {summary, recommendations[]}`
|
||||
|
||||
Today the only ways to read those reports are: SSH-tail the memory file
|
||||
or curl `/progress/` and pipe through `jq`. Neither serves the
|
||||
"operator sits down with morning coffee" use case the triage was
|
||||
designed for. State Hub's dashboard is where most other operational
|
||||
state already gets reviewed (`/workstreams`, `/decisions`,
|
||||
`/interventions`); the WSJF report belongs there too.
|
||||
|
||||
## Scope
|
||||
|
||||
In scope:
|
||||
|
||||
- New page `dashboard/src/wsjf-triage.md` rendering the most recent N
|
||||
daily triage reports, with the latest one expanded by default.
|
||||
- Nav entry "WSJF Triage" under the existing Workstreams section in
|
||||
`observablehq.config.js`.
|
||||
- Recommendation rows that resolve `candidate` (slug) to a workstream id
|
||||
and link to the existing `/workstreams/{id}` detail page where the
|
||||
resolution succeeds.
|
||||
- Lightweight pattern view: per-workstream count of how often it has been
|
||||
recommended in the last 14 days, grouped by action.
|
||||
- Empty-state copy when no daily_triage events exist yet (so the page
|
||||
ships before tomorrow's first scheduled run).
|
||||
|
||||
Out of scope:
|
||||
|
||||
- Any write surface (no "apply recommendation" buttons, no status
|
||||
changes). The triage is a read model; acting on it stays a human or
|
||||
workplan-driven step.
|
||||
- Schema or API changes to `/progress/`. The page reads the existing
|
||||
payload as-is.
|
||||
- Cross-domain triage support (multi-domain digest). The current runner
|
||||
produces one custodian-domain report per day; design the page for that
|
||||
shape and broaden later if other domains adopt the pattern.
|
||||
- Authoring or editing reports from the dashboard. The activity-core
|
||||
runner is the only writer; the page is read-only.
|
||||
|
||||
## Page Design
|
||||
|
||||
### Header
|
||||
|
||||
- Title: "Daily WSJF Triage"
|
||||
- Subtitle: "Daily State Hub triage from activity-core. Recommendations
|
||||
are advisory; the operator and workplan owners decide what to act on."
|
||||
- Last-updated badge: timestamp of the most recent `daily_triage` event.
|
||||
|
||||
### Recent Reports
|
||||
|
||||
Top section: list of the last 14 reports as a compact table.
|
||||
|
||||
| Date | Summary (first 120 chars) | # Recs | Top Action |
|
||||
|------|---------------------------|--------|------------|
|
||||
| 2026-06-02 | 13 active workstreams with 58 open tasks. High-priority triage items need ... | 9 | work-next×3 |
|
||||
|
||||
Rows are click-to-expand: clicking a row scrolls/expands the detail
|
||||
section below to that report. Default expansion is the most recent
|
||||
report.
|
||||
|
||||
### Detail Section
|
||||
|
||||
For the selected report:
|
||||
|
||||
- **Summary**: full `detail.report.summary` text.
|
||||
- **Recommendations table**:
|
||||
|
||||
| # | Candidate | Action | Confidence | Why |
|
||||
|---|-----------|--------|------------|-----|
|
||||
| 1 | [cust-wp-0045](/workstreams/d9d9a3ec…) | `work-next` | high | Daily triage runner infrastructure — critical dependency … |
|
||||
|
||||
Action column uses colour cues consistent with the existing dashboard:
|
||||
- `work-next` — green
|
||||
- `close-out` — green
|
||||
- `revisit` / `split` — amber
|
||||
- `park` — grey
|
||||
- `needs-human` / `needs-cross-agent` / `needs-consistency-sync` — red
|
||||
- **Run metadata**: `scheduled_for`, `activity_core_run_id`,
|
||||
`instruction_id`, link to the working-memory note path (display only,
|
||||
not fetched — the path lives in the-custodian, dashboard is read-only).
|
||||
|
||||
### Patterns (14-day window)
|
||||
|
||||
Bottom section: aggregate view of which workstreams appear most often
|
||||
and with which actions, computed client-side from the events already
|
||||
loaded.
|
||||
|
||||
| Workstream | Times Recommended | Most Frequent Action |
|
||||
|------------|-------------------|----------------------|
|
||||
| cust-wp-0045 | 12 / 14 days | work-next (10×) |
|
||||
|
||||
Useful for spotting recurring `needs-human` flags that aren't getting
|
||||
addressed, and for noticing a workstream that's been `revisit` for many
|
||||
days running.
|
||||
|
||||
### Empty State
|
||||
|
||||
Visible until the first scheduled run lands. Copy:
|
||||
|
||||
> No daily triage reports yet. The next run is scheduled for 07:20
|
||||
> Europe/Berlin (activity-core `daily-statehub-wsjf-triage`).
|
||||
|
||||
## Data Source
|
||||
|
||||
Single API call on page load:
|
||||
|
||||
```
|
||||
GET /progress/?event_type=daily_triage&limit=14
|
||||
```
|
||||
|
||||
Response shape (already produced by the 2026-06-02 canary):
|
||||
|
||||
```json
|
||||
{
|
||||
"id": "935244fa-…",
|
||||
"topic_id": "cee7bedf-…",
|
||||
"workstream_id": "99993845-…",
|
||||
"event_type": "daily_triage",
|
||||
"summary": "13 active workstreams with 58 open tasks. …",
|
||||
"detail": {
|
||||
"report": {
|
||||
"summary": "…",
|
||||
"recommendations": [
|
||||
{"candidate": "cust-wp-0045", "action": "work-next",
|
||||
"why": "…", "confidence": "high"},
|
||||
…
|
||||
]
|
||||
},
|
||||
"activity_id": "6fca51fa-…",
|
||||
"scheduled_for": "2026-06-02T12:52:01.690214+00:00",
|
||||
"instruction_id": "daily-triage-report",
|
||||
"activity_core_run_id": "f9b97749-…"
|
||||
},
|
||||
"author": "activity-core",
|
||||
"created_at": "2026-06-02T12:52:14.460214Z"
|
||||
}
|
||||
```
|
||||
|
||||
Candidate → workstream id resolution uses the existing
|
||||
`/workstreams/workplan-index` endpoint (already used elsewhere on the
|
||||
dashboard); fall back to plain text if the slug is not indexed.
|
||||
|
||||
## Tasks
|
||||
|
||||
### T01 - Page skeleton and nav entry
|
||||
|
||||
```task
|
||||
id: STATE-WP-0053-T01
|
||||
status: todo
|
||||
priority: medium
|
||||
```
|
||||
|
||||
Create `dashboard/src/wsjf-triage.md` rendering the header + empty
|
||||
state. Add `{ name: "WSJF Triage", path: "/wsjf-triage" }` to the
|
||||
Workstreams pages list in `observablehq.config.js`.
|
||||
|
||||
Done when the page is reachable from the sidebar and shows the empty
|
||||
state in a dev preview.
|
||||
|
||||
### T02 - Recent reports table
|
||||
|
||||
```task
|
||||
id: STATE-WP-0053-T02
|
||||
status: todo
|
||||
priority: medium
|
||||
depends_on: [STATE-WP-0053-T01]
|
||||
```
|
||||
|
||||
Fetch up to 14 most recent `daily_triage` events and render the
|
||||
recent-reports table. Compute `# Recs` and `Top Action` per row
|
||||
client-side.
|
||||
|
||||
Done when today's canary report (and tomorrow's scheduled run) appears
|
||||
in the table, summary truncated to ~120 characters.
|
||||
|
||||
### T03 - Detail section with linked recommendations
|
||||
|
||||
```task
|
||||
id: STATE-WP-0053-T03
|
||||
status: todo
|
||||
priority: medium
|
||||
depends_on: [STATE-WP-0053-T02]
|
||||
```
|
||||
|
||||
Expand selected report (default: most recent) to show full summary,
|
||||
recommendations table, and run metadata. Resolve each recommendation's
|
||||
`candidate` against `/workstreams/workplan-index` to produce a
|
||||
`/workstreams/{id}` link where possible.
|
||||
|
||||
Done when clicking a candidate slug navigates to the corresponding
|
||||
workstream detail page on the existing dashboard.
|
||||
|
||||
### T04 - Action colour cues consistent with existing dashboard
|
||||
|
||||
```task
|
||||
id: STATE-WP-0053-T04
|
||||
status: todo
|
||||
priority: low
|
||||
depends_on: [STATE-WP-0053-T03]
|
||||
```
|
||||
|
||||
Match the dashboard's existing colour palette (the same one used on
|
||||
`/decisions` for resolved/escalated and on `/workstreams` for
|
||||
active/blocked/finished). Add a small legend below the recommendations
|
||||
table.
|
||||
|
||||
Done when colour cues are visually consistent with neighbouring pages
|
||||
and the legend matches the action vocabulary documented in
|
||||
`the-custodian/runtime/prompts/daily_statehub_wsgi_triage.md`.
|
||||
|
||||
### T05 - 14-day pattern view
|
||||
|
||||
```task
|
||||
id: STATE-WP-0053-T05
|
||||
status: todo
|
||||
priority: medium
|
||||
depends_on: [STATE-WP-0053-T02]
|
||||
```
|
||||
|
||||
Aggregate the loaded 14-day window: count occurrences per candidate,
|
||||
compute the most frequent action per candidate, render the bottom
|
||||
table sorted by occurrence count desc.
|
||||
|
||||
Done when a workstream that has been recommended for `needs-human` on
|
||||
three or more days surfaces near the top of the pattern table.
|
||||
|
||||
### T06 - Docs + reference cross-links
|
||||
|
||||
```task
|
||||
id: STATE-WP-0053-T06
|
||||
status: todo
|
||||
priority: low
|
||||
depends_on: [STATE-WP-0053-T05]
|
||||
```
|
||||
|
||||
Add a short `src/docs/wsjf-triage.md` explaining: what the triage is
|
||||
(reference to `CUST-WP-0044`), how to read recommendations, the action
|
||||
vocabulary, the "advisory not authoritative" stance. Wire
|
||||
`withDocHelp` from the dashboard page to that doc. Add link to
|
||||
Reference nav.
|
||||
|
||||
Cross-link from `src/docs/workstreams.md` and `src/decisions.md` to
|
||||
the new page so operators land there from the contexts where triage is
|
||||
most relevant.
|
||||
|
||||
Done when the dashboard doc system shows the WSJF doc and existing
|
||||
docs link forward to it.
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- The page is reachable from the sidebar under Workstreams → WSJF Triage.
|
||||
- Today's manual canary report (2026-06-02) and tomorrow's scheduled
|
||||
run (2026-06-03) both render correctly with linked candidates.
|
||||
- The detail section shows summary, recommendations, and run metadata
|
||||
for any of the last 14 reports.
|
||||
- The pattern table surfaces workstreams that have accumulated repeated
|
||||
recommendations within the window.
|
||||
- No write surfaces; no schema or API changes; no cross-domain coupling
|
||||
beyond what already exists in the dashboard.
|
||||
|
||||
## Notes
|
||||
|
||||
The data model is intentionally simple — one event per day, full report
|
||||
in `detail.report`. If multi-domain or per-workstream triage is added
|
||||
later, the schema can evolve under a different `event_type`
|
||||
(`workstream_triage`, `domain_triage`) and this page can either gain a
|
||||
filter or split into per-type tabs without breaking existing reports.
|
||||
|
||||
CUST-WP-0045's daily-triage report is the only producer today. Other
|
||||
producers (weekly review, incident postmortem, etc.) could write to
|
||||
the same `event_type` if their report shape matches `{summary,
|
||||
recommendations[]}`; nothing on this page assumes a particular activity
|
||||
definition produced the event.
|
||||
Reference in New Issue
Block a user