feat: enforce signed qualification admission before actuation - #372
Draft
abrichr wants to merge 4 commits into
Draft
feat: enforce signed qualification admission before actuation#372abrichr wants to merge 4 commits into
abrichr wants to merge 4 commits into
Conversation
abrichr
force-pushed
the
codex/push-json-contract
branch
from
August 18, 2026 23:02
37a8ba7 to
763079f
Compare
Add the closed cross-language v2 contract behind the `managed_qualification_authority_v2` capability: - `qualification_admission_v2`: signed admission payload, evidence identity (`evidence_runner_signer_sha256`, `deployment_manifest_sha256`), one strict SemVer grammar, and an exact sorted runtime-component inventory that binds only the artifacts a substrate uses -- web binds the browser engine and wrapper, native binds Capture, the OS observer and wrapper, RDP/Citrix bind Capture, remote transport and wrapper with no UIA claim. - Signer registry with a durable monotonic checkpoint: provisioning-only initializer, required prior checkpoint (a runtime with no durable checkpoint halts), complete same-revision equality, monotonic generation time, and an fstat-based owner/permission recheck after open. Windows fails closed because POSIX modes prove nothing about an ACL. - `qualification_campaign_permit`: signed non-production trial authority that cannot become production authority or report production success. - `terminal_verification_v2`: typed VERIFIED terminal receipt on `report-v5`, bound to the admission, permit chain, run and sequences. Delivery permits must be issued within 60 seconds of their signer registry check. The acceptor re-derives the outcome, receipt and all five evidence manifests from the exact retained report bytes, so an internally consistent proof over foreign projections is refused. Every signed integer is a JavaScript-safe `StrictInt` and every fixed boolean rejects its numeric spelling, so Python and TypeScript verifiers agree on the same canonical bytes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
abrichr
force-pushed
the
codex/qualification-admission-flow
branch
from
August 18, 2026 23:04
ac00917 to
5868efd
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Flow verifies a signed, expiring, revocable workflow qualification admission immediately before any real Standard/Regulated action, including fully local runs (an offline customer uses a local signer registry with a durable checkpoint). Demo is the only unsigned run mode and cannot report production success. Recording, compile, inspect, lint, simulate and qualify stay unsigned.
Four commits:
feat: enforce signed workflow qualification admission—openadapt_flow/qualification_admission.pyplus therungate: a managed production dispatch without a signed admission is refused before actuation, and the signed record must bind the exact bundle, governed template, environment, input/action/identity/effect contracts of this run.fix: keep admission identity independent— a record that collapses the admission ID into the runtime-validation ID is refused; they are separate authorities.feat: negotiate qualification authority v2— the connector advertisesmanaged_qualification_authority_v2, replacingmanaged_delivery_authority_v1.feat: add the v2 qualification authority contract— the closed cross-language v2 schema and verification:qualification_admission_v2:evidence_runner_signer_sha256,deployment_manifest_sha256, one strict SemVer grammar, and an exact sorted runtime-component inventory binding only the artifacts a substrate uses (web: browser engine + wrapper; native: Capture + OS observer + wrapper; RDP/Citrix: Capture + remote transport + wrapper, with no UIA claim).fstat-based owner/permission recheck after open, and fail-closed on Windows where POSIX modes prove nothing about an ACL.qualification_campaign_permit: signed non-production trial authority that cannot become production authority or report production success.terminal_verification_v2: typed VERIFIED terminal receipt onreport-v5, bound to the admission, permit chain, run and sequences. A delivery permit must be issued within 60 s of its signer-registry check. The acceptor re-derives the outcome, receipt and all five evidence manifests from the exact retained report bytes, so an internally consistent proof over foreign projections is refused.StrictInt; every fixed boolean rejects its numeric spelling, so Python and TypeScript verifiers agree on the same canonical bytes.Stacked on #369 (
codex/push-json-contract).Why
Target state: no production actuation without a signed qualification admission. Fail closed; never convert missing configuration into simulated success. A repair creates a new workflow version and needs a new admission.
Tests
test_qualification_admission,test_qualification_admission_v2,test_terminal_verification_v2,test_run_receipt,test_execution_profiles,test_connector,test_runner_client_lib.ruff check/ruff format --check/mypy/ strict safety-path mypy /scripts/check_consistency.pyclean.python -m buildplus wheel inspection: the wheel carries mechanism and interface only, no corpus, adversary params, or ROC tuning.🤖 Generated with Claude Code