336 Commits

Author SHA1 Message Date
Matthew Blode 7042d4c8dd Lead README with locked hook and star CTA (#28) 2026-09-13 16:05:09 -07:00
Matthew Blode 5f24f6a747 Update README.md 2026-09-14 06:42:35 +10:00
Matthew Blode 69ba35c1ed Update README.md 2026-09-12 20:01:37 +10:00
Matthew Blode d6363c3341 Update README.md 2026-09-12 20:01:25 +10:00
Matthew Blode f05d2de8cb Teach agent-skills-creator permission and completion scope
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>
2026-09-12 07:09:46 +10:00
Matthew Blode ec59a9a251 Add long-task scheduling guidance to ui-animation
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>
2026-09-12 07:07:24 +10:00
Matthew Blode 7898f84739 Fix rebuild-web verify against stale CDN and edge 403s (#27) 2026-09-10 17:46:03 -07:00
Matthew Blode 0144e3f4b5 Remove extra sections from README (#26)
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>
2026-09-10 02:59:07 -07:00
Matthew Blode aec0a6061f Harden rebuild-web verify against transient edge errors (#25)
Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-09-10 10:59:33 +10:00
Matthew Blode f7cf4c687a Revert "Add done-bear-oncall skill (#22)" (#24)
This reverts commit 8564efc27f.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
2026-09-08 16:57:47 -07:00
Matthew Blode 8564efc27f Add done-bear-oncall skill (#22)
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>
2026-09-08 16:34:47 -07:00
Matthew Blode 18b1ea3e2a Add portable chat-history skill (#23) 2026-09-08 16:34:16 -07:00
Matthew Blode 36c52bf9f6 Consolidate SEO audit and research into seo 2026-09-08 08:45:01 +10:00
Matthew Blode c3f250918c Verify the canonical published content URL (#21) 2026-09-07 02:55:58 -07:00
Matthew Blode 6047e05e51 Unify skill validation and require reference read evidence (#20) 2026-09-07 02:51:05 -07:00
Matthew Blode 0a639b1ef3 Move company identity skills to Brandwriter 2026-09-05 15:59:03 +10:00
Matthew Blode edd64d4781 Add brand and product judgment skills and refine copywriting 2026-09-05 15:46:42 +10:00
Matthew Blode 359fa94847 Raise skill collection quality 2026-09-05 09:51:22 +10:00
Matthew Blode ac9df85b21 Merge pull request #19 from mblode/claude/ui-verification-browser-probes-5pb84y
Add ui-verification skill, Extract mode, and an agent-skills-creator refresh
2026-09-04 15:16:50 -07:00
Claude c116b39748 Add evals for ui-verification and agent-skills-creator; drop drifting counts
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
2026-09-04 22:16:36 +00:00
Claude f2fd31f180 Fix Extract trigger that collided with Audit dispatch
"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
2026-09-04 22:00:56 +00:00
Claude c6b614750f Audit the PR against agent-skills-creator and cut the duplication it found
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
2026-09-04 21:59:26 +00:00
Claude bc6639a8e4 Add Extract mode to ui-design
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
2026-09-04 21:30:48 +00:00
Claude 1c222419ca Rework the skill-improvement protocol from first principles
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
2026-09-04 18:51:00 +00:00
Claude 6048140476 Update agent-skills-creator for the current model and host landscape
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
2026-09-04 18:45:14 +00:00
Claude 0c93f18ff6 Add ui-verification skill
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
2026-09-04 10:54:15 +00:00
Matthew Blode f7d7a28b94 Document how cloud agents install the skills
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
2026-09-04 12:51:59 +10:00
Matthew Blode 896e7b1470 Add plugin marketplace manifest
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
2026-09-04 12:45:26 +10:00
Matthew Blode 5386e6082c Point class-merging guidance at the cn package (#18)
* Point class-merging guidance at the cn package

shadcn's cn package (https://github.com/shadcn-ui/cn) replaces the
clsx + tailwind-merge wrapper, and the Blode registry's utils item now
ships it.

- scaffold-nextjs: add a step swapping the init-written wrapper for cn
- ui-design: reference the project's cn helper instead of clsx

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PsXMGT3C7grwpjmzDb2Lo7

* Drop the shadcn init swap step for cn

State the cn helper as what the scaffold has, rather than a wrapper to
replace after init.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PsXMGT3C7grwpjmzDb2Lo7

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-09-03 19:35:39 -07:00
Matthew Blode ac090cd9dc Merge pull request #17 from mblode/claude/nextjs-seo-best-practices-gdpbnd
Align scaffold-nextjs and optimise-seo with Next.js 16.3 and the reference repos
2026-09-01 18:15:26 -07:00
Claude 3020546d12 Full-coverage pass over scaffold-nextjs and optimise-seo
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
2026-09-02 01:03:25 +00:00
Claude 5f22820e28 Align scaffold-nextjs and optimise-seo with Next.js 16.3 and the blode-co and glide repos
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
2026-09-02 00:20:11 +00:00
Matthew Blode 9ede41257c Merge pull request #16 from mblode/claude/skills-audit-parallel-agents-i43iqv 2026-09-01 16:42:45 -07:00
Claude b5743a23b6 Finish the audits the rate-limited agents left and add the fresh-eyes pass
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
2026-09-01 23:28:00 +00:00
Claude 24250ec46c Apply the cross-skill findings the audit reports raised
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
2026-09-01 23:18:41 +00:00
Claude 6888e41b97 Drop the Taste Training promo from the README
The skill bodies lost it in the audit commit; this was the last copy.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01C8kp5iUYWAJc8VDjifTF6J
2026-09-01 23:13:50 +00:00
Claude a877ac0272 Audit every skill against the current spec and fix what drifted
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
2026-09-01 23:10:44 +00:00
Matthew Blode 405be0e13e Add four defect rules to pr-reviewer
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
2026-09-01 12:56:07 +10:00
Matthew Blode 0448a33fd5 Add scroll, debugging, and SVG references to ui-animation; remove reduced motion (#15)
* 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>
2026-08-31 19:39:11 -07:00
Matthew Blode cb983453aa Fix the five defects the cross-model evals surfaced
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
2026-09-01 10:09:00 +10:00
Matthew Blode e10fd7b15d Stop bare completion and isStreaming from detecting a chat surface
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
2026-09-01 10:03:07 +10:00
Matthew Blode 1552619205 Merge pull request #13 from mblode/claude/invisible-interfaces-agents-atr8si
Extend ax-audit with the invisible-interface arguments
2026-08-31 16:57:05 -07:00
Matthew Blode b6e45d14d4 Restore the tier inflation guardrail the rightsize dropped
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
2026-09-01 09:23:23 +10:00
Cursor Agent c7693766c5 Rightsize ax-audit after a first-principles skill audit
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>
2026-08-31 23:19:20 +00:00
Claude 030c72bbc4 Fail the unattended-consent rule when either control is missing
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
2026-08-31 23:18:15 +00:00
Cursor Agent c4a1387c54 Wire the new ax-audit rules back to their sibling related fields
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>
2026-08-31 23:10:05 +00:00
Claude 50390aed2c Cut the two ax-audit rules that could never change a verdict
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
2026-08-31 23:10:05 +00:00
Claude 1688472fc5 Give ax-audit an explicit boundary against dx-audit
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
2026-08-31 23:10:05 +00:00
Claude 0e7a3eb625 Extend ax-audit with the invisible-interface arguments
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
2026-08-31 23:10:05 +00:00
Matthew Blode c5765e5c19 Size the architecture brief to the decisions
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
2026-08-30 17:56:48 +10:00