@gobing-ai/spur 0.3.63 → 0.3.65

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 (125) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/config/corpus-baseline.json +2995 -6832
  3. package/config/rules/boundary/sp-runtime-path.yaml +45 -35
  4. package/config/rules/surface/check-cli-surface.yaml +7 -5
  5. package/config/workflows/history-anatomy.yaml +39 -8
  6. package/package.json +9 -9
  7. package/plugins/sp/README.md +17 -10
  8. package/plugins/sp/agents/expert-spur.md +20 -4
  9. package/plugins/sp/commands/dev-find-issue.md +5 -2
  10. package/plugins/sp/commands/dev-gitmsg.md +12 -6
  11. package/plugins/sp/commands/dev-gtd.md +8 -19
  12. package/plugins/sp/commands/dev-idea.md +1 -1
  13. package/plugins/sp/commands/dev-plan.md +1 -1
  14. package/plugins/sp/commands/dev-review-session.md +36 -0
  15. package/plugins/sp/commands/dev-run.md +2 -2
  16. package/plugins/sp/commands/dev-runall.md +2 -2
  17. package/plugins/sp/commands/dev-wrap.md +5 -6
  18. package/plugins/sp/commands/dev-wrapall.md +5 -7
  19. package/plugins/sp/plugin.json +1 -1
  20. package/plugins/sp/references/environment-lens.md +4 -2
  21. package/plugins/sp/references/roles.md +8 -5
  22. package/plugins/sp/scripts/history-anatomy-cache.mjs +3 -2
  23. package/plugins/sp/scripts/history-anatomy-cache.ts +7 -2
  24. package/plugins/sp/skills/dogfood-testing/SKILL.md +22 -1
  25. package/plugins/sp/skills/history-anatomy/references/report-contract.md +8 -0
  26. package/plugins/sp/skills/next-router/SKILL.md +4 -4
  27. package/plugins/sp/skills/pr-reviewing/SKILL.md +2 -3
  28. package/plugins/sp/skills/redesign-web-ui/SKILL.md +184 -0
  29. package/plugins/sp/skills/redesign-web-ui/references/audit-checklist.md +121 -0
  30. package/plugins/sp/skills/redesign-web-ui/references/upgrade-techniques.md +66 -0
  31. package/plugins/sp/skills/session-review/SKILL.md +106 -0
  32. package/plugins/sp/skills/spur-cli/references/agent.md +1 -1
  33. package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +5 -0
  34. package/plugins/sp/skills/spur-cli/references/workflows/operations.md +20 -5
  35. package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +230 -0
  36. package/plugins/sp/skills/spur-cli/references/workflows.md +27 -5
  37. package/plugins/sp/skills/spur-dev/references/cross-cutting.md +22 -30
  38. package/plugins/sp/skills/spur-dev/references/dev-operations.md +73 -28
  39. package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
  40. package/plugins/sp/skills/spur-dev/references/flag-glossary.md +18 -8
  41. package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +15 -12
  42. package/spur.js +1152 -816
  43. package/web/_astro/{BoardApp.CKolAjUz.js → BoardApp.BEtcJqde.js} +62 -62
  44. package/web/_astro/BoardApp.DBEin4N5.js +1 -0
  45. package/web/_astro/{TaskDetail.Bre7G4gC.js → TaskDetail.ClAbCXom.js} +1 -1
  46. package/web/_astro/arc.CCvf51_y.js +1 -0
  47. package/web/_astro/architectureDiagram-3BPJPVTR.C0cb0J5M.js +36 -0
  48. package/web/_astro/{blockDiagram-GPEHLZMM.CCGHeRVi.js → blockDiagram-GPEHLZMM.CIyjqoCE.js} +4 -4
  49. package/web/_astro/{c4Diagram-AAUBKEIU.CpqewGmd.js → c4Diagram-AAUBKEIU.fs14IuFs.js} +1 -1
  50. package/web/_astro/channel.BGn_DUCD.js +1 -0
  51. package/web/_astro/chunk-2J33WTMH.CaBKv4ZO.js +1 -0
  52. package/web/_astro/{chunk-4BX2VUAB.ifGXoUA3.js → chunk-4BX2VUAB.BOllTPto.js} +1 -1
  53. package/web/_astro/chunk-55IACEB6.ChEof0O4.js +1 -0
  54. package/web/_astro/{chunk-727SXJPM.DzPE41OS.js → chunk-727SXJPM.Co2kdjD8.js} +2 -2
  55. package/web/_astro/{chunk-AQP2D5EJ.UF2QRXYF.js → chunk-AQP2D5EJ.SWmfcnog.js} +2 -2
  56. package/web/_astro/{chunk-FMBD7UC4.D2zXKa1R.js → chunk-FMBD7UC4.rDAFifF3.js} +1 -1
  57. package/web/_astro/chunk-ND2GUHAM.BCnoXKCw.js +1 -0
  58. package/web/_astro/{chunk-QZHKN3VN.nUKFBiLD.js → chunk-QZHKN3VN.RSmy2hDO.js} +1 -1
  59. package/web/_astro/{classDiagram-4FO5ZUOK.DZg9K9mO.js → classDiagram-4FO5ZUOK.Be7PEfrX.js} +1 -1
  60. package/web/_astro/{classDiagram-v2-Q7XG4LA2.DZg9K9mO.js → classDiagram-v2-Q7XG4LA2.Be7PEfrX.js} +1 -1
  61. package/web/_astro/{client.CdFpTatq.js → client.yhYJvxCU.js} +1 -1
  62. package/web/_astro/cose-bilkent-S5V4N54A.BkUp2aSK.js +1 -0
  63. package/web/_astro/cynefin-OW5HDTMX.BegGGlUV.js +166 -0
  64. package/web/_astro/cytoscape.esm.DzSz-X2X.js +321 -0
  65. package/web/_astro/dagre-BM42HDAG.BkUdjsaC.js +4 -0
  66. package/web/_astro/{defaultLocale.CrowFXzY.js → defaultLocale.DX6XiGOO.js} +1 -1
  67. package/web/_astro/diagram-2AECGRRQ.E9vugt3-.js +43 -0
  68. package/web/_astro/diagram-5GNKFQAL.Dj4yeHXB.js +10 -0
  69. package/web/_astro/diagram-KO2AKTUF.Buaquwli.js +3 -0
  70. package/web/_astro/diagram-LMA3HP47.BV3dgGgm.js +24 -0
  71. package/web/_astro/diagram-OG6HWLK6.Cnx3s-tc.js +24 -0
  72. package/web/_astro/{erDiagram-TEJ5UH35.CF2U-pQZ.js → erDiagram-TEJ5UH35.DKK_abu4.js} +3 -3
  73. package/web/_astro/{flowDiagram-I6XJVG4X.BJK4M3in.js → flowDiagram-I6XJVG4X.BNuu9fbm.js} +4 -4
  74. package/web/_astro/ganttDiagram-6RSMTGT7.b16KUMjy.js +292 -0
  75. package/web/_astro/gitGraphDiagram-PVQCEYII.Kh41lbG5.js +106 -0
  76. package/web/_astro/{graph.D2o_JWn5.js → graph.-OzhPTMs.js} +1 -1
  77. package/web/_astro/{index.A0eX93qW.js → index.De90oHcH.js} +1 -1
  78. package/web/_astro/infoDiagram-5YYISTIA.DEWBXkp-.js +2 -0
  79. package/web/_astro/{ishikawaDiagram-YF4QCWOH.BmWDZtwF.js → ishikawaDiagram-YF4QCWOH.DiAdmcL6.js} +4 -4
  80. package/web/_astro/{journeyDiagram-JHISSGLW.CpB1YWDP.js → journeyDiagram-JHISSGLW.D1Ki7IRm.js} +1 -1
  81. package/web/_astro/{kanban-definition-UN3LZRKU.k-fukQX9.js → kanban-definition-UN3LZRKU.CWUhrQpc.js} +21 -21
  82. package/web/_astro/layout.owoKPs3z.js +1 -0
  83. package/web/_astro/linear.BaFsgcCe.js +1 -0
  84. package/web/_astro/{mermaid.core.DnpzzuPU.js → mermaid.core.CHw_AsGy.js} +5 -5
  85. package/web/_astro/{mindmap-definition-RKZ34NQL.D9NnlLBu.js → mindmap-definition-RKZ34NQL.UIhghgmN.js} +8 -8
  86. package/web/_astro/ordinal.DBvzRdQf.js +1 -0
  87. package/web/_astro/pieDiagram-4H26LBE5.D05l3JUA.js +30 -0
  88. package/web/_astro/{quadrantDiagram-W4KKPZXB.BkAygRlm.js → quadrantDiagram-W4KKPZXB.BcWIhIcE.js} +1 -1
  89. package/web/_astro/{requirementDiagram-4Y6WPE33.CX8ibmwc.js → requirementDiagram-4Y6WPE33.B1rYvKGn.js} +1 -1
  90. package/web/_astro/sankeyDiagram-5OEKKPKP.CKylVRC4.js +40 -0
  91. package/web/_astro/{sequenceDiagram-3UESZ5HK.veO8c2tk.js → sequenceDiagram-3UESZ5HK.Dm3uA_s4.js} +3 -3
  92. package/web/_astro/stateDiagram-AJRCARHV.Bgca_BLe.js +1 -0
  93. package/web/_astro/stateDiagram-v2-BHNVJYJU.C1T7YFrG.js +1 -0
  94. package/web/_astro/{timeline-definition-PNZ67QCA.DayoPp_2.js → timeline-definition-PNZ67QCA.ZOHJn3Sn.js} +4 -4
  95. package/web/_astro/vennDiagram-CIIHVFJN.DegZitjD.js +34 -0
  96. package/web/_astro/{wardleyDiagram-YWT4CUSO.lIAjSkZJ.js → wardleyDiagram-YWT4CUSO.BDsC115d.js} +1 -1
  97. package/web/_astro/{xychartDiagram-2RQKCTM6.D8_2K6U1.js → xychartDiagram-2RQKCTM6.D0MO70ea.js} +4 -4
  98. package/web/index.html +1 -1
  99. package/web/_astro/BoardApp.DXD--ybM.js +0 -1
  100. package/web/_astro/arc.7luwOGiC.js +0 -1
  101. package/web/_astro/architectureDiagram-3BPJPVTR.F6KaHXp-.js +0 -36
  102. package/web/_astro/channel.DxfOFf1l.js +0 -1
  103. package/web/_astro/chunk-2J33WTMH.CB9vKa5F.js +0 -1
  104. package/web/_astro/chunk-55IACEB6.VIaRo7l8.js +0 -1
  105. package/web/_astro/chunk-ND2GUHAM.Cb9bDyvx.js +0 -1
  106. package/web/_astro/cose-bilkent-S5V4N54A.D9STo90d.js +0 -1
  107. package/web/_astro/cytoscape.esm.D3_iZ_3b.js +0 -321
  108. package/web/_astro/dagre-BM42HDAG.D3IbwhHz.js +0 -4
  109. package/web/_astro/diagram-2AECGRRQ.BWTDxBe9.js +0 -43
  110. package/web/_astro/diagram-5GNKFQAL.XnXlonHG.js +0 -10
  111. package/web/_astro/diagram-KO2AKTUF.CywOngCO.js +0 -3
  112. package/web/_astro/diagram-LMA3HP47.DY1D21Iu.js +0 -24
  113. package/web/_astro/diagram-OG6HWLK6.DQxb59KA.js +0 -24
  114. package/web/_astro/ganttDiagram-6RSMTGT7.BSniMzdB.js +0 -292
  115. package/web/_astro/gitGraphDiagram-PVQCEYII.Dxg-yRov.js +0 -106
  116. package/web/_astro/infoDiagram-5YYISTIA.BY4CgO_n.js +0 -2
  117. package/web/_astro/layout.DNLMvjEt.js +0 -1
  118. package/web/_astro/linear.BNNCobvI.js +0 -1
  119. package/web/_astro/ordinal.BYWQX77i.js +0 -1
  120. package/web/_astro/pieDiagram-4H26LBE5.CKhoMiyC.js +0 -30
  121. package/web/_astro/sankeyDiagram-5OEKKPKP.Dvurpa0Y.js +0 -40
  122. package/web/_astro/stateDiagram-AJRCARHV.DpMr4CO3.js +0 -1
  123. package/web/_astro/stateDiagram-v2-BHNVJYJU.CKjso86_.js +0 -1
  124. package/web/_astro/vennDiagram-CIIHVFJN.XNHf04O9.js +0 -34
  125. package/web/_astro/wardley-L42UT6IY.CpM_031g.js +0 -161
@@ -18,7 +18,7 @@ Wraps the **sp:spur-dev** skill.
18
18
  | `--mode` `<sequential\|parallel>` | Batch execution order. | sequential |
19
19
  | `--keep-going` | Continue past per-task failures. | off |
20
20
  | `--auto` | Skip objective HITL gates. | off |
21
- | `--agent` `<inline\|auto\|name>` | Who runs each task's pipeline stages. Interactive sequential omit/`inline` uses the host-session driver host-controlled; **omit**'s eligible `agent.run` stages may use a native subagent (task 0508); explicit `--agent inline` is the zero-dispatch carve-out (every stage executes in the invoking session). `auto`, a name, parallel mode, and headless invocation use subprocesses. | omit |
21
+ | `--agent` `<inline\|auto\|name>` | Who runs each task's pipeline stages. Interactive sequential omit/`inline` uses the host-session driver with unified inline semantics (task 0687 see below)). `auto`, a name, parallel mode, and headless invocation use subprocesses. | omit |
22
22
  | `--json` | Emit structured JSON. | off |
23
23
  | `--wrap` | Run the wrap hop per task. The `--agent` selector is preserved into each `/sp:dev-wrap <wbs>` handoff when supplied; omission remains omission. | off |
24
24
  | `--next` | Chain-to-completion via the next-router. | off |
@@ -81,6 +81,6 @@ full distinction.
81
81
 
82
82
  ## Implementation
83
83
 
84
- - Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface). Interactive sequential omit/`inline` keeps the orchestrator in the host session through the [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md); **omitted** `--agent`'s eligible `agent.run` stages may dispatch once to a native subagent with host fallback (task 0508); explicit `--agent inline` is the zero-dispatch carve-out. `--agent auto`, a name, or parallel mode retains the isolated per-task workflow boundary.
84
+ - Apply the [inline-default execution-surface contract](../skills/spur-dev/references/cross-cutting.md#inline-default-execution-surface). Interactive sequential omit/`inline` keeps the orchestrator in the host session through the [inline pipeline driver](../skills/spur-dev/references/inline-pipeline-driver.md); the resolved selector applies uniformly — eligible `agent.run` stages dispatch once to a native subagent with host fallback (0508). `--agent auto`, a name, or parallel mode retains the isolated per-task workflow boundary.
85
85
  - Interactive sequential omit/inline: `Skill(skill="sp:spur-dev", args="runall-inline $ARGUMENTS")`.
86
86
  - Explicit executor or parallel mode: `Skill(skill="sp:spur-dev", args="runall $ARGUMENTS")` → `sp:super-planner` agent.
@@ -14,7 +14,7 @@ Wraps the **wrapup-pipeline.yaml** workflow.
14
14
  | Flag | Description | Default |
15
15
  | --- | --- | --- |
16
16
  | `<wbs>` | Task WBS to wrap. | required |
17
- | `--agent` `<inline\|auto\|name>` | Who runs the wrap's model-bearing steps. Wrap is workflow-backed (headless): `omit` resolves to `agent.default` (objective trigger 3 durable auditable run record required); explicit `--agent inline` is rejected with the stable special error — a headless workflow surface cannot host a session; `auto` tier-resolves an executor; a name pins that executor into `vars.agent`. | agent.default |
17
+ | `--agent` `<inline\|auto\|name>` | Who runs the wrap's model-bearing steps. Wrap is workflow-backed (headless): `omit` and `--agent inline` resolve identically per task 0687 — tier substitution under objective trigger 3 (durable auditable run record required) with a warning naming the substituted executor; `auto` tier-resolves an executor; a name pins that executor into `vars.agent`. | inline |
18
18
  | `--auto` | Skip objective HITL gates. | off |
19
19
  | `--merge` | Merge the wrap branch. | off |
20
20
  | `--dry-run` | Render the wrap without writing. | off |
@@ -32,13 +32,13 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
32
32
  - Resolve the executor **before** launching the workflow:
33
33
  - `--agent <name>` → pass the name unchanged into `vars.agent`.
34
34
  - `--agent auto` → tier-resolve a concrete executor first, then merge it into `vars.agent`.
35
- - omit resolve to `agent.default`; explicit `--agent inline` rejected with the stable special error (headless surface no dispatch, no `agent.default` fallback).
35
+ - omit and explicit `--agent inline` resolve identically (task 0687): tier substitution plus one warning naming the resolved executor (headless surface).
36
36
  - Emit a pre-dispatch notice naming the override before `spur workflow run`, exactly:
37
- `execution surface: subprocess`, `reason: trigger 3 — durable auditable run record required`, `requested agent: inline|auto|<name>` (explicit `inline` rejects before dispatch no executor resolves), `executor: agent.default|<resolved-name>`.
37
+ `execution surface: subprocess`, `reason: trigger 3 — durable auditable run record required`, `requested agent: inline|auto|<name>` (explicit `inline` substitutes tier resolution and warns), `executor: <substituted-name>|<resolved-name>`.
38
38
  - The wrap workflow still creates its durable run record (task_run_links / trace) — the notice reports the override, it does not change the workflow.
39
39
 
40
40
  ```bash
41
- AGENT=… # resolved above: agent.default for omitted, tier-resolved for auto, unchanged for <name>; explicit inline errors (headless)
41
+ AGENT=… # omit≡inline tier-substituted executor + warning; auto tier-resolved; <name> unchanged
42
42
  echo "execution surface: subprocess; reason: trigger 3 — durable auditable run record required; requested agent: <inline|auto|name>; executor: $AGENT"
43
43
  VARS=$(jq -nc --arg tasks "[\"$WBS\"]" --arg agent "$AGENT" --arg profile "$PROFILE" --arg merge "$MERGE" \
44
44
  '{tasks:$tasks, agent:$agent, profile:$profile, merge:$merge}')
@@ -46,5 +46,4 @@ spur workflow run wrapup-pipeline.yaml --vars "$VARS" [--dry-run]
46
46
  ```
47
47
 
48
48
  The executor resolution is described in the bullets above; the snippet's `AGENT` variable carries
49
- the resolved name (`agent.default` for omitted `--agent`; explicit `--agent inline` is rejected
50
- before dispatch).
49
+ the resolved name (omit explicit `inline`; both tier-substitute with a warning).
@@ -16,7 +16,7 @@ Wraps the **wrapup-pipeline.yaml** workflow.
16
16
  | `--since` `<iso-date>` | Wrap tasks completed since a date. | configured |
17
17
  | `--feature` `<id>` | Wrap tasks in a feature. | omitted |
18
18
  | `--status` `<s>` | Only wrap tasks in a status. | done |
19
- | `--agent` `<inline\|auto\|name>` | Who runs the wrap's model-bearing steps. Wrap is workflow-backed (headless): `omit` resolves to `agent.default` (objective trigger 3 durable auditable run record required); explicit `--agent inline` is rejected with the stable special error — a headless workflow surface cannot host a session; `auto` tier-resolves an executor; a name pins that executor into `vars.agent`. | agent.default |
19
+ | `--agent` `<inline\|auto\|name>` | Who runs the wrap's model-bearing steps. Wrap is workflow-backed (headless): `omit` and `--agent inline` resolve identically per task 0687 — tier substitution under objective trigger 3 (durable auditable run record required) with a warning naming the substituted executor; `auto` tier-resolves an executor; a name pins that executor into `vars.agent`. | inline |
20
20
  | `--auto` | Skip objective HITL gates. | off |
21
21
  | `--merge` | Merge wrap branches. | off |
22
22
  | `--dry-run` | Render wraps without writing. | off |
@@ -34,13 +34,13 @@ For shared semantics, see the [flag glossary](../skills/spur-dev/references/flag
34
34
  - Resolve the executor **before** launching the workflow:
35
35
  - `--agent <name>` → pass the name unchanged into `vars.agent`.
36
36
  - `--agent auto` → tier-resolve a concrete executor first, then merge it into `vars.agent`.
37
- - omit resolve to `agent.default`; explicit `--agent inline` rejected with the stable special error (headless surface no dispatch, no `agent.default` fallback).
37
+ - omit and explicit `--agent inline` resolve identically (task 0687): tier substitution plus one warning naming the resolved executor (headless surface).
38
38
  - Emit a pre-dispatch notice naming the override before `spur workflow run`, exactly:
39
- `execution surface: subprocess`, `reason: trigger 3 — durable auditable run record required`, `requested agent: inline|auto|<name>` (explicit `inline` rejects before dispatch no executor resolves), `executor: agent.default|<resolved-name>`.
39
+ `execution surface: subprocess`, `reason: trigger 3 — durable auditable run record required`, `requested agent: inline|auto|<name>` (explicit `inline` substitutes tier resolution and warns), `executor: <substituted-name>|<resolved-name>`.
40
40
  - The wrap workflow still creates its durable run record — the notice reports the override, it does not change the workflow.
41
41
 
42
42
  ```bash
43
- AGENT=… # resolved above: agent.default for omitted, tier-resolved for auto, unchanged for <name>; explicit inline errors (headless)
43
+ AGENT=… # omit≡inline tier-substituted executor + warning; auto tier-resolved; <name> unchanged
44
44
  echo "execution surface: subprocess; reason: trigger 3 — durable auditable run record required; requested agent: <inline|auto|name>; executor: $AGENT"
45
45
  VARS=$(jq -nc --arg tasks "$TASKS" --arg feature "$FEATURE" --arg agent "$AGENT" --arg profile "$PROFILE" --arg merge "$MERGE" \
46
46
  '{tasks:$tasks, feature:$feature, agent:$agent, profile:$profile, merge:$merge}')
@@ -48,6 +48,4 @@ spur workflow run wrapup-pipeline.yaml --vars "$VARS" [--dry-run]
48
48
  ```
49
49
 
50
50
  The executor resolution is described in the bullets above; the snippet's `AGENT` variable carries
51
- the resolved name (`agent.default` for omitted `--agent`; explicit `--agent inline` is rejected
52
- before dispatch).
53
-
51
+ the resolved name (omit explicit `inline`; both tier-substitute with a warning).
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sp",
3
- "version": "0.3.63",
3
+ "version": "0.3.65",
4
4
  "description": "Spur — a local-first harness engineering toolkit that wraps mainstream coding agents with constraint checking, workflow orchestration, and history analytics.",
5
5
  "extensions": {
6
6
  "pi": ["./hooks/pi/guard-extension.ts"]
@@ -9,7 +9,8 @@ shipped or invoked by anything in this plugin.)
9
9
  Neither report projection restates the table below; each links here as its category table
10
10
  (task 0686 / feature I9; accepted design `docs/design/environment-improvement-lens.md`,
11
11
  ADR-084/085). There is deliberately no `/sp:dev-retro` command, no CLI change, and no protocol
12
- bump behind this mapping.
12
+ bump behind this mapping. `sp:session-review` consumes only the placement rule for supported
13
+ live-session proposals; it adds no category projection or imported-history analysis owner (ADR-089).
13
14
 
14
15
  ## Canonical categories and projections
15
16
 
@@ -58,7 +59,8 @@ create` handoff, manual edit), which remain explicit human gates.
58
59
  ## Keep / drop boundary
59
60
 
60
61
  Kept here because both live reports consume it: the seven names above, their projections, and
61
- this placement rule. Dropped (each needs its own operator decision): installing or invoking the
62
+ this placement rule. The active-session reviewer may apply the placement rule without copying the
63
+ table. Dropped (each needs its own operator decision): installing or invoking the
62
64
  out-of-tree retro practice, a standalone retro command, `CODING_STANDARDS.md` as a file, runtime
63
65
  parsing of this markdown by validators, automatic remediation of environment findings, and
64
66
  folding the lens into wrap-up learnings or `.spur/context/` memory.
@@ -58,7 +58,7 @@ roles:
58
58
  stages: [implement, test, wrap]
59
59
  - id: reviewer
60
60
  tier: capable-1
61
- commands: [dev-verify, dev-verifyall, dev-review, dev-pr-review, dev-dogfood, rule-scan, dev-find-conflict, dev-find-issue]
61
+ commands: [dev-verify, dev-verifyall, dev-review, dev-review-session, dev-pr-review, dev-dogfood, rule-scan, dev-find-conflict, dev-find-issue]
62
62
  stages: [verify, review, dogfood]
63
63
  - id: planner
64
64
  tier: capable-2
@@ -81,9 +81,11 @@ must not sit below the highest `min_tier` among its folded stages.
81
81
  simplification, fix-everything sweeps, reverse engineering, wrap-up, and the end-to-end
82
82
  delivery flow (`dev-gtd`). Folds `implement`, `test`, `wrap`.
83
83
  - **`reviewer` (capable-1).** Verification and analysis: per-task verify/review, batch verify,
84
- dogfooding, anti-pattern scanning (`rule-scan`), and the two audit commands (`dev-find-conflict`,
85
- `dev-find-issue`) — those analyse rather than transcribe, which is why they sit here and not
86
- under `scribe`. `dev-find-issue` now routes through the `sp:history-anatomy` skill (mode contract + report contract). Folds `verify`, `review`, `dogfood`.
84
+ dogfooding, anti-pattern scanning (`rule-scan`), immediate session review, and the two audit
85
+ commands (`dev-find-conflict`, `dev-find-issue`) — those analyse rather than transcribe, which is
86
+ why they sit here and not under `scribe`. `dev-find-issue` routes through `sp:history-anatomy`;
87
+ `dev-review-session` routes through `sp:session-review` in the active host context. Folds
88
+ `verify`, `review`, `dogfood`.
87
89
  - **`planner` (capable-2).** The planning half: feature planning, requirement refinement (single
88
90
  and batch), brainstorm, idea intake, batch run/parallel orchestration, next-step routing,
89
91
  architecture survey, feature-frontier prioritization, and feature-tree restructure. Folds `plan`,
@@ -96,7 +98,8 @@ same stage logic: `dev-refineall` folds `refine` → planner; `dev-find-next` is
96
98
  frontier work → planner; `dev-feature-change` is planning-half corpus surgery on the feature tree →
97
99
  planner; `dev-gtd` is the execution/delivery flow → coder; `dev-find-conflict` and `dev-find-issue`
98
100
  are audits/analysis → reviewer (same reasoning as `rule-scan`). Later additions: `dev-pr-review` is review orchestration —
99
- driving the external PR review and triaging its findings folds the `review` stage → reviewer.
101
+ driving the external PR review and triaging its findings folds the `review` stage → reviewer;
102
+ `dev-review-session` performs evidence-backed review over the active conversation → reviewer.
100
103
 
101
104
  **Consistency is a test, not a convention.** `plugins/sp/tests/roles.test.ts` parses this YAML and
102
105
  asserts the tier-distinctness, command closure, stage-floor, and boundary invariants against the
@@ -404,8 +404,9 @@ function dayBounds(tz, ymd) {
404
404
  };
405
405
  }
406
406
  function resolvePaths(opts) {
407
- const pluginRoot = opts.helper.replace(/\/scripts\/[^/]+$/, "");
408
- const skill = `${pluginRoot}/skills/history-anatomy`;
407
+ const m = opts.helper.match(/\/scripts\/(?:([^/]+)\/)?[^/]+$/);
408
+ const pluginRoot = m ? opts.helper.slice(0, m.index) : opts.helper;
409
+ const skill = `${pluginRoot}/skills/${m?.[1] ? `${m[1]}-history-anatomy` : "history-anatomy"}`;
409
410
  const tz = opts.tz ?? Intl.DateTimeFormat().resolvedOptions().timeZone ?? "UTC";
410
411
  const date = opts.date !== undefined && opts.date !== "" ? opts.date : localDay(tz, opts.now ?? new Date);
411
412
  const target = opts.output !== undefined && opts.output !== "" ? opts.output : `${opts.reportDir}/${date}-history-anatomy.md`;
@@ -563,8 +563,13 @@ export function resolvePaths(opts: {
563
563
  since?: string;
564
564
  until?: string;
565
565
  }): string {
566
- const pluginRoot = opts.helper.replace(/\/scripts\/[^/]+$/, '');
567
- const skill = `${pluginRoot}/skills/history-anatomy`;
566
+ // Layouts: monorepo `<root>/scripts/<file>` → skill `<root>/skills/history-anatomy`;
567
+ // superskill-installed `<root>/scripts/<plugin>/<file>` → skill `<root>/skills/<plugin>-history-anatomy`.
568
+ // (0660 dogfood 2026-08-26: the single-segment strip left HA_SKILL bogus on installed layouts,
569
+ // silently degrading probe contract/skill digests to "not available".)
570
+ const m = opts.helper.match(/\/scripts\/(?:([^/]+)\/)?[^/]+$/);
571
+ const pluginRoot = m ? opts.helper.slice(0, m.index) : opts.helper;
572
+ const skill = `${pluginRoot}/skills/${m?.[1] ? `${m[1]}-history-anatomy` : 'history-anatomy'}`;
568
573
  const tz = opts.tz ?? Intl.DateTimeFormat().resolvedOptions().timeZone ?? 'UTC';
569
574
  const date = opts.date !== undefined && opts.date !== '' ? opts.date : localDay(tz, opts.now ?? new Date());
570
575
  const target =
@@ -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,22 @@ 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*.
622
+
623
+ Related operator-local trap (spur task 0689): adding a `permissions.allow` `write_file(**)` entry
624
+ to an executor's own settings (e.g. `~/.gemini/antigravity-cli/settings.json`) is an **operator-
625
+ local unblock, not the shipped fix**. It is per-machine and untracked, and it **masks shim
626
+ regressions in local end-to-end runs**: a broken headless dispatch looks green on the patched
627
+ machine while failing on every other machine and in CI. The fix belongs in the executor shim
628
+ (print-mode permission affordance); keep the allow entry, if at all, as a documented convenience
629
+ and never as the reason a run passes.
@@ -175,6 +175,14 @@ proposal-only: no applied change, no diff, and no command the report claims to h
175
175
  The final section lists, for every finding, the artifact anchor(s) and any cited `file:line`,
176
176
  so a reader can verify the report's claims against the evidence plane.
177
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
+
178
186
  ## Truthfulness invariants
179
187
 
180
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 |