@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.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/corpus-baseline.json +2995 -6832
- package/config/rules/boundary/sp-runtime-path.yaml +45 -35
- package/config/rules/surface/check-cli-surface.yaml +7 -5
- package/config/workflows/history-anatomy.yaml +39 -8
- package/package.json +9 -9
- package/plugins/sp/README.md +17 -10
- package/plugins/sp/agents/expert-spur.md +20 -4
- package/plugins/sp/commands/dev-find-issue.md +5 -2
- package/plugins/sp/commands/dev-gitmsg.md +12 -6
- package/plugins/sp/commands/dev-gtd.md +8 -19
- package/plugins/sp/commands/dev-idea.md +1 -1
- package/plugins/sp/commands/dev-plan.md +1 -1
- package/plugins/sp/commands/dev-review-session.md +36 -0
- package/plugins/sp/commands/dev-run.md +2 -2
- package/plugins/sp/commands/dev-runall.md +2 -2
- package/plugins/sp/commands/dev-wrap.md +5 -6
- package/plugins/sp/commands/dev-wrapall.md +5 -7
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/references/environment-lens.md +4 -2
- package/plugins/sp/references/roles.md +8 -5
- package/plugins/sp/scripts/history-anatomy-cache.mjs +3 -2
- package/plugins/sp/scripts/history-anatomy-cache.ts +7 -2
- package/plugins/sp/skills/dogfood-testing/SKILL.md +22 -1
- package/plugins/sp/skills/history-anatomy/references/report-contract.md +8 -0
- package/plugins/sp/skills/next-router/SKILL.md +4 -4
- package/plugins/sp/skills/pr-reviewing/SKILL.md +2 -3
- package/plugins/sp/skills/redesign-web-ui/SKILL.md +184 -0
- package/plugins/sp/skills/redesign-web-ui/references/audit-checklist.md +121 -0
- package/plugins/sp/skills/redesign-web-ui/references/upgrade-techniques.md +66 -0
- package/plugins/sp/skills/session-review/SKILL.md +106 -0
- package/plugins/sp/skills/spur-cli/references/agent.md +1 -1
- package/plugins/sp/skills/spur-cli/references/workflows/authoring-workflows.md +5 -0
- package/plugins/sp/skills/spur-cli/references/workflows/operations.md +20 -5
- package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +230 -0
- package/plugins/sp/skills/spur-cli/references/workflows.md +27 -5
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +22 -30
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +73 -28
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +1 -1
- package/plugins/sp/skills/spur-dev/references/flag-glossary.md +18 -8
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +15 -12
- package/spur.js +1152 -816
- package/web/_astro/{BoardApp.CKolAjUz.js → BoardApp.BEtcJqde.js} +62 -62
- package/web/_astro/BoardApp.DBEin4N5.js +1 -0
- package/web/_astro/{TaskDetail.Bre7G4gC.js → TaskDetail.ClAbCXom.js} +1 -1
- package/web/_astro/arc.CCvf51_y.js +1 -0
- package/web/_astro/architectureDiagram-3BPJPVTR.C0cb0J5M.js +36 -0
- package/web/_astro/{blockDiagram-GPEHLZMM.CCGHeRVi.js → blockDiagram-GPEHLZMM.CIyjqoCE.js} +4 -4
- package/web/_astro/{c4Diagram-AAUBKEIU.CpqewGmd.js → c4Diagram-AAUBKEIU.fs14IuFs.js} +1 -1
- package/web/_astro/channel.BGn_DUCD.js +1 -0
- package/web/_astro/chunk-2J33WTMH.CaBKv4ZO.js +1 -0
- package/web/_astro/{chunk-4BX2VUAB.ifGXoUA3.js → chunk-4BX2VUAB.BOllTPto.js} +1 -1
- package/web/_astro/chunk-55IACEB6.ChEof0O4.js +1 -0
- package/web/_astro/{chunk-727SXJPM.DzPE41OS.js → chunk-727SXJPM.Co2kdjD8.js} +2 -2
- package/web/_astro/{chunk-AQP2D5EJ.UF2QRXYF.js → chunk-AQP2D5EJ.SWmfcnog.js} +2 -2
- package/web/_astro/{chunk-FMBD7UC4.D2zXKa1R.js → chunk-FMBD7UC4.rDAFifF3.js} +1 -1
- package/web/_astro/chunk-ND2GUHAM.BCnoXKCw.js +1 -0
- package/web/_astro/{chunk-QZHKN3VN.nUKFBiLD.js → chunk-QZHKN3VN.RSmy2hDO.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.DZg9K9mO.js → classDiagram-4FO5ZUOK.Be7PEfrX.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.DZg9K9mO.js → classDiagram-v2-Q7XG4LA2.Be7PEfrX.js} +1 -1
- package/web/_astro/{client.CdFpTatq.js → client.yhYJvxCU.js} +1 -1
- package/web/_astro/cose-bilkent-S5V4N54A.BkUp2aSK.js +1 -0
- package/web/_astro/cynefin-OW5HDTMX.BegGGlUV.js +166 -0
- package/web/_astro/cytoscape.esm.DzSz-X2X.js +321 -0
- package/web/_astro/dagre-BM42HDAG.BkUdjsaC.js +4 -0
- package/web/_astro/{defaultLocale.CrowFXzY.js → defaultLocale.DX6XiGOO.js} +1 -1
- package/web/_astro/diagram-2AECGRRQ.E9vugt3-.js +43 -0
- package/web/_astro/diagram-5GNKFQAL.Dj4yeHXB.js +10 -0
- package/web/_astro/diagram-KO2AKTUF.Buaquwli.js +3 -0
- package/web/_astro/diagram-LMA3HP47.BV3dgGgm.js +24 -0
- package/web/_astro/diagram-OG6HWLK6.Cnx3s-tc.js +24 -0
- package/web/_astro/{erDiagram-TEJ5UH35.CF2U-pQZ.js → erDiagram-TEJ5UH35.DKK_abu4.js} +3 -3
- package/web/_astro/{flowDiagram-I6XJVG4X.BJK4M3in.js → flowDiagram-I6XJVG4X.BNuu9fbm.js} +4 -4
- package/web/_astro/ganttDiagram-6RSMTGT7.b16KUMjy.js +292 -0
- package/web/_astro/gitGraphDiagram-PVQCEYII.Kh41lbG5.js +106 -0
- package/web/_astro/{graph.D2o_JWn5.js → graph.-OzhPTMs.js} +1 -1
- package/web/_astro/{index.A0eX93qW.js → index.De90oHcH.js} +1 -1
- package/web/_astro/infoDiagram-5YYISTIA.DEWBXkp-.js +2 -0
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.BmWDZtwF.js → ishikawaDiagram-YF4QCWOH.DiAdmcL6.js} +4 -4
- package/web/_astro/{journeyDiagram-JHISSGLW.CpB1YWDP.js → journeyDiagram-JHISSGLW.D1Ki7IRm.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.k-fukQX9.js → kanban-definition-UN3LZRKU.CWUhrQpc.js} +21 -21
- package/web/_astro/layout.owoKPs3z.js +1 -0
- package/web/_astro/linear.BaFsgcCe.js +1 -0
- package/web/_astro/{mermaid.core.DnpzzuPU.js → mermaid.core.CHw_AsGy.js} +5 -5
- package/web/_astro/{mindmap-definition-RKZ34NQL.D9NnlLBu.js → mindmap-definition-RKZ34NQL.UIhghgmN.js} +8 -8
- package/web/_astro/ordinal.DBvzRdQf.js +1 -0
- package/web/_astro/pieDiagram-4H26LBE5.D05l3JUA.js +30 -0
- package/web/_astro/{quadrantDiagram-W4KKPZXB.BkAygRlm.js → quadrantDiagram-W4KKPZXB.BcWIhIcE.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.CX8ibmwc.js → requirementDiagram-4Y6WPE33.B1rYvKGn.js} +1 -1
- package/web/_astro/sankeyDiagram-5OEKKPKP.CKylVRC4.js +40 -0
- package/web/_astro/{sequenceDiagram-3UESZ5HK.veO8c2tk.js → sequenceDiagram-3UESZ5HK.Dm3uA_s4.js} +3 -3
- package/web/_astro/stateDiagram-AJRCARHV.Bgca_BLe.js +1 -0
- package/web/_astro/stateDiagram-v2-BHNVJYJU.C1T7YFrG.js +1 -0
- package/web/_astro/{timeline-definition-PNZ67QCA.DayoPp_2.js → timeline-definition-PNZ67QCA.ZOHJn3Sn.js} +4 -4
- package/web/_astro/vennDiagram-CIIHVFJN.DegZitjD.js +34 -0
- package/web/_astro/{wardleyDiagram-YWT4CUSO.lIAjSkZJ.js → wardleyDiagram-YWT4CUSO.BDsC115d.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.D8_2K6U1.js → xychartDiagram-2RQKCTM6.D0MO70ea.js} +4 -4
- package/web/index.html +1 -1
- package/web/_astro/BoardApp.DXD--ybM.js +0 -1
- package/web/_astro/arc.7luwOGiC.js +0 -1
- package/web/_astro/architectureDiagram-3BPJPVTR.F6KaHXp-.js +0 -36
- package/web/_astro/channel.DxfOFf1l.js +0 -1
- package/web/_astro/chunk-2J33WTMH.CB9vKa5F.js +0 -1
- package/web/_astro/chunk-55IACEB6.VIaRo7l8.js +0 -1
- package/web/_astro/chunk-ND2GUHAM.Cb9bDyvx.js +0 -1
- package/web/_astro/cose-bilkent-S5V4N54A.D9STo90d.js +0 -1
- package/web/_astro/cytoscape.esm.D3_iZ_3b.js +0 -321
- package/web/_astro/dagre-BM42HDAG.D3IbwhHz.js +0 -4
- package/web/_astro/diagram-2AECGRRQ.BWTDxBe9.js +0 -43
- package/web/_astro/diagram-5GNKFQAL.XnXlonHG.js +0 -10
- package/web/_astro/diagram-KO2AKTUF.CywOngCO.js +0 -3
- package/web/_astro/diagram-LMA3HP47.DY1D21Iu.js +0 -24
- package/web/_astro/diagram-OG6HWLK6.DQxb59KA.js +0 -24
- package/web/_astro/ganttDiagram-6RSMTGT7.BSniMzdB.js +0 -292
- package/web/_astro/gitGraphDiagram-PVQCEYII.Dxg-yRov.js +0 -106
- package/web/_astro/infoDiagram-5YYISTIA.BY4CgO_n.js +0 -2
- package/web/_astro/layout.DNLMvjEt.js +0 -1
- package/web/_astro/linear.BNNCobvI.js +0 -1
- package/web/_astro/ordinal.BYWQX77i.js +0 -1
- package/web/_astro/pieDiagram-4H26LBE5.CKhoMiyC.js +0 -30
- package/web/_astro/sankeyDiagram-5OEKKPKP.Dvurpa0Y.js +0 -40
- package/web/_astro/stateDiagram-AJRCARHV.DpMr4CO3.js +0 -1
- package/web/_astro/stateDiagram-v2-BHNVJYJU.CKjso86_.js +0 -1
- package/web/_astro/vennDiagram-CIIHVFJN.XNHf04O9.js +0 -34
- 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
|
|
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);
|
|
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`
|
|
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
|
|
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`
|
|
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=… #
|
|
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 (
|
|
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`
|
|
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
|
|
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`
|
|
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=… #
|
|
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 (
|
|
52
|
-
before dispatch).
|
|
53
|
-
|
|
51
|
+
the resolved name (omit ≡ explicit `inline`; both tier-substitute with a warning).
|
package/plugins/sp/plugin.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sp",
|
|
3
|
-
"version": "0.3.
|
|
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.
|
|
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
|
|
85
|
-
`dev-find-issue`) — those analyse rather than transcribe, which is
|
|
86
|
-
under `scribe`. `dev-find-issue`
|
|
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
|
|
408
|
-
const
|
|
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
|
-
|
|
567
|
-
|
|
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 (
|
|
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
|
|
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
|
|
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 |
|