ADR-025 I2 Stabilization Policy (v1)¶
Status Sync (2026-02-25)¶
- Stab A merged: policy freeze + reviewer gate (
scripts/ci/review-adr025-i2-stab-a.sh). - Stab B merged: script hardening + fixtures/tests + reviewer gate (
scripts/ci/review-adr025-i2-stab-b.sh). - Stab C merged: ops/docs sync + reviewer gate (
scripts/ci/review-adr025-i2-stab-c.sh). - Stab D merged: observability-only decision JSON log + tests + reviewer gate (
scripts/ci/review-adr025-i2-stab-d.sh).
Intent¶
Harden the ADR-025 I2 closure/release integration with minimal blast radius: - Improve diagnosability and contract enforcement in scripts - Add deterministic tests/fixtures for known failure modes - Keep workflows unchanged in stabilization PRs (no PR-lane impact)
Scope (stabilization)¶
In-scope: - scripts/ci/adr025-closure-release.sh hardening (debug output, stricter parsing) - Additive tests and fixtures - Docs/runbook updates to match actual behavior - Reviewer gates for A/B/C/D stabilization slices
Out-of-scope: - Any .github/workflows/* edits - Any new product features in CLI / Rust crates - Any PR required-check / branch-protection changes - OTel bridge work (I3)
Contracts to preserve (must not change)¶
Exit contract¶
- 0: pass/attach/off
- 1: policy fail (only blocks in enforce mode)
- 2: measurement/contract fail (missing artifact/json, parse errors, mismatched schema)
Gate modes¶
off|attach|warn|enforceDefault remainsattach(I2 Step4A).
Artifact contracts (current)¶
- Nightly closure artifact:
- workflow:
adr025-nightly-evidence.yml - artifact:
adr025-closure-report - files:
closure_report_v1.json,closure_report_v1.md(retention 14 days)
Policy contract (current)¶
schemas/closure_release_policy_v1.json- Minimum required keys:
score_threshold(and any other v1 fields already in use)
Classifier / schema mapping rules (freeze for stabilization)¶
closure_report_v1.jsonmust have:schema_version == "closure_report_v1"- numeric
score violationsmust be either:- array of objects, or
- null/missing treated as empty
- Any deviation in schema_version or non-numeric score is measurement/contract failure (exit 2).
Hardening goals (PR-B)¶
- More actionable errors on:
- missing GH_TOKEN
- no runs found for nightly workflow
- artifact download failure / missing files
- Explicit type-checks on key JSON fields (
score,violations) - No change to mode semantics or exit codes
Test matrix (PR-B)¶
Minimum cases: - attach mode + missing artifact => exit 0 (non-blocking), with clear log - warn mode + missing artifact => exit 0 with WARN log - enforce mode + missing artifact => exit 2 - enforce mode + score below threshold => exit 1 - enforce mode + schema mismatch => exit 2 - violations type edge cases (null / missing / wrong type)