@event4u/agent-config 9.11.0 → 9.13.0
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/CHANGELOG.md +80 -204
- package/README.md +8 -1
- package/dist/agent-src/commands/fix/ci.md +29 -0
- package/dist/agent-src/commands/pr/create.md +60 -0
- package/dist/agent-src/contexts/authority/kernel-rule-edits.md +18 -2
- package/dist/agent-src/rules/active-remediation.md +0 -2
- package/dist/agent-src/rules/architecture.md +0 -1
- package/dist/agent-src/rules/artifact-drafting-protocol.md +0 -4
- package/dist/agent-src/rules/autonomous-execution.md +1 -2
- package/dist/agent-src/rules/broken-access-control.md +0 -2
- package/dist/agent-src/rules/code-comment-discipline.md +0 -3
- package/dist/agent-src/rules/code-provenance.md +0 -3
- package/dist/agent-src/rules/communication-through-line.md +2 -3
- package/dist/agent-src/rules/content-quoting-floor.md +0 -2
- package/dist/agent-src/rules/context-hygiene.md +1 -3
- package/dist/agent-src/rules/decision-revisit-gate.md +0 -2
- package/dist/agent-src/rules/design-fidelity.md +30 -1
- package/dist/agent-src/rules/domain-adoption-policy.md +0 -3
- package/dist/agent-src/rules/downstream-changes.md +10 -1
- package/dist/agent-src/rules/external-reference-deep-dive.md +0 -7
- package/dist/agent-src/rules/fast-path-marker-visibility.md +0 -1
- package/dist/agent-src/rules/git-history-discipline.md +0 -7
- package/dist/agent-src/rules/guidelines.md +0 -2
- package/dist/agent-src/rules/improve-before-implement.md +4 -2
- package/dist/agent-src/rules/invite-challenge.md +0 -4
- package/dist/agent-src/rules/linked-projects-onboarding-gate.md +0 -2
- package/dist/agent-src/rules/markdown-safe-codeblocks.md +0 -1
- package/dist/agent-src/rules/minimal-safe-diff.md +2 -2
- package/dist/agent-src/rules/missing-tool-handling.md +0 -1
- package/dist/agent-src/rules/no-attribution-footers.md +0 -3
- package/dist/agent-src/rules/no-decorative-emojis-in-git-surfaces.md +8 -5
- package/dist/agent-src/rules/no-pr-progress-comments.md +1 -3
- package/dist/agent-src/rules/no-roadmap-references.md +0 -2
- package/dist/agent-src/rules/output-discipline.md +0 -1
- package/dist/agent-src/rules/prefer-enums-over-literals.md +0 -2
- package/dist/agent-src/rules/preservation-guard.md +0 -3
- package/dist/agent-src/rules/role-mode-adherence.md +0 -1
- package/dist/agent-src/rules/secret-vcs-guard.md +0 -2
- package/dist/agent-src/rules/senior-engineering-discipline.md +0 -2
- package/dist/agent-src/rules/session-canary.md +0 -2
- package/dist/agent-src/rules/size-enforcement.md +0 -5
- package/dist/agent-src/rules/source-confidentiality.md +0 -3
- package/dist/agent-src/rules/source-discovery-gate.md +0 -2
- package/dist/agent-src/rules/think-before-action.md +3 -3
- package/dist/agent-src/rules/token-budget-discipline.md +0 -1
- package/dist/agent-src/rules/token-efficiency.md +1 -2
- package/dist/agent-src/rules/tool-safety.md +0 -1
- package/dist/agent-src/rules/user-interaction.md +0 -3
- package/dist/agent-src/rules/user-interrupt-priority.md +0 -1
- package/dist/agent-src/skills/agent-docs-writing/SKILL.md +8 -0
- package/dist/agent-src/skills/ai-code-blindspots/SKILL.md +1 -0
- package/dist/agent-src/skills/analysis-skill-router/SKILL.md +55 -86
- package/dist/agent-src/skills/character-consistency/SKILL.md +7 -4
- package/dist/agent-src/skills/decision-record/SKILL.md +8 -0
- package/dist/agent-src/skills/design-intelligence/SKILL.md +27 -1
- package/dist/agent-src/skills/design-intelligence/data/font-pairings-reference.csv +74 -74
- package/dist/agent-src/skills/design-intelligence/data/manifest.json +2 -0
- package/dist/agent-src/skills/design-review/SKILL.md +11 -0
- package/dist/agent-src/skills/design-system-capture/reference/design-system-json.md +8 -0
- package/dist/agent-src/skills/design-tokens/scripts/tokens.ts +0 -7
- package/dist/agent-src/skills/existing-ui-audit/SKILL.md +34 -3
- package/dist/agent-src/skills/fe-design/SKILL.md +10 -0
- package/dist/agent-src/skills/motion-choreographer/SKILL.md +7 -4
- package/dist/agent-src/skills/overbuild-review-lens/SKILL.md +201 -0
- package/dist/agent-src/skills/performance/SKILL.md +14 -0
- package/dist/agent-src/skills/pixar-storyteller/SKILL.md +8 -5
- package/dist/agent-src/skills/scene-expander/SKILL.md +9 -6
- package/dist/agent-src/skills/supply-chain-intake/SKILL.md +10 -0
- package/dist/agent-src/skills/typography-system/SKILL.md +55 -11
- package/dist/agent-src/skills/ui-apply-generic/SKILL.md +180 -0
- package/dist/agent-src/skills/universal-project-analysis/SKILL.md +14 -37
- package/dist/agent-src/skills/video-director/SKILL.md +9 -6
- package/dist/agent-src/templates/agents/agent-project-settings.example.yml +1 -1
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +162 -17
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/design.ts +118 -0
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +49 -6
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/review.ts +9 -5
- package/dist/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +182 -29
- package/dist/agent-src/templates/scripts/work_engine/stack/detect.ts +311 -24
- package/dist/agent-src/templates/scripts/work_engine/state.ts +55 -0
- package/dist/cli-delegate/chunk-523HCFYO.js +90 -0
- package/dist/cli-delegate/{chunk-IR7P7JWA.js → chunk-A3HJ6NTI.js} +271 -59
- package/dist/cli-delegate/chunk-EJYIGZ3T.js +125 -0
- package/dist/cli-delegate/{chunk-RDGRHAAB.js → chunk-HYWSRNUX.js} +6 -86
- package/dist/cli-delegate/{chunk-YMFO6FDN.js → chunk-QFKQLQ7X.js} +313 -81
- package/dist/cli-delegate/{chunk-4SV3XGFA.js → chunk-TEGJU2JX.js} +7 -9
- package/dist/cli-delegate/chunk-TJIAM5FW.js +133 -0
- package/dist/cli-delegate/cmd_conformance.js +4 -7
- package/dist/cli-delegate/cmd_doctor.js +3 -5
- package/dist/cli-delegate/cmd_explain.js +153 -85
- package/dist/cli-delegate/cmd_export.js +5 -3
- package/dist/cli-delegate/cmd_fleet.js +2 -1
- package/dist/cli-delegate/cmd_preflight.js +6 -123
- package/dist/cli-delegate/cmd_prune.js +5 -3
- package/dist/cli-delegate/cmd_settings_migrate.js +5 -3
- package/dist/cli-delegate/cmd_sync.js +5 -3
- package/dist/cli-delegate/cmd_uninstall.js +6 -5
- package/dist/cli-delegate/cmd_validate.js +5 -3
- package/dist/discovery/deprecation-report.md +1 -1
- package/dist/discovery/discovery-manifest.json +116 -72
- package/dist/discovery/discovery-manifest.json.sha256 +1 -1
- package/dist/discovery/discovery-manifest.summary.md +3 -3
- package/dist/discovery/orphan-report.md +1 -1
- package/dist/discovery/packs.json +7 -5
- package/dist/discovery/trust-report.md +2 -2
- package/dist/discovery/workspaces.json +6 -4
- package/dist/hooks/dispatch.js +174 -13
- package/dist/install/install.mjs +605 -412
- package/dist/install/ruleInScope.js +123 -0
- package/dist/install/ruleInScope.js.map +1 -0
- package/dist/install/rule_scope.js +2 -2
- package/dist/install/rule_scope.js.map +1 -1
- package/dist/install/wizard-plan.js +10 -1
- package/dist/install/wizard-plan.js.map +1 -1
- package/dist/mcp/registry-manifest.json +3 -3
- package/dist/mcp/server.json +2 -2
- package/dist/mcp/server.mjs +710 -2491
- package/dist/router.json +1 -1
- package/dist/scripts/condense.js +8 -24
- package/dist/scripts/condense.js.map +1 -1
- package/docs/MIGRATION.md +1 -1
- package/docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md +71 -0
- package/docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md +24 -1
- package/docs/guidelines/code-clarity.md +9 -2
- package/docs/guidelines/design-fidelity-mechanics.md +58 -0
- package/llms.txt +63 -27
- package/package.json +4 -4
- package/src/agent-src/templates/scripts/work_engine/directives/ui/apply.ts +162 -17
- package/src/agent-src/templates/scripts/work_engine/directives/ui/design.ts +118 -0
- package/src/agent-src/templates/scripts/work_engine/directives/ui/polish.ts +49 -6
- package/src/agent-src/templates/scripts/work_engine/directives/ui/review.ts +9 -5
- package/src/agent-src/templates/scripts/work_engine/directives/ui/stack_bundles.ts +182 -29
- package/src/agent-src/templates/scripts/work_engine/stack/detect.ts +311 -24
- package/src/agent-src/templates/scripts/work_engine/state.ts +55 -0
- package/src/config/agent-settings.template.yml +8 -0
- package/src/install/ruleInScope.ts +133 -0
- package/src/install/rule_scope.ts +2 -2
- package/src/install/wizard-plan.ts +11 -1
- package/src/scripts/_lib/counted_probe.ts +142 -0
- package/src/scripts/_lib/global_deploy_inventory.ts +38 -2
- package/src/scripts/_lib/overbuild_lens_contract.ts +196 -0
- package/src/scripts/_lib/release_scope.ts +207 -0
- package/src/scripts/ai_council/stance_tally.ts +37 -2
- package/src/scripts/audit_auto_rules.ts +9 -9
- package/src/scripts/audit_likelihood.ts +3 -3
- package/src/scripts/audit_overlap.ts +2 -2
- package/src/scripts/audit_skill_overlap.ts +233 -95
- package/src/scripts/audit_skill_overlap_allowlist.json +4 -0
- package/src/scripts/build_proof.ts +15 -1
- package/src/scripts/check_dependency_floors.ts +16 -6
- package/src/scripts/check_gate_coverage.ts +6 -6
- package/src/scripts/check_installer_import_purity.ts +295 -0
- package/src/scripts/check_kernel_rule_bundle.ts +5 -4
- package/src/scripts/check_token_quality_golden.ts +0 -18
- package/src/scripts/code_graph/loader.ts +35 -6
- package/src/scripts/compile_router.ts +3 -8
- package/src/scripts/condense.ts +9 -30
- package/src/scripts/explain_run.ts +0 -1
- package/src/scripts/generate_pack_manifests.ts +3 -20
- package/src/scripts/hooks/block_kernel_rule_writes.ts +145 -10
- package/src/scripts/hooks/block_no_verify.ts +101 -0
- package/src/scripts/install-hooks.sh +36 -4
- package/src/scripts/install.ts +210 -5
- package/src/scripts/lint_agent_security.ts +5 -4
- package/src/scripts/lint_framework_leakage_allowlist.json +2 -2
- package/src/scripts/lint_regression.ts +92 -1
- package/src/scripts/lint_skill_descriptions.ts +93 -5
- package/src/scripts/lint_ui_stack_bundles.ts +31 -0
- package/src/scripts/project_thin_rules.ts +2 -2
- package/src/scripts/release.ts +107 -3
- package/src/scripts/resolve_lint_scope.ts +53 -0
- package/src/scripts/router_telemetry.ts +0 -5
- package/src/scripts/runtime_dispatcher.ts +40 -0
- package/src/scripts/schemas/pack.schema.json +1 -5
- package/src/scripts/schemas/rule.schema.json +1 -2
- package/src/scripts/self_review_gate.ts +15 -73
- package/src/scripts/skill_linter.ts +93 -11
- package/src/scripts/sweep_dead_scan_roots.ts +550 -0
- package/src/scripts/trigger_coverage.ts +11 -37
- package/dist/cli-delegate/chunk-7DSAMZFU.js +0 -356
- package/dist/cli-delegate/chunk-BJGXZNPM.js +0 -266
- package/dist/cli-delegate/chunk-TFG57JJM.js +0 -1969
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
---
|
|
2
|
+
model_tier: high
|
|
3
|
+
name: overbuild-review-lens
|
|
4
|
+
description: "Use when a diff builds more than the task needs — code that should not exist, a dependency the platform already covers, or a clever form where a flat one reads better. Deletion-hunting, not quality."
|
|
5
|
+
personas:
|
|
6
|
+
- senior-engineer
|
|
7
|
+
domain: quality
|
|
8
|
+
workspaces:
|
|
9
|
+
- engineering
|
|
10
|
+
packs:
|
|
11
|
+
- engineering-base
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# overbuild-review-lens
|
|
15
|
+
|
|
16
|
+
> A deletion-hunting lens. It asks one question the other judges never
|
|
17
|
+
> ask: **should this code exist at all?** Sibling of
|
|
18
|
+
> [`architecture-review-lens`](../architecture-review-lens/SKILL.md) and
|
|
19
|
+
> the `judge-*` family — never overlaps with them.
|
|
20
|
+
|
|
21
|
+
## When to use
|
|
22
|
+
|
|
23
|
+
- A diff adds a helper, a wrapper, a config layer, an abstraction, or a
|
|
24
|
+
dependency.
|
|
25
|
+
- A rewrite, v2, or large refactor landed — the peak over-build context
|
|
26
|
+
(see [`minimal-safe-diff-mechanics`](../../../docs/guidelines/agent-infra/minimal-safe-diff-mechanics.md)
|
|
27
|
+
§ The sanctioned-rewrite trap).
|
|
28
|
+
- A reviewer asks "is all of this needed?", "could the platform do
|
|
29
|
+
this?", or "why is this so clever?".
|
|
30
|
+
|
|
31
|
+
Do NOT use when:
|
|
32
|
+
|
|
33
|
+
- The concern is whether the code is **correct** — route to
|
|
34
|
+
[`judge-bug-hunter`](../judge-bug-hunter/SKILL.md).
|
|
35
|
+
- The concern is **security** — route to
|
|
36
|
+
[`judge-security-auditor`](../judge-security-auditor/SKILL.md).
|
|
37
|
+
- The concern is **naming, single-responsibility, or convention fit** of
|
|
38
|
+
code whose existence is not in question — route to
|
|
39
|
+
[`judge-code-quality`](../judge-code-quality/SKILL.md). That judge asks
|
|
40
|
+
*is this code malformed*; this lens asks *should it exist*.
|
|
41
|
+
- The concern is **performance** — route to
|
|
42
|
+
[`performance`](../performance/SKILL.md). Speed is out of scope here.
|
|
43
|
+
- The diff is documentation-only or formatting-only.
|
|
44
|
+
|
|
45
|
+
## The scope fence — read this before the first finding
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
CORRECTNESS, SECURITY AND PERFORMANCE ARE OUT OF SCOPE FOR THIS LENS.
|
|
49
|
+
THE MINIMUM RUNNABLE CHECK IS NEVER FLAGGED FOR DELETION.
|
|
50
|
+
A SIZE REDUCTION THAT DROPS A GUARD IS A LOSS, NOT A FINDING.
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The measured failure mode this fence exists for: a bare "make it
|
|
54
|
+
simpler" critic was the only arm in a controlled comparison that dropped
|
|
55
|
+
a safety guard — the three lines it saved were a path-traversal check.
|
|
56
|
+
Tests, validation, authorization checks, tenant scoping, and error paths
|
|
57
|
+
that can actually occur are **not** over-build. If removing something
|
|
58
|
+
would reduce coverage of a real case, it is not a finding here.
|
|
59
|
+
|
|
60
|
+
## Procedure
|
|
61
|
+
|
|
62
|
+
### 1. Establish what the task actually asked for
|
|
63
|
+
|
|
64
|
+
Read the ticket / prompt, not just the diff. Over-build is measured
|
|
65
|
+
against the **requirement**, not against your taste. Anything the diff
|
|
66
|
+
adds beyond the requirement is a candidate; anything the requirement
|
|
67
|
+
demands is not, however large.
|
|
68
|
+
|
|
69
|
+
### 2. Walk each addition down the solution-size ladder
|
|
70
|
+
|
|
71
|
+
For every new unit (function, class, module, config key, dependency),
|
|
72
|
+
find the highest rung that would have carried it — see
|
|
73
|
+
[`agent-interaction-and-decision-quality`](../../../docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md)
|
|
74
|
+
§ 8b-ladder:
|
|
75
|
+
|
|
76
|
+
| Tag | Meaning | The evidence that makes it a finding |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| `delete:` | This should not exist at all | A fence line (see § 3) — mandatory |
|
|
79
|
+
| `stdlib:` | The language stdlib or framework already does it | Name the exact API and show it is equivalent |
|
|
80
|
+
| `native:` | The OS / runtime / browser / database already does it | Name the platform capability and its availability floor |
|
|
81
|
+
| `yagni:` | Built for a requirement nobody stated | Quote the requirement it exceeds |
|
|
82
|
+
| `shrink:` | Must exist, but smaller | Name the lines that carry no requirement |
|
|
83
|
+
| `flatten:` | Must exist, but in a **simpler form** | Name the cognitive cost, not the line count |
|
|
84
|
+
|
|
85
|
+
`flatten:` is the shape-axis inverse of `shrink:` — same logic, simpler
|
|
86
|
+
form, **even when that costs a line or two**. Without it the lens only
|
|
87
|
+
ever argues downward and becomes a golfing engine. A nested ternary
|
|
88
|
+
replaced by an `if` block is a valid `flatten:` finding even though the
|
|
89
|
+
diff grows.
|
|
90
|
+
|
|
91
|
+
### 3. Every `delete:` carries a fence line — no exceptions
|
|
92
|
+
|
|
93
|
+
Chesterton's Fence, operationalised. Agents are documented as
|
|
94
|
+
especially fence-blind: complex code reads as an invitation to simplify
|
|
95
|
+
when the complexity may exist for a reason the reader has no context
|
|
96
|
+
for. This does not restate
|
|
97
|
+
[`minimal-safe-diff`](../../../src/rules/minimal-safe-diff.md)'s "never
|
|
98
|
+
delete code that *looks* dead without proof" — it is the output contract
|
|
99
|
+
that makes the proof visible.
|
|
100
|
+
|
|
101
|
+
The fence line has three fields, all required:
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
Fence: why=<why the code existed — blame, test, issue, or "unknown">
|
|
105
|
+
safe=<the evidence that removal is safe>
|
|
106
|
+
covered=<yes|no|partial — was the removed path under test?>
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
- `why=unknown` is a legal value and it is **not** a pass. It downgrades
|
|
110
|
+
the finding to a question for the author, never an instruction.
|
|
111
|
+
- `covered=` is the one machine-checkable input to an otherwise
|
|
112
|
+
archaeological judgement (the Beyoncé rule: if you liked it, you put a
|
|
113
|
+
test on it). Deleting *tested* behaviour trips a test and is visible;
|
|
114
|
+
deleting *untested* behaviour breaks silently — so `covered=no` is
|
|
115
|
+
surfaced as **higher** risk, not as equivalent.
|
|
116
|
+
|
|
117
|
+
### 4. Emit the null when there is nothing to cut
|
|
118
|
+
|
|
119
|
+
```
|
|
120
|
+
A LENS THAT CANNOT SAY "NOTHING TO CUT" IS A FINDING GENERATOR.
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
A lean diff must produce the honest null, not an invented finding. This
|
|
124
|
+
is the load-bearing output, not a fallback: a reviewer who sees findings
|
|
125
|
+
on every diff stops reading them.
|
|
126
|
+
|
|
127
|
+
### 5. Validate before emitting
|
|
128
|
+
|
|
129
|
+
- Every finding has a `file:line` and exactly one tag from § 2.
|
|
130
|
+
- Every `delete:` has all three fence fields.
|
|
131
|
+
- No finding restates a correctness, security, or performance concern.
|
|
132
|
+
- The net-lines summary counts `flatten:` findings honestly, including
|
|
133
|
+
the ones that **add** lines.
|
|
134
|
+
- Zero findings → emit the null block, not an empty issues list.
|
|
135
|
+
|
|
136
|
+
## Output format
|
|
137
|
+
|
|
138
|
+
The verdict block carries these ordered fields:
|
|
139
|
+
|
|
140
|
+
1. `Lens:` — fixed value `overbuild-review-lens`
|
|
141
|
+
2. `Target:` — the diff range or file set reviewed
|
|
142
|
+
3. `Verdict:` — exactly one of `lean` / `trim` / `overbuilt`
|
|
143
|
+
4. `Findings:` — one line per finding: tag, `file:line`, one sentence;
|
|
144
|
+
`delete:` findings carry their `Fence:` line directly beneath
|
|
145
|
+
5. `Net:` — lines removable if every finding is applied, stated as a
|
|
146
|
+
signed number so a line-adding `flatten:` is visible
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
Lens: overbuild-review-lens
|
|
150
|
+
Target: <branch / diff range>
|
|
151
|
+
|
|
152
|
+
Verdict: lean | trim | overbuilt
|
|
153
|
+
|
|
154
|
+
Findings:
|
|
155
|
+
1. stdlib: src/util/uuid.ts:1 Hand-rolled v4 generator; crypto.randomUUID covers it.
|
|
156
|
+
2. delete: src/config/flags.ts:12 Flag read by nothing since the feature shipped.
|
|
157
|
+
Fence: why=guarded the 2026-03 rollout safe=zero readers, grep clean covered=no
|
|
158
|
+
3. flatten: src/parser.ts:88 Nested ternary; an if/else reads flat (+2 lines).
|
|
159
|
+
|
|
160
|
+
Net: -34 lines
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
The null, when there is nothing to cut — emit verbatim, do not
|
|
164
|
+
paraphrase:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
Lens: overbuild-review-lens
|
|
168
|
+
Target: <branch / diff range>
|
|
169
|
+
|
|
170
|
+
Verdict: lean
|
|
171
|
+
|
|
172
|
+
Findings: none — nothing in this diff exceeds the stated requirement.
|
|
173
|
+
|
|
174
|
+
Net: 0 lines
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Gotcha
|
|
178
|
+
|
|
179
|
+
- **The requirement is the yardstick, not your preference.** A large
|
|
180
|
+
diff that the ticket demanded is not over-built. Say so and emit the
|
|
181
|
+
null.
|
|
182
|
+
- **`covered=no` makes a deletion riskier, not more attractive.** The
|
|
183
|
+
absence of a test is the absence of a tripwire.
|
|
184
|
+
- **A `flatten:` finding that saves lines is suspicious.** If it is
|
|
185
|
+
shorter *and* simpler it is probably a `shrink:`; `flatten:` exists
|
|
186
|
+
for the cases where simplicity costs length.
|
|
187
|
+
- **Never flag the minimum runnable check.** One happy-path test is not
|
|
188
|
+
over-build; it is the floor.
|
|
189
|
+
- **Do not count `delete:` lines that git already removed.** The net
|
|
190
|
+
figure is about the diff as proposed, not the diff's own deletions.
|
|
191
|
+
|
|
192
|
+
## Do NOT
|
|
193
|
+
|
|
194
|
+
- Do NOT emit a `delete:` finding without all three fence fields — the
|
|
195
|
+
output contract rejects it.
|
|
196
|
+
- Do NOT invent a finding to avoid an empty report.
|
|
197
|
+
- Do NOT review correctness, security, or performance — other surfaces
|
|
198
|
+
own those, and a size argument against a guard is the canonical
|
|
199
|
+
failure this lens is fenced against.
|
|
200
|
+
- Do NOT report a size number as a score. A size metric is a
|
|
201
|
+
measurement, never a target.
|
|
@@ -28,6 +28,20 @@ Do NOT use when:
|
|
|
28
28
|
3. Check for N+1 queries on list endpoints.
|
|
29
29
|
4. Search for existing cache services in the project.
|
|
30
30
|
|
|
31
|
+
**Performance complexity is a claim, and a claim needs evidence.** No cache
|
|
32
|
+
layer, no denormalised column, no materialised view, no read replica ships on
|
|
33
|
+
"this will be slow" — it ships on a profile, a query log, or a timing that names
|
|
34
|
+
the bottleneck. The added complexity is permanent (invalidation bugs, stale
|
|
35
|
+
reads, a second source of truth); the speedup is hypothetical until measured.
|
|
36
|
+
State the measurement in the change, or do not add the mechanism.
|
|
37
|
+
|
|
38
|
+
**Carve-out — this does not override the `scale-discipline` floor.** Where that
|
|
39
|
+
pack is installed, R-A2 *mandates* an index on every FK and every WHERE / ORDER
|
|
40
|
+
BY column, and R-A4 governs duplicated data by waiver. Those are structural
|
|
41
|
+
defaults that ship with the query, not optimisations awaiting a profiler; the
|
|
42
|
+
evidence gate above applies to *added mechanisms* (caches, denormalisation,
|
|
43
|
+
replicas, bespoke indexes beyond parity), never to the floor's baseline.
|
|
44
|
+
|
|
31
45
|
### Step 1: Apply the right fix
|
|
32
46
|
|
|
33
47
|
| Bottleneck | Fix |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
model_tier: inherit
|
|
3
3
|
name: pixar-storyteller
|
|
4
|
-
description: "Use when
|
|
4
|
+
description: "Use when an idea becomes a Pixar-style animation prompt — character sheet, scene, image, video; emotional beat, want, obstacle. Triggers 'Pixar prompt', 'animated scene'. Live-action → video-director."
|
|
5
5
|
domain: product
|
|
6
6
|
workspaces:
|
|
7
7
|
- small-business
|
|
@@ -119,12 +119,15 @@ Any "no" → revise that block.
|
|
|
119
119
|
|
|
120
120
|
## Policies
|
|
121
121
|
|
|
122
|
+
Paths, enforcement model, and the full set: the
|
|
123
|
+
[media policy preamble](../../../agents/settings/policies/media/README.md).
|
|
124
|
+
|
|
122
125
|
The Pixar-storyteller skill anchors prompts to named films and studios by design — the policy surface is the largest in the video cluster:
|
|
123
126
|
|
|
124
|
-
-
|
|
125
|
-
-
|
|
126
|
-
-
|
|
127
|
-
-
|
|
127
|
+
- **`style`** — naming a film + year as the *primary* anchor crosses the "in the style of [STUDIO]" trigger; surface and refuse without a transformative-intent rationale.
|
|
128
|
+
- **`likeness`** — when a beat references a named animator's signature character (real-person extension of style).
|
|
129
|
+
- **`public-figures`** — when the storyteller's character is a recognised public figure rendered in Pixar shape.
|
|
130
|
+
- **`disclosure`** — every Pixar-style output ships with the AI-generation disclosure; parody / commentary cases are flagged for human review.
|
|
128
131
|
|
|
129
132
|
Refuse-and-surface when style ⇒ primary signature, not one influence among several.
|
|
130
133
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
model_tier: inherit
|
|
3
3
|
name: scene-expander
|
|
4
|
-
description: "Use when expanding a one-line idea into the 12-block Cinematic Scene Blueprint —
|
|
4
|
+
description: "Use when expanding a one-line idea into the 12-block Cinematic Scene Blueprint — optional dialogue + ambient. Triggers 'expand this scene', 'blueprint for X'. 11-block refine → video-director."
|
|
5
5
|
personas:
|
|
6
6
|
- hollywood-director
|
|
7
7
|
domain: product
|
|
@@ -146,13 +146,16 @@ Any "no" → revise that block.
|
|
|
146
146
|
|
|
147
147
|
## Policies
|
|
148
148
|
|
|
149
|
+
Paths, enforcement model, and the full set: the
|
|
150
|
+
[media policy preamble](../../../agents/settings/policies/media/README.md).
|
|
151
|
+
|
|
149
152
|
The 12-block Cinematic Scene Blueprint is the policy choke point — every downstream skill (`motion-choreographer`, `video-director`) inherits whatever the blueprint encodes. Before emitting:
|
|
150
153
|
|
|
151
|
-
-
|
|
152
|
-
-
|
|
153
|
-
-
|
|
154
|
-
-
|
|
155
|
-
-
|
|
154
|
+
- **`likeness`** — when the SUBJECT block names or visually identifies a real person.
|
|
155
|
+
- **`public-figures`** — when the SUBJECT block is a recognised public figure.
|
|
156
|
+
- **`brand-impersonation`** — when STYLE / ENVIRONMENT references a recognised brand's visual identity.
|
|
157
|
+
- **`style`** — when STYLE anchors to a named living artist or studio as the primary signature.
|
|
158
|
+
- **`disclosure`** — every distributed blueprint output carries the AI-generation disclosure downstream.
|
|
156
159
|
|
|
157
160
|
Refuse-and-surface at the blueprint layer; do not push policy questions down to the adapter.
|
|
158
161
|
|
|
@@ -32,6 +32,16 @@ PIN IT, LOCK IT, CVE-SCAN IT. NEVER PIPE A REMOTE SCRIPT STRAIGHT TO A SHELL.
|
|
|
32
32
|
|
|
33
33
|
## Procedure — intake gate (run in order before adding a dependency)
|
|
34
34
|
|
|
35
|
+
0. **Do you need a dependency at all?** The cheapest supply-chain risk is the
|
|
36
|
+
one never taken. Walk the rungs above "installed dependency" first — is it
|
|
37
|
+
already in the tree (`npm ls <pkg>`, `composer show`, `pip list`), does the
|
|
38
|
+
stdlib or framework carry it, does the **platform** already do it
|
|
39
|
+
(`crypto.randomUUID` before a uuid package, `Intl` before a formatting
|
|
40
|
+
library, `AbortSignal.timeout` before a timeout helper, the database's own
|
|
41
|
+
full-text / JSON support before an application-side index)? Full ordering:
|
|
42
|
+
[`agent-interaction-and-decision-quality` § 8b-ladder](../../../docs/guidelines/agent-infra/agent-interaction-and-decision-quality.md).
|
|
43
|
+
A dependency added for something already present is permanent cost — install
|
|
44
|
+
surface, CVE surface, upgrade surface — bought against a capability you had.
|
|
35
45
|
1. **Existence** — confirm the exact string resolves on the real registry, published before your session and with real usage:
|
|
36
46
|
```bash
|
|
37
47
|
npm view <pkg> version # non-zero exit = does not exist (hallucination)
|
|
@@ -53,7 +53,10 @@ degrades gracefully: with no brand layer, only stage 1 runs.
|
|
|
53
53
|
`$type: "typography"` and `$value` objects carrying `fontFamily`,
|
|
54
54
|
`fontSize`, `fontWeight`, `lineHeight`.
|
|
55
55
|
5. **Verify** — confirm both chosen fonts exist on Google Fonts (check the
|
|
56
|
-
`Google Fonts URL` column in the CSV
|
|
56
|
+
`Google Fonts URL` column in the CSV — this is an **availability** check,
|
|
57
|
+
"does this font exist?", and is deliberately separate from the **delivery**
|
|
58
|
+
decision, "how does it get onto the page?" — see § Delivery below; conflating
|
|
59
|
+
the two is what produced a single hard-wired hotlink); run
|
|
57
60
|
`./scripts-run <skills-root>/design-tokens/scripts/tokens validate --dir src/`
|
|
58
61
|
to confirm no hardcoded font-size or font-family values remain outside the
|
|
59
62
|
token file; exit code 0 is the evidence.
|
|
@@ -92,6 +95,31 @@ Consumer brand tokens outrank the corpus filter
|
|
|
92
95
|
([`brand-source-of-truth`](../../rules/brand-source-of-truth.md)) — if the
|
|
93
96
|
brand already registers fonts, use them and skip the filter.
|
|
94
97
|
|
|
98
|
+
## Delivery — hosting mode (self-hosted by default)
|
|
99
|
+
|
|
100
|
+
The delivery policy is **owned** by
|
|
101
|
+
[`design-fidelity-mechanics`](../../../docs/guidelines/design-fidelity-mechanics.md)
|
|
102
|
+
§ Asset & imagery discipline ([`ADR-205`](../../../docs/decisions/ADR-205-webfont-delivery-ownership.md));
|
|
103
|
+
this skill is a consumer and emits the route, never a competing policy. A font
|
|
104
|
+
CDN link transmits the **visitor's IP** to that third party on every page view —
|
|
105
|
+
a German court (LG München I) ruled on exactly that for hotlinked Google Fonts. <!-- md-language-check: ignore -->
|
|
106
|
+
|
|
107
|
+
**Default: self-hosted.** Take the row's `Self-Hosted Route` column and resolve
|
|
108
|
+
it against the detected target stack:
|
|
109
|
+
|
|
110
|
+
| Detected target | Route to emit | Where that answer comes from |
|
|
111
|
+
|---|---|---|
|
|
112
|
+
| Next.js | `next/font/google` (self-hosts at build) or `next/font/local` | `data/stacks/nextjs.csv` rows 22–24 — already prescribes this and lists the CDN `<link>` in its **Don't** column |
|
|
113
|
+
| Any bundler stack (Vite / webpack — React, Vue, Svelte, Nuxt, Astro) | the font's `@fontsource/*` package + a CSS import of the package | the package registry; verify it exists before suggesting it (`supply-chain-intake`) |
|
|
114
|
+
| Server-rendered asset pipeline (Laravel/Vite, Rails, Django) | copy the `woff2` into the project's asset directory, serve it, declare `@font-face` | the project's own pipeline (`design-fidelity-mechanics` § owned-asset path) |
|
|
115
|
+
| No build step / plain HTML | `@font-face` over a locally-served `woff2`, plus `<link rel="preload" as="font">` | `data/stacks/astro.csv` row 23 (preload of a local `woff2`) |
|
|
116
|
+
| Stack unknown | the plain `@font-face` floor, and **say** the route is unresolved — never fall back to the hotlink to avoid the question | — |
|
|
117
|
+
|
|
118
|
+
**Hotlink: opt-in only.** Emit the row's `CSS Import` value **only** when the
|
|
119
|
+
consumer explicitly asked for the CDN route, and state in the same breath that
|
|
120
|
+
it transmits the visitor's IP to the third party. Never pick it because it is
|
|
121
|
+
the shorter line.
|
|
122
|
+
|
|
95
123
|
## Output format
|
|
96
124
|
|
|
97
125
|
1. **Chosen pairing + rationale** — heading font, body font, the CSV row's
|
|
@@ -99,19 +127,31 @@ brand already registers fonts, use them and skip the filter.
|
|
|
99
127
|
2. **DTCG type-token block** — the `typography` section ready to paste into
|
|
100
128
|
`tokens.json` (DTCG `$type: "typography"`, `$value` with `fontFamily`,
|
|
101
129
|
`fontSize`, `fontWeight`, `lineHeight` per level).
|
|
102
|
-
3. **
|
|
103
|
-
`
|
|
104
|
-
`Tailwind Config`.
|
|
130
|
+
3. **Font delivery block** — the self-hosted route for the detected stack per
|
|
131
|
+
§ Delivery (from the row's `Self-Hosted Route` column), and the Tailwind
|
|
132
|
+
`fontFamily` config snippet from `Tailwind Config`. The row's
|
|
133
|
+
`CSS Import` hotlink appears here **only** under an explicit consumer opt-in,
|
|
134
|
+
with its IP-transmission note.
|
|
105
135
|
|
|
106
136
|
## Gotcha
|
|
107
137
|
|
|
108
|
-
- **Stale CSV URL → silent system-font fallback
|
|
109
|
-
is Reference data on a freshness contract — never
|
|
110
|
-
Fonts API call. If a font was retired or renamed, the
|
|
111
|
-
build time and the browser silently falls back to the
|
|
112
|
-
broken visual design with no obvious error.
|
|
113
|
-
|
|
114
|
-
|
|
138
|
+
- **Stale CSV URL → silent system-font fallback (opt-in hotlink path only).**
|
|
139
|
+
`font-pairings-reference.csv` is Reference data on a freshness contract — never
|
|
140
|
+
substitute a live Google Fonts API call. If a font was retired or renamed, the
|
|
141
|
+
`@import` URL 404s at build time and the browser silently falls back to the
|
|
142
|
+
system font, shipping broken visual design with no obvious error. This caveat
|
|
143
|
+
**still applies verbatim to the opt-in hotlink route**: verify the URL resolves
|
|
144
|
+
(Step 5) before emitting the import line; if it 404s, surface the error and ask
|
|
145
|
+
the user to pick an alternative pairing from the CSV.
|
|
146
|
+
- **The self-hosted default replaces that failure mode, it does not delete it.**
|
|
147
|
+
For a package route (`next/font`, `@fontsource/*`) resolution moves to
|
|
148
|
+
**install** time, where a wrong name fails loudly instead of 404-ing at build.
|
|
149
|
+
What remains is a **family-name mismatch**: the emitted CSS asks for
|
|
150
|
+
`font-family: 'Inter'` while the installed package provides a differently-named
|
|
151
|
+
family (`Inter Tight`), which renders the system font at runtime with no error
|
|
152
|
+
at all — the same silence, one layer later. Assert the family name in the
|
|
153
|
+
emitted CSS matches the one the installed package declares; the row's
|
|
154
|
+
`Google Fonts URL` stays useful as the reference spelling to compare against.
|
|
115
155
|
|
|
116
156
|
## Do NOT
|
|
117
157
|
|
|
@@ -119,6 +159,10 @@ brand already registers fonts, use them and skip the filter.
|
|
|
119
159
|
inline) — every size belongs in `tokens.json` under the `typography` layer.
|
|
120
160
|
- Do NOT bypass `design-tokens` and write raw CSS custom properties for fonts
|
|
121
161
|
— `tokens.json` is the single source; hand-crafted `--font-*` vars drift.
|
|
162
|
+
- Do NOT emit a font-CDN `@import` / `<link>` as the default deliverable — the
|
|
163
|
+
self-hosted route is the default and the hotlink is an explicit opt-in
|
|
164
|
+
(§ Delivery). Reaching for the CDN line because the stack was not detected is
|
|
165
|
+
the exact substitution this skill used to hard-wire.
|
|
122
166
|
- Do NOT treat `font-pairings-reference.csv` as decision logic — it is
|
|
123
167
|
Reference data; the agent picks based on the style constraint, not by
|
|
124
168
|
iterating the CSV as a rules engine.
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
---
|
|
2
|
+
model_tier: medium
|
|
3
|
+
name: ui-apply-generic
|
|
4
|
+
description: "Use when implementing a UI brief on a stack with no framework executor — Svelte, Astro, Angular, plain HTML. Carries the stack-independent contract; idiom comes from the stack corpus."
|
|
5
|
+
personas:
|
|
6
|
+
- frontend-engineer
|
|
7
|
+
domain: engineering
|
|
8
|
+
workspaces:
|
|
9
|
+
- engineering
|
|
10
|
+
packs:
|
|
11
|
+
- engineering-base
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# ui-apply-generic
|
|
15
|
+
|
|
16
|
+
> The `plain` lane used to be a name with nothing behind it. This skill is the
|
|
17
|
+
> lane: it carries the implementation discipline that previously lived **only**
|
|
18
|
+
> inside the framework executors, and it gets framework idiom from the 16-stack
|
|
19
|
+
> corpus instead of from prose written here.
|
|
20
|
+
>
|
|
21
|
+
> That split is the whole point. One skill plus a corpus serves Svelte, Astro,
|
|
22
|
+
> Angular, Alpine, htmx and everything future at once. Sixteen framework skills
|
|
23
|
+
> would serve the same set and cost a single maintainer sixteen surfaces to keep
|
|
24
|
+
> current — the enumeration this package refuses.
|
|
25
|
+
|
|
26
|
+
## When to use
|
|
27
|
+
|
|
28
|
+
- `state.stack.frontend` resolves to `plain`, or to a label with no
|
|
29
|
+
framework-specific overlay.
|
|
30
|
+
- A stack whose `axes.reactivity` or `axes.meta` is recognised but has no
|
|
31
|
+
executor skill (`svelte`, `angular`, `astro`, `solid`, `qwik`, `htmx`).
|
|
32
|
+
- As the base of a composition: an overlay skill (`livewire`, `flux`,
|
|
33
|
+
`blade-ui`, `react-shadcn-ui`) adds framework specifics **on top** of this
|
|
34
|
+
contract, it does not replace it.
|
|
35
|
+
|
|
36
|
+
Do NOT use when a framework executor already covers the whole job — then this
|
|
37
|
+
skill is the base and the executor is the overlay, dispatched together.
|
|
38
|
+
|
|
39
|
+
## Procedure
|
|
40
|
+
|
|
41
|
+
### Step 1 — Query the stack corpus (mandatory)
|
|
42
|
+
|
|
43
|
+
Read `state.stack.axes` and query per resolved axis value, most specific first:
|
|
44
|
+
`meta` → `reactivity` → `component_lib`.
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
<skills-root>/corpus-grounding/scripts/ground search \
|
|
48
|
+
--manifest <skills-root>/design-intelligence/data/manifest.json \
|
|
49
|
+
--stack <axis-value> "<the concrete question>"
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
`axes.meta: nuxt` with `axes.reactivity: vue` means **two** queries —
|
|
53
|
+
`--stack nuxtjs` and `--stack vue`. A meta-framework does not replace the layer
|
|
54
|
+
it wraps; that conflation is the defect the axes exist to fix.
|
|
55
|
+
|
|
56
|
+
**Cite what you used.** The result names the corpus rows the implementation
|
|
57
|
+
followed. An uncited pick is indistinguishable from the model's memory, and
|
|
58
|
+
memory is exactly what the corpus exists to replace.
|
|
59
|
+
|
|
60
|
+
**No corpus domain for the detected stack** → say so, in the result:
|
|
61
|
+
|
|
62
|
+
> No stack corpus for `<stack>` — proceeding on the generic contract. Framework
|
|
63
|
+
> idiom below is not grounded and should be reviewed by someone who knows this
|
|
64
|
+
> stack.
|
|
65
|
+
|
|
66
|
+
Silence is the failure mode. An unstated gap reads as grounded output.
|
|
67
|
+
|
|
68
|
+
### Step 2 — Apply the stack-independent contract
|
|
69
|
+
|
|
70
|
+
Every item is a hard requirement, and none of them is framework-specific:
|
|
71
|
+
|
|
72
|
+
1. **Verbatim floor.** Microcopy comes from `state.ui_design.microcopy` exactly
|
|
73
|
+
as written — every label, empty-state line, and validation message. No
|
|
74
|
+
paraphrase, no improvement. Where a source artifact was provided, it beats
|
|
75
|
+
the brief (see `design-fidelity`).
|
|
76
|
+
2. **Token discipline.** Colour, spacing, radius and shadow values come from the
|
|
77
|
+
project's tokens. A raw hex or arbitrary px that no token backs is a finding,
|
|
78
|
+
not a choice. Validate with `design-tokens`' `tokens validate`.
|
|
79
|
+
3. **Component reuse.** Check `state.ui_audit.components_found` before creating
|
|
80
|
+
anything. In a run that has already added components, re-read the component
|
|
81
|
+
directories — the audit inventory is computed once per state-file and does
|
|
82
|
+
not refresh (see `existing-ui-audit` § Gotchas).
|
|
83
|
+
4. **a11y floor.** Semantic elements over `div` + role; every interactive
|
|
84
|
+
element reachable and labelled; focus visible; contrast meets the project's
|
|
85
|
+
stated level, AA when unstated.
|
|
86
|
+
5. **All five states.** `empty`, `loading`, `error`, `success`, `disabled` per
|
|
87
|
+
the brief. An explicit `n/a` is legitimate for a surface that genuinely has
|
|
88
|
+
no such state — declaring that is the opposite of inventing filler.
|
|
89
|
+
6. **Asset discipline.** Copy referenced assets into the project's asset path.
|
|
90
|
+
Never hotlink; never fabricate a logo or a screenshot.
|
|
91
|
+
7. **No placeholders.** `<placeholder>`, `lorem`, `todo:`, `tbd`, `xxx` are
|
|
92
|
+
rejected at the boundary — including inside arrays.
|
|
93
|
+
|
|
94
|
+
### Step 3 — Verify, with honest degrade
|
|
95
|
+
|
|
96
|
+
Exercise the result with whatever the host actually has, and name which:
|
|
97
|
+
|
|
98
|
+
| Available | Do |
|
|
99
|
+
|---|---|
|
|
100
|
+
| Browser / Playwright | Render, check the states, exercise one interaction |
|
|
101
|
+
| Screenshot only | Capture and inspect layout at 375 / 768 / 1280 |
|
|
102
|
+
| Neither | Static inspection only, and **say** the render is unverified |
|
|
103
|
+
|
|
104
|
+
Never claim a state or interaction works without having exercised it. A caveat
|
|
105
|
+
is a finding; a silent claim is a defect.
|
|
106
|
+
|
|
107
|
+
## Output format
|
|
108
|
+
|
|
109
|
+
Four requirements, in order — each is checkable by a reader of the result:
|
|
110
|
+
|
|
111
|
+
1. **Name the corpora queried**, or state that none exists for this stack.
|
|
112
|
+
2. **Cite the rows that changed a decision** — not every row read.
|
|
113
|
+
3. **State the verification method and its caveats**, never an unqualified
|
|
114
|
+
"works".
|
|
115
|
+
4. **List components reused before components added**, so a duplicate is
|
|
116
|
+
visible rather than buried.
|
|
117
|
+
|
|
118
|
+
Write `state.ticket["ui_apply"]`:
|
|
119
|
+
|
|
120
|
+
```yaml
|
|
121
|
+
ui_apply:
|
|
122
|
+
files: ["resources/js/UserCard.svelte"]
|
|
123
|
+
rendered:
|
|
124
|
+
"resources/js/UserCard.svelte": |
|
|
125
|
+
<full text, microcopy-locked>
|
|
126
|
+
components_added: ["UserCard"]
|
|
127
|
+
components_reused: ["Button"]
|
|
128
|
+
microcopy_lock: true
|
|
129
|
+
stack_corpus: # which corpora answered, or the degrade note
|
|
130
|
+
queried: ["svelte"]
|
|
131
|
+
cited: ["svelte.csv:12 — prefer stores over prop drilling"]
|
|
132
|
+
verify:
|
|
133
|
+
method: static_inspect # or playwright / screenshot
|
|
134
|
+
caveats: ["render not verified — no browser available"]
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Gotchas
|
|
138
|
+
|
|
139
|
+
- **Do not write framework prose into this skill.** The moment it explains how
|
|
140
|
+
Svelte stores work, it stops being one maintainable surface and starts being
|
|
141
|
+
sixteen. Framework knowledge belongs in the corpus.
|
|
142
|
+
- **`axes.reactivity: unknown` is not `none`.** `unknown` means a project has
|
|
143
|
+
manifests and no recognised reactivity layer — proceed, and say the stack was
|
|
144
|
+
not recognised. `none` means there genuinely is no reactivity layer, which is
|
|
145
|
+
the normal shape for a static page.
|
|
146
|
+
- **A meta-framework needs its own query.** Querying only `--stack vue` for a
|
|
147
|
+
Nuxt project silently drops the routing, data-fetching and SSR idioms that
|
|
148
|
+
are the whole reason Nuxt exists.
|
|
149
|
+
- **The generic contract is a floor, not a ceiling.** Where an overlay skill is
|
|
150
|
+
dispatched with this one, its framework rules win on their subject.
|
|
151
|
+
- **The floor now lives in exactly one place, and that is the point.** Overlay
|
|
152
|
+
composition applies this contract to every lane, so a future change to any of
|
|
153
|
+
its seven items is a one-point edit here rather than four lane patches that
|
|
154
|
+
drift apart. Concretely: the five-states requirement reaches every lane
|
|
155
|
+
through this skill. That requirement is deliberately unconditional — an
|
|
156
|
+
explicit `n/a` is the escape for a surface that genuinely has no such state
|
|
157
|
+
(asserted in `ui_lane_matrix.test.ts`), so this is not a defect being
|
|
158
|
+
broadened. But if the decision is ever revisited, revisit it here.
|
|
159
|
+
|
|
160
|
+
## Do NOT
|
|
161
|
+
|
|
162
|
+
- Emit framework code from memory and present it as grounded.
|
|
163
|
+
- Skip the corpus query because the stack "looks obvious".
|
|
164
|
+
- Claim a render or an interaction was verified when no primitive was available.
|
|
165
|
+
- Invent states, sections, or copy the brief does not carry.
|
|
166
|
+
- Treat a missing corpus as an evidence gap — it is a missing pack, and the two
|
|
167
|
+
must not be recorded the same way.
|
|
168
|
+
|
|
169
|
+
## See also
|
|
170
|
+
|
|
171
|
+
- [`design-intelligence`](../design-intelligence/SKILL.md) — the `--stack`
|
|
172
|
+
corpus this skill queries (16 stacks).
|
|
173
|
+
- [`existing-ui-audit`](../existing-ui-audit/SKILL.md) — the inventory Step 2
|
|
174
|
+
checks, and its once-per-state-file limit.
|
|
175
|
+
- [`design-tokens`](../design-tokens/SKILL.md) — `tokens validate`.
|
|
176
|
+
- [`fe-design`](../fe-design/SKILL.md) — where the brief's selection decisions
|
|
177
|
+
come from, and what it does when the corpus is not installed.
|
|
178
|
+
- [`ui-component-architect`](../ui-component-architect/SKILL.md),
|
|
179
|
+
[`tailwind-engineer`](../tailwind-engineer/SKILL.md) — stack-neutral
|
|
180
|
+
companions this skill composes with.
|
|
@@ -31,15 +31,11 @@ Do NOT use when:
|
|
|
31
31
|
|
|
32
32
|
## Mission
|
|
33
33
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
* identify the stack and framework
|
|
40
|
-
* choose the correct analysis mode
|
|
41
|
-
* route to the right specialist analysis skills
|
|
42
|
-
* define the required output for broad project investigations
|
|
34
|
+
Run the deep multi-pass audit itself, and hand each pass to the right
|
|
35
|
+
specialist. Picking *which* skill a request needs in the first place belongs to
|
|
36
|
+
[`analysis-skill-router`](../analysis-skill-router/SKILL.md) — that chooser and
|
|
37
|
+
this orchestrator are deliberately separate files, and the scope test, the
|
|
38
|
+
detection step, and the decision table live there, not here.
|
|
43
39
|
|
|
44
40
|
This skill must NOT become:
|
|
45
41
|
|
|
@@ -88,9 +84,9 @@ Goal: identify hot paths, find expensive boundaries, route into architecture or
|
|
|
88
84
|
|
|
89
85
|
### 1. Confirm scope
|
|
90
86
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
87
|
+
Invoked through the router, this is already settled — proceed. Invoked
|
|
88
|
+
directly, apply the router's scope test before spending a multi-pass audit on
|
|
89
|
+
something a specialist covers.
|
|
94
90
|
|
|
95
91
|
### 2. Discover the project
|
|
96
92
|
|
|
@@ -128,36 +124,17 @@ Check:
|
|
|
128
124
|
* uncertainties are marked
|
|
129
125
|
* conclusions are evidence-based
|
|
130
126
|
|
|
131
|
-
##
|
|
132
|
-
|
|
133
|
-
### Universal analysis skills
|
|
134
|
-
|
|
135
|
-
* `project-analysis-core`
|
|
136
|
-
* `project-analysis-hypothesis-driven`
|
|
137
|
-
|
|
138
|
-
### Framework-specific deep dives
|
|
139
|
-
|
|
140
|
-
* `project-analysis-laravel`
|
|
141
|
-
* `project-analysis-symfony`
|
|
142
|
-
* `project-analysis-zend-laminas`
|
|
143
|
-
* `project-analysis-node-express`
|
|
144
|
-
* `project-analysis-react`
|
|
145
|
-
* `project-analysis-nextjs`
|
|
146
|
-
|
|
147
|
-
### Optional downstream specialists
|
|
148
|
-
|
|
149
|
-
* `bug-analyzer`
|
|
150
|
-
* `performance-analysis`
|
|
151
|
-
* `security-audit`
|
|
152
|
-
|
|
153
|
-
### Ingestion preprocessor
|
|
127
|
+
## Ingestion preprocessor
|
|
154
128
|
|
|
155
129
|
* `markitdown` — when the project ships PDFs, DOCX, XLSX, PPTX, EPUB,
|
|
156
|
-
images, or audio that need to feed into any of the
|
|
157
|
-
|
|
130
|
+
images, or audio that need to feed into any of the routes in steps 3–4.
|
|
131
|
+
Convert first via the upstream `markitdown-mcp` server, then
|
|
158
132
|
route the resulting Markdown into the relevant deep-dive skill.
|
|
159
133
|
Never read a binary office format raw.
|
|
160
134
|
|
|
135
|
+
> The route lists in steps 3 and 4 are the routing map. A second copy of them
|
|
136
|
+
> lived here until 2026-08-02 and was removed — one list, one place.
|
|
137
|
+
|
|
161
138
|
## When to add a new framework analysis skill
|
|
162
139
|
|
|
163
140
|
A framework gets its own `project-analysis-*` skill ONLY if:
|