Skills write only the restricting half of the authority envelope, so
agents pause at every step that looks consequential. Add "Grant
Permission, Don't Just Restrict": grant a known-safe loop with the
reason it is safe, keep restrictions for what deploys, sends, spends,
or escapes the working tree.
Add "Say Where the Work Ends" for the scope of done, which the existing
completion-evidence guidance did not cover, and refine the description
guidance so "lean pushy" applies to situations rather than to broad
domain nouns that overtrigger.
Wire both into SKILL.md Steps 2-3, audit dimensions 8 and 11, and
rewrite steps 6 and 8; note in capability-delta that a shared-repo skill
serves several models at once.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The skill's performance model only covered making the animation itself
cheap. It named the busy-main-thread failure twice but offered only
"move it to CSS/WAAPI", which does not help when the motion must be JS
(drag, springs, choreography) or when the cost is work co-scheduled with
the animation.
Adds a Long tasks during animation section covering the compositor vs
main thread split with frame budgets, not co-scheduling an animation
with expensive work, and time-budgeted chunking via scheduler.yield.
Adds a triage line for intermittent jank and a pointer from SKILL.md.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Drop cloud-agent install notes, collection maintenance, and Brandwriter copy so the README is title, install, catalogue, license, and footer.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Personal-products on-call playbooks modeled on Anthropic's triage plus lessons loop: wake vs defer, draft-only PRs, remote fetch for routines.
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
The improvement protocol added earlier in this branch says a rewrite
with no eval baseline ships on faith. Neither skill had one, so this PR
did. Both now carry evals/evals.json in the repo's existing shape: three
behavioural scenarios with assertions, plus should-trigger and near-miss
routing prompts, and a maintenance-only line in each SKILL.md so the
folder is not read as dead weight.
ui-verification scenarios target the skill's real decision points: an
auth-gated route that must return unknown rather than pass, a static
finding a pseudo-element hit area disproves and that must land in
consideredAndRejected rather than be dropped, and a clearing re-run that
must hold every condition identical and keep the before artifact.
agent-skills-creator scenarios target the changes this branch made:
baseline-before-rewrite and the existence question, image input versus
image output, and a skill that works in Claude Code and fails on Cursor
and on upload from the same frontmatter lines.
rule-coverage.md no longer states a total or a primary/confirming split;
those numbers went stale the next time ui-design/rules changed and
nothing validated them. The table is the coverage.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPCZUewX83HbAndmTmNRbL
"Why does the new component look off" describes a target that exists
with no change named, which is Audit's dispatch condition, so the phrase
routed two ways. Replaced with an inventory phrasing that only Extract
answers. Found by walking evaluations/merge-routing.json against the new
Modes table; none of its four scenarios route to Extract, which is the
intended result.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPCZUewX83HbAndmTmNRbL
Ran the eleven-dimension protocol over ui-verification and re-read the
whole diff. Signal density and progressive disclosure were the weak
dimensions, both from the same cause: references and gotchas repeating
what SKILL.md or a probe file already owns.
- ui-verification SKILL.md Gotchas: cut the four that a single probe file
already carries (checkVisibility, substring interception, third-party
iframes, headless fonts). The three that remain cut across probes.
Headless font substitution moved to viewport-stress, the one probe it
affects and the one that lacked it.
- evidence-output.md: the clearing re-run's three outcomes and the
SHIP VERDICT omission were restated from SKILL.md. The reference now
carries the JSON shape and points; behaviour stays in SKILL.md, which
is the layer that survives compaction.
- ui-design Extract mode: the section repeated the reference's argument
nearly verbatim. Cut to one sentence and the pointer.
- improving-existing-skills: the checklist placed the should-this-exist
decision inside Phase B while the section said before scoring. Moved
to Phase A.
Structure scored 4 and was left alone: probes/ is not a folder the
pattern reference names, but SKILL.md dispatches to it explicitly from a
catalogue table, which is the layered design the normalization table
sanctions, and folding nine probe recipes into references/ alongside
three schema files would mix two loading conditions in one folder.
validate.sh --all: 0 FAIL across all 27 skills.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPCZUewX83HbAndmTmNRbL
One thing from the ui-skills catalog clears the bar: a design-system
extraction pass (the create-design-md pattern). Everything else there is
already covered, library-specific churn, or tool-dependent.
The gap is precisely locatable in this repo. guidelines/colors.md says
"use it only if the project already does" three times in its first three
lines, and nothing establishes what the project already does, so Build
answers with a plausible default. slop-token-drift then catches the
mismatch after the fact, and only as a density heuristic: its own
precondition says that with no @theme or tailwind.config it has no scale
to drift from and must report unknown. Extract supplies the scale.
The artifact resolves the audit load contract rather than straining it.
Audit may not load guidelines/ because prescription turns a pass into a
redesign, but design-system.md records what this codebase decided rather
than what any codebase should, so reading it sharpens a drift finding
into a conformance check. That is the second sanctioned carve-out
alongside aesthetic-direction.md, and for the same reason: it cannot
supply a redesign.
Five things earn a place in the artifact: which theme source the build
actually honours, the scales as used rather than as declared, the
component inventory (shipping a second Button is worse than any token
drift), the conventions in force, and the documented exceptions so the
next audit does not re-flag a decision someone already made.
Verification closes the loop: a theme value the build overrides is one
Build will use and the browser will discard, so three scale values get
checked against computed styles and disagreements are recorded rather
than silently resolved. ui-verification gains the matching row.
Description trimmed to fit the 1024 cap: cut a duplicate "Tailwind" and
the applied-fixes clause, not the "design QA this page" trigger, which
the body's Audit row and report-only section both depend on.
validate.sh --all: 0 FAIL across all 27 skills.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPCZUewX83HbAndmTmNRbL
A skill's only mechanism is text injected at invocation, so its only
real measure is the behavior delta it produces. The protocol already
knew this ("dimensions measure form, evals measure behavior") and was
not built around it. Three consequences it was missing.
Measure before rewriting. Phase D said "rerun the evaluations", with
nothing to rerun them against: no before-run existed, so a rewrite that
improved every dimension while degrading behavior was undetectable, and
that is precisely the failure the file warned about. The eval run moves
to Phase A and Phase D diffs against it.
Ask whether the skill should still exist. A skill's value is the delta
between the model with it and without it, and only one side of that
subtraction lives in this repo. The other side moves on its own, so a
skill loses value with no edit and no signal. authoring-tips already
applies that reasoning line by line under "Don't Instruct Behavior the
Model Already Has"; nothing applied it to whole skills. New section
before the dimensions, with retirement as a terminal state, since every
other branch in the protocol ended in a rewrite.
Opinions have a dead state that ablation cannot see. A constraint dies
when the model stops needing it, which an ablation catches. An opinion
dies when the model stops following it, which shows up as nothing:
removing it regresses no scenario and the model would not produce it
unprompted, so both existing tests vote to keep a line changing
nothing. The test for an opinion is conformance, not regression, and
the fix is usually placement rather than deletion.
validate.sh --all: 0 FAIL across all 27 skills.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPCZUewX83HbAndmTmNRbL
Ran the skill's own improve-existing-skills protocol over it. Freshness
was the weak dimension: the cross-model guidance named one vendor's
tiers as if that were the model space, vision was framed as a capability
to route around, and nothing covered the hosts that now read the same
skill folder.
Kept capability-shaped rather than version-shaped, because the skill's
own anti-patterns ban model names as the reason a rule exists.
- Test Across Models: two axes, not one. Capability tier stays, and
effort level is added, since every current frontier family exposes a
reasoning-effort control the host picks and the skill does not. A step
the model only volunteers at high effort is not a step the workflow
has. Adds the portability question for cross-vendor skills.
- Constraint cut is now correctness work, not tidying: instructions
carried forward from older models are often too prescriptive and lower
output quality on current frontier models.
- Visual Analysis: image input is a default capability, so hand over the
picture rather than a description of it. Two failure modes named: an
instructed transcription step that discards what the image was for,
and assuming image output, which is not universal (several current
frontier models take images in and return only text), so a generated
image needs a named tool and an absent-tool path.
- New format-specification section, Where Skills Run: the directories
each agent reads, Claude Code-only frontmatter degrading silently
elsewhere while hard-erroring on upload, ${CLAUDE_*} left literal by
other agents, and browser hosts with no repo and no shell, where a
bash-only body is inert rather than broken. State the precondition so
it fails at step one instead of improvising through eight.
validate.sh --all: 0 FAIL across all 27 skills.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPCZUewX83HbAndmTmNRbL
Closes the gap the whole UI cluster shares: every finding was inferred
from source and no skill owned a browser session. ui-verification boots
the app and runs nine probes that measure what the rules corpus could
only predict, keyed back to the same rule ids.
Probes: axe-scan (per theme, so contrast is finally computed),
target-size (bounding box plus corner hit-testing, which kills the
pseudo-element false positive), focus-walk (scripted Tab trail, focus
ring by pixel delta, dialog trap and restoration, paste and IME),
layout-shift (attributed entries with the data response held open),
viewport-stress (320px overflow, clipped text, tripled strings),
failure-injection (500 / empty / malformed / offline, the retry-actually
-refetches assertion, mutation failures, out-of-order responses),
theme-locale-matrix, console-network, web-vitals.
Kept separate from ui-design on purpose: ui-design audits source and
owns tiering and the ship verdict, this skill owns the browser and hands
back reproduced findings, so ui-design acquires no tooling dependency
and other skills can call the same probes.
- references/rule-coverage.md maps all 48 ui-design rules: 26 primary,
16 confirming, 6 capture-only, plus what stays with other tools
- references/evidence-output.md defines only the delta on ui-design's
finding schema, which stays the single owner of the shape
- not-reproduced results become considered-and-rejected entries, and
unknown never converts to a pass
- ui-design: dispatch note for detect: rendered rules, defer-vs-dispatch
section, both rendered rules name their probe
- README: bullet, count 26 to 27, and drop two stray conflict markers
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WPCZUewX83HbAndmTmNRbL
Claude Code cloud, Cowork, and routines get them from the claude.ai
account marketplace or a per-repo settings declaration. Cursor has no
account-level equivalent, so it installs on the VM at build time.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011UVWmadwjjejUM44xxB9Ti
Makes the repo installable as a Claude Code plugin, which is how cloud
sessions and claude.ai account marketplaces can load the skills. The
plugin scans skills/ by default, so new skills need no entry here.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011UVWmadwjjejUM44xxB9Ti
Every claim in both skills was checked against the complete relevant set of bundled Next.js 16.3.0 docs, the agent-file writer source, a real ultracite init run, and a file-by-file sweep of blode-co and glide.
Doc-verified corrections:
- next/image priority is deprecated for preload in 16; the LCP guidance now follows the image and streaming guides
- Under Cache Components the existence check for a real 404 runs in proxy.ts, and redirect() mid-stream degrades to a meta tag
- Only dynamic, dynamicParams, revalidate, and fetchCache are removed segment configs; 'use cache' goes on a helper, never on GET
- Satori accepts TTF, OTF, and WOFF; ImageResponse bundles are capped at 500 KB
- HTML-limited bots skip the prerendered shell and render fully at request time
- Next writes the managed AGENTS block only when a coding agent is detected, appends it, and leaves CLAUDE.md as the one-line import
- ultracite init --skip-install writes check and fix scripts, type module, and latest ranges, and no prepare script
- create-next-app --react-compiler installs babel-plugin-react-compiler, which the Rust path makes unused
- Proxy matchers are end-anchored (tested against getMiddlewareMatchers); the docs' matcher page is wrong on this and the skill says so
- app/manifest.json is a file convention that links itself; .well-known route handlers are the documented form
Repo-derived additions: title budgets and a createPageMetadata helper with its three guards, a basePath section, feed.xml guidance, redirect ordering and load-bearing redirects, a domain-move section, footer links as a non-crawl-path, schema derived from rendered data, Offer price and availability, CSP directives for third parties and the intersection rule, route-owned backgrounds under Activity, .env.local location, node --test alias limits, the .claude/knowledge gitignore negation, a CI workflow, security.txt, verification tokens, and a metadataBase step in the scaffold.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FmYQyL5AohgWTj5v73MdQf
scaffold-nextjs:
- Move lefthook.yml to the repo root with root-scoped oxfmt and oxlint jobs; git only reads the copy next to .git, so the ultracite-generated file inside apps/web never ran
- Route root check and fix through turbo so Oxlint and Oxfmt resolve their configs from apps/web
- Install blode-icons-react and set iconLibrary in components.json before adding components
- Add --agents universal to ultracite init, a root AGENTS.md and CLAUDE.md template, and the Next 16.3 managed nextjs-agent-rules block to the workflow and validation checklist
- Correct the turbopackRustReactCompiler wording to match the 16.3 docs, add deploymentId, note that route segment configs error under cacheComponents
- Drop the redundant twitter-image.png, add opengraph-image.alt.txt, and an optional turbo-ignore vercel.json
optimise-seo:
- Document metadata merge semantics (object blocks replace, title.template does not reach og:title, no openGraph.url in the root layout) and add a metadata-merge validation row
- Lift Google preview caps and set authors and creator in the root layout
- Remove the robots host directive, emit Content-Signal only when a value is no, and show an explicit per-class allow policy
- Fix the Markdown alternate pattern: Next overwrites Vary on HTML responses, so negotiated Markdown returns a direct Response with noindex
- Add gotchas for redirect ordering and the Vercel limit, single-segment .well-known paths, CORP on the OG image, opengraph-image URLs under basePath, prerendered route handlers, and hideLogsAfterAbort
- Always escape < in JSON-LD, require schema claims to be visible in the DOM, add IndexNow, and drop HSTS preload from the example header
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FmYQyL5AohgWTj5v73MdQf
Nine auditors were cut off by an account rate limit. Eight had finished
editing; this closes what the ninth (ui-design) and the partial ones did
not reach, plus one item from an outside read.
- ui-design: Verify gains a fresh-eyes pass for Direction and Build. The
rendered captures go to a context that has not seen the code, with the
Quality Bar and reference list, for a score and the three largest gaps.
It is the one self-check worth its cost: the author's context has
already rationalised every pixel, and a reader with only the pixels has
not. Gaps are findings to act on, never a score to report.
- ui-animation: @starting-style has been Baseline since August 2024, so
the data-mounted pattern is a legacy fallback, not the default.
animation-timeline is still not Baseline, so the @supports wrapper is
required and the unwrapped state must be the readable final state.
- tidy: over-memoisation guidance now accounts for React Compiler. New
manual memo under the compiler is a finding; pre-existing memo stays,
per React's own guidance that removing it can change compiler output.
- typography-audit: the preload gotcha no longer hardcodes the rule count.
- scaffold-nextjs: turbopackRustReactCompiler is experimental in 16.3 and
Next's docs say not for production. The scaffold keeps it for the dev
startup win but says so, and names the one-line exit.
Checked and left as they were: scaffold-cli's pins match the live
agent-evals repo; multi-tenant's limits table carries sources; the
pr-babysitter script passes bash -n and shellcheck at warning level.
validate.sh --all: 0 FAIL, 26 skills. structural: 0 errors, 0 orphans.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C8kp5iUYWAJc8VDjifTF6J
Findings that crossed a skill boundary, so each auditor reported them
rather than editing another skill's folder. Includes the ones whose
auditors were cut off by a rate limit before they could write up.
Cross-references and contradictions:
- optimise-seo points back to docs-writing for what a docs site should
list in llms.txt; optimise-seo owns the route, docs-writing owns the
content.
- pr-babysitter states that its fix plan is an audit trail for one PR,
not a planning deliverable, so "plan" near a PR does not misroute.
- product-design's rule registry carries the Save, Cancel and Close
exemption to no-confirm-ok-labels that copywriting documents, so the
two no longer disagree on the same rule id.
- copywriting's translation headroom now uses the W3C length-banded
figures (200 to 300% under 10 characters) that product-design cites,
instead of a flat "roughly double".
- eli5's AI-prose list drops the unsourced 5-20x frequency claim for the
measured PubMed figure, and names copywriting as owner of the
canonical list.
Validator, from the agent-skills-creator audit:
- no-absolute-paths suggested ${CLAUDE_PLUGIN_DATA}, which is only
substituted in plugin skills; it now suggests ${CLAUDE_SKILL_DIR} and
${CLAUDE_PROJECT_DIR}.
- New frontmatter-first-line check: frontmatter is read only when --- is
the first byte, and a BOM or leading blank line loads the body with
empty metadata and no error.
- New frontmatter-portable check: Claude Code-only fields work locally
and hard-fail a claude.ai or Skills API upload, so they report as SKIP
with the consequence named.
Both new checks verified against synthetic BOM and Claude Code-only
fixtures. validate.sh --all: 0 FAIL across 26 skills, now 30 checks each.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C8kp5iUYWAJc8VDjifTF6J
Ran a per-skill audit over the whole bundle against the current Agent
Skills spec, Claude Code skill docs, and each skill's own domain sources,
then applied the fixes.
Freshness (the weakest dimension almost everywhere):
- agents-md: Claude Code reads CLAUDE.md, not AGENTS.md, so the wiring is
a CLAUDE.md containing @AGENTS.md; @import is not progressive disclosure;
Codex, Cursor and Gemini specifics corrected.
- agent-skills-creator: allowed-tools grants rather than restricts, the
portable six spec fields split from Claude Code-only fields, evals moved
to the evals/evals.json schema.
- autoship: changesets/action v2 inputs, npm OIDC trusted publishing.
- ax-audit: AI SDK 7, MCP 2025-11-25, Agent SDK permission resolution.
- optimise-seo: Next.js 16 proxy rename, Cache Components, AI-crawler
policy, FAQ rich-result removal.
- scaffold-cli, scaffold-nextjs: changesets v2, create-next-app
--no-linter and --no-agents-md, TypeScript 7 notes.
- ui-animation: package is motion with motion/react imports.
- typography-audit: text-wrap balance line caps, scoped
hanging-punctuation fallback.
- seo-program: brand-volume claim replaced with the measured Ahrefs
correlations.
Structure and routing:
- Dropped references to skills this repo does not ship
(content-strategy, ai-seo) and reconciled every sibling name.
- Rule counts reconcile: docs-writing 51, dx-audit 38, ax-audit 27.
- Descriptions rewritten for routing, all within the 1024-char spec cap.
- planning drops the HTML question form that duplicated AskUserQuestion;
codebase-architecture merges two same-moment references.
- Harness precedence stated where a bundled command overlaps
(pr-reviewer against /code-review, tidy against /simplify).
- Removed the Taste Training promo line from skill bodies; the README
still carries it for humans.
validate.sh --all: 0 FAIL across 26 skills.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C8kp5iUYWAJc8VDjifTF6J
Discarded caught errors and unstructured timestamps join the always-on
high-signal criteria; blocking sync I/O in request handlers joins the
performance checklist; stale comments get their own section in the slop
catalog, scoped to comments the diff itself falsified.
Each rule states the case where it should not fire, so it does not report
a deliberate fallback or an already-correct ISO 8601 string as a finding.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NfBQsvX8uNVaaF5tzT9q2R
* Add scroll animation and reduced motion references to ui-animation
Distilled from the animation-skills repo (animations.dev course material):
- references/scroll-animations.md: triggered vs scrubbed distinction, the
should-it-exist gate, reveal-once rules, CSS scroll-driven timelines,
parallax and scrollytelling limits, never hijack scroll
- references/reduced-motion.md: remove-motion-keep-meaning table,
useReducedMotion variant sets, MotionConfig default gotcha, picture
fallback for GIFs, hero-frame pause for loops, SSR-safe hook
- component-patterns.md: layout/layoutId gotchas (pixel borderRadius,
stale custom props, sibling layout) and auto-height measurement
- performance-deep-dive.md: property cost tiers with paint-tier swaps
(drop-shadow, clip-path inset round), busy-main-thread caveat for
Motion x/y shorthands
- SKILL.md: routes both new references, scroll anti-patterns, reduced
motion rules, scroll trigger phrases in the description
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AHYEaFZuf8TvbJfwxQ6xSD
* Make reduced motion opt-in instead of required in ui-animation
Reduced-motion support is no longer demanded: it applies only when the
project already handles it or the user asks. Review standards stop
flagging its absence, the validation checklist makes the emulation
check conditional, recipe guard blocks are declared optional, and the
reduced-motion reference reframes itself as opt-in.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AHYEaFZuf8TvbJfwxQ6xSD
* Add debugging symptom tables and SVG animation reference to ui-animation
- references/debugging-symptoms.md: symptom-indexed cause tables (feels
slow, robotic, cheap, janky, jumps, flickers) with the diagnose loop
- references/svg-animation.md: line drawing via stroke-dashoffset with
the pathLength and linecap gotchas, SVG transform-origin traps
including the Motion style override, path morphing, shakes, ambient
life with non-syncing durations
- component-patterns.md: the no-key-no-exit AnimatePresence gotcha
- SKILL.md: routes both new references, three more named curves
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AHYEaFZuf8TvbJfwxQ6xSD
* Remove all reduced motion content from skills
Deletes every reduced motion mention across the repo: the
ui-animation reduced-motion reference and its routing, the 14 media
guard blocks in transition-recipes, the review standards and remedial
clauses, the scroll-animations and gesture-drag and contextual and
vocabulary mentions, the presentation-creator web-deck guard, and the
ui-design motion-respect-reduced-motion rule (sections renumbered,
total now 48 rules across 14 categories).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AHYEaFZuf8TvbJfwxQ6xSD
---------
Co-authored-by: Claude <noreply@anthropic.com>
Ran the skill's scenarios against a six-repo fixture on Haiku and
Sonnet, neither of which had seen the skill. Both followed it end to
end, and both had to invent the same decisions. Five real defects:
1. `<Action>` was a strong tool-execution signal, and a plain toolbar's
`function Action({icon, onClick})` matched it. Same class as the
`completion`/`isStreaming` bug fixed in e10fd7b, one row down; both
models wrote themselves the guard the skill should have carried.
Now a weak signal.
2. The detection table read as an exhaustive checklist, so
`server.tool("send_invoice", ...)` and a cron reaching `runAgent(...)`
matched nothing despite being lifted verbatim from the rule files'
own anti-pattern examples. Both models extended past the table to
avoid reporting "no agentic features" over an executor. Says
illustrative now, and the missing signals are listed.
3. `unknown` conflated "could not judge" with "that layer is not in this
scope". A UI-only diff has no orchestrator, so both models crossed the
self-check's 30% unknown threshold and returned INCOMPLETE while
holding two to six established release-blockers. Step 1 asks for
exactly that narrow scope, so the skill punished the scoping it
mandates. Adds `out-of-scope` as a distinct result that the threshold
ignores.
4. No precedence when blockers and a failed self-check both hold. Both
models tie-broke to INCOMPLETE and buried the blockers. Blockers now
outrank it: established findings stay actionable, and INCOMPLETE is
reserved for an audit with no blockers and unvouchable coverage.
5. Step 3 stated the diff-wide checks unconditionally while the playbook
restricted them to PR mode, the one outright contradiction found.
Adds scenarios 6-8 as regression guards. Fixture re-verified: s1-s3
detect, s4-s6 correctly stop.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CqcidSxymPKYpoBptU5VD
Running the skill's own evaluation scenarios against a fixture repo, as
the audit protocol asks, surfaced a defect the content checks could not:
the chat detection row listed bare `completion` and `isStreaming`, and
both match ordinary non-agentic code. An onboarding widget computing
`const completion = done / total` and an upload component with an
`isStreaming` video flag both matched.
That defeats the skill's own stop condition. A settings-form PR with a
progress percentage would detect a chat surface and run the ten chat
rules against it, which is precisely the noise "No agentic features in
scope? Stop." exists to prevent, and the failure Scenario 4 describes
reached by a different door.
Drops the two weak tokens from the table, adds `chatCompletion` for the
real signal `completion` was standing in for, and states the rule: weak
signals count only alongside a strong one. Verified the six-scenario
fixture still detects s1 through s4 correctly after the change.
Adds Scenario 5 to evaluation-scenarios.md as the regression guard.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CqcidSxymPKYpoBptU5VD
c769376 compressed ship-readiness.md's Anti-patterns section from 35
lines to one, keeping the tierReason rule and dropping everything else.
Most of that trim was right: the two worked JSON examples duplicate
output-format.md, and the ui-design cross-reference survives in three
places in SKILL.md.
One piece should not have gone. The tier inflation and deflation
guardrail is now absent from the whole skill, including the
"Don't inflate tiers" gotcha in SKILL.md that carried the same warning.
ship-readiness.md is the file the auditor loads at Step 5 to assign
tiers, and the verdict flips to NOT READY on a single release-blocker,
so a tiering reference with nothing warning against inflation is the
one gap that costs the verdict its meaning.
Restores it in both places, in the compressed register the rewrite
established rather than the original bullet list, plus the "tier per
finding, not per rule" line that went with it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CqcidSxymPKYpoBptU5VD
Rewrite the hub and references so the skill matches the
agent-skills-creator audit protocol: trigger description with 27 rules,
complete IS-NOT edges, a priority table, and less duplicated theory.
Merge costume-vs-intelligence into the evolution curve. Slim the
invisible-interface essay to the four checkable arguments plus the
ones that stay in keyGap. Align rule surfaces with the playbooks that
actually run them. Add evaluation scenarios that load only when the
skill itself changes.
Co-authored-by: Matthew Blode <m@blode.co>
Static signal 5 read "fail when a path reaches the executor with neither
a boundary check nor a notification", an AND-absence that only fired
when both were gone. The rest of the rule reads the other way: the body
calls them "the two things a prompt would have given it", the dashboard
playbook says a missing notice is the defect itself, and the
escape-hatch interaction in _sections.md says to report the consent
finding when the notice is missing.
So a cron job with getStandingConsent() and no notify() passed
detection while three other places called it a defect, and that is
exactly the scenario the rule's own "What goes wrong" describes: the
policy held, nothing told the user, they found out on Monday.
Signal 5 now fails on either half and names the missing one. The tier
trigger in ship-readiness.md carried the same AND-absence phrasing and
is fixed with it.
Reported by Cursor Bugbot on #13.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CqcidSxymPKYpoBptU5VD
The template requires cross-layer pairs to list each other. The four
new rules named their neighbors; those neighbors did not name them
back. Also drop the contradictory false-positive guard on
trust-undisclosed-access-scope that said both "do not report together"
and "file both".
Co-authored-by: Matthew Blode <m@blode.co>
Merges latest main and trims the invisible-interface work from six new
rules to four, on one test: a rule must be able to move the ship verdict.
Removed, both backlog on every surface, so neither could ever enter the
verdict calculation:
- parity-not-externally-reachable. Its content is a strategy argument,
not a safety one, which is why it was backlog everywhere. It also
needed a full-sweep-only carve-out and its own SKILL.md gotcha to stop
it firing as noise on every PR. High upkeep, zero verdict impact.
- trust-transparency-as-noise. Observational, so it could only ever
return unknown on static evidence, and backlog on every surface. It
also required a never-co-fire guard against comm-no-progress-signal,
a cross-rule constraint the auditor had to carry for a finding that
changed nothing.
Both arguments survive as prose in references/invisible-interface.md,
routed to keyGap, which is where a real observation that cannot move a
verdict belongs. The mapping table now says "No rule" for each.
Kept, all code-auditable and all release-blocker on tool execution:
control-thin-approval-payload, trust-undisclosed-access-scope,
comm-unrequested-action-no-consent, parity-unstructured-tool-output.
Totals move 13/16/29 to 12/15/27 across SKILL.md, both section indexes,
the playbooks and their coverage line, the tier triggers, and README.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CqcidSxymPKYpoBptU5VD
The two new rules-arch rules judge tool return shapes, error strings,
and the API/auth surface, which is ground dx-audit's description
already claims ("an import, command, error string, exported type, or
config"). dx-audit cedes agentic-app trust to ax-audit; ax-audit had no
reciprocal edge, so a prompt about a tool surface could route either way.
Adds the edge to the description and a Related skills bullet: same
files, different reader. ax-audit asks whether an agent can operate and
recover on the surface, dx-audit whether a human finds it ergonomic.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CqcidSxymPKYpoBptU5VD
Adds six rules for the case where the product is the thing being
operated by an agent rather than the thing operating one, taking
ax-audit from 23 rules to 29.
rules-arch (11 to 13):
- parity-unstructured-tool-output: failures returned as prose with a
success status, so every caller above the tool is guessing
- parity-not-externally-reachable: capabilities no third-party agent
can reach; backlog on every surface, the stake is strategic not safety
rules-ax (12 to 16):
- control-thin-approval-payload: the gate fires correctly and shows
only the tool name, so the user approves a category, not an act
- trust-undisclosed-access-scope: what the agent can reach is never
shown, and one connector cannot be revoked without revoking all
- comm-unrequested-action-no-consent: scheduled and webhook runs reach
the executor with nobody to prompt, bypassing every interactive gate
- trust-transparency-as-noise: the first rule here that fails a product
for showing too much; cannot co-fire with comm-no-progress-signal
Wires all four playbooks, both section indexes and their cross-rule
tables, the tier triggers, and the SKILL.md gotchas. Adds
references/invisible-interface.md as the grounding file, and folds the
brand-across-surfaces argument into costume-vs-intelligence.md, where
it lands in keyGap and trustQuestion rather than becoming a rule.
Also fixes two portability bugs that made validate.sh unrunnable on
Linux: mktemp -t with no X's, and Ruby defaulting to US-ASCII with LANG
unset, which failed on emoji already present in SKILL.md.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018CqcidSxymPKYpoBptU5VD
The output template is nine fixed headings with nothing telling the writer to
drop the ones a project does not face, so a single-tenant service with no
frontend still gets a Frontend boundaries section.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MQoAgcnF7mCLpXuGLuxkbZ