scripts/sales_readiness.py currently emits status, acquisition/profile flags, repo_root, acceptance, checks, and failures, but no source_commit. scripts/build_acquisition_release.py::_verify_generated_stage() therefore carries an explicit "sales_readiness" not in name exemption from mandatory source identity. This leaves the sales-readiness stage itself unable to provide independently replayable source provenance even though the acquisition orchestrator holds an exact sealed commit.
Fresh buyer-packet review in #1717 added RED 961dfadb05cc95541023f61c5ec06a7e319d2dcf and repair 1bba24be881b6758364b3b44446fc96867465d58 so an explicit contradictory sales-readiness source_commit is rejected. That repair intentionally does not treat an absent identity as current.
Acceptance criteria:
- add source-level RED proving a sales-readiness manifest is bound to the exact source revision represented by the acceptance/acquisition run;
- make the canonical sales-readiness artifact emit a validated 40/64-character lowercase hexadecimal
source_commit without requiring mutable sibling state;
- in the acquisition builder, remove the sales-readiness exemption so
_verify_generated_stage() requires the same sealed commit for in-memory and persisted manifests;
- make buyer-packet collection fail closed when the sales-readiness source identity is absent or mismatched after the schema migration, with positive fixtures carrying exact matching identity;
- preserve standalone/non-Git verification semantics explicitly: if source identity is inherited from sealed acceptance rather than looked up from Git, document that contract and prove the canonical acquisition orchestrator independently guards repository immutability across the stage;
- no weakening of status checks, artifact-root/digest checks, current Rust/backend evidence, or existing source-identity guards;
- update the governed changelog/TRACEABILITY and run exact-head CI before landing.
Owner boundary: this is fast-mlsirm acquisition/evidence schema work. Do not duplicate it in build_commercial_release.py while #1600 owns that compatibility lane; #1600 should consume the canonical contract after it lands.
scripts/sales_readiness.pycurrently emitsstatus, acquisition/profile flags,repo_root,acceptance, checks, and failures, but nosource_commit.scripts/build_acquisition_release.py::_verify_generated_stage()therefore carries an explicit"sales_readiness" not in nameexemption from mandatory source identity. This leaves the sales-readiness stage itself unable to provide independently replayable source provenance even though the acquisition orchestrator holds an exact sealed commit.Fresh buyer-packet review in #1717 added RED
961dfadb05cc95541023f61c5ec06a7e319d2dcfand repair1bba24be881b6758364b3b44446fc96867465d58so an explicit contradictory sales-readinesssource_commitis rejected. That repair intentionally does not treat an absent identity as current.Acceptance criteria:
source_commitwithout requiring mutable sibling state;_verify_generated_stage()requires the same sealed commit for in-memory and persisted manifests;Owner boundary: this is fast-mlsirm acquisition/evidence schema work. Do not duplicate it in
build_commercial_release.pywhile #1600 owns that compatibility lane; #1600 should consume the canonical contract after it lands.