Skip to content

Commit c89d8f7

Browse files
spec(ops-workflows-page-refinement): Phase 2/3 — decisions.md + wireframe.html (#550)
Mirror of the just-shipped Specs page refinement Phase 2/3 pattern (PR #529) for the next pain-point area. Phase 1 ratifications already shipped in PR #546's requirements.md. decisions.md (Phase 2): - 8 decisions ratified in the 2026-06-01 conversation with rationale and rejected-alternatives recorded for each. - D1 — bucket dimension: BY CONCERN (review/test/docs/refactor/audit/ meta/other). Static derivation, no telemetry dependency. - D2 — chips above table, matches Specs A3a pattern. - D3 — search: yes, name-only (description matching adds noise). - D4 — cost-estimate column: no (vetoed; revisit in v2 if usage data accumulates). - D5 — kebab actions: View recent runs / Copy run command / View docs. Distinct from Specs page's spec-metadata kebab — Workflows is about run-management. - D6 — URL params: ?bucket=…&q=… (mirrors Specs A3c). - D7 — sort: alphabetical-by-name (v2 may add by-last-run). - D8 — implementation pattern: 4-5 small PRs mirroring Specs A1→A3c. Authoritative concern assignment table for all 20 workflows documented for the implementation module (src/attune/ops/workflow_concern.py, when it ships) to mirror. wireframe.html (Phase 3): - Self-contained HTML, no build step, opens in browser. - Mock data: all 20 real workflows from list_workflows() with authentic tier-maps and scope hints. - All 7 concern chips active by default (no chip is structurally "noise" unlike Specs page's Complete default-off). - Search filters by workflow name only (per D3 trade-off). - Kebab menu wired for all 3 actions with mock toasts. - URL params honored on load + synced on state changes. - Inspector callout lists 9 interactions to exercise every state including the H4 disambiguation case ("type 'health' in search"). Status: Phase 2+3 approved. Implementation lands as a follow-up spec/feat-prefixed PR mirroring Specs A1→A3c when bandwidth allows (v7.4.0 candidate; non-release-blocking). Per the existing CLAUDE.md "wireframes surface design gaps" lesson, expect 1-2 decisions to need revision when the wireframe is reviewed side-by-side with the spec. Capture revisions as edits to decisions.md on this same PR or a follow-up, not in requirements.md. Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1 parent aacf6fd commit c89d8f7

2 files changed

Lines changed: 786 additions & 0 deletions

File tree

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
# Spec: Ops Dashboard Workflows Page Refinement — Decisions
2+
3+
**Status:** approved (2026-06-01)
4+
5+
> Pre-committed decisions per the existing CLAUDE.md lesson
6+
> "Pre-committed decision matrices survive contact with data." Each
7+
> decision was ratified in the 2026-06-01 in-session conversation
8+
> that produced [requirements.md](requirements.md). Patrick stepped
9+
> through them with `chips` / `y` / `no` / `By concern` / etc. and
10+
> the kebab + v1 scope advice was ratified separately. Edits to
11+
> this file after v1 ships require a follow-up PR with rationale.
12+
13+
---
14+
15+
## Decision matrix
16+
17+
| Decision | Choice | Rationale |
18+
|---|---|---|
19+
| **D1 — Bucket dimension** | **By concern** (review / test / docs / refactor / audit / meta / other) | Maps to "which workflow do I want?" — the load-bearing decision users face. Static derivation (mirror `spec_lifecycle.py`), no telemetry dependency, no usage data required. Alternatives rejected: by-cost-tier (less directly answer-shaped); by-last-used (telemetry-dependent, page-load cost); combination (visual weight, more state to manage). Bucket assignment is **canonical** per workflow — one workflow lives in exactly one bucket. |
20+
| **D2 — Filter widget shape** | **Chip row above table, one chip per concern** | Mirrors the just-shipped Specs page pattern (PRs #533-#539). One-click toggle, inline counts double as population indicator, fits the existing dashboard visual language. Alternatives rejected: dropdown (hides state behind click), segmented control (overkill for 7 buckets), none (defeats the point). |
21+
| **D3 — Search input** | **Yes — plain text, filters within active buckets** | At 20 workflows the volume case for search is weaker than for 45 specs, but workflow names are MORE cryptic (`secure-release` vs `release-prep`, `orchestrated-health-check` vs `health-check`) so keystroke-level disambiguation matters more. Search input lives in the chip toolbar (mirrors Specs A3a layout). Filter is substring-match against workflow `name` only — description matching adds noise (descriptions contain "code review" in 5+ workflows). |
22+
| **D4 — Cost-estimate column** | **No** | Vetoed in conversation. Would require a telemetry-derived estimate (lookup of `~/.attune/telemetry/usage.jsonl` per workflow) which (a) adds page-load cost, (b) is empty for never-run workflows, and (c) gives a misleading number for workflows whose cost varies by depth/path. Phase 5+'s improved SDK error messages already address the silent-failure aspect of cost surprises (real cause now surfaces). Revisit in v2 if usage data accumulates and users want a budgeting affordance. |
23+
| **D5 — Kebab action menu** | **3 actions: View recent runs / Copy run command / View docs** | Distinct from the Specs page kebab — Workflows is about run-management, not spec-metadata navigation. Each action is non-destructive and unique-to-row. Skipped: "View source" alone (better as sub-action of docs); "View typical cost" (telemetry-dependent per D4); "Edit scope" (already addressed by per-row scope picker). |
24+
| **D6 — URL params for state** | **Yes — `?bucket=…&q=…`** | Mirrors the Specs A3c pattern (PR #539). Shareable links for "show me all `audit` workflows" or "find any workflow matching `release`". Default URL (no params) = all buckets active, no search, alphabetical-by-name sort. |
25+
| **D7 — Sort dimension** | **Alphabetical-by-name** | Workflows have a stable namespace; alphabetical is the lookup-friendly default. v2 may add "by last-run-date" if usage data accumulates and users surface a real need. No tier-based sort (D1's concern grouping already clusters cost-similar workflows). |
26+
| **D8 — Implementation pattern** | **4-5 small PRs mirroring Specs A1→A3c** | Pattern shipped clean for Specs page. Drift-guard tests on the bucket-derivation module + source-grep tests on the JS + TestClient tests on the route. |
27+
28+
---
29+
30+
## Concern bucket assignment
31+
32+
Authoritative mapping (codified in the implementation module
33+
`src/attune/ops/workflow_concern.py`, mirroring `spec_lifecycle.py`):
34+
35+
| Concern | Workflows |
36+
|---|---|
37+
| `review` | `code-review`, `deep-review`, `security-audit`, `bug-predict` |
38+
| `test` | `test-gen`, `test-audit` |
39+
| `docs` | `doc-gen`, `doc-audit`, `doc-orchestrator` |
40+
| `refactor` | `simplify-code`, `refactor-plan` |
41+
| `audit` | `discovery-sweep`, `perf-audit`, `dependency-check` |
42+
| `meta` | `release-prep`, `secure-release`, `orchestrated-health-check`, `health-check` |
43+
| `other` | `rag-code-gen`, `research-synthesis` |
44+
45+
**Trade-offs ratified:**
46+
47+
- **`bug-predict` lives in `review`** (not `audit`) because its UX
48+
intent matches the review-class workflows: "tell me what's wrong
49+
with this code." `audit` is for codebase-wide health surveys.
50+
- **`security-audit` lives in `review`** for the same reason —
51+
it's a focused review of one file/dir. The big-picture audit
52+
workflows live in `audit`.
53+
- **`doc-orchestrator` lives in `docs`** even though it's a
54+
meta-workflow (composes other docs workflows). `meta` is
55+
reserved for release/health ops; `doc-orchestrator` is a
56+
domain-specific composer.
57+
- **Naming consistency**: `audit` is BOTH a concern name AND a
58+
workflow-name suffix (`test-audit`, `doc-audit`, `perf-audit`).
59+
These are routed by purpose, not name pattern — `test-audit`
60+
is `test` concern, `doc-audit` is `docs`, `perf-audit` is
61+
`audit`. (Concern is about *what the user wants to do*, not
62+
the workflow's filename.)
63+
64+
---
65+
66+
## Filter widget behavioral details (D2)
67+
68+
- **Default chip state**: all 7 chips ACTIVE on first paint. Unlike
69+
the Specs page (where Complete defaults OFF because completed
70+
specs are visual noise), Workflows are all relevant by default —
71+
no concern is structurally "noise."
72+
- **All-off state**: if all chips are toggled off, render
73+
"All concerns filtered out — re-enable at least one chip."
74+
(Mirrors Specs page empty-state pattern.)
75+
- **Search**: filters the *already-bucket-filtered* set.
76+
0-result state: "No workflows in active concerns match
77+
'<query>'."
78+
- **Persistence**: chip selections + search live in URL query
79+
params (`?bucket=review,audit&q=security`).
80+
81+
## Kebab menu behavioral details (D5)
82+
83+
- **Menu items (v1)**: `View recent runs`, `Copy run command`,
84+
`View docs`.
85+
- **Close behavior**: click outside, Escape, or selecting an item
86+
closes the menu. One menu open at a time per page. (Mirrors
87+
Specs page kebab.)
88+
- **`View recent runs` target**: scrolls to / opens the per-row
89+
recent-runs strip that's hidden by default. Existing
90+
`data-recent-runs="<name>"` element gets `hidden=false` toggle.
91+
- **`Copy run command` action**: copies
92+
`attune workflow run <name>` to clipboard. If the workflow has
93+
a non-empty scope-picker selection, includes
94+
` --path <selected-scope>`. Toast confirmation (mirrors
95+
Specs page Copy slug toast).
96+
- **`View docs` target**: opens
97+
`/help/<workflow-name>` in a new tab. The dashboard's `/help`
98+
page (PR #482-#484) renders the `.help/templates/<workflow>/`
99+
content. Fallback to `/help` index if no per-workflow page
100+
exists yet.
101+
- **Disabled state**: works in read-only mode (all 3 actions are
102+
non-mutating). No `allow_run` gating needed.
103+
- **Keyboard**: arrow keys focus row, `M` (or `.`) opens menu on
104+
focused row, arrows in menu, Enter to fire. (Mirrors Specs
105+
page keyboard pattern.)
106+
107+
---
108+
109+
## Out of scope (parking lot)
110+
111+
- **Cost-estimate column** — D4 vetoed for v1. v2 trigger
112+
conditions: users surface a real budgeting pain AND telemetry
113+
accumulates enough per-workflow runs that the estimate is
114+
meaningful (≥10 runs per workflow).
115+
- **`by last-used` sort** — D7 deferred. v2 trigger: D1 grouping
116+
proves insufficient AND users ask for recency-based prioritization.
117+
- **`Edit scope` row action** — already addressed by per-row scope
118+
picker. No kebab duplication.
119+
- **Per-row cost preview tooltip** — same blocker as D4.
120+
- **Multi-select / bulk-run** — explicit non-goal. Each workflow
121+
run is a deliberate decision.
122+
- **Custom concern grouping per-user** — v2 if requested. v1 is the
123+
authoritative mapping above.
124+
125+
---
126+
127+
## Carryover
128+
129+
- **2026-06-01** — All 8 decisions ratified in conversation. Patrick
130+
approved the kebab actions (View recent runs / Copy run command
131+
/ View docs) and the v1 scope (H1+H4 closure via chips + search
132+
+ bucket grouping + kebab) as my recommendation; the rest he
133+
ratified directly with `y` / `chips` / `By concern` shorthand
134+
per [feedback_response_shorthand](../../../../.claude/memory/feedback_response_shorthand.md).
135+
- **Spec progresses to Phase 3 (wireframe)** for visual review.
136+
Per the existing CLAUDE.md "wireframes surface design gaps"
137+
lesson, expect at least one decision to need revision when the
138+
wireframe lands. Capture revisions here, not in requirements.md.

0 commit comments

Comments
 (0)