Skip to content

release: spec vendoring + SHA-pin cleanup arc + 96-tool rescore#73

Merged
brettdavies merged 9 commits into
mainfrom
release/2026-05-03-spec-vendoring-and-cleanup
May 3, 2026
Merged

release: spec vendoring + SHA-pin cleanup arc + 96-tool rescore#73
brettdavies merged 9 commits into
mainfrom
release/2026-05-03-spec-vendoring-and-cleanup

Conversation

@brettdavies
Copy link
Copy Markdown
Owner

@brettdavies brettdavies commented May 3, 2026

Summary

First production release since the v0.1 launch (#60, 2026-04-30). Promotes 8 PRs from dev to main/anc.dev. Two
PRs from the post-launch batch (#61, #63) were verified as no-ops for main and skipped: both were pure docs
reorganizations into docs/research/ and docs/design/, neither of which lives on main (or should).

The headline is #64: this site is now a downstream consumer of brettdavies/agentnative (the spec repo) via a
vendored snapshot at src/data/spec/. Footer, OG card, and per-tool badges now read from three independent spec-version
sources by design (vendored, scoring, manual reconciliation), preventing the conflation that would otherwise lie about
at least one currency dimension.

Trailing the headline, this release also clears the SHA-pin cleanup arc end-to-end: render side (#66), schema side
(#69), and a fresh 96-tool rescore against brew-installed anc v0.3.0 (#70). This is the first scoring pass where every
tool's anc.commit is null by construction (no .git/ in the brew cellar).

Changelog

Added

  • Vendored agentnative spec snapshot at src/data/spec/ (VERSION, CHANGELOG.md, all 7 principles, README.md).
    Site is now a true downstream consumer of the canonical spec repo.
  • scripts/sync-spec.sh: manual remote-first vendoring with local-fallback.
  • scripts/SYNCS.md: single-page cross-repo sync map (CLI / spec / skill in, scorecards / Cloudflare out).

Changed

  • Footer, per-tool badges, and OG card pull from three distinct spec-version sources (SITE_SPEC_VERSION,
    scorecard.spec_version, anc's self-scorecard spec_version). Each tracks its own currency dimension.
  • anc is now brew-installed inside the scoring docker image (replaces the local-cargo-build-from-checkout path that
    produced wrong-SHA scorecards).
  • All 96 tool scorecards regenerated against brew-installed anc v0.3.0 (chore(scorecards): rescore all 96 tools with brewed anc v0.3.0 #70). Supersedes the v0.2.0 baseline shipped
    at v0.1 launch. First scoring pass where every anc.commit is null by construction.

Removed

  • Skill SHA-pin enforcement surface (source.commit, verify block) from /skill.json and the build validator. Update
    detection now uses the skill bundle's bin/check-update against main on GitHub.
  • anc.commit field from the scorecard schema documentation and invariant tests (chore(scorecards): drop anc.commit from schema + tests; add triple-diff to release runbook #69). The field is no longer emitted
    by agentnative-cli or surfaced in any rendered scorecard. Pairs with the upstream cleanup in agentnative-cli.

Fixed

Documentation

Type of Change

  • feat: New feature (non-breaking change which adds functionality)

The release is multi-typed (feat + fix + chore + docs) but feat headlines because spec vendoring is the largest
user-facing surface.

Related Issues/Stories

Testing

  • Unit tests added/updated
  • All tests passing

Test Summary:

  • 200 / 0 fail unit + regression tests pass on the release branch (pre-push hook verified)
  • bun run build clean: 111 pages, 97 scorecards, 96 badges
  • Staging at agentnative-site-staging.brettdavies.workers.dev already verified post-each-PR-merge: /skill.json has
    no source.commit/verify; per-tool scorecard pages render the Anc build row as version-only (no commit link)
  • Skill-distribution e2e probe (the test that motivated this release; see deep-check failure 2026-05-02 06:49 UTC) will
    go green on next deep-check after merge: the assertion that fails on main is removed by chore(skill): drop deprecated SHA-pin enforcement surface #67.

Files Modified

Modified:

Created:

Renamed:

  • 7 scorecard files renamed in chore(scorecards): rescore all 96 tools with brewed anc v0.3.0 #70 to track upstream version bumps: act-v0.2.87.jsonact-v0.2.88.json;
    anc-v0.2.0.jsonanc-v0.3.0.json; claude-code-v2.1.123.jsonclaude-code-v2.1.126.json;
    flyctl-v0.4.44.jsonflyctl-v0.4.45.json; ollama-v0.22.0.jsonollama-v0.22.1.json; opencode-v1.14.30.json
    opencode-v1.14.31.json; starship-v1.25.0.jsonstarship-v1.25.1.json.

Deleted:

  • None.

Key Features

Benefits

  • Honest version surfaces. Each spec-version display tracks its own currency dimension; no more conflation.
  • Schema-render coherence. /skill.json shape now matches the documented update model (bin/check-update against
    main); per-tool scorecard pages no longer link incorrect SHAs.
  • Dead-ceremony reduction. Skill releases no longer think about a SHA bump that doesn't carry a contract.
  • Release-runbook hardening. Triple-diff and status-check pitfall both came from real-world misses; both are now
    permanent runbook entries.

Breaking Changes

  • No breaking changes for end users.

/skill.json loses source.commit and the verify object. Agents that read these advisory fields will see them
missing rather than wrong; consumers that don't read them are unaffected. agentnative-cli's
src/skill_install/skill.json fixture pulls from this repo's source-of-truth, so its skill-fixture-drift workflow
will surface the shape change on its next PR. Coordinated CLI-side update should land in lockstep.

Deployment Notes

  • No special deployment steps required.

After deploy:

  • https://anc.dev/skill.json will lose source.commit and the verify object.
  • Per-tool scorecard pages on anc.dev will no longer render commit links.
  • anc.dev/score/anc will display anc v0.3.0 (was v0.2.0).
  • Footer / OG card / badges continue to display version labels (now from the vendored spec source).

Skipped from this release (verified no-op for main)

Checklist

  • Code follows project conventions and style guidelines
  • Commit messages follow Conventional Commits
  • Self-review of code completed
  • Tests added/updated and passing
  • No new warnings or errors introduced
  • Changes are backward compatible

Additional Context

docs/research/ and docs/design/ are intentionally excluded from main. They hold research material that lives on
dev only. The central reusable workflow at brettdavies/.github/.github/workflows/guard-main-docs.yml already
enforces this for docs/research/ and docs/ideation/ alongside docs/plans|brainstorms|solutions|reviews/.

)

## Summary

PR #61 moved shipped artifacts (`foundation.css`, `og.html`, `og.css`)
out of `docs/design/` and research/concept work
into `docs/research/design/`, but left stale references to the old paths
in:

- `docs/DESIGN.md` — 17+ refs (would 404 on github.com when browsed on
`main`).
- `scripts/og/og.css` — internal header comment block.
- `tests/e2e/flows.e2e.ts` — single comment ref.

This PR fixes all three. Surfaced by the audit pass on PR #60 (release).

## Changelog

### Documentation

- Rewrite `docs/DESIGN.md` companion-artifacts intro to reflect the
shipped (`src/styles/`, `scripts/og/`) vs research
(`docs/research/design/`) split. Update all in-body path references.
Research-only artifacts are referenced by name
only — `docs/research/` is gated off `main`, so a link would 404 on
production.

## Type of Change

- [ ] `feat`: New feature (non-breaking change which adds functionality)
- [ ] `fix`: Bug fix (non-breaking change which fixes an issue)
- [ ] `refactor`: Code refactoring (no functional changes)
- [ ] `perf`: Performance improvement
- [x] `docs`: Documentation update
- [ ] `test`: Adding or updating tests
- [ ] `chore`: Maintenance tasks (dependencies, config, etc.)
- [ ] `ci`: CI/CD configuration changes
- [ ] `style`: Code style/formatting changes
- [ ] `build`: Build system changes
- [ ] `BREAKING CHANGE`: Breaking API change (requires major version
bump)

## Related Issues/Stories

- Story: PR #60 audit found stale refs surviving the #61 layout split.
- Issue: n/a
- Architecture: n/a (pure docs/comments).
- Related PRs: #61 (the split), #60 (release — re-syncs from `dev` once
this lands so the fixes ride along).

## Testing

- [x] Unit tests added/updated
- [x] Integration tests added/updated
- [x] Manual testing completed
- [x] All tests passing

**Test Summary:**

- Lint: biome (37 files) + markdownlint (11 files) — 0 errors.
- Build: 111 pages, 97 scorecards, 96 badges, 0 orphans (unchanged).
- Tests: 205 / 0 fail (unchanged).
- Final grep for `docs/design` across the shipped tree: 0 hits.

## Files Modified

**Modified:**

- `docs/DESIGN.md` — intro rewritten + 17+ inline refs updated.
- `scripts/og/og.css` — header comment block.
- `tests/e2e/flows.e2e.ts` — one comment line.

**Created:**

- None.

**Renamed:**

- None.

**Deleted:**

- None.

## Key Features

- No code or build behavior change. Pure reference cleanup.

## Deployment Notes

- No runtime impact. Deploy is a no-op for `dev` (docs-only via
paths-ignore).

## Reviewer Checklist

- `git grep "docs/design" docs/DESIGN.md` returns nothing.
- `bun run build` and `bun test` both pass (no behavioral surface
touched).
…#64)

## Summary

Wires `agentnative-spec` into the site as a vendored snapshot, and lands
a **three-source spec-version model** that
fixes the v0.1.0 footer drift visible on anc.dev since the v0.1 launch.

The site now has three distinct spec-version concepts because vendoring
(we got a snapshot), scoring (anc was compiled
against this spec), and site reconciliation (the prose has been updated
to match) are three independent events that
move at different cadences. Each visible-on-prod surface pulls from the
source that's correct for its event:

- **Footer** ← `content/principles/VERSION` (the spec version the site's
prose has been reconciled to). Bumped
manually by the contributor who reconciles `content/principles/p*-*.md`.
Honest claim of currency — lags vendoring
  on purpose during the manual reconciliation window.
- **Per-tool badges** ← each scorecard's own `spec_version` field (the
spec the CLI was compiled against to produce
  that scorecard).
- **OG card** ← anc's self-scorecard's `spec_version` (matches the
per-tool badge convention).
- **Vendored `SPEC_VERSION`** ← `src/data/spec/VERSION` (whatever
`sync-spec.sh` last fetched). NOT used for any
  user-visible surface — kept as a reference / diff target.

Implements `docs/plans/2026-04-23-001-feat-sync-spec-plan.md` U1–U4.
Plan was refreshed mid-execution (commit
`7afd0c4` on dev) to reflect the three-source design refinement, the
v0.3.0 pin, and the dispatch-already-fires
discovery from the cross-repo SYNCS-doc audit earlier in the session.

## Changelog

### Fixed

- Site footer and OG card now display the actual spec version (`v0.3.0`)
instead of the stale `v0.1.0` literal that
  shipped with the v0.1 launch.
- Per-tool badge SVGs label with each scorecard's `spec_version` (the
spec the CLI was compiled against for that
  scorecard), instead of a global default.

### Added

- `./scripts/sync-spec.sh` — vendors the latest `agentnative-spec` v*
tag into `src/data/spec/`. Remote-first with
  local checkout fallback.

## Type of Change

- [x] `feat`: New feature (non-breaking change which adds functionality)
- [x] `fix`: Bug fix (non-breaking change which fixes an issue)
- [ ] `refactor`: Code refactoring (no functional changes)
- [ ] `perf`: Performance improvement
- [x] `docs`: Documentation update
- [ ] `test`: Adding or updating tests
- [ ] `chore`: Maintenance tasks (dependencies, config, etc.)
- [ ] `ci`: CI/CD configuration changes
- [ ] `style`: Code style/formatting changes
- [ ] `build`: Build system changes
- [ ] `BREAKING CHANGE`: Breaking API change (requires major version
bump)

## Related Issues/Stories

- Story: `docs/plans/2026-04-23-001-feat-sync-spec-plan.md` (refreshed
on dev as commit `7afd0c4` mid-execution).
- Issue: n/a
- Architecture: cross-repo version model at
`docs/solutions/best-practices/agentnative-version-model-2026-05-01.md`
(refreshed in solutions-docs commits `bf83c71`, `47c84b2` mermaid,
`7201181` three-source model). Governing
pattern:
`docs/solutions/best-practices/cross-repo-artifact-consumption-static-sites-2026-04-21.md`.
Sibling
reference impl: `~/dev/agentnative-cli/scripts/sync-spec.sh` (plan
`2026-04-23-001-feat-spec-vendor-plan.md`,
  status: completed).
- Related PRs:
- `agentnative-skill` PR #11 (commit `3c3ebb6`) — deprecated SHA-pinning
across the skill repo's shipping content;
the site's lagging SHA-pin removal is captured as P0 todo
`019-pending-p0-remove-skill-sha-pinning.md` (gitignored).
- solutions-docs commit `7201181` — paired refresh of the version-model
doc.

## Testing

- [x] Unit tests added/updated
- [x] Integration tests added/updated
- [x] Manual testing completed
- [x] All tests passing

**Test Summary:**

- Unit/regression tests: 206 passing / 0 fail / 568 expect calls (was
205 before this PR; new
`tests/build.test.ts` assertion verifies footer renders
`v${SITE_SPEC_VERSION}` and guards against the `v0.1.0`
  stub returning).
- Lint: Biome (37 files clean) + markdownlint (19 files clean — adds
`src/data/spec/CHANGELOG.md` to the exclusion
list, since it's vendored from spec where the line-length config is more
permissive).
- Build: 111 HTML pages, 111 MD pages, 7 extras, 97 scorecards, 96 badge
SVGs, 0 orphans.
- Wrangler dry-run: 367 assets, 237 KiB upload (28 KiB gzip).
- Manual: ran `./scripts/sync-spec.sh` end-to-end (remote-first path
verified — vendored v0.3.0 / `5cea8bf`); ran
`bun run og` — OG card regenerated showing `v0.3.0` from anc's
self-scorecard; spot-checked
  `dist/index.html` footer renders `<span>v0.3.0</span>`.
- Regression-test fix: `tests/regression.test.ts` test #6 (install-page
dedup) now excludes `src/data/spec/` from
its grep — vendored CHANGELOG legitimately mentions install commands;
the test's intent was the install-page dedup,
  not preventing spec mentions.

## Files Modified

**Modified:**

- Build: `src/build/util.mjs` (adds `SITE_SPEC_VERSION` export +
`readVersionFile` helper; `SPEC_VERSION` reads
vendored file at module load), `src/build/shell.mjs` (footer renders
`v${SITE_SPEC_VERSION}`), `src/build/build.mjs`
  (badge call passes `scorecard.spec_version` explicitly).
- Scripts: `scripts/og/generate.ts` (reads anc's self-scorecard
`spec_version`; drops the
  regex-from-shell.mjs hack and the `SHELL_MJS` constant entirely).
- Tests: `tests/build.test.ts` (new footer-renders-vendored-version
assertion), `tests/regression.test.ts`
  (`src/data/spec/` exclusion on regression #6).
- Config: `package.json` (markdownlint exclusion for vendored
`src/data/spec/CHANGELOG.md`).
- Docs: `AGENTS.md` (paragraph explaining the three sources),
`public/og-image.png` (regenerated; card now reads
  `v0.3.0`).

**Created:**

- `scripts/sync-spec.sh` — remote-first, latest-tag auto-pick, `git show
<tag>:<path>` extraction (no working-tree
perturbation), AGENTS.md filter on principles enumeration.
shellcheck-clean.
- `scripts/SYNCS.md` — cross-repo sync map for this repo (was untracked
from the 2026-05-01 audit; ships with this
PR). Includes mermaid diagrams for the bidirectional data map and the
three-source spec-version flow.
- `src/data/spec/VERSION` — vendored spec version (`0.3.0`).
- `src/data/spec/CHANGELOG.md` — vendored spec changelog.
- `src/data/spec/principles/p1..p7.md` — vendored structured principle
files (machine-readable frontmatter; diff
  target only, NOT consumed by site rendering).
- `src/data/spec/README.md` — explains the three-version model, the
manual reconciliation workflow, and the
  bump-`content/principles/VERSION`-LAST gate.
- `content/principles/VERSION` — single-line site reconciliation marker
(initial value `0.3.0`, matches current
  state since the site copy is reconciled to v0.3.0).

**Renamed:**

- None.

**Deleted:**

- None.

## Key Features

- **Single-step spec resync**: `./scripts/sync-spec.sh` (no env vars
needed in the happy path) pulls the latest
`agentnative-spec` tag and rewrites `src/data/spec/`. Operator never
needs a local spec checkout.
- **Three-source spec-version model**: visible-on-prod surfaces stop
conflating "what we vendored" with "what the
site's prose has been reconciled to" with "what anc was compiled
against". Each surface tells the truth about its
  own event.
- **`content/principles/VERSION` as the reconciliation gate**: the
contributor who reconciles
`content/principles/p*-*.md` after a spec bump is the one who flips the
footer. Bumping before reconciliation lies
  to visitors; the workflow now makes this explicit.
- **`src/data/spec/README.md`**: explains all of the above in one place,
co-located with the data it describes.

## Benefits

- **Honest currency claims** on prod. Footer no longer drifts behind the
spec; OG card no longer drifts behind anc.
- **Reduced cognitive load** for spec releases —
`./scripts/sync-spec.sh` is one command, no env vars needed in the
  happy path, automatic latest-tag resolution.
- **Foundation for future spec-driven features**: vendored
`principles/p*-*.md` is now available as a build input
for future consumers (`/llms-full.txt` regen, coverage cross-refs,
etc.). Not consumed yet, but the data is
  in-tree.

## Breaking Changes

- [x] No breaking changes
- [ ] Breaking changes described below:

## Deployment Notes

- [x] No special deployment steps required
- [ ] Deployment steps documented below:

Standard pipeline: squash-merge to `dev` → `deploy.yml` publishes to the
staging Worker
(`agentnative-site-staging.*.workers.dev`). Promotion to `anc.dev`
follows the standard `release/*` flow per
RELEASES.md. After production deploy, sanity-check `curl -s
https://anc.dev/ | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+'`
returns `v0.3.0` (current `content/principles/VERSION`).

## Screenshots/Recordings

`public/og-image.png` regenerated; the version label now reads `v0.3.0`
(was `v0.1.0`). Visible inline in the diff.

## Checklist

- [x] Code follows project conventions and style guidelines
- [x] Commit messages follow [Conventional
Commits](https://www.conventionalcommits.org/)
- [x] Self-review of code completed
- [x] Tests added/updated and passing
- [x] No new warnings or errors introduced
- [x] Changes are backward compatible (or breaking changes documented)

## Additional Context

**Mid-execution design refinement.** The plan as filed scoped only U1–U3
(vendor data + docs) with footer wiring
deferred. During execution, two things shifted scope:

1. The visible-on-prod `v0.1.0` footer drift made the data-vendoring
useless without a consumer; U4 was promoted
   into scope.
2. The user proposed the three-source design (vendored ≠ reconciled ≠
scored) mid-execution, which materially
improved on the original "footer reads SPEC_VERSION" approach. The plan
was refreshed (dev commit `7afd0c4`)
before the corresponding code landed; the SPEC_VERSION/SITE_SPEC_VERSION
distinction baked itself into U4's
   commit (`7e5765d`).

**Cross-repo coordination.** During this session's earlier SYNCS-doc
audit, four sibling repos got cross-repo sync
maps (3 still untracked locally per the do-not-commit directive; site's
was committed via U3 here). The version-model
solution doc was also added (and refreshed for the three-source model)
in solutions-docs.

**Skill SHA-pinning P0 todo.** Created
`019-pending-p0-remove-skill-sha-pinning.md` (gitignored) capturing the
follow-up work: agentnative-skill PR #11 (commit `3c3ebb6`, 2026-04-29)
deprecated SHA-pinning across the skill
repo's shipping content; the site is the lagging repo and still carries
`source.commit` validation in
`src/build/skill.mjs`. Out of scope for this PR; tracked.
## Summary

The "Reproduce locally" code block in each per-tool scorecard's markdown
twin (`/score/<tool>.md`) was emitted with a
bare ` ``` ` fence, so markdown renderers treated the command as plain
text. Tag the fence ` ```bash ` so Shiki
(build-time) + GitHub + hosted previews fetched over the `.md`
content-negotiation channel all syntax-highlight the
shell command.

The HTML twin (rendered via the CommonMark pipeline) was already styled
through the badge-callout block above; this
aligns the `.md` twin with the same visual signal on the channels that
consume the markdown directly.

## Changelog

### Fixed

- Per-tool scorecard markdown (`/score/<tool>.md`) now tags the
"Reproduce locally" code block as `bash` so
renderers syntax-highlight the `anc check --command <tool>` invocation
instead of rendering it as plain text.

## Type of Change

- [ ] `feat`: New feature (non-breaking change which adds functionality)
- [x] `fix`: Bug fix (non-breaking change which fixes an issue)
- [ ] `refactor`: Code refactoring (no functional changes)
- [ ] `perf`: Performance improvement
- [ ] `docs`: Documentation update
- [ ] `test`: Adding or updating tests
- [ ] `chore`: Maintenance tasks (dependencies, config, etc.)
- [ ] `ci`: CI/CD configuration changes
- [ ] `style`: Code style/formatting changes
- [ ] `build`: Build system changes
- [ ] `BREAKING CHANGE`: Breaking API change (requires major version
bump)

## Related Issues/Stories

- Story: cosmetic markdown-rendering bug spotted on the live
`/score/<tool>.md` channel.
- Issue: n/a
- Architecture: n/a (one-line emitter change).
- Related PRs: #64 (the spec-vendoring + version-model PR that just
landed; unrelated except both touch
  scorecard-rendering pipeline).

## Testing

- [x] Unit tests added/updated
- [ ] Integration tests added/updated
- [x] Manual testing completed
- [x] All tests passing

**Test Summary:**

- Unit/regression tests: 206 passing / 0 fail / 569 expect calls (was
568; new assertion in
`tests/build.test.ts` confirms the ` ```bash ` fence wraps the
synthesized invocation).
- Lint: Biome (37 files clean) + markdownlint (19 files clean).
- Build: 111 HTML pages, 111 MD pages, 7 extras, 97 scorecards, 96 badge
SVGs, 0 orphans (unchanged).
- Manual: spot-checked `dist/score/anc.md` — fence now reads ` ```bash
`.

## Files Modified

**Modified:**

- `src/build/scorecards-render.mjs` — one-character change: ` ``` ` → `
```bash ` on the "Reproduce locally" fence.
- `tests/build.test.ts` — new regression assertion preventing silent
removal of the `bash` tag.

**Created:**

- None.

**Renamed:**

- None.

**Deleted:**

- None.

## Key Features

- Cosmetic markdown channel parity with the HTML render. No code-path or
runtime change.

## Breaking Changes

- [x] No breaking changes
- [ ] Breaking changes described below:

## Deployment Notes

- [x] No special deployment steps required
- [ ] Deployment steps documented below:

Standard pipeline: squash-merge to `dev` → `deploy.yml` publishes to
staging Worker
(`agentnative-site-staging.*.workers.dev`). Promotion to `anc.dev`
follows the standard `release/*` flow per
RELEASES.md.

## Checklist

- [x] Code follows project conventions and style guidelines
- [x] Commit messages follow [Conventional
Commits](https://www.conventionalcommits.org/)
- [x] Self-review of code completed
- [x] Tests added/updated and passing
- [x] No new warnings or errors introduced
- [x] Changes are backward compatible
…66)

## Summary

Per-tool scorecard pages have been linking `anc.commit` to a commit URL
on `agentnative-cli` that points at whatever
branch the operator's local CLI checkout was on at compose-build time —
not at a release commit. This PR closes the
gap on both ends:

1. The scoring docker image installs `anc` via `brew install
brettdavies/tap/agentnative` (parity with every other
tool already brewed). No more `cargo build` from the operator's local
checkout, no more operator-state coupling,
   no more wrong-SHA risk by construction.
2. The per-tool scorecard pages render `anc.version` only — the
abbreviated commit link is gone. Today's wrong-SHA
links disappear immediately; any future build-time drift never surfaces
to a viewer.

The 96 existing scorecards are not regenerated as part of this PR —
their stale `anc.commit` values stay in the JSON,
ignored at render time. The `anc.commit` field itself stays in the
schema; its removal is deferred to a future
scorecard schema revision.

## Changelog

### Fixed

- Per-tool scorecard pages no longer link to an incorrect commit SHA on
the agentnative-cli repo.

### Changed

- `anc` is now brew-installed inside the scoring docker image (replaces
a local `cargo build` path).

## Type of Change

- [x] `fix`: Bug fix (non-breaking change which fixes an issue)

## Related Issues/Stories

- Story: n/a
- Issue: n/a
- Architecture:
\`docs/plans/2026-05-01-001-fix-brew-anc-strip-sha-render-plan.md\`
(committed to dev directly per the planning-doc exception)
- Related PRs: \`chore/remove-skill-sha-pinning\` — sibling cleanup,
same theme of removing dead SHA-pin ceremony

## Testing

- [x] Unit tests added/updated
- [x] All tests passing

**Test Summary:**

- 204/204 unit + regression tests pass (consolidated three
commit-related render tests into one)
- \`bun run build\` clean
- Visual verification: \`dist/score/anc.html\` renders \`<dt>Anc
build</dt><dd>0.2.0</dd>\` (was \`0.2.0 <a class=\"anc-build__commit\"
href=\"…/commit/06a307c\"><code>06a307c</code></a>\`)
- Audit: \`grep -c 'agentnative-cli/commit' dist/score/*.{html,md}\`
returns zero across all 97 scorecard pages

## Files Modified

**Modified:**

- \`docker/score/Dockerfile\` — replace \`COPY\` of staged \`anc\`
binary with \`brew install brettdavies/tap/agentnative\`
- \`docker/score/build.sh\` — drop \`cargo build\` preamble +
\`ANC_CLI_ROOT\` plumbing; collapses to image build + optional \`--run\`
- \`docker/score/README.md\` — update layout, prereqs, layer order,
update workflow to reflect the brew-install path
- \`src/build/scorecards-render.mjs\` — \`renderAncBuildHtml\` and
\`renderAncBuildMarkdown\` collapse to version-only;
\`ANC_COMMIT_SHA_RE\`, \`ANC_REPO_URL\`, and the allowlist comment block
removed
- \`tests/build.test.ts\` — three commit-related render tests
consolidate into one (\`Anc build renders version-only regardless of
commit field shape\`); markdown-twin assertion drops the linked-commit
form
- \`content/scorecard-schema.md\` — \`anc.commit\` field row notes the
field is captured but no longer surfaced

**Created:** None.

**Renamed:** None.

**Deleted:** None.

## Key Features

n/a — bug fix + docker simplification, no new features.

## Benefits

- **Correctness**: scorecards no longer link to incorrect commits.
- **Operator state decoupling**: docker image always uses a published
release, regardless of the operator's local CLI checkout state.
- **Schema-render coherence**: schema doc accurately describes what's
rendered today.
- **Dead-ceremony reduction**: the SHA-allowlist regex, the GitHub URL
constant, and the XSS-defense test for the URL-construction path all go
away alongside the path itself.

## Breaking Changes

- [x] No breaking changes

The \`anc.commit\` JSON-schema field stays for back-compat. Existing
scorecards are not regenerated.

## Deployment Notes

- [x] No special deployment steps required

The next time \`bash docker/score/build.sh --run\` is invoked,
scorecards will emit \`anc.commit: null\` (brewed binary
has no \`.git/\` checkout, so \`build.rs\` hits the
\`released-from-tarball case\`). This is expected and matches the
schema-doc note added in this PR.

## Screenshots/Recordings

n/a — text-only render change. The visible diff:

Before: \`**Anc build:** 0.2.0
([06a307c](https://github.com/brettdavies/agentnative-cli/commit/06a307c))\`

After: \`**Anc build:** 0.2.0\`

## Checklist

- [x] Code follows project conventions and style guidelines
- [x] Commit messages follow [Conventional
Commits](https://www.conventionalcommits.org/)
- [x] Self-review of code completed
- [x] Tests added/updated and passing
- [x] No new warnings or errors introduced
- [x] Changes are backward compatible

## Additional Context

The plan for this work lives at
\`docs/plans/2026-05-01-001-fix-brew-anc-strip-sha-render-plan.md\`
(committed
directly to \`dev\` per the planning-doc exception in \`RELEASES.md\`).
## Summary

Removes the dead SHA-pin enforcement surface for the `agent-native-cli`
skill. The pin was deprecated upstream in
[`agentnative-skill` PR
#11](brettdavies/agentnative-skill#11)
(2026-04-29) when update
detection moved to the skill bundle's `bin/check-update` (compares the
local bundle's `VERSION` against `main` on
GitHub). The site repo carried the full enforcement surface — manifest
fields, build validation, schema docs,
release runbook, tests, e2e probe, prose — as dead ceremony that
surfaced on every skill release as a SHA bump that
no longer carried a contract.

Audit assertion: across shipping content (excluding `docs/plans/`,
`docs/brainstorms/`, `docs/reviews/`,
`docs/solutions/`, `CHANGELOG.md`), zero matches remain for
`source.commit`, `verify.expected`, `COMMIT_RE`,
`47a76cce…`, `re-pin`, `pinned commit`, `pinned at commit`, or `commit
pin`. The four surviving SHA references in
shipping content are unrelated domains (scorecard `anc.commit`
rendering, font supply chain, CLI registry version
parsing) and intentionally untouched.

## Changelog

### Removed

- Skill SHA-pin fields (`source.commit`, `verify` block) and their
build-time enforcement.

### Changed

- Skill-release procedure no longer requires a manifest re-pin; updates
are detected by the skill bundle's
  `bin/check-update` against `main` on GitHub.

## Type of Change

- [x] `chore`: Maintenance tasks (dependencies, config, etc.)

## Related Issues/Stories

- Story: n/a
- Issue: n/a
- Architecture: agentnative-skill PR #11 (the upstream deprecation that
this site-side PR completes)
- Related PRs: #66 (\`fix/scorecard-anc-render\` — sibling cleanup, same
theme of removing dead SHA-pin ceremony)

## Testing

- [x] Unit tests added/updated
- [x] All tests passing

**Test Summary:**

- 203/203 unit + regression tests pass (4 SHA-pin-specific assertions
deleted; no new failures)
- \`bun run build\` clean
- E2E \`skill\` Playwright project structurally untouched — the two
pin-freshness checks (HEAD == \`source.commit\`,
remote-HEAD == \`source.commit\`) are dropped; the
install-clone-lands-\`SKILL.md\` check stays

## Files Modified

**Modified:**

- \`src/data/skill.json\` — \`source.commit\` and \`verify\` object
removed
- \`src/build/skill.mjs\` — \`COMMIT_RE\`, verify validation,
\`REQUIRED_VERIFY\` list, "pinned at commit" prose, \`## Verify\`
markdown section all removed
- \`docs/DESIGN.md\` §3.9 — schema-table rows for \`source.commit\` and
\`verify.*\` removed; build-validation prose, source-repo-coupling
paragraph, release runbook bullet updated
- \`RELEASES.md\` §"Skill releases" — re-pin step rewritten as
conditional manifest bump
- \`scripts/SYNCS.md\` — re-pin language scrubbed from the skill-release
flow + reference list
- \`tests/build.test.ts\` — non-hex / uppercase-hex commit rejection
tests + \`source.commit\` / \`verify\` fixture fields removed
- \`tests/regression.test.ts\` — \`source.commit\` / \`verify.expected\`
invariants removed; required-keys list updated
- \`tests/e2e/skill.e2e.ts\` — pin-freshness checks dropped (HEAD ==
\`source.commit\` and remote-HEAD == \`source.commit\`)

**Created:** None.

**Renamed:** None.

**Deleted:** None.

## Key Features

n/a — pure removal of dead enforcement surface.

## Benefits

- **Dead-ceremony reduction**: skill releases no longer think about a
SHA bump that doesn't carry a contract.
- **Schema-render coherence**: \`/skill.json\`'s shape now matches the
documented update model (\`bin/check-update\` against \`main\`).
- **Release-runbook simplification**: \`RELEASES.md\` skill-release
procedure becomes a conditional manifest bump rather than a mandatory
re-pin step.

## Breaking Changes

- [x] No breaking changes (consumer-side)

\`agentnative-cli\`'s \`src/skill_install/skill.json\` fixture pulls
\`src/data/skill.json\` from this repo. The shape
change here will surface in CLI's \`skill-fixture-drift\` workflow on
its next PR — coordinated CLI-side update should
land in lockstep.

## Deployment Notes

- [x] No special deployment steps required

After deploy, \`https://anc.dev/skill.json\` will lose \`source.commit\`
and the \`verify\` object. The
\`schema_version: 1\` field stays — agents reading the JSON should
already tolerate field removal within v1 since
the schema doc described \`verify.expected\` as advisory only.

## Checklist

- [x] Code follows project conventions and style guidelines
- [x] Commit messages follow [Conventional
Commits](https://www.conventionalcommits.org/)
- [x] Self-review of code completed
- [x] Tests added/updated and passing
- [x] No new warnings or errors introduced
- [x] Changes are backward compatible (consumer-side; cross-repo
coordination noted above)

## Additional Context

This PR ships in parallel with #66 (\`fix/scorecard-anc-render\`) —
sibling cleanup of skill-shaped SHA-pin ceremony
that lived in the scorecard render. The two branches were cut
independently to keep concerns tight; either can
land first.
…ff to release runbook (#69)

## Summary

Two threads landing together — schema-side cleanup paired with the
agentnative-cli companion change, plus the
triple-diff verification we used today getting promoted from "ad-hoc
command we ran once" to "documented runbook
step every release uses."

## Changelog

### Removed

- \`anc.commit\` from the scorecard schema documentation and invariant
tests. The field is no longer emitted by
agentnative-cli (companion change) or surfaced in any rendered
scorecard. Existing scorecards retain their values
until next regen but the field is no longer part of the documented
schema contract.

### Documentation

- Release runbook now uses a triple-diff verification (main → release /
release → dev / dev → main) plus a
patch-id cherry sweep, replacing the original single-axis leaked-paths
check. Catches both directions of drift:
  guarded paths leaking IN and real feature commits being missed OUT.

## Type of Change

- [x] \`chore\`: Maintenance tasks (dependencies, config, etc.)
- [x] \`docs\`: Documentation update

## Related Issues/Stories

- Story: Pairs with agentnative-cli companion change (in-flight) that
drops \`ANC_COMMIT\` from \`build.rs\` and stops emitting
\`"anc.commit"\` in the JSON envelope.
- Issue: n/a
- Architecture: n/a
- Related PRs: #66 (render-side anc.commit strip — shipped to dev), #68
(release/2026-05-01-spec-vendoring-and-cleanup — open to main; this PR
cherry-picks into it).

## Testing

- [x] Unit tests added/updated
- [x] All tests passing

**Test Summary:**

- 200 / 0 fail unit + regression tests pass (was 201 — dropped the
now-irrelevant \`admits null anc.commit\` test).
- \`bun run build\` clean.

## Files Modified

**Modified:**

- \`content/scorecard-schema.md\` — \`commit\` row removed from \`anc\`
table; trailing prose simplified; top-level JSON example updated.
- \`tests/build.test.ts\` — \`expect(entry.metadata.anc.commit)\`
assertion dropped from the \`loadScoredTools\` happy-path test;
\`'admits null anc.commit (build outside a git checkout)'\` test block
dropped entirely.
- \`RELEASES.md\` — release-runbook \`Releasing dev to main\` section:
triple-diff procedure + guarded-paths regex sweep + \`git cherry\`
patch-id check, with squash-merge false-positive triage notes.

**Created:** None.
**Renamed:** None.
**Deleted:** None.

## Breaking Changes

- [x] No breaking changes for end users.

The schema field removal lands in lockstep with the CLI's emission
removal. Until both ship to main, existing
agents/consumers that read \`anc.commit\` will continue seeing it —
after both ship, the field will simply be missing
from new scorecards (no rename, no aliasing, just absence).

## Deployment Notes

- [x] No special deployment steps required.

## Checklist

- [x] Code follows project conventions and style guidelines
- [x] Commit messages follow [Conventional
Commits](https://www.conventionalcommits.org/)
- [x] Self-review of code completed
- [x] Tests added/updated and passing
- [x] No new warnings or errors introduced
- [x] Changes are backward compatible

## Additional Context

These commits will also be cherry-picked into
\`release/2026-05-01-spec-vendoring-and-cleanup\` (PR #68) so the
schema cleanup ships in the same release as the render-side cleanup it
pairs with.
## Summary

First scoring run since both halves of the SHA-pin cleanup landed — this
PR captures fresh scorecards for the entire
ANC 100 registry, scored by the just-released \`agentnative-cli v0.3.0\`
(no more \`ANC_COMMIT\` capture, no more
\`anc.commit\` field in the JSON envelope) installed via brew inside the
docker scoring image (no operator-local
working-tree state coupling).

96/96 scored, 0 install-missing, 0 score-failed, 0 skipped.

## Changelog

### Changed

- All 96 per-tool scorecards on anc.dev refreshed against \`anc
v0.3.0\`. The JSON envelope no longer carries
\`anc.commit\`; the per-tool page's "Anc build" row reads \`0.3.0\` (was
\`0.2.0\`).

### Updated tool versions

Upstream releases since the last scoring run, picked up in this rescore:

- \`act\` v0.2.87 → v0.2.88
- \`anc\` v0.2.0 → v0.3.0 *(self-scorecard rolls forward to match the
now-installed binary)*
- \`claude-code\` v2.1.123 → v2.1.126
- \`flyctl\` v0.4.44 → v0.4.45
- \`ollama\` v0.22.0 → v0.22.1
- \`opencode\` v1.14.30 → v1.14.31
- \`starship\` v1.25.0 → v1.25.1

## Type of Change

- [x] \`chore\`: Maintenance tasks (regenerated artifacts).

## Related Issues/Stories

- Story: Closes the loop after agentnative-cli v0.3.0 (#44 over there)
and site PRs #66, #67, #69 — first rescore against the new
no-\`anc.commit\` JSON shape.
- Issue: n/a
- Architecture: n/a (regenerated artifacts; no schema or code changes
here).
- Related PRs: #66, #67, #69 (already on dev); #68 (release branch —
open against main).

## Testing

- [x] Unit tests added/updated
- [x] All tests passing

**Test Summary:**

- 200 / 0 fail unit + regression tests pass.
- \`bun run build\` clean: 111 pages, 97 scorecard pages, 96 badges, 0
orphans.
- \`rg 'anc.commit\\|\"commit\":' dist/\` returns zero — confirms no
rendered surface still leaks the dropped field.
- Spot-check on a handful of fresh scorecards: \`jq '.anc' <file>\`
returns \`{\"version\":\"0.3.0\"}\` (no \`commit\` key).

## Files Modified

**Modified:**

- \`scorecards/*.json\` — 89 same-version files refreshed (anc.commit
dropped, anc.version bumped to 0.3.0, run.started_at refreshed).

**Renamed:**

- \`scorecards/act-v0.2.87.json\` → \`scorecards/act-v0.2.88.json\`
- \`scorecards/anc-v0.2.0.json\` → \`scorecards/anc-v0.3.0.json\`
- \`scorecards/claude-code-v2.1.123.json\` →
\`scorecards/claude-code-v2.1.126.json\`
- \`scorecards/flyctl-v0.4.44.json\` →
\`scorecards/flyctl-v0.4.45.json\`
- \`scorecards/ollama-v0.22.0.json\` →
\`scorecards/ollama-v0.22.1.json\`
- \`scorecards/opencode-v1.14.30.json\` →
\`scorecards/opencode-v1.14.31.json\`
- \`scorecards/starship-v1.25.0.json\` →
\`scorecards/starship-v1.25.1.json\`

(The 7 superseded old-version files were trashed rather than left for
the auto-discovery silent-supersede path —
keeps the disk in sync with what \`/score/<tool>\` will actually
render.)

**Created / Deleted:** None as net-new in the working tree (the 7
renames net to 0; the 96 modifications stay
in-place).

## Breaking Changes

- [x] No breaking changes.

## Deployment Notes

- [x] No special deployment steps required.

After merge, staging at
\`agentnative-site-staging.brettdavies.workers.dev\` will serve the
refreshed scorecards.
The \`/score/<tool>\` pages will render \`<dt>Anc
build</dt><dd>0.3.0</dd>\` for every tool.

## Known follow-up

- \`scorecards/cf-v0.0.5.json\`'s \`tool.version\` JSON field captured a
row of Unicode \`▄\` block characters from
cf's ASCII-art logo banner. The rendered \`/score/cf\` page is fine
(filename version \`0.0.5\` is canonical), but
  the JSON's courtesy field is decorative junk. Captured in

\`.context/compound-engineering/todos/020-pending-p3-cf-tool-version-decorative-first-line.md\`
(local-only) with
  three fix-path options. Not blocking this rescore.

## Checklist

- [x] Code follows project conventions and style guidelines
- [x] Commit messages follow [Conventional
Commits](https://www.conventionalcommits.org/)
- [x] Self-review of code completed
- [x] Tests added/updated and passing
- [x] No new warnings or errors introduced
- [x] Changes are backward compatible

## Additional Context

The docs changes from PR #69 (\`content/scorecard-schema.md\` +
\`tests/build.test.ts\` + \`RELEASES.md\`) are
already on \`dev\`; this rescore PR rides on top of them and only adds
the regenerated \`scorecards/*.json\`
content.

After this lands on \`dev\`, the same scorecard regeneration can be
cherry-picked into the open
\`release/2026-05-01-spec-vendoring-and-cleanup\` (PR #68) so that the
production deploy to anc.dev ships fresh
scorecards in the same release as the supporting code/schema changes.
## Summary

Adds a "Status-check context pitfall" subsection under the "Branch
protection"
section of `RELEASES.md`. Captures the exact-match rule for
`required_status_checks[].context` strings in `protect-main.json` and
the
`gh api .../check-runs` diagnostic command for confirming real check
contexts after a first CI run.

The pitfall: inline jobs publish their context as just `<job-name>`;
reusable-workflow callers publish as `<caller-job-id> /
<reusable-job-id-or-name>`. Mixing these produces a stuck-but-green PR —
every check reports green but the ruleset waits forever on a context
that
never appears.

## Changelog

### Documentation

- Document the `protect-main.json` status-check context format gotcha
and
  the `gh api .../check-runs` diagnostic.

## Type of Change

- [x] `docs`: Documentation update

## Related Issues/Stories

- Story: n/a
- Issue: n/a
- Architecture: n/a
- Related PRs: n/a

## Testing

- [x] Manual testing completed
- [x] All tests passing

**Test Summary:**

- Pre-push hook: 200/200 unit + regression tests pass
- Markdown-only change; no code paths affected

## Files Modified

**Modified:**

- `RELEASES.md` — adds "Status-check context pitfall" subsection (15
lines)

**Created:** None.

**Renamed:** None.

**Deleted:** None.

## Key Features

n/a — pure documentation.

## Benefits

- Future ruleset edits avoid the stuck-PR class of bug.
- Diagnostic command is captured next to the rule that motivates it.

## Breaking Changes

- [x] No breaking changes

## Deployment Notes

- [x] No special deployment steps required

Root-level `*.md` change — `ci-stub.yml` fires (heavy pipeline skipped
via
`paths-ignore`). `deploy.yml` skips this commit on push (root `*.md`
ignored).

## Checklist

- [x] Code follows project conventions and style guidelines
- [x] Commit messages follow [Conventional
Commits](https://www.conventionalcommits.org/)
- [x] Self-review of code completed
- [x] Tests added/updated and passing
- [x] No new warnings or errors introduced
- [x] Changes are backward compatible

## Additional Context

Will be cherry-picked into the in-flight `release/2026-05-02-*` cut to
main alongside the dev backlog.
## Summary

Tracks the `agentnative-skill` repo's already-shipped v0.2.0 release
(tag `v0.2.0` at `2b10c84`, no commits ahead of main since). Was `0.1.0`
since site launch; the skill repo moved to v0.2.0 alongside PR #67's
deprecation of the SHA-pin surface, but the site's manifest was never
bumped.

The skill bundle's `bin/check-update` reads its own local `VERSION`, not
`/skill.json.version`, so this drift didn't break update detection. But
`/skill.json` consumers reading the `version` field saw a stale value
that didn't track the published skill state.

## Changelog

### Changed

- Bump `src/data/skill.json.version` from `0.1.0` to `0.2.0` to match
the published skill bundle.

## Type of Change

- [x] `chore`: Maintenance tasks (dependencies, config, etc.)

## Related Issues/Stories

- Story: Surface alignment between `/skill.json` and the published skill
bundle.
- Issue: n/a
- Architecture: n/a
- Related PRs: #67 (the PR that should have bumped this; missed it).

## Testing

- [x] All tests passing

**Test Summary:**

- Pre-push hook: 200/200 unit + regression tests pass
- `bun run lint` clean, `bun run build` clean

## Files Modified

**Modified:**

- `src/data/skill.json`: `version` 0.1.0 to 0.2.0

**Created:** None.

**Renamed:** None.

**Deleted:** None.

## Key Features

n/a (1-line metadata bump).

## Benefits

- `/skill.json.version` now tracks the published skill state, removing a
silent drift.

## Breaking Changes

- [x] No breaking changes.

## Deployment Notes

- [x] No special deployment steps required.

Will be cherry-picked into
`release/2026-05-01-spec-vendoring-and-cleanup` (PR #68) so it ships in
the same release as the SHA-pin cleanup arc that motivated the skill
v0.2.0 release.

## Checklist

- [x] Code follows project conventions and style guidelines
- [x] Commit messages follow [Conventional
Commits](https://www.conventionalcommits.org/)
- [x] Self-review of code completed
- [x] Tests added/updated and passing
- [x] No new warnings or errors introduced
- [x] Changes are backward compatible

## Additional Context

The same root cause produced concern (1) on PR #68's review:
shape-changing PRs (#67 dropped `source.commit` and `verify`) should
bump `version` per RELEASES.md step 2. That step was missed, hence this
catch-up commit.
@brettdavies brettdavies merged commit 31af939 into main May 3, 2026
10 checks passed
@brettdavies brettdavies deleted the release/2026-05-03-spec-vendoring-and-cleanup branch May 3, 2026 06:07
brettdavies added a commit that referenced this pull request May 15, 2026
## Summary

Second production release since the v0.1 launch (#60, 2026-04-30) and
the first since #73 (2026-05-03). The headline is the routing-drift fix:
`anc.dev` is currently bound to the staging Worker
(`agentnative-site-staging`), not the named-production Worker
(`agentnative-site`). This release brings `agentnative-site` current
with every dev-side change since #73, manually detaches `anc.dev` from
staging via the CF API immediately before merge, and lets `deploy.yml`
reattach the domain to the named-prod Worker per the top-level `routes:`
field in `wrangler.jsonc`.

This is also the first deploy that applies the live-scoring Durable
Object migration (`v1: new_sqlite_classes: ["Sandbox"]`) to the
named-prod Worker. DO migrations are one-way walls: once this deployment
lands, `wrangler rollback` cannot cross the v1 boundary on production.
Treated as a milestone.

The R2 bucket `anc-score-cache` (referenced by the top-level wrangler
config) did not exist on the account. It was created out-of-band via
`wrangler r2 bucket create anc-score-cache` before opening this PR so
binding validation passes at deploy time.

This release bundles 11 PRs from `dev` (post-#73):

- Live-scoring scaffolding: 4 units, 1 pre-implementation gate, 1
production-readiness followup (`#77`, `#78`, `#79`, `#80`, `#81`,
`#84`). The `/api/score` route is NOT user-facing yet (U5 onward still
pending). This release ships the wrangler bindings, the DO stub
returning `{error: 'sandbox_stub_until_u6'}`, the input parser plus
4-step GitHub URL discovery chain, the registry and discovery indexes,
and the Alpine plus musl sandbox image pinned at
`registry.cloudflare.com/<acct>/anc-sandbox:30f61f1`.
- Spec v0.4.0 sync (`#83`): adds principle P8 (Discoverable Through
Agent Skill Bundles), renames `docs/DESIGN.md` to `DESIGN.md`, renames
`.impeccable.md` to `PRODUCT.md`, refreshes prose-tooling channel.
- Site-side prose-check enforcement (`#82`): vendored Vale rule packs
(brand plus site channels) and `prose-check.sh` orchestrator with a
blocking-category whitelist (`TYPOS|GRAMMAR|CONFUSED_WORDS`). Pre-push
only; not in CI.
- Dev-loop hardening: pre-push wrangler dry-run (`#76`), biome warning
silenced (`#75`), project-scoped wrangler telemetry opt-out (`#74`).

## Changelog

### Added

- Principle P8: Discoverable Through Agent Skill Bundles. Eighth
principle in the spec, with full content surfaced at
`/principles/p8-discoverable-skill-bundle` and listed on `/`. Spec
advances from v0.3.0 to v0.4.0 (`#83`).
- Live-scoring infrastructure scaffolding (not yet user-facing):
wrangler bindings for Containers, Durable Objects, R2 buckets, and Rate
Limits on both env blocks; Sandbox Durable Object stub at
`src/worker/score/do.ts`; build-time `registry-index` and
`discovery-hints-index`; Alpine plus musl sandbox image at
`docker/sandbox/Dockerfile` with `anc` baked in via the brew-installable
musl binary; input parser and 4-step GitHub URL discovery chain at
`src/worker/score/{parse-install,registry-lookup,discover-binary,validate}.ts`.
The `/api/score` route itself ships in a later release (`#77`, `#78`,
`#79`, `#80`, `#81`).
- Site-side prose-check enforcement at pre-push: vendored Vale rule
packs (`styles/brand/*`, `styles/site/*`,
`styles/config/vocabularies/{brand,site}/{accept,reject}.txt`),
`scripts/prose-check.sh` orchestrator, `scripts/check-banned-fonts.sh`
deployment-layer scan, and `scripts/sync-prose-tooling.sh` rule-pack
sync. LanguageTool blocking-category whitelist
(`TYPOS|GRAMMAR|CONFUSED_WORDS`) keeps signal high (`#82`).
- `PRODUCT.md` at the repo root (channel-context file expected by the
`/impeccable` skill). Renamed from `.impeccable.md` (`#83`).
- `wrangler deploy --dry-run` step in the pre-push hook, catching
deploy-time binding validation failures before push (`#76`).
- Project-scoped `send_metrics: false` in `wrangler.jsonc`.
Belt-and-suspenders with the per-user shell env var and per-machine
wrangler config; travels with the repo (`#74`).

### Changed

- `docs/DESIGN.md` renamed to `DESIGN.md` at the repo root, matching the
`/impeccable` channel-context layout (`#83`).
- Site spec version (footer, OG card, badges) advances from v0.3.0 to
v0.4.0, reflecting the vendored spec snapshot bump (`#83`).
- Adopt staging-leads-prod as the default sandbox image workflow. The
two `wrangler.jsonc` pins (`containers[0].image` top-level,
`env.staging.containers[0].image`) are independent: staging advances
during development, prod advances at release. `RELEASES.md § Sandbox
image releases` documents the soak-then-promote default and the lockstep
shortcut for low-risk bumps (`#84`).
- Sandbox image now lives in the Cloudflare managed registry
(`registry.cloudflare.com/<acct>/anc-sandbox:30f61f1`) instead of the
deprecated Docker Hub URI. Build is decoupled from deploy via `wrangler
containers build -p`; deploy never rebuilds (`#84`).

### Fixed

- Resolve staging container `ImagePullError` caused by Docker Hub
registry deprecation. The sandbox image now lives in the Cloudflare
managed registry and is pinned by `<git-sha>` tag in both env blocks
(`#84`).
- Add CI guard that verifies every PR's pinned sandbox image tags exist
in the CF managed registry. Main-targeting PRs additionally enforce pin
equality (released state). This release exercises the main-targeting
equality branch for the first time. Both pins are `:30f61f1` (lockstep),
so the equality check passes by default (`#84`).
- Silence biome `noTemplateCurlyInString` warning on a footer test name.
The string was intentional and is now annotated with a `biome-ignore`
comment (`#75`).

### Documentation

- `RELEASES.md § Sandbox image releases (live-scoring)`: full spec for
image bumps including local-build-once via `wrangler containers build
-p`, soak-then-promote default flow, lockstep shortcut, image-retention
discipline (never delete a tag that backed a shipped Worker version),
and the DO-migration one-way wall note (`#84`).
- `docker/sandbox/README.md`: developer-facing image build and push
reference (`#84`).

## Type of Change

- [x] `feat`: New feature (non-breaking change which adds functionality)

The release is multi-typed (feat plus fix plus chore plus docs) but
`feat` headlines because the live-scoring scaffolding (4 units) is the
largest user-facing surface introduced, even though the `/api/score`
route is not yet wired.

## Related Issues/Stories

- Story: First post-#73 release. Closes the production side of
U3-followup verification (`agentnative-site` deploys at the new image
pin) and resolves the routing drift discovered during the post-U3 audit.
`anc.dev` was bound to the staging Worker since 2026-04-30; this release
reattaches it to the named-prod Worker.
- Issue: None.
- Architecture:
`docs/plans/2026-04-28-002-feat-live-scoring-cf-sandbox-plan.md`
(live-scoring v3 plan; this release closes Pending #1).
- Related PRs: #74, #75, #76, #77, #78, #79, #80, #81, #82, #83, #84.

## Files Modified

**Modified:**

- `wrangler.jsonc`: bindings for Containers, Durable Objects, R2
buckets, and Rate Limits on both env blocks; image pinned at
`registry.cloudflare.com/<acct>/anc-sandbox:30f61f1`; `send_metrics:
false`; DO migrations v1 (`#74`, `#81`, `#84`).
- `RELEASES.md`: sandbox image release workflow, status-check context
pitfall, telemetry opt-out documentation (`#74`, `#84`).
- `package.json`: spec v0.4.0 bump and prose-check scripts (`#82`,
`#83`).
- `src/worker/index.ts`, `src/worker/headers.ts`: routing prep for
`/api/score` (stub still returns 503 until U5) (`#81`).
- `src/build/build.mjs`: registry-index plus discovery-hints-index
emission (`#78`).
- `tests/regression.test.ts`: prose-check plus live-scoring scaffolding
coverage (`#78`, `#82`).
- 16 other files. Full list in `git diff origin/main..HEAD --name-only`.

**Created:**

- `content/principles/p8-discoverable-skill-bundle.md`,
`src/data/spec/principles/p8-discoverable-skill-bundle.md`,
`content/principles/README.md` (`#83`).
- `docker/sandbox/Dockerfile`, `docker/sandbox/README.md`,
`docker/sandbox/.dockerignore`, `docker/sandbox/.ignored-sentinel.txt`,
`tests/dockerfile-sandbox.test.ts` (`#79`, `#84`).
- `discovery-hints.yaml`, `src/build/registry-index.mjs`,
`tests/registry-index.test.ts` (`#78`).
-
`src/worker/score/{parse-install,registry-lookup,discover-binary,validate,do}.ts`
and 4 paired test files (`#80`, `#81`).
-
`styles/{brand,site,config/vocabularies/brand,config/vocabularies/site}/*`
(Vale rule packs), `scripts/prose-check.sh`,
`scripts/check-banned-fonts.sh`, `scripts/sync-prose-tooling.sh`,
`scripts/__fixtures__/prose-check/**`, `.vale.ini`, `BRAND.md` (`#82`).
- `scripts/measure-discovery-hit-rate.mjs` (`#77`).
- `.github/workflows/ci.yml` additions: sandbox image registry-existence
guard plus pin-equality guard (`#84`).

**Renamed:**

- `docs/DESIGN.md` to `DESIGN.md` at repo root (`#83`).
- `.impeccable.md` to `PRODUCT.md` (`#83`).

**Deleted:**

- None.

## Testing

- [x] Unit tests added/updated
- [x] All tests passing

**Test Summary:**

- 315 unit and regression tests pass on the release branch (pre-push
gate verified locally).
- `bun run build` clean: 8 principles, 112 HTML pages, 112 MD pages, 97
scorecard pages, 96 badges.
- `bun x wrangler deploy --dry-run` validates the named-prod environment
bindings end-to-end: Sandbox DO, R2 bucket `anc-score-cache` (created
out-of-band before this PR), SCORE_LIMITER (10 requests per 60 s),
ASSETS. Container image `anc-sandbox:30f61f1` resolves to the CF managed
registry.
- CI guard: top-level pin equals env.staging pin (both `:30f61f1`,
lockstep), so the new main-targeting equality check is expected to pass
on its first exercised PR run.
- Pre-push prose-check: 0 blocking, 1108 warning (below threshold).
- DO migration v1: this is the first deploy applying the migration to
the named-prod Worker. The container application on the named-prod side
will start at v1 (independent from staging's v2 history).

**Post-merge verification plan** (executed after the deploy.yml run on
the merge SHA):

- `deploy.yml` production-deploy log lists ONLY `anc.dev (custom
domain)` under triggers (no `workers.dev` URL, since named-prod has
`workers_dev: false`).
- Next push to dev triggers the staging deploy. That deploy log lists
ONLY the staging `workers.dev` URL, no `anc.dev`.
- `curl -sI https://anc.dev/` returns 200 with NO `x-robots-tag` header.
- `curl -sI https://agentnative-site-staging.brettdavies.workers.dev/`
returns 200 WITH `x-robots-tag: noindex`.
- CF API `/accounts/<acct>/workers/domains` shows one record for
hostname `anc.dev` with service `agentnative-site`.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant