Retire pre-rebuild skill names from targets/ and lint against their return - #78
Conversation
…eturn The July catalog rebuild (#61) renamed every skill to its short directory name, but the dashboard agent family, three app/deploy commands, and the multizone hook still instructed agents to load 13 -skill-suffixed names that no longer exist (policyengine-interactive-tools-skill, policyengine-frontend-builder-spec-skill, policyengine-parameter-patterns-skill, ...). An agent following those instructions gets a failed Skill load and no domain knowledge. Map every reference to the current skill that verifiably carries the cited content, deduplicating load lists where several old skills merged into one: - interactive-tools / frontend-builder-spec / recharts / vercel-deployment / modal-deployment -> policyengine-tools (stack spec, multizone, charts, Vercel + Modal deployment) - simulation-mechanics / parameter-patterns -> policyengine (population Simulation; "Reform dictionaries and parameter paths" replaces the dead "section 6.5" citation) - us/uk/design/standards/app -skill names -> their short equivalents; api-v2-skill -> policyengine-api - Old section names updated ("Multi-zone integration (preferred)" -> "Multizone integration"); analyze-policy and generate-content plugin paths moved off the retired category-directory layout; the integrator's household-payload pointer now cites policyengine-api and loads it for the policyengine-api data pattern; planner's pattern table matches the skill's A/B/C letters (CSV folded into A) - The writing skill's example PR body used two -skill names; modernized Make the rot detectable so this cannot silently regress: - Ban [a-z0-9-]+-skill\b in the anti-rot lint (the pre-rebuild naming convention can only reappear deliberately via <!-- stale-ok -->) - test_skill_invocations_resolve: every `Skill: <name>` instruction must name a directory in skills/ - test_referenced_skills_paths_exist: every skills/... path referenced in scanned trees (including bundle manifests) must resolve, expanding the {country} template Verified: full suite minus test_skill_examples passes (71); a planted stale reference trips all three checks; the wrapper smoke build succeeds with no -skill tokens in its output. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
22c3e9d to
df05275
Compare
…nti-rot guards
Review findings (cross-family audit): the /analyze-policy skill list expanded
{country} with the flag value ca to nonexistent skills/policyengine-ca/ — spell
the us/uk/ca -> directory mapping explicitly; backend-builder and
deploy-dashboard keyed replacement-skill loads and the Modal deploy step on
custom-backend / api-v2-alpha, values the planner never emits (its vocabulary
is precomputed | precomputed-csv | policyengine-api | custom-modal); the -skill
ban is now case-insensitive, Skill: invocations with trailing junk are flagged
instead of prefix-parsed, and unknown skills/{...} templates fail instead of
being silently skipped.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Re-verification caught one remaining behavior-gating custom-backend: the dashboard-planner fallback suggested a pattern value outside its own emitted vocabulary. targets/ now has zero custom-backend / api-v2-alpha occurrences. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
Merging under the cross-family dual-review protocol (Claude Fable 5 + GPT-5.6-sol). Sol's audit found two blockers in the original head — the |
Summary
The July catalog rebuild (#61) renamed every skill to its short directory name (
skills/<name>/), but the dashboard agent family, the app multizone validator, several commands, and the multizone advisory hook still told agents to load 13-skill-suffixed names that no longer exist. An agent following those instructions gets a failed Skill load and proceeds without the domain knowledge the file promised it.Mapping
Each stale name was mapped only after verifying the current skill actually carries the cited content:
policyengine-interactive-tools-skillpolicyengine-toolspolicyengine-frontend-builder-spec-skillpolicyengine-toolspolicyengine-recharts-skillpolicyengine-tools(+policyengine-designfor tokens)var(--chart-N), niceTickspolicyengine-vercel-deployment-skillpolicyengine-toolspolicyengine-modal-deployment-skillpolicyengine-toolspolicyengine-simulation-mechanics-skillpolicyengineSimulation,economic_impact_analysispolicyengine-parameter-patterns-skillpolicyenginepolicyengine-us/uk/design/standards/app-skillpolicyengine-api-v2-skillpolicyengine-apiWhere several old skills merged into one, load lists are deduplicated rather than left with repeated entries. Section-name citations were updated too ("Multi-zone integration (preferred)" → "Multizone integration"; "Canonical zone config — static export" → static-export zones under the same section).
analyze-policyandgenerate-contentplugin paths move off the retired category-directory layout (skills/domain-knowledge/...-skill/→skills/<name>/). The integrator's household-payload comment now points atpolicyengine-api(which documents the v1 payload shape) and conditionally loads it; the planner's pattern table follows the skill's current A/B/C lettering with CSV folded into Pattern A. The writing skill's example PR body used two-skillnames and was modernized.Anti-rot
tests/test_no_stale_references.pygains three defenses so this class of rot is caught in CI instead of by an agent at runtime:FORBIDDENentry banning[a-z0-9-]+-skill\b(the pre-rebuild naming convention) across skills/, targets/, docs/, bundles/, presets/ — escapable per line with<!-- stale-ok -->.test_skill_invocations_resolve— every`Skill: <name>`instruction must name a directory inskills/(plugin-qualified names skipped).test_referenced_skills_paths_exist— everyskills/...path referenced in the scanned trees (including bundle manifests) must resolve on disk, expanding the{country}template; a negative lookbehind keepspolicyengine-skills/...URLs from false-matching.Verification
uv run pytest --ignore=tests/test_skill_examples.py: 71 passedSkill: policyengine-us-skill+ dead path line trips all three tests, each with a file:line messagescripts/build_claude_wrapper.py) succeeds; grep of the output finds zero-skilltokens and the dashboard agents presentsnap-bbce-repealanduk-spring-statement-2026, kept as precomputed-CSV examples, verified to exist viagh repo view🤖 Generated with Claude Code