@gobing-ai/spur 0.3.62 → 0.3.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/corpus-baseline.json +3428 -3796
  3. package/config/workflows/history-anatomy.yaml +40 -11
  4. package/package.json +9 -9
  5. package/plugins/sp/README.md +8 -5
  6. package/plugins/sp/agents/expert-spur.md +20 -4
  7. package/plugins/sp/commands/dev-find-issue.md +4 -4
  8. package/plugins/sp/commands/dev-gitmsg.md +12 -6
  9. package/plugins/sp/commands/dev-gtd.md +8 -19
  10. package/plugins/sp/commands/dev-idea.md +3 -3
  11. package/plugins/sp/commands/dev-plan.md +1 -1
  12. package/plugins/sp/commands/dev-run.md +2 -2
  13. package/plugins/sp/commands/dev-runall.md +2 -2
  14. package/plugins/sp/commands/dev-wrap.md +5 -6
  15. package/plugins/sp/commands/dev-wrapall.md +5 -7
  16. package/plugins/sp/plugin.json +1 -1
  17. package/plugins/sp/references/environment-lens.md +66 -0
  18. package/plugins/sp/scripts/history-anatomy-cache.mjs +165 -15
  19. package/plugins/sp/scripts/history-anatomy-cache.ts +216 -15
  20. package/plugins/sp/skills/dogfood-testing/SKILL.md +14 -1
  21. package/plugins/sp/skills/dogfood-testing/references/report-template.md +30 -0
  22. package/plugins/sp/skills/history-anatomy/SKILL.md +3 -3
  23. package/plugins/sp/skills/history-anatomy/references/operations.md +21 -8
  24. package/plugins/sp/skills/history-anatomy/references/report-contract.md +63 -5
  25. package/plugins/sp/skills/next-router/SKILL.md +4 -4
  26. package/plugins/sp/skills/pr-reviewing/SKILL.md +2 -3
  27. package/plugins/sp/skills/redesign-web-ui/SKILL.md +184 -0
  28. package/plugins/sp/skills/redesign-web-ui/references/audit-checklist.md +121 -0
  29. package/plugins/sp/skills/redesign-web-ui/references/upgrade-techniques.md +66 -0
  30. package/plugins/sp/skills/spur-cli/references/agent.md +16 -7
  31. package/plugins/sp/skills/spur-cli/references/message.md +4 -2
  32. package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +5 -0
  33. package/plugins/sp/skills/spur-cli/references/workflows/operations.md +20 -5
  34. package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +230 -0
  35. package/plugins/sp/skills/spur-cli/references/workflows.md +26 -4
  36. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +28 -34
  37. package/plugins/sp/skills/spur-dev/references/dev-operations.md +62 -20
  38. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
  39. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +18 -8
  40. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +7 -6
  41. package/spur.js +1012 -372
  42. package/web/_astro/{BoardApp.rkWGVwwK.js → BoardApp.CKolAjUz.js} +56 -56
  43. package/web/_astro/BoardApp.DXD--ybM.js +1 -0
  44. package/web/_astro/{TaskDetail.B7ODt_bA.js → TaskDetail.Bre7G4gC.js} +1 -1
  45. package/web/_astro/{arc.C5QRz6AQ.js → arc.7luwOGiC.js} +1 -1
  46. package/web/_astro/{architectureDiagram-3BPJPVTR.CHptn8gZ.js → architectureDiagram-3BPJPVTR.F6KaHXp-.js} +1 -1
  47. package/web/_astro/{blockDiagram-GPEHLZMM.b1nEDkDw.js → blockDiagram-GPEHLZMM.CCGHeRVi.js} +1 -1
  48. package/web/_astro/{c4Diagram-AAUBKEIU.BWj8S_Qq.js → c4Diagram-AAUBKEIU.CpqewGmd.js} +1 -1
  49. package/web/_astro/channel.DxfOFf1l.js +1 -0
  50. package/web/_astro/{chunk-2J33WTMH.q0BBuE1n.js → chunk-2J33WTMH.CB9vKa5F.js} +1 -1
  51. package/web/_astro/{chunk-4BX2VUAB.DP2KDkAU.js → chunk-4BX2VUAB.ifGXoUA3.js} +1 -1
  52. package/web/_astro/{chunk-55IACEB6.CkCId72p.js → chunk-55IACEB6.VIaRo7l8.js} +1 -1
  53. package/web/_astro/{chunk-727SXJPM.oHWzxMot.js → chunk-727SXJPM.DzPE41OS.js} +1 -1
  54. package/web/_astro/{chunk-AQP2D5EJ.DkkgxfMP.js → chunk-AQP2D5EJ.UF2QRXYF.js} +1 -1
  55. package/web/_astro/{chunk-FMBD7UC4.lmFJDvRK.js → chunk-FMBD7UC4.D2zXKa1R.js} +1 -1
  56. package/web/_astro/{chunk-ND2GUHAM.52jt0eHK.js → chunk-ND2GUHAM.Cb9bDyvx.js} +1 -1
  57. package/web/_astro/{chunk-QZHKN3VN.Cg8KEFoD.js → chunk-QZHKN3VN.nUKFBiLD.js} +1 -1
  58. package/web/_astro/{classDiagram-4FO5ZUOK.BuOUhxcD.js → classDiagram-4FO5ZUOK.DZg9K9mO.js} +1 -1
  59. package/web/_astro/{classDiagram-v2-Q7XG4LA2.BuOUhxcD.js → classDiagram-v2-Q7XG4LA2.DZg9K9mO.js} +1 -1
  60. package/web/_astro/{cose-bilkent-S5V4N54A.BRUU8E_0.js → cose-bilkent-S5V4N54A.D9STo90d.js} +1 -1
  61. package/web/_astro/{dagre-BM42HDAG.GDbfFYVV.js → dagre-BM42HDAG.D3IbwhHz.js} +1 -1
  62. package/web/_astro/{diagram-2AECGRRQ.CvIDBeJF.js → diagram-2AECGRRQ.BWTDxBe9.js} +1 -1
  63. package/web/_astro/{diagram-5GNKFQAL.DMgJjWOX.js → diagram-5GNKFQAL.XnXlonHG.js} +1 -1
  64. package/web/_astro/{diagram-KO2AKTUF.njjl-0AP.js → diagram-KO2AKTUF.CywOngCO.js} +1 -1
  65. package/web/_astro/{diagram-LMA3HP47.CcCqgP8M.js → diagram-LMA3HP47.DY1D21Iu.js} +1 -1
  66. package/web/_astro/{diagram-OG6HWLK6.Btqd-YVE.js → diagram-OG6HWLK6.DQxb59KA.js} +1 -1
  67. package/web/_astro/{erDiagram-TEJ5UH35.BbhML_Xo.js → erDiagram-TEJ5UH35.CF2U-pQZ.js} +1 -1
  68. package/web/_astro/{flowDiagram-I6XJVG4X.CkvsIgY8.js → flowDiagram-I6XJVG4X.BJK4M3in.js} +1 -1
  69. package/web/_astro/{ganttDiagram-6RSMTGT7.m8IWD_wW.js → ganttDiagram-6RSMTGT7.BSniMzdB.js} +1 -1
  70. package/web/_astro/{gitGraphDiagram-PVQCEYII.5z87HXO-.js → gitGraphDiagram-PVQCEYII.Dxg-yRov.js} +1 -1
  71. package/web/_astro/index.BVXdIsZV.css +1 -0
  72. package/web/_astro/{infoDiagram-5YYISTIA.Bvyvsd7Q.js → infoDiagram-5YYISTIA.BY4CgO_n.js} +1 -1
  73. package/web/_astro/{ishikawaDiagram-YF4QCWOH.DdWVYO87.js → ishikawaDiagram-YF4QCWOH.BmWDZtwF.js} +1 -1
  74. package/web/_astro/{journeyDiagram-JHISSGLW.C3kOlYH1.js → journeyDiagram-JHISSGLW.CpB1YWDP.js} +1 -1
  75. package/web/_astro/{kanban-definition-UN3LZRKU.CfKTUHVC.js → kanban-definition-UN3LZRKU.k-fukQX9.js} +1 -1
  76. package/web/_astro/{linear.CMDHnzgX.js → linear.BNNCobvI.js} +1 -1
  77. package/web/_astro/{mermaid.core.DN7-WrsP.js → mermaid.core.DnpzzuPU.js} +4 -4
  78. package/web/_astro/{mindmap-definition-RKZ34NQL.DcQxLvqG.js → mindmap-definition-RKZ34NQL.D9NnlLBu.js} +1 -1
  79. package/web/_astro/{pieDiagram-4H26LBE5.Nu-Inbw6.js → pieDiagram-4H26LBE5.CKhoMiyC.js} +1 -1
  80. package/web/_astro/{quadrantDiagram-W4KKPZXB.Dck2EChs.js → quadrantDiagram-W4KKPZXB.BkAygRlm.js} +1 -1
  81. package/web/_astro/{requirementDiagram-4Y6WPE33.C--E5XuW.js → requirementDiagram-4Y6WPE33.CX8ibmwc.js} +1 -1
  82. package/web/_astro/{sankeyDiagram-5OEKKPKP.B_0iRNna.js → sankeyDiagram-5OEKKPKP.Dvurpa0Y.js} +1 -1
  83. package/web/_astro/{sequenceDiagram-3UESZ5HK.PKuKr9mk.js → sequenceDiagram-3UESZ5HK.veO8c2tk.js} +1 -1
  84. package/web/_astro/{stateDiagram-AJRCARHV.ClhGHb-O.js → stateDiagram-AJRCARHV.DpMr4CO3.js} +1 -1
  85. package/web/_astro/{stateDiagram-v2-BHNVJYJU.Bv6BBnvg.js → stateDiagram-v2-BHNVJYJU.CKjso86_.js} +1 -1
  86. package/web/_astro/{timeline-definition-PNZ67QCA.BZm2ZvAH.js → timeline-definition-PNZ67QCA.DayoPp_2.js} +1 -1
  87. package/web/_astro/{vennDiagram-CIIHVFJN.Dt6yZXry.js → vennDiagram-CIIHVFJN.XNHf04O9.js} +1 -1
  88. package/web/_astro/{wardley-L42UT6IY.rUs-E00M.js → wardley-L42UT6IY.CpM_031g.js} +1 -1
  89. package/web/_astro/{wardleyDiagram-YWT4CUSO.BcWgv4cA.js → wardleyDiagram-YWT4CUSO.lIAjSkZJ.js} +1 -1
  90. package/web/_astro/{xychartDiagram-2RQKCTM6.DH-M-cX9.js → xychartDiagram-2RQKCTM6.D8_2K6U1.js} +1 -1
  91. package/web/index.html +2 -2
  92. package/web/_astro/BoardApp.Z9jMwI9G.js +0 -1
  93. package/web/_astro/channel.BJtn6CGV.js +0 -1
  94. package/web/_astro/index.nWve6EHS.css +0 -1
@@ -48,7 +48,7 @@ testee (a /sp:... command, Skill(...), or shell CLI invocation)
48
48
  The command forwards these via `$ARGUMENTS`:
49
49
 
50
50
  | Argument | Description | Default |
51
- |----------|-------------|---------|
51
+ | ---------- | ------------- | --------- |
52
52
  | `testee` | What to exercise — a slash command, agent skill, or CLI invocation (positional, required). Quote it if it contains flags. | (required) |
53
53
  | `--agent <name\|auto>` | **Testee-scoped** agent: the agent the **testee** runs under, forwarded into the testee invocation. The driver (this skill) always runs in the current session. **Omit it** to forward nothing — the testee runs under its own default. See [§Testee-scoped agent](#testee-scoped-agent). | (omitted → forward nothing) |
54
54
  | `--max-retry <n>` | Fix attempts per failed step. The **default is `2`** (fix mode): apply `Edit`/`Write` fixes to the working tree, up to 2 attempts per step. This flag is **mandatory** for two independent mutation sources: (a) pipeline-driving testees and (b) testees carrying a mutating `--fix` mode (`--fix all` / `--fix blockers-first`). Pass `--max-retry 0` for **observe-only**, or `--max-retry N` to acknowledge fix-mode mutation risk. For a mutating-`--fix` testee, `--max-retry 0` bounds the **driver only** — the testee still mutates the tree. | `2` unless the testee is pipeline-driving or carries a mutating `--fix` mode |
@@ -239,6 +239,7 @@ Full section contract, frontmatter, Cost shape, and footer:
239
239
  **[report-template.md](references/report-template.md)**.
240
240
 
241
241
  **Sinks** (composable):
242
+
242
243
  - **Always-on report files** → live + `docs/dogfood/YYYY-MM-DD-<testee-slug>-dogfood.md` (see Phase 1).
243
244
  - `--save` → no-op for delivery; still print/document the report path (back-compat).
244
245
  - `--task` → file findings as a review task (`spur task create --template review`), writing the
@@ -276,6 +277,7 @@ which always launches a fresh agent subprocess.
276
277
  - Producing a structured findings report (and optionally a fix task) from a real run.
277
278
 
278
279
  Do **not** use this skill for:
280
+
279
281
  - Requirements-traceability verdicts — use `sp:code-verification` (`/sp:dev-verify`).
280
282
  - SECU code review of a diff — use `sp:code-verification` (`/sp:dev-review`).
281
283
  - Running a task through the fix pipeline — use `sp:spur-dev` (`/sp:dev-run`).
@@ -606,3 +608,14 @@ Findings (P1+P2):
606
608
  A report missing any of the six headings, the on-disk live ledger, dual paths, terminal `status`,
607
609
  the Cost block, or this footer does not satisfy the dogfood contract on this platform, regardless
608
610
  of `Skill()` availability.
611
+
612
+ ## Engine-driven testees under a sandboxed session
613
+
614
+ A subprocess executor dies at startup, not at model time, when `.claude/settings.json` denies
615
+ it its state directory (`~/.pi`, `~/.grok`, `~/.gemini`, `~/.codex`, `~/.cache`) or local
616
+ socket binding. Signals: `EPERM: operation not permitted`, `FS_PERMISSION_DENIED`,
617
+ `bind: operation not permitted`. Two affordances must be granted and the session restarted:
618
+ `sandbox.filesystem.allowWrite` covering the executor home dirs, and
619
+ `sandbox.network.allowLocalBinding`. Caveat: `spur agent doctor` reports `usable: true` from
620
+ configuration alone — it never probes a real dispatch, so `usable` means *configured*, not
621
+ *proven runnable under this sandbox*.
@@ -237,6 +237,36 @@ downstream task creation does not inherit an unactionable acceptance criterion:
237
237
 
238
238
  The tag is a prompt to whoever turns findings into tasks: `[stale]` → drop, `[unverifiable]` →
239
239
  reframe or defer, `[feasible]` → proceed. A finding without a tag is treated as `[feasible]`.
240
+
241
+ **Optional class tag (environment lens, task 0686).** A finding line may carry one closed class
242
+ tag — `environment` | `testee` | `waste` — positioned immediately after the em dash and distinct
243
+ from the trailing feasibility tag:
244
+
245
+ ```
246
+ - **P2** — [environment] <what's wrong>. → **Action:** <concrete change>. (`file:line`, ~effort) `[feasible]`
247
+ ```
248
+
249
+ Omitting the class preserves the current line shape; untagged findings remain valid and the
250
+ protocol stays `sp:dogfood-testing@1.2` (the validator gains no required field; the cache-health
251
+ P3 above needs no class).
252
+
253
+ - `testee` — a defect in the testee's contract (the protocol the run grades). Bounded fix-mode
254
+ may repair it, unchanged.
255
+ - `environment` — a steering/placement/check-shaped observation projected from the
256
+ [environment-improvement lens](../../../references/environment-lens.md), which owns the
257
+ category table and the placement rule. **Proposal-only:** even under `--max-retry N`, bounded
258
+ retries never `Edit` or `Write` `AGENTS.md`, `CLAUDE.md`, skills, rules, numbered docs, or
259
+ plugin references for an environment-tagged finding — it stays a recommended action here.
260
+ - `waste` — a token/tool-waste diagnostic with no missing environment affordance behind it.
261
+
262
+ Class, not the cited file path, decides whether bounded fix may mutate. A session mistake a
263
+ linter, typechecker, test, or filesystem gate could have caught is `environment`, and its
264
+ recommended action proposes a new-or-tighter automated check — never another sentence in an
265
+ always-loaded steering file. Missed coding standards are `environment` owned by a review path
266
+ (`sp:code-verification`, `sp:code-review`, or pipeline review) — never the implementer skill;
267
+ navigation friction and dead always-loaded instructions are likewise `environment`, not
268
+ `testee`.
269
+
240
270
  Severity scale:
241
271
 
242
272
  - **P1** — blocks correct use or causes drift/wrong output; fix before shipping the testee.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: history-anatomy
3
- description: "Independent owner of diagnostic interpretation over already-imported history — the daily/ad-hoc mode contract, a closed finding taxonomy, the eleven-section report contract, and the enrich/validate rubrics. Triggers: history-anatomy, run the daily report, ad-hoc diagnosis, find issues over history."
3
+ description: "Independent owner of diagnostic interpretation over already-imported history — the daily/ad-hoc mode contract, a closed finding taxonomy, the twelve-section report contract, and the enrich/validate rubrics. Triggers: history-anatomy, run the daily report, ad-hoc diagnosis, find issues over history."
4
4
  license: Apache-2.0
5
5
  version: 1.0.0
6
6
  metadata:
@@ -37,7 +37,7 @@ fresh skill cannot be added to the BASELINE exemption map).
37
37
  **Choose the mode first.** The single entry is `--mode daily|ad-hoc` (default `daily`):
38
38
  `references/modes.md`.
39
39
 
40
- **Then hold the report to the contract.** Every report must contain the eleven sections and every
40
+ **Then hold the report to the contract.** Every report must contain the twelve sections and every
41
41
  finding the full field set, with evidence rules and an explicit comparability verdict:
42
42
  `references/report-contract.md`.
43
43
 
@@ -63,5 +63,5 @@ finding the full field set, with evidence rules and an explicit comparability ve
63
63
  | Reference | Owns |
64
64
  | --- | --- |
65
65
  | [`references/modes.md`](references/modes.md) | The daily/ad-hoc mode matrix, bounds normalization, the DST-aware calendar-day rule, and the fail-loud message shape. |
66
- | [`references/report-contract.md`](references/report-contract.md) | The eleven sections (in order), the per-finding field set, the closed category vocabulary, the stable-key grammar, the evidence rules, comparison semantics, recurrence classes, and the positive-pattern / remediation standards. |
66
+ | [`references/report-contract.md`](references/report-contract.md) | The twelve sections (in order), the per-finding field set, the closed category vocabulary, the stable-key grammar, the evidence rules, comparison semantics, recurrence classes, and the positive-pattern / remediation standards. |
67
67
  | [`references/operations.md`](references/operations.md) | The `enrich` and `validate` operation rubrics; neither launches a workflow. |
@@ -15,7 +15,7 @@ duplicated into the YAML: the rubric cannot recurse.
15
15
 
16
16
  | Operation | Input | Output |
17
17
  | --- | --- | --- |
18
- | `enrich` | current forensics artifact + baseline artifact (plain `HistoryArtifact` JSON) | the model-authored report sections (Baseline comparison, Findings, Recurrence ledger, Remediation options, Performance analysis, Workflow and process improvements, Positive patterns) meeting the report contract |
18
+ | `enrich` | current forensics artifact + baseline artifact (plain `HistoryArtifact` JSON) | the model-authored report sections (Baseline comparison, Findings, Recurrence ledger, Remediation options, Performance analysis, Workflow and process improvements, Report-only advisories, Positive patterns) meeting the report contract |
19
19
  | `validate` | a candidate report + the current/baseline artifacts | a PASS / FAIL verdict with per-finding and per-section evidence checks, naming any failing rule |
20
20
 
21
21
  Freeze these operation names and this input/output contract — 0660 consumes them verbatim.
@@ -31,13 +31,23 @@ Given the current and baseline artifacts, author the model half of the report. A
31
31
  calendar day; ad-hoc → immediately preceding equal-duration window. If baseline coverage is
32
32
  insufficient or materially different, emit `not comparable` and **no** trend/delta/percentage.
33
33
  3. **Findings** — each with the full per-finding field set (key, category, impact, trend,
34
- observation, inference, confidence, contradictions, evidenceAnchor). Categories from the closed
35
- vocabulary; stable keys of the form `<category>:<owner-surface>:<signal>`.
34
+ observation, inference, confidence, contradictions, evidenceAnchor, severity, reproCommand,
35
+ ownerSurface). Categories from the closed vocabulary; stable keys of the form
36
+ `<category>:<owner-surface>:<signal>`. Severity is the closed P1/P2/P3 vocabulary and is
37
+ orthogonal to confidence; reproCommand reproduces the observation verbatim; ownerSurface names
38
+ the concrete owning surface (file/package/command), consistent with the key's middle segment.
36
39
  4. **Recurrence ledger** — classify every finding against the baseline on the **stable key**.
37
40
  5. **Telemetry gaps** — every dimension the artifact cannot support, rendered `not available`.
38
41
  6. **Remediation options** — proposals only (owner surface, expected impact, verification method,
39
- reversibility). No applied change/diff/command.
40
- 7. **Positive patterns** same evidence standard as problems.
42
+ reversibility), plus the printed `spur task create` handoff invocation carrying the finding's
43
+ stable key for accepted proposals. No applied change/diff/auto-write to the corpus.
44
+ 7. **Report-only advisories** — repeated identical tool-and-argument signatures surfaced with
45
+ repetition counts; proposes no automatic interruption (report-only, 0680 R5).
46
+ 8. **Positive patterns** — same evidence standard as problems.
47
+
48
+ Run-cost note (0680 R6): Performance analysis reports what this run's chained `agent.run`
49
+ stages cost using the pairing analytics fold (totalCostUsd / meanDurationMs per pairing); a
50
+ pairing without cost signal renders `not available`, never zero.
41
51
 
42
52
  Never fabricate a value, a trend, an anchor, or an applied fix. Never launch a workflow.
43
53
 
@@ -45,11 +55,14 @@ Never fabricate a value, a trend, an anchor, or an applied fix. Never launch a w
45
55
 
46
56
  Given a candidate report and the artifacts, independently verify:
47
57
 
48
- - **Eleven-section completeness and order** — all eleven section names present in the frozen
58
+ - **Twelve-section completeness and order** — all twelve section names present in the frozen
49
59
  order; none renamed/omitted.
50
60
  - **Per-finding fields** — every finding (problem and positive) carries key, category, impact,
51
- trend, observation, inference, confidence, contradictions, evidenceAnchor; category in the closed
52
- vocabulary; stable-key grammar.
61
+ trend, observation, inference, confidence, contradictions, evidenceAnchor, severity (P1/P2/P3),
62
+ reproCommand, ownerSurface; category in the closed vocabulary; stable-key grammar. A finding
63
+ missing any triage field FAILs (the deterministic gate enforces the same set).
64
+ - **Remediation handoff** — each accepted-proposal handoff carries a `spur task create`
65
+ invocation naming the finding's stable key; no auto-written tasks.
53
66
  - **Evidence anchors** — every finding has at least one verifiable anchor; no anchor → FAIL.
54
67
  - **Causality gate** — a causal claim with one signal must be labelled a hypothesis with a
55
68
  confirmation path; otherwise FAIL.
@@ -1,10 +1,10 @@
1
1
  # Report contract — `sp:history-anatomy` (HA-S1, 0658)
2
2
 
3
- The published report is the skill's contract. This reference owns the eleven sections (in order),
3
+ The published report is the skill's contract. This reference owns the twelve sections (in order),
4
4
  the per-finding field set, the closed category vocabulary, the stable-key grammar, the evidence
5
5
  rules, comparison semantics, recurrence classes, and the positive-pattern / remediation standards.
6
6
 
7
- ## Eleven required sections (in order, frozen)
7
+ ## Twelve required sections (in order, frozen)
8
8
 
9
9
  1. Scope and provenance
10
10
  2. Executive summary
@@ -15,8 +15,9 @@ rules, comparison semantics, recurrence classes, and the positive-pattern / reme
15
15
  7. Remediation options
16
16
  8. Performance analysis
17
17
  9. Workflow and process improvements
18
- 10. Positive patterns
19
- 11. Evidence ledger
18
+ 10. Report-only advisories (0680 R5)
19
+ 11. Positive patterns
20
+ 12. Evidence ledger
20
21
 
21
22
  These names are consumed verbatim by 0659's structure gate and 0660's validation stage. Do not
22
23
  rename, reorder, omit, or restate them.
@@ -26,7 +27,13 @@ rename, reorder, omit, or restate them.
26
27
  - Categories: `reliability` | `repetition` | `workflow` | `performance` | `coverage` |
27
28
  `telemetry` | `positive`.
28
29
 
29
- Every finding's category is drawn from this closed set. No category is invented.
30
+ Every finding's category is drawn from this closed set. No category is invented — explicit
31
+ `category` values outside it fail the structure gate (`finding-invalid-category:<value>`), and so
32
+ do stable keys whose first segment falls outside it (`finding-invalid-key-category:<value>`,
33
+ task 0686). Environment-lens retro category names are encoded only in `<signal>` or the
34
+ owner-surface segment — never as a category. The authoritative seven-name projection table lives
35
+ in the [environment-improvement mapping](../../../references/environment-lens.md), which this
36
+ reference defers to rather than restates.
30
37
 
31
38
  ## Stable finding key (frozen)
32
39
 
@@ -58,6 +65,9 @@ Every finding — problem and positive alike — carries the full field set:
58
65
  | `confidence` | Per-finding: `high` / `medium` / `low`. Never one blanket report-level score. |
59
66
  | `contradictions` | Any contradicting signal shown beside the finding, not silently reconciled. |
60
67
  | `evidenceAnchor` | At least one anchor to the forensics artifact or cited `file:line`. An entry with no anchor is invalid. |
68
+ | `severity` | Closed vocabulary `P1` / `P2` / `P3` — how much the finding matters. Orthogonal to `confidence`: severity orders work, confidence says how sure we are (0680 R1). The structure gate fails a finding without one. |
69
+ | `reproCommand` | The invocation that reproduces the observation — one command a reader can run verbatim (0680 R2). Gate-enforced. |
70
+ | `ownerSurface` | The concrete surface that owns the fix (a file path, package, or command), consistent with the key's `<owner-surface>` segment but named as a target rather than a slug (0680 R3). Gate-enforced. |
61
71
 
62
72
  ## Evidence rules
63
73
 
@@ -120,11 +130,59 @@ Each option is a **proposal** that names:
120
130
  The report must contain **no applied change, no diff, and no command it claims to have run**. The
121
131
  skill never applies a fix; it proposes one.
122
132
 
133
+ ### Remediation handoff route (0680 R4)
134
+
135
+ For each proposal an operator accepts, the report supplies — printed in the report itself, never
136
+ executed — the `spur task create` invocation that lands it, carrying the proposal's finding
137
+ `key` in the task body so the next report classifies that finding as `resolved`. Auto-writing
138
+ to the task corpus from a model-authored report would bypass the CLI-gated write contract; the
139
+ operator remains the gate.
140
+
141
+ ### Report-only advisories (0680 R5)
142
+
143
+ Section 10 is the standing home for observations that inform workflow hygiene but must never
144
+ trigger automatic interruption: repeated identical tool-and-argument signatures are surfaced
145
+ here with their repetition counts, proposing at most human-decided process changes. Nothing in
146
+ this section may drive automated behavior.
147
+
148
+ ### Run-cost reporting (0680 R6)
149
+
150
+ Performance analysis states what the run itself cost: per-pairing `totalCostUsd` /
151
+ `meanDurationMs` figures flow from the pairing analytics fold (0679 repaired the payload
152
+ paths), so chained `agent.run` stages are reportable instead of "~unknown". Where no cost
153
+ signal exists for a pairing it renders `not available`, never zero.
154
+
155
+ ## Projected candidates — section 9 (environment lens, task 0686)
156
+
157
+ Section 9 (Workflow and process improvements) stays additive report grammar: unprojected numbered
158
+ prose remains valid and gains no required fields. A candidate **projected** through the
159
+ [environment-improvement lens](../../../references/environment-lens.md) is a bullet beginning with
160
+ a backticked stable key (retro name in `<signal>` or owner surface, closed category first — e.g.
161
+ `workflow:agents-md:navigation`) and carries four bold fields, the same names remediation options
162
+ use:
163
+
164
+ ```text
165
+ - `workflow:agents-md:navigation` — **owner surface:** `AGENTS.md` see_also. **expected impact:**
166
+ shorter file hunt. **verification method:** subsequent daily report key `resolved` or absent.
167
+ **reversibility:** revert the pointer.
168
+ ```
169
+
170
+ A projected candidate cites its section-4 finding `key` when one exists. Reports remain
171
+ proposal-only: no applied change, no diff, and no command the report claims to have run.
172
+
123
173
  ## Evidence ledger
124
174
 
125
175
  The final section lists, for every finding, the artifact anchor(s) and any cited `file:line`,
126
176
  so a reader can verify the report's claims against the evidence plane.
127
177
 
178
+ Every row MUST name the artifact path in backticks — the deterministic structure gate's
179
+ `evidence-claim-without-anchor` check matches `` `[^`]+\.(md|ts|json)` `` or a
180
+ `path:line` — never a bare `current`/`baseline` label. Write each anchor as:
181
+
182
+ ```text
183
+ `telemetry:history-analyze:duration-coverage-gap` | `.spur/run/<runId>-history-anatomy-current.json` — `#/warnings/0`, `#/derived/timeDecomposition`, `#/stepSupport`
184
+ ```
185
+
128
186
  ## Truthfulness invariants
129
187
 
130
188
  - `not available` is the true rendering for an unsupported dimension, never a masked gap.
@@ -42,12 +42,12 @@ silently (that is a HITL stop).
42
42
  ## Inputs
43
43
 
44
44
  | Input | Semantics |
45
- |-------|-----------|
45
+ | ------- | ----------- |
46
46
  | `target` | Task WBS (digits), task `.md` path, or feature id (`^[A-Z][1-9]*$`). Required for dispatch; omit → stop **U1** (usage). |
47
47
  | `--dry-run` | Print the resolved plan (**P1**) and do not dispatch. |
48
48
  | `--once` | Strip `--next` from the shaped child argv so only the current step runs; no router re-entry. |
49
49
  | `--auto` | Forward into dispatched children that support it. **Never** breaks multi-candidate HITL ties. |
50
- | `--agent <inline\|auto\|name>` | Execution-surface selector forwarded into the dispatched child when that child documents `--agent`. Router defaults to omit semantics: Omit forwards nothing, and the dispatched child applies its own default (host session, 0508 eligibility). Explicit `--agent inline` is the zero-dispatch carve-out, forwarded as-is; escalation triggers reject `inline` (no override). |
50
+ | `--agent <inline\|auto\|name>` | Execution-surface selector forwarded into the dispatched child when that child documents `--agent`. Router defaults to omit semantics: Omit forwards nothing, and the dispatched child applies its own default (`inline`, task 0687 — native-subagent-first with host fallback). Explicit `--agent inline` is forwarded as-is and resolves identically; escalation triggers take precedence over `inline`. |
51
51
  | `--full` | When the primary route is `dev-run … --next`, substitute `dev-run <wbs> --mode full` (no `--next`). No effect on non-run routes → warning **W-FULL**. |
52
52
 
53
53
  ## Protocol (deterministic)
@@ -126,7 +126,7 @@ but redundant. See the glossary entry for the disambiguation in full.
126
126
  **[references/messages.md](references/messages.md)** (exact templates, prefixed `dev-next:`). The router fires them by id:
127
127
 
128
128
  | Id | Fires when | Kind |
129
- |----|-----------|------|
129
+ | ---- | ----------- | ------ |
130
130
  | U1 | no target | stop — usage |
131
131
  | U2 | target unresolvable | stop |
132
132
  | U3 | no route (table miss / cancelled) | stop |
@@ -147,7 +147,7 @@ bypass lifecycle guards (`--no-lifecycle`) to force progress.
147
147
  ## Common Rationalizations
148
148
 
149
149
  | Rationalization | Reality |
150
- |---|---|
150
+ | --- | --- |
151
151
  | "Two candidates are both fine — pick the higher-priority one." | Multi-candidate is a HITL stop (routing-table §4). A silent pick hides a real fork from the operator; print the decision-brief. |
152
152
  | "The task is todo, so run the full pipeline to be safe." | Full mode is not the v1 default (non-route). A3 dispatches the `--next` chain link; `--full` exists for the explicit override. |
153
153
  | "I can loop dev-next until the task is done." | Step budget is one dispatch per invocation. Self-looping makes token cost unbounded; the operator re-invokes after non-chain dispatches. |
@@ -86,11 +86,10 @@ Parse the first positional argument as the mode; default `full`.
86
86
  - `--agent <inline|auto|name>` — names **who performs model-bearing work**, per the
87
87
  [inline-default execution-surface contract](../spur-dev/references/cross-cutting.md#inline-default-execution-surface).
88
88
  Omit: the current agent is the default owner (eligible model stages may use one native subagent
89
- under the shared contract). `inline` keeps all model work in the host session as the hard
90
- zero-dispatch guarantee. `auto` resolves the command's declared role; a named executor pins that executor.
89
+ under the shared contract). `inline` (also what omission resolves to, task 0687) keeps model work in the host session native-subagent-first with host fallback where eligible `auto` resolves the command's declared role; a named executor pins that executor.
91
90
  An alternate executor gets one `spur agent run --agent <value>` dispatch with the selector removed
92
91
  from child args; that child owns model work. Current-agent selection stays inline.
93
- Headless surfaces reject explicit `inline` with the shared stable error.
92
+ Headless surfaces substitute tier resolution for `inline` with a warning (task 0687), never refusing.
94
93
  - `--agent` describes the model owner only; it is independent of the deterministic git/GitHub spine
95
94
  and the workflow/direct route. Run the selected route in that resolved skill context. A separate
96
95
  workflow subprocess belongs to the caller's execution surface or an objective trigger (for example,
@@ -0,0 +1,184 @@
1
+ ---
2
+ name: redesign-web-ui
3
+ description: "Upgrade an existing website or app UI past generic AI defaults without rewriting the stack. Triggers: \"redesign this UI\", \"make it look premium\", \"generic AI design\", \"polish this page\", \"restyle the web app\"."
4
+ license: Apache-2.0
5
+ metadata:
6
+ author: spur
7
+ version: "1.0"
8
+ platforms: "claude-code,codex,openclaw,opencode,antigravity"
9
+ category: execution
10
+ interactions:
11
+ - pipeline
12
+ - reviewer
13
+ pipeline_steps:
14
+ - scan
15
+ - diagnose
16
+ - plan
17
+ - apply
18
+ - verify
19
+ operations:
20
+ - redesign
21
+ openclaw:
22
+ emoji: "🎨"
23
+ see_also:
24
+ - sp:code-implementation
25
+ - sp:code-review
26
+ - sp:source-driven-development
27
+ ---
28
+
29
+ # redesign-web-ui — existing-UI visual upgrade
30
+
31
+ This is a **technique** skill: it edits presentation. Specific product copy stays; placeholder copy
32
+ becomes real draft text. Information architecture, routing, and data behavior stay unless the
33
+ operator widens the scope.
34
+
35
+ ## When to use
36
+
37
+ - Redesign or restyle an existing page, app shell, or component set.
38
+ - Make an existing UI look premium / high-end rather than templated.
39
+ - Strip generic AI design fingerprints (Inter-only type, purple-blue gradients, three equal feature cards).
40
+ - Polish a page that feels unfinished (missing hover, focus, loading, empty, or error states).
41
+ - Restyle a web app in place without a framework migration.
42
+
43
+ ## When not to use
44
+
45
+ - **Greenfield visual identity with no existing UI** — there is nothing to upgrade; design from the brief.
46
+ - **IA or navigation restructure** — out of scope unless the operator asks.
47
+ - **Stack migration** — swapping CSS frameworks or component libraries.
48
+ - **Non-UI work** — APIs, CLI, schemas, backend.
49
+ - **Inventing legal or compliance surfaces** — privacy pages, terms, cookie banners. Link only
50
+ destinations the product already has.
51
+
52
+ ## Authority (read before changing tokens)
53
+
54
+ Resolve visual authority in this order. A lower layer never overrides a higher one. Cite the source
55
+ on every token change.
56
+
57
+ 1. **Repository-root `DESIGN.md`** — if it exists, it is the UI SSOT (palette, type, surfaces, motion,
58
+ density). Read it. Use its tokens by name.
59
+ 2. **Existing theme / CSS variables / Tailwind theme** — the live token file the app already compiles.
60
+ 3. **This skill's audit heuristics** — only for axes the two layers above leave free.
61
+
62
+ `docs/04_DESIGN.md` owns non-UI surfaces (commands, flags, DTOs). It is not this skill's authority.
63
+
64
+ Framework and CSS API facts (Tailwind v3 vs v4, styled-components APIs, browser features): verify
65
+ with source for the pinned version via `sp:source-driven-development`. Cross-check against docs
66
+ before changing config.
67
+
68
+ ## Pipeline
69
+
70
+ Run in order. Later steps consume the previous step's artifact. Stop after Diagnose when the
71
+ operator asked only for an audit.
72
+
73
+ ### Step 1 — Scan
74
+
75
+ Read the target UI and its styling entrypoints. Record, with evidence:
76
+
77
+ | Field | Evidence |
78
+ |---|---|
79
+ | Framework | manifest / entry file |
80
+ | Styling system | Tailwind v3/v4, CSS modules, vanilla, styled-components, … |
81
+ | Token source | `DESIGN.md`, CSS variables, `tailwind.config`, theme file |
82
+ | Scope | routes, layouts, and shared components that will render the change |
83
+
84
+ Done when every row has a path (or `none — proceed on heuristics`).
85
+
86
+ ### Step 2 — Diagnose
87
+
88
+ Walk [references/audit-checklist.md](references/audit-checklist.md). Emit a findings table. Every
89
+ row must cite `path:line`. No finding, no change. Cite the reference row you matched.
90
+
91
+ ```markdown
92
+ | ID | Pattern | Severity | Evidence | In-stack fix |
93
+ |----|---------|----------|----------|--------------|
94
+ | F1 | … | a11y \| fingerprint \| polish | `file:line` | … |
95
+ ```
96
+
97
+ Severity:
98
+
99
+ - **a11y** — focus, skip-link, alt, contrast, reduced-motion, keyboard path. Visible focus is required. Fix these.
100
+ - **fingerprint** — generic AI look that fights this product. Fix unless a higher authority specifies it.
101
+ - **polish** — optional quality. Apply when it does not fight the authority or the product type.
102
+
103
+ Done when every checklist category has been considered and every hit is a table row (or the
104
+ category is marked `none`).
105
+
106
+ ### Step 3 — Plan
107
+
108
+ Order the findings by the Fix Priority below. State the typefaces, palette, and one signature
109
+ choice, each cited to authority or to a subject-specific reason. Optional motion and layout
110
+ upgrades live in [references/upgrade-techniques.md](references/upgrade-techniques.md) — load that
111
+ file only when a finding needs a technique from it.
112
+
113
+ The plan should list every **a11y** and **fingerprint** finding. Always cite the token source.
114
+ Done when both are present.
115
+
116
+ ### Step 4 — Apply
117
+
118
+ Work in the existing styling system. Targeted upgrades, not a rewrite.
119
+
120
+ Fix Priority:
121
+
122
+ 1. Accessibility
123
+ 2. Token alignment to authority
124
+ 3. Typography and color fingerprints
125
+ 4. Hover, focus, active, loading, empty, error
126
+ 5. Layout, spacing, max-width
127
+ 6. Generic component cliches
128
+ 7. Motion that serves the product (and honors `prefers-reduced-motion`)
129
+
130
+ Before any new import, read the project's dependency manifest. Before editing Tailwind config,
131
+ validate the installed major version against its docs.
132
+
133
+ Done when every planned **a11y** and **fingerprint** row is reflected in the diff, or explicitly
134
+ deferred with a one-line reason.
135
+
136
+ ### Step 5 — Verify
137
+
138
+ Confirm with evidence, not assertion. See **Verification** below.
139
+
140
+ ## Hard constraints
141
+
142
+ - Keep the current framework and styling library.
143
+ - Preserve existing functionality; a visual change that breaks a flow is a failed run.
144
+ - Keep the diff reviewable — small, targeted edits over a greenfield restyle.
145
+ - Prefer the project's existing icon set, font loader, and image pipeline over new dependencies.
146
+ - Honor `prefers-reduced-motion` for every motion addition.
147
+
148
+ ## Common Rationalizations
149
+
150
+ | Rationalization | Reality |
151
+ |---|---|
152
+ | "I'll migrate to a nicer component library while I'm here." | Stack change is out of scope. Upgrade what is already compiled. |
153
+ | "DESIGN.md is just a mood board — I'll pick better colors." | Root `DESIGN.md` is authority. Cite its tokens; do not invent a parallel palette. |
154
+ | "A full rewrite is faster than patching these class names." | Rewrites drop states, a11y, and behavior. Patch in place; the audit is the map. |
155
+ | "I'll add stock photos / a new icon library for polish." | New assets and libraries are fingerprints of their own. Use the project's pipeline. |
156
+ | "Legal links and a cookie banner will make it feel finished." | Invented compliance UI is worse than omission. Link only destinations the product already has. |
157
+ | "A screenshot of the happy path is enough." | Verify behavior, shared routes, empty/error/focus, and both viewports when layout changed. |
158
+
159
+ ## Red Flags
160
+
161
+ - Diff introduces a second CSS framework or a new icon/font package without a dependency-file check.
162
+ - Palette or typeface that contradicts repository-root `DESIGN.md`.
163
+ - Finding with no `path:line` evidence.
164
+ - Custom scroll hijacking or inertia scroll on a product UI.
165
+ - Claimed "done" with no visual verification evidence (or no statement of what could not be verified).
166
+ - Placeholder copy (`Lorem ipsum`, "John Doe", "Acme Corp") left in the shipped UI.
167
+
168
+ ## Verification
169
+
170
+ After Apply, ensure each box has evidence (command output, screenshot, or `file:line`), not assertion:
171
+
172
+ - [ ] Every **a11y** and **fingerprint** finding is fixed or deferred with a reason.
173
+ - [ ] Token changes cite `DESIGN.md`, the live theme file, or a subject-specific reason (source named).
174
+ - [ ] Existing tests still pass; new imports exist in the dependency manifest.
175
+ - [ ] Shared layouts/components that consume the changed tokens still render consistently — cross-check each route that shares them.
176
+ - [ ] Browser (or closest substitute): golden path + empty/error/focus; desktop and mobile viewports when layout or spacing changed.
177
+ - [ ] `prefers-reduced-motion` still disables added motion.
178
+ - [ ] Document what could not be verified (no browser tools → say so; do not claim visual QA).
179
+
180
+ ## See also
181
+
182
+ - **`sp:source-driven-development`** — verify framework/CSS API facts against the pinned version before editing config.
183
+ - **`sp:code-implementation`** — owns feature implementation; this skill owns the visual upgrade pass.
184
+ - **`sp:code-review`** — review the visual diff for regressions and out-of-scope stack changes.
@@ -0,0 +1,121 @@
1
+ # Audit checklist
2
+
3
+ Lookup for `sp:redesign-web-ui` Diagnose. Every hit becomes a findings-table row with `path:line`
4
+ evidence and an in-stack fix. Severity values (`a11y` / `fingerprint` / `polish`) and when to
5
+ apply each are defined in the skill's Diagnose step.
6
+
7
+ A category with no hits is recorded as `none`. Do not invent findings to fill the table.
8
+
9
+ ---
10
+
11
+ ## Typography
12
+
13
+ | Problem | In-stack fix | Severity |
14
+ |---|---|---|
15
+ | Browser default, Inter, Roboto, or Arial as the only face | Pick a display + body pair for *this* product's subject and cite why. Repeating Inter, or swapping Inter for Geist/Outfit/Satoshi with no subject reason, is still a default. | fingerprint |
16
+ | Headlines lack presence | Increase display size, tighten letter-spacing, reduce line-height so titles feel intentional. | fingerprint |
17
+ | Body line length unconstrained | Cap paragraph measure near 65 characters; raise line-height for reading blocks. | polish |
18
+ | Only 400 and 700 weights | Add 500/600 where hierarchy needs a middle step. | polish |
19
+ | Proportional figures in tables, prices, metrics | Tabular nums (`font-variant-numeric: tabular-nums`) or a monospace face for data. | polish |
20
+ | No tracking on display vs. labels | Negative tracking on large headers; slight positive tracking on small labels/small-caps. | polish |
21
+ | All-caps subheaders as the only accent | Sentence case, small-caps, or italic — one treatment, used sparingly. | fingerprint |
22
+ | Orphaned last words in headings | `text-wrap: balance` (headings) or `text-wrap: pretty` (body). | polish |
23
+
24
+ ## Color and surfaces
25
+
26
+ | Problem | In-stack fix | Severity |
27
+ |---|---|---|
28
+ | Pure `#000` canvas or pure `#fff` only | Off-black / off-white or a tinted dark from the authority palette. | fingerprint |
29
+ | Oversaturated accents | Keep saturation in range with surrounding neutrals; one chromatic accent unless authority specifies more. | fingerprint |
30
+ | Mixing warm and cool gray families | One gray family, tinted with a consistent hue. | fingerprint |
31
+ | Purple/blue "AI gradient" (or cream+serif+terracotta, or acid-green-on-black used as a default) | Neutral bases + the authority accent. Those three looks are legitimate for some briefs; they are fingerprints when chosen without a subject reason. | fingerprint |
32
+ | Generic black `box-shadow` | Tint shadows to the surface hue. | polish |
33
+ | Perfectly even 45° linear fades | Radial, mesh, or a noise overlay — or no gradient. | fingerprint |
34
+ | Conflicting light sources across shadows | One implied light direction. | polish |
35
+ | A single inverted-color band in an otherwise consistent page | Same palette, shifted shade — or a full committed dark/light mode. | fingerprint |
36
+ | Empty flat sections that need presence | Texture, a restrained ambient gradient, or an existing product image. Use the project's image pipeline; do not inject random stock URLs. | polish |
37
+
38
+ ## Layout
39
+
40
+ | Problem | In-stack fix | Severity |
41
+ |---|---|---|
42
+ | Everything centered and symmetrical | Offset, mixed aspect ratios, or left-aligned headers over centered content — when the content supports it. | fingerprint |
43
+ | Three equal card columns as the feature row | Asymmetric grid, 2-column zig-zag, or a single highlighted module. | fingerprint |
44
+ | `height: 100vh` full-screen sections | `min-height: 100dvh` (mobile browser chrome). | a11y |
45
+ | No max-width on reading/marketing content | Container ~1200–1440px with auto margins. Data-dense dashboards may stay full-bleed. | polish |
46
+ | Uniform radius on every element | Tighter radius on inner controls, softer on outer containers — or sharp, if authority is sharp. | polish |
47
+ | Missing whitespace on marketing pages | Increase spacing until groups read as groups. Dense is correct for data tables. | polish |
48
+ | Card CTAs / feature lists at uneven baselines | Align shared elements (title, price, list start, button) across the row. | polish |
49
+ | Optical vs. mathematical centering (icon-in-circle, play button) | 1–2px optical adjustment. | polish |
50
+
51
+ Do **not** treat "dashboard has a left sidebar" as a defect. Changing IA is out of scope.
52
+
53
+ ## Interactivity and states
54
+
55
+ | Problem | In-stack fix | Severity |
56
+ |---|---|---|
57
+ | No hover on pointer-capable buttons/links | Background, border, or 1px translate — 150–250ms. | fingerprint |
58
+ | No active/pressed feedback | `scale(0.98)` or `translateY(1px)`. | polish |
59
+ | Instant transitions (`transition: none` on chrome) | 150–250ms on interactive chrome; leave data-dense tables snappy. | polish |
60
+ | Missing visible focus ring | Visible `:focus-visible` using the authority accent. Keyboard path is required. | a11y |
61
+ | Spinner-only loading | Skeleton that matches the layout shape. | polish |
62
+ | Blank empty states | A composed getting-started / zero-data view with one next action. | polish |
63
+ | Errors via `window.alert()` or no inline message | Inline field/form error in the product voice. | a11y |
64
+ | Buttons that go to `#` | Real href, or a disabled control with a reason. | a11y |
65
+ | No current-page indication in nav | Distinct active style. | a11y |
66
+ | Instant anchor jumps | `scroll-behavior: smooth` on the document, with reduced-motion fallback to instant. | polish |
67
+ | Animating `top` / `left` / `width` / `height` | Animate `transform` and `opacity`. | polish |
68
+
69
+ ## Content
70
+
71
+ | Problem | In-stack fix | Severity |
72
+ |---|---|---|
73
+ | `Lorem ipsum` or `placeholder` copy | Real draft copy for this product. | fingerprint |
74
+ | "John Doe", "Jane Smith", "Acme Corp", "Nexus", "SmartFlow" | Contextual names. | fingerprint |
75
+ | Fake round metrics (`99.99%`, `$100.00`) | Organic figures, or label them as examples. | fingerprint |
76
+ | AI cliches: Elevate, Seamless, Unleash, Next-Gen, Game-changer, Delve, Tapestry, "In the world of…" | Plain, specific language. | fingerprint |
77
+ | "Oops!" / exclamation-mark success toasts | Direct: "Saved." / "Connection failed. Try again." | fingerprint |
78
+ | Title Case On Every Header | Sentence case, unless the brand guide says otherwise. | polish |
79
+ | Identical dates or avatars on every dummy person | Unique assets per distinct person, or drop the avatars. | fingerprint |
80
+
81
+ ## Component patterns
82
+
83
+ | Problem | In-stack fix | Severity |
84
+ |---|---|---|
85
+ | Card = border + shadow + white fill on every block | Cards only when elevation encodes hierarchy; otherwise background or spacing. | fingerprint |
86
+ | Always one filled + one ghost button | Text/tertiary action when the second action is low emphasis. | polish |
87
+ | Pill "New"/"Beta" badges as decoration | Square badge, flag, or plain label — or remove. | polish |
88
+ | Accordion FAQ / 3-card testimonial carousel / 3-tower pricing as empty decoration | A layout that matches the actual content. Keep the pattern when it *is* the product's IA. | fingerprint |
89
+ | Modal for a single-field edit | Inline edit or a slide-over. | polish |
90
+ | Footer link farm (4+ columns of unused links) | Primary paths + real legal destinations the product already has. | polish |
91
+
92
+ ## Iconography and media
93
+
94
+ | Problem | In-stack fix | Severity |
95
+ |---|---|---|
96
+ | Mixed icon sets / mixed stroke widths | Standardize on the set already in the dependency manifest. Do not add Phosphor/Heroicons/Lucide as a second library. | fingerprint |
97
+ | Rocket = Launch, shield = Security, as the only metaphors | Less obvious icons from the *same* set, or text. | polish |
98
+ | Missing favicon | Branded favicon in the project's existing public/asset pipeline. | polish |
99
+ | Random stock "team" photos | Real assets, a consistent illustration style, or no people photos. | fingerprint |
100
+
101
+ ## Code quality (UI)
102
+
103
+ | Problem | In-stack fix | Severity |
104
+ |---|---|---|
105
+ | Non-semantic soup for nav/main/content | `<nav>`, `<main>`, `<article>`, `<aside>`, `<section>` where they match the role. | a11y |
106
+ | Inline styles mixed into a class-based system | Move the declaration into the project's styling system. | polish |
107
+ | Hardcoded px widths on fluid layouts | `%`, `rem`, `em`, `max-width`, or the system's spacing scale. | polish |
108
+ | Meaningful images with empty or `alt="image"` | Describe the image; decorative images get `alt=""` plus `role="presentation"` if needed. | a11y |
109
+ | `z-index: 9999` and friends | A documented z-scale on the theme. | polish |
110
+ | Missing `<title>`, description, or social meta | Fill from the product name and the page's job. | polish |
111
+ | Import not in the dependency manifest | Use an already-installed package, or stop and ask before adding one. | fingerprint |
112
+
113
+ ## Completeness (product UI, not decoration)
114
+
115
+ | Problem | In-stack fix | Severity |
116
+ |---|---|---|
117
+ | No skip-to-content link | Visually hidden skip link targeting `<main>`. | a11y |
118
+ | Dead-end views with no way back | A back/close path that uses the existing router. | a11y |
119
+ | No custom 404 | Branded empty-route view with a path home. | polish |
120
+ | Forms without client-side required/format checks | Validate in the existing form library; keep server-side as source of truth. | a11y |
121
+ | Footer legal links that 404 | Point at real routes, or omit. | polish |