Skip to content

Code Tribunal 2.0.0

Choose a tag to compare

@seanleecoder seanleecoder released this 27 Sep 19:29
· 157 commits to main since this release
v2.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 the 1.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. The gate (GitHub) and
    ai_review_gate (GitLab) jobs, their schemas, CLI, and out/gate/ artifact are
    removed. post is 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 with AI_REVIEW_REVIEWERS, fixed trusted adapter, credential,
    and endpoint routes, and independent review and critique timeouts. Retired
    overrides are rejected with migration guidance. A review_config.v1 document,
    which every 1.x release shipped, is rejected once with the complete list of
    removed keys.
  • New artifact and body formats. consensus.v2 replaces consensus.v1.
    render-body.v4 replaces render-body.v3 with a Support: footer, and
    existing threads receive one cosmetic update. code_tribunal.release_inputs.v2
    drops the redundant hashes object.
  • Cursor is a peer seat. It is still off in the default roster because of its
    separate credential and egress path. On GitHub it receives CURSOR_API_KEY only
    when AI_REVIEW_REVIEWERS names 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 covers review_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's AI_REVIEW_MANUAL setting (#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:

  1. Remove the required gate check from branch protection or rulesets first.
  2. Delete the rejected AI_REVIEW_*_ENABLED, AI_REVIEW_MERGE_GATE_ENABLED, and
    AI_REVIEW_STATE_BACKEND variables.
  3. Select at least three seats with AI_REVIEW_REVIEWERS.
  4. Migrate custom configuration to review_config.v3.
  5. Update the template and both images together.
  6. Move consensus.json consumers to consensus.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 R and 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 ran prepare on 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
    pinned composer-2.5, not auto, 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_result warning, so an expired GitHub
    resolve token leaves green runs while /ai-review wontfix never 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
    template f8ae213 with 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_TOKEN had expired and was rotated during Chain B.
  • The GitLab refresh of the 1.0.0-format note 3601861614 was not run.
  • Exact-value credential scan not performed; pattern and entropy scans passed.
  • v2.0.0 is 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.