Skip to content

ci: gate releases on checked-in fresh-session routing observations for changed routes - #231

Merged
wheakerd merged 1 commit into
mainfrom
feature/route-observation-gate
Oct 30, 2026
Merged

wheakerd merged 1 commit into
mainfrom
feature/route-observation-gate

Conversation

@wheakerd

Copy link
Copy Markdown
Owner

Scope

Refs #220. docs/runtime-identity.md requires fresh-session routing observations on both hosts for every release that changes a route, but no check enforced it: the only checked-in host records are the six-case v0.19.0 lifecycle records, the 36-case run for 0.22.0 was not retained, and 0.22.1 shipped with none. This change makes the requirement a release gate:

  • A release candidate carries one schema v6 observation record of the current benchmark per host under evals/results/v<version>/<host>/<operating-system>.json, with a candidate-unreleased subject naming the observed commit and tree. The new axiom_validation/routing_evals/candidates.py validates such records against the current corpus, benchmark profile, and response schema, and the publication aggregate validates every record of the current manifest version on each run.
  • The Release pipeline computes the routes whose skill files changed (pull-request base to head in Release candidate; the release commit's parent to the commit in Publish release; a change to the gate selects every route) and refuses, before any irreversible step, a release that lacks an accepted record for either host. A record is accepted when the installed runtime digest at its observed commit equals the release commit's digest, so documentation-only commits on the same pull request keep it valid while any installed-runtime change requires a new observation. Both job summaries report the gate.
  • Description anchors shrink to three authority invariants: delegation consent and permission-bypass, explicit-only activation of supervised progress, and rollback for persistent change. Trigger wording is left to the routing corpus and fresh-session observations.
  • evals/README.md (Candidate Observations), docs/maintainers/release-documentation.md, docs/maintainers/validation.md, and docs/compatibility.md describe the gate and record that 0.22.0 and 0.22.1 predate it.

Repository policy revision 118 records the change in the ledger; the plugin version and runtime contract digest are unchanged.

Affected files and surfaces

  • Shared files: None
  • Codex-specific files: None
  • Claude Code-specific files: None
  • Documentation or validation files: axiom_validation/routing_evals/candidates.py (new), axiom_validation/routing_evals/suite.py, axiom_validation/routing_evals/__init__.py, axiom_validation/release_pipeline.py (gate), axiom_validation/routing_contracts.py (anchors); tests/test_release_pipeline.py, tests/test_routing_evals.py; evals/README.md, docs/maintainers/release-documentation.md, docs/maintainers/validation.md, docs/compatibility.md; evidence/repository-policy-revisions-v1.json, evidence/runtime-identity.json, evidence/release-status.json, docs/runtime-identity.md, docs/repository-policy-revisions.md (revision 118)

Routing and authorization impact

  • Route-selection impact: None. No skill text changes; removing phrase pins changes no description.
  • Action-authorization impact: None. The pipeline gains no permission; the gate only adds a refusal before the first irreversible step.
  • New or changed stop conditions: Release candidate fails a pull request that changes a bundled route without accepted observation records for both hosts; Publish release stops before the tag for the same reason.

Documentation

The four documents above describe the record location, subject binding, acceptance rule, and the exemption for releases that change no route. Installation and hook commands are unchanged.

Validation

Command Result
python3 -B scripts/check-publication.py Passed on this exact tree: 153 required files, 169 Markdown files, 30 immutable external action and image pins
python3 -B -m unittest discover -s tests -p 'test_*.py' OK in a disposable clone of this tree: 315 tests, including the gate's refusal, acceptance, digest-drift rejection, no-route-change exemption, and the checked-in record validation
git diff --check Passed
Additional targeted checks ASCII scan of the changed Markdown and JSON files: passed. The three retained description anchors are present in the current descriptions, so the aggregate passes without text changes.

Cross-platform parity

  • Shared skill changes were reviewed against Codex and Claude Code, or this change does not affect shared skills.
  • Manifest, marketplace, and hook differences remain intentional and documented.
  • Optional host-native validation results include the host/tool version, or are marked unavailable.

Unrelated work

  • I reviewed the final diff and did not reset, hide, stage, or rewrite unrelated work.
  • I did not add generated caches, disposable validation copies, local maintenance notes, or tool output.
  • I called out every affected file and any routing, authorization, documentation, or parity impact above.

…r changed routes

Remote baseline: origin/main @ e88e306

Scope:
The identity standard requires fresh-session routing observations on both hosts for every release that changes a route, but nothing enforced it: the only checked-in host records are the six-case v0.19.0 lifecycle records, and 0.22.0 and 0.22.1 shipped without one. A release candidate now carries a schema v6 observation record of the current benchmark per host under evals/results/v<version>/<host>/<os>.json, with a candidate-unreleased subject naming the observed commit and tree. The new routing_evals.candidates module validates such records against the current corpus, profile, and response schema, and the publication aggregate checks every record of the current version on each run. The Release pipeline computes the routes whose skill files changed (the pull request's base to head in the candidate job, the release commit's parent to the commit in the publish job; a gate change selects every route) and refuses, before any irreversible step, a release that lacks an accepted record for either host; a record is accepted when the installed runtime digest at its observed commit equals the release commit's digest, so documentation-only commits on the same pull request keep it valid. Both job summaries report the gate. Description anchors shrink to three authority invariants (delegation consent and permission-bypass, explicit-only supervised progress, rollback for persistent change); trigger wording is left to the routing corpus and the observations. The evaluation guide, release documentation, contributor validation guide, and compatibility reference describe the gate, and the 0.22.0 and 0.22.1 releases are recorded as predating it. Repository policy revision 118 records the change for Issue #220 in the ledger with an unchanged plugin version and runtime digest.

Validation:
python3 -B scripts/check-publication.py: passed on the exact tree (153 required files, 169 Markdown files, 30 immutable action pins)
python3 -B -m unittest discover -s tests -p 'test_*.py': 315 tests OK in a disposable clone of the tree (3 new: gate refusal and acceptance, no-route-change exemption, checked-in record validation)
git diff --check: clean; ASCII scan of the changed Markdown and JSON files: passed
@wheakerd
wheakerd merged commit 3097889 into main Oct 30, 2026
10 checks passed
@wheakerd
wheakerd deleted the feature/route-observation-gate branch October 30, 2026 09:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant