Repository navigation
feat(infra): bind the release-recorded probe runner binary and per-language probe images (B5 PR3b) - #1934
feat(infra): bind the release-recorded probe runner binary and per-language probe images (B5 PR3b)#1934ai-mountain wants to merge 19 commits into
Conversation
|
No dashboard preview for this commit. This PR resolved to preview profiles Stack previews are never automatic. A maintainer can provision one for this PR: gh workflow run preview-stack.yml -f pr=1934 # provision
gh workflow run preview-stack.yml -f pr=1934 -f action=retire # free the slotIt runs on the default branch, resolves the head commit from the API, and comments dashboard, Platform, and isolated Backroom URLs once readiness succeeds. Exact SHA: |
…in the release set The native runtime bundle builds bin/dittobench-coding-enforcement-probe with the worker's static flags, smoke-checks it, and requires it as an executable amd64 ELF. The release set (now v3) records runtime.probe_runner_sha256 from the bundle manifest. That is the release-recorded binary digest evidence binds. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The runner hashes /proc/self/exe, the executable image actually running, and reports probe_runner_binary_sha256. It refuses to report if the binary can't be measured. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…evidence Records now carry tools.probe_runner_binary_sha256, the binary that ran, measured on the host. It must equal runtime.probe_runner_sha256 in the release index, which verify, review and check-approval now require via --release-index. The ambiguous tools.runner_sha256 becomes tools.probe_runner_source_sha256. It is kept as supporting provenance and still computed from the reviewed checkout. Records must also name the exact index digest, and their source revision, runtime archive and image approvals must match the index. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… binary Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Cover refusals for an operator-built binary, the source hash passed off as the binary, the old runner_sha256 key, index drift, record release fields that differ from the index, malformed or v2 indexes and a missing --release-index. Repin the golden record in Go and Python. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
dittobench-coding-native-enforcement-images-v1 names every catalog language once. Each entry has a distinct OCI manifest digest and its own explicitly recorded build and test argv; test commands use the trusted driver and shells are refused. It binds the grading profile whose limits and timeouts every language shares. Resource and pre-exec records take its digest as an input. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… set EnforcementProbeManifest applies the language's own build and test argv, and keeps the approved profile's limits, timeouts, IDs and totals without mutating it. The runner drops --image. It reads --enforcement-images, refuses a set for another profile, and refuses a manifest or resolved repository digest other than the pinned one. --language narrows which pinned languages are observed. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ommands Records that carry enforcement_images_sha256 must name the supplied grading profile, and every language image must be the one the release index released. The profile's own image must be exactly one language, whose recorded commands equal the profile's. The approval pins the set in profile_pins. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…inding Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…river The enforcement image set accepted any bounded argv for Rust, and its vector, test fixture and CI template pinned `--crate subject` commands that codingexecutor.rustCommand refuses. Rust arguments were pinned but never verified. Go and Python now require each Rust test command to be the driver's authority command, `dittobench-test-driver --group <its own group> --authority <relative .json> --authority-sha256 <hex>`. A codingexecutor test checks the offline check against rustCommand on the shared vector, which gains nine Rust refusal cases. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two refusal tests passed without their guards. Removing the record-to-release index check still passed because the preflight comparison also names the field, and removing the probe runner measurement check still passed because a later image lookup failed too. Both tests now assert the refusal that the guard itself produces, plus a malformed runner digest. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The runner's /proc/self/exe digest is a self-report, and the verifier cannot distinguish it from a collector measurement. Record that PR4/PR5 collectors must hash the file they execute from outside the runner and refuse a differing self-report. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
check-approval compared only each approval image's approval digest with the review. The host's native.release_policy also requires image_ref, config_digest and driver_profile to equal the release index, so an approval with another image reference was reported consistent offline and refused on-host. check-approval now compares every approval image field with the release index it already requires. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
b1e5cc2 to
0edebfb
Compare
…tive-probe-binding Brings in the 2026-09-16 approval decisions: signature over exact stored bytes with strict parsing, server_version observed rather than enforced on the host, and the 24 hour approval validity cap. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Peyton-Spencer
left a comment
There was a problem hiding this comment.
Open Code Review pass completed at a41dabdfce6b8fc22373254ca2e30d1998160621 using z-ai/glm-5.3-flash through Ditto’s Code Review endpoint. Coverage: 34/34 added, modified, renamed, or type-changed files in the PR diff.
Model candidates were checked against the source; independently confirmed actionable findings, if any, are posted separately as inline review comments. This was a static review; no PR code or test suite was executed. This comment is not a merge approval.
…ve-probe-binding Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
# Conflicts: # ditto/tests/test_coding_hosted_runtime_bundle.py # ditto/tests/test_coding_native_release.py # infra/ansible/roles/coding_hosted_runtime/files/runtime-bundle.py # infra/containers/coding-hosted-runtime.Dockerfile
There was a problem hiding this comment.
Ditto Review · Beta
Review completed for 32e8c87d3c115843d7978fcf14abf9b9cf72b7b6.
No actionable findings in the reviewed files. This is not an approval or proof that the PR is bug-free.
Configure Ditto Review. Inference is billed through your Ditto Router endpoint; targeted verification is included during beta.
Summary
B5 PR 3b, stacked on #1933. It binds the enforcement probe runner and the probe images. Peyton's decisions:
Default-off. It adds no host workflow, collection, approval or activation.
Status: both parts are pushed.
Stack update (2026-09-16,
a41dabdfc)Merged #1933
556cc9cc4(Peyton's 2026-09-16 approval decisions: curator signature verified over the exact stored approval bytes with strict, non-canonical parsing; Dockerserver_versionobserved rather than enforced on the host; approval validity capped at 24 h). One README table conflict resolved (kept this PR'senforcement_images_sha256pin plus #1933's wording). No other fallout; the enforcement-images set and release index remain canonical documents. Tests: native Python suites (evidence, preflight, matrix, release, probe runner, probe workflow, qualification) 548 passed, 2 skipped;go test -p 2 ./internal/codingenforcement/... ./cmd/dittobench-coding-enforcement-probe/ok; ruff, format, mypy, gofmt clean.Review update (2026-09-15): independent adversarial review
Rebased onto #1933
9b7fb9902. The fixes:9666d0f12). The image set accepted any bounded Rust argv. Its vector, test fixture and CI template pinned--crate subjectcommands thatcodingexecutor.rustCommandrefuses.catalog.RustTestArgv) and Python now require each Rust test command to be the driver's authority command:dittobench-test-driver --group <its own group> --authority <relative .json> --authority-sha256 <hex>.codingexecutortest checks the offline check againstrustCommandon the shared vector, which gains nine Rust refusal cases.check-approvalchecks approval images against the release index (0edebfb42). It compared onlyapproval_sha256. The host'srelease_policyalso requiresimage_ref,config_digestanddriver_profileto equal the index, so a mismatched approval passed offline and was refused on-host.b45616087).62b7ee2ea)./proc/self/exeis a self-report, and the verifier can't tell it from a collector measurement. PR4/PR5 collectors must hash the file they execute from outside the runner and refuse a differing self-report.go test -p 2oncodingenforcement/...,codingexecutor,codinghostedworkerand the probe command. vet is clean, including-tags native_probe_integration.Part 1: probe runner binary binding
bin/dittobench-coding-enforcement-probewith the worker's static flags. It smoke-checks the binary (no arguments exits 1 with its usage error) and requires it as an executable amd64 ELF. The release set (nowdittobench-coding-native-release-set-v3) recordsruntime.probe_runner_sha256from the bundle manifest.native.release_policyaccepts v3 only./proc/self/exe, the executable image actually running, and reportsprobe_runner_binary_sha256. The rootless CI job compares it with an independentsha256sumof the binary it built.tools.runner_sha256is nowtools.probe_runner_source_sha256: supporting provenance, still computed from the reviewed checkout. Newtools.probe_runner_binary_sha256must equal the release index'sruntime.probe_runner_sha256.verify,reviewandcheck-approvalrequire--release-index. Records must name the index's exact digest, and their source revision, runtime archive and image approvals must match it.approval.runner_sha256still names onlyrun.py.runner_sha256key;--release-index, and a missing, non-executable or non-ELF probe binary in the bundle.Part 2: per-language probe images and commands
dittobench-coding-native-enforcement-images-v1is canonical, with closed keys.grading_profile_sha256: the approved profile whose limits, timeouts, command IDs and expected totals every language shares.go,node,pythonandrustexactly once. Each has a distinct OCI manifestimage_digest, its ownbuild_argv, and its owntest_argvforhiddenandvisible.dittobench-test-driver. Rust arguments such as--crateor--out-dirare fine because the set records them.catalog.ParseEnforcementImages) and Python parse one shared vector with 16 refusal cases.GradingProfile.EnforcementProbeManifestnow takes the pinned language entry. It applies that language's commands, keeps the profile's limits, timeouts, IDs and totals, never mutates the approved profile through shared slices, and refuses a manifest whose image differs from the pinned one.--imageand reads--enforcement-images. It refuses a set for another profile, and a manifest or resolved repository digest other than the pinned one.--languageonly narrows which pinned languages are observed.inputs.enforcement_images_sha256(catalog inputs updated). The verifier requires:review/check-approvalneed--enforcement-images. The approval pins the set inprofile_pins.enforcement_images_sha256, and the approval vector was repinned.Tests (part 1)
go test -p 2 ./internal/codingenforcement/... ./cmd/dittobench-coding-enforcement-probe/; gofmt and vet clean. The golden record was repinned.Tests (after part 2)
go test -p 2 ./internal/codingenforcement/... ./internal/codinghostedworker/ ./cmd/dittobench-coding-enforcement-probe/; vet clean, including-tags native_probe_integration.Residuals
v2, but now requires the probe binary, so bundles built before this change are refused.No collection, host run, approval or activation is requested.
🤖 Generated with Claude Code
Note
Add probe-runner binary and enforcement-image profile to v3 release index
probe.RunningExecutableSHA256so the probe measures its own running binary and reports the digest in live observations and evidence records.observe-requested-configcommand removes the direct--imageflag and requires--enforcement-imagesand--repositoryarguments instead.Macroscope summarized 32e8c87.