Repository navigation
Conversation
…test tests (verifier, toolchain-id, tier arm, fail closed) ci_receipt_verify.sh checks signature (committed allowed_signers), 8-line shape, repo, tree and toolchain; ci_test_tier.sh takes tier=reuse on --receipt-ok 1 for pull_request/merge_group only, never a push or tag. allowed_signers is a PLACEHOLDER, so every verify fails closed until the operator-run forjar apply. Shard 1 still runs cargo check, fmt and clippy over the workspace. Pmat-Ticket: PMAT-5737 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…1 (refs/receipts, 8-line text)
FLOW-009 RC-1..RC-5. The receipt is a fenced `flow009.receipt/1` JSON block in the PR body, read from
$GITHUB_EVENT_PATH (no API call, no comment, no ref). Signed bytes are `jq -S -c 'del(.sig)'` + LF; sig is
ssh-keygen -Y sign, namespace flow009-receipt; the public key is .flow009/batcher.pub (committed as a
PLACEHOLDER, so every verify fails closed until a separate one-way PR replaces it).
Verified: sig, tree == HEAD^{tree}, commits[].patch_id multiset == git patch-id --stable over
merge-base..PR head, each ticket PMAT-<n> and in its commit's message, toolchain (scripts/ci/toolchain_id.sh,
image=none) and manifest (new scripts/ci/manifest_id.sh), plus schema, repo, exact keys, tests=pass.
Any doubt -> full gate, never red (PG-3). ci_test_tier.sh --receipt-ok is now pull_request only.
Shard-1 check/fmt/clippy steps kept. PG-4: `ci / gate` (paiml/.github sovereign-ci.yml) still needs its own
solo PR. infra PMAT-1889 owns the signer (fleet/receipts/receipt.sh).
Pmat-Ticket: PMAT-5737
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
… key (trust boundary) The CI step ran the verifier and read .flow009/batcher.pub from the PR's own tree, so a PR could commit its own key, sign its own receipt and skip the tests it is judged by. The step now git-shows the verifier, toolchain_id.sh, manifest_id.sh and batcher.pub from pull_request.base.sha and runs those copies (cwd = PR tree); any absent on base => full gate, never red. The verifier honours FLOW009_PUBKEY and prints one coverage=<float> line on success. Static guard check_receipt_trust_boundary.sh (+6 mutants); verifier self-test 42 -> 50 checks. Pmat-Ticket: PMAT-1889 Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ublic key Replaces the placeholder with the public half of the key the operator applied on lambda-labs. The self-test row for the committed key now asserts a test-key receipt fails against it (red with the placeholder restored). Pmat-Ticket: PMAT-5737 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
§13.11 rung 1 — quorum shadow verdict Shadow mode: this records a verdict and merges nothing. A refusal |
Refs PMAT-5737 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift
left a comment
There was a problem hiding this comment.
seat 2, aprender-triage-worker @451adef4d9 APPROVE
Read: ci_receipt_verify.sh verify() in full (fence/shape/sig/tree/patch-id/ticket/toolchain/manifest, every refusal one line + R- marker, fail closed to RECEIPT_OK=0), the ci_test_tier.sh receipt arm (pull_request only, tag -> full, push mg-reuse untouched, only exactly 1 honoured), the sections.yml receipt + reuse steps (verifier, helpers and key from base.sha), check_receipt_trust_boundary.sh.
Run (scratch extract of the head): ci_receipt_verify.sh --self-test = 50 checks, 0 failed; check_receipt_trust_boundary.sh = ok.
Not run: CI, bashrs lint, ci_test_tier.sh self-test, the signer side. batcher.pub now carries a real ed25519 key (fingerprint in its header): installing the trust key is a one-way step, so it stays under the andon/yes already named in the body.
This is a seat only. A gate-content change still needs the separate planted quorum + non-author sign-off at the final commit (C324 r7); not claimed here. Re-seat by delta if the head moves.
ANDON (gate change, solo, AN-3): needs Noah's yes before arming; never batched.
PMAT-5737 (FLOW-009 RC-1..RC-5; infra PMAT-1889 owns the signer in fleet/receipts/receipt.sh).
This PR changes what
workspace-testaccepts. A valid signed receipt lets a pull_request skip the test run; any doubt runs the full gate (PG-3), never red.Format replaced. The v1 8-line receipt fetched from refs/receipts is gone. The receipt is now a fenced block whose info string is exactly
flow009.receipt/1, in the PR body. CI reads it from$GITHUB_EVENT_PATHonly: no API call, no comment, no ref.jq -S -c 'del(.sig)'plus LF. sig:ssh-keygen -Y sign, namespaceflow009-receipt, principalflow009-batcher..flow009/batcher.pub, committed as a PLACEHOLDER (comment lines, no key), so every verify fails closed. Replacing it is a separate one-way PR.Verified: sig; tree == HEAD^{tree} of the PR merge commit; commits[].patch_id multiset ==
git patch-id --stableover merge-base..PR head (head SHA from the event); each ticket^PMAT-[0-9]+$and in that commit's message; toolchain ==scripts/ci/toolchain_id.sh(rust-toolchain.toml, rustc -vV, literalimage=nonebecause lambda'smake gateis uncontainerised); manifest ==scripts/ci/manifest_id.sh(gate definition files plus the cargo-metadata test-target list). Also schema, repo, exact key sets, tests == pass. base_sha and commits[].sha are not compared.Scope. pull_request only: no merge_group arm, never a tag, never a push.
ci_test_tier.sh --receipt-ok 1gives tier=reuse, cite=receipt:, receipt=ok. Shard 1 still runs cargo check, fmt and clippy.Tests.
scripts/ci_receipt_verify.sh --self-test: 42 rows (1 green, 41 mutants, each asserting its refusal reason).scripts/ci_test_tier.sh --self-test: 133 rows, 0 failed. Breaking each refusal in a scratch copy turned 33 of 47 red; the 14 survivors are tool-missing or internal-error guards. bashrs lint: 0 errors.Not in this PR. PG-4: the required check
ci / gate(paiml/.githubsovereign-ci.yml, jobstestandcoverage) must also honour the receipt. That is a separate solo PR with its own andon. The pubkey replacement is also separate.Unproven. The depth-1 merge checkout hides the PR head; sections.yml fetches it at depth 500, not yet exercised on a runner. A failure there is the full gate.
Trust boundary (commits after the rework):
.flow009/batcher.pubfrompull_request.base.shawithgit show, and runs those copies withFLOW009_PUBKEYset to the base key.coverage=<v>line, which FLOW-009 PG-4/PG-5: opt-in receipt short-circuit in sovereign-ci (inert by default; verifier+key from base) .github#85 reads.🤖 Generated with Claude Code