Skip to content

feat: gate Production lifecycle on acceptance evidence - #11

Draft
abrichr wants to merge 3 commits into
mainfrom
codex/production-lifecycle-admission
Draft

feat: gate Production lifecycle on acceptance evidence#11
abrichr wants to merge 3 commits into
mainfrom
codex/production-lifecycle-admission

Conversation

@abrichr

@abrichr abrichr commented Aug 18, 2026

Copy link
Copy Markdown
Member

What changed

  • adds Production to the machine lifecycle vocabulary without assigning it to any repository or public surface
  • defines the exact eligible target inventory for OpenAdapt, Flow, Desktop, Cloud, Capture, Agent, and docs.openadapt.ai
  • makes Production a derived state backed by an active admission
  • binds public package releases to exact source commits, immutable release URLs, and required artifact hashes
  • binds proprietary Cloud to an opaque exact deployment release identity and digests, without requiring public source or artifact URLs
  • requires an independently attested remote-safe summary that binds the private Cloud certificate only by schema, digest, and signer-provenance digest
  • requires an immutable public evidence-manifest URL and digest
  • splits the summary policy binding into acceptance_policy_sha256 (pinned private acceptance-policy digest) and lifecycle_policy_sha256, so the two authorities cannot be collapsed into one field
  • domain-separates the target release and artifact inventory digests so a digest cannot be replayed across targets or claim scopes
  • closes the qualification contract: campaign contract/outcome digests, a task-condition inventory digest, a zero excluded-trial count, minimum_trials_per_condition applied to observed trials, and a floor of three required trials per condition
  • accepts millisecond UTC retention timestamps, the canonical form the private acceptance certificate records, and refuses any other precision
  • keeps governed-repair model calls informational while refusing any healthy-path model call through the failure taxonomy
  • fails closed for missing, expired, revoked, unreadable, unverifiable, or digest-mismatched evidence
  • runs the lifecycle check on pull requests, main, manual dispatch, and a low-cost daily schedule

Current state

All Production memberships and admissions are empty. This PR is mechanism-only: it does not promote a component, does not change any visible lifecycle label, and does not change public product copy. profile/README.md is byte-identical to main, and Capture keeps its Experimental label here.

Public/private boundary

The lifecycle registry never publishes the private Cloud acceptance certificate or its location. The protected private verifier checks that artifact. The public attested summary carries only its schema, digest, and signer-provenance digest. A private Cloud deployment publishes only an opaque release identity and digests.

Coordination

This PR starts from exact .github main 4f81ac3768689e0bfa812721cb61871e13d5de07. Draft PR #10 carries the Capture Experimental-to-Beta relabel and the quickstart fix; that visible label change stays out of this PR and ships only with the final evidence, per the one-visible-change-at-the-end decision. After this mechanism merges, rebase #10.

The policy names the target protected Evals authority workflow .github/workflows/production-lifecycle-evidence.yml. That workflow must land with the final reviewed evidence exporter before any admission can exist.

Validation

  • python3 -m unittest discover -s tests -p 'test_*.py' — 40 passed
  • python3 scripts/validate_production_lifecycle.py — 0 active admissions
  • python3 scripts/validate_production_lifecycle.py --previous-admissions <main ledger> — rollback gate passes
  • python3 scripts/check_profile.py — 36 links
  • ruff check and ruff format --check
  • actionlint .github/workflows/profile-consistency.yml
  • git diff --check

🤖 Generated with Claude Code

abrichr and others added 3 commits August 18, 2026 15:34
- Split the summary policy binding into acceptance_policy_sha256 (pinned
  private acceptance policy digest) and lifecycle_policy_sha256 so the two
  authorities cannot be collapsed into one field.
- Replace the free-form condition inventory with a closed qualification
  contract: campaign contract/outcome digests, a task-condition inventory
  digest, and a zero excluded-trial count.
- Domain-separate the target release and artifact inventory digests so a
  digest cannot be replayed across targets or claim scopes.
- Accept millisecond UTC retention timestamps, matching the canonical form
  the private acceptance certificate records; refuse any other precision.
- Apply minimum_trials_per_condition to observed trials, and keep the
  policy floor of three on required trials per condition.
- Keep governed-repair model calls informational while refusing any
  healthy-path model call through the failure taxonomy.
- Keep this PR mechanism-only: restore the profile README and keep
  Capture's public label Experimental (the Beta relabel stays in draft
  PR #10 until the final evidence lands). All Production memberships and
  admission lists remain empty.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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