From 403327512d264a24f69137b6248d107d2a052b89 Mon Sep 17 00:00:00 2001
From: snapsynapse <57973674+snapsynapse@users.noreply.github.com>
Date: Sat, 5 Sep 2026 20:37:05 -0600
Subject: [PATCH] Release version-aware GuideCheck 1.0.0 without migrating
legacy adopters
Dispatch supported legacy guide declarations to the preserved 3ceb30a evaluator.
Apply repository-anchor exclusion, explicit profile assertions, and strict
manifest/report contracts only to guides opting into profile 1.0.0.
Publish versioned contracts and source identity while preserving the anchored
0.7.1 self-guide and manifest. Add full legacy report replay, strict fixtures,
mixed-request and UI checks, adopter evidence, and release validation.
Validation: make test test-verify-ui, public contract build, installed-wheel
smoke, preserved artifact digests, AIDR lint, and git diff --check passed.
---
.github/workflows/release.yml | 4 +-
.github/workflows/test.yml | 4 +-
.gitignore | 3 +
ADOPTION.md | 19 +
CHANGELOG.md | 22 +-
CLAUDE.md | 27 +-
INTENT.md | 4 +-
Makefile | 15 +-
PROJECT_CONTEXT.md | 11 +-
README.md | 16 +-
RELEASE_NOTES-1.0.0.md | 65 +
api/verify.py | 58 +-
...1-same-control-plane-repository-anchors.md | 223 +
docs/anchor-dispatch-adopters.json | 831 +++
docs/anchor-dispatch-package-check.json | 50 +
docs/anchor-dispatch-validation.md | 113 +
docs/anchor-policy-compatibility.md | 334 ++
docs/index.html | 23 +-
docs/llms.txt | 6 +-
docs/release-1.0.0.md | 52 +
docs/sitemap.xml | 4 +-
docs/verify/index.html | 13 +-
docs/verify/verify.js | 3 +
finding-ids.md | 12 +
fixtures/compatibility/legacy-baseline.json | 5001 +++++++++++++++++
.../compatibility/preserved-artifacts.json | 15 +
.../1.0.0/dns-only/anchors/dns-txt.txt | 1 +
.../profiles/1.0.0/dns-only/expected.json | 6 +
fixtures/profiles/1.0.0/dns-only/guide.txt | 90 +
fixtures/profiles/1.0.0/dns-only/manifest.txt | 9 +
.../local-consistency/anchors/dns-txt.txt | 1 +
.../anchors/repository-file.txt | 90 +
.../1.0.0/local-consistency/expected.json | 8 +
.../1.0.0/local-consistency/guide.txt | 90 +
.../1.0.0/local-consistency/manifest.txt | 9 +
.../anchors/dns-txt.txt | 1 +
.../manifest-profile-mismatch/expected.json | 8 +
.../1.0.0/manifest-profile-mismatch/guide.txt | 90 +
.../manifest-profile-mismatch/manifest.txt | 9 +
.../repository-and-dns/anchors/dns-txt.txt | 1 +
.../anchors/repository-file.txt | 90 +
.../1.0.0/repository-and-dns/expected.json | 6 +
.../1.0.0/repository-and-dns/guide.txt | 90 +
.../1.0.0/repository-and-dns/manifest.txt | 9 +
.../repository-conflict/anchors/dns-txt.txt | 1 +
.../anchors/repository-file.txt | 91 +
.../1.0.0/repository-conflict/expected.json | 8 +
.../1.0.0/repository-conflict/guide.txt | 90 +
.../1.0.0/repository-conflict/manifest.txt | 9 +
.../anchors/repository-file.txt | 90 +
.../1.0.0/repository-only/expected.json | 8 +
.../profiles/1.0.0/repository-only/guide.txt | 90 +
.../1.0.0/repository-only/manifest.txt | 9 +
operator-guide.md | 13 +
profiles/1.0.0/example-report.json | 93 +
profiles/1.0.0/spec.md | 1112 ++++
profiles/1.0.0/verifier-conformance.md | 764 +++
pyproject.toml | 4 +
roadmap.md | 17 +-
schemas/1.0.0/fixture-expected.schema.json | 14 +
schemas/1.0.0/manifest.schema.json | 73 +
schemas/1.0.0/verifier-output.schema.json | 410 ++
scripts/build_public_contracts.py | 48 +
scripts/check_version_sync.py | 39 +-
scripts/guidecheck_constants.py | 14 +-
scripts/guidecheck_legacy.py | 1509 +++++
scripts/guidecheck_legacy_constants.py | 15 +
scripts/guidecheck_profiles.py | 83 +
scripts/guidecheck_strict.py | 135 +
scripts/guidecheck_verify.py | 1458 +----
scripts/test_dispatch_compatibility.py | 69 +
scripts/test_hosted_api.py | 9 +-
scripts/test_legacy_anchor_compatibility.py | 126 +
scripts/test_profile_dispatch.py | 185 +
scripts/test_verify_ui.mjs | 44 +
scripts/validate_contracts.py | 8 +-
threat-register.md | 10 +
vercel.json | 24 +-
78 files changed, 12704 insertions(+), 1504 deletions(-)
create mode 100644 RELEASE_NOTES-1.0.0.md
create mode 100644 docs/anchor-dispatch-adopters.json
create mode 100644 docs/anchor-dispatch-package-check.json
create mode 100644 docs/anchor-dispatch-validation.md
create mode 100644 docs/anchor-policy-compatibility.md
create mode 100644 docs/release-1.0.0.md
create mode 100644 fixtures/compatibility/legacy-baseline.json
create mode 100644 fixtures/compatibility/preserved-artifacts.json
create mode 100644 fixtures/profiles/1.0.0/dns-only/anchors/dns-txt.txt
create mode 100644 fixtures/profiles/1.0.0/dns-only/expected.json
create mode 100644 fixtures/profiles/1.0.0/dns-only/guide.txt
create mode 100644 fixtures/profiles/1.0.0/dns-only/manifest.txt
create mode 100644 fixtures/profiles/1.0.0/local-consistency/anchors/dns-txt.txt
create mode 100644 fixtures/profiles/1.0.0/local-consistency/anchors/repository-file.txt
create mode 100644 fixtures/profiles/1.0.0/local-consistency/expected.json
create mode 100644 fixtures/profiles/1.0.0/local-consistency/guide.txt
create mode 100644 fixtures/profiles/1.0.0/local-consistency/manifest.txt
create mode 100644 fixtures/profiles/1.0.0/manifest-profile-mismatch/anchors/dns-txt.txt
create mode 100644 fixtures/profiles/1.0.0/manifest-profile-mismatch/expected.json
create mode 100644 fixtures/profiles/1.0.0/manifest-profile-mismatch/guide.txt
create mode 100644 fixtures/profiles/1.0.0/manifest-profile-mismatch/manifest.txt
create mode 100644 fixtures/profiles/1.0.0/repository-and-dns/anchors/dns-txt.txt
create mode 100644 fixtures/profiles/1.0.0/repository-and-dns/anchors/repository-file.txt
create mode 100644 fixtures/profiles/1.0.0/repository-and-dns/expected.json
create mode 100644 fixtures/profiles/1.0.0/repository-and-dns/guide.txt
create mode 100644 fixtures/profiles/1.0.0/repository-and-dns/manifest.txt
create mode 100644 fixtures/profiles/1.0.0/repository-conflict/anchors/dns-txt.txt
create mode 100644 fixtures/profiles/1.0.0/repository-conflict/anchors/repository-file.txt
create mode 100644 fixtures/profiles/1.0.0/repository-conflict/expected.json
create mode 100644 fixtures/profiles/1.0.0/repository-conflict/guide.txt
create mode 100644 fixtures/profiles/1.0.0/repository-conflict/manifest.txt
create mode 100644 fixtures/profiles/1.0.0/repository-only/anchors/repository-file.txt
create mode 100644 fixtures/profiles/1.0.0/repository-only/expected.json
create mode 100644 fixtures/profiles/1.0.0/repository-only/guide.txt
create mode 100644 fixtures/profiles/1.0.0/repository-only/manifest.txt
create mode 100644 profiles/1.0.0/example-report.json
create mode 100644 profiles/1.0.0/spec.md
create mode 100644 profiles/1.0.0/verifier-conformance.md
create mode 100644 schemas/1.0.0/fixture-expected.schema.json
create mode 100644 schemas/1.0.0/manifest.schema.json
create mode 100644 schemas/1.0.0/verifier-output.schema.json
create mode 100644 scripts/build_public_contracts.py
create mode 100644 scripts/guidecheck_legacy.py
create mode 100644 scripts/guidecheck_legacy_constants.py
create mode 100644 scripts/guidecheck_profiles.py
create mode 100644 scripts/guidecheck_strict.py
create mode 100644 scripts/test_dispatch_compatibility.py
create mode 100644 scripts/test_legacy_anchor_compatibility.py
create mode 100644 scripts/test_profile_dispatch.py
create mode 100644 scripts/test_verify_ui.mjs
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index cbf9f91..56dc03e 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -24,7 +24,9 @@ jobs:
python-version: "3.12"
- name: Run local verification suite
- run: make test
+ run: |
+ make test test-verify-ui
+ python3 scripts/build_public_contracts.py
- name: Build release archive and conformance kit
run: |
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 504f177..f0ff7bc 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -22,4 +22,6 @@ jobs:
python-version: "3.12"
- name: Run local verification suite
- run: make test
+ run: |
+ make test test-verify-ui
+ python3 scripts/build_public_contracts.py
diff --git a/.gitignore b/.gitignore
index 1819742..0f4a69e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,3 +37,6 @@ handoffs/
# Generated at build time by vercel.json buildCommand (source is /schemas)
/docs/schemas/
+
+/docs/profiles/
+/docs/deploy-manifest.json
diff --git a/ADOPTION.md b/ADOPTION.md
index d2e6a61..ed21dba 100644
--- a/ADOPTION.md
+++ b/ADOPTION.md
@@ -1,5 +1,24 @@
# GuideCheck Adoption Guide
+## Version-aware adoption
+
+Existing supported legacy guides keep their current evaluation when checked by
+the 1.0.0 dispatcher. No guide, manifest, DNS, or repository-anchor
+rotation is required for that compatibility. The latest released profile is
+[1.0.0](profiles/1.0.0/spec.md); legacy profiles remain supported.
+
+Deliberately adopting 1.0.0 requires matching guide/manifest profile declarations
+and another qualifying anchor when the repository was the only source of
+provenance. Repository hash matches remain useful corroboration, but cannot
+qualify for 1.0.0 Level 4. Retain legacy declarations until deliberately migrating.
+Consumers that require 1.0.0 can use the `required_profile_version` API field or
+`--require-profile-version` local CLI assertion. These reject an incompatible
+guide rather than reinterpret its bytes. Local evaluation still caps at Level 3.
+
+The guidance below describes the published legacy profile. See the
+[compatibility contract](docs/anchor-policy-compatibility.md) for version selection
+and the [validation evidence](docs/anchor-dispatch-validation.md) for tested limits.
+
This is the practical on-ramp to GuideCheck. It explains what an
`assistant-guide.txt` artifact is, what the conformance ladder means in
operational terms, and how to publish a conforming guide one level at a time.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1fac9f0..8644c76 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,25 @@ All notable changes to GuideCheck's Human-Verifiable Assistant Guide profile and
## [Unreleased]
+## [1.0.0] - 2026-09-05
+
+### Added
+
+- dispatch by the declared guide profile, preserving the 0.7.1 legacy evaluator,
+ report contract, and all supported legacy declarations
+- apply repository-anchor exclusion only to the explicit 1.0.0 policy; retain
+ matching evidence, block conflicting hashes, and report qualifying channels
+- add exact-profile caller assertions, manifest profile binding, and isolated
+ versioned schemas and normative documents under `profiles/1.0.0/`
+- separate the 1.0.0 dispatcher package from engine, released-profile, and
+ self-guide versions; published 0.7.1 guide and anchor bytes remain unchanged
+- add baseline report replay, legacy compatibility cases, strict fixtures,
+ mixed-request tests, and UI rendering/copy/download contract checks
+
+Legacy support has no automatic sunset in this release. Existing guide and
+manifest declarations select the preserved baseline evaluator; adopting 1.0.0
+is an explicit migration.
+
### Fixed
- enforce the existing bounded-execution rule for named scripts independently of
@@ -355,7 +374,8 @@ Initial draft for review.
- designated standard primary verifier at `https://guidecheck.org/verify`
- canonical site at `https://guidecheck.org/`
-[Unreleased]: https://github.com/snapsynapse/guidecheck/compare/v0.7.1...HEAD
+[Unreleased]: https://github.com/snapsynapse/guidecheck/compare/v1.0.0...HEAD
+[1.0.0]: https://github.com/snapsynapse/guidecheck/compare/v0.7.1...v1.0.0
[0.7.1]: https://github.com/snapsynapse/guidecheck/compare/v0.7.0...v0.7.1
[0.7.0]: https://github.com/snapsynapse/guidecheck/compare/v0.6.0...v0.7.0
[0.6.0]: https://github.com/snapsynapse/guidecheck/compare/v0.5.0...v0.6.0
diff --git a/CLAUDE.md b/CLAUDE.md
index 514f9e5..260fcd2 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -47,6 +47,12 @@ Canonical site: https://guidecheck.org/ · Verifier: https://guidecheck.org/veri
Level 5 planning notes: `level-5-runtime-conformance.md`,
`level-5-implementation-plan.md`, `pre-level-5-readiness.md`).
- `scripts/` — Python tools:
+ - `guidecheck_profiles.py` selects an explicitly supported policy from guide
+ bytes; caller profile assertions never reinterpret those bytes.
+ - `guidecheck_legacy.py` and `guidecheck_legacy_constants.py` preserve the
+ 3ceb30a evaluator and 0.7.1 report contract; frozen artifact digests and full
+ report replays guard compatibility.
+ - `guidecheck_strict.py` implements the opt-in 1.0.0 provenance policy.
- `guidecheck_verify.py` — local-file reference verifier CLI (Levels 1-3,
plus internal-consistency checks on Level 4 sidecar manifests/anchors).
- `guidecheck_scan.py` / `guidecheck_cli.py` — instruction-surface scanner
@@ -76,9 +82,10 @@ Canonical site: https://guidecheck.org/ · Verifier: https://guidecheck.org/veri
- Normative documents (`spec.md`, `verifier-conformance.md`) drive behavior;
explanatory docs (`design-rationale.md`, `threat-register.md`) must be kept
consistent with them, not the other way around.
-- Profile version lives in `scripts/guidecheck_constants.py` and is asserted
- across every version-bearing surface by `scripts/check_version_sync.py` —
- never hand-edit a version number in one place without checking sync.
+- Software, engine, released-profile, and self-guide versions are separate in
+ `scripts/guidecheck_constants.py`. The legacy engine has frozen constants.
+ `scripts/check_version_sync.py` checks release surfaces against 1.0.0 and legacy/self-guide surfaces against 0.7.1;
+ package upgrades must not rewrite the published self-guide or its anchors.
- `finding-ids.md` is the normative registry for finding ids; new finding ids
used by fixtures or emitted by verifiers/scanner must be registered there
(see `CONTRIBUTING.md`).
@@ -122,7 +129,7 @@ builds and Sigstore-signs release + conformance-kit artifacts.
## Current state
-- Released, profile version 0.7.1 (see `CHANGELOG.md`).
+- Released, profile version 1.0.0 (see `CHANGELOG.md`).
- Most recent work (2026-07-07): added `guidecheck scan`, a standalone
instruction-surface scanner for existing files (AGENTS.md/CLAUDE.md/
README/SKILL/llms.txt/assistant-guide.txt) that flags hidden-instruction
@@ -142,8 +149,16 @@ builds and Sigstore-signs release + conformance-kit artifacts.
conformance fixture suite is incomplete and it has not been shown to pass
it; signed `security.txt` anchors are not yet fetched by the hosted path.
-## Unreleased maintenance (2026-09-05)
+## Version-aware release (2026-09-05)
+
+The approved version-aware dispatcher is released as 1.0.0. Legacy profiles retain the isolated 0.7.1 behavior; explicit
+1.0.0 guides use strict repository-anchor exclusion. Current normative text
+and examples live in `profiles/1.0.0/`, with new schemas in `schemas/1.0.0/`.
+Root normative documents and published guide bytes remain the legacy contract.
+See `docs/anchor-dispatch-validation.md` for evidence and remaining release gates.
+`make test` remains Python-only; `make test-verify-ui` requires Node 18+ and runs
+the deterministic DOM contract separately. CI runs both.
Local bounded-execution findings are implemented in the shared verifier. Pins
remain unverified, including through hosted callers. See roadmap.md for pending
-hosted fetching and independence decisions. Profile release remains 0.7.1.
+hosted fetching and independence decisions. Legacy profile behavior remains pinned to the pre-dispatch baseline.
diff --git a/INTENT.md b/INTENT.md
index a47c570..fe6e098 100644
--- a/INTENT.md
+++ b/INTENT.md
@@ -77,7 +77,7 @@ GuideCheck is a PAICE Foundation standard. It sits alongside the other open-spec
## Versioning and authority
-The profile version is declared in `spec.md` and tracked in `CHANGELOG.md`. The current version is 0.7.1, released. The version is asserted by `scripts/check_version_sync.py` against `scripts/guidecheck_constants.py` across every version-bearing surface, so the status here and the released tag cannot silently disagree. `spec.md` and `verifier-conformance.md` are normative. `design-rationale.md` and `threat-register.md` are explanatory and must stay consistent with the normative documents. `archive/` is historical and is not edited.
+The current profile is declared in `profiles/1.0.0/spec.md` and tracked in `CHANGELOG.md`. The current version is 1.0.0, released. Root normative documents preserve the legacy contract; the self-guide remains pinned to 0.7.1. The version is asserted by `scripts/check_version_sync.py` against `scripts/guidecheck_constants.py` against independently pinned release, engine, and self-guide identities, so the status here and the released tag cannot silently disagree. `spec.md` and `verifier-conformance.md` are normative. `design-rationale.md` and `threat-register.md` are explanatory and must stay consistent with the normative documents. `archive/` is historical and is not edited.
## Maintenance and demand gate
@@ -90,6 +90,8 @@ standard scope or authorize a cross-standard certification product. The Septembe
## Changelog
+- 2026-09-05: Sam approved the version-aware anchor proposal with legacy compatibility required. The local 1.0.0 candidate excludes repository-file evidence from independent qualification, while the dispatcher preserves supported legacy evaluations and published self-guide bytes. Release and deployment remain separate. See `docs/anchor-policy-compatibility.md` and `docs/anchor-dispatch-validation.md`.
+
- 2026-07-31: Opened the canonical approval receipt as a live open question, prompted by an external question about binding approval to the exact executing action. Detail in `roadmap.md`; the identity fork (field in the record versus signer over it) is the first thing to resolve, gated behind Level 5 fixture-suite design.
- 2026-07-21: Released profile 0.7.1 with verifier false-positive fixes for wrapped verification instructions and CLI `eval` result prose, expanded parser regressions, refreshed hosted-verifier copy, and adoption guidance derived from the Harnessie field report.
- 2026-06-09: Recorded the Level 5 ownership decision (GuideCheck owns the runtime fixture suite and evaluator, gated by pre-level-5 readiness). Updated version status to 0.6.0 released and noted the version-sync check. Backfilled missing entries: the version line had been bumped through 0.2.0 to 0.6.0 without changelog entries.
diff --git a/Makefile b/Makefile
index 63963ac..00998c6 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-.PHONY: test-bounded-execution eval verify-fixtures validate-contracts test-contract-schema-validation test-parser-edge-cases check-guide-artifacts check-version-sync test-fetch-safety test-hosted-anchors test-hosted-api test-fetch-replay test-cli-contract test-scanner test release-archive conformance-kit
+.PHONY: test-verify-ui test-legacy-anchor-compatibility test-bounded-execution eval verify-fixtures validate-contracts test-contract-schema-validation test-parser-edge-cases check-guide-artifacts check-version-sync test-fetch-safety test-hosted-anchors test-hosted-api test-fetch-replay test-cli-contract test-scanner test release-archive conformance-kit
VERSION := $(shell python3 -c "import sys; sys.path.insert(0, 'scripts'); from guidecheck_constants import GUIDECHECK_VERSION; print(GUIDECHECK_VERSION)")
@@ -44,7 +44,16 @@ test-scanner:
test-bounded-execution:
python3 scripts/test_bounded_execution.py
-test: test-bounded-execution eval verify-fixtures validate-contracts test-contract-schema-validation test-parser-edge-cases check-guide-artifacts check-version-sync test-fetch-safety test-hosted-anchors test-hosted-api test-fetch-replay test-cli-contract test-scanner
+test-legacy-anchor-compatibility:
+ python3 scripts/test_legacy_anchor_compatibility.py
+ python3 scripts/test_dispatch_compatibility.py
+ python3 scripts/test_profile_dispatch.py
+
+# Keep the established Python-only test entry point usable without Node.
+test-verify-ui:
+ node scripts/test_verify_ui.mjs
+
+test: test-legacy-anchor-compatibility test-bounded-execution eval verify-fixtures validate-contracts test-contract-schema-validation test-parser-edge-cases check-guide-artifacts check-version-sync test-fetch-safety test-hosted-anchors test-hosted-api test-fetch-replay test-cli-contract test-scanner
# Full source archive for a GitHub release, matching prior build/ layout.
release-archive:
@@ -60,6 +69,6 @@ conformance-kit:
mkdir -p build
git archive --format=tar.gz --prefix=guidecheck-conformance-kit-$(VERSION)/ \
-o build/guidecheck-conformance-kit-$(VERSION).tar.gz HEAD \
- fixtures schemas finding-ids.md verifier-conformance.md CHANGELOG.md
+ fixtures schemas profiles finding-ids.md verifier-conformance.md CHANGELOG.md
cd build && shasum -a 256 guidecheck-conformance-kit-$(VERSION).tar.gz > guidecheck-conformance-kit-$(VERSION).SHA256SUMS
cat build/guidecheck-conformance-kit-$(VERSION).SHA256SUMS
diff --git a/PROJECT_CONTEXT.md b/PROJECT_CONTEXT.md
index 3a27172..fdb9f56 100644
--- a/PROJECT_CONTEXT.md
+++ b/PROJECT_CONTEXT.md
@@ -64,7 +64,7 @@ notes), rather than a general PAICE-wide default.
## Current status
-Released, profile version 0.7.1 (see `CHANGELOG.md`). Most recent shipped work:
+Released, profile version 1.0.0 (see `CHANGELOG.md`). Most recent shipped work:
`guidecheck scan`, an instruction-surface scanner for pre-existing
AGENTS.md/CLAUDE.md/README/SKILL/llms.txt-style files (2026-07-07).
Undecided/open items live in
@@ -74,8 +74,13 @@ suite design, and a possible higher provenance tier. Release and conformance-
kit signing is settled on Sigstore cosign keyless for 0.6.0 and later. See
`CLAUDE.md` for technical/agent-facing detail.
-## Unreleased maintenance (2026-09-05)
+## Version-aware release (2026-09-05)
+
+Version-aware dispatch and opt-in 1.0.0 anchor qualification ship in release
+1.0.0. The published self-guide remains 0.7.1. Legacy reports and anchor semantics are
+preserved. Current profile documents live in `profiles/1.0.0/`; validation evidence
+and delivery limits are in `docs/anchor-dispatch-validation.md`.
Local bounded-execution findings are implemented in the shared verifier. Pins
remain unverified, including through hosted callers. See roadmap.md for pending
-hosted fetching and independence decisions. Profile release remains 0.7.1.
+hosted fetching and independence decisions. Legacy profile behavior remains pinned to the pre-dispatch baseline.
diff --git a/README.md b/README.md
index e09e130..a7c6db2 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,12 @@
# GuideCheck
+The 1.0.0 dispatcher preserves legacy
+verification and selects stricter repository-anchor rules only for guides that
+declare 1.0.0. See the [1.0.0 profile](profiles/1.0.0/spec.md),
+[compatibility contract](docs/anchor-policy-compatibility.md), and
+[validation evidence](docs/anchor-dispatch-validation.md). Published guide and
+anchor bytes remain unchanged at 0.7.1; the latest released profile is 1.0.0.
+
GuideCheck is a trust boundary protocol for agent instruction surfaces. It
ensures the instructions humans approve are the same instructions agents
execute.
@@ -91,8 +98,8 @@ agents may execute another.
## Documents
- `ADOPTION.md` - the practical on-ramp: conformance ladder, level-by-level path, guide-author checklist
-- `spec.md` - the normative Human-Verifiable Assistant Guide profile
-- `verifier-conformance.md` - the normative profile for tools that verify guides
+- `profiles/1.0.0/spec.md` and `profiles/1.0.0/verifier-conformance.md` - the current normative guide and verifier profiles
+- `spec.md` and `verifier-conformance.md` - preserved normative legacy profiles
- `design-rationale.md` - why the design choices were made
- `operator-guide.md` - non-normative defense-in-depth practices for operators
- `threat-register.md` - known risk classes for fixture, verifier, and runtime authors
@@ -226,7 +233,8 @@ Temporary limitations:
- hosted Level 4 supports package-registry, transparency-log, DNS TXT, and
github.com repository-file anchors; signed `security.txt` anchors are not
- fetched yet
+ fetched yet. Repository-file matches qualify only under legacy profiles;
+ 1.0.0 requires another qualifying channel
- the hosted verifier is a Level 1-4 preview; its SSRF and abuse controls are
covered by unit tests in `scripts/test_fetch_safety.py`; replay tests cover
redirects, response size limits, header capture, and content variation; each
@@ -249,7 +257,7 @@ expectation contract by `scripts/check_reference_verifier.py`.
## Status
-Released, profile version 0.7.1. See `CHANGELOG.md`.
+Released, profile version 1.0.0. Legacy profiles remain supported. See `CHANGELOG.md`.
This is an early-stage open standard. The most useful feedback right now is
whether the hidden-instruction problem maps to real operational risk in your
diff --git a/RELEASE_NOTES-1.0.0.md b/RELEASE_NOTES-1.0.0.md
new file mode 100644
index 0000000..1d556af
--- /dev/null
+++ b/RELEASE_NOTES-1.0.0.md
@@ -0,0 +1,65 @@
+# GuideCheck 1.0.0
+
+GuideCheck now selects verification policy from the guide's declared profile
+version. Existing supported legacy guides keep their previous anchor eligibility,
+report format, and conformance results. A guide that deliberately declares
+`1.0.0` uses the stricter repository-anchor policy.
+
+## Changes
+
+- Under profile 1.0.0, a matching repository-file hash remains visible evidence
+ but cannot qualify toward Level 4. Another qualifying anchor is required.
+ A conflicting repository hash still blocks Level 4 even when DNS matches.
+- Exact-profile assertions are available through `--require-profile-version`
+ and the hosted API's `required_profile_version`. Incompatible declarations
+ are rejected rather than reinterpreted.
+- Strict reports identify the selected policy and qualifying evidence. New
+ schemas and normative documents live under `schemas/1.0.0/` and `profiles/1.0.0/`.
+- Package, engine, profile, and self-guide versions are independent. The
+ published self-guide and manifest remain byte-for-byte unchanged at 0.7.1.
+- This release also includes the bounded-execution enforcement already present
+ in baseline commit 3ceb30a: named script classification, execution-pin checks,
+ and opacity rationale. Valid execution pins remain declared but unverified.
+
+## Compatibility and adoption
+
+Legacy declarations 0.1.0, 0.2.0, 0.3.0, 0.3.1, 0.4.0, 0.5.0, 0.6.0, 0.7.0,
+and 0.7.1 select the preserved pre-dispatch evaluator. Build metadata is accepted;
+prereleases, version ranges, ambiguous declarations, and unsupported versions
+are rejected. Legacy support has no automatic sunset. Existing adopters need
+no guide, manifest, repository, or DNS changes to retain that behavior.
+
+Consumers requiring 1.0.0 should assert it and validate the strict response
+schema and `profile_selection.evaluated_policy`. An old server may ignore an
+unknown request field; HTTP 200 or a legacy Level 4 report is insufficient.
+
+The compatibility baseline is the verifier at 3ceb30a, not every historical
+verifier release. The included bounded-execution enforcement predates dispatch.
+
+## Validation
+
+- Full Python and UI contract suites pass, including 138 evals, 74 reference
+ fixtures, 84 contract fixtures, six strict cases, and mixed-request isolation.
+- All 74 captured local reports and 25 captured hosted responses match the
+ pre-dispatch baseline exactly. Nine legacy versions have 54 anchor scenarios.
+- All 25 discovered local guide paths and 16 public fetch/replay comparisons
+ matched. Separate production observations confirmed matching level and guide
+ hash for nine manifest-declaring adopters; all four observed Level 4 adopters
+ remained Level 4 in the candidate.
+- An isolated wheel installation exercised the actual console entry point.
+
+See [validation evidence](https://github.com/snapsynapse/guidecheck/blob/v1.0.0/docs/anchor-dispatch-validation.md)
+for methods and limitations. Finite adopter checks do not establish compatibility
+with every unknown external integration.
+
+## Artifacts and limits
+
+The source tarball, source ZIP, conformance kit, and SHA256SUMS are signed with
+Sigstore keyless in the tag-triggered release workflow. No package registry
+publication is part of this release; install the packaged source from this tag.
+
+The hosted verifier remains a preview. Local verification caps at Level 3;
+signed security.txt anchors are not fetched; runtime Level 5 conformance,
+execution-artifact fetching, and transitive scanning remain out of scope.
+Repository exclusion does not establish new administrative-independence proof
+for the other retained anchor channels.
diff --git a/api/verify.py b/api/verify.py
index 30bc10b..ac77e2e 100644
--- a/api/verify.py
+++ b/api/verify.py
@@ -41,7 +41,9 @@
sys.path.insert(0, _SCRIPTS)
import guidecheck_verify as gv # noqa: E402
-from guidecheck_constants import GUIDECHECK_VERSION, HOSTED_VERIFIER_NAME # noqa: E402
+from guidecheck_profiles import ProfileError, select_profile # noqa: E402
+from guidecheck_strict import decorate_report # noqa: E402
+from guidecheck_constants import GUIDECHECK_VERSION, HOSTED_VERIFIER_NAME, LEGACY_ENGINE_VERSION # noqa: E402
from guidecheck_fetch import FetchError, safe_fetch, variation_request_profile # noqa: E402
from guidecheck_hosted_anchors import ( # noqa: E402
DOH_ACCEPT,
@@ -53,7 +55,7 @@
HOSTED_NAME = HOSTED_VERIFIER_NAME
-HOSTED_VERSION = GUIDECHECK_VERSION
+HOSTED_VERSION = LEGACY_ENGINE_VERSION
WELL_KNOWN_PATH = "/.well-known/assistant-guide.txt"
MAX_REQUEST_BODY = 4096
MAX_OUTBOUND_FETCHES = 7
@@ -92,6 +94,7 @@ def __init__(self, fetcher=safe_fetch, max_fetches: int = MAX_OUTBOUND_FETCHES)
self.fetcher = fetcher
self.max_fetches = max_fetches
self.cache = {}
+ self.evidence = {}
self.outbound_fetches = 0
def fetch(self, url: str, request_profile: str = "default", accept_override: str | None = None):
@@ -437,6 +440,11 @@ def _fetch_text_evidence(
)
)
return None
+ fetch_context.evidence[evidence_kind] = {
+ "evidence_url": fetched.final_url,
+ "fetched_at": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"),
+ "redirects": fetched.redirects,
+ }
return _body_text(fetched.body)
@@ -570,7 +578,14 @@ def _fetch_dns_txt_anchor(
records, _dnssec_validated = parsed
if not records:
return None
- return select_dns_txt_record(records, canonical_url)
+ selected = select_dns_txt_record(records, canonical_url)
+ if selected is not None:
+ fetch_context.evidence["dns-txt anchor"] = {
+ "evidence_url": fetched.final_url,
+ "fetched_at": datetime.now(timezone.utc).isoformat().replace("+00:00", "Z"),
+ "redirects": fetched.redirects,
+ }
+ return selected
def _verifier_block() -> dict:
@@ -687,6 +702,8 @@ def build_evaluated(
now,
manifest_evidence=None,
cross_channel_anchors=None,
+ selection=None,
+ anchor_sources=None,
) -> dict:
data = fetched.body
blocking = sum(1 for f in findings if f.severity == "error")
@@ -721,6 +738,10 @@ def build_evaluated(
if note:
result["location_note"] = note
result["compact_report"] = _compact_report(result)
+ if selection is not None and selection.strict:
+ for anchor in result.get("cross_channel_anchors", []):
+ anchor.update((anchor_sources or {}).get(anchor["channel"] + " anchor", {}))
+ decorate_report(result, selection)
return result
@@ -733,6 +754,7 @@ def _write_json(self, status: int, payload: dict) -> None:
self.send_header("Content-Type", "application/json; charset=utf-8")
self.send_header("Content-Length", str(len(body)))
self.send_header("Cache-Control", "no-store")
+ self.send_header("X-GuideCheck-Dispatcher-Version", GUIDECHECK_VERSION)
self.send_header("X-Content-Type-Options", "nosniff")
self.end_headers()
self.wfile.write(body)
@@ -842,25 +864,35 @@ def fail(status: int, code: str, message: str) -> None:
self._write_json(200, build_not_a_guide(url, checked_url, auto_resolved, fetched, now))
return
+ try:
+ if "required_profile_version" in payload and not isinstance(payload["required_profile_version"], str):
+ raise ProfileError("profile-version-unsupported", "required_profile_version must be a string")
+ selection = select_profile(fetched.body, payload.get("required_profile_version"))
+ except ProfileError as exc:
+ fail(400, exc.code, exc.message)
+ return
+
hosted_fetch_findings = _header_findings(fetched)
hosted_fetch_findings.extend(_content_variation_findings(checked_url, fetched, fetch_context, now))
manifest_text, anchor_texts, hosted_evidence_findings = _hosted_level4_evidence(
fetched.body,
fetch_context,
)
- findings, achieved_level, level5_ready, manifest_evidence, cross_channel_anchors = gv.evaluate_guide(
- fetched.body,
- manifest_text,
- anchor_texts,
- now=now,
- # The hosted verifier fetches manifest and anchors over the network,
- # so it may assert Level 4; local-file mode (the default) caps at 3.
- evidence_fetched=True,
- )
+ try:
+ findings, achieved_level, level5_ready, manifest_evidence, cross_channel_anchors = gv.evaluate_guide(
+ fetched.body, manifest_text, anchor_texts, now=now,
+ evidence_fetched=True, selection=selection,
+ )
+ except ProfileError as exc:
+ fail(400, exc.code, exc.message)
+ return
if manifest_evidence is not None:
manifest_evidence.fetched = True
findings.extend(hosted_fetch_findings)
findings.extend(hosted_evidence_findings)
+ if selection.strict and any(f.severity == "error" and f.id.startswith(("anchor.", "manifest.")) for f in findings):
+ achieved_level = min(achieved_level, 3)
+ level5_ready = False
_log_product_event(
now=now,
started=started,
@@ -885,5 +917,7 @@ def fail(status: int, code: str, message: str) -> None:
now,
manifest_evidence,
cross_channel_anchors,
+ selection=selection,
+ anchor_sources=fetch_context.evidence,
),
)
diff --git a/decisions/AIDR-0001-same-control-plane-repository-anchors.md b/decisions/AIDR-0001-same-control-plane-repository-anchors.md
index 36b1494..59ee08e 100644
--- a/decisions/AIDR-0001-same-control-plane-repository-anchors.md
+++ b/decisions/AIDR-0001-same-control-plane-repository-anchors.md
@@ -30,12 +30,235 @@ Independence should follow compromise boundaries, not URL shape. When one GitHub
This position was written without reading any other participant's position.
+### Position: codex-gpt-6
+
+- agent: codex-gpt-6
+- model: gpt-6
+- provider: openai
+- stance: alternative
+- summary: Exclude repository-file evidence from Level 4 qualification when separate administration is unestablished; the first implementation must treat all supported repository fetches as corroboration because no positive independence evidence protocol exists.
+
+Prepared 2026-09-05 after reading Position codex-gpt-5. This is a dependent
+analysis, not an independent review. This proposal is non-normative and awaits
+Sam Rogers's arbitration. The existing position and Arbitration section are
+preserved.
+
+#### Rule proposed for arbitration
+
+A repository hash match establishes byte agreement. It does not establish
+separate credentials or a separate compromise boundary. Known shared
+administration MUST NOT qualify, and unknown administration MUST NOT qualify.
+Another qualifying matching channel may satisfy Level 4; it never changes the
+excluded repository's own qualification.
+
+For the first implementation, repository-file evidence is corroboration only.
+The current hosted fetch contract has no authenticated evidence of administrative
+separation. Therefore even an actually separate deployment remains unestablished
+to this verifier. This affects all repository-only Level 4 results, not just
+GitHub Pages. Do not hide that migration cost behind a Pages-specific warning.
+
+A future positive exception requires a separately specified, reviewed, testable
+evidence protocol. Do not introduce an operator checkbox, publisher assertion,
+hostname heuristic, or test-only `independent=true` input as that protocol.
+This proposal does not implement that exception or claim it already exists.
+
+#### Threat model and observable evidence
+
+The relevant attack is one authority changing both the served guide and the
+candidate anchor, including changing the source that an automatic deployment
+consumes. Different vendor names or runtime hosting accounts do not establish
+independence if one repository write triggers both publications. Conversely,
+sharing a vendor does not by itself establish shared customer credentials.
+The claim is bounded resistance to joint forgery, never publisher trust or safety.
+
+| Evidence | What it establishes | What it does not establish |
+|---|---|---|
+| Fetched repository bytes and manifest hash | Agreement at the observed fetch | Separate administration |
+| Repository commit identifier | Identity of that repository object | Who selected it or whether one actor can publish a new guide naming a different object |
+| Different domain, vendor, owner label, or custom domain | A routing or naming distinction | Disjoint write, deployment, recovery, SSO, or automation authority |
+| A repository CNAME file, workflow YAML, or server header | A publisher-controlled deployment claim or hint | Current enforced permissions or exhaustive deployment topology |
+| Authenticated hosting configuration identifying the same source and publication authority | Evidence of a shared path under the stated configuration | Absence of every other shared authority |
+| Independently authenticated, complete authority evidence | Potential basis for a future separation rule | A capability of the current public hosted fetcher |
+
+GitHub documents branch and Actions publication, including custom domains. A
+custom domain cannot serve as a test for independence. Actions publication does
+not require a repository CNAME file, so its absence cannot establish separation.
+These are deployment facts; the conclusion about independence is this position's
+threat-model inference.
+
+No extra authenticated-account access or topology crawling is proposed. The
+first hosted implementation reports repository independence as `unestablished`
+for every repository fetch, including obvious Pages cases. That is deliberately
+less specific than asserting shared administration from URL shape. Known-shared
+scenarios still have a deterministic outcome: no repository qualification.
+
+The other recognized channels retain their current rules in this bounded
+proposal. DNS, registry, and log results are not newly certified as having
+disjoint credentials. The existing limitations of those adapters remain; this
+decision cannot justify a broader claim that all administrative separation has
+been verified. Signed security.txt remains unavailable to the hosted fetcher.
+
+#### Actual evaluation path and required implementation boundaries
+
+At baseline `3ceb30a58488f925844c51c5aad0bc0f94633ff7`:
+
+1. `derive_repository_file_url` allows GitHub repository URLs and derives a raw
+ file URL. Its allowlist controls fetch support, not independence.
+2. `_hosted_level4_evidence` inserts fetched repository text in `anchor_texts`
+ without administration evidence. `_fetch_text_evidence` returns text, so the
+ downstream anchor object does not retain the fetch URL and redirect details.
+3. `check_anchors` produces `present-matches` from hash equality and uses that
+ same status to suppress `anchor.independent.missing`.
+4. `evaluate_guide` separately counts any `present-matches` as enough for Level 4.
+ Its computed `level4_blockers` set is not itself an eligibility condition.
+5. The hosted caller appends fetch findings after level calculation. Adding a
+ warning or even a blocking finding there cannot reliably lower the level.
+6. Local mode caps otherwise consistent fetched-style evidence at Level 3.
+ Human reports currently derive `Hash pinned` from achieved level alone.
+
+The fix must preserve observed evidence while using one shared qualification
+predicate in both the missing-anchor check and the final level calculation.
+All Level 4 blockers must prevent Level 4; they must not reduce an otherwise
+valid Level 3 result. Eligibility must be resolved before building either report.
+No later reconstruction from hash status may restore an excluded anchor.
+
+Proposed predicate: a qualifying match is a supported, fetched, usable matching
+anchor that satisfies its channel's qualification rule. Repository-file never
+satisfies that rule in this first implementation. Local supplied files never
+satisfy the fetched condition. The same core predicate serves both callers;
+`evidence_fetched=True` alone cannot promote a repository match.
+
+#### Findings and human/machine contract
+
+Retain `status` as the hash/availability result. Add required output fields to
+each emitted anchor: `qualifies_for_level4` (boolean) and `qualification_reason`
+(a closed enum: `qualifying-channel`, `repository-independence-unestablished`,
+`local-evidence-not-fetched`, `hash-mismatch`, `unreachable`, `absent`). Reason
+precedence is availability, mismatch, local mode, then channel policy. Add
+`independence: unestablished` to repository evidence, separately from the reason.
+Other channels do not gain an `independence: established` assertion.
+
+Preserve available source URL, fetch time, and redirect evidence through the
+hosted evidence adapter; never fabricate a commit SHA from a branch or tag.
+Unsupported repository hosts retain their existing info finding and are not
+fetched. Missing and unreachable sources must be distinguishable in evidence
+or findings. Unsupported caller-supplied channel names must never qualify.
+
+Proposed new finding: `anchor.repository-file.independence-unestablished`,
+warning, for a usable repository hash whose independence cannot qualify.
+Keep its hash and observed status visible. Emit `anchor.independent.missing`
+as an error for a Level 4 claim with no qualifying matching anchor, unless an
+existing mismatch error already explains the failure.
+
+Preserve conservative conflict blocking: a found repository hash mismatch still
+blocks Level 4 even though a repository match cannot supply positive provenance.
+Use a new `anchor.repository-file.mismatch` error so the message does not call
+excluded evidence independent. Other channel mismatches retain
+`anchor.independent.mismatch`. A matching DNS anchor does not erase a conflicting
+repository hash. This avoids silently weakening the existing divergence check.
+
+Human output must show, for example, "Repository hash: matches; independent
+provenance: unestablished; counts toward Level 4: no" and a qualifying-anchor
+count derived from the same booleans. A repository-only Level 4 claim reports
+Level 3, `Hash pinned: no`, and `Proceed? no` due to the missing-anchor error.
+Repository plus qualifying DNS reports Level 4 with the repository warning
+visible. `Proceed?` remains the verifier's finding result, not human execution
+approval. Local mode reports hash consistency, a Level 3 cap, and no fetched
+provenance. Neither report implies safety or publisher trust.
+
+#### Proposed fixture outcomes
+
+These are acceptance criteria for arbitration, not implemented or passing tests.
+Unless specified, every case has valid Level 3 content and a valid manifest and
+claims Level 4. "Other qualifying channel" assumes its existing channel contract
+is satisfied; merely naming a DNS or registry URL is insufficient.
+
+| Scenario | Repository qualification | Expected result |
+|---|---|---|
+| Known shared administration; only matching repository | False; unestablished to the public fetcher | Level 3; repository warning and missing-anchor error |
+| Known shared administration; matching repository plus qualifying matching DNS | False | Level 4; one qualifying channel; repository warning remains |
+| Genuinely separate administration, supported by external audit evidence but no supported verifier evidence protocol | False | Level 3; unestablished, not a claim that the audit is false |
+| Separate domain/vendor or a different GitHub owner only | False | Level 3; naming is insufficient |
+| Custom-domain Pages, with or without CNAME file | False | Same result as repository-only Pages; no hostname bypass |
+| Tagged or commit-pinned matching repository only | False | Level 3; immutability does not prove independence |
+| Canonical/final URL or redirect changes with identical repository bytes | False | No promotion from routing changes; retain fetch evidence |
+| Repository mismatch plus qualifying matching DNS | False | Level 3; repository mismatch error, no Level 4 |
+| Repository match plus mismatching recognized channel | False | Level 3; independent mismatch error |
+| Unsupported repository host only | No fetched anchor | Level 3; existing unsupported-host info and missing-anchor error |
+| Missing/unreachable repository only | False or no usable anchor | Level 3; missing-anchor error and available fetch diagnostics |
+| Missing/unreachable repository plus qualifying matching DNS | False or no usable anchor | Level 4; availability finding does not block |
+| Matching local repository and DNS files | False for all local evidence | At most Level 3; consistency visible, missing fetched qualification explicit |
+| Hosted caller passes matching repository and `evidence_fetched=True` | False | Level 3; core evaluator cannot bypass channel policy |
+| Unknown channel injected into shared evaluator | False | Cannot satisfy missing-anchor check or Level 4 calculation |
+| Lower-level guide without a Level 4 claim and repository corroboration | False | No missing-Level-4 error solely from the repository policy |
+| Human report, JSON, and hosted UI for each case | Identical qualification | Level, findings, anchor count, and limitations agree |
+
+A positive repository-independence fixture is intentionally unavailable in the
+first slice. A genuine separate-control-plane case tests the honest unknown
+outcome. Fabricating a positive fixture without an implementable evidence
+protocol would not resolve the handoff's evidence requirement.
+
+#### Alternatives and compatibility
+
+| Alternative | Benefit | Consequence |
+|---|---|---|
+| Keep current channel recognition | No adopter migration | Matching self-publication continues to claim independent provenance |
+| Exclude only obvious same-repository Pages URLs; count unknown cases | Narrow change | Custom domains and opaque deployment chains can bypass the rule; false Level 4 claims remain |
+| Recommended first slice: repository corroboration only | Deterministic rule; no invented evidence; closes unknown-state bypass | Genuine independent repository-only deployments also lose Level 4 until another qualifying channel is available |
+| Build an administration-evidence protocol now | Could admit genuine separation | Requires credential, delegation, freshness, revocation, and trusted-evidence design beyond the bounded slice |
+
+The general independence language already requires different credentials, but
+the public-repository subsection explicitly grants anchor status and current
+hosted tests award Level 4 for same-repository Pages. The proposed change
+invalidates existing accepted results and adds required output semantics.
+Under CONTRIBUTING.md and INTENT.md this is a MAJOR profile change, with 1.0.0
+the next major number from 0.7.1. Do not ship it as a 0.7.x patch or silently
+change 0.7.1 conformance semantics. A legacy result must remain identified by
+its old verifier/profile version; it is not upgraded by relabeling.
+
+Adopter impact is known qualitatively, not counted across the portfolio. Existing
+repository-only hosted regression cases must change in the new-profile suite.
+Before release, inventory affected first-party claims read-only and provide
+migration guidance: retain repository corroboration and supply another channel
+that meets its existing qualification contract. Local Level 3 remains available.
+Any external anchor mutation or cross-repository remediation is separate work.
+
+The coherent implementation touches spec section 11 and Level 4 language,
+verifier-conformance sections 6/23/25 and report rules, finding-ids, output schema,
+both evidence/evaluation callers, hosted UI and examples, static fixtures,
+hosted regressions, adoption/operator guidance, threat register, CHANGELOG,
+and version-synchronized surfaces. No normative or verifier changes are made
+by recording this proposal. After arbitration, full `make test`, new boundary
+regressions, schema/report parity checks, and `git diff --check` are required.
+
## Objections
+### Objection: codex-gpt-6 to Position codex-gpt-5
+
+The phrase "unless another distinct control-plane anchor also validates" could
+be implemented by restoring qualification to the repository when DNS matches.
+The other channel should satisfy the requirement on its own; repository evidence
+must remain excluded. Also, "a testable basis" for genuine separation is not yet
+an input contract or a supported public evidence source. Counting unknown cases
+until that basis exists would retain the bypass for custom domains and opaque
+deployment chains. My alternative makes the resulting broader migration cost
+explicit rather than claiming a narrow Pages detector solves it.
+
## Arbitration
## Evidence
+- Sam Rogers approved the revised proposal on 2026-09-05 with the verbatim instruction: "Proposal approved. Please continue". This approves local implementation subject to the previously recorded compatibility condition. [Implementation validation](../docs/anchor-dispatch-validation.md) and [adopter receipts](../docs/anchor-dispatch-adopters.json) record the resulting evidence; they do not claim release or deployment. The original positions, objections, and human-owned Arbitration section remain preserved.
+- [Revised version-aware dispatch proposal](../docs/anchor-policy-compatibility.md#dispatch-design), requested by Sam on 2026-09-05, specifies legacy/strict routing, caller profile assertions, manifest consistency, isolated engine identities, separate output contracts, unchanged self-guide artifacts, and paired compatibility gates. This current proposal limits strict enforcement to the new profile and replaces the original dependent position's unconditional migration consequence. Original positions and objections remain preserved. It is ready for local implementation under Sam's compatibility condition; release readiness is not yet established.
+- [Compatibility contract and Sam's verbatim conditional approval](../docs/anchor-policy-compatibility.md), recorded 2026-09-05, constrain the proposal: existing Level 4 adopters must retain legacy behavior; the stricter policy requires explicit new-profile selection. A version bump alone does not satisfy that condition. The proposal's forced-migration consequence is not approved for legacy guides. No agent-authored arbitration is inserted here.
+- [Shared anchor evaluation](../scripts/guidecheck_verify.py) contains `check_anchors`, `evaluate_guide`, `AnchorEvidence`, and the local report; inspected at baseline 3ceb30a.
+- [Hosted evidence and report](../api/verify.py) fetches repository text and appends hosted findings after core level calculation.
+- [Repository URL derivation](../scripts/guidecheck_hosted_anchors.py) is fetch support with no administration resolver; [fetch safety](../scripts/guidecheck_fetch.py) enforces transport limits, not administrative independence.
+- [Hosted regression cases](../scripts/test_hosted_api.py) include `test_evaluated_level4_repository_file_github`, which expects Level 4 from same-repository Pages with no DNS record, and tag/commit URL variants.
+- [Output schema](../schemas/verifier-output.schema.json) currently distinguishes anchor hash/availability status but has no qualification or independence fields.
+- [Profile section 11](../spec.md#11-guide-metadata) defines different-credential independence but also explicitly recognizes public repository files.
+- [Contribution versioning](../CONTRIBUTING.md#profile-versioning) and [INTENT admission criteria](../INTENT.md#admission-criteria-for-changes) require a major version for tightened constraints or invalidated conformance.
+- [GitHub Pages publishing sources](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site) and [custom domains](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site), consulted 2026-09-05, support the deployment facts; they do not prove an individual publisher's administration is separate.
- [Current work queue](../roadmap.md#current-work-queue-reconciled-2026-09-05) identifies same-control-plane repository anchors as the next normative independence decision.
- [Verifier conformance section 23](../verifier-conformance.md#23-cross-channel-anchor-checks) defines recognized independent channels and the Level 4 anchor requirement.
- [Threat register](../threat-register.md#provenance-anchor-risks) explains that Level 4 is intended to raise the cost of forging the guide and provenance evidence together.
diff --git a/docs/anchor-dispatch-adopters.json b/docs/anchor-dispatch-adopters.json
new file mode 100644
index 0000000..f9d758b
--- /dev/null
+++ b/docs/anchor-dispatch-adopters.json
@@ -0,0 +1,831 @@
+{
+ "baseline_commit": "3ceb30a58488f925844c51c5aad0bc0f94633ff7",
+ "method": "baseline hosted evaluator fetches public bytes once; candidate replays identical responses at identical time; local reports compared at fixed time",
+ "local": {
+ "inputs": [
+ {
+ "repo": "agentlink",
+ "path": "agentlink/assistant-guide.txt",
+ "profile-version": "0.7.1",
+ "canonical-url": "https://agentlink.run/.well-known/assistant-guide.txt",
+ "manifest-url": "https://agentlink.run/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.7.1, <0.8.0",
+ "sha256": "9cec5d600628081db15accbe6136ede96f5a845272a5d1bb9fe3af1d9c17531f",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "agentlink",
+ "path": "agentlink/docs/.well-known/assistant-guide.txt",
+ "profile-version": "0.7.1",
+ "canonical-url": "https://agentlink.run/.well-known/assistant-guide.txt",
+ "manifest-url": "https://agentlink.run/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.7.1, <0.8.0",
+ "sha256": "9cec5d600628081db15accbe6136ede96f5a845272a5d1bb9fe3af1d9c17531f",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "ai-incident-law",
+ "path": "ai-incident-law/assistant-guide.txt",
+ "profile-version": "0.6.0",
+ "canonical-url": "https://aiincidentlaw.org/.well-known/assistant-guide.txt",
+ "manifest-url": "https://aiincidentlaw.org/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.6.0, <0.7.0",
+ "sha256": "3fed9ab654aa04ccd5b0e908a0ace6138fefed3a73463d3daf9c8ebf5491cc08",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "ai-posture",
+ "path": "ai-posture/assistant-guide.txt",
+ "profile-version": "0.3.0",
+ "canonical-url": "https://aiposture.org/.well-known/assistant-guide.txt",
+ "manifest-url": "https://aiposture.org/.well-known/assistant-guide-manifest.json",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.3.0, <0.4.0",
+ "sha256": "0e53ec62f8651da26707abb1601f5431912879a592cdd61b1959cb3fe794c2a8",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "ai-posture",
+ "path": "ai-posture/docs/.well-known/assistant-guide.txt",
+ "profile-version": "0.3.0",
+ "canonical-url": "https://aiposture.org/.well-known/assistant-guide.txt",
+ "manifest-url": "https://aiposture.org/.well-known/assistant-guide-manifest.json",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.3.0, <0.4.0",
+ "sha256": "0e53ec62f8651da26707abb1601f5431912879a592cdd61b1959cb3fe794c2a8",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "audible-pdf-renamer",
+ "path": "audible-pdf-renamer/assistant-guide.txt",
+ "profile-version": "0.4.0",
+ "canonical-url": "https://raw.githubusercontent.com/snapsynapse/audible-pdf-renamer/main/.well-known/assistant-guide.txt",
+ "manifest-url": null,
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.4.0, <0.5.0",
+ "sha256": "0d98430b1190fd019899476bf95a7e45439d932408e0eb91dc8497034aeed2b5",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "graceful-boundaries",
+ "path": "graceful-boundaries/assistant-guide.txt",
+ "profile-version": "0.3.0",
+ "canonical-url": "https://gracefulboundaries.dev/.well-known/assistant-guide.txt",
+ "manifest-url": null,
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.3.0, <0.4.0",
+ "sha256": "7dbf6472d5a49905054b0d541c27a4246bdc1f10e5d7bb9c16c028fa04b8bfdd",
+ "baseline_level": 2,
+ "candidate_level": 2,
+ "exact_report_match": true
+ },
+ {
+ "repo": "guidecheck",
+ "path": "guidecheck/assistant-guide.txt",
+ "profile-version": "0.7.1",
+ "canonical-url": "https://guidecheck.org/.well-known/assistant-guide.txt",
+ "manifest-url": "https://guidecheck.org/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.7.0, <0.8.0",
+ "sha256": "4b30202c809a3db037290371da8fed6a9681255199e0e19cfe1a0a7fc1d5df9e",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "guidecheck",
+ "path": "guidecheck/docs/.well-known/assistant-guide.txt",
+ "profile-version": "0.7.1",
+ "canonical-url": "https://guidecheck.org/.well-known/assistant-guide.txt",
+ "manifest-url": "https://guidecheck.org/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.7.0, <0.8.0",
+ "sha256": "4b30202c809a3db037290371da8fed6a9681255199e0e19cfe1a0a7fc1d5df9e",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "harnessie",
+ "path": "harnessie/assistant-guide.txt",
+ "profile-version": "0.7.1",
+ "canonical-url": "https://harnessie.com/.well-known/assistant-guide.txt",
+ "manifest-url": "https://harnessie.com/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.7.1, <0.8.0",
+ "sha256": "ff77d219add6f1cf6a22c4570830f9fbd70cedd59f3caa933fbd0c7ae3733421",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "harnessie",
+ "path": "harnessie/docs/.well-known/assistant-guide.txt",
+ "profile-version": "0.7.1",
+ "canonical-url": "https://harnessie.com/.well-known/assistant-guide.txt",
+ "manifest-url": "https://harnessie.com/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.7.1, <0.8.0",
+ "sha256": "ff77d219add6f1cf6a22c4570830f9fbd70cedd59f3caa933fbd0c7ae3733421",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "knowledge-as-code-template",
+ "path": "knowledge-as-code-template/assistant-guide.txt",
+ "profile-version": "0.3.0",
+ "canonical-url": "https://knowledge-as-code.com/.well-known/assistant-guide.txt",
+ "manifest-url": "https://knowledge-as-code.com/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.3.0, <0.4.0",
+ "sha256": "1f5f955fd03b8a3a176cec4bd312bb36bdf81a42922e659ca447417345493276",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "obligation-first",
+ "path": "obligation-first/assistant-guide.txt",
+ "profile-version": "0.2.0",
+ "canonical-url": "https://obligationfirst.org/.well-known/assistant-guide.txt",
+ "manifest-url": "https://obligationfirst.org/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.2.0, <0.3.0",
+ "sha256": "3953f5a26e64a0510183618aa6bffad3cba9c3c254277cf4d9db7d24ce1db841",
+ "baseline_level": 2,
+ "candidate_level": 2,
+ "exact_report_match": true
+ },
+ {
+ "repo": "obligation-first",
+ "path": "obligation-first/docs/.well-known/assistant-guide.txt",
+ "profile-version": "0.2.0",
+ "canonical-url": "https://obligationfirst.org/.well-known/assistant-guide.txt",
+ "manifest-url": "https://obligationfirst.org/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.2.0, <0.3.0",
+ "sha256": "3953f5a26e64a0510183618aa6bffad3cba9c3c254277cf4d9db7d24ce1db841",
+ "baseline_level": 2,
+ "candidate_level": 2,
+ "exact_report_match": true
+ },
+ {
+ "repo": "paice-foundation",
+ "path": "paice-foundation/docs/.well-known/assistant-guide.txt",
+ "profile-version": "0.3.0",
+ "canonical-url": "https://paice.foundation/.well-known/assistant-guide.txt",
+ "manifest-url": null,
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.3.0, <0.4.0",
+ "sha256": "e70be4246f01f4a1f1c390969b9731d5d0d2011ede4120d11004b84d21285279",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "prompter-kit",
+ "path": "prompter-kit/assistant-guide.txt",
+ "profile-version": "0.7.1",
+ "canonical-url": "https://prompterkit.app/.well-known/assistant-guide.txt",
+ "manifest-url": "https://prompterkit.app/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.7.1, <0.8.0",
+ "sha256": "1b73f93f9f466de6f7b5f69182535d10c65e37e1cdf4427efa15d8508dfe6558",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "prompter-kit",
+ "path": "prompter-kit/docs/.well-known/assistant-guide.txt",
+ "profile-version": "0.7.1",
+ "canonical-url": "https://prompterkit.app/.well-known/assistant-guide.txt",
+ "manifest-url": "https://prompterkit.app/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.7.1, <0.8.0",
+ "sha256": "1b73f93f9f466de6f7b5f69182535d10c65e37e1cdf4427efa15d8508dfe6558",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "resume",
+ "path": "resume/public/.well-known/assistant-guide.txt",
+ "profile-version": "0.4.0",
+ "canonical-url": "https://resume.sam-rogers.com/.well-known/assistant-guide.txt",
+ "manifest-url": null,
+ "verifier-conformance": null,
+ "sha256": "fb30ba7aa705235cd13539b9cdec6fd660de30118f877153fae028aecb92bede",
+ "baseline_level": 0,
+ "candidate_level": 0,
+ "exact_report_match": true
+ },
+ {
+ "repo": "siteline",
+ "path": "siteline/assistant-guide.txt",
+ "profile-version": "0.7.0",
+ "canonical-url": "https://siteline.to/.well-known/assistant-guide.txt",
+ "manifest-url": null,
+ "verifier-conformance": null,
+ "sha256": "3fc667ce18988c256552b42df7a0253657df567da9fb26b64a2d4da7a520c2e0",
+ "baseline_level": 0,
+ "candidate_level": 0,
+ "exact_report_match": true
+ },
+ {
+ "repo": "skill-a11y-audit",
+ "path": "skill-a11y-audit/assistant-guide.txt",
+ "profile-version": "0.7.0",
+ "canonical-url": "https://skilla11y.dev/.well-known/assistant-guide.txt",
+ "manifest-url": "https://skilla11y.dev/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.7.0, <0.8.0",
+ "sha256": "81fed93eac293f63897daf3c4ebc283cf9ad9efa194893fe93ddae58c5da3c78",
+ "baseline_level": 2,
+ "candidate_level": 2,
+ "exact_report_match": true
+ },
+ {
+ "repo": "skill-a11y-audit",
+ "path": "skill-a11y-audit/docs/.well-known/assistant-guide.txt",
+ "profile-version": "0.7.0",
+ "canonical-url": "https://skilla11y.dev/.well-known/assistant-guide.txt",
+ "manifest-url": "https://skilla11y.dev/.well-known/assistant-guide-manifest.txt",
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.7.0, <0.8.0",
+ "sha256": "81fed93eac293f63897daf3c4ebc283cf9ad9efa194893fe93ddae58c5da3c78",
+ "baseline_level": 2,
+ "candidate_level": 2,
+ "exact_report_match": true
+ },
+ {
+ "repo": "substack2md",
+ "path": "substack2md/assistant-guide.txt",
+ "profile-version": "0.3.0",
+ "canonical-url": "https://substack2md.space/.well-known/assistant-guide.txt",
+ "manifest-url": null,
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.3.0, <0.4.0",
+ "sha256": "83897a41301889d763d2280d8cddce1f88d4ffc219c98c8b0289a2ecc209b404",
+ "baseline_level": 2,
+ "candidate_level": 2,
+ "exact_report_match": true
+ },
+ {
+ "repo": "substack2md",
+ "path": "substack2md/docs/.well-known/assistant-guide.txt",
+ "profile-version": "0.3.0",
+ "canonical-url": "https://substack2md.space/.well-known/assistant-guide.txt",
+ "manifest-url": null,
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.3.0, <0.4.0",
+ "sha256": "83897a41301889d763d2280d8cddce1f88d4ffc219c98c8b0289a2ecc209b404",
+ "baseline_level": 2,
+ "candidate_level": 2,
+ "exact_report_match": true
+ },
+ {
+ "repo": "virtual-classroom-watch",
+ "path": "virtual-classroom-watch/assistant-guide.txt",
+ "profile-version": "0.7.1",
+ "canonical-url": "https://VirtualClassroom.watch/.well-known/assistant-guide.txt",
+ "manifest-url": null,
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.7.0, <0.8.0",
+ "sha256": "b6217bcb9632000d4efcb1312a6ff41fb2cc7a2a853f254ac2eccee3322e6acd",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ },
+ {
+ "repo": "virtual-classroom-watch",
+ "path": "virtual-classroom-watch/docs/.well-known/assistant-guide.txt",
+ "profile-version": "0.7.1",
+ "canonical-url": "https://VirtualClassroom.watch/.well-known/assistant-guide.txt",
+ "manifest-url": null,
+ "verifier-conformance": "human-verifiable-assistant-guide-verifier >=0.7.0, <0.8.0",
+ "sha256": "b6217bcb9632000d4efcb1312a6ff41fb2cc7a2a853f254ac2eccee3322e6acd",
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "exact_report_match": true
+ }
+ ],
+ "ci_references": [
+ {
+ "repo": "ai-incident-law",
+ "file": "scripts/validate-guidecheck.mjs",
+ "line": 160,
+ "text": "console.error(\"GuideCheck validation failed:\\n\");"
+ },
+ {
+ "repo": "ai-incident-law",
+ "file": "scripts/validate-guidecheck.mjs",
+ "line": 168,
+ "text": "`Validated GuideCheck assistant guide and fallbacks (${bytes.length} bytes, ${lines.length} lines, sha256 ${guideSha256}).`"
+ },
+ {
+ "repo": "obligation-first",
+ "file": "scripts/validate-repo-contracts.mjs",
+ "line": 53,
+ "text": "\"guidecheck.org\","
+ },
+ {
+ "repo": "obligation-first",
+ "file": "scripts/validate-repo-contracts.mjs",
+ "line": 54,
+ "text": "\"www.guidecheck.org\","
+ },
+ {
+ "repo": "obligation-first",
+ "file": "scripts/validate-repo-contracts.mjs",
+ "line": 362,
+ "text": "failures.push(`assistant-guide.txt: file exceeds GuideCheck 8192-byte limit (${rootBytes.length})`);"
+ },
+ {
+ "repo": "obligation-first",
+ "file": "scripts/validate-repo-contracts.mjs",
+ "line": 368,
+ "text": "failures.push(`assistant-guide.txt: file exceeds GuideCheck 400-line limit (${lines.length})`);"
+ },
+ {
+ "repo": "obligation-first",
+ "file": "scripts/validate-repo-contracts.mjs",
+ "line": 374,
+ "text": "failures.push(`assistant-guide.txt:${lineFor(text, i)}: byte outside GuideCheck ASCII profile`);"
+ },
+ {
+ "repo": "obligation-first",
+ "file": "scripts/validate-repo-contracts.mjs",
+ "line": 381,
+ "text": "failures.push(`assistant-guide.txt:${index + 1}: line exceeds GuideCheck 120-byte limit`);"
+ },
+ {
+ "repo": "obligation-first",
+ "file": "scripts/validate-repo-contracts.mjs",
+ "line": 390,
+ "text": "\"recommended-verifier: https://guidecheck.org/verify\","
+ },
+ {
+ "repo": "obligation-first",
+ "file": "scripts/validate-repo-contracts.mjs",
+ "line": 398,
+ "text": "\"GuideCheck conformance is a form claim, not a safety claim.\","
+ },
+ {
+ "repo": "obligation-first",
+ "file": "scripts/validate-repo-contracts.mjs",
+ "line": 403,
+ "text": "failures.push(`assistant-guide.txt: missing required GuideCheck content: ${snippet}`);"
+ },
+ {
+ "repo": "obligation-first",
+ "file": "scripts/make-release.mjs",
+ "line": 170,
+ "text": "
"
+ },
+ {
+ "repo": "prompter-kit",
+ "file": "scripts/check_agent_surfaces.py",
+ "line": 1,
+ "text": "\"\"\"Check published copies and metadata; this is not a GuideCheck verifier.\"\"\""
+ },
+ {
+ "repo": "resume",
+ "file": "scripts/validate-metadata.mjs",
+ "line": 80,
+ "text": "fail(\"api-manifest.json: must declare GuideCheck Level 3\");"
+ },
+ {
+ "repo": "resume",
+ "file": "scripts/validate-metadata.mjs",
+ "line": 85,
+ "text": "if (apiManifest.standards?.guidecheck?.url !== \"https://guidecheck.org/\") {"
+ },
+ {
+ "repo": "resume",
+ "file": "scripts/validate-metadata.mjs",
+ "line": 86,
+ "text": "fail(\"api-manifest.json: must link canonical GuideCheck spec\");"
+ },
+ {
+ "repo": "resume",
+ "file": "scripts/validate-metadata.mjs",
+ "line": 101,
+ "text": "\"conformance-target: GuideCheck Level 3\","
+ },
+ {
+ "repo": "skill-a11y-audit",
+ "file": ".github/workflows/validate-skill.yml",
+ "line": 55,
+ "text": "- name: Checkout pinned GuideCheck verifier"
+ },
+ {
+ "repo": "skill-a11y-audit",
+ "file": ".github/workflows/validate-skill.yml",
+ "line": 63,
+ "text": "- name: Verify assistant guide against GuideCheck 0.7.0"
+ },
+ {
+ "repo": "skill-a11y-audit",
+ "file": ".github/workflows/validate-skill.yml",
+ "line": 64,
+ "text": "run: python3 .guidecheck/scripts/guidecheck_verify.py assistant-guide.txt --pretty"
+ }
+ ]
+ },
+ "public_fetch_replay": [
+ {
+ "repo": "agentlink",
+ "url": "https://agentlink.run/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:38.761622+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 4,
+ "candidate_level": 4,
+ "guide_sha256": "9cec5d600628081db15accbe6136ede96f5a845272a5d1bb9fe3af1d9c17531f",
+ "outcome": "evaluated",
+ "fetches": 5,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "ai-incident-law",
+ "url": "https://aiincidentlaw.org/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:39.573859+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 4,
+ "candidate_level": 4,
+ "guide_sha256": "3fed9ab654aa04ccd5b0e908a0ace6138fefed3a73463d3daf9c8ebf5491cc08",
+ "outcome": "evaluated",
+ "fetches": 5,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "ai-posture",
+ "url": "https://aiposture.org/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:40.288692+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "guide_sha256": "0e53ec62f8651da26707abb1601f5431912879a592cdd61b1959cb3fe794c2a8",
+ "outcome": "evaluated",
+ "fetches": 5,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "audible-pdf-renamer",
+ "url": "https://raw.githubusercontent.com/snapsynapse/audible-pdf-renamer/main/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:41.284986+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "guide_sha256": "0d98430b1190fd019899476bf95a7e45439d932408e0eb91dc8497034aeed2b5",
+ "outcome": "evaluated",
+ "fetches": 2,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "graceful-boundaries",
+ "url": "https://gracefulboundaries.dev/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:41.536163+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 2,
+ "candidate_level": 2,
+ "guide_sha256": "7dbf6472d5a49905054b0d541c27a4246bdc1f10e5d7bb9c16c028fa04b8bfdd",
+ "outcome": "evaluated",
+ "fetches": 2,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "guidecheck",
+ "url": "https://guidecheck.org/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:41.809595+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "guide_sha256": "4b30202c809a3db037290371da8fed6a9681255199e0e19cfe1a0a7fc1d5df9e",
+ "outcome": "evaluated",
+ "fetches": 5,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "harnessie",
+ "url": "https://harnessie.com/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:42.782866+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "guide_sha256": "ff77d219add6f1cf6a22c4570830f9fbd70cedd59f3caa933fbd0c7ae3733421",
+ "outcome": "evaluated",
+ "fetches": 6,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "knowledge-as-code-template",
+ "url": "https://knowledge-as-code.com/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:43.642064+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 4,
+ "candidate_level": 4,
+ "guide_sha256": "1f5f955fd03b8a3a176cec4bd312bb36bdf81a42922e659ca447417345493276",
+ "outcome": "evaluated",
+ "fetches": 5,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "obligation-first",
+ "url": "https://obligationfirst.org/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:44.377009+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 2,
+ "candidate_level": 2,
+ "guide_sha256": "3953f5a26e64a0510183618aa6bffad3cba9c3c254277cf4d9db7d24ce1db841",
+ "outcome": "evaluated",
+ "fetches": 5,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "paice-foundation",
+ "url": "https://paice.foundation/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:45.096143+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "guide_sha256": "e70be4246f01f4a1f1c390969b9731d5d0d2011ede4120d11004b84d21285279",
+ "outcome": "evaluated",
+ "fetches": 2,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "prompter-kit",
+ "url": "https://prompterkit.app/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:45.345298+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 4,
+ "candidate_level": 4,
+ "guide_sha256": "1b73f93f9f466de6f7b5f69182535d10c65e37e1cdf4427efa15d8508dfe6558",
+ "outcome": "evaluated",
+ "fetches": 6,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "resume",
+ "url": "https://resume.sam-rogers.com/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:46.182467+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 0,
+ "candidate_level": 0,
+ "guide_sha256": "fb30ba7aa705235cd13539b9cdec6fd660de30118f877153fae028aecb92bede",
+ "outcome": "evaluated",
+ "fetches": 2,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "siteline",
+ "url": "https://siteline.to/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:46.787088+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 0,
+ "candidate_level": 0,
+ "guide_sha256": "3fc667ce18988c256552b42df7a0253657df567da9fb26b64a2d4da7a520c2e0",
+ "outcome": "evaluated",
+ "fetches": 2,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "skill-a11y-audit",
+ "url": "https://skilla11y.dev/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:47.237806+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 2,
+ "candidate_level": 2,
+ "guide_sha256": "81fed93eac293f63897daf3c4ebc283cf9ad9efa194893fe93ddae58c5da3c78",
+ "outcome": "evaluated",
+ "fetches": 5,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "substack2md",
+ "url": "https://substack2md.space/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:47.998560+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 2,
+ "candidate_level": 2,
+ "guide_sha256": "83897a41301889d763d2280d8cddce1f88d4ffc219c98c8b0289a2ecc209b404",
+ "outcome": "evaluated",
+ "fetches": 2,
+ "replay_used_same_fetches": true
+ },
+ {
+ "repo": "virtual-classroom-watch",
+ "url": "https://VirtualClassroom.watch/.well-known/assistant-guide.txt",
+ "observed_at": "2026-09-06T02:13:48.274996+00:00",
+ "exact_report_match": true,
+ "baseline_status": 200,
+ "candidate_status": 200,
+ "baseline_level": 3,
+ "candidate_level": 3,
+ "guide_sha256": "b6217bcb9632000d4efcb1312a6ff41fb2cc7a2a853f254ac2eccee3322e6acd",
+ "outcome": "evaluated",
+ "fetches": 2,
+ "replay_used_same_fetches": true
+ }
+ ],
+ "production_level_comparison": [
+ {
+ "url": "https://agentlink.run/.well-known/assistant-guide.txt",
+ "production_level": 4,
+ "production_sha256": "9cec5d600628081db15accbe6136ede96f5a845272a5d1bb9fe3af1d9c17531f",
+ "production_error_ids": [],
+ "candidate_level": 4,
+ "candidate_sha256": "9cec5d600628081db15accbe6136ede96f5a845272a5d1bb9fe3af1d9c17531f",
+ "verifier": {
+ "name": "guidecheck-hosted",
+ "version": "0.7.1",
+ "verifier_profile": "human-verifiable-assistant-guide-verifier",
+ "verifier_profile_version": "0.7.1",
+ "guide_profile": "human-verifiable-assistant-guide",
+ "guide_profile_version": "0.7.1"
+ },
+ "same_bytes": true,
+ "same_level": true
+ },
+ {
+ "url": "https://aiincidentlaw.org/.well-known/assistant-guide.txt",
+ "production_level": 4,
+ "production_sha256": "3fed9ab654aa04ccd5b0e908a0ace6138fefed3a73463d3daf9c8ebf5491cc08",
+ "production_error_ids": [],
+ "candidate_level": 4,
+ "candidate_sha256": "3fed9ab654aa04ccd5b0e908a0ace6138fefed3a73463d3daf9c8ebf5491cc08",
+ "verifier": {
+ "name": "guidecheck-hosted",
+ "version": "0.7.1",
+ "verifier_profile": "human-verifiable-assistant-guide-verifier",
+ "verifier_profile_version": "0.7.1",
+ "guide_profile": "human-verifiable-assistant-guide",
+ "guide_profile_version": "0.7.1"
+ },
+ "same_bytes": true,
+ "same_level": true
+ },
+ {
+ "url": "https://aiposture.org/.well-known/assistant-guide.txt",
+ "production_level": 3,
+ "production_sha256": "0e53ec62f8651da26707abb1601f5431912879a592cdd61b1959cb3fe794c2a8",
+ "production_error_ids": [
+ "manifest.missing-required"
+ ],
+ "candidate_level": 3,
+ "candidate_sha256": "0e53ec62f8651da26707abb1601f5431912879a592cdd61b1959cb3fe794c2a8",
+ "verifier": {
+ "name": "guidecheck-hosted",
+ "version": "0.7.1",
+ "verifier_profile": "human-verifiable-assistant-guide-verifier",
+ "verifier_profile_version": "0.7.1",
+ "guide_profile": "human-verifiable-assistant-guide",
+ "guide_profile_version": "0.7.1"
+ },
+ "same_bytes": true,
+ "same_level": true
+ },
+ {
+ "url": "https://guidecheck.org/.well-known/assistant-guide.txt",
+ "production_level": 3,
+ "production_sha256": "4b30202c809a3db037290371da8fed6a9681255199e0e19cfe1a0a7fc1d5df9e",
+ "production_error_ids": [
+ "anchor.independent.mismatch"
+ ],
+ "candidate_level": 3,
+ "candidate_sha256": "4b30202c809a3db037290371da8fed6a9681255199e0e19cfe1a0a7fc1d5df9e",
+ "verifier": {
+ "name": "guidecheck-hosted",
+ "version": "0.7.1",
+ "verifier_profile": "human-verifiable-assistant-guide-verifier",
+ "verifier_profile_version": "0.7.1",
+ "guide_profile": "human-verifiable-assistant-guide",
+ "guide_profile_version": "0.7.1"
+ },
+ "same_bytes": true,
+ "same_level": true
+ },
+ {
+ "url": "https://harnessie.com/.well-known/assistant-guide.txt",
+ "production_level": 3,
+ "production_sha256": "ff77d219add6f1cf6a22c4570830f9fbd70cedd59f3caa933fbd0c7ae3733421",
+ "production_error_ids": [
+ "anchor.independent.mismatch"
+ ],
+ "candidate_level": 3,
+ "candidate_sha256": "ff77d219add6f1cf6a22c4570830f9fbd70cedd59f3caa933fbd0c7ae3733421",
+ "verifier": {
+ "name": "guidecheck-hosted",
+ "version": "0.7.1",
+ "verifier_profile": "human-verifiable-assistant-guide-verifier",
+ "verifier_profile_version": "0.7.1",
+ "guide_profile": "human-verifiable-assistant-guide",
+ "guide_profile_version": "0.7.1"
+ },
+ "same_bytes": true,
+ "same_level": true
+ },
+ {
+ "url": "https://knowledge-as-code.com/.well-known/assistant-guide.txt",
+ "production_level": 4,
+ "production_sha256": "1f5f955fd03b8a3a176cec4bd312bb36bdf81a42922e659ca447417345493276",
+ "production_error_ids": [],
+ "candidate_level": 4,
+ "candidate_sha256": "1f5f955fd03b8a3a176cec4bd312bb36bdf81a42922e659ca447417345493276",
+ "verifier": {
+ "name": "guidecheck-hosted",
+ "version": "0.7.1",
+ "verifier_profile": "human-verifiable-assistant-guide-verifier",
+ "verifier_profile_version": "0.7.1",
+ "guide_profile": "human-verifiable-assistant-guide",
+ "guide_profile_version": "0.7.1"
+ },
+ "same_bytes": true,
+ "same_level": true
+ },
+ {
+ "url": "https://obligationfirst.org/.well-known/assistant-guide.txt",
+ "production_level": 2,
+ "production_sha256": "3953f5a26e64a0510183618aa6bffad3cba9c3c254277cf4d9db7d24ce1db841",
+ "production_error_ids": [
+ "prohibited.encoded-execution"
+ ],
+ "candidate_level": 2,
+ "candidate_sha256": "3953f5a26e64a0510183618aa6bffad3cba9c3c254277cf4d9db7d24ce1db841",
+ "verifier": {
+ "name": "guidecheck-hosted",
+ "version": "0.7.1",
+ "verifier_profile": "human-verifiable-assistant-guide-verifier",
+ "verifier_profile_version": "0.7.1",
+ "guide_profile": "human-verifiable-assistant-guide",
+ "guide_profile_version": "0.7.1"
+ },
+ "same_bytes": true,
+ "same_level": true
+ },
+ {
+ "url": "https://prompterkit.app/.well-known/assistant-guide.txt",
+ "production_level": 4,
+ "production_sha256": "1b73f93f9f466de6f7b5f69182535d10c65e37e1cdf4427efa15d8508dfe6558",
+ "production_error_ids": [],
+ "candidate_level": 4,
+ "candidate_sha256": "1b73f93f9f466de6f7b5f69182535d10c65e37e1cdf4427efa15d8508dfe6558",
+ "verifier": {
+ "name": "guidecheck-hosted",
+ "version": "0.7.1",
+ "verifier_profile": "human-verifiable-assistant-guide-verifier",
+ "verifier_profile_version": "0.7.1",
+ "guide_profile": "human-verifiable-assistant-guide",
+ "guide_profile_version": "0.7.1"
+ },
+ "same_bytes": true,
+ "same_level": true
+ },
+ {
+ "url": "https://skilla11y.dev/.well-known/assistant-guide.txt",
+ "production_level": 2,
+ "production_sha256": "81fed93eac293f63897daf3c4ebc283cf9ad9efa194893fe93ddae58c5da3c78",
+ "production_error_ids": [
+ "action-block.malformed"
+ ],
+ "candidate_level": 2,
+ "candidate_sha256": "81fed93eac293f63897daf3c4ebc283cf9ad9efa194893fe93ddae58c5da3c78",
+ "verifier": {
+ "name": "guidecheck-hosted",
+ "version": "0.7.1",
+ "verifier_profile": "human-verifiable-assistant-guide-verifier",
+ "verifier_profile_version": "0.7.1",
+ "guide_profile": "human-verifiable-assistant-guide",
+ "guide_profile_version": "0.7.1"
+ },
+ "same_bytes": true,
+ "same_level": true
+ }
+ ],
+ "production_comparison_date": "2026-09-05 America/Denver (2026-09-06 UTC)"
+}
diff --git a/docs/anchor-dispatch-package-check.json b/docs/anchor-dispatch-package-check.json
new file mode 100644
index 0000000..740f101
--- /dev/null
+++ b/docs/anchor-dispatch-package-check.json
@@ -0,0 +1,50 @@
+{
+ "wheel": "guidecheck-1.0.0-py3-none-any.whl",
+ "sha256": "162c67df0f18336c41abd14305672b88d597e5e02a87b4a95e18e837933256f3",
+ "packaged_modules_match_source": [
+ "guidecheck_cli",
+ "guidecheck_scan",
+ "guidecheck_verify",
+ "guidecheck_legacy",
+ "guidecheck_legacy_constants",
+ "guidecheck_profiles",
+ "guidecheck_strict",
+ "guidecheck_constants",
+ "guidecheck_fetch"
+ ],
+ "installed_entrypoint_checks": [
+ {
+ "args": [
+ "--version"
+ ],
+ "exit_code": 0
+ },
+ {
+ "args": [
+ "verify",
+ "fixtures/valid/level-3/guide.txt",
+ "--level",
+ "3"
+ ],
+ "exit_code": 0
+ },
+ {
+ "args": [
+ "verify",
+ "fixtures/profiles/1.0.0/repository-only/guide.txt",
+ "--require-profile-version",
+ "1.0.0"
+ ],
+ "exit_code": 1
+ },
+ {
+ "args": [
+ "verify",
+ "fixtures/valid/level-3/guide.txt",
+ "--require-profile-version",
+ "1.0.0"
+ ],
+ "exit_code": 2
+ }
+ ]
+}
diff --git a/docs/anchor-dispatch-validation.md b/docs/anchor-dispatch-validation.md
new file mode 100644
index 0000000..dff04d0
--- /dev/null
+++ b/docs/anchor-dispatch-validation.md
@@ -0,0 +1,113 @@
+# Version-aware anchor dispatch validation
+
+Date: 2026-09-05 America/Denver; public observations occurred on September 6 UTC.
+State: pre-publication validation snapshot. Subsequent release and deployment
+authority is recorded in `release-1.0.0.md`; this snapshot is not a live deployment receipt.
+Release package: 1.0.0. Self-guide and legacy engine: 0.7.1.
+
+## Result
+
+Supported legacy declarations select the preserved 0.7.1 evaluator. Explicit
+1.0.0 declarations select the strict evaluator, where repository-file hashes
+remain visible but do not qualify toward Level 4. Caller profile assertions
+reject incompatible declarations instead of reinterpreting guide bytes.
+No observed legacy result was downgraded by the candidate.
+
+The [approved compatibility contract](anchor-policy-compatibility.md) defines
+the boundary. New-profile normative candidates and example output are in
+`profiles/1.0.0/`; the separate schemas are in `schemas/1.0.0/`.
+
+## Baseline provenance
+
+The reference baseline is commit
+`3ceb30a58488f925844c51c5aad0bc0f94633ff7`. On session entry, local and remote main
+matched that commit, GitHub reported its signature valid, and
+[the exact-commit test run](https://github.com/snapsynapse/guidecheck/actions/runs/33986766432)
+had completed successfully. Those observations concern the baseline, not the
+uncommitted candidate. No signing or account configuration was changed.
+
+The legacy evaluator is copied from that baseline with only its constants import
+redirected to the frozen legacy constants module. Preserved artifact digests
+cover both modules, transport/anchor helpers, root normative documents, the
+legacy output schema, and published self-guide/manifest files. The previously
+confirmed July DNS rotation is still recorded in the roadmap; no new rotation
+has been performed or assumed necessary.
+
+## Local verification
+
+| Gate | Result |
+|---|---|
+| `make test` | Passed, including all prior suites and new profile/compatibility checks |
+| Existing regression corpus | 138 evals, 74 reference fixtures, 84 contract fixtures passed |
+| Full legacy report replay | All 74 local reports and 25 hosted responses equal the captured baseline |
+| Legacy version scenarios | 54 checks across nine pinned legacy versions passed |
+| Strict profile tests | 11 test methods, including six static fixture cases, selector rejection, caller assertions, manifest binding, unknown channels, CLI behavior, and mixed-request execution passed |
+| `make test-verify-ui` | Actual form/render/copy/download JavaScript passed in a deterministic DOM adapter, including alternating legacy/new reports |
+| Preserved artifact checks | Frozen engine, normative legacy files, schema, transport, self-guide, and manifest digests unchanged |
+| Installed wheel | Built 1.0.0 wheel, installed only into a temporary directory, and exercised its actual console entry point outside the repository |
+| AIDR lint and `git diff --check` | Passed |
+
+The [package receipt](anchor-dispatch-package-check.json) records its digest and
+entry-point checks: package version, legacy success, strict conformance result,
+and profile-requirement rejection. Nothing was installed globally or published.
+Core verification remains dependency-free Python; the separate UI contract uses
+Node 18+. The established `make test` entry point does not acquire a Node
+requirement. CI is configured to run both targets after an authorized push.
+
+The UI test is not a real-browser smoke test. Hosted CI, source/conformance-kit
+release assets, and a deployed candidate have not been verified in this session.
+
+## Adopter comparisons
+
+[Machine-readable receipts](anchor-dispatch-adopters.json) contain paths,
+declarations, hashes, verifier ranges, observed CI references, and results.
+
+- All 25 discovered local guide paths across 16 repositories produced identical
+ complete reports under baseline and candidate at the same fixed time.
+- For all 16 distinct public guide URLs, the baseline hosted evaluator fetched
+ the current public guide and available evidence. The candidate replayed those
+ exact responses, including fetch failures, at the same evaluation time.
+ Every complete response and fetch-set comparison matched.
+- The current public verifier was separately queried for all nine adopters with
+ manifest declarations. Production and candidate had the same guide hash and
+ achieved level in every case. This comparison establishes level/hash parity;
+ it is not a claim that the deployed source commit was identified.
+
+| Currently observed Level 4 adopter | Production | Candidate |
+|---|---|---|
+| Agentlink | 4 | 4 |
+| AI Incident Law | 4 | 4 |
+| Knowledge-as-Code | 4 | 4 |
+| PrompterKit | 4 | 4 |
+
+Existing production findings were unchanged: AI Posture reports missing manifest
+fields; GuideCheck and Harnessie report an anchor hash mismatch; Obligation First
+reports an encoded-execution finding; A11y Audit reports a malformed action block.
+These are inherited observations, not newly introduced failures or a diagnosis
+of their causes. Investigating them is a separate maintenance queue. In
+particular, an anchor mismatch alone does not identify DNS as the cause or
+authorize repeating the completed DNS rotation.
+
+Known first-party evidence cannot establish zero regressions for unknown external
+users. The legacy path, unchanged public artifacts, preserved response contract,
+and lack of an automatic migration/sunset policy protect that compatibility
+boundary. Any future unsupported adopter declaration is a rollout stop for
+explicit assessment, not permission to silently downgrade or rewrite it.
+
+## Delivery gates at the pre-publication snapshot
+
+1. Stage and commit the authorized release; push and verify CI against
+ that exact commit. No current CI result covers the uncommitted candidate.
+2. Prepare the major release with explicit version/status updates, versioned
+ public documentation, and source/conformance-kit artifact verification.
+ Preserve legacy references and the self-guide's existing anchored bytes.
+3. Review staging and rollback steps before the authorized deployment.
+ Recheck the candidate on staging against the known adopters before changing
+ the public endpoint. Do not treat these local checks as deployed verification.
+4. Keep existing adopter findings separate from release migration. No dependent
+ repository, DNS record, hosted guide, manifest, or existing release is changed
+ by the candidate. Subsequent delivery is covered by `release-1.0.0.md`.
+
+The September 5 anchor handoff is processed: its durable decision and evidence
+are in the AIDR, compatibility contract, this report, receipts, and roadmap.
+The separate September 1 signing/OpenSSF/citation handoff remains unprocessed.
diff --git a/docs/anchor-policy-compatibility.md b/docs/anchor-policy-compatibility.md
new file mode 100644
index 0000000..0753897
--- /dev/null
+++ b/docs/anchor-policy-compatibility.md
@@ -0,0 +1,334 @@
+# Version-aware anchor policy proposal
+
+Status: approved implementation contract for 1.0.0. Publication and deployment authorized by Sam; delivery evidence is recorded separately.
+Scope: GuideCheck AIDR-0001, repository-anchor qualification only.
+Baseline: 3ceb30a58488f925844c51c5aad0bc0f94633ff7.
+
+## Approval condition
+
+Sam Rogers's response on 2026-09-05, transcribed verbatim:
+
+> Yes I do approve, provided that the existing level 4 conformant repos are not adversely impacted. I believe we handle this well enough through versioning but I want to make sure that we don't break things with this change
+
+This condition limits the dependent proposal in
+[AIDR-0001](../decisions/AIDR-0001-same-control-plane-repository-anchors.md).
+The proposed stricter policy must not be applied retrospectively to existing
+guides. It does not authorize mandatory migration, retroactive loss of Level 4,
+or changing existing guide bytes to meet the new policy.
+
+This is the approved implementation contract, revised at Sam's request to include
+version-aware dispatch. It replaces the unconditional application and forced
+migration described in the original dependent AIDR position; the position is
+retained as recorded reasoning. Sam's approval is conditional on compatibility,
+not a claim that compatibility has already been demonstrated for new code.
+
+Sam also reports being the only known user, while noting that external users
+cannot be ruled out. Known first-party repositories form the initial adopter
+test set. This is not evidence of zero external adoption and does not authorize
+breaking unknown consumers. Changes to dependent repositories are not a
+prerequisite for legacy compatibility and are not included in this proposal.
+
+## Why a version bump alone is insufficient
+
+The pre-dispatch baseline evaluator requires the `profile-version` metadata field but does
+not dispatch anchor evaluation by its value. `GUIDECHECK_VERSION`,
+`GUIDE_PROFILE_VERSION`, and `VERIFIER_PROFILE_VERSION` are coupled constants.
+The hosted endpoint and local CLI call the same evaluator. Replacing its anchor
+predicate globally would downgrade old guides regardless of their declared
+version. Bumping the tool or specification version does not prevent that.
+
+The compatibility reference is the behavior of baseline 3ceb30a for previously
+accepted inputs, not a claim to reproduce every historical verifier release.
+Current static fixtures contain older declarations, and existing hosted tests
+explicitly accept a same-repository Pages anchor. Preserve those expectations.
+
+## Required behavior
+
+1. Keep the existing anchor semantics for legacy guides. The published versions
+ represented by local release tags are 0.1.0, 0.2.0, 0.3.0, 0.3.1, 0.4.0,
+ 0.5.0, 0.6.0, 0.7.0, and 0.7.1. Future code must explicitly define supported
+ versions rather than using a catch-all numerical comparison.
+2. Apply strict repository qualification only when the guide deliberately opts
+ into the supported new major profile. No default-to-latest behavior in the
+ existing CLI or hosted endpoint. A verifier software upgrade alone must not
+ switch the policy used for an unchanged legacy guide.
+3. Separate verifier software version, declared guide profile, and evaluated
+ policy in reporting. An old-profile Level 4 result remains Level 4 under its
+ old policy; it is never relabeled as new-profile conformance. Additive report
+ metadata must not introduce new required fields into the legacy contract or
+ change its established fields, exit codes, severity counts, or proceed result.
+4. Treat an explicit new-profile migration assessment as a separate result. It
+ must not replace the ordinary legacy conformance result or fail existing CI
+ merely because the guide would not meet the new rules.
+5. A new-profile guide or request must not fall back to legacy qualification
+ after an unsupported version, malformed version, conflicting guide/manifest
+ declaration, or failed strict check. Existing malformed-input behavior must
+ not be incidentally rewritten as part of this change.
+6. Preserve legacy local-file caps and hosted fetched-evidence requirements.
+ Preserve mismatch blocking. Compatibility does not mean accepting newly
+ invalid bytes, expired/revoked metadata, missing evidence, or network failure.
+7. Keep existing guides, manifests, repository anchors, DNS TXT values, release
+ artifacts, and version-specific documentation available and unchanged.
+ Updating a self-guide during version synchronization would change its hash
+ and require anchor rotation, so decouple those checks before a major bump.
+8. Do not introduce a legacy support sunset or compulsory migration in this
+ tranche. Such a policy needs a separate maintainer decision.
+
+This intentionally leaves the old policy's known independence limitation in
+legacy results. Preserving those claims and imposing the strict rule on the
+same results are incompatible objectives. Reports must state which policy was
+evaluated without converting that distinction into a legacy failure.
+
+## Dispatch design
+
+### Policy selection
+
+Use one shared, side-effect-free selector for the CLI and hosted entry point.
+Select from the guide's original metadata bytes before anchor qualification.
+Keep the input bytes and guide hash unchanged. Do not rewrite metadata to run
+an old guide through the new engine, and do not infer policy from the installed
+package version, hostname, requested conformance level, or current date.
+
+The selector returns an immutable selection containing the declared version,
+the selected engine, and its policy identifier, or a dispatch error. Pass that
+selection through fetching, evaluation, and reporting. No downstream caller may
+select a policy again from mutable defaults or from the observed hash result.
+
+| Guide declaration or request | Selection | Contract |
+|---|---|---|
+| Exact 0.1.0, 0.2.0, 0.3.0, 0.3.1, 0.4.0, 0.5.0, 0.6.0, 0.7.0, or 0.7.1 | Legacy engine, baseline 3ceb30a | Preserve existing anchor eligibility, levels, findings, reports, and CLI exit behavior |
+| Exact 1.0.0, after that profile is implemented and supported | Strict engine | Repository matches remain visible but do not qualify; another qualifying channel is required for Level 4 |
+| 1.0.0 before support is enabled | Unsupported | No legacy fallback and no 1.0.0 conformance result |
+| Supported release plus syntactically valid SemVer build metadata | Same policy key as that release | Preserve the raw declaration; build metadata never selects stronger or weaker rules |
+| Any unlisted release, range, prerelease, or malformed version token | Unsupported or invalid selector | Never silently map to the nearest version; no prerelease-to-final fallback |
+| A lower-level guide with no metadata block/version declaration | Existing legacy diagnostic path | Preserve valid Level 1/2 use and existing missing-metadata diagnostics; do not invent a profile declaration |
+| Duplicate, conflicting, or malformed metadata boundaries | Invalid selector or existing legacy failure | Never choose one conflicting version by first-value or last-value wins; never produce a new positive conformance result |
+| Caller explicitly requires 1.0.0 but guide declares a legacy version | Requirement mismatch | Reject; a caller's required profile is an assertion, not an instruction to reinterpret old bytes |
+
+For malformed legacy inputs already rejected by the baseline, preserve existing
+diagnostics where there is an unambiguous legacy selection. If there is no unique
+selection, return a dispatch error instead of guessing. A required-profile
+assertion always takes precedence over that compatibility diagnostic path.
+
+The supported legacy list is explicit. Do not implement `major < 1` or `version
+<= current` as a shortcut. The existing verifier may accept undeclared or
+unpublished versions because it does not validate them; these are an inventory
+gap, not evidence of support. If a must-preserve adopter uses one, stop rollout
+and resolve it explicitly before changing hosted behavior. Do not silently add
+an exception or require the adopter to change bytes to make a test pass.
+
+Parse SemVer syntax strictly before lookup. For this proposal, the policy key is
+the supported release version with valid build metadata omitted. Preserve the
+raw version in the selection record. For example, `0.7.1+build.7` selects legacy
+0.7.1 and `1.0.0+build.7` selects strict 1.0.0; `1.0.0-rc.1` does not select the
+final release. This is an explicit GuideCheck dispatch rule informed by
+[SemVer sections 9-11](https://semver.org/#spec-item-9), which distinguish
+prereleases from build metadata. Test empty suffixes, illegal characters,
+leading zeroes, and valid build identifiers. Audit the broader published schema
+against this parser before release; previously accepted but nonconforming input
+is not a reason to silently map to an unsupported policy.
+
+### Manifest and caller consistency
+
+The guide is the primary selector. A manifest never upgrades or downgrades the
+selected policy. A legacy manifest may omit its currently optional profile
+fields without losing eligibility. Preserve existing handling of old-only
+manifest metadata within the legacy engine.
+
+For 1.0.0, require the manifest's profile name and version to agree with the
+guide, in addition to its hash and byte-count checks. Reject missing, duplicate,
+or conflicting profile selectors in new-profile manifests. A legacy guide
+accompanied by an explicit 1.0.0 manifest must not be accepted as a new-profile
+result. Contradictory cross-major evidence is a dispatch/evidence error, never
+a reason to switch engines.
+
+Add an optional `required_profile_version` hosted request field and
+`--require-profile-version` CLI assertion. Both require a supported version
+without ranges and compare its policy key with the selected guide's policy key.
+Valid build metadata is retained but ignored for that policy comparison. They do not alter
+guide bytes or choose a weaker evaluator. Existing requests and commands omit
+them and retain declared-version dispatch. `requested_level` and `--level`
+retain their existing behavior; level and profile are different constraints.
+
+An unsupported selector or unsatisfied caller profile assertion returns an
+explicit error with no conformance claim: the existing hosted error-envelope
+shape with HTTP 400, or a CLI dispatch/usage error with exit 2. Proposed error
+codes are `profile-version-unsupported`, `profile-version-ambiguous`, and
+`profile-version-requirement-mismatch`. Strict manifest disagreement is instead
+a blocking `manifest.profile-version.mismatch` finding under the already
+selected strict engine; it prevents Level 4 without invoking legacy evaluation.
+
+Selecting a supported legacy profile intentionally remains possible. Otherwise
+backward compatibility would be illusory. A consumer requiring the stronger
+policy must pin that requirement using the new assertion. This is the explicit
+defense against a publisher changing a guide's declaration back to 0.7.1; a
+default legacy-compatible verifier cannot promise that defense on the caller's
+behalf. No legacy Level 4 result is presented as satisfying a 1.0.0 requirement.
+
+### Engine and output isolation
+
+Preserve the baseline evaluator and its constants, anchor adapter behavior,
+report builders, and schema as a versioned legacy implementation. Move or wrap
+them without semantic changes and establish equivalence before introducing
+strict behavior. Avoid scattering conditional version checks through the
+existing evaluator. Both engines may share transport code only when fixed-input
+replay proves that doing so preserves legacy fetch order, budgets, and results.
+New topology lookups are not part of the strict policy or legacy request path.
+
+Keep the existing CLI command and `/api/verify` entry point. They dispatch to
+the selected engine. Legacy results retain the existing JSON body structure,
+anchor objects, finding order and severity counts, compact report, and exit
+codes. Do not append migration warnings to legacy reports. Their `verifier`
+object identifies the legacy engine and its 0.7.1 verification contract, not the
+new dispatcher package. That identity is honest only while the preserved engine
+is equivalent to baseline 3ceb30a; record the baseline commit in implementation
+provenance. Do not mislabel modified strict logic as the legacy engine.
+
+The dispatcher/package has its own software version, reported by package/CLI
+version output and hosted response metadata outside the legacy JSON body.
+The legacy guide-profile version in the established report remains 0.7.1,
+meaning the current legacy checking contract, even when the guide declares an
+older supported version. This is not a new claim of exact historical semantics.
+The new-profile report explicitly identifies declaration 1.0.0, evaluated
+profile 1.0.0, strict engine version, and the qualification fields proposed in
+the AIDR. New required fields belong to a separate versioned output schema;
+they are not retrofitted into the legacy schema.
+
+The UI routes rendering by the report's evaluated profile. Its legacy rendering
+path remains unchanged; the strict path shows qualifying evidence and the
+profile used. Downloads and copied compact reports use the same selected
+result. A migration comparison feature is deferred from this tranche; it must
+never replace a normal legacy result if introduced later.
+
+### Version and artifact separation
+
+Replace the single-version synchronization assumption with explicit assertions
+for dispatcher/package version, each engine's verifier contract, supported guide
+profiles, latest released profile, and the repository's own published guide.
+Retain checks for byte-identical root and well-known copies. Pin the existing
+self-guide, manifest, and anchor hashes before editing version-bearing files.
+
+In particular, a package or new-profile version bump must not rewrite the
+self-guide's `profile-version`, `guide-version`, `applies-to`, or
+`verifier-conformance` range. The compatibility verifier can still evaluate
+that guide through its legacy engine. Old verifier-conformance ranges refer
+to the selected legacy engine's contract, not the dispatcher version. Do not
+introduce new range-enforcement behavior into legacy evaluation in this change;
+the current core does not enforce that field as a version selector.
+
+Preserve immutable legacy spec/schema references and published release assets.
+Prepare new-profile documents and fixtures under explicit new-version identity.
+Do not present 1.0.0 as released merely to satisfy the version checker. The
+new profile and dispatcher release remain a major release, with release status
+separate from development version. Exact package/entry-point commands used by
+adopters must be exercised, including consumers that pin older tool versions.
+
+## Paired compatibility acceptance matrix
+
+Every row defines an acceptance test; implementation evidence is linked below.
+Legacy/new fixture pairs differ in their intentional profile declarations and
+recomputed manifest bindings only; tests must not leave stale hashes after
+changing metadata. All otherwise valid content and fetch evidence are replayed
+at a fixed time against both baseline and candidate.
+
+| Case | Legacy expected | New-profile expected |
+|---|---|---|
+| Matching repository only, Pages or custom domain | Level 4, unchanged report | Level 3; no qualifying anchor |
+| Matching repository plus qualifying matching DNS | Level 4, unchanged report | Level 4; repository still excluded |
+| Repository mismatch plus matching DNS | Existing Level 4 failure preserved | Level 4 failure with strict mismatch identity |
+| Local supplied matching evidence | Existing Level 3 cap and report | Level 3 cap; no fetched provenance claim |
+| Known missing/unreachable or conflicting evidence | Existing failure/availability behavior preserved | Strict matrix outcomes; no fallback |
+| Guide has old verifier-conformance range | Same legacy behavior under upgraded package | New guide names a compatible strict engine; dispatcher version is not substituted |
+| Caller requires 1.0.0 | Requirement mismatch, no new-profile claim | Strict result, or strict failure; never legacy fallback |
+| Unsupported, ambiguous, or cross-major selectors | No guessed support; inventory exceptions block rollout | Explicit failure before qualification |
+| Requests alternating legacy/new versions in one process | Stable legacy engine and response every time | Stable strict engine and response every time |
+| Concurrent requests and evidence-cache reuse | No strict state leaks into legacy evaluation | Cached bytes cannot import legacy qualification |
+| Version update and artifact checks | Self-guide/manifest/anchor bytes unchanged | New-version artifacts explicitly identified |
+| CLI/API/compact report/UI/download | Existing result and consumer parsing preserved | One coherent profile and qualification result |
+
+Extend differential testing beyond the 54 initial cases: compare every existing
+static fixture and hosted scenario with baseline outputs, including exact finding
+sets, counts, levels, readiness, anchor evidence, and CLI exit status. Normalize
+only documented volatile fields such as timestamps and absolute fixture paths.
+Do not normalize away policy versions, finding order, new warnings, anchor status,
+or report changes. Preserve the old expectations; add new-profile cases instead
+of changing legacy expected results to fit the candidate.
+
+## Readiness and remaining decisions
+
+Implementation update: Sam approved this proposal with "Proposal approved.
+Please continue" on 2026-09-05. The local dispatcher, isolated legacy engine,
+strict engine, versioned schemas/specifications, and regression gates are now
+implemented. See [validation evidence](anchor-dispatch-validation.md) for the
+current results. The sequence below remains the acceptance and delivery checklist.
+
+Local implementation is complete. Legacy compatibility, caller opt-in, engine
+isolation, and versioned qualification are covered by the local regression gates.
+Sam's existing approval remains conditional on preserving that compatibility.
+
+Publication and deployment are authorized by Sam. The candidate has been compared
+with freshly fetched public adopter artifacts, but exact committed CI, release
+artifacts, and staged deployment checks remain. Do not make a zero-breakage
+guarantee for unknown external consumers from the observed compatibility results.
+
+| Checkpoint | Evidence required to move on | Current state |
+|---|---|---|
+| Legacy isolation and dispatch | Exact baseline differential suite, selector grammar coverage, legacy output and package-entry-point compatibility | Implemented; baseline replay and installed-wheel checks pass |
+| New profile implementation | Paired old/new fixtures, caller assertions, schema/report parity, mixed-request isolation, full suite | Implemented and locally validated |
+| Adopter compatibility | Read-only first-party inventory; recorded versions, hashes, verifier ranges, CI commands, and baseline/candidate results | 25 local paths and 16 public fetch/replay reports match baseline |
+| Release readiness | All preceding gates pass, immutable legacy references available, self-guide/anchors unchanged, release/version checks pass | Local gates pass; exact committed CI, release assets, and staged deployment verification remain |
+| Deployment | Separately authorized publication/deployment, staged verification, known prior deployment and reviewed rollback steps | Authorized by Sam in the subsequent release request; verification remains required |
+
+No new information is required from Sam to revise this proposal or begin local
+implementation. Known external consumers would be useful additions if they
+surface, but their absence does not block local work. If inventory finds an
+adopter that cannot be preserved by the proposed dispatcher, bring back that
+specific repository, command, before/after result, and proposed resolution.
+Do not reopen the whole policy decision or ask for blanket permission to migrate
+everything. Sam subsequently authorized staging, commit, push, release, and deployment.
+Dependent-repository and anchor changes remain outside this release.
+
+## Implementation sequence and release gate
+
+1. Establish the unchanged baseline and a permanent legacy compatibility test
+ covering each listed version through the actual hosted request handler and
+ shared evaluator, including repository-only Pages and custom-domain guides.
+2. Implement explicit version selection and report identity before changing any
+ qualification predicate. Legacy output must still satisfy its existing schema.
+3. Implement the strict predicate exclusively in the new-profile path. Extend
+ the AIDR fixture matrix with paired old/new cases from the same guide content,
+ including supported new versions, unsupported future versions, and mismatched
+ declarations. Old repository-only guides pass under the old policy; opted-in
+ new guides require another qualifying channel.
+4. Preserve published profile documentation while preparing the new major
+ normative documents and schema. Decouple software, profile, self-guide, and
+ release-status checks; do not mutate published anchor bytes as a side effect.
+5. Run the complete suite with old expectations intact and new expectations in
+ separate cases. Check JSON, compact report, CLI exit, hosted endpoint, and UI
+ parity. Compare representative adopter artifacts against the unchanged
+ baseline at a fixed evaluation time and with replayed fetch responses.
+6. Before any separately authorized deployment, compare current and candidate
+ hosted results for known first-party Level 4 adopters without modifying their
+ repositories or anchors. Record which published guide bytes were evaluated.
+ A regression blocks release. Keep the previous deployment available for
+ rollback; deployment and rollback actions require their own authorization.
+
+Passing baseline tests alone establishes a reference. The candidate's regression
+tests and adopter comparisons provide the implementation evidence; release and
+deployment require their remaining gates. No universal no-regression claim is
+earned by the synthetic suite or finite adopter sample.
+
+## Baseline capture before implementation, 2026-09-05
+
+- `scripts/test_legacy_anchor_compatibility.py` is wired into `make test` and
+ passes 54 replayed scenarios across the nine pinned legacy declarations:
+ 18 hosted repository-only results, nine local consistency results, and
+ 27 mismatch/missing-anchor results. Hosted cases include Pages and a custom
+ domain, and preserve anchor output, level, warning count, and compact result.
+- Full `make test` passed: 138 evals, 74 reference fixtures, 84 contract
+ validations, and all existing regression suites, plus the new compatibility
+ gate. AIDR lint and `git diff --check` passed.
+- No verifier policy, version constant, published guide, manifest, or anchor
+ changed during this compatibility preparation. Version-aware dispatch,
+ strict-profile implementation, and candidate-versus-adopter comparison remain
+ pending. Nothing was committed, pushed, released, or deployed.
diff --git a/docs/index.html b/docs/index.html
index 1c18d41..c330891 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -526,7 +526,7 @@
Your AI assistant just followed instructions you never saw.