Supersedes #2, which cannot deliver its own work.
Why #2 could not merge
#2 targets feature/ref-trust-runner, which is already an ancestor of main — merging it would put nothing on main. Its branch is also based on a stale ancestor (a9ee1aad), and a 3-way merge into current main conflicts in src/config.rs and src/ec2/host.rs. Retargeting alone would not have helped: the conflicts have to be resolved either way. They are resolved here, once, against current code.
I verified none of its work is on main: job_depends_on, validate_delegated_script, resolve_hosted_commit, check_hosted_provenance, delegated_script_paths and reject_non_conforming_production_pipeline were all absent.
What lands, with #2's tests carried over
- SDP-002 — a production job must need a job named
package, which must transitively need a job namedverify. Same-shape artifact producers are rejected.job_depends_onwalksneedswith a visited set, so a cyclic graph cannot hang it. - SDP-006/010 —
validate_delegated_scriptreads the referenced script's content and requires checksum verification plus a health or rollback gate. A sanctioned filename no longer earns the pass on its own. - SDP-001 — fleet audit resolves the hosted commit from the Build-owned bare mirror and compares it against the local checkout; an unresolved hosted commit is a violation, not a pass.
- Queue-time gate — a pipeline failing
config::parseis rejected before a run row exists.
Deliberately not ported
is_executable_deploy_contract— already onmainvia #7. #2's copy is a byte-identical duplicate definition and would not compile alongside it.all_akurai_apps_toml_deploy_fields_are_executable_contracts— it usedenv!("HOME"), which resolves at compile time: it bakes the build machine's home into the binary and fails the build outright whereHOMEis unset. Combined with its early return, it was silently vacuous wherever the sibling checkout is absent — precisely CI.main'slive_catalog_deploy_fields_survive_parsing_and_are_executablealready covers this correctly, at runtime, and says why it skipped.
Two fixes on top of #2
- The queue-time gate's comment claimed only production pipelines were affected. It calls
config::parse, which validates the whole pipeline, so a malformed non-production pipeline is refused at queue time too. Comment corrected, andqueue_rejects_a_malformed_non_production_pipeline_tooadded — #2 only tested the valid non-production case, so the wider behaviour was undocumented and untested. - The
config.rsconflict was semantic, not textual:mainrelaxed SDP-005 so a routine production deployment needs no approval, while #2 still asserted it was rejected. I keptmain's policy and added theverifyjob its fixture now requires under the new SDP-002 rule — rather than silently reinstating the older, stricter rule via a merge.
Verification
cargo fmt --all -- --check: cleancargo clippy --all-targets --all-features --locked -- -D warnings: cleancargo test --lib: 360 passed, 0 failed, 4 ignored (up from 341)
Original work by the author of #2; conflict resolution, the two fixes and the dropped-test analysis are mine.
🤖 Generated with Claude Code
https://claude.ai/code/session_01FRtUmfFA7yWCFpX9dCaXvz