Repository navigation
Code Tribunal 2.0.0
Code Tribunal 2.0.0
Release identity
- Release:
2.0.0 - Tag:
v2.0.0 - Release inputs:
release/release-inputs.json,status: active - Runtime source
R:71dfabcae4d0ae459c10c1a9e1c809b3f8119c1f - Base image:
ghcr.io/seanleecoder/code-tribunal/ai-review-base:2.0-71dfabcae4d0ae459c10c1a9e1c809b3f8119c1f@sha256:f7028a5a22a2df0edd53235f3836b9adae3dbea474f711aab38b21b337181f02 - Reviewer image:
ghcr.io/seanleecoder/code-tribunal/ai-review-reviewer:2.0-71dfabcae4d0ae459c10c1a9e1c809b3f8119c1f@sha256:292142b70c96fbb9fda530eeafb79644694f23cae9e971a2ca3c74ac6b72295c - Quality run:
36312633166(passed) - Publication run:
36312633309(passed) - Image tag series:
2.0(2.0-<R>), replacing the1.0-<R>series
For the accepted release-version grammar and derived notes path, see the
release version contract.
Scope
- Findings are informational; the merge gate is gone. A finding surfaces as a
thread when two independent reviewer identities support it across review and
critique. Severity is an impact label only. Thegate(GitHub) and
ai_review_gate(GitLab) jobs, their schemas, CLI, andout/gate/artifact are
removed.postis the terminal job and fails only on a publication failure. - New configuration contract,
review_config.v3. It has one roster of three or
four seats selected withAI_REVIEW_REVIEWERS, fixed trusted adapter, credential,
and endpoint routes, and independent review and critique timeouts. Retired
overrides are rejected with migration guidance. Areview_config.v1document,
which every 1.x release shipped, is rejected once with the complete list of
removed keys. - New artifact and body formats.
consensus.v2replacesconsensus.v1.
render-body.v4replacesrender-body.v3with aSupport:footer, and
existing threads receive one cosmetic update.code_tribunal.release_inputs.v2
drops the redundanthashesobject. - Cursor is a peer seat. It is still off in the default roster because of its
separate credential and egress path. On GitHub it receivesCURSOR_API_KEYonly
whenAI_REVIEW_REVIEWERSnames it. - GitLab matrix jobs. Review and critique are one four-seat parallel matrix
apiece. - Refreshed runtime. The image pins Claude Code 2.1.283, Codex 0.157.1,
OpenCode 1.18.32, and Cursor Agent 2026.09.26-dd393fe, on Python 3.14 and
Debian Trixie. The reviewer image no longer ships Node, npm, or npx. - Candidate Canary. A protected, manually dispatched four-seat campaign on both
demo consumers now gates promotion of a candidate image pair. - Compatibility debt retired. COMPAT-003 (the split GitLab token wording) is
removed. COMPAT-001 and COMPAT-005 are retargeted to the first release after
2.0.0, and COMPAT-002 now coversreview_config.v1. - Candidate fixes found by the release campaign. A critic that miscopies a
pooled finding id now loses only that critique instead of failing consensus for
the whole run (#131). The GitHub canary executes its review panel once per
campaign whatever the demo'sAI_REVIEW_MANUALsetting (#132). Both were found
by the first candidate,d42559a, and fixed before the final runtime was frozen.
Version decision. 2.0.0 is a semver major. Removing the gate checks, the
review_config.v3, consensus.v2, and render-body.v4 contracts, and the
rejected variables all break 1.0.x consumers that do not migrate.
Migration
Follow Upgrade from 1.0.x to 2.0.
In short:
- Remove the required
gatecheck from branch protection or rulesets first. - Delete the rejected
AI_REVIEW_*_ENABLED,AI_REVIEW_MERGE_GATE_ENABLED, and
AI_REVIEW_STATE_BACKENDvariables. - Select at least three seats with
AI_REVIEW_REVIEWERS. - Migrate custom configuration to
review_config.v3. - Update the template and both images together.
- Move
consensus.jsonconsumers toconsensus.v2.
The CHANGELOG Migration table lists every retired surface.
Live campaign
Scoped with the
change-impact triage table
against git diff v1.0.2..R. The diff touches every impact set, so every
release-gating row re-ran live against the final pair:
| Row | Why it had to re-run | Record |
|---|---|---|
| Image publication verification | digests always change | docs/evidence/record-image-publication-verification.md — passed |
| Real four-seat panel, both platforms | adapters, reviewers, and config changed | docs/evidence/record-candidate-canary.md — passed; Candidate Canary run 36313164907 (GitHub PR #23, GitLab MR !21) |
| GitHub Chain B lifecycle | posting, rendering, anchors, and state changed | docs/evidence/record-github-current-image.md — passed; PR #25, adding fixture, create through stale head, blocker leaves the PR mergeable |
| GitLab Chain B lifecycle | the same, on an independent render surface | docs/evidence/record-gitlab-current-image.md — passed; MR !22, adding fixture, create through reopen, blocker leaves the MR mergeable |
render-body.v3 → v4 refresh |
the posted-body format changed | docs/evidence/record-render-body-v4-refresh.md — passed; GitHub comment 3650942127, one in-place update |
| GitLab hostile-MR boundary | input_bundle.py, platform/gitlab.py, pipeline_trust.py, and the template changed |
docs/evidence/record-gitlab-hostile-mr.md — passed; MR !23, all three protected secrets withheld |
Rows shipping under a registered waiver:
| Row | Waiver reason (matches verification.evidence_waivers verbatim) |
|---|---|
| GitHub revision failures | input_bundle.py was refactored into one bound-revision pipeline, but GitHub's three SHA checks and the HTTP 406 path are unchanged and covered by the SPEC-34 cases in test_input_bundle.py and test_github_platform.py; the stale-head boundary was reproduced live in record-github-current-image.md step 7, and the other race windows are milliseconds wide and not reproducible live. |
| Model effort routes | Model and effort defaults in config/review.yaml are unchanged since v1.0.2 (only comments changed) and no effort profile changed; the Candidate Canary exercised shipped default effort on all four seats (record-candidate-canary.md), so the non-default max/xhigh route checks were not rerun. |
The first candidate (R = d42559a, canary run 36113026891) failed on GitHub
when a critic miscopied a pooled finding id and consensus exited 3. That attempt
also exposed a duplicate GitHub panel run. #131 and #132 fixed both, #133
refreshed dependency pins, and only the rebuilt pair above was used as release
evidence.
Release evidence outcome
- Every re-run row passed against one frozen
Rand one image pair; two rows ship
under the registered waivers above. - Downloaded canary summaries, lifecycle post artifacts, and hostile-MR traces were
clean under the repository's ten pattern and entropy credential detectors.
High-entropy hits were inspected with values masked and were a GitLab runner
feature-flag name and a PR state-note payload, not credentials. An exact-value
audit was not performed and is not claimed. - The external release manifest binds the signed tag's release commit to
R, the
canonical-template hashes, the immutable digests, run IDs, evidence records, and
waivers.
Carried known limitations
- GitLab does not enforce the trusted image or trusted composition inside the
consumer pipeline. The 2.0.0 hostile probe again ranprepareon an
attacker-chosen image; containment comes from protected credential withholding
plus the out-of-band trust auditor (SPEC-43 remains open). - Network egress is not enforced at the container or runner boundary.
- "Credential isolated" is claimable only in the recorded hardened-child,
unprotected-ref topology. GitLab forks remain untested. - Cursor is off in the default roster. The canary exercised it with the demo's
pinnedcomposer-2.5, notauto, and nothing verifies that the pinned CLI
honours its deny policy at runtime. - The shipped three-seat default roster was not itself exercised by a real panel;
the canary ran all four seats. - A failed thread resolution is only a
post_resultwarning, so an expired GitHub
resolve token leaves green runs while/ai-review wontfixnever sticks. Observed
during this campaign and recorded, not changed.
Operator sign-off items
- Candidate Canary green on both platforms before any consumer repin: satisfied.
- Demo consumers repinned: GitHub adoption PR #24 (merged
b44ab38); GitLab
templatef8ae213with both consumer includes repointed. - The GitHub demo's classic branch protection still required the retired
gate
check and was removed by the operator, per the upgrade guide. The demo's
AI_REVIEW_GITHUB_RESOLVE_TOKENhad expired and was rotated during Chain B. - The GitLab refresh of the 1.0.0-format note
3601861614was not run. - Exact-value credential scan not performed; pattern and entropy scans passed.
v2.0.0is SSH-signed and verified before publication.
Release artifacts
The GitHub release publishes the external release manifest and its SHA-256
checksum. The activated inputs remain available at
v2.0.0:release/release-inputs.json.