@gobing-ai/spur 0.3.62 → 0.3.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +1 -1
- package/config/corpus-baseline.json +3428 -3796
- package/config/workflows/history-anatomy.yaml +40 -11
- package/package.json +9 -9
- package/plugins/sp/README.md +8 -5
- package/plugins/sp/agents/expert-spur.md +20 -4
- package/plugins/sp/commands/dev-find-issue.md +4 -4
- 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 +3 -3
- package/plugins/sp/commands/dev-plan.md +1 -1
- 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 +66 -0
- package/plugins/sp/scripts/history-anatomy-cache.mjs +165 -15
- package/plugins/sp/scripts/history-anatomy-cache.ts +216 -15
- package/plugins/sp/skills/dogfood-testing/SKILL.md +14 -1
- package/plugins/sp/skills/dogfood-testing/references/report-template.md +30 -0
- package/plugins/sp/skills/history-anatomy/SKILL.md +3 -3
- package/plugins/sp/skills/history-anatomy/references/operations.md +21 -8
- package/plugins/sp/skills/history-anatomy/references/report-contract.md +63 -5
- 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/spur-cli/references/agent.md +16 -7
- package/plugins/sp/skills/spur-cli/references/message.md +4 -2
- 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 +26 -4
- package/plugins/sp/skills/spur-dev/references/cross-cutting.md +28 -34
- package/plugins/sp/skills/spur-dev/references/dev-operations.md +62 -20
- 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 +7 -6
- package/spur.js +1012 -372
- package/web/_astro/{BoardApp.rkWGVwwK.js → BoardApp.CKolAjUz.js} +56 -56
- package/web/_astro/BoardApp.DXD--ybM.js +1 -0
- package/web/_astro/{TaskDetail.B7ODt_bA.js → TaskDetail.Bre7G4gC.js} +1 -1
- package/web/_astro/{arc.C5QRz6AQ.js → arc.7luwOGiC.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.CHptn8gZ.js → architectureDiagram-3BPJPVTR.F6KaHXp-.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.b1nEDkDw.js → blockDiagram-GPEHLZMM.CCGHeRVi.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.BWj8S_Qq.js → c4Diagram-AAUBKEIU.CpqewGmd.js} +1 -1
- package/web/_astro/channel.DxfOFf1l.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.q0BBuE1n.js → chunk-2J33WTMH.CB9vKa5F.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.DP2KDkAU.js → chunk-4BX2VUAB.ifGXoUA3.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.CkCId72p.js → chunk-55IACEB6.VIaRo7l8.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.oHWzxMot.js → chunk-727SXJPM.DzPE41OS.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.DkkgxfMP.js → chunk-AQP2D5EJ.UF2QRXYF.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.lmFJDvRK.js → chunk-FMBD7UC4.D2zXKa1R.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.52jt0eHK.js → chunk-ND2GUHAM.Cb9bDyvx.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.Cg8KEFoD.js → chunk-QZHKN3VN.nUKFBiLD.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.BuOUhxcD.js → classDiagram-4FO5ZUOK.DZg9K9mO.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.BuOUhxcD.js → classDiagram-v2-Q7XG4LA2.DZg9K9mO.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.BRUU8E_0.js → cose-bilkent-S5V4N54A.D9STo90d.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.GDbfFYVV.js → dagre-BM42HDAG.D3IbwhHz.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.CvIDBeJF.js → diagram-2AECGRRQ.BWTDxBe9.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.DMgJjWOX.js → diagram-5GNKFQAL.XnXlonHG.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.njjl-0AP.js → diagram-KO2AKTUF.CywOngCO.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.CcCqgP8M.js → diagram-LMA3HP47.DY1D21Iu.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.Btqd-YVE.js → diagram-OG6HWLK6.DQxb59KA.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.BbhML_Xo.js → erDiagram-TEJ5UH35.CF2U-pQZ.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.CkvsIgY8.js → flowDiagram-I6XJVG4X.BJK4M3in.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.m8IWD_wW.js → ganttDiagram-6RSMTGT7.BSniMzdB.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.5z87HXO-.js → gitGraphDiagram-PVQCEYII.Dxg-yRov.js} +1 -1
- package/web/_astro/index.BVXdIsZV.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.Bvyvsd7Q.js → infoDiagram-5YYISTIA.BY4CgO_n.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.DdWVYO87.js → ishikawaDiagram-YF4QCWOH.BmWDZtwF.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.C3kOlYH1.js → journeyDiagram-JHISSGLW.CpB1YWDP.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.CfKTUHVC.js → kanban-definition-UN3LZRKU.k-fukQX9.js} +1 -1
- package/web/_astro/{linear.CMDHnzgX.js → linear.BNNCobvI.js} +1 -1
- package/web/_astro/{mermaid.core.DN7-WrsP.js → mermaid.core.DnpzzuPU.js} +4 -4
- package/web/_astro/{mindmap-definition-RKZ34NQL.DcQxLvqG.js → mindmap-definition-RKZ34NQL.D9NnlLBu.js} +1 -1
- package/web/_astro/{pieDiagram-4H26LBE5.Nu-Inbw6.js → pieDiagram-4H26LBE5.CKhoMiyC.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.Dck2EChs.js → quadrantDiagram-W4KKPZXB.BkAygRlm.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.C--E5XuW.js → requirementDiagram-4Y6WPE33.CX8ibmwc.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.B_0iRNna.js → sankeyDiagram-5OEKKPKP.Dvurpa0Y.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.PKuKr9mk.js → sequenceDiagram-3UESZ5HK.veO8c2tk.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.ClhGHb-O.js → stateDiagram-AJRCARHV.DpMr4CO3.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.Bv6BBnvg.js → stateDiagram-v2-BHNVJYJU.CKjso86_.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.BZm2ZvAH.js → timeline-definition-PNZ67QCA.DayoPp_2.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.Dt6yZXry.js → vennDiagram-CIIHVFJN.XNHf04O9.js} +1 -1
- package/web/_astro/{wardley-L42UT6IY.rUs-E00M.js → wardley-L42UT6IY.CpM_031g.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.BcWgv4cA.js → wardleyDiagram-YWT4CUSO.lIAjSkZJ.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.DH-M-cX9.js → xychartDiagram-2RQKCTM6.D8_2K6U1.js} +1 -1
- package/web/index.html +2 -2
- package/web/_astro/BoardApp.Z9jMwI9G.js +0 -1
- package/web/_astro/channel.BJtn6CGV.js +0 -1
- package/web/_astro/index.nWve6EHS.css +0 -1
|
@@ -48,7 +48,7 @@ testee (a /sp:... command, Skill(...), or shell CLI invocation)
|
|
|
48
48
|
The command forwards these via `$ARGUMENTS`:
|
|
49
49
|
|
|
50
50
|
| Argument | Description | Default |
|
|
51
|
-
|
|
51
|
+
| ---------- | ------------- | --------- |
|
|
52
52
|
| `testee` | What to exercise — a slash command, agent skill, or CLI invocation (positional, required). Quote it if it contains flags. | (required) |
|
|
53
53
|
| `--agent <name\|auto>` | **Testee-scoped** agent: the agent the **testee** runs under, forwarded into the testee invocation. The driver (this skill) always runs in the current session. **Omit it** to forward nothing — the testee runs under its own default. See [§Testee-scoped agent](#testee-scoped-agent). | (omitted → forward nothing) |
|
|
54
54
|
| `--max-retry <n>` | Fix attempts per failed step. The **default is `2`** (fix mode): apply `Edit`/`Write` fixes to the working tree, up to 2 attempts per step. This flag is **mandatory** for two independent mutation sources: (a) pipeline-driving testees and (b) testees carrying a mutating `--fix` mode (`--fix all` / `--fix blockers-first`). Pass `--max-retry 0` for **observe-only**, or `--max-retry N` to acknowledge fix-mode mutation risk. For a mutating-`--fix` testee, `--max-retry 0` bounds the **driver only** — the testee still mutates the tree. | `2` unless the testee is pipeline-driving or carries a mutating `--fix` mode |
|
|
@@ -239,6 +239,7 @@ Full section contract, frontmatter, Cost shape, and footer:
|
|
|
239
239
|
**[report-template.md](references/report-template.md)**.
|
|
240
240
|
|
|
241
241
|
**Sinks** (composable):
|
|
242
|
+
|
|
242
243
|
- **Always-on report files** → live + `docs/dogfood/YYYY-MM-DD-<testee-slug>-dogfood.md` (see Phase 1).
|
|
243
244
|
- `--save` → no-op for delivery; still print/document the report path (back-compat).
|
|
244
245
|
- `--task` → file findings as a review task (`spur task create --template review`), writing the
|
|
@@ -276,6 +277,7 @@ which always launches a fresh agent subprocess.
|
|
|
276
277
|
- Producing a structured findings report (and optionally a fix task) from a real run.
|
|
277
278
|
|
|
278
279
|
Do **not** use this skill for:
|
|
280
|
+
|
|
279
281
|
- Requirements-traceability verdicts — use `sp:code-verification` (`/sp:dev-verify`).
|
|
280
282
|
- SECU code review of a diff — use `sp:code-verification` (`/sp:dev-review`).
|
|
281
283
|
- Running a task through the fix pipeline — use `sp:spur-dev` (`/sp:dev-run`).
|
|
@@ -606,3 +608,14 @@ Findings (P1+P2):
|
|
|
606
608
|
A report missing any of the six headings, the on-disk live ledger, dual paths, terminal `status`,
|
|
607
609
|
the Cost block, or this footer does not satisfy the dogfood contract on this platform, regardless
|
|
608
610
|
of `Skill()` availability.
|
|
611
|
+
|
|
612
|
+
## Engine-driven testees under a sandboxed session
|
|
613
|
+
|
|
614
|
+
A subprocess executor dies at startup, not at model time, when `.claude/settings.json` denies
|
|
615
|
+
it its state directory (`~/.pi`, `~/.grok`, `~/.gemini`, `~/.codex`, `~/.cache`) or local
|
|
616
|
+
socket binding. Signals: `EPERM: operation not permitted`, `FS_PERMISSION_DENIED`,
|
|
617
|
+
`bind: operation not permitted`. Two affordances must be granted and the session restarted:
|
|
618
|
+
`sandbox.filesystem.allowWrite` covering the executor home dirs, and
|
|
619
|
+
`sandbox.network.allowLocalBinding`. Caveat: `spur agent doctor` reports `usable: true` from
|
|
620
|
+
configuration alone — it never probes a real dispatch, so `usable` means *configured*, not
|
|
621
|
+
*proven runnable under this sandbox*.
|
|
@@ -237,6 +237,36 @@ downstream task creation does not inherit an unactionable acceptance criterion:
|
|
|
237
237
|
|
|
238
238
|
The tag is a prompt to whoever turns findings into tasks: `[stale]` → drop, `[unverifiable]` →
|
|
239
239
|
reframe or defer, `[feasible]` → proceed. A finding without a tag is treated as `[feasible]`.
|
|
240
|
+
|
|
241
|
+
**Optional class tag (environment lens, task 0686).** A finding line may carry one closed class
|
|
242
|
+
tag — `environment` | `testee` | `waste` — positioned immediately after the em dash and distinct
|
|
243
|
+
from the trailing feasibility tag:
|
|
244
|
+
|
|
245
|
+
```
|
|
246
|
+
- **P2** — [environment] <what's wrong>. → **Action:** <concrete change>. (`file:line`, ~effort) `[feasible]`
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
Omitting the class preserves the current line shape; untagged findings remain valid and the
|
|
250
|
+
protocol stays `sp:dogfood-testing@1.2` (the validator gains no required field; the cache-health
|
|
251
|
+
P3 above needs no class).
|
|
252
|
+
|
|
253
|
+
- `testee` — a defect in the testee's contract (the protocol the run grades). Bounded fix-mode
|
|
254
|
+
may repair it, unchanged.
|
|
255
|
+
- `environment` — a steering/placement/check-shaped observation projected from the
|
|
256
|
+
[environment-improvement lens](../../../references/environment-lens.md), which owns the
|
|
257
|
+
category table and the placement rule. **Proposal-only:** even under `--max-retry N`, bounded
|
|
258
|
+
retries never `Edit` or `Write` `AGENTS.md`, `CLAUDE.md`, skills, rules, numbered docs, or
|
|
259
|
+
plugin references for an environment-tagged finding — it stays a recommended action here.
|
|
260
|
+
- `waste` — a token/tool-waste diagnostic with no missing environment affordance behind it.
|
|
261
|
+
|
|
262
|
+
Class, not the cited file path, decides whether bounded fix may mutate. A session mistake a
|
|
263
|
+
linter, typechecker, test, or filesystem gate could have caught is `environment`, and its
|
|
264
|
+
recommended action proposes a new-or-tighter automated check — never another sentence in an
|
|
265
|
+
always-loaded steering file. Missed coding standards are `environment` owned by a review path
|
|
266
|
+
(`sp:code-verification`, `sp:code-review`, or pipeline review) — never the implementer skill;
|
|
267
|
+
navigation friction and dead always-loaded instructions are likewise `environment`, not
|
|
268
|
+
`testee`.
|
|
269
|
+
|
|
240
270
|
Severity scale:
|
|
241
271
|
|
|
242
272
|
- **P1** — blocks correct use or causes drift/wrong output; fix before shipping the testee.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: history-anatomy
|
|
3
|
-
description: "Independent owner of diagnostic interpretation over already-imported history — the daily/ad-hoc mode contract, a closed finding taxonomy, the
|
|
3
|
+
description: "Independent owner of diagnostic interpretation over already-imported history — the daily/ad-hoc mode contract, a closed finding taxonomy, the twelve-section report contract, and the enrich/validate rubrics. Triggers: history-anatomy, run the daily report, ad-hoc diagnosis, find issues over history."
|
|
4
4
|
license: Apache-2.0
|
|
5
5
|
version: 1.0.0
|
|
6
6
|
metadata:
|
|
@@ -37,7 +37,7 @@ fresh skill cannot be added to the BASELINE exemption map).
|
|
|
37
37
|
**Choose the mode first.** The single entry is `--mode daily|ad-hoc` (default `daily`):
|
|
38
38
|
`references/modes.md`.
|
|
39
39
|
|
|
40
|
-
**Then hold the report to the contract.** Every report must contain the
|
|
40
|
+
**Then hold the report to the contract.** Every report must contain the twelve sections and every
|
|
41
41
|
finding the full field set, with evidence rules and an explicit comparability verdict:
|
|
42
42
|
`references/report-contract.md`.
|
|
43
43
|
|
|
@@ -63,5 +63,5 @@ finding the full field set, with evidence rules and an explicit comparability ve
|
|
|
63
63
|
| Reference | Owns |
|
|
64
64
|
| --- | --- |
|
|
65
65
|
| [`references/modes.md`](references/modes.md) | The daily/ad-hoc mode matrix, bounds normalization, the DST-aware calendar-day rule, and the fail-loud message shape. |
|
|
66
|
-
| [`references/report-contract.md`](references/report-contract.md) | The
|
|
66
|
+
| [`references/report-contract.md`](references/report-contract.md) | The twelve sections (in order), the per-finding field set, the closed category vocabulary, the stable-key grammar, the evidence rules, comparison semantics, recurrence classes, and the positive-pattern / remediation standards. |
|
|
67
67
|
| [`references/operations.md`](references/operations.md) | The `enrich` and `validate` operation rubrics; neither launches a workflow. |
|
|
@@ -15,7 +15,7 @@ duplicated into the YAML: the rubric cannot recurse.
|
|
|
15
15
|
|
|
16
16
|
| Operation | Input | Output |
|
|
17
17
|
| --- | --- | --- |
|
|
18
|
-
| `enrich` | current forensics artifact + baseline artifact (plain `HistoryArtifact` JSON) | the model-authored report sections (Baseline comparison, Findings, Recurrence ledger, Remediation options, Performance analysis, Workflow and process improvements, Positive patterns) meeting the report contract |
|
|
18
|
+
| `enrich` | current forensics artifact + baseline artifact (plain `HistoryArtifact` JSON) | the model-authored report sections (Baseline comparison, Findings, Recurrence ledger, Remediation options, Performance analysis, Workflow and process improvements, Report-only advisories, Positive patterns) meeting the report contract |
|
|
19
19
|
| `validate` | a candidate report + the current/baseline artifacts | a PASS / FAIL verdict with per-finding and per-section evidence checks, naming any failing rule |
|
|
20
20
|
|
|
21
21
|
Freeze these operation names and this input/output contract — 0660 consumes them verbatim.
|
|
@@ -31,13 +31,23 @@ Given the current and baseline artifacts, author the model half of the report. A
|
|
|
31
31
|
calendar day; ad-hoc → immediately preceding equal-duration window. If baseline coverage is
|
|
32
32
|
insufficient or materially different, emit `not comparable` and **no** trend/delta/percentage.
|
|
33
33
|
3. **Findings** — each with the full per-finding field set (key, category, impact, trend,
|
|
34
|
-
observation, inference, confidence, contradictions, evidenceAnchor
|
|
35
|
-
vocabulary; stable keys of the form
|
|
34
|
+
observation, inference, confidence, contradictions, evidenceAnchor, severity, reproCommand,
|
|
35
|
+
ownerSurface). Categories from the closed vocabulary; stable keys of the form
|
|
36
|
+
`<category>:<owner-surface>:<signal>`. Severity is the closed P1/P2/P3 vocabulary and is
|
|
37
|
+
orthogonal to confidence; reproCommand reproduces the observation verbatim; ownerSurface names
|
|
38
|
+
the concrete owning surface (file/package/command), consistent with the key's middle segment.
|
|
36
39
|
4. **Recurrence ledger** — classify every finding against the baseline on the **stable key**.
|
|
37
40
|
5. **Telemetry gaps** — every dimension the artifact cannot support, rendered `not available`.
|
|
38
41
|
6. **Remediation options** — proposals only (owner surface, expected impact, verification method,
|
|
39
|
-
reversibility)
|
|
40
|
-
|
|
42
|
+
reversibility), plus the printed `spur task create` handoff invocation carrying the finding's
|
|
43
|
+
stable key for accepted proposals. No applied change/diff/auto-write to the corpus.
|
|
44
|
+
7. **Report-only advisories** — repeated identical tool-and-argument signatures surfaced with
|
|
45
|
+
repetition counts; proposes no automatic interruption (report-only, 0680 R5).
|
|
46
|
+
8. **Positive patterns** — same evidence standard as problems.
|
|
47
|
+
|
|
48
|
+
Run-cost note (0680 R6): Performance analysis reports what this run's chained `agent.run`
|
|
49
|
+
stages cost using the pairing analytics fold (totalCostUsd / meanDurationMs per pairing); a
|
|
50
|
+
pairing without cost signal renders `not available`, never zero.
|
|
41
51
|
|
|
42
52
|
Never fabricate a value, a trend, an anchor, or an applied fix. Never launch a workflow.
|
|
43
53
|
|
|
@@ -45,11 +55,14 @@ Never fabricate a value, a trend, an anchor, or an applied fix. Never launch a w
|
|
|
45
55
|
|
|
46
56
|
Given a candidate report and the artifacts, independently verify:
|
|
47
57
|
|
|
48
|
-
- **
|
|
58
|
+
- **Twelve-section completeness and order** — all twelve section names present in the frozen
|
|
49
59
|
order; none renamed/omitted.
|
|
50
60
|
- **Per-finding fields** — every finding (problem and positive) carries key, category, impact,
|
|
51
|
-
trend, observation, inference, confidence, contradictions, evidenceAnchor
|
|
52
|
-
vocabulary; stable-key grammar.
|
|
61
|
+
trend, observation, inference, confidence, contradictions, evidenceAnchor, severity (P1/P2/P3),
|
|
62
|
+
reproCommand, ownerSurface; category in the closed vocabulary; stable-key grammar. A finding
|
|
63
|
+
missing any triage field FAILs (the deterministic gate enforces the same set).
|
|
64
|
+
- **Remediation handoff** — each accepted-proposal handoff carries a `spur task create`
|
|
65
|
+
invocation naming the finding's stable key; no auto-written tasks.
|
|
53
66
|
- **Evidence anchors** — every finding has at least one verifiable anchor; no anchor → FAIL.
|
|
54
67
|
- **Causality gate** — a causal claim with one signal must be labelled a hypothesis with a
|
|
55
68
|
confirmation path; otherwise FAIL.
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# Report contract — `sp:history-anatomy` (HA-S1, 0658)
|
|
2
2
|
|
|
3
|
-
The published report is the skill's contract. This reference owns the
|
|
3
|
+
The published report is the skill's contract. This reference owns the twelve sections (in order),
|
|
4
4
|
the per-finding field set, the closed category vocabulary, the stable-key grammar, the evidence
|
|
5
5
|
rules, comparison semantics, recurrence classes, and the positive-pattern / remediation standards.
|
|
6
6
|
|
|
7
|
-
##
|
|
7
|
+
## Twelve required sections (in order, frozen)
|
|
8
8
|
|
|
9
9
|
1. Scope and provenance
|
|
10
10
|
2. Executive summary
|
|
@@ -15,8 +15,9 @@ rules, comparison semantics, recurrence classes, and the positive-pattern / reme
|
|
|
15
15
|
7. Remediation options
|
|
16
16
|
8. Performance analysis
|
|
17
17
|
9. Workflow and process improvements
|
|
18
|
-
10.
|
|
19
|
-
11.
|
|
18
|
+
10. Report-only advisories (0680 R5)
|
|
19
|
+
11. Positive patterns
|
|
20
|
+
12. Evidence ledger
|
|
20
21
|
|
|
21
22
|
These names are consumed verbatim by 0659's structure gate and 0660's validation stage. Do not
|
|
22
23
|
rename, reorder, omit, or restate them.
|
|
@@ -26,7 +27,13 @@ rename, reorder, omit, or restate them.
|
|
|
26
27
|
- Categories: `reliability` | `repetition` | `workflow` | `performance` | `coverage` |
|
|
27
28
|
`telemetry` | `positive`.
|
|
28
29
|
|
|
29
|
-
Every finding's category is drawn from this closed set. No category is invented
|
|
30
|
+
Every finding's category is drawn from this closed set. No category is invented — explicit
|
|
31
|
+
`category` values outside it fail the structure gate (`finding-invalid-category:<value>`), and so
|
|
32
|
+
do stable keys whose first segment falls outside it (`finding-invalid-key-category:<value>`,
|
|
33
|
+
task 0686). Environment-lens retro category names are encoded only in `<signal>` or the
|
|
34
|
+
owner-surface segment — never as a category. The authoritative seven-name projection table lives
|
|
35
|
+
in the [environment-improvement mapping](../../../references/environment-lens.md), which this
|
|
36
|
+
reference defers to rather than restates.
|
|
30
37
|
|
|
31
38
|
## Stable finding key (frozen)
|
|
32
39
|
|
|
@@ -58,6 +65,9 @@ Every finding — problem and positive alike — carries the full field set:
|
|
|
58
65
|
| `confidence` | Per-finding: `high` / `medium` / `low`. Never one blanket report-level score. |
|
|
59
66
|
| `contradictions` | Any contradicting signal shown beside the finding, not silently reconciled. |
|
|
60
67
|
| `evidenceAnchor` | At least one anchor to the forensics artifact or cited `file:line`. An entry with no anchor is invalid. |
|
|
68
|
+
| `severity` | Closed vocabulary `P1` / `P2` / `P3` — how much the finding matters. Orthogonal to `confidence`: severity orders work, confidence says how sure we are (0680 R1). The structure gate fails a finding without one. |
|
|
69
|
+
| `reproCommand` | The invocation that reproduces the observation — one command a reader can run verbatim (0680 R2). Gate-enforced. |
|
|
70
|
+
| `ownerSurface` | The concrete surface that owns the fix (a file path, package, or command), consistent with the key's `<owner-surface>` segment but named as a target rather than a slug (0680 R3). Gate-enforced. |
|
|
61
71
|
|
|
62
72
|
## Evidence rules
|
|
63
73
|
|
|
@@ -120,11 +130,59 @@ Each option is a **proposal** that names:
|
|
|
120
130
|
The report must contain **no applied change, no diff, and no command it claims to have run**. The
|
|
121
131
|
skill never applies a fix; it proposes one.
|
|
122
132
|
|
|
133
|
+
### Remediation handoff route (0680 R4)
|
|
134
|
+
|
|
135
|
+
For each proposal an operator accepts, the report supplies — printed in the report itself, never
|
|
136
|
+
executed — the `spur task create` invocation that lands it, carrying the proposal's finding
|
|
137
|
+
`key` in the task body so the next report classifies that finding as `resolved`. Auto-writing
|
|
138
|
+
to the task corpus from a model-authored report would bypass the CLI-gated write contract; the
|
|
139
|
+
operator remains the gate.
|
|
140
|
+
|
|
141
|
+
### Report-only advisories (0680 R5)
|
|
142
|
+
|
|
143
|
+
Section 10 is the standing home for observations that inform workflow hygiene but must never
|
|
144
|
+
trigger automatic interruption: repeated identical tool-and-argument signatures are surfaced
|
|
145
|
+
here with their repetition counts, proposing at most human-decided process changes. Nothing in
|
|
146
|
+
this section may drive automated behavior.
|
|
147
|
+
|
|
148
|
+
### Run-cost reporting (0680 R6)
|
|
149
|
+
|
|
150
|
+
Performance analysis states what the run itself cost: per-pairing `totalCostUsd` /
|
|
151
|
+
`meanDurationMs` figures flow from the pairing analytics fold (0679 repaired the payload
|
|
152
|
+
paths), so chained `agent.run` stages are reportable instead of "~unknown". Where no cost
|
|
153
|
+
signal exists for a pairing it renders `not available`, never zero.
|
|
154
|
+
|
|
155
|
+
## Projected candidates — section 9 (environment lens, task 0686)
|
|
156
|
+
|
|
157
|
+
Section 9 (Workflow and process improvements) stays additive report grammar: unprojected numbered
|
|
158
|
+
prose remains valid and gains no required fields. A candidate **projected** through the
|
|
159
|
+
[environment-improvement lens](../../../references/environment-lens.md) is a bullet beginning with
|
|
160
|
+
a backticked stable key (retro name in `<signal>` or owner surface, closed category first — e.g.
|
|
161
|
+
`workflow:agents-md:navigation`) and carries four bold fields, the same names remediation options
|
|
162
|
+
use:
|
|
163
|
+
|
|
164
|
+
```text
|
|
165
|
+
- `workflow:agents-md:navigation` — **owner surface:** `AGENTS.md` see_also. **expected impact:**
|
|
166
|
+
shorter file hunt. **verification method:** subsequent daily report key `resolved` or absent.
|
|
167
|
+
**reversibility:** revert the pointer.
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
A projected candidate cites its section-4 finding `key` when one exists. Reports remain
|
|
171
|
+
proposal-only: no applied change, no diff, and no command the report claims to have run.
|
|
172
|
+
|
|
123
173
|
## Evidence ledger
|
|
124
174
|
|
|
125
175
|
The final section lists, for every finding, the artifact anchor(s) and any cited `file:line`,
|
|
126
176
|
so a reader can verify the report's claims against the evidence plane.
|
|
127
177
|
|
|
178
|
+
Every row MUST name the artifact path in backticks — the deterministic structure gate's
|
|
179
|
+
`evidence-claim-without-anchor` check matches `` `[^`]+\.(md|ts|json)` `` or a
|
|
180
|
+
`path:line` — never a bare `current`/`baseline` label. Write each anchor as:
|
|
181
|
+
|
|
182
|
+
```text
|
|
183
|
+
`telemetry:history-analyze:duration-coverage-gap` | `.spur/run/<runId>-history-anatomy-current.json` — `#/warnings/0`, `#/derived/timeDecomposition`, `#/stepSupport`
|
|
184
|
+
```
|
|
185
|
+
|
|
128
186
|
## Truthfulness invariants
|
|
129
187
|
|
|
130
188
|
- `not available` is the true rendering for an unsupported dimension, never a masked gap.
|
|
@@ -42,12 +42,12 @@ silently (that is a HITL stop).
|
|
|
42
42
|
## Inputs
|
|
43
43
|
|
|
44
44
|
| Input | Semantics |
|
|
45
|
-
|
|
45
|
+
| ------- | ----------- |
|
|
46
46
|
| `target` | Task WBS (digits), task `.md` path, or feature id (`^[A-Z][1-9]*$`). Required for dispatch; omit → stop **U1** (usage). |
|
|
47
47
|
| `--dry-run` | Print the resolved plan (**P1**) and do not dispatch. |
|
|
48
48
|
| `--once` | Strip `--next` from the shaped child argv so only the current step runs; no router re-entry. |
|
|
49
49
|
| `--auto` | Forward into dispatched children that support it. **Never** breaks multi-candidate HITL ties. |
|
|
50
|
-
| `--agent <inline\|auto\|name>` | Execution-surface selector forwarded into the dispatched child when that child documents `--agent`. Router defaults to omit semantics: Omit forwards nothing, and the dispatched child applies its own default (
|
|
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 |
|