diff --git a/.github/actions/setup-harness/action.yml b/.github/actions/setup-harness/action.yml index 52e668574..917cf9800 100644 --- a/.github/actions/setup-harness/action.yml +++ b/.github/actions/setup-harness/action.yml @@ -81,8 +81,8 @@ runs: args=() IFS=',' read -ra parts <<< "$bins" for b in "${parts[@]}"; do args+=(--bin "$b"); done - echo "cargo build -p $pkg ${args[*]}" - cargo build -p "$pkg" "${args[@]}" + echo "cargo build --locked -p $pkg ${args[*]}" + cargo build --locked -p "$pkg" "${args[@]}" done - name: Install harness diff --git a/.github/delivery/README.md b/.github/delivery/README.md new file mode 100644 index 000000000..beeca4e5c --- /dev/null +++ b/.github/delivery/README.md @@ -0,0 +1,13 @@ +# Delivery ledgers + +Delivery ledgers inventory source work without treating file presence as proof of +semantic delivery. `pr216-ledger.json` is pinned to the authoritative +`49dc797..45ad8c9` commit and path sets. Validate it with: + +```sh +node scripts/validate-pr216-ledger.mjs +node scripts/validate-pr216-ledger_test.mjs +``` + +Only use `integrated` with independently checkable evidence. Keep unresolved +work as `open_pr` or `missing` with an owner and concrete follow-up. diff --git a/.github/delivery/pr216-ledger.json b/.github/delivery/pr216-ledger.json new file mode 100644 index 000000000..e8ee61764 --- /dev/null +++ b/.github/delivery/pr216-ledger.json @@ -0,0 +1,8085 @@ +{ + "schemaVersion": 1, + "source": { + "base": "49dc7975c674b34e461bed89d2a1a9e49e9e5920", + "head": "45ad8c9acd7a71d4dd12b87321a9902c71fef865", + "commitCount": 113, + "pathCount": 237, + "commitSetSha256": "6db6ba37862590cb07f6d5dfd89a28416424b4946534ba255a90c41c8b0d18fa", + "pathSetSha256": "a7d381df019007c3d6f413d2b4377cca00beb27572308c908894e4b8dec835fa" + }, + "allowedStatuses": [ + "integrated", + "open_pr", + "superseded", + "obsolete_test_only", + "missing" + ], + "plannedBuckets": [ + "typescript", + "rust", + "go", + "python", + "ruby", + "lua", + "php", + "swift", + "kotlin", + "harness-ci", + "cross-sdk" + ], + "deliveryBaseline": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec", + "summary": { + "commits": { + "open_pr": 22, + "superseded": 89, + "obsolete_test_only": 2 + }, + "paths": { + "integrated": 27, + "open_pr": 111, + "superseded": 99 + } + }, + "commits": [ + { + "sha": "3bb820283ab5fd8f57e97460baa4dcfb34ce7009", + "subject": "test: lock replay and lamports invariants in Go, Ruby, Swift SDKs", + "bucket": "cross-sdk", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source commit 3bb820283ab5fd8f57e97460baa4dcfb34ce7009 is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + }, + { + "kind": "open-delivery-head", + "pr": 231, + "branch": "fix/swift-conformance-hardening", + "deliveryCommit": "63ca1c3", + "detail": "Source commit 3bb820283ab5fd8f57e97460baa4dcfb34ce7009 is assigned to PR #231 at or beyond 63ca1c3; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup; PR #231 / fix/swift-conformance-hardening", + "followUp": "Land PR #214 and PR #231, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "272190cfc022eb728d74dd6506846cbbf004822d", + "subject": "fix(php): require a shared replay store outside localnet in the x402 adapter (H3)", + "bucket": "php", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1", + "detail": "Source commit 272190cfc022eb728d74dd6506846cbbf004822d is assigned to PR #229 at or beyond 0bd30c1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #229 / fix/php-security-hardening", + "followUp": "Land PR #229, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "cd9d245302c92672476eae8fde299d4169bc51be", + "subject": "test(mpp): cover error, client subscription, and subscription intent to >=90", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source commit cd9d245302c92672476eae8fde299d4169bc51be is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "e51727e919caf13070bc891a6b4fec78b59d84d6", + "subject": "test(core): cover the blockhash cache (empty, fresh, stale, poison recovery)", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source commit e51727e919caf13070bc891a6b4fec78b59d84d6 is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "a707983ccfabb301f18dc48b23e1f53c84d209a6", + "subject": "test(x402): cover siwx.rs to >=90 line+region", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source commit a707983ccfabb301f18dc48b23e1f53c84d209a6 is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "f1830dc51f384afed6f18c60390900d749b014f7", + "subject": "fix(mpp-kotlin): refuse expired challenges in ChargeCredentialBuilder (M5)", + "bucket": "kotlin", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 230, + "branch": "fix/kotlin-canonical-json-hardening", + "deliveryCommit": "d286dd9", + "detail": "Source commit f1830dc51f384afed6f18c60390900d749b014f7 is assigned to PR #230 at or beyond d286dd9; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #230 / fix/kotlin-canonical-json-hardening", + "followUp": "Land PR #230, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "a99a571adb19dc913de91b1cc7e0159132fea3d2", + "subject": "test(rust): pin per-instruction golden vectors for the payment-channels wire format (H8)", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source commit a99a571adb19dc913de91b1cc7e0159132fea3d2 is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "7faeb0d027d1c0bb8a51d0403f8e83d03b987e4b", + "subject": "fix(ts): resolve fail-closed replay store for x402-only accept lists (A1)", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source commit 7faeb0d027d1c0bb8a51d0403f8e83d03b987e4b is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + }, + { + "kind": "open-delivery-head", + "pr": 237, + "branch": "fix/mpp-replay-store-hardening", + "deliveryCommit": "9bfd9e1", + "detail": "Source commit 7faeb0d027d1c0bb8a51d0403f8e83d03b987e4b is assigned to PR #237 at or beyond 9bfd9e1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening; PR #237 / fix/mpp-replay-store-hardening", + "followUp": "Land PR #232 and PR #237, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "0ca5ef51058cf3dc2416954c9128b65e0ab6c1ed", + "subject": "fix(mpp): require an account-info-capable RPC to raise a session deposit (M-4)", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source commit 0ca5ef51058cf3dc2416954c9128b65e0ab6c1ed is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "2cca2ce05bb04b82c4ee183973a8a39adba65d65", + "subject": "fix(go): drop the personal-fork solana-go replace by deriving token-program-aware ATAs locally (H-5)", + "bucket": "cross-sdk", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source commit 2cca2ce05bb04b82c4ee183973a8a39adba65d65 is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "51d1c4a1bd66be82db2539a7fe959078030f445d", + "subject": "test(go): cover new on-chain-bind and ATA-derivation paths to clear the 91% floor", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source commit 51d1c4a1bd66be82db2539a7fe959078030f445d is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "8fd892bf66ff827772c709a46905bbd77723b77a", + "subject": "fix(mpp): surface top-up operator misconfiguration as invalid-config and drop review bookkeeping from a comment", + "bucket": "python", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "8ac54e8", + "detail": "Source commit 8fd892bf66ff827772c709a46905bbd77723b77a is assigned to PR #228 at or beyond 8ac54e8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #228 / fix/python-security-hardening", + "followUp": "Land PR #228, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "09b7e5f6679401301b5c8f09658ce6f241d8c5e0", + "subject": "fix(mpp): make channel-lock refcounts cancellation-safe in the session store", + "bucket": "python", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "8ac54e8", + "detail": "Source commit 09b7e5f6679401301b5c8f09658ce6f241d8c5e0 is assigned to PR #228 at or beyond 8ac54e8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #228 / fix/python-security-hardening", + "followUp": "Land PR #228, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "232bf91a37c7fe53ff11fe9d78a3032f365f0eaa", + "subject": "fix(mpp): pre-broadcast subscription-authority init so first-time TS activations pass the strict server allowlist", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 238, + "branch": "fix/mpp-subscription-hardening", + "deliveryCommit": "1865dfb", + "detail": "Source commit 232bf91a37c7fe53ff11fe9d78a3032f365f0eaa is assigned to PR #238 at or beyond 1865dfb; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #238 / fix/mpp-subscription-hardening", + "followUp": "Land PR #238, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "fa8ce848698d14508bf6749ff06875c73a03c1a1", + "subject": "fix(x402): clear the blockhash single-flight flag on any provider exception path", + "bucket": "python", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "8ac54e8", + "detail": "Source commit fa8ce848698d14508bf6749ff06875c73a03c1a1 is assigned to PR #228 at or beyond 8ac54e8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #228 / fix/python-security-hardening", + "followUp": "Land PR #228, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "1ed6204ab0040631fa4ecfeef32a9c1ceef4e8e9", + "subject": "fix(x402): evict voucher gate entries, serialize deposit first-accept under the channel gate, and cap batch payment headers", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source commit 1ed6204ab0040631fa4ecfeef32a9c1ceef4e8e9 is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "fc6aabbfa50a5e5cfc9035c1b0586756789399f2", + "subject": "fix(go): fail closed on fee-payer ATA derivation errors and derive the recipient ATA from the instruction token program", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source commit fc6aabbfa50a5e5cfc9035c1b0586756789399f2 is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "ca15d9498b5b5c04251b9b6bc57c648a176e5130", + "subject": "fix(pay-kit): sanitize challenge-bound strings before they reach the mppx header serializer", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source commit ca15d9498b5b5c04251b9b6bc57c648a176e5130 is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "4efd4bbb60e64f12e6b453f26826f2e9a69b744e", + "subject": "test(pay-kit): base tarball hygiene guard on tracked files and skip cleanly outside git", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "d9815dc", + "detail": "Source commit 4efd4bbb60e64f12e6b453f26826f2e9a69b744e is assigned to PR #233 at or beyond d9815dc; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #233 / fix/harness-adversarial-hardening", + "followUp": "Land PR #233, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "ef6e97769668f86062ba5e6c55fd6bfea63274e1", + "subject": "docs(x402): pin the @x402/svm version behind the release-safe reason set", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source commit ef6e97769668f86062ba5e6c55fd6bfea63274e1 is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "36d493f05ccb34ced2cbb06008d1d21dfb1d7c4c", + "subject": "fix(mpp): skip subscription activation rebroadcast when delegation exists", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 238, + "branch": "fix/mpp-subscription-hardening", + "deliveryCommit": "1865dfb", + "detail": "Source commit 36d493f05ccb34ced2cbb06008d1d21dfb1d7c4c is assigned to PR #238 at or beyond 1865dfb; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #238 / fix/mpp-subscription-hardening", + "followUp": "Land PR #238, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "45ad8c9acd7a71d4dd12b87321a9902c71fef865", + "subject": "test(mpp): keep subscription co-sign branch on broadcast path", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 238, + "branch": "fix/mpp-subscription-hardening", + "deliveryCommit": "1865dfb", + "detail": "Source commit 45ad8c9acd7a71d4dd12b87321a9902c71fef865 is assigned to PR #238 at or beyond 1865dfb; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #238 / fix/mpp-subscription-hardening", + "followUp": "Land PR #238, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "sha": "e62c0ad7039256bfec0a71881e35bab89bd2e079", + "subject": "fix(mpp): close pull-mode charge replay TOCTOU in TS verify", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/mpp/src/__tests__/charge.test.ts", + "typescript/packages/mpp/src/server/Charge.ts" + ], + "successors": [ + { + "commit": "f3c4947be62e5d168f4ae55eb2e69a93f585527b", + "paths": [ + "typescript/packages/mpp/src/__tests__/charge.test.ts", + "typescript/packages/mpp/src/server/Charge.ts" + ] + } + ], + "detail": "2 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "f3c4947be62e5d168f4ae55eb2e69a93f585527b", + "subject": "fix(mpp): exact bigint lamports comparison and display in TS charge", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/mpp/src/__tests__/charge.test.ts", + "typescript/packages/mpp/src/server/Charge.ts" + ], + "successors": [ + { + "commit": "bab3fe12fb4f83d2eefe46de70cdbd96a76af30b", + "paths": [ + "typescript/packages/mpp/src/__tests__/charge.test.ts" + ] + }, + { + "commit": "a4df208987f0d6fa2f409eee870b5741e11eba2a", + "paths": [ + "typescript/packages/mpp/src/server/Charge.ts" + ] + } + ], + "detail": "2 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "50402deb6578e7f957596f20c3c1f7528fe06678", + "subject": "fix(mpp): bind session push-open to the on-chain channel", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/mpp/server/session.rs" + ], + "successors": [ + { + "commit": "a2fd8cf0c0c7c8b142a99d0ca224cd07999e4cc5", + "paths": [ + "rust/crates/kit/src/mpp/server/session.rs" + ] + } + ], + "detail": "1 of 1 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "18ad654ecd9e103aab08033632358d6e95375580", + "subject": "fix(pay-kit): require a shared replay store outside localnet", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/pay-kit/src/__tests__/config.test.ts", + "typescript/packages/pay-kit/src/config.ts" + ], + "successors": [ + { + "commit": "7c03fcbb1b5b71f6573c1f9b4b81e07e14755e19", + "paths": [ + "typescript/packages/pay-kit/src/__tests__/config.test.ts" + ] + }, + { + "commit": "7faeb0d027d1c0bb8a51d0403f8e83d03b987e4b", + "paths": [ + "typescript/packages/pay-kit/src/config.ts" + ] + } + ], + "detail": "2 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "808dcb7795ab5e15ac03b7a3fe18fa67cfc25bc6", + "subject": "chore: commit rust workspace lockfile and document deployment threat model", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".gitignore", + "SECURITY.md", + "rust/Cargo.lock" + ], + "successors": [ + { + "commit": "9db621bbd3c5b011ee14d0444afe35acb2cd0d1a", + "paths": [ + ".gitignore" + ] + }, + { + "commit": "a4df208987f0d6fa2f409eee870b5741e11eba2a", + "paths": [ + "SECURITY.md" + ] + }, + { + "commit": "1c4555f96f49e4f7cb891b2b2d6db1d0a51ff283", + "paths": [ + "rust/Cargo.lock" + ] + } + ], + "detail": "3 of 3 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "4820710083fc76bc5bdde410613df12fcf5d3658", + "subject": "fix(lua): reject lossy jsonParsed lamports in MPP charge verify", + "bucket": "lua", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "integrated", + "pr": 225, + "branch": "fix/lua-security-hardening", + "deliveryCommit": "3a6d74974857f7d051a77d26b52ecbc5831b4e2f" + } + ], + "paths": [ + "lua/pay_kit/protocols/mpp/server/solana_verify.lua", + "lua/pay_kit/util/uint.lua", + "lua/tests/solana_verify_spec.lua" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "8d925cbd1b0827b40628bb6d420e96af60c26b2c", + "subject": "fix(php): require a shared replay store outside localnet", + "bucket": "php", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1b170951a9b3edb70d158c15e6f3074fed" + } + ], + "paths": [ + "php/src/Protocols/Mpp/Adapter.php", + "php/tests/Protocols/Mpp/AdapterTest.php" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "74ade6028953f513ad264464cc0521af33815455", + "subject": "ci: harden supply chain (pinned rolling actions, least-privilege report, npm env gate)", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/actions/setup-harness-leg/action.yml", + ".github/actions/setup-harness/action.yml", + ".github/workflows/ci.yml", + ".github/workflows/npm-publish.yml", + ".github/workflows/pypi-publish.yml", + ".github/workflows/report.yml" + ], + "successors": [ + { + "commit": "5f97504b46f0e770d13dcea13fc0479dca4bfbe2", + "paths": [ + ".github/actions/setup-harness-leg/action.yml", + ".github/actions/setup-harness/action.yml", + ".github/workflows/ci.yml", + ".github/workflows/npm-publish.yml", + ".github/workflows/pypi-publish.yml", + ".github/workflows/report.yml" + ] + } + ], + "detail": "6 of 7 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "c010605e07962d700cbf47b452c52fee2cd1d413", + "subject": "fix(python): bind session push-open to the on-chain channel", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py", + "python/tests/test_session_method.py" + ], + "successors": [ + { + "commit": "09e3264b1e9e64526041130e363e6f5a1f80ef91", + "paths": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "python/tests/test_session_method.py" + ] + }, + { + "commit": "32da13ef8efcbc1ebbec2a5cfa52c3ff4447b699", + "paths": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py" + ] + } + ], + "detail": "3 of 3 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "5f97504b46f0e770d13dcea13fc0479dca4bfbe2", + "subject": "ci: pin all third-party GitHub Actions to commit SHAs (M3)", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/ci.yml", + ".github/workflows/go.yml", + ".github/workflows/harness.yml", + ".github/workflows/kotlin.yml", + ".github/workflows/lua.yml", + ".github/workflows/npm-publish.yml", + ".github/workflows/php.yml", + ".github/workflows/pypi-publish.yml", + ".github/workflows/python.yml", + ".github/workflows/report.yml", + ".github/workflows/ruby.yml", + ".github/workflows/swift.yml" + ], + "successors": [ + { + "commit": "b47a06e109709d3a744acfdf35ce2a5563e9a819", + "paths": [ + ".github/workflows/ci.yml" + ] + }, + { + "commit": "1c6f9e4dd940d3975ba6f19b289439a155eff3c5", + "paths": [ + ".github/workflows/go.yml", + ".github/workflows/python.yml" + ] + }, + { + "commit": "1c4555f96f49e4f7cb891b2b2d6db1d0a51ff283", + "paths": [ + ".github/workflows/harness.yml", + ".github/workflows/report.yml" + ] + }, + { + "commit": "81e0905832936bd26015a94840ffcb86a119eea9", + "paths": [ + ".github/workflows/kotlin.yml", + ".github/workflows/lua.yml", + ".github/workflows/php.yml", + ".github/workflows/ruby.yml" + ] + }, + { + "commit": "f1beea46e838abe3098089c4688368acfabd19a1", + "paths": [ + ".github/workflows/npm-publish.yml" + ] + }, + { + "commit": "f54621b49df0b4db046746121ca1a7890cf97e69", + "paths": [ + ".github/workflows/pypi-publish.yml" + ] + }, + { + "commit": "39e886db82b103d3a922a8470da5890bc095ec2d", + "paths": [ + ".github/workflows/swift.yml" + ] + } + ], + "detail": "12 of 16 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "f1beea46e838abe3098089c4688368acfabd19a1", + "subject": "ci(release): refuse to republish an existing npm version (L3)", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/npm-publish.yml" + ], + "successors": [ + { + "commit": "f54621b49df0b4db046746121ca1a7890cf97e69", + "paths": [ + ".github/workflows/npm-publish.yml" + ] + } + ], + "detail": "1 of 1 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "80cd422d6c7ea83b65dc04491699a7cce622de02", + "subject": "test(mpp): pin settle-family account layout; make on-chain skip CI-visible", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/core/payment_channels.rs" + ], + "successors": [ + { + "commit": "a99a571adb19dc913de91b1cc7e0159132fea3d2", + "paths": [ + "rust/crates/kit/src/core/payment_channels.rs" + ] + } + ], + "detail": "1 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "09e3264b1e9e64526041130e363e6f5a1f80ef91", + "subject": "fix(python): require a shared session store outside localnet (H3)", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "python/tests/test_session_method.py" + ], + "successors": [ + { + "commit": "d92433a2cddd2af865fe6604d8ba3505c3db4c1c", + "paths": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "python/tests/test_session_method.py" + ] + } + ], + "detail": "2 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "b47a06e109709d3a744acfdf35ce2a5563e9a819", + "subject": "ci(rust): gate x402 coverage and fold instruction builders into the floor (M5)", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/ci.yml" + ], + "successors": [ + { + "commit": "2752dad14fba030679a9d90bf7fd2275d98775e9", + "paths": [ + ".github/workflows/ci.yml" + ] + } + ], + "detail": "1 of 1 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "39e886db82b103d3a922a8470da5890bc095ec2d", + "subject": "ci(swift): add a coverage floor (M5)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/swift.yml" + ], + "successors": [ + { + "commit": "4e13216fe7490f355a1c5d48ae10db82579fc554", + "paths": [ + ".github/workflows/swift.yml" + ] + } + ], + "detail": "1 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "20a8c5db2d13a54e2142788629bde1c37bb88ed4", + "subject": "test(php): cover the x402 Verifier and Adapter, remove coverage exclusions (M5)", + "bucket": "php", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "php/tests/Protocols/X402/Exact/VerifierBranchTest.php" + ], + "successors": [ + { + "commit": "820fbcd0e2d3ed592d5c3cfb0062a91fb31a6db6", + "paths": [ + "php/tests/Protocols/X402/Exact/VerifierBranchTest.php" + ] + } + ], + "detail": "1 of 3 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "d0969f853d1e2065f7b246e6afceab71d4363242", + "subject": "test(rust): raise x402 and mpp coverage with real tests, not exclusions", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/mpp/server/authenticate.rs", + "rust/crates/kit/src/mpp/server/subscription.rs", + "rust/crates/kit/src/x402/error.rs", + "rust/crates/kit/src/x402/protocol/schemes/exact/verify.rs", + "rust/crates/kit/src/x402/server/batch_settlement.rs", + "rust/crates/kit/src/x402/server/exact.rs", + "rust/crates/kit/src/x402/server/mock_rpc.rs", + "rust/crates/kit/src/x402/server/mod.rs", + "rust/crates/kit/src/x402/server/upto.rs" + ], + "successors": [ + { + "commit": "9079d38c2122f3508ba2fe4f79ed78842d2351d1", + "paths": [ + "rust/crates/kit/src/mpp/server/authenticate.rs" + ] + }, + { + "commit": "d5af1105b87ec22edb6f08ce840eafac7bf4abf7", + "paths": [ + "rust/crates/kit/src/mpp/server/subscription.rs" + ] + }, + { + "commit": "6eff6a4794846e320f14609c777b15742e1a5160", + "paths": [ + "rust/crates/kit/src/x402/error.rs", + "rust/crates/kit/src/x402/server/exact.rs" + ] + }, + { + "commit": "b1b0015e71489e921b4b90c4df902d704deca447", + "paths": [ + "rust/crates/kit/src/x402/protocol/schemes/exact/verify.rs" + ] + }, + { + "commit": "4d36b251ffac83e0adbdfb880720b7de159ccb03", + "paths": [ + "rust/crates/kit/src/x402/server/batch_settlement.rs" + ] + }, + { + "commit": "a2fd8cf0c0c7c8b142a99d0ca224cd07999e4cc5", + "paths": [ + "rust/crates/kit/src/x402/server/mock_rpc.rs" + ] + }, + { + "commit": "1ed6204ab0040631fa4ecfeef32a9c1ceef4e8e9", + "paths": [ + "rust/crates/kit/src/x402/server/mod.rs" + ] + }, + { + "commit": "c43cdf4393d1da5cfd608dc207aafff89e91d7f4", + "paths": [ + "rust/crates/kit/src/x402/server/upto.rs" + ] + } + ], + "detail": "9 of 12 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "a2fd8cf0c0c7c8b142a99d0ca224cd07999e4cc5", + "subject": "test(rust): cover charge, session, and settlement worker to >=90 line+region", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/mpp/server/charge.rs", + "rust/crates/kit/src/mpp/server/session.rs" + ], + "successors": [ + { + "commit": "faab2ec8890498a0acd0e1534ab10137a180a87e", + "paths": [ + "rust/crates/kit/src/mpp/server/charge.rs" + ] + }, + { + "commit": "1d6a88edb65bfa878ec870fff0d5a757ace3e5a1", + "paths": [ + "rust/crates/kit/src/mpp/server/session.rs" + ] + } + ], + "detail": "2 of 4 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "2752dad14fba030679a9d90bf7fd2275d98775e9", + "subject": "ci(rust): gate line AND region coverage at 90, aggregate AND per-file (M5)", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/ci.yml" + ], + "successors": [ + { + "commit": "1c4555f96f49e4f7cb891b2b2d6db1d0a51ff283", + "paths": [ + ".github/workflows/ci.yml" + ] + } + ], + "detail": "1 of 1 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "4e13216fe7490f355a1c5d48ae10db82579fc554", + "subject": "test(swift): raise Sources coverage to >=90 and gate at 90", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/swift.yml" + ], + "successors": [ + { + "commit": "81e0905832936bd26015a94840ffcb86a119eea9", + "paths": [ + ".github/workflows/swift.yml" + ] + } + ], + "detail": "1 of 7 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "29fba4396051b46f62f5208d328ab8dd0e9ff62e", + "subject": "test(ts): cover the reference SDK to >=90 and enforce a coverage gate", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/mpp/src/__tests__/charge.test.ts", + "typescript/packages/mpp/src/__tests__/session-server-branches.test.ts", + "typescript/packages/mpp/src/__tests__/subscription-branches.test.ts", + "typescript/packages/mpp/src/__tests__/subscription-client-branches.test.ts", + "typescript/packages/pay-kit/src/__tests__/mpp-adapter-settle.test.ts", + "typescript/packages/pay-kit/src/__tests__/mpp-session.test.ts", + "typescript/packages/pay-kit/src/__tests__/paykit-branches.test.ts", + "typescript/packages/pay-kit/src/__tests__/session.test.ts", + "typescript/packages/pay-kit/src/__tests__/x402-adapter.test.ts", + "typescript/packages/pay-kit/src/__tests__/x402-shared.test.ts" + ], + "successors": [ + { + "commit": "bbd58c7dd1cb8bfebdc19fb134da53a77d39c265", + "paths": [ + "typescript/packages/mpp/src/__tests__/charge.test.ts", + "typescript/packages/mpp/src/__tests__/subscription-branches.test.ts", + "typescript/packages/pay-kit/src/__tests__/mpp-adapter-settle.test.ts", + "typescript/packages/pay-kit/src/__tests__/mpp-session.test.ts", + "typescript/packages/pay-kit/src/__tests__/paykit-branches.test.ts", + "typescript/packages/pay-kit/src/__tests__/session.test.ts" + ] + }, + { + "commit": "82b69f7cb0c276d6b730e8fe32dbb95e62067721", + "paths": [ + "typescript/packages/mpp/src/__tests__/session-server-branches.test.ts" + ] + }, + { + "commit": "232bf91a37c7fe53ff11fe9d78a3032f365f0eaa", + "paths": [ + "typescript/packages/mpp/src/__tests__/subscription-client-branches.test.ts" + ] + }, + { + "commit": "59b45e987eb104c6ec4db0c331113e05b7271f60", + "paths": [ + "typescript/packages/pay-kit/src/__tests__/x402-adapter.test.ts" + ] + }, + { + "commit": "9a5739623939b7252c2154f126b6a6aeffd6e589", + "paths": [ + "typescript/packages/pay-kit/src/__tests__/x402-shared.test.ts" + ] + } + ], + "detail": "10 of 25 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "d5af1105b87ec22edb6f08ce840eafac7bf4abf7", + "subject": "fix(mpp): strict-allowlist subscription activation scope and pin fee payer to index 0 (C1)", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/mpp/server/subscription.rs" + ], + "successors": [ + { + "commit": "9079d38c2122f3508ba2fe4f79ed78842d2351d1", + "paths": [ + "rust/crates/kit/src/mpp/server/subscription.rs" + ] + } + ], + "detail": "1 of 1 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "9079d38c2122f3508ba2fe4f79ed78842d2351d1", + "subject": "fix(mpp): constant-time challenge-id compare in subscription and authenticate verifiers (M3)", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/mpp/server/authenticate.rs", + "rust/crates/kit/src/mpp/server/subscription.rs" + ], + "successors": [ + { + "commit": "faab2ec8890498a0acd0e1534ab10137a180a87e", + "paths": [ + "rust/crates/kit/src/mpp/server/authenticate.rs", + "rust/crates/kit/src/mpp/server/subscription.rs" + ] + } + ], + "detail": "2 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "6eff6a4794846e320f14609c777b15742e1a5160", + "subject": "fix(x402): replay-protect, freshness-gate, and route-bind exact signature mode (H3)", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/x402/server/exact.rs" + ], + "successors": [ + { + "commit": "faab2ec8890498a0acd0e1534ab10137a180a87e", + "paths": [ + "rust/crates/kit/src/x402/server/exact.rs" + ] + } + ], + "detail": "1 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "82b69f7cb0c276d6b730e8fe32dbb95e62067721", + "subject": "fix(mpp): bind session topUp signature to a real top_up transaction (H1)", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/mpp/src/__tests__/session-server-branches.test.ts", + "typescript/packages/mpp/src/__tests__/session-server.test.ts", + "typescript/packages/mpp/src/__tests__/session-topup-verify.test.ts", + "typescript/packages/mpp/src/server/Session.ts", + "typescript/packages/mpp/src/server/session/on-chain.ts" + ], + "successors": [ + { + "commit": "820d5397d0cf54b3111692dc33082d24fe1a39d4", + "paths": [ + "typescript/packages/mpp/src/__tests__/session-server-branches.test.ts", + "typescript/packages/mpp/src/__tests__/session-server.test.ts", + "typescript/packages/mpp/src/__tests__/session-topup-verify.test.ts", + "typescript/packages/mpp/src/server/Session.ts", + "typescript/packages/mpp/src/server/session/on-chain.ts" + ] + } + ], + "detail": "5 of 5 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "820d5397d0cf54b3111692dc33082d24fe1a39d4", + "subject": "fix(mpp): bind bare push-open assertions or require explicit trusted-client opt-in (M2)", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/mpp/src/__tests__/session-server-branches.test.ts", + "typescript/packages/mpp/src/__tests__/session-topup-verify.test.ts", + "typescript/packages/mpp/src/server/Session.ts", + "typescript/packages/mpp/src/server/session/on-chain.ts" + ], + "successors": [ + { + "commit": "bbd58c7dd1cb8bfebdc19fb134da53a77d39c265", + "paths": [ + "typescript/packages/mpp/src/__tests__/session-server-branches.test.ts" + ] + }, + { + "commit": "0ca5ef51058cf3dc2416954c9128b65e0ab6c1ed", + "paths": [ + "typescript/packages/mpp/src/__tests__/session-topup-verify.test.ts" + ] + }, + { + "commit": "280cdc7fdb3f7142b61587a808edb5a9ad09073a", + "paths": [ + "typescript/packages/mpp/src/server/Session.ts", + "typescript/packages/mpp/src/server/session/on-chain.ts" + ] + } + ], + "detail": "4 of 6 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "63bb5fbf3f3b789b70c4cf031249a90b12398f94", + "subject": "fix(mpp-ruby): cap header tokens at 16 KiB before decode (M4)", + "bucket": "ruby", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "integrated", + "pr": 222, + "branch": "fix/ruby-security-hardening", + "deliveryCommit": "3435e208c0bbba23eedce0defa2926d5a1d1bf15" + } + ], + "paths": [ + "ruby/lib/pay_kit/protocols/mpp/protocol/core/headers.rb", + "ruby/test/pay_kit/protocols/mpp/core_test.rb" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "820fbcd0e2d3ed592d5c3cfb0062a91fb31a6db6", + "subject": "fix(x402-php): compare u64 amounts exactly via BigInteger (M6)", + "bucket": "php", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "php/src/Protocols/X402/Exact/Verifier.php", + "php/tests/Protocols/X402/Exact/VerifierBranchTest.php" + ], + "successors": [ + { + "commit": "b1b0015e71489e921b4b90c4df902d704deca447", + "paths": [ + "php/src/Protocols/X402/Exact/Verifier.php", + "php/tests/Protocols/X402/Exact/VerifierBranchTest.php" + ] + } + ], + "detail": "2 of 3 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "59b45e987eb104c6ec4db0c331113e05b7271f60", + "subject": "fix(x402): add in-flight and consumed dedup to the exact adapter (M1)", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/pay-kit/src/__tests__/x402-adapter.test.ts", + "typescript/packages/pay-kit/src/adapters/x402.ts" + ], + "successors": [ + { + "commit": "c4db1bf58dd0a4ab1837ea3b7cb987a2af01c5f9", + "paths": [ + "typescript/packages/pay-kit/src/__tests__/x402-adapter.test.ts", + "typescript/packages/pay-kit/src/adapters/x402.ts" + ] + } + ], + "detail": "2 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "1c4555f96f49e4f7cb891b2b2d6db1d0a51ff283", + "subject": "fix(ci): pin litesvm patch to an immutable rev and run cargo --locked (H7)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/ci.yml", + ".github/workflows/harness.yml", + ".github/workflows/report.yml" + ], + "successors": [ + { + "commit": "faab2ec8890498a0acd0e1534ab10137a180a87e", + "paths": [ + ".github/workflows/ci.yml" + ] + }, + { + "commit": "7a48b40039d05706a3fd1a4129daee695950195f", + "paths": [ + ".github/workflows/harness.yml" + ] + }, + { + "commit": "c0bf5119b4a0516cfcb500f5d2e9d3732791adec", + "paths": [ + ".github/workflows/report.yml" + ] + } + ], + "detail": "3 of 5 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "c0bf5119b4a0516cfcb500f5d2e9d3732791adec", + "subject": "fix(ci): pin the surfpool test-report action checkout to an immutable SHA (H6)", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "baseline-tree-integration-no-patch", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "paths": [ + ".github/workflows/report.yml" + ], + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "sha": "1c6f9e4dd940d3975ba6f19b289439a155eff3c5", + "subject": "fix(ci): replace curl|sh Anza installer with a pinned, checksum-verified release (H9)", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/go.yml", + ".github/workflows/python.yml" + ], + "successors": [ + { + "commit": "718beb29efde0a9886e61f06fc810c979372dc73", + "paths": [ + ".github/workflows/go.yml" + ] + }, + { + "commit": "7a48b40039d05706a3fd1a4129daee695950195f", + "paths": [ + ".github/workflows/python.yml" + ] + } + ], + "detail": "2 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "faab2ec8890498a0acd0e1534ab10137a180a87e", + "subject": "ci(rust): gate CI on cargo clippy --all-targets -D warnings", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/ci.yml", + "Justfile", + "rust/crates/kit/src/mpp/server/subscription.rs", + "rust/crates/kit/src/x402/server/exact.rs" + ], + "successors": [ + { + "commit": "7469b4f7be4447ce1913279da0e403b46e2c3353", + "paths": [ + ".github/workflows/ci.yml", + "Justfile" + ] + }, + { + "commit": "a4a1ac18552f80e0c6341856130586c28b91633e", + "paths": [ + "rust/crates/kit/src/mpp/server/subscription.rs" + ] + }, + { + "commit": "c43cdf4393d1da5cfd608dc207aafff89e91d7f4", + "paths": [ + "rust/crates/kit/src/x402/server/exact.rs" + ] + } + ], + "detail": "4 of 12 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "f54621b49df0b4db046746121ca1a7890cf97e69", + "subject": "ci: gate npm and pypi publishes on the full release aggregator (H4)", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/npm-publish.yml", + ".github/workflows/pypi-publish.yml", + ".github/workflows/release-gate.yml" + ], + "successors": [ + { + "commit": "e5a3a09fa26c3718b65f810555440deed9f16b07", + "paths": [ + ".github/workflows/npm-publish.yml", + ".github/workflows/pypi-publish.yml" + ] + }, + { + "commit": "81e0905832936bd26015a94840ffcb86a119eea9", + "paths": [ + ".github/workflows/release-gate.yml" + ] + } + ], + "detail": "3 of 3 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "7469b4f7be4447ce1913279da0e403b46e2c3353", + "subject": "ci: gate CI on a payment-channels regen diff across all generated clients (H8)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/ci.yml", + "Justfile" + ], + "successors": [ + { + "commit": "5efe1b0f4814c596a20c33ef0012162b7c916960", + "paths": [ + ".github/workflows/ci.yml", + "Justfile" + ] + } + ], + "detail": "2 of 4 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "5efe1b0f4814c596a20c33ef0012162b7c916960", + "subject": "ci(rust): widen the clippy gate to every kit feature except litesvm-tests", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/ci.yml" + ], + "successors": [ + { + "commit": "718beb29efde0a9886e61f06fc810c979372dc73", + "paths": [ + ".github/workflows/ci.yml" + ] + } + ], + "detail": "1 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "280cdc7fdb3f7142b61587a808edb5a9ad09073a", + "subject": "feat(mpp): bind session open and topUp to the on-chain Channel account state", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/mpp/src/server/Session.ts", + "typescript/packages/mpp/src/server/session/on-chain.ts" + ], + "successors": [ + { + "commit": "0ca5ef51058cf3dc2416954c9128b65e0ab6c1ed", + "paths": [ + "typescript/packages/mpp/src/server/Session.ts" + ] + }, + { + "commit": "122778d3e1fd05bc64b456cb7d33a0ad7e9d02b2", + "paths": [ + "typescript/packages/mpp/src/server/session/on-chain.ts" + ] + } + ], + "detail": "2 of 3 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "1d6a88edb65bfa878ec870fff0d5a757ace3e5a1", + "subject": "fix(mpp): bind Rust session top-up to on-chain channel state, not just the signature", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/mpp/server/session.rs" + ], + "successors": [ + { + "commit": "b76163fd1fc8955c57925703341eb0bb897920d1", + "paths": [ + "rust/crates/kit/src/mpp/server/session.rs" + ] + } + ], + "detail": "1 of 1 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "d92433a2cddd2af865fe6604d8ba3505c3db4c1c", + "subject": "fix(mpp): bind Python session top-up to on-chain channel state, not just the signature", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "python/tests/test_session_method.py" + ], + "successors": [ + { + "commit": "22e671ed770dcf94457095dc25da98eedd91091b", + "paths": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "python/tests/test_session_method.py" + ] + } + ], + "detail": "2 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "22e671ed770dcf94457095dc25da98eedd91091b", + "subject": "fix(mpp-python): normalize caip2 network slug so localnet guards recognize it", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "python/tests/test_session_method.py" + ], + "successors": [ + { + "commit": "32da13ef8efcbc1ebbec2a5cfa52c3ff4447b699", + "paths": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "python/tests/test_session_method.py" + ] + } + ], + "detail": "2 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "4fffaff21ce2037ec521ff2f9042b589910c7edb", + "subject": "fix(mpp): bind Go session open and top-up to on-chain channel account state", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "go/protocols/mpp/server/session_method.go", + "go/protocols/mpp/server/session_onchain.go" + ], + "successors": [ + { + "commit": "bfc919a52fec06e5748a4690c76af8e937e17de1", + "paths": [ + "go/protocols/mpp/server/session_method.go", + "go/protocols/mpp/server/session_onchain.go" + ] + } + ], + "detail": "2 of 4 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "a4df208987f0d6fa2f409eee870b5741e11eba2a", + "subject": "feat(mpp): make TS charge replay protection cross-process safe via an atomic reserve", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/mpp/src/server/Charge.ts", + "typescript/packages/mpp/src/server/replayReserve.ts" + ], + "successors": [ + { + "commit": "122778d3e1fd05bc64b456cb7d33a0ad7e9d02b2", + "paths": [ + "typescript/packages/mpp/src/server/Charge.ts" + ] + }, + { + "commit": "c4db1bf58dd0a4ab1837ea3b7cb987a2af01c5f9", + "paths": [ + "typescript/packages/mpp/src/server/replayReserve.ts" + ] + } + ], + "detail": "2 of 5 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "c4db1bf58dd0a4ab1837ea3b7cb987a2af01c5f9", + "subject": "feat(x402): make the exact adapter dedup cross-process via a TTL reserving store", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/pay-kit/src/__tests__/x402-adapter.test.ts", + "typescript/packages/pay-kit/src/adapters/x402.ts" + ], + "successors": [ + { + "commit": "6c146c82be9878f924b3852d82c58c0b413b43e8", + "paths": [ + "typescript/packages/pay-kit/src/__tests__/x402-adapter.test.ts", + "typescript/packages/pay-kit/src/adapters/x402.ts" + ] + } + ], + "detail": "2 of 3 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "32da13ef8efcbc1ebbec2a5cfa52c3ff4447b699", + "subject": "docs: drop internal audit finding-id tags from code comments", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py", + "python/tests/test_session_method.py" + ], + "successors": [ + { + "commit": "bfc919a52fec06e5748a4690c76af8e937e17de1", + "paths": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py" + ] + }, + { + "commit": "911a5b895ceafd7df25cd10360b5bfbb673066b9", + "paths": [ + "python/tests/test_session_method.py" + ] + } + ], + "detail": "3 of 4 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "6c146c82be9878f924b3852d82c58c0b413b43e8", + "subject": "fix(ts): keep x402 payload reservation on landed-but-unconfirmed settle failure (A2)", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/pay-kit/src/__tests__/x402-adapter.test.ts", + "typescript/packages/pay-kit/src/adapters/x402.ts" + ], + "successors": [ + { + "commit": "9a5739623939b7252c2154f126b6a6aeffd6e589", + "paths": [ + "typescript/packages/pay-kit/src/__tests__/x402-adapter.test.ts", + "typescript/packages/pay-kit/src/adapters/x402.ts" + ] + } + ], + "detail": "2 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "f32478027d66ed9ad5ec76758392ea512be712fb", + "subject": "fix(x402): cache upto challenge blockhash and drop the FastAPI double fetch (H-4)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "python/src/solana_pay_kit/protocols/x402/upto/__init__.py", + "python/tests/test_pk_x402_upto_blockhash_cache.py", + "typescript/packages/pay-kit/src/adapters/x402-upto.ts" + ], + "successors": [ + { + "commit": "fa8ce848698d14508bf6749ff06875c73a03c1a1", + "paths": [ + "python/src/solana_pay_kit/protocols/x402/upto/__init__.py" + ] + }, + { + "commit": "911a5b895ceafd7df25cd10360b5bfbb673066b9", + "paths": [ + "python/tests/test_pk_x402_upto_blockhash_cache.py" + ] + }, + { + "commit": "9a5739623939b7252c2154f126b6a6aeffd6e589", + "paths": [ + "typescript/packages/pay-kit/src/adapters/x402-upto.ts" + ] + } + ], + "detail": "3 of 4 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "122778d3e1fd05bc64b456cb7d33a0ad7e9d02b2", + "subject": "fix(mpp): strict TS activation allowlist, fee-payer index-0 pin, channel-status and tx-version guards (C-1, A3, A5)", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/mpp/src/__tests__/mpp-cosign-verify-guards.test.ts", + "typescript/packages/mpp/src/server/Subscription.ts" + ], + "successors": [ + { + "commit": "a4a1ac18552f80e0c6341856130586c28b91633e", + "paths": [ + "typescript/packages/mpp/src/__tests__/mpp-cosign-verify-guards.test.ts", + "typescript/packages/mpp/src/server/Subscription.ts" + ] + } + ], + "detail": "2 of 5 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "844576bf87b712ce8bf744da40b07e93c9cd00b1", + "subject": "fix(x402): reserve the settlement signature before confirmation in the Ruby exact server (L-1)", + "bucket": "ruby", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "ruby/lib/pay_kit/protocols/x402/server/exact.rb", + "ruby/test/pay_kit/protocols/x402/server_exact_test.rb" + ], + "successors": [ + { + "commit": "21c647ac941495950e1ff8d7a3d98f42fb8d5de6", + "paths": [ + "ruby/lib/pay_kit/protocols/x402/server/exact.rb" + ] + }, + { + "commit": "b1b0015e71489e921b4b90c4df902d704deca447", + "paths": [ + "ruby/test/pay_kit/protocols/x402/server_exact_test.rb" + ] + } + ], + "detail": "2 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "2aae94b87cc8e8d88a91de2e965982b402f36132", + "subject": "fix(mpp): escape and CR/LF-guard challenge serialization at the mppx boundary (H-3)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/mpp/src/shared/challenge-guard.ts" + ], + "successors": [ + { + "commit": "ca15d9498b5b5c04251b9b6bc57c648a176e5130", + "paths": [ + "typescript/packages/mpp/src/shared/challenge-guard.ts" + ] + } + ], + "detail": "1 of 3 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "c43cdf4393d1da5cfd608dc207aafff89e91d7f4", + "subject": "fix(x402): reserve pull-mode settlement signatures and cap payment header size (H-1, A6)", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/x402/server/exact.rs" + ], + "successors": [ + { + "commit": "b76163fd1fc8955c57925703341eb0bb897920d1", + "paths": [ + "rust/crates/kit/src/x402/server/exact.rs" + ] + } + ], + "detail": "1 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "bfc919a52fec06e5748a4690c76af8e937e17de1", + "subject": "fix(mpp): bind top-up deposits on-chain in core and fail closed on empty authorized signer (A4, M-1, L-10, L-11)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "go/protocols/mpp/server/session_onchain.go", + "go/protocols/mpp/server/session_topup_bind_test.go", + "python/src/solana_pay_kit/protocols/mpp/server/session.py", + "python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py", + "python/tests/test_session_onchain.py", + "python/tests/test_session_topup_bind.py" + ], + "successors": [ + { + "commit": "07c2dc23b2575d50cdd4eaf0a1d6b83136daa7cd", + "paths": [ + "go/protocols/mpp/server/session_onchain.go" + ] + }, + { + "commit": "51d1c4a1bd66be82db2539a7fe959078030f445d", + "paths": [ + "go/protocols/mpp/server/session_topup_bind_test.go" + ] + }, + { + "commit": "8fd892bf66ff827772c709a46905bbd77723b77a", + "paths": [ + "python/src/solana_pay_kit/protocols/mpp/server/session.py", + "python/src/solana_pay_kit/protocols/mpp/server/session_method.py" + ] + }, + { + "commit": "911a5b895ceafd7df25cd10360b5bfbb673066b9", + "paths": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py", + "python/tests/test_session_onchain.py", + "python/tests/test_session_topup_bind.py" + ] + } + ], + "detail": "7 of 10 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "9db621bbd3c5b011ee14d0444afe35acb2cd0d1a", + "subject": "chore(ts): drop stale vendored mpp tarballs and allowlist build scripts (I-2)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".gitignore", + "typescript/packages/pay-kit/src/__tests__/repo-hygiene.test.ts", + "typescript/pnpm-workspace.yaml" + ], + "successors": [ + { + "commit": "81e0905832936bd26015a94840ffcb86a119eea9", + "paths": [ + ".gitignore" + ] + }, + { + "commit": "4efd4bbb60e64f12e6b453f26826f2e9a69b744e", + "paths": [ + "typescript/packages/pay-kit/src/__tests__/repo-hygiene.test.ts" + ] + }, + { + "commit": "229e7aca92ee3809d4c6967ece599a4e5288b395", + "paths": [ + "typescript/pnpm-workspace.yaml" + ] + } + ], + "detail": "3 of 5 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "4d36b251ffac83e0adbdfb880720b7de159ccb03", + "subject": "fix(x402): gate batch-settlement serve on the in-lock committed delta (H-2)", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/x402/server/batch_settlement.rs" + ], + "successors": [ + { + "commit": "7c03fcbb1b5b71f6573c1f9b4b81e07e14755e19", + "paths": [ + "rust/crates/kit/src/x402/server/batch_settlement.rs" + ] + } + ], + "detail": "1 of 1 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "5598872343e3a20fcbaaf331671abb02a602edee", + "subject": "fix(x402): keep the replay marker on confirmation timeout and make the consumed-signature store injectable (M-2, M-3)", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "go/paykit/adapters/x402/exact.go", + "go/paykit/adapters/x402/replay_test.go" + ], + "successors": [ + { + "commit": "8c3cfa4e57d8aa3eb893772399aa476b3d3cd6f0", + "paths": [ + "go/paykit/adapters/x402/exact.go", + "go/paykit/adapters/x402/replay_test.go" + ] + } + ], + "detail": "2 of 3 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "76ee48f5af6b25208a4329fb464ebe77729ad47b", + "subject": "fix(mpp): unify the settlement-window voucher reject tag across Go and Python (M-7)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/mpp/src/__tests__/session-voucher-reject-vector.test.ts" + ], + "successors": [ + { + "commit": "7c03fcbb1b5b71f6573c1f9b4b81e07e14755e19", + "paths": [ + "typescript/packages/mpp/src/__tests__/session-voucher-reject-vector.test.ts" + ] + } + ], + "detail": "1 of 6 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "211e2e19a061293dcf888be52de9903a6be180a3", + "subject": "fix(mpp): evict idle per-channel lock entries from the in-memory session stores (I-1)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_store.py", + "python/tests/test_session_store.py" + ], + "successors": [ + { + "commit": "09b7e5f6679401301b5c8f09658ce6f241d8c5e0", + "paths": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_store.py", + "python/tests/test_session_store.py" + ] + } + ], + "detail": "2 of 6 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "b1b0015e71489e921b4b90c4df902d704deca447", + "subject": "fix(x402): canonicalize the exact fee-payer fund-mover guard and pin it with cross-SDK reject vectors (H-6, M-6, L-4)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "go/protocols/x402/verify.go", + "ruby/test/pay_kit/protocols/x402/server_exact_test.rb" + ], + "successors": [ + { + "commit": "fc6aabbfa50a5e5cfc9035c1b0586756789399f2", + "paths": [ + "go/protocols/x402/verify.go" + ] + }, + { + "commit": "5bf74896d02df5f388dcb94842b5ae80c0cbcee8", + "paths": [ + "ruby/test/pay_kit/protocols/x402/server_exact_test.rb" + ] + } + ], + "detail": "2 of 24 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "a4a1ac18552f80e0c6341856130586c28b91633e", + "subject": "fix(mpp): validate ATA create-idempotent layout in subscription activation scope (M-5)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/mpp/server/subscription.rs", + "typescript/packages/mpp/src/__tests__/subscription-activation-ata.test.ts", + "typescript/packages/mpp/src/__tests__/subscription-branches.test.ts", + "typescript/packages/mpp/src/__tests__/subscription-server.test.ts", + "typescript/packages/mpp/src/server/Subscription.ts" + ], + "successors": [ + { + "commit": "7c03fcbb1b5b71f6573c1f9b4b81e07e14755e19", + "paths": [ + "rust/crates/kit/src/mpp/server/subscription.rs", + "typescript/packages/mpp/src/__tests__/subscription-activation-ata.test.ts" + ] + }, + { + "commit": "45ad8c9acd7a71d4dd12b87321a9902c71fef865", + "paths": [ + "typescript/packages/mpp/src/__tests__/subscription-branches.test.ts" + ] + }, + { + "commit": "ca8396e0ffa46596a0c648c5c75cb38d991ad4c6", + "paths": [ + "typescript/packages/mpp/src/__tests__/subscription-server.test.ts", + "typescript/packages/mpp/src/server/Subscription.ts" + ] + } + ], + "detail": "5 of 6 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "7a48b40039d05706a3fd1a4129daee695950195f", + "subject": "fix(ci): fail harness legs on zero selected tests, gate the onchain flag, and freeze python CI installs (M-8, M-9, L-8)", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/harness.yml" + ], + "successors": [ + { + "commit": "81e0905832936bd26015a94840ffcb86a119eea9", + "paths": [ + ".github/workflows/harness.yml" + ] + } + ], + "detail": "1 of 8 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "718beb29efde0a9886e61f06fc810c979372dc73", + "subject": "fix(ci): add a per-file Go coverage floor and use frozen npm ci installs (L-5, L-7)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/ci.yml", + "go/scripts/check_coverage.sh" + ], + "successors": [ + { + "commit": "46baeaab6e0feab17fe254d5c7b69d38d428a2df", + "paths": [ + ".github/workflows/ci.yml" + ] + }, + { + "commit": "7abc0263882c7115f2342babd51e6a1bdbd25a5a", + "paths": [ + "go/scripts/check_coverage.sh" + ] + } + ], + "detail": "2 of 4 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "e5a3a09fa26c3718b65f810555440deed9f16b07", + "subject": "fix(ci): least-privilege publish permissions and gate releases on publish success (L-6, L-9)", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "scripts/check-publish-workflow-guards.sh", + "scripts/check-publish-workflow-guards_test.sh" + ], + "successors": [ + { + "commit": "cef5c87d5a512a6faa26d5cd36aa1fd33b17a6ca", + "paths": [ + "scripts/check-publish-workflow-guards.sh", + "scripts/check-publish-workflow-guards_test.sh" + ] + } + ], + "detail": "2 of 4 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "e4b27af3286cde7045f438835980065f2d51a823", + "subject": "fix(harness): cap header and body reads in the hand-rolled test servers (L-3)", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "harness/python-server/test_harness_adapter.py" + ], + "successors": [ + { + "commit": "7b109e5c4c2f9dd956e7f51997acbd0d349d9317", + "paths": [ + "harness/python-server/test_harness_adapter.py" + ] + } + ], + "detail": "1 of 4 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "7b109e5c4c2f9dd956e7f51997acbd0d349d9317", + "subject": "test(harness): provide a >=32-byte MPP secret in the python 402 adapter fixture", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b" + } + ], + "paths": [ + "harness/python-server/test_harness_adapter.py" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "21c647ac941495950e1ff8d7a3d98f42fb8d5de6", + "subject": "chore(ruby): strip audit finding IDs from a shipped source comment", + "bucket": "ruby", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "ruby/lib/pay_kit/protocols/x402/server/exact.rb" + ], + "successors": [ + { + "commit": "5bf74896d02df5f388dcb94842b5ae80c0cbcee8", + "paths": [ + "ruby/lib/pay_kit/protocols/x402/server/exact.rb" + ] + } + ], + "detail": "1 of 1 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "229e7aca92ee3809d4c6967ece599a4e5288b395", + "subject": "fix(ts): enforce pnpm dependency overrides from pnpm-workspace.yaml", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "baseline-tree-integration-no-patch", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "paths": [ + "typescript/package.json", + "typescript/pnpm-workspace.yaml" + ], + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "sha": "7c03fcbb1b5b71f6573c1f9b4b81e07e14755e19", + "subject": "style: apply prettier and rustfmt to fix-batch files", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/mpp/server/subscription.rs", + "rust/crates/kit/src/x402/server/batch_settlement.rs" + ], + "successors": [ + { + "commit": "63c926f29899326f9d8bfcc0dadce763e4ec7bf7", + "paths": [ + "rust/crates/kit/src/mpp/server/subscription.rs" + ] + }, + { + "commit": "1ed6204ab0040631fa4ecfeef32a9c1ceef4e8e9", + "paths": [ + "rust/crates/kit/src/x402/server/batch_settlement.rs" + ] + } + ], + "detail": "2 of 5 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "46baeaab6e0feab17fe254d5c7b69d38d428a2df", + "subject": "ci: guard against audit-ID leaks and pnpm-field-ignored overrides", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/ci.yml", + "scripts/check-repo-hygiene.sh", + "scripts/check-repo-hygiene_test.sh" + ], + "successors": [ + { + "commit": "81e0905832936bd26015a94840ffcb86a119eea9", + "paths": [ + ".github/workflows/ci.yml" + ] + }, + { + "commit": "671985d256f5666f166029889ae01c1533a6e8a6", + "paths": [ + "scripts/check-repo-hygiene.sh", + "scripts/check-repo-hygiene_test.sh" + ] + } + ], + "detail": "3 of 3 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "911a5b895ceafd7df25cd10360b5bfbb673066b9", + "subject": "fix(python): conform session test RPC fakes and config to the on-chain verifier protocols", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py", + "python/tests/test_pk_x402_upto_blockhash_cache.py", + "python/tests/test_session_method.py", + "python/tests/test_session_topup_bind.py" + ], + "successors": [ + { + "commit": "07c2dc23b2575d50cdd4eaf0a1d6b83136daa7cd", + "paths": [ + "python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py" + ] + }, + { + "commit": "fa8ce848698d14508bf6749ff06875c73a03c1a1", + "paths": [ + "python/tests/test_pk_x402_upto_blockhash_cache.py" + ] + }, + { + "commit": "8fd892bf66ff827772c709a46905bbd77723b77a", + "paths": [ + "python/tests/test_session_method.py", + "python/tests/test_session_topup_bind.py" + ] + } + ], + "detail": "4 of 6 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "5bf74896d02df5f388dcb94842b5ae80c0cbcee8", + "subject": "fix(x402): teach the default confirmer to prove never-landed and release the settlement reservation", + "bucket": "ruby", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b" + } + ], + "paths": [ + "ruby/lib/pay_kit/protocols/x402/server/exact.rb", + "ruby/test/pay_kit/protocols/x402/server_exact_test.rb" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "8c3cfa4e57d8aa3eb893772399aa476b3d3cd6f0", + "subject": "fix(go): release provably-not-landed reservations, report replay-store outages distinctly, and pin cosign to the fee-payer slot", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "go/paykit/adapters/x402/exact.go" + ], + "successors": [ + { + "commit": "201e8fdb7f6e176312f83ba4a877dc4b4eb8b026", + "paths": [ + "go/paykit/adapters/x402/exact.go" + ] + } + ], + "detail": "1 of 3 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "671985d256f5666f166029889ae01c1533a6e8a6", + "subject": "fix(ci): scan every package.json for stranded pnpm fields, widen the finding-id guard, and make its self-test drive the real script", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052" + }, + { + "status": "open_pr", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b" + } + ], + "paths": [ + "harness/package.json", + "harness/pnpm-lock.yaml", + "harness/pnpm-workspace.yaml", + "playground/package.json", + "playground/pnpm-lock.yaml", + "playground/pnpm-workspace.yaml", + "scripts/check-repo-hygiene.sh", + "scripts/check-repo-hygiene_test.sh" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "cef5c87d5a512a6faa26d5cd36aa1fd33b17a6ca", + "subject": "fix(ci): reject scalar write-all permissions in the publish workflow guard", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052" + } + ], + "paths": [ + "scripts/check-publish-workflow-guards.sh", + "scripts/check-publish-workflow-guards_test.sh" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "63c926f29899326f9d8bfcc0dadce763e4ec7bf7", + "subject": "fix(mpp): record and enforce an activation replay marker in the subscription server", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/mpp/server/subscription.rs" + ], + "successors": [ + { + "commit": "b76163fd1fc8955c57925703341eb0bb897920d1", + "paths": [ + "rust/crates/kit/src/mpp/server/subscription.rs" + ] + } + ], + "detail": "1 of 1 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "da5663cd8bfdd802f4e3cafdb0742e3724344722", + "subject": "refactor(go): route open-instruction ATA derivations through the golden-tested helper", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02" + } + ], + "paths": [ + "go/paycore/paymentchannels/paymentchannels.go", + "go/paycore/paymentchannels/paymentchannels_test.go" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "7abc0263882c7115f2342babd51e6a1bdbd25a5a", + "subject": "docs(go): correct the per-file coverage floor comment to match the actual defaults", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02" + } + ], + "paths": [ + "go/scripts/check_coverage.sh" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "81e0905832936bd26015a94840ffcb86a119eea9", + "subject": "ci: extend run-count gating to every release leg and wire the orphaned conformance, io-cap, and guard suites", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + ".github/workflows/ci.yml", + ".github/workflows/harness.yml" + ], + "successors": [ + { + "commit": "b76163fd1fc8955c57925703341eb0bb897920d1", + "paths": [ + ".github/workflows/ci.yml" + ] + }, + { + "commit": "68d6673f2936b09d41253a8e4dd7b8f66052d12d", + "paths": [ + ".github/workflows/harness.yml" + ] + } + ], + "detail": "2 of 9 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "9a5739623939b7252c2154f126b6a6aeffd6e589", + "subject": "fix(pay-kit): cap payment header size, cache exact-adapter challenge blockhash, and release reservations on pre-broadcast failure", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/pay-kit/src/__tests__/x402-adapter.test.ts", + "typescript/packages/pay-kit/src/adapters/x402.ts" + ], + "successors": [ + { + "commit": "201e8fdb7f6e176312f83ba4a877dc4b4eb8b026", + "paths": [ + "typescript/packages/pay-kit/src/__tests__/x402-adapter.test.ts", + "typescript/packages/pay-kit/src/adapters/x402.ts" + ] + } + ], + "detail": "2 of 5 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "b76163fd1fc8955c57925703341eb0bb897920d1", + "subject": "ci: green the branch's own hygiene and rust x402 gates", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/mpp/server/subscription.rs", + "rust/crates/kit/src/x402/server/exact.rs" + ], + "successors": [ + { + "commit": "30c008575f1887c9d1dacbf50d3d4748fed807f6", + "paths": [ + "rust/crates/kit/src/mpp/server/subscription.rs" + ] + }, + { + "commit": "7447faa134363cc7160190bd2e15e43bfc562d82", + "paths": [ + "rust/crates/kit/src/x402/server/exact.rs" + ] + } + ], + "detail": "2 of 4 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "f56e8eaf116a5723047467e75c451c5de262d918", + "subject": "ci: declare packageManager in the codegen package so the regen gate's pnpm setup resolves", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "baseline-tree-integration-no-patch", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "paths": [ + "skills/pay-sdk-implementation/codegen/package.json" + ], + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "sha": "7447faa134363cc7160190bd2e15e43bfc562d82", + "subject": "fix(x402): yield with tokio sleep in the async pull-settlement confirm loop", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "rust/crates/kit/src/x402/server/exact.rs" + ], + "successors": [ + { + "commit": "201e8fdb7f6e176312f83ba4a877dc4b4eb8b026", + "paths": [ + "rust/crates/kit/src/x402/server/exact.rs" + ] + } + ], + "detail": "1 of 1 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "a420d6f76017fac1ac3c3be1db70e0b85f46e809", + "subject": "fix(harness): sync the go-server module after dropping the solana-go fork replace", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02" + } + ], + "paths": [ + "harness/go-server/go.mod", + "harness/go-server/go.sum" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "07c2dc23b2575d50cdd4eaf0a1d6b83136daa7cd", + "subject": "refactor(mpp): extract the shared channel fetch-and-validate step in the go and python on-chain binders", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02" + }, + { + "status": "superseded", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "686c03d3334d0b9d95a0d98cf8234711de350501" + } + ], + "paths": [ + "go/protocols/mpp/server/session_onchain.go", + "python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "68d6673f2936b09d41253a8e4dd7b8f66052d12d", + "subject": "fix(harness): repair PHP x402 replay store, python x402 client env, and IO-cap plugin autoload", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052" + }, + { + "status": "open_pr", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b" + }, + { + "status": "superseded", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02" + } + ], + "paths": [ + ".github/workflows/harness.yml", + "harness/php-server/server.php", + "harness/src/implementations.ts" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "30c008575f1887c9d1dacbf50d3d4748fed807f6", + "subject": "fix(mpp): make the subscription activation replay guard atomic with put_if_absent", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "a8690fea64712a237ef6d1c8c94f0f26021f6882" + } + ], + "paths": [ + "rust/crates/kit/src/mpp/server/subscription.rs" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "85ad6073eb63508d307da7fd9b85d0d4fc20e560", + "subject": "fix(harness): sync the go-client module off the solana-go fork", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "harness/go-client/go.mod" + ], + "successors": [ + { + "commit": "522966c41e6c23d7c45d3fca6b146a4a20593ed4", + "paths": [ + "harness/go-client/go.mod" + ] + } + ], + "detail": "1 of 1 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "522966c41e6c23d7c45d3fca6b146a4a20593ed4", + "subject": "fix(harness): drop the solana-go fork replace from go-client", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02" + } + ], + "paths": [ + "harness/go-client/go.mod", + "harness/go-client/go.sum" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "201e8fdb7f6e176312f83ba4a877dc4b4eb8b026", + "subject": "fix(x402): unify the exact consumed-signature key prefix across all SDKs", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/pay-kit/src/adapters/x402.ts" + ], + "successors": [ + { + "commit": "ef6e97769668f86062ba5e6c55fd6bfea63274e1", + "paths": [ + "typescript/packages/pay-kit/src/adapters/x402.ts" + ] + } + ], + "detail": "1 of 4 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "ca8396e0ffa46596a0c648c5c75cb38d991ad4c6", + "subject": "fix(mpp): make the TypeScript subscription activation replay guard atomic (claimConsumed)", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "source-history-supersession", + "changedLater": [ + "typescript/packages/mpp/src/__tests__/subscription-server.test.ts", + "typescript/packages/mpp/src/server/Subscription.ts" + ], + "successors": [ + { + "commit": "36d493f05ccb34ced2cbb06008d1d21dfb1d7c4c", + "paths": [ + "typescript/packages/mpp/src/__tests__/subscription-server.test.ts", + "typescript/packages/mpp/src/server/Subscription.ts" + ] + } + ], + "detail": "2 of 2 touched tree states were changed by exact later source commits; the original commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "0eee56c1d5135c1763b45a8a09195f16ba89d1c4", + "subject": "fix(ruby): bump json past CVE-2026-54696", + "bucket": "ruby", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-reimplementation", + "deliveries": [ + { + "status": "superseded", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b" + } + ], + "paths": [ + "ruby/Gemfile.lock", + "ruby/solana-pay-kit.gemspec" + ], + "detail": "All surviving source-tip path states are accounted for by exact or replacement delivery refs, but no stable patch-ID equivalent exists; the source commit is superseded by squashed or rewritten delivery commits." + } + ] + }, + { + "sha": "bab3fe12fb4f83d2eefe46de70cdbd96a76af30b", + "subject": "test(mpp): pin pre-broadcast vs on-chain charge policy parity (L5)", + "bucket": "typescript", + "status": "obsolete_test_only", + "evidence": [ + { + "kind": "obsolete-source-test-state", + "changedLater": [ + "typescript/packages/mpp/src/__tests__/charge.test.ts" + ], + "successors": [ + { + "commit": "29fba4396051b46f62f5208d328ab8dd0e9ff62e", + "paths": [ + "typescript/packages/mpp/src/__tests__/charge.test.ts" + ] + } + ], + "detail": "1 of 1 touched tree states were changed by exact later source commits; the original test-only commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + }, + { + "sha": "bbd58c7dd1cb8bfebdc19fb134da53a77d39c265", + "subject": "test(ts): make the workspace typecheck green over test files", + "bucket": "typescript", + "status": "obsolete_test_only", + "evidence": [ + { + "kind": "obsolete-source-test-state", + "changedLater": [ + "typescript/packages/mpp/src/__tests__/charge.test.ts", + "typescript/packages/mpp/src/__tests__/subscription-branches.test.ts" + ], + "successors": [ + { + "commit": "32da13ef8efcbc1ebbec2a5cfa52c3ff4447b699", + "paths": [ + "typescript/packages/mpp/src/__tests__/charge.test.ts" + ] + }, + { + "commit": "a4a1ac18552f80e0c6341856130586c28b91633e", + "paths": [ + "typescript/packages/mpp/src/__tests__/subscription-branches.test.ts" + ] + } + ], + "detail": "2 of 7 touched tree states were changed by exact later source commits; the original test-only commit state is superseded and has no stable patch-ID equivalent in the delivery refs." + } + ] + } + ], + "paths": [ + { + "path": ".github/actions/setup-harness-leg/action.yml", + "bucket": "harness-ci", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "4d2427fb49389c07d455d5d2ffa87d29deb3ac5c", + "deliveryBlob": "4d2427fb49389c07d455d5d2ffa87d29deb3ac5c", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/actions/setup-harness-leg/action.yml", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:.github/actions/setup-harness-leg/action.yml", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "4d2427fb49389c07d455d5d2ffa87d29deb3ac5c", + "deliveryBlob": "4d2427fb49389c07d455d5d2ffa87d29deb3ac5c", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/actions/setup-harness-leg/action.yml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:.github/actions/setup-harness-leg/action.yml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": ".github/actions/setup-harness/action.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "478fdb5e86d36093e812a141153265bda3c82ee4", + "deliveryState": "c80aed407b79ebf0a4b02fc36f11509e450492bf", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/actions/setup-harness/action.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/actions/setup-harness/action.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052", + "sourceState": "478fdb5e86d36093e812a141153265bda3c82ee4", + "deliveryState": "c80aed407b79ebf0a4b02fc36f11509e450492bf", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/actions/setup-harness/action.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/actions/setup-harness/action.yml", + "detail": "Current PR #233 branch fix/harness-adversarial-hardening at exact head 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; the source state remains superseded." + } + ] + }, + { + "path": ".github/dependabot.yml", + "bucket": "harness-ci", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "3d8068e3ee1acb864ab1220779b57536ddfdd41d", + "deliveryBlob": "3d8068e3ee1acb864ab1220779b57536ddfdd41d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/dependabot.yml", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:.github/dependabot.yml", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "3d8068e3ee1acb864ab1220779b57536ddfdd41d", + "deliveryBlob": "3d8068e3ee1acb864ab1220779b57536ddfdd41d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/dependabot.yml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:.github/dependabot.yml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": ".github/workflows/android-demo.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "4315bd0eaca223bca234006c2a80a07b5550c1ca", + "deliveryState": "f428c9ea0acc537665034eb1bccc468e53356ce6", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/android-demo.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/android-demo.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "4315bd0eaca223bca234006c2a80a07b5550c1ca", + "deliveryState": "f428c9ea0acc537665034eb1bccc468e53356ce6", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/android-demo.yml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:.github/workflows/android-demo.yml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": ".github/workflows/ci.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "92e35829f8b341edd47b5951e5ea4543f895ec60", + "deliveryState": "81997c28507515cd83de6d8c86a01af34c428f96", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/ci.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/ci.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "a8690fea64712a237ef6d1c8c94f0f26021f6882", + "sourceState": "92e35829f8b341edd47b5951e5ea4543f895ec60", + "deliveryState": "bde790bc648ce14f215e152c870157b6d2e68865", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/ci.yml", + "deliveryRef": "a8690fea64712a237ef6d1c8c94f0f26021f6882:.github/workflows/ci.yml", + "detail": "PR #227 (fix/rust-security-hardening) changes this path, but exact head a8690fea64712a237ef6d1c8c94f0f26021f6882 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": ".github/workflows/go-consumer.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "5b3daee19884283a2c8f5b0e781af4d4894739fa", + "deliveryState": "561aa10dd80a9d8c6a82df46183c97df80996db1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/go-consumer.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/go-consumer.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "5b3daee19884283a2c8f5b0e781af4d4894739fa", + "deliveryState": "07421d00b00fa54754e6d288d7090edc374e62da", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/go-consumer.yml", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:.github/workflows/go-consumer.yml", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": ".github/workflows/go.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "5323bc4b97221e3872f766c701d44783a9425c82", + "deliveryState": "12b771461ccda44185a7ee9da939dd44c8cc7697", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/go.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/go.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "5323bc4b97221e3872f766c701d44783a9425c82", + "deliveryState": "5f607a9827a32f14eb1d338ba527a531f44a5de9", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/go.yml", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:.github/workflows/go.yml", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": ".github/workflows/harness.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "5fe77b71108cfb667efa0c64a195aaad21758f75", + "deliveryState": "93f6dd39fe5e9288bc585fe8a0d2fcfd3c0511b8", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/harness.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/harness.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052", + "sourceState": "5fe77b71108cfb667efa0c64a195aaad21758f75", + "deliveryState": "93f6dd39fe5e9288bc585fe8a0d2fcfd3c0511b8", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/harness.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/harness.yml", + "detail": "Current PR #233 branch fix/harness-adversarial-hardening at exact head 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; the source state remains superseded." + } + ] + }, + { + "path": ".github/workflows/ios-demo.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "1ad057c3dc1ba273d6388d3e883e05ba4e8f2d9b", + "deliveryState": "0dd7ed31c3a6f48632977df9ad476c6c8cad131c", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/ios-demo.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/ios-demo.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "1ad057c3dc1ba273d6388d3e883e05ba4e8f2d9b", + "deliveryState": "0dd7ed31c3a6f48632977df9ad476c6c8cad131c", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/ios-demo.yml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:.github/workflows/ios-demo.yml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": ".github/workflows/kotlin.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "39353eea59882af78cdc7cb792d7d12d0f4bd136", + "deliveryState": "a0eecf17d36bff8d8368e53157fba91c45bade12", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/kotlin.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/kotlin.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "39353eea59882af78cdc7cb792d7d12d0f4bd136", + "deliveryState": "a0eecf17d36bff8d8368e53157fba91c45bade12", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/kotlin.yml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:.github/workflows/kotlin.yml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": ".github/workflows/lua.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "83863c73ef670c3fc57b059912b0a4d0eeb85dec", + "deliveryState": "146401f648eaf9e1ca7798713e34e3ea3015bd80", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/lua.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/lua.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "83863c73ef670c3fc57b059912b0a4d0eeb85dec", + "deliveryState": "146401f648eaf9e1ca7798713e34e3ea3015bd80", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/lua.yml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:.github/workflows/lua.yml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": ".github/workflows/npm-publish.yml", + "bucket": "harness-ci", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "0d287637e0915c1fd380c158f286639c3f5b3e9f", + "deliveryBlob": "0d287637e0915c1fd380c158f286639c3f5b3e9f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/npm-publish.yml", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:.github/workflows/npm-publish.yml", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "0d287637e0915c1fd380c158f286639c3f5b3e9f", + "deliveryBlob": "0d287637e0915c1fd380c158f286639c3f5b3e9f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/npm-publish.yml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:.github/workflows/npm-publish.yml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": ".github/workflows/php.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "b2034f38359bd536faa9a485dd32d5b4f978c894", + "deliveryState": "39e300bc96e855e5f17d65c08a310e1bed9265db", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/php.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/php.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "b2034f38359bd536faa9a485dd32d5b4f978c894", + "deliveryState": "39e300bc96e855e5f17d65c08a310e1bed9265db", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/php.yml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:.github/workflows/php.yml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": ".github/workflows/pypi-publish.yml", + "bucket": "harness-ci", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "47471237a0a32dbfbbef3956a15899c2c19a2743", + "deliveryBlob": "47471237a0a32dbfbbef3956a15899c2c19a2743", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/pypi-publish.yml", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:.github/workflows/pypi-publish.yml", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "47471237a0a32dbfbbef3956a15899c2c19a2743", + "deliveryBlob": "47471237a0a32dbfbbef3956a15899c2c19a2743", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/pypi-publish.yml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:.github/workflows/pypi-publish.yml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": ".github/workflows/python.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "1056860121171b2068d658ee4e35e8aa4229d5cc", + "deliveryState": "998166245b4728bb662fd3d109c94c81bff98e76", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/python.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/python.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "686c03d3334d0b9d95a0d98cf8234711de350501", + "sourceState": "1056860121171b2068d658ee4e35e8aa4229d5cc", + "deliveryState": "f257a47556d0e1ee74fab8f423bfb39a86d919ca", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/python.yml", + "deliveryRef": "686c03d3334d0b9d95a0d98cf8234711de350501:.github/workflows/python.yml", + "detail": "PR #228 (fix/python-security-hardening) changes this path, but exact head 686c03d3334d0b9d95a0d98cf8234711de350501 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": ".github/workflows/release-gate.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "0d3cdfc621d7033ce8b0a7b898176300b9d9347e", + "deliveryState": "661321eaec8fe20e53ca2df1641e01777c97b0dc", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/release-gate.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/release-gate.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052", + "sourceState": "0d3cdfc621d7033ce8b0a7b898176300b9d9347e", + "deliveryState": "661321eaec8fe20e53ca2df1641e01777c97b0dc", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/release-gate.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/release-gate.yml", + "detail": "Current PR #233 branch fix/harness-adversarial-hardening at exact head 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; the source state remains superseded." + } + ] + }, + { + "path": ".github/workflows/report.yml", + "bucket": "harness-ci", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "9d847c4bc4e12cb345c98997555003bca239b27e", + "deliveryBlob": "9d847c4bc4e12cb345c98997555003bca239b27e", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/report.yml", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:.github/workflows/report.yml", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "9d847c4bc4e12cb345c98997555003bca239b27e", + "deliveryBlob": "9d847c4bc4e12cb345c98997555003bca239b27e", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/report.yml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:.github/workflows/report.yml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": ".github/workflows/ruby.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "5e68f760442321472ff6a21601c8608014d3e203", + "deliveryState": "f5baf84c668ed07c19cf668ccdb19934c08f6d41", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/ruby.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/ruby.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "5e68f760442321472ff6a21601c8608014d3e203", + "deliveryState": "f5baf84c668ed07c19cf668ccdb19934c08f6d41", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/ruby.yml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:.github/workflows/ruby.yml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": ".github/workflows/swift.yml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "30b092cabdcc3e30a7d7e093afabd4df70c313e9", + "deliveryState": "44ae7d364bc344be767cf6acd71c055eb6d93db1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/swift.yml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:.github/workflows/swift.yml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 231, + "branch": "fix/swift-conformance-hardening", + "deliveryCommit": "9ac7315a015af426698b885446222fe223957906", + "sourceState": "30b092cabdcc3e30a7d7e093afabd4df70c313e9", + "deliveryState": "672061a5acf7786a3b774bf67fcac3be08c43495", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.github/workflows/swift.yml", + "deliveryRef": "9ac7315a015af426698b885446222fe223957906:.github/workflows/swift.yml", + "detail": "PR #231 (fix/swift-conformance-hardening) changes this path, but exact head 9ac7315a015af426698b885446222fe223957906 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": ".gitignore", + "bucket": "cross-sdk", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "dae3eb892e4e58ecc7add70c5a407bdec5d46870", + "deliveryBlob": "dae3eb892e4e58ecc7add70c5a407bdec5d46870", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.gitignore", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:.gitignore", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "dae3eb892e4e58ecc7add70c5a407bdec5d46870", + "deliveryBlob": "dae3eb892e4e58ecc7add70c5a407bdec5d46870", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:.gitignore", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:.gitignore", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "Justfile", + "bucket": "cross-sdk", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "67fa41c22840efaa3a2ba7790b6e7946980711ea", + "deliveryState": "dfda31e980565ce3898f2eb3e50e183d91a72e07", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:Justfile", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:Justfile", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "67fa41c22840efaa3a2ba7790b6e7946980711ea", + "deliveryState": "dfda31e980565ce3898f2eb3e50e183d91a72e07", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:Justfile", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:Justfile", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "SECURITY.md", + "bucket": "cross-sdk", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "cb96142e236fbe9326d829f1e93ef61975264d29", + "deliveryBlob": "cb96142e236fbe9326d829f1e93ef61975264d29", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:SECURITY.md", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:SECURITY.md", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "cb96142e236fbe9326d829f1e93ef61975264d29", + "deliveryBlob": "cb96142e236fbe9326d829f1e93ef61975264d29", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:SECURITY.md", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:SECURITY.md", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "go/cmd/conformance/main.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "cb3352882087bb5dcf99d2e99fcf46e71e23823e", + "deliveryState": "5843e93cec02d2b76e21f90652ecfbda8ff7cba1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/cmd/conformance/main.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/cmd/conformance/main.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "cb3352882087bb5dcf99d2e99fcf46e71e23823e", + "deliveryState": "6af4e0b6dc38dbd8fa3df6d2e8d3b6860acf0dd6", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/cmd/conformance/main.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/cmd/conformance/main.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/cmd/conformance/x402.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "3ae450b3e3793d8db38247ed8461f8b445df8980", + "deliveryState": "0f15df45c37b2a1bbcdc837e90b6b4cdb6e89f81", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/cmd/conformance/x402.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/cmd/conformance/x402.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "3ae450b3e3793d8db38247ed8461f8b445df8980", + "deliveryState": "df91e240674751e48ca7b3544b51f5259988b252", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/cmd/conformance/x402.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/cmd/conformance/x402.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/go.mod", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "6737f01810efeef07e99cbd34981da9eb9cc1e70", + "deliveryState": "9a745f8708f282475bd07b5a9332ede04e943adf", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/go.mod", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/go.mod", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "6737f01810efeef07e99cbd34981da9eb9cc1e70", + "deliveryState": "bb2f3ebbf5ec7f025ae201d8afb0e62a3a2d92ea", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/go.mod", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/go.mod", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/go.sum", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "60c9181dfc575569769dc671a03f4ca0eef3130d", + "deliveryState": "856f3f90df4ca8f1661ccb3a0a2b3464eeaadca1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/go.sum", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/go.sum", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "60c9181dfc575569769dc671a03f4ca0eef3130d", + "deliveryState": "0259a86bb7c50f3600e06cfcc03cf1066a2dbac1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/go.sum", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/go.sum", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/internal/testutil/fakes.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "60a397795b18d725b74a8a44a0bdb5a8332c7b6b", + "deliveryState": "27b3a3f6d0679e67d5026bfc7372fdfd38a6cd96", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/internal/testutil/fakes.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/internal/testutil/fakes.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "60a397795b18d725b74a8a44a0bdb5a8332c7b6b", + "deliveryState": "f7a1d1fb4051108851216aec96c452099e945860", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/internal/testutil/fakes.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/internal/testutil/fakes.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/paycore/paymentchannels/paymentchannels.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "bbb72bd458e09ec15a301ec9279b2143ec3f94e7", + "deliveryState": "d8a3c0c103b5bc08dce989f0857cbaade65b640d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/paycore/paymentchannels/paymentchannels.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/paycore/paymentchannels/paymentchannels.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "bbb72bd458e09ec15a301ec9279b2143ec3f94e7", + "deliveryState": "2f3b277e02a831076207751fbc7dc84d5b2bf709", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/paycore/paymentchannels/paymentchannels.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/paycore/paymentchannels/paymentchannels.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/paycore/paymentchannels/paymentchannels_test.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "ada5f5b66622939698bb0e3c7b3ee5e59dd60f77", + "deliveryState": "5cdc9ff7f0b25bf5e35deea41c9eac835a45e4b2", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/paycore/paymentchannels/paymentchannels_test.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/paycore/paymentchannels/paymentchannels_test.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "ada5f5b66622939698bb0e3c7b3ee5e59dd60f77", + "deliveryState": "f15edb88ea58452e0c0873bee5dce20b752cd137", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/paycore/paymentchannels/paymentchannels_test.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/paycore/paymentchannels/paymentchannels_test.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/paycore/paymentchannels/settlement.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "f1a9099c0e7fb468997ee7238264cff735cd98ac", + "deliveryState": "5a3d4aced766aa58fbad0048f34b74ea8f723c73", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/paycore/paymentchannels/settlement.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/paycore/paymentchannels/settlement.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "f1a9099c0e7fb468997ee7238264cff735cd98ac", + "deliveryState": "19840652c6bd4520b8339c606a4f2e1eac8d670f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/paycore/paymentchannels/settlement.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/paycore/paymentchannels/settlement.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/paycore/solanatx/ata_golden_test.go", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source path go/paycore/solanatx/ata_golden_test.go is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "go/paykit/adapters/x402/binding_test.go", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source path go/paykit/adapters/x402/binding_test.go is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "go/paykit/adapters/x402/exact.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "df3a820c428d971e2184ef4c74ec1e5ce9d05cdd", + "deliveryState": "f0659c80712ff5873a139c3c2949c499e1556bbd", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/paykit/adapters/x402/exact.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/paykit/adapters/x402/exact.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "df3a820c428d971e2184ef4c74ec1e5ce9d05cdd", + "deliveryState": "3fcc993b0fe01c05f989012018f03c7cd3a1f3fc", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/paykit/adapters/x402/exact.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/paykit/adapters/x402/exact.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/paykit/adapters/x402/replay_test.go", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source path go/paykit/adapters/x402/replay_test.go is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "go/paykit/types.go", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source path go/paykit/types.go is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "go/protocols/mpp/server/server_replay_durability_test.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "a9aa67ad1cf92062e7b003caad76e7e6d1594f09", + "deliveryState": "f2b999384cacc7395356ebe45f5e4c73823239c2", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/server_replay_durability_test.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/protocols/mpp/server/server_replay_durability_test.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "a9aa67ad1cf92062e7b003caad76e7e6d1594f09", + "deliveryState": "87429ecff3d134f3524fcec55521e1fbe7d5fbad", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/server_replay_durability_test.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/protocols/mpp/server/server_replay_durability_test.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/protocols/mpp/server/session.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "4e6ca9e8cbd9f08479cf1942f890c7465072ce46", + "deliveryState": "7b70f1f12d5f5ee098034d20294d267ffe3e0cac", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/protocols/mpp/server/session.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "4e6ca9e8cbd9f08479cf1942f890c7465072ce46", + "deliveryState": "a220beeaa07f889cfdebb912a4d811986ad128ff", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/protocols/mpp/server/session.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/protocols/mpp/server/session_method.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "c62dbad0c50b93c854eb3af9f3dc26a00e1545e2", + "deliveryState": "21eca165efd2cfb66fbf1902ba374aaedb08d117", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_method.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/protocols/mpp/server/session_method.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "c62dbad0c50b93c854eb3af9f3dc26a00e1545e2", + "deliveryState": "08112110f6b0eaf83be2c8a66b417ff08372093a", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_method.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/protocols/mpp/server/session_method.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/protocols/mpp/server/session_method_test.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "1f450f52158831e8f82682f070df7cd1f81e3a6c", + "deliveryState": "3da0a4ce671742f387df19a9aca9a4836dca9a32", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_method_test.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/protocols/mpp/server/session_method_test.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "1f450f52158831e8f82682f070df7cd1f81e3a6c", + "deliveryState": "ae89f8a0d5e7d6586fa17ec6cad725e0f0473c25", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_method_test.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/protocols/mpp/server/session_method_test.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/protocols/mpp/server/session_onchain.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "c3f421bca4ab1e5caf165778127c15a3ec523e1e", + "deliveryState": "cfb9395a7bb6cb660e374ff151ab643c8c415f93", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_onchain.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/protocols/mpp/server/session_onchain.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "c3f421bca4ab1e5caf165778127c15a3ec523e1e", + "deliveryState": "d87efa9a78e24a9ca268c73d43310b5f1d8d46f6", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_onchain.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/protocols/mpp/server/session_onchain.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/protocols/mpp/server/session_onchain_test.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "434efccefb211924e6edea2ff9532573a7752472", + "deliveryState": "18beeab3ed2b92072b14bb07200cf097cdec281d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_onchain_test.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/protocols/mpp/server/session_onchain_test.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "434efccefb211924e6edea2ff9532573a7752472", + "deliveryState": "13021fc7c883f6507610d37ccc475876729cb687", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_onchain_test.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/protocols/mpp/server/session_onchain_test.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/protocols/mpp/server/session_store.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "2e38aa0cb77800e3ea56b4462b633d87fe63a8a4", + "deliveryState": "9acbb03dc06359269296a11f4392195a0263def1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_store.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/protocols/mpp/server/session_store.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "2e38aa0cb77800e3ea56b4462b633d87fe63a8a4", + "deliveryState": "aed6b2321ee816560901c9119ec6cbee0a7c0aae", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_store.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/protocols/mpp/server/session_store.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/protocols/mpp/server/session_store_test.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "25a3e80bdf71d555b4144a44babac4dbe7784d97", + "deliveryState": "233ed538c72c23a4b3ae997e30a01d2d0872dfc4", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_store_test.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/protocols/mpp/server/session_store_test.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "25a3e80bdf71d555b4144a44babac4dbe7784d97", + "deliveryState": "9b4aa0946ac64e463190c0d5d8b175674fd1db59", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_store_test.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/protocols/mpp/server/session_store_test.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/protocols/mpp/server/session_topup_bind_test.go", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source path go/protocols/mpp/server/session_topup_bind_test.go is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "go/protocols/mpp/server/session_voucher.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "897508caf85eaa9265fabefff86f185e4d6d1be5", + "deliveryState": "6d4c6dbfe494b7fdaa36fb2f75a2bba98b8cba4e", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_voucher.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/protocols/mpp/server/session_voucher.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "897508caf85eaa9265fabefff86f185e4d6d1be5", + "deliveryState": "d8a32718201dce3b29c2ba28624f3a73e327a0b1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/mpp/server/session_voucher.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/protocols/mpp/server/session_voucher.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/protocols/mpp/server/session_voucher_reject_vector_test.go", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source path go/protocols/mpp/server/session_voucher_reject_vector_test.go is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "go/protocols/x402/verify.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "8582d5006e622567e176124abcb6fc9e68260a14", + "deliveryState": "24d26a1087f50f6258973a92f8710344375c99bf", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/x402/verify.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/protocols/x402/verify.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "8582d5006e622567e176124abcb6fc9e68260a14", + "deliveryState": "7dbbf52f915a0bc2f04079d84e3deb3dfad6133d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/x402/verify.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/protocols/x402/verify.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/protocols/x402/verify_failclosed_test.go", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source path go/protocols/x402/verify_failclosed_test.go is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "go/protocols/x402/verify_full_coverage_test.go", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "252c437c7164ca466e5ea48c75cafc8e9c13bd0a", + "deliveryState": "f4eddd20594eb3ddabc0780cfd28d8d2f8fffe23", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/x402/verify_full_coverage_test.go", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/protocols/x402/verify_full_coverage_test.go", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "252c437c7164ca466e5ea48c75cafc8e9c13bd0a", + "deliveryState": "8ce87256404a1087ea1adefd425224c764272cb7", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/protocols/x402/verify_full_coverage_test.go", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/protocols/x402/verify_full_coverage_test.go", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/scripts/check_coverage.sh", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "2a4b7ccb9d81bdb3e2118265c81d1777887082f4", + "deliveryState": "57207d538a5497c0704f5de11c7b33cd0e390450", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/scripts/check_coverage.sh", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/scripts/check_coverage.sh", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "2a4b7ccb9d81bdb3e2118265c81d1777887082f4", + "deliveryState": "d59ec4c2586caa337721674569a72011e95fdf06", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/scripts/check_coverage.sh", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/scripts/check_coverage.sh", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/scripts/check_coverage_test.sh", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "708f21ba3e614f26e66a39bb394bcbd4035c2c46", + "deliveryState": "0da4b2bc0a7c71aa28c57c50c7bdcee271e8f5cb", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/scripts/check_coverage_test.sh", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/scripts/check_coverage_test.sh", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "708f21ba3e614f26e66a39bb394bcbd4035c2c46", + "deliveryState": "aa003c4a4a6506886787c1802fe92b0e32657443", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/scripts/check_coverage_test.sh", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/scripts/check_coverage_test.sh", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "go/scripts/check_module_consumer.sh", + "bucket": "go", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "1088082f850c66df8d20d7641315d51e574a2b59", + "deliveryState": "absent", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/scripts/check_module_consumer.sh", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:go/scripts/check_module_consumer.sh", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "1088082f850c66df8d20d7641315d51e574a2b59", + "deliveryState": "8e7a9011137e7bd86d7f1a039be268ba47f3e45f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:go/scripts/check_module_consumer.sh", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:go/scripts/check_module_consumer.sh", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "harness/go-client/go.mod", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source path harness/go-client/go.mod is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "harness/go-client/go.sum", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source path harness/go-client/go.sum is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "harness/go-server/go.mod", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source path harness/go-server/go.mod is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "harness/go-server/go.sum", + "bucket": "go", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "92bdcbf", + "detail": "Source path harness/go-server/go.sum is assigned to PR #214 at or beyond 92bdcbf; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #214 / fix/go-idiomatic-cleanup", + "followUp": "Land PR #214, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "harness/package.json", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "163e7e21ac77af010c8217d6da25bb4b8a42cbe5", + "deliveryState": "d1b993729d44b77b3f534972778488a9a04333db", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/package.json", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/package.json", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052", + "sourceState": "163e7e21ac77af010c8217d6da25bb4b8a42cbe5", + "deliveryState": "d1b993729d44b77b3f534972778488a9a04333db", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/package.json", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/package.json", + "detail": "Current PR #233 branch fix/harness-adversarial-hardening at exact head 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; the source state remains superseded." + } + ] + }, + { + "path": "harness/php-server/server.php", + "bucket": "php", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1", + "detail": "Source path harness/php-server/server.php is assigned to PR #229 at or beyond 0bd30c1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #229 / fix/php-security-hardening", + "followUp": "Land PR #229, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "harness/pnpm-lock.yaml", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "9e274f6b49d130e869d8311ad78cffcbc6e34608", + "deliveryState": "20ddfbf3d334ffb6ce7520db68801e9387152571", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/pnpm-lock.yaml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/pnpm-lock.yaml", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052", + "sourceState": "9e274f6b49d130e869d8311ad78cffcbc6e34608", + "deliveryState": "20ddfbf3d334ffb6ce7520db68801e9387152571", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/pnpm-lock.yaml", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/pnpm-lock.yaml", + "detail": "Current PR #233 branch fix/harness-adversarial-hardening at exact head 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; the source state remains superseded." + } + ] + }, + { + "path": "harness/pnpm-workspace.yaml", + "bucket": "harness-ci", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "edfbb49d4fb7c709c76598dde1be1ab49d4dca46", + "deliveryBlob": "edfbb49d4fb7c709c76598dde1be1ab49d4dca46", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/pnpm-workspace.yaml", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:harness/pnpm-workspace.yaml", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "edfbb49d4fb7c709c76598dde1be1ab49d4dca46", + "deliveryBlob": "edfbb49d4fb7c709c76598dde1be1ab49d4dca46", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/pnpm-workspace.yaml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:harness/pnpm-workspace.yaml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "harness/python-server/server.py", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "29e3169aff36b796aa8bd7161d7600d35503ac77", + "deliveryState": "f3b669e22dc1d4504d95b5c3c8afd0bb08d41f39", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/python-server/server.py", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/python-server/server.py", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "686c03d3334d0b9d95a0d98cf8234711de350501", + "sourceState": "29e3169aff36b796aa8bd7161d7600d35503ac77", + "deliveryState": "de1dc7c1a1ec86401b07cf9d907f7e1f277a1c89", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/python-server/server.py", + "deliveryRef": "686c03d3334d0b9d95a0d98cf8234711de350501:harness/python-server/server.py", + "detail": "PR #228 (fix/python-security-hardening) changes this path, but exact head 686c03d3334d0b9d95a0d98cf8234711de350501 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "harness/python-server/test_harness_adapter.py", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "d985e8c1d9b24ad06e2eafcdb5ce5d1ea40dc734", + "deliveryState": "8fb216cd0c2bdccdc4e45740a52bbc3c0f1e482c", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/python-server/test_harness_adapter.py", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/python-server/test_harness_adapter.py", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "d985e8c1d9b24ad06e2eafcdb5ce5d1ea40dc734", + "deliveryState": "8fb216cd0c2bdccdc4e45740a52bbc3c0f1e482c", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/python-server/test_harness_adapter.py", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:harness/python-server/test_harness_adapter.py", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "harness/ruby-server/server.rb", + "bucket": "ruby", + "status": "superseded", + "evidence": [ + { + "kind": "delivery-baseline-divergence", + "sourceState": "f960d7f96cef0b0b71f89db239c99ad0cbdfa549", + "previousDeliveryState": "f960d7f96cef0b0b71f89db239c99ad0cbdfa549", + "deliveryState": "042bb9a94c6b54d46e912f76911eb260b09c3d29", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/ruby-server/server.rb", + "previousDeliveryRef": "65c69a4d7da92b969c1e8accab94b259ce95c168:harness/ruby-server/server.rb", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/ruby-server/server.rb", + "deliveryCommits": [ + "3435e208c0bbba23eedce0defa2926d5a1d1bf15" + ], + "detail": "This path matched the source at baseline 65c69a4d7da92b969c1e8accab94b259ce95c168, but current #233 baseline 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; it is superseded rather than integrated." + }, + { + "kind": "delivery-tree-replacement", + "pr": 235, + "branch": "fix/ruby-replay-store-capability", + "deliveryCommit": "ab4b8b44d9f292dd4737af72d7310683d75fa6e6", + "sourceState": "f960d7f96cef0b0b71f89db239c99ad0cbdfa549", + "deliveryState": "a49ce9facb7ab689a42d7fb99d96dd847bcfb11f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/ruby-server/server.rb", + "deliveryRef": "ab4b8b44d9f292dd4737af72d7310683d75fa6e6:harness/ruby-server/server.rb", + "detail": "PR #235 (fix/ruby-replay-store-capability) changes this path, but exact head ab4b8b44d9f292dd4737af72d7310683d75fa6e6 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "harness/ruby-server/test_server_io_caps.rb", + "bucket": "ruby", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "759c9e15e9862b31d9812e92de4541788dcd3794", + "deliveryBlob": "759c9e15e9862b31d9812e92de4541788dcd3794", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/ruby-server/test_server_io_caps.rb", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:harness/ruby-server/test_server_io_caps.rb", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "759c9e15e9862b31d9812e92de4541788dcd3794", + "deliveryBlob": "759c9e15e9862b31d9812e92de4541788dcd3794", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/ruby-server/test_server_io_caps.rb", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:harness/ruby-server/test_server_io_caps.rb", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "harness/scripts/assert-run-count.mjs", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "5226ad80724ee21c15e9c41b8090d82e4d362031", + "deliveryState": "e9031f77dae1ec2e583e1a219367c52336a9dc92", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/scripts/assert-run-count.mjs", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/scripts/assert-run-count.mjs", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052", + "sourceState": "5226ad80724ee21c15e9c41b8090d82e4d362031", + "deliveryState": "e9031f77dae1ec2e583e1a219367c52336a9dc92", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/scripts/assert-run-count.mjs", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/scripts/assert-run-count.mjs", + "detail": "Current PR #233 branch fix/harness-adversarial-hardening at exact head 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; the source state remains superseded." + } + ] + }, + { + "path": "harness/src/conformance/contract-schema.ts", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "3314c8557f51abf38e58c8f94d6d0eb0e72ae24c", + "deliveryState": "2e515807331766a27571156ac09071b6c3b54bd2", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/src/conformance/contract-schema.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/src/conformance/contract-schema.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "3314c8557f51abf38e58c8f94d6d0eb0e72ae24c", + "deliveryState": "2e515807331766a27571156ac09071b6c3b54bd2", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/src/conformance/contract-schema.ts", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:harness/src/conformance/contract-schema.ts", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "harness/src/conformance/schema.ts", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "d2818ebfabc27f7beb3177d0aee9c777f29b6d01", + "deliveryState": "cccc49c03cb8f4e16235e75424ca9d91d09a2ac2", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/src/conformance/schema.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/src/conformance/schema.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "d2818ebfabc27f7beb3177d0aee9c777f29b6d01", + "deliveryState": "cccc49c03cb8f4e16235e75424ca9d91d09a2ac2", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/src/conformance/schema.ts", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:harness/src/conformance/schema.ts", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "harness/src/conformance/ts-runner.ts", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "3d50a304d96a81f99ce4a06397350ed50fa8decc", + "deliveryState": "91330599812e39b695e8fd1ed25334e43d4ecf6b", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/src/conformance/ts-runner.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/src/conformance/ts-runner.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "3d50a304d96a81f99ce4a06397350ed50fa8decc", + "deliveryState": "91330599812e39b695e8fd1ed25334e43d4ecf6b", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/src/conformance/ts-runner.ts", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:harness/src/conformance/ts-runner.ts", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "harness/src/conformance/x402.ts", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "ce8e2d9735f752238059e57320b3790b020c7837", + "deliveryState": "470afb7e158af8ef1baa9cce8cc6230d6d49febc", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/src/conformance/x402.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/src/conformance/x402.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052", + "sourceState": "ce8e2d9735f752238059e57320b3790b020c7837", + "deliveryState": "470afb7e158af8ef1baa9cce8cc6230d6d49febc", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/src/conformance/x402.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/src/conformance/x402.ts", + "detail": "Current PR #233 branch fix/harness-adversarial-hardening at exact head 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; the source state remains superseded." + } + ] + }, + { + "path": "harness/src/implementations.ts", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "199aa2478ab8a6f51618c64261705aa943655f4d", + "deliveryState": "13bc17e185df45c67fcc1e3b50c833712ce28e5d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/src/implementations.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/src/implementations.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 214, + "branch": "fix/go-idiomatic-cleanup", + "deliveryCommit": "1e8d8d2166657be224d341e1d2de1503f4077e02", + "sourceState": "199aa2478ab8a6f51618c64261705aa943655f4d", + "deliveryState": "babfaef3fe7781122f2b95136c0f00c2a3fbfca5", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/src/implementations.ts", + "deliveryRef": "1e8d8d2166657be224d341e1d2de1503f4077e02:harness/src/implementations.ts", + "detail": "PR #214 (fix/go-idiomatic-cleanup) changes this path, but exact head 1e8d8d2166657be224d341e1d2de1503f4077e02 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "harness/test/conformance.test.ts", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "53f3827c3e113c7ee497e8dc0e797c03350f99d6", + "deliveryState": "1d9c739e7dbeb0d9ce7bb3a635c5f11aa591f8ad", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/test/conformance.test.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/test/conformance.test.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052", + "sourceState": "53f3827c3e113c7ee497e8dc0e797c03350f99d6", + "deliveryState": "1d9c739e7dbeb0d9ce7bb3a635c5f11aa591f8ad", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/test/conformance.test.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/test/conformance.test.ts", + "detail": "Current PR #233 branch fix/harness-adversarial-hardening at exact head 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; the source state remains superseded." + } + ] + }, + { + "path": "harness/test/harness-gates.test.ts", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "f9b04f72e31207b736c80d92d08033a0a5495e52", + "deliveryState": "34497396350a590696b09ae494891bf74336ed7b", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/test/harness-gates.test.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/test/harness-gates.test.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052", + "sourceState": "f9b04f72e31207b736c80d92d08033a0a5495e52", + "deliveryState": "34497396350a590696b09ae494891bf74336ed7b", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/test/harness-gates.test.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/test/harness-gates.test.ts", + "detail": "Current PR #233 branch fix/harness-adversarial-hardening at exact head 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; the source state remains superseded." + } + ] + }, + { + "path": "harness/test/onchain-gate.ts", + "bucket": "harness-ci", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "799c80184dbd41dfe17117de65180ab13598549d", + "deliveryBlob": "799c80184dbd41dfe17117de65180ab13598549d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/test/onchain-gate.ts", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:harness/test/onchain-gate.ts", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "799c80184dbd41dfe17117de65180ab13598549d", + "deliveryBlob": "799c80184dbd41dfe17117de65180ab13598549d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/test/onchain-gate.ts", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:harness/test/onchain-gate.ts", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "harness/test/onchain.setup.ts", + "bucket": "harness-ci", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "07ae4f40ec5752738e41abee9094a7f9c3df990b", + "deliveryBlob": "07ae4f40ec5752738e41abee9094a7f9c3df990b", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/test/onchain.setup.ts", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:harness/test/onchain.setup.ts", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "07ae4f40ec5752738e41abee9094a7f9c3df990b", + "deliveryBlob": "07ae4f40ec5752738e41abee9094a7f9c3df990b", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/test/onchain.setup.ts", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:harness/test/onchain.setup.ts", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "harness/vectors/mpp-protocol/www-authenticate.json", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "6bb6cea7e7db8960472db388cb6804e4227c7c8e", + "deliveryState": "43f80757c5f0f296b58a5c1c43ae2e4a9707fb76", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/vectors/mpp-protocol/www-authenticate.json", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/vectors/mpp-protocol/www-authenticate.json", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "6bb6cea7e7db8960472db388cb6804e4227c7c8e", + "deliveryState": "43f80757c5f0f296b58a5c1c43ae2e4a9707fb76", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/vectors/mpp-protocol/www-authenticate.json", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:harness/vectors/mpp-protocol/www-authenticate.json", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "harness/vectors/session-voucher/session-voucher-reject.json", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "a6edc790bc3ce051e51676b1e7b7b5dea21d0b3f", + "deliveryState": "6470077cdd8bd454ff3a8f62f5c2ab4b45811392", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/vectors/session-voucher/session-voucher-reject.json", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/vectors/session-voucher/session-voucher-reject.json", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052", + "sourceState": "a6edc790bc3ce051e51676b1e7b7b5dea21d0b3f", + "deliveryState": "6470077cdd8bd454ff3a8f62f5c2ab4b45811392", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/vectors/session-voucher/session-voucher-reject.json", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:harness/vectors/session-voucher/session-voucher-reject.json", + "detail": "Current PR #233 branch fix/harness-adversarial-hardening at exact head 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; the source state remains superseded." + } + ] + }, + { + "path": "harness/vectors/x402-exact-reject.json", + "bucket": "harness-ci", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "bcfd9e0fa17a323e5cde46fa766235096b92eacc", + "deliveryBlob": "bcfd9e0fa17a323e5cde46fa766235096b92eacc", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/vectors/x402-exact-reject.json", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:harness/vectors/x402-exact-reject.json", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "bcfd9e0fa17a323e5cde46fa766235096b92eacc", + "deliveryBlob": "bcfd9e0fa17a323e5cde46fa766235096b92eacc", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/vectors/x402-exact-reject.json", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:harness/vectors/x402-exact-reject.json", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "harness/vitest.config.ts", + "bucket": "harness-ci", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "aea8119e2385ffeb5fd256469fd7e00532e8f83c", + "deliveryBlob": "aea8119e2385ffeb5fd256469fd7e00532e8f83c", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/vitest.config.ts", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:harness/vitest.config.ts", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "aea8119e2385ffeb5fd256469fd7e00532e8f83c", + "deliveryBlob": "aea8119e2385ffeb5fd256469fd7e00532e8f83c", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/vitest.config.ts", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:harness/vitest.config.ts", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "harness/vitest.onchain.config.ts", + "bucket": "harness-ci", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "57483135a54581dadb458fc42cd4f0834b6f3df5", + "deliveryBlob": "57483135a54581dadb458fc42cd4f0834b6f3df5", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/vitest.onchain.config.ts", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:harness/vitest.onchain.config.ts", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "57483135a54581dadb458fc42cd4f0834b6f3df5", + "deliveryBlob": "57483135a54581dadb458fc42cd4f0834b6f3df5", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:harness/vitest.onchain.config.ts", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:harness/vitest.onchain.config.ts", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "kotlin/src/main/kotlin/com/solana/paykit/protocols/mpp/client/Charge.kt", + "bucket": "kotlin", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 230, + "branch": "fix/kotlin-canonical-json-hardening", + "deliveryCommit": "d286dd9", + "detail": "Source path kotlin/src/main/kotlin/com/solana/paykit/protocols/mpp/client/Charge.kt is assigned to PR #230 at or beyond d286dd9; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #230 / fix/kotlin-canonical-json-hardening", + "followUp": "Land PR #230, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "kotlin/src/test/kotlin/com/solana/paykit/protocols/mpp/client/ChargeCredentialTest.kt", + "bucket": "kotlin", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 230, + "branch": "fix/kotlin-canonical-json-hardening", + "deliveryCommit": "d286dd9", + "detail": "Source path kotlin/src/test/kotlin/com/solana/paykit/protocols/mpp/client/ChargeCredentialTest.kt is assigned to PR #230 at or beyond d286dd9; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #230 / fix/kotlin-canonical-json-hardening", + "followUp": "Land PR #230, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "lua/cmd/conformance/main.lua", + "bucket": "lua", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "45b5c302017519a70d9a4a425fca5403b395c49d", + "deliveryState": "0417ca0a156f9224b611b2464373174f9fd43ac1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:lua/cmd/conformance/main.lua", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:lua/cmd/conformance/main.lua", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "45b5c302017519a70d9a4a425fca5403b395c49d", + "deliveryState": "0417ca0a156f9224b611b2464373174f9fd43ac1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:lua/cmd/conformance/main.lua", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:lua/cmd/conformance/main.lua", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "lua/pay_kit/protocols/mpp/server/solana_verify.lua", + "bucket": "lua", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "3b4aaa6838a1789ebc2c8c9a59b7ecf7b3a7984d", + "deliveryBlob": "3b4aaa6838a1789ebc2c8c9a59b7ecf7b3a7984d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:lua/pay_kit/protocols/mpp/server/solana_verify.lua", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:lua/pay_kit/protocols/mpp/server/solana_verify.lua", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-pr-exact-tree-entry", + "pr": 225, + "branch": "fix/lua-security-hardening", + "deliveryCommit": "3a6d74974857f7d051a77d26b52ecbc5831b4e2f", + "sourceBlob": "3b4aaa6838a1789ebc2c8c9a59b7ecf7b3a7984d", + "deliveryBlob": "3b4aaa6838a1789ebc2c8c9a59b7ecf7b3a7984d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:lua/pay_kit/protocols/mpp/server/solana_verify.lua", + "deliveryRef": "3a6d74974857f7d051a77d26b52ecbc5831b4e2f:lua/pay_kit/protocols/mpp/server/solana_verify.lua", + "detail": "Merged PR #225 changed this path and its exact commit tree contains the authoritative source-tip blob." + } + ] + }, + { + "path": "lua/pay_kit/protocols/x402/exact/verify.lua", + "bucket": "lua", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "265be4e05174ad9ceef7f8931b08959c026f020f", + "deliveryState": "3ebaf46fe0a3321c0d61f8395562817a7f76ac55", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:lua/pay_kit/protocols/x402/exact/verify.lua", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:lua/pay_kit/protocols/x402/exact/verify.lua", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "265be4e05174ad9ceef7f8931b08959c026f020f", + "deliveryState": "3ebaf46fe0a3321c0d61f8395562817a7f76ac55", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:lua/pay_kit/protocols/x402/exact/verify.lua", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:lua/pay_kit/protocols/x402/exact/verify.lua", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "lua/pay_kit/util/uint.lua", + "bucket": "lua", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "5c7aeaa5a5da8e22a2406f36b55e9ef55e9aef83", + "deliveryBlob": "5c7aeaa5a5da8e22a2406f36b55e9ef55e9aef83", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:lua/pay_kit/util/uint.lua", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:lua/pay_kit/util/uint.lua", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-pr-exact-tree-entry", + "pr": 225, + "branch": "fix/lua-security-hardening", + "deliveryCommit": "3a6d74974857f7d051a77d26b52ecbc5831b4e2f", + "sourceBlob": "5c7aeaa5a5da8e22a2406f36b55e9ef55e9aef83", + "deliveryBlob": "5c7aeaa5a5da8e22a2406f36b55e9ef55e9aef83", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:lua/pay_kit/util/uint.lua", + "deliveryRef": "3a6d74974857f7d051a77d26b52ecbc5831b4e2f:lua/pay_kit/util/uint.lua", + "detail": "Merged PR #225 changed this path and its exact commit tree contains the authoritative source-tip blob." + } + ] + }, + { + "path": "lua/tests/pay_kit/x402_verify_spec.lua", + "bucket": "lua", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "1938535c1e7006e2978e03996251ec4fb4677ba1", + "deliveryState": "5628b5f160cf9e16eac65c073c1bdd74bafb1cf4", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:lua/tests/pay_kit/x402_verify_spec.lua", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:lua/tests/pay_kit/x402_verify_spec.lua", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "1938535c1e7006e2978e03996251ec4fb4677ba1", + "deliveryState": "5628b5f160cf9e16eac65c073c1bdd74bafb1cf4", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:lua/tests/pay_kit/x402_verify_spec.lua", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:lua/tests/pay_kit/x402_verify_spec.lua", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "lua/tests/solana_verify_spec.lua", + "bucket": "lua", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "2b2d19ce3121f2e49e0d5260c526437706ce3a40", + "deliveryBlob": "2b2d19ce3121f2e49e0d5260c526437706ce3a40", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:lua/tests/solana_verify_spec.lua", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:lua/tests/solana_verify_spec.lua", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-pr-exact-tree-entry", + "pr": 225, + "branch": "fix/lua-security-hardening", + "deliveryCommit": "3a6d74974857f7d051a77d26b52ecbc5831b4e2f", + "sourceBlob": "2b2d19ce3121f2e49e0d5260c526437706ce3a40", + "deliveryBlob": "2b2d19ce3121f2e49e0d5260c526437706ce3a40", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:lua/tests/solana_verify_spec.lua", + "deliveryRef": "3a6d74974857f7d051a77d26b52ecbc5831b4e2f:lua/tests/solana_verify_spec.lua", + "detail": "Merged PR #225 changed this path and its exact commit tree contains the authoritative source-tip blob." + } + ] + }, + { + "path": "php/conformance/runner.php", + "bucket": "php", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "f8f6d4ec69504c4f4ad67e77a0ffe2d5e4a58b12", + "deliveryState": "9d11a79be854d0e3b10a22583909eea76d9e751f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:php/conformance/runner.php", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:php/conformance/runner.php", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1b170951a9b3edb70d158c15e6f3074fed", + "sourceState": "f8f6d4ec69504c4f4ad67e77a0ffe2d5e4a58b12", + "deliveryState": "a9a7c2f29be5d37ada52fbf0d8d12649005d7bb7", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:php/conformance/runner.php", + "deliveryRef": "0bd30c1b170951a9b3edb70d158c15e6f3074fed:php/conformance/runner.php", + "detail": "PR #229 (fix/php-security-hardening) changes this path, but exact head 0bd30c1b170951a9b3edb70d158c15e6f3074fed has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "php/phpunit.xml", + "bucket": "php", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1", + "detail": "Source path php/phpunit.xml is assigned to PR #229 at or beyond 0bd30c1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #229 / fix/php-security-hardening", + "followUp": "Land PR #229, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "php/src/Protocols/Mpp/Adapter.php", + "bucket": "php", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "39ca41a56cb97309d58528ed903e760bd6fe48e7", + "deliveryState": "44d6a5b943ff893c5ca05c9049f936916e2bc13f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:php/src/Protocols/Mpp/Adapter.php", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:php/src/Protocols/Mpp/Adapter.php", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1b170951a9b3edb70d158c15e6f3074fed", + "sourceState": "39ca41a56cb97309d58528ed903e760bd6fe48e7", + "deliveryState": "3d8754e04e18ea52e380cdaff988e00099b78f7d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:php/src/Protocols/Mpp/Adapter.php", + "deliveryRef": "0bd30c1b170951a9b3edb70d158c15e6f3074fed:php/src/Protocols/Mpp/Adapter.php", + "detail": "PR #229 (fix/php-security-hardening) changes this path, but exact head 0bd30c1b170951a9b3edb70d158c15e6f3074fed has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "php/src/Protocols/X402/Adapter.php", + "bucket": "php", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1", + "detail": "Source path php/src/Protocols/X402/Adapter.php is assigned to PR #229 at or beyond 0bd30c1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #229 / fix/php-security-hardening", + "followUp": "Land PR #229, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "php/src/Protocols/X402/Exact/Verifier.php", + "bucket": "php", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "1052e702b38331f28c3460edf1051248df515f1d", + "deliveryState": "770fe783ec4e6fe4a7df9cec5f4d53802cc78f69", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:php/src/Protocols/X402/Exact/Verifier.php", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:php/src/Protocols/X402/Exact/Verifier.php", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1b170951a9b3edb70d158c15e6f3074fed", + "sourceState": "1052e702b38331f28c3460edf1051248df515f1d", + "deliveryState": "f82bbe3af116f6e11f2b1eefb83a3b24e5c9d6bc", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:php/src/Protocols/X402/Exact/Verifier.php", + "deliveryRef": "0bd30c1b170951a9b3edb70d158c15e6f3074fed:php/src/Protocols/X402/Exact/Verifier.php", + "detail": "PR #229 (fix/php-security-hardening) changes this path, but exact head 0bd30c1b170951a9b3edb70d158c15e6f3074fed has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "php/tests/Middleware/RequirePaymentTest.php", + "bucket": "php", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "6d09f73aa90bede69c7c34354c6efb9d5a1482c9", + "deliveryState": "6ec9e82d4511b9cde16e43211f6385dbdd6472bf", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:php/tests/Middleware/RequirePaymentTest.php", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:php/tests/Middleware/RequirePaymentTest.php", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1b170951a9b3edb70d158c15e6f3074fed", + "sourceState": "6d09f73aa90bede69c7c34354c6efb9d5a1482c9", + "deliveryState": "c124f4ef0cd2b794a9d5278d306f326bf6915bbd", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:php/tests/Middleware/RequirePaymentTest.php", + "deliveryRef": "0bd30c1b170951a9b3edb70d158c15e6f3074fed:php/tests/Middleware/RequirePaymentTest.php", + "detail": "PR #229 (fix/php-security-hardening) changes this path, but exact head 0bd30c1b170951a9b3edb70d158c15e6f3074fed has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "php/tests/Protocols/Mpp/AdapterTest.php", + "bucket": "php", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "8a032143ab35d081bf18c70c41bae5f114b326cf", + "deliveryState": "fcf9bd1fe445ce767992cb2641ca41ef756894ba", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:php/tests/Protocols/Mpp/AdapterTest.php", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:php/tests/Protocols/Mpp/AdapterTest.php", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1b170951a9b3edb70d158c15e6f3074fed", + "sourceState": "8a032143ab35d081bf18c70c41bae5f114b326cf", + "deliveryState": "cbffd7b1d8c54b4d217cd4cefbe6736219e32d78", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:php/tests/Protocols/Mpp/AdapterTest.php", + "deliveryRef": "0bd30c1b170951a9b3edb70d158c15e6f3074fed:php/tests/Protocols/Mpp/AdapterTest.php", + "detail": "PR #229 (fix/php-security-hardening) changes this path, but exact head 0bd30c1b170951a9b3edb70d158c15e6f3074fed has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "php/tests/Protocols/X402/AdapterSettleTest.php", + "bucket": "php", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1", + "detail": "Source path php/tests/Protocols/X402/AdapterSettleTest.php is assigned to PR #229 at or beyond 0bd30c1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #229 / fix/php-security-hardening", + "followUp": "Land PR #229, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "php/tests/Protocols/X402/AdapterTest.php", + "bucket": "php", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1", + "detail": "Source path php/tests/Protocols/X402/AdapterTest.php is assigned to PR #229 at or beyond 0bd30c1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #229 / fix/php-security-hardening", + "followUp": "Land PR #229, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "php/tests/Protocols/X402/ConfirmationTest.php", + "bucket": "php", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1", + "detail": "Source path php/tests/Protocols/X402/ConfirmationTest.php is assigned to PR #229 at or beyond 0bd30c1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #229 / fix/php-security-hardening", + "followUp": "Land PR #229, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "php/tests/Protocols/X402/Exact/AtaCreateRejectTest.php", + "bucket": "php", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "4911cc4c53f4b1a4c7abe01b6aa6d2e5c746edc5", + "deliveryState": "753de3cf5a69913634f764d0f2a83110388e0a98", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:php/tests/Protocols/X402/Exact/AtaCreateRejectTest.php", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:php/tests/Protocols/X402/Exact/AtaCreateRejectTest.php", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1b170951a9b3edb70d158c15e6f3074fed", + "sourceState": "4911cc4c53f4b1a4c7abe01b6aa6d2e5c746edc5", + "deliveryState": "8ebaec045e84e55e07474f7a5490849cd87b4456", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:php/tests/Protocols/X402/Exact/AtaCreateRejectTest.php", + "deliveryRef": "0bd30c1b170951a9b3edb70d158c15e6f3074fed:php/tests/Protocols/X402/Exact/AtaCreateRejectTest.php", + "detail": "PR #229 (fix/php-security-hardening) changes this path, but exact head 0bd30c1b170951a9b3edb70d158c15e6f3074fed has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "php/tests/Protocols/X402/Exact/VerifierBranchTest.php", + "bucket": "php", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1", + "detail": "Source path php/tests/Protocols/X402/Exact/VerifierBranchTest.php is assigned to PR #229 at or beyond 0bd30c1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #229 / fix/php-security-hardening", + "followUp": "Land PR #229, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "php/tests/Protocols/X402/LegacyWireTest.php", + "bucket": "php", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 229, + "branch": "fix/php-security-hardening", + "deliveryCommit": "0bd30c1", + "detail": "Source path php/tests/Protocols/X402/LegacyWireTest.php is assigned to PR #229 at or beyond 0bd30c1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #229 / fix/php-security-hardening", + "followUp": "Land PR #229, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "playground/package.json", + "bucket": "cross-sdk", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "f5ee2cd6cac9eb578a8ad2981a0e601a607671ab", + "deliveryBlob": "f5ee2cd6cac9eb578a8ad2981a0e601a607671ab", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:playground/package.json", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:playground/package.json", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "f5ee2cd6cac9eb578a8ad2981a0e601a607671ab", + "deliveryBlob": "f5ee2cd6cac9eb578a8ad2981a0e601a607671ab", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:playground/package.json", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:playground/package.json", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "playground/pnpm-lock.yaml", + "bucket": "cross-sdk", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "e4fc7d65cc3c7585d2c0fc7ff09b4ada0813812f", + "deliveryBlob": "e4fc7d65cc3c7585d2c0fc7ff09b4ada0813812f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:playground/pnpm-lock.yaml", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:playground/pnpm-lock.yaml", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "e4fc7d65cc3c7585d2c0fc7ff09b4ada0813812f", + "deliveryBlob": "e4fc7d65cc3c7585d2c0fc7ff09b4ada0813812f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:playground/pnpm-lock.yaml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:playground/pnpm-lock.yaml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "playground/pnpm-workspace.yaml", + "bucket": "cross-sdk", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "591dc3077f974f9fcf2fe66cf6452f0ad3d76ac4", + "deliveryBlob": "591dc3077f974f9fcf2fe66cf6452f0ad3d76ac4", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:playground/pnpm-workspace.yaml", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:playground/pnpm-workspace.yaml", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "591dc3077f974f9fcf2fe66cf6452f0ad3d76ac4", + "deliveryBlob": "591dc3077f974f9fcf2fe66cf6452f0ad3d76ac4", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:playground/pnpm-workspace.yaml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:playground/pnpm-workspace.yaml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "python/conformance_runner.py", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "963430ea0098927c9d25ff19e20dcdd8ef259c7d", + "deliveryState": "99ed43fef1033a93786e8e30f84bb7966a99bb73", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/conformance_runner.py", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:python/conformance_runner.py", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "686c03d3334d0b9d95a0d98cf8234711de350501", + "sourceState": "963430ea0098927c9d25ff19e20dcdd8ef259c7d", + "deliveryState": "5bfd436f62bd4a62e81973d54406187a2baf08ec", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/conformance_runner.py", + "deliveryRef": "686c03d3334d0b9d95a0d98cf8234711de350501:python/conformance_runner.py", + "detail": "PR #228 (fix/python-security-hardening) changes this path, but exact head 686c03d3334d0b9d95a0d98cf8234711de350501 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "python/src/solana_pay_kit/protocols/mpp/server/session.py", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "649838a701c9afd9fe65a29f48ca86950d661846", + "deliveryState": "0381f621f20129dc250ccbbfbc9843c953a2e3e2", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/src/solana_pay_kit/protocols/mpp/server/session.py", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:python/src/solana_pay_kit/protocols/mpp/server/session.py", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "686c03d3334d0b9d95a0d98cf8234711de350501", + "sourceState": "649838a701c9afd9fe65a29f48ca86950d661846", + "deliveryState": "ea02e14793ed001ce334ab888c4234e2a35c8fc9", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/src/solana_pay_kit/protocols/mpp/server/session.py", + "deliveryRef": "686c03d3334d0b9d95a0d98cf8234711de350501:python/src/solana_pay_kit/protocols/mpp/server/session.py", + "detail": "PR #228 (fix/python-security-hardening) changes this path, but exact head 686c03d3334d0b9d95a0d98cf8234711de350501 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "acd0e01044a1feacceced5bc0d97a3793266330f", + "deliveryState": "ad55a1d399f32af99f10e4dc93d28ee6e3432356", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "686c03d3334d0b9d95a0d98cf8234711de350501", + "sourceState": "acd0e01044a1feacceced5bc0d97a3793266330f", + "deliveryState": "a28ac16071cc05cf7db5c64861f7b9295e3fcff1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "deliveryRef": "686c03d3334d0b9d95a0d98cf8234711de350501:python/src/solana_pay_kit/protocols/mpp/server/session_method.py", + "detail": "PR #228 (fix/python-security-hardening) changes this path, but exact head 686c03d3334d0b9d95a0d98cf8234711de350501 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "d298f8de46373eb0605848ad811acfdcdb9d36db", + "deliveryState": "a23b024c4814f3523e3aba2c2156304193bf377c", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "686c03d3334d0b9d95a0d98cf8234711de350501", + "sourceState": "d298f8de46373eb0605848ad811acfdcdb9d36db", + "deliveryState": "78592af463dadbb583fe30df80b959dd76a9e5b0", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py", + "deliveryRef": "686c03d3334d0b9d95a0d98cf8234711de350501:python/src/solana_pay_kit/protocols/mpp/server/session_onchain.py", + "detail": "PR #228 (fix/python-security-hardening) changes this path, but exact head 686c03d3334d0b9d95a0d98cf8234711de350501 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "python/src/solana_pay_kit/protocols/mpp/server/session_store.py", + "bucket": "python", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "8ac54e8", + "detail": "Source path python/src/solana_pay_kit/protocols/mpp/server/session_store.py is assigned to PR #228 at or beyond 8ac54e8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #228 / fix/python-security-hardening", + "followUp": "Land PR #228, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "python/src/solana_pay_kit/protocols/mpp/server/session_voucher.py", + "bucket": "python", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path python/src/solana_pay_kit/protocols/mpp/server/session_voucher.py is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "python/src/solana_pay_kit/protocols/x402/exact/verify.py", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "f3fdfa5ff4e0a2a120285c556413cfbd4b7af921", + "deliveryState": "e23554580e7b8d581376beb526f3ffa9fab66475", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/src/solana_pay_kit/protocols/x402/exact/verify.py", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:python/src/solana_pay_kit/protocols/x402/exact/verify.py", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "686c03d3334d0b9d95a0d98cf8234711de350501", + "sourceState": "f3fdfa5ff4e0a2a120285c556413cfbd4b7af921", + "deliveryState": "149af5e48a77381ffa1a3a995f9d567ecff52ca3", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/src/solana_pay_kit/protocols/x402/exact/verify.py", + "deliveryRef": "686c03d3334d0b9d95a0d98cf8234711de350501:python/src/solana_pay_kit/protocols/x402/exact/verify.py", + "detail": "PR #228 (fix/python-security-hardening) changes this path, but exact head 686c03d3334d0b9d95a0d98cf8234711de350501 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "python/src/solana_pay_kit/protocols/x402/upto/__init__.py", + "bucket": "python", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 236, + "branch": "fix/x402-replay-hardening", + "deliveryCommit": "10708ce", + "detail": "Source path python/src/solana_pay_kit/protocols/x402/upto/__init__.py is assigned to PR #236 at or beyond 10708ce; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #236 / fix/x402-replay-hardening", + "followUp": "Land PR #236, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "python/tests/test_pk_x402_upto_blockhash_cache.py", + "bucket": "python", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "8ac54e8", + "detail": "Source path python/tests/test_pk_x402_upto_blockhash_cache.py is assigned to PR #228 at or beyond 8ac54e8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #228 / fix/python-security-hardening", + "followUp": "Land PR #228, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "python/tests/test_pk_x402_verifier.py", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "62230c4433702d945ad2e7c02a4aac5795df0579", + "deliveryState": "8b53fe68881630bcdf21d36c650eff3aa7410caa", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/tests/test_pk_x402_verifier.py", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:python/tests/test_pk_x402_verifier.py", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "686c03d3334d0b9d95a0d98cf8234711de350501", + "sourceState": "62230c4433702d945ad2e7c02a4aac5795df0579", + "deliveryState": "65dcaba67e63957210546e51918a809f16bc8d3e", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/tests/test_pk_x402_verifier.py", + "deliveryRef": "686c03d3334d0b9d95a0d98cf8234711de350501:python/tests/test_pk_x402_verifier.py", + "detail": "PR #228 (fix/python-security-hardening) changes this path, but exact head 686c03d3334d0b9d95a0d98cf8234711de350501 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "python/tests/test_session_method.py", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "85e4649e512f5a608420f7d0368b895d294b6bdd", + "deliveryState": "dd983031da03551da21454c058b90f29662d5880", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/tests/test_session_method.py", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:python/tests/test_session_method.py", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "686c03d3334d0b9d95a0d98cf8234711de350501", + "sourceState": "85e4649e512f5a608420f7d0368b895d294b6bdd", + "deliveryState": "cf725d7656bbc5703b41eccee1c2a8eea8d0ccac", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/tests/test_session_method.py", + "deliveryRef": "686c03d3334d0b9d95a0d98cf8234711de350501:python/tests/test_session_method.py", + "detail": "PR #228 (fix/python-security-hardening) changes this path, but exact head 686c03d3334d0b9d95a0d98cf8234711de350501 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "python/tests/test_session_onchain.py", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "a05524af8dc0edad7bfefd2fc8926eb6804823c9", + "deliveryState": "279f2bf669e7330e8174a785d3fb873c7ec9c45b", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/tests/test_session_onchain.py", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:python/tests/test_session_onchain.py", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "686c03d3334d0b9d95a0d98cf8234711de350501", + "sourceState": "a05524af8dc0edad7bfefd2fc8926eb6804823c9", + "deliveryState": "77b45a3d5c1aa79289c59de060ecb90f77a28f41", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/tests/test_session_onchain.py", + "deliveryRef": "686c03d3334d0b9d95a0d98cf8234711de350501:python/tests/test_session_onchain.py", + "detail": "PR #228 (fix/python-security-hardening) changes this path, but exact head 686c03d3334d0b9d95a0d98cf8234711de350501 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "python/tests/test_session_settlement.py", + "bucket": "python", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "619ba0da716ba46143f478c130422a0359198b04", + "deliveryState": "7f40c4725b40bc77a3ff21bdd18fe046809e8bfa", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/tests/test_session_settlement.py", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:python/tests/test_session_settlement.py", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "686c03d3334d0b9d95a0d98cf8234711de350501", + "sourceState": "619ba0da716ba46143f478c130422a0359198b04", + "deliveryState": "b48e63bd39bc5fe7c5a37b16d697f17c1c274b7e", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:python/tests/test_session_settlement.py", + "deliveryRef": "686c03d3334d0b9d95a0d98cf8234711de350501:python/tests/test_session_settlement.py", + "detail": "PR #228 (fix/python-security-hardening) changes this path, but exact head 686c03d3334d0b9d95a0d98cf8234711de350501 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "python/tests/test_session_store.py", + "bucket": "python", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 228, + "branch": "fix/python-security-hardening", + "deliveryCommit": "8ac54e8", + "detail": "Source path python/tests/test_session_store.py is assigned to PR #228 at or beyond 8ac54e8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #228 / fix/python-security-hardening", + "followUp": "Land PR #228, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "python/tests/test_session_topup_bind.py", + "bucket": "python", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path python/tests/test_session_topup_bind.py is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "python/tests/test_session_voucher.py", + "bucket": "python", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path python/tests/test_session_voucher.py is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "ruby/Gemfile.lock", + "bucket": "ruby", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "cee560823b699791a07c2bb11b337e3c114705f5", + "deliveryState": "cdef3f7e2588f80eca737a74c3b198b4b327b25d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/Gemfile.lock", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:ruby/Gemfile.lock", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "cee560823b699791a07c2bb11b337e3c114705f5", + "deliveryState": "cdef3f7e2588f80eca737a74c3b198b4b327b25d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/Gemfile.lock", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:ruby/Gemfile.lock", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "ruby/exe/conformance", + "bucket": "ruby", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "e2b9e466e957e51c0999439a00b4808280e509f8", + "deliveryState": "b49471ab09600f22e17c201373d6742952ae10e1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/exe/conformance", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:ruby/exe/conformance", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "e2b9e466e957e51c0999439a00b4808280e509f8", + "deliveryState": "b49471ab09600f22e17c201373d6742952ae10e1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/exe/conformance", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:ruby/exe/conformance", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "ruby/lib/pay_kit/protocols/mpp/protocol/core/headers.rb", + "bucket": "ruby", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "65e876e0eff00e44f3fc20739fc4a1d0c92862bf", + "deliveryBlob": "65e876e0eff00e44f3fc20739fc4a1d0c92862bf", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/lib/pay_kit/protocols/mpp/protocol/core/headers.rb", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:ruby/lib/pay_kit/protocols/mpp/protocol/core/headers.rb", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-pr-exact-tree-entry", + "pr": 222, + "branch": "fix/ruby-security-hardening", + "deliveryCommit": "3435e208c0bbba23eedce0defa2926d5a1d1bf15", + "sourceBlob": "65e876e0eff00e44f3fc20739fc4a1d0c92862bf", + "deliveryBlob": "65e876e0eff00e44f3fc20739fc4a1d0c92862bf", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/lib/pay_kit/protocols/mpp/protocol/core/headers.rb", + "deliveryRef": "3435e208c0bbba23eedce0defa2926d5a1d1bf15:ruby/lib/pay_kit/protocols/mpp/protocol/core/headers.rb", + "detail": "Merged PR #222 changed this path and its exact commit tree contains the authoritative source-tip blob." + } + ] + }, + { + "path": "ruby/lib/pay_kit/protocols/x402/protocol/schemes/exact/verify.rb", + "bucket": "ruby", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "2ae2759c1f439e5b7f8b737608b0d236d7992767", + "deliveryState": "29080937f8c6a9b08787fa6ac4fa4a04d4a3d74f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/lib/pay_kit/protocols/x402/protocol/schemes/exact/verify.rb", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:ruby/lib/pay_kit/protocols/x402/protocol/schemes/exact/verify.rb", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "2ae2759c1f439e5b7f8b737608b0d236d7992767", + "deliveryState": "29080937f8c6a9b08787fa6ac4fa4a04d4a3d74f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/lib/pay_kit/protocols/x402/protocol/schemes/exact/verify.rb", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:ruby/lib/pay_kit/protocols/x402/protocol/schemes/exact/verify.rb", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "ruby/lib/pay_kit/protocols/x402/server/exact.rb", + "bucket": "ruby", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "a0cd3e8bd4fd4fac761fd4f9bd667453fb36e2c8", + "deliveryState": "8fb76ba8c8c8eca3d429a9a42104d24439b1d1f9", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/lib/pay_kit/protocols/x402/server/exact.rb", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:ruby/lib/pay_kit/protocols/x402/server/exact.rb", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "a0cd3e8bd4fd4fac761fd4f9bd667453fb36e2c8", + "deliveryState": "8fb76ba8c8c8eca3d429a9a42104d24439b1d1f9", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/lib/pay_kit/protocols/x402/server/exact.rb", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:ruby/lib/pay_kit/protocols/x402/server/exact.rb", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "ruby/solana-pay-kit.gemspec", + "bucket": "ruby", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "964efa4706f99c69ba9e327dec048455022265c3", + "deliveryState": "c2d1124ca7ad15ec2d25005f2d038d4ddda99f7b", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/solana-pay-kit.gemspec", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:ruby/solana-pay-kit.gemspec", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "964efa4706f99c69ba9e327dec048455022265c3", + "deliveryState": "c2d1124ca7ad15ec2d25005f2d038d4ddda99f7b", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/solana-pay-kit.gemspec", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:ruby/solana-pay-kit.gemspec", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "ruby/test/pay_kit/protocols/mpp/core_test.rb", + "bucket": "ruby", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "a328d71b1a941e1666595e79f923a27aecd7c483", + "deliveryBlob": "a328d71b1a941e1666595e79f923a27aecd7c483", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/test/pay_kit/protocols/mpp/core_test.rb", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:ruby/test/pay_kit/protocols/mpp/core_test.rb", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-pr-exact-tree-entry", + "pr": 222, + "branch": "fix/ruby-security-hardening", + "deliveryCommit": "3435e208c0bbba23eedce0defa2926d5a1d1bf15", + "sourceBlob": "a328d71b1a941e1666595e79f923a27aecd7c483", + "deliveryBlob": "a328d71b1a941e1666595e79f923a27aecd7c483", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/test/pay_kit/protocols/mpp/core_test.rb", + "deliveryRef": "3435e208c0bbba23eedce0defa2926d5a1d1bf15:ruby/test/pay_kit/protocols/mpp/core_test.rb", + "detail": "Merged PR #222 changed this path and its exact commit tree contains the authoritative source-tip blob." + } + ] + }, + { + "path": "ruby/test/pay_kit/protocols/mpp/pull_mode_replay_test.rb", + "bucket": "ruby", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "6aeddef7a2d4353dd4853c6518ba139adf35ee64", + "deliveryBlob": "6aeddef7a2d4353dd4853c6518ba139adf35ee64", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/test/pay_kit/protocols/mpp/pull_mode_replay_test.rb", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:ruby/test/pay_kit/protocols/mpp/pull_mode_replay_test.rb", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-pr-exact-tree-entry", + "pr": 222, + "branch": "fix/ruby-security-hardening", + "deliveryCommit": "3435e208c0bbba23eedce0defa2926d5a1d1bf15", + "sourceBlob": "6aeddef7a2d4353dd4853c6518ba139adf35ee64", + "deliveryBlob": "6aeddef7a2d4353dd4853c6518ba139adf35ee64", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/test/pay_kit/protocols/mpp/pull_mode_replay_test.rb", + "deliveryRef": "3435e208c0bbba23eedce0defa2926d5a1d1bf15:ruby/test/pay_kit/protocols/mpp/pull_mode_replay_test.rb", + "detail": "Merged PR #222 changed this path and its exact commit tree contains the authoritative source-tip blob." + } + ] + }, + { + "path": "ruby/test/pay_kit/protocols/x402/server_exact_test.rb", + "bucket": "ruby", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "5823820ada8e3dca5f29452f301468e82f7d0d22", + "deliveryState": "52bdbbe0319268f803a67394a7e581002af1c9c1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/test/pay_kit/protocols/x402/server_exact_test.rb", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:ruby/test/pay_kit/protocols/x402/server_exact_test.rb", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "5823820ada8e3dca5f29452f301468e82f7d0d22", + "deliveryState": "52bdbbe0319268f803a67394a7e581002af1c9c1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:ruby/test/pay_kit/protocols/x402/server_exact_test.rb", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:ruby/test/pay_kit/protocols/x402/server_exact_test.rb", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "rust/Cargo.lock", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "5896be803ff1d5acafa3bd8fa0a770c2fbc9bf92", + "deliveryState": "748de45162d4ab2700ec75822b1705ece9dd3f00", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/Cargo.lock", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:rust/Cargo.lock", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "5896be803ff1d5acafa3bd8fa0a770c2fbc9bf92", + "deliveryState": "748de45162d4ab2700ec75822b1705ece9dd3f00", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/Cargo.lock", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:rust/Cargo.lock", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "rust/Cargo.toml", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/Cargo.toml is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/integration-tests/tests/charge_integration.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/integration-tests/tests/charge_integration.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/integration-tests/tests/settlement_onchain.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/integration-tests/tests/settlement_onchain.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/examples/golden_tx.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/examples/golden_tx.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/core/blockhash.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/core/blockhash.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/core/payment_channels.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/core/payment_channels.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/core/settlement/worker.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/core/settlement/worker.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/mpp/client/charge.rs", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "1ecdd387c64d44bd5137d1a5e24576985abd97a6", + "deliveryState": "2ee673c269dd03da91e4882136c1f64d06258c2e", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/mpp/client/charge.rs", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:rust/crates/kit/src/mpp/client/charge.rs", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "a8690fea64712a237ef6d1c8c94f0f26021f6882", + "sourceState": "1ecdd387c64d44bd5137d1a5e24576985abd97a6", + "deliveryState": "122033dcde57312eaeede742525a8a43e956bbfd", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/mpp/client/charge.rs", + "deliveryRef": "a8690fea64712a237ef6d1c8c94f0f26021f6882:rust/crates/kit/src/mpp/client/charge.rs", + "detail": "PR #227 (fix/rust-security-hardening) changes this path, but exact head a8690fea64712a237ef6d1c8c94f0f26021f6882 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "rust/crates/kit/src/mpp/client/subscription.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/mpp/client/subscription.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/mpp/error.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/mpp/error.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/mpp/protocol/core/headers.rs", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "e2fbbb7c98442d47b6407794c6d9077c9f07d1cf", + "deliveryState": "69bd339f07ff009ff83c5f1874bfefecb6abb9fe", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/mpp/protocol/core/headers.rs", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:rust/crates/kit/src/mpp/protocol/core/headers.rs", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "a8690fea64712a237ef6d1c8c94f0f26021f6882", + "sourceState": "e2fbbb7c98442d47b6407794c6d9077c9f07d1cf", + "deliveryState": "a23453d307a4077e91b4be6f9546c1ed4a79b105", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/mpp/protocol/core/headers.rs", + "deliveryRef": "a8690fea64712a237ef6d1c8c94f0f26021f6882:rust/crates/kit/src/mpp/protocol/core/headers.rs", + "detail": "PR #227 (fix/rust-security-hardening) changes this path, but exact head a8690fea64712a237ef6d1c8c94f0f26021f6882 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "rust/crates/kit/src/mpp/protocol/intents/session.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/mpp/protocol/intents/session.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/mpp/protocol/intents/subscription.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/mpp/protocol/intents/subscription.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/mpp/protocol/solana.rs", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "0f9b06a4bef69e09b2d46a22f73edb5f2d3c993e", + "deliveryState": "d2a409575cd17801f03042bce4b9ec6c9fe9d309", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/mpp/protocol/solana.rs", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:rust/crates/kit/src/mpp/protocol/solana.rs", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "a8690fea64712a237ef6d1c8c94f0f26021f6882", + "sourceState": "0f9b06a4bef69e09b2d46a22f73edb5f2d3c993e", + "deliveryState": "04ccf74dfeac17b6edce665cb3411ef1050f0a55", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/mpp/protocol/solana.rs", + "deliveryRef": "a8690fea64712a237ef6d1c8c94f0f26021f6882:rust/crates/kit/src/mpp/protocol/solana.rs", + "detail": "PR #227 (fix/rust-security-hardening) changes this path, but exact head a8690fea64712a237ef6d1c8c94f0f26021f6882 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "rust/crates/kit/src/mpp/server/authenticate.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/mpp/server/authenticate.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/mpp/server/charge.rs", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "535564da5d499b1d93e5028f4aca8af1d537a44b", + "deliveryState": "0f61146196abea1b3b00fccc0de3a16dca8c37f2", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/mpp/server/charge.rs", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:rust/crates/kit/src/mpp/server/charge.rs", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "a8690fea64712a237ef6d1c8c94f0f26021f6882", + "sourceState": "535564da5d499b1d93e5028f4aca8af1d537a44b", + "deliveryState": "a1e71e5ed4b8d2cc6bfb8b1b845219318124df0d", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/mpp/server/charge.rs", + "deliveryRef": "a8690fea64712a237ef6d1c8c94f0f26021f6882:rust/crates/kit/src/mpp/server/charge.rs", + "detail": "PR #227 (fix/rust-security-hardening) changes this path, but exact head a8690fea64712a237ef6d1c8c94f0f26021f6882 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "rust/crates/kit/src/mpp/server/session.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/mpp/server/session.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/mpp/server/subscription.rs", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "889d6500c85754d208136c60b1f5a924d021fecd", + "deliveryState": "0b6b27aa70801935ed34a60a6b044196614abfe1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/mpp/server/subscription.rs", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:rust/crates/kit/src/mpp/server/subscription.rs", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "a8690fea64712a237ef6d1c8c94f0f26021f6882", + "sourceState": "889d6500c85754d208136c60b1f5a924d021fecd", + "deliveryState": "89bfe6deb83515201f287beeac3be48fb958980e", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/mpp/server/subscription.rs", + "deliveryRef": "a8690fea64712a237ef6d1c8c94f0f26021f6882:rust/crates/kit/src/mpp/server/subscription.rs", + "detail": "PR #227 (fix/rust-security-hardening) changes this path, but exact head a8690fea64712a237ef6d1c8c94f0f26021f6882 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "rust/crates/kit/src/x402/client/batch_settlement/payment.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/x402/client/batch_settlement/payment.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/x402/client/upto/payment.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/x402/client/upto/payment.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/x402/error.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/x402/error.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/x402/protocol/schemes/batch_settlement/types.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/x402/protocol/schemes/batch_settlement/types.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/x402/protocol/schemes/exact/verify.rs", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "ac3590980cbb0eab13d79102e62c619f32ff7926", + "deliveryState": "c2d7e7eb9ac9d651e70fe6ad009dac1758707ef7", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/x402/protocol/schemes/exact/verify.rs", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:rust/crates/kit/src/x402/protocol/schemes/exact/verify.rs", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "a8690fea64712a237ef6d1c8c94f0f26021f6882", + "sourceState": "ac3590980cbb0eab13d79102e62c619f32ff7926", + "deliveryState": "f5d38be85ddc31eb7342fe00b85148dca5af8b2a", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/x402/protocol/schemes/exact/verify.rs", + "deliveryRef": "a8690fea64712a237ef6d1c8c94f0f26021f6882:rust/crates/kit/src/x402/protocol/schemes/exact/verify.rs", + "detail": "PR #227 (fix/rust-security-hardening) changes this path, but exact head a8690fea64712a237ef6d1c8c94f0f26021f6882 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "rust/crates/kit/src/x402/server/batch_settlement.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/x402/server/batch_settlement.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/x402/server/exact.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/x402/server/exact.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/x402/server/mock_rpc.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/x402/server/mock_rpc.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/x402/server/mod.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/x402/server/mod.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "rust/crates/kit/src/x402/server/upto.rs", + "bucket": "rust", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "4efe8f8ceefb1ee64bf471b7efb13118de04cacd", + "deliveryState": "9b1971f361870ce65edd491f494e4d6d03761e73", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/x402/server/upto.rs", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:rust/crates/kit/src/x402/server/upto.rs", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "a8690fea64712a237ef6d1c8c94f0f26021f6882", + "sourceState": "4efe8f8ceefb1ee64bf471b7efb13118de04cacd", + "deliveryState": "3d736d53f3b34db025c5e862d9808c9f59b60acc", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:rust/crates/kit/src/x402/server/upto.rs", + "deliveryRef": "a8690fea64712a237ef6d1c8c94f0f26021f6882:rust/crates/kit/src/x402/server/upto.rs", + "detail": "PR #227 (fix/rust-security-hardening) changes this path, but exact head a8690fea64712a237ef6d1c8c94f0f26021f6882 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "rust/crates/kit/src/x402/siwx.rs", + "bucket": "rust", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 227, + "branch": "fix/rust-security-hardening", + "deliveryCommit": "205b3d8", + "detail": "Source path rust/crates/kit/src/x402/siwx.rs is assigned to PR #227 at or beyond 205b3d8; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #227 / fix/rust-security-hardening", + "followUp": "Land PR #227, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "scripts/check-publish-workflow-guards.sh", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "09f9aeae627ee98918ebc6c540384d6fd70e4c50", + "deliveryState": "3d5609f4d9f10c0bd2f39e99c6bf791420bdff80", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:scripts/check-publish-workflow-guards.sh", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:scripts/check-publish-workflow-guards.sh", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052", + "sourceState": "09f9aeae627ee98918ebc6c540384d6fd70e4c50", + "deliveryState": "3d5609f4d9f10c0bd2f39e99c6bf791420bdff80", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:scripts/check-publish-workflow-guards.sh", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:scripts/check-publish-workflow-guards.sh", + "detail": "Current PR #233 branch fix/harness-adversarial-hardening at exact head 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; the source state remains superseded." + } + ] + }, + { + "path": "scripts/check-publish-workflow-guards_test.sh", + "bucket": "harness-ci", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "98c6b3ebf95f186e2e95ce2c117fa16832a2747a", + "deliveryState": "2e994630cf83156d6c72aabf9430941b3aaf3716", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:scripts/check-publish-workflow-guards_test.sh", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:scripts/check-publish-workflow-guards_test.sh", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052", + "sourceState": "98c6b3ebf95f186e2e95ce2c117fa16832a2747a", + "deliveryState": "2e994630cf83156d6c72aabf9430941b3aaf3716", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:scripts/check-publish-workflow-guards_test.sh", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:scripts/check-publish-workflow-guards_test.sh", + "detail": "Current PR #233 branch fix/harness-adversarial-hardening at exact head 71d62c4a5376ea6d520b05d0432b2a4a1ae69052 has a different tree state; the source state remains superseded." + } + ] + }, + { + "path": "scripts/check-repo-hygiene.sh", + "bucket": "harness-ci", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "d9815dc", + "detail": "Source path scripts/check-repo-hygiene.sh is assigned to PR #233 at or beyond d9815dc; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #233 / fix/harness-adversarial-hardening", + "followUp": "Land PR #233, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "scripts/check-repo-hygiene_test.sh", + "bucket": "harness-ci", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "d9815dc", + "detail": "Source path scripts/check-repo-hygiene_test.sh is assigned to PR #233 at or beyond d9815dc; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #233 / fix/harness-adversarial-hardening", + "followUp": "Land PR #233, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "skills/pay-sdk-implementation/codegen/generate-payment-channels-client-py.ts", + "bucket": "cross-sdk", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "0d19562cb7903763e7aab33064f6282a5da8256a", + "deliveryBlob": "0d19562cb7903763e7aab33064f6282a5da8256a", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:skills/pay-sdk-implementation/codegen/generate-payment-channels-client-py.ts", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:skills/pay-sdk-implementation/codegen/generate-payment-channels-client-py.ts", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "0d19562cb7903763e7aab33064f6282a5da8256a", + "deliveryBlob": "0d19562cb7903763e7aab33064f6282a5da8256a", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:skills/pay-sdk-implementation/codegen/generate-payment-channels-client-py.ts", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:skills/pay-sdk-implementation/codegen/generate-payment-channels-client-py.ts", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "skills/pay-sdk-implementation/codegen/package.json", + "bucket": "cross-sdk", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "d9815dc", + "detail": "Source path skills/pay-sdk-implementation/codegen/package.json is assigned to PR #233 at or beyond d9815dc; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #233 / fix/harness-adversarial-hardening", + "followUp": "Land PR #233, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "skills/pay-sdk-implementation/codegen/pnpm-workspace.yaml", + "bucket": "cross-sdk", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "5ed0b5af0d45919f64c66edfb16a5f4512461fa1", + "deliveryBlob": "5ed0b5af0d45919f64c66edfb16a5f4512461fa1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:skills/pay-sdk-implementation/codegen/pnpm-workspace.yaml", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:skills/pay-sdk-implementation/codegen/pnpm-workspace.yaml", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "5ed0b5af0d45919f64c66edfb16a5f4512461fa1", + "deliveryBlob": "5ed0b5af0d45919f64c66edfb16a5f4512461fa1", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:skills/pay-sdk-implementation/codegen/pnpm-workspace.yaml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:skills/pay-sdk-implementation/codegen/pnpm-workspace.yaml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "swift/Sources/mpp-conformance/main.swift", + "bucket": "swift", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "35503c4835929163356533454b341b1113d896f2", + "deliveryState": "f53d31741a86975b66d778b0c864f85eae92b044", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:swift/Sources/mpp-conformance/main.swift", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:swift/Sources/mpp-conformance/main.swift", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 231, + "branch": "fix/swift-conformance-hardening", + "deliveryCommit": "9ac7315a015af426698b885446222fe223957906", + "sourceState": "35503c4835929163356533454b341b1113d896f2", + "deliveryState": "9df6ea456a2e80d5f473eb6b8afd1106cc05332b", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:swift/Sources/mpp-conformance/main.swift", + "deliveryRef": "9ac7315a015af426698b885446222fe223957906:swift/Sources/mpp-conformance/main.swift", + "detail": "PR #231 (fix/swift-conformance-hardening) changes this path, but exact head 9ac7315a015af426698b885446222fe223957906 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "swift/Tests/SolanaPayKitTests/CoverageStubProtocols.swift", + "bucket": "swift", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 231, + "branch": "fix/swift-conformance-hardening", + "deliveryCommit": "63ca1c3", + "detail": "Source path swift/Tests/SolanaPayKitTests/CoverageStubProtocols.swift is assigned to PR #231 at or beyond 63ca1c3; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #231 / fix/swift-conformance-hardening", + "followUp": "Land PR #231, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "swift/Tests/SolanaPayKitTests/HttpClientPerformTests.swift", + "bucket": "swift", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 231, + "branch": "fix/swift-conformance-hardening", + "deliveryCommit": "63ca1c3", + "detail": "Source path swift/Tests/SolanaPayKitTests/HttpClientPerformTests.swift is assigned to PR #231 at or beyond 63ca1c3; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #231 / fix/swift-conformance-hardening", + "followUp": "Land PR #231, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "swift/Tests/SolanaPayKitTests/InstructionsTests.swift", + "bucket": "swift", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 231, + "branch": "fix/swift-conformance-hardening", + "deliveryCommit": "63ca1c3", + "detail": "Source path swift/Tests/SolanaPayKitTests/InstructionsTests.swift is assigned to PR #231 at or beyond 63ca1c3; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #231 / fix/swift-conformance-hardening", + "followUp": "Land PR #231, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "swift/Tests/SolanaPayKitTests/PayCoreEdgeCaseTests.swift", + "bucket": "swift", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 231, + "branch": "fix/swift-conformance-hardening", + "deliveryCommit": "63ca1c3", + "detail": "Source path swift/Tests/SolanaPayKitTests/PayCoreEdgeCaseTests.swift is assigned to PR #231 at or beyond 63ca1c3; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #231 / fix/swift-conformance-hardening", + "followUp": "Land PR #231, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "swift/Tests/SolanaPayKitTests/RpcClientTests.swift", + "bucket": "swift", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "f3ba7dba64196e3224500523c20dc8b0d40fc1f1", + "deliveryState": "absent", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:swift/Tests/SolanaPayKitTests/RpcClientTests.swift", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:swift/Tests/SolanaPayKitTests/RpcClientTests.swift", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 231, + "branch": "fix/swift-conformance-hardening", + "deliveryCommit": "9ac7315a015af426698b885446222fe223957906", + "sourceState": "f3ba7dba64196e3224500523c20dc8b0d40fc1f1", + "deliveryState": "659c72f3d2c0904613ea19ef132be38ee78243cf", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:swift/Tests/SolanaPayKitTests/RpcClientTests.swift", + "deliveryRef": "9ac7315a015af426698b885446222fe223957906:swift/Tests/SolanaPayKitTests/RpcClientTests.swift", + "detail": "PR #231 (fix/swift-conformance-hardening) changes this path, but exact head 9ac7315a015af426698b885446222fe223957906 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "swift/Tests/SolanaPayKitTests/TransactionCoverageTests.swift", + "bucket": "swift", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 231, + "branch": "fix/swift-conformance-hardening", + "deliveryCommit": "63ca1c3", + "detail": "Source path swift/Tests/SolanaPayKitTests/TransactionCoverageTests.swift is assigned to PR #231 at or beyond 63ca1c3; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #231 / fix/swift-conformance-hardening", + "followUp": "Land PR #231, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "swift/Tests/SolanaPayKitTests/X402TypesCoverageTests.swift", + "bucket": "swift", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 231, + "branch": "fix/swift-conformance-hardening", + "deliveryCommit": "63ca1c3", + "detail": "Source path swift/Tests/SolanaPayKitTests/X402TypesCoverageTests.swift is assigned to PR #231 at or beyond 63ca1c3; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #231 / fix/swift-conformance-hardening", + "followUp": "Land PR #231, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "swift/scripts/check_coverage.sh", + "bucket": "swift", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "02af0123b47a23a568506eef1852be36db9a75c3", + "deliveryState": "absent", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:swift/scripts/check_coverage.sh", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:swift/scripts/check_coverage.sh", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 231, + "branch": "fix/swift-conformance-hardening", + "deliveryCommit": "9ac7315a015af426698b885446222fe223957906", + "sourceState": "02af0123b47a23a568506eef1852be36db9a75c3", + "deliveryState": "d7baf6935e2d908a3583dd8e17b6ecaf84562e41", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:swift/scripts/check_coverage.sh", + "deliveryRef": "9ac7315a015af426698b885446222fe223957906:swift/scripts/check_coverage.sh", + "detail": "PR #231 (fix/swift-conformance-hardening) changes this path, but exact head 9ac7315a015af426698b885446222fe223957906 has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "typescript/package.json", + "bucket": "typescript", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "401b29a025906cb538cd6d54ac169200f91bd440", + "deliveryBlob": "401b29a025906cb538cd6d54ac169200f91bd440", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/package.json", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:typescript/package.json", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "401b29a025906cb538cd6d54ac169200f91bd440", + "deliveryBlob": "401b29a025906cb538cd6d54ac169200f91bd440", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/package.json", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:typescript/package.json", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "typescript/packages/mpp/solana-mpp-0.2.0.tgz", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "d9815dc", + "detail": "Source path typescript/packages/mpp/solana-mpp-0.2.0.tgz is assigned to PR #233 at or beyond d9815dc; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #233 / fix/harness-adversarial-hardening", + "followUp": "Land PR #233, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/solana-mpp-0.5.0.tgz", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "d9815dc", + "detail": "Source path typescript/packages/mpp/solana-mpp-0.5.0.tgz is assigned to PR #233 at or beyond d9815dc; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #233 / fix/harness-adversarial-hardening", + "followUp": "Land PR #233, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/challenge-guard-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/__tests__/challenge-guard-branches.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/challenge-guard-serialize.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/__tests__/challenge-guard-serialize.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/charge-client-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/__tests__/charge-client-branches.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/charge.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/__tests__/charge.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/mpp-cosign-verify-guards.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/__tests__/mpp-cosign-verify-guards.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/multi-delegate-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/__tests__/multi-delegate-branches.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/on-chain-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/__tests__/on-chain-branches.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/payment-channels-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/__tests__/payment-channels-branches.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/replay-reserve.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 237, + "branch": "fix/mpp-replay-store-hardening", + "deliveryCommit": "9bfd9e1", + "detail": "Source path typescript/packages/mpp/src/__tests__/replay-reserve.test.ts is assigned to PR #237 at or beyond 9bfd9e1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #237 / fix/mpp-replay-store-hardening", + "followUp": "Land PR #237, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/session-account-state.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path typescript/packages/mpp/src/__tests__/session-account-state.test.ts is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/session-fetch-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path typescript/packages/mpp/src/__tests__/session-fetch-branches.test.ts is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/session-lifecycle.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path typescript/packages/mpp/src/__tests__/session-lifecycle.test.ts is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/session-open-bind.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path typescript/packages/mpp/src/__tests__/session-open-bind.test.ts is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/session-server-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path typescript/packages/mpp/src/__tests__/session-server-branches.test.ts is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/session-server.test.ts", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "471aa96d5432772f9dfae93e8ae9daddb2a80f76", + "deliveryState": "477fa178237d26824145a50ddb6380967facfe49", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/mpp/src/__tests__/session-server.test.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:typescript/packages/mpp/src/__tests__/session-server.test.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "9931de0d56bd83b2fc48552537a9a30611c3927e", + "sourceState": "471aa96d5432772f9dfae93e8ae9daddb2a80f76", + "deliveryState": "cff438f9c7ce04f9d63b3297c1b925fbd9c38d9e", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/mpp/src/__tests__/session-server.test.ts", + "deliveryRef": "9931de0d56bd83b2fc48552537a9a30611c3927e:typescript/packages/mpp/src/__tests__/session-server.test.ts", + "detail": "PR #232 (fix/typescript-security-hardening) changes this path, but exact head 9931de0d56bd83b2fc48552537a9a30611c3927e has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "typescript/packages/mpp/src/__tests__/session-store-lock-eviction.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path typescript/packages/mpp/src/__tests__/session-store-lock-eviction.test.ts is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/session-topup-accountinfo.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path typescript/packages/mpp/src/__tests__/session-topup-accountinfo.test.ts is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/session-topup-verify.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path typescript/packages/mpp/src/__tests__/session-topup-verify.test.ts is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/session-voucher-reject-vector.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path typescript/packages/mpp/src/__tests__/session-voucher-reject-vector.test.ts is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/subscription-activation-ata.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 238, + "branch": "fix/mpp-subscription-hardening", + "deliveryCommit": "1865dfb", + "detail": "Source path typescript/packages/mpp/src/__tests__/subscription-activation-ata.test.ts is assigned to PR #238 at or beyond 1865dfb; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #238 / fix/mpp-subscription-hardening", + "followUp": "Land PR #238, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/subscription-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 238, + "branch": "fix/mpp-subscription-hardening", + "deliveryCommit": "1865dfb", + "detail": "Source path typescript/packages/mpp/src/__tests__/subscription-branches.test.ts is assigned to PR #238 at or beyond 1865dfb; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #238 / fix/mpp-subscription-hardening", + "followUp": "Land PR #238, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/subscription-client-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 238, + "branch": "fix/mpp-subscription-hardening", + "deliveryCommit": "1865dfb", + "detail": "Source path typescript/packages/mpp/src/__tests__/subscription-client-branches.test.ts is assigned to PR #238 at or beyond 1865dfb; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #238 / fix/mpp-subscription-hardening", + "followUp": "Land PR #238, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/subscription-client.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 238, + "branch": "fix/mpp-subscription-hardening", + "deliveryCommit": "1865dfb", + "detail": "Source path typescript/packages/mpp/src/__tests__/subscription-client.test.ts is assigned to PR #238 at or beyond 1865dfb; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #238 / fix/mpp-subscription-hardening", + "followUp": "Land PR #238, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/subscription-server.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 238, + "branch": "fix/mpp-subscription-hardening", + "deliveryCommit": "1865dfb", + "detail": "Source path typescript/packages/mpp/src/__tests__/subscription-server.test.ts is assigned to PR #238 at or beyond 1865dfb; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #238 / fix/mpp-subscription-hardening", + "followUp": "Land PR #238, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/__tests__/voucher-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/__tests__/voucher-branches.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/client/Subscription.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/client/Subscription.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/index.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/index.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/server/Charge.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/server/Charge.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/server/Session.ts", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "10aec0eb49f55a170ffb7dbed93dbbbde72246d7", + "deliveryState": "74f251bb079a7e851473a0069872e88d547a7115", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/mpp/src/server/Session.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:typescript/packages/mpp/src/server/Session.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "9931de0d56bd83b2fc48552537a9a30611c3927e", + "sourceState": "10aec0eb49f55a170ffb7dbed93dbbbde72246d7", + "deliveryState": "9c958233511b300b4f6b81dc7c7b54ac31e394c4", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/mpp/src/server/Session.ts", + "deliveryRef": "9931de0d56bd83b2fc48552537a9a30611c3927e:typescript/packages/mpp/src/server/Session.ts", + "detail": "PR #232 (fix/typescript-security-hardening) changes this path, but exact head 9931de0d56bd83b2fc48552537a9a30611c3927e has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "typescript/packages/mpp/src/server/Subscription.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/server/Subscription.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/server/index.ts", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "6afbe6cf3c585134f861d42d3637e50459447033", + "deliveryState": "70e05e13b84d644e63636f192ee4ca6f6199b683", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/mpp/src/server/index.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:typescript/packages/mpp/src/server/index.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceState": "6afbe6cf3c585134f861d42d3637e50459447033", + "deliveryState": "70e05e13b84d644e63636f192ee4ca6f6199b683", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/mpp/src/server/index.ts", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:typescript/packages/mpp/src/server/index.ts", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "typescript/packages/mpp/src/server/replayReserve.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 237, + "branch": "fix/mpp-replay-store-hardening", + "deliveryCommit": "9bfd9e1", + "detail": "Source path typescript/packages/mpp/src/server/replayReserve.ts is assigned to PR #237 at or beyond 9bfd9e1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #237 / fix/mpp-replay-store-hardening", + "followUp": "Land PR #237, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/server/session/on-chain.ts", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "89c9ec623cfde6665a41f24e51ae5628f68f3e30", + "deliveryState": "115c18bc834a989dcef8b0060764158af1303c9c", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/mpp/src/server/session/on-chain.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:typescript/packages/mpp/src/server/session/on-chain.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "9931de0d56bd83b2fc48552537a9a30611c3927e", + "sourceState": "89c9ec623cfde6665a41f24e51ae5628f68f3e30", + "deliveryState": "fa73994d4335f1f32bd493ac29b52a4d578fd2e0", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/mpp/src/server/session/on-chain.ts", + "deliveryRef": "9931de0d56bd83b2fc48552537a9a30611c3927e:typescript/packages/mpp/src/server/session/on-chain.ts", + "detail": "PR #232 (fix/typescript-security-hardening) changes this path, but exact head 9931de0d56bd83b2fc48552537a9a30611c3927e has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "typescript/packages/mpp/src/server/session/store.ts", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "7c7d387d1db47a451a1526107ca4e487c915545e", + "deliveryState": "a6f9599feb1ac931e6263ab7fa512f400fb8a922", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/mpp/src/server/session/store.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:typescript/packages/mpp/src/server/session/store.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "9931de0d56bd83b2fc48552537a9a30611c3927e", + "sourceState": "7c7d387d1db47a451a1526107ca4e487c915545e", + "deliveryState": "4a69ad036a356d4f903eff855fd7452518b7d0cf", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/mpp/src/server/session/store.ts", + "deliveryRef": "9931de0d56bd83b2fc48552537a9a30611c3927e:typescript/packages/mpp/src/server/session/store.ts", + "detail": "PR #232 (fix/typescript-security-hardening) changes this path, but exact head 9931de0d56bd83b2fc48552537a9a30611c3927e has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "typescript/packages/mpp/src/shared/challenge-guard.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/shared/challenge-guard.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/mpp/src/utils/transactions.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/mpp/src/utils/transactions.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/config-replay-x402.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 237, + "branch": "fix/mpp-replay-store-hardening", + "deliveryCommit": "9bfd9e1", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/config-replay-x402.test.ts is assigned to PR #237 at or beyond 9bfd9e1; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #237 / fix/mpp-replay-store-hardening", + "followUp": "Land PR #237, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/config.test.ts", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "8eabbcdf4d83831be23279b1b85066285a38f33a", + "deliveryState": "bfd2251dda0aa3eb7e8ccde41fa53d97a2643074", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/pay-kit/src/__tests__/config.test.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:typescript/packages/pay-kit/src/__tests__/config.test.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "9931de0d56bd83b2fc48552537a9a30611c3927e", + "sourceState": "8eabbcdf4d83831be23279b1b85066285a38f33a", + "deliveryState": "69030b3e545fab336e797f360502c3d02e664adf", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/pay-kit/src/__tests__/config.test.ts", + "deliveryRef": "9931de0d56bd83b2fc48552537a9a30611c3927e:typescript/packages/pay-kit/src/__tests__/config.test.ts", + "detail": "PR #232 (fix/typescript-security-hardening) changes this path, but exact head 9931de0d56bd83b2fc48552537a9a30611c3927e has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/errors.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/errors.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/express-routes.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/express-routes.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/mpp-adapter-settle.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/mpp-adapter-settle.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/mpp-adapter.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/mpp-adapter.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/mpp-session.test.ts", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "40a5c897cfc1230f0e05464f54b3cb74bd5e7df2", + "deliveryState": "absent", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/pay-kit/src/__tests__/mpp-session.test.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:typescript/packages/pay-kit/src/__tests__/mpp-session.test.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "9931de0d56bd83b2fc48552537a9a30611c3927e", + "sourceState": "40a5c897cfc1230f0e05464f54b3cb74bd5e7df2", + "deliveryState": "b875afbdd6775f29e2be078433d20839bd5da8b3", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/pay-kit/src/__tests__/mpp-session.test.ts", + "deliveryRef": "9931de0d56bd83b2fc48552537a9a30611c3927e:typescript/packages/pay-kit/src/__tests__/mpp-session.test.ts", + "detail": "PR #232 (fix/typescript-security-hardening) changes this path, but exact head 9931de0d56bd83b2fc48552537a9a30611c3927e has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/paykit-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/paykit-branches.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/paykit-usage-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/paykit-usage-branches.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/protocol.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/protocol.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/repo-hygiene.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 233, + "branch": "fix/harness-adversarial-hardening", + "deliveryCommit": "d9815dc", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/repo-hygiene.test.ts is assigned to PR #233 at or beyond d9815dc; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #233 / fix/harness-adversarial-hardening", + "followUp": "Land PR #233, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/session.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 239, + "branch": "fix/mpp-session-state-hardening", + "deliveryCommit": "34e7456", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/session.test.ts is assigned to PR #239 at or beyond 34e7456; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #239 / fix/mpp-session-state-hardening", + "followUp": "Land PR #239, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/small-modules-branches.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/small-modules-branches.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/x402-adapter.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/x402-adapter.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/x402-shared.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/x402-shared.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/x402-upto-blockhash-cache.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/x402-upto-blockhash-cache.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/__tests__/x402-upto-engine.test.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/__tests__/x402-upto-engine.test.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/adapters/mpp.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/adapters/mpp.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/adapters/x402-shared.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/adapters/x402-shared.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/adapters/x402-upto.ts", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "4e771e05f5b1d4bebb7dc1193524f3cad4d8b974", + "deliveryState": "a6ba01eae6fd94e680dcb60edf12cff06ef3dedb", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/pay-kit/src/adapters/x402-upto.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:typescript/packages/pay-kit/src/adapters/x402-upto.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "9931de0d56bd83b2fc48552537a9a30611c3927e", + "sourceState": "4e771e05f5b1d4bebb7dc1193524f3cad4d8b974", + "deliveryState": "fbea74dccd54005cfc927358215f47088c53219e", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/pay-kit/src/adapters/x402-upto.ts", + "deliveryRef": "9931de0d56bd83b2fc48552537a9a30611c3927e:typescript/packages/pay-kit/src/adapters/x402-upto.ts", + "detail": "PR #232 (fix/typescript-security-hardening) changes this path, but exact head 9931de0d56bd83b2fc48552537a9a30611c3927e has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "typescript/packages/pay-kit/src/adapters/x402.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/packages/pay-kit/src/adapters/x402.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + }, + { + "path": "typescript/packages/pay-kit/src/config.ts", + "bucket": "typescript", + "status": "superseded", + "evidence": [ + { + "kind": "current-delivery-tree-state", + "sourceState": "f7ad3709c234a058cec2cc6cfdb1802fc7a58b53", + "deliveryState": "74c8a15eb704452308f6db51976ae956d088ab14", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/pay-kit/src/config.ts", + "deliveryRef": "71d62c4a5376ea6d520b05d0432b2a4a1ae69052:typescript/packages/pay-kit/src/config.ts", + "detail": "The current #233 delivery baseline differs from the authoritative source tree state, confirming the source state remains superseded." + }, + { + "kind": "delivery-tree-replacement", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "9931de0d56bd83b2fc48552537a9a30611c3927e", + "sourceState": "f7ad3709c234a058cec2cc6cfdb1802fc7a58b53", + "deliveryState": "fa80c506e53c3e36be67698ca278fef1cde236fa", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/packages/pay-kit/src/config.ts", + "deliveryRef": "9931de0d56bd83b2fc48552537a9a30611c3927e:typescript/packages/pay-kit/src/config.ts", + "detail": "PR #232 (fix/typescript-security-hardening) changes this path, but exact head 9931de0d56bd83b2fc48552537a9a30611c3927e has a different tree state; the source file state is superseded rather than claimed integrated." + } + ] + }, + { + "path": "typescript/pnpm-workspace.yaml", + "bucket": "typescript", + "status": "integrated", + "evidence": [ + { + "kind": "identical-tree-entry", + "sourceBlob": "7ef901638d1f40c7361aa2b81d0ad25f81ea5d6f", + "deliveryBlob": "7ef901638d1f40c7361aa2b81d0ad25f81ea5d6f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/pnpm-workspace.yaml", + "deliveryRef": "be4bc4746fa3b2f1242d15da63e6f10ff935a1ec:typescript/pnpm-workspace.yaml", + "detail": "The authoritative source-tip and current #233 delivery-baseline blobs are identical; integration is established by exact object identity." + }, + { + "kind": "merged-stacked-base-tree-entry", + "pr": 219, + "branch": "split/pr216-ci-harness-mega", + "deliveryCommit": "9e38dea31788d5aa52770b7da23fea7e64af122b", + "sourceBlob": "7ef901638d1f40c7361aa2b81d0ad25f81ea5d6f", + "deliveryBlob": "7ef901638d1f40c7361aa2b81d0ad25f81ea5d6f", + "sourceRef": "45ad8c9acd7a71d4dd12b87321a9902c71fef865:typescript/pnpm-workspace.yaml", + "deliveryRef": "9e38dea31788d5aa52770b7da23fea7e64af122b:typescript/pnpm-workspace.yaml", + "detail": "Stacked base #219 commit 9e38dea31788d5aa52770b7da23fea7e64af122b is merged into the current #233 delivery history; this evidence records its exact source-tree state at that immutable commit." + } + ] + }, + { + "path": "typescript/vitest.config.ci.ts", + "bucket": "typescript", + "status": "open_pr", + "evidence": [ + { + "kind": "open-delivery-head", + "pr": 232, + "branch": "fix/typescript-security-hardening", + "deliveryCommit": "74d4d99", + "detail": "Source path typescript/vitest.config.ci.ts is assigned to PR #232 at or beyond 74d4d99; merge-time validation must replace this open evidence with exact integrated tree evidence." + } + ], + "owner": "PR #232 / fix/typescript-security-hardening", + "followUp": "Land PR #232, then revalidate semantic and exact tree-state delivery on #219." + } + ] +} diff --git a/.github/workflows/harness.yml b/.github/workflows/harness.yml index 96a310651..99e1d053a 100644 --- a/.github/workflows/harness.yml +++ b/.github/workflows/harness.yml @@ -142,8 +142,8 @@ jobs: - name: Checkout payment channels program uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: - repository: Moonsong-Labs/solana-payment-channels - ref: d1dee6b34d45d4e4a1ed3174ef421ca2e801aaea + repository: solana-foundation/payment-channels + ref: 0c07d5751c8972abf6a219570a3f39a72f46f879 path: _payment-channels fetch-depth: 1 # Pinned Agave release, fetched as a tarball and checksum-verified. @@ -235,10 +235,14 @@ jobs: fi pnpm exec vitest run test/e2e.test.ts --testTimeout 180000 --reporter=default --reporter=json --outputFile=vitest-report.json node scripts/assert-run-count.mjs --report vitest-report.json --exact 1 - - name: Focused Python session missing-ATA rejection + - name: Focused Python session missing-ATA settlement invariant (deliver-or-reject) working-directory: harness - # This regression is blocking: a successful response must never hide a - # settlement that delivered no funds because the recipient ATA was absent. + # Blocking (no continue-on-error): a settle reported successful + # (200 + settledSignature) MUST deliver the payout to the recipient ATA, + # creating it idempotently when absent. A clean rejection (>= 400, no + # receipt surfaced, no delivery) is equally acceptable. The only failure + # is the false-paid condition — a confirmed receipt with no on-chain + # delivery — which #216 fixed and this leg keeps release-blocking. env: MPP_HARNESS_INTENTS: session MPP_HARNESS_SCENARIOS: session-basic diff --git a/.github/workflows/lua.yml b/.github/workflows/lua.yml index 146401f64..5ad182745 100644 --- a/.github/workflows/lua.yml +++ b/.github/workflows/lua.yml @@ -12,6 +12,7 @@ jobs: test-lua: name: Lua tests runs-on: ubuntu-latest + timeout-minutes: 30 steps: - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 diff --git a/.github/workflows/pr-routing.yml b/.github/workflows/pr-routing.yml index 48fe873fe..294207681 100644 --- a/.github/workflows/pr-routing.yml +++ b/.github/workflows/pr-routing.yml @@ -24,6 +24,7 @@ jobs: swift: ${{ steps.select.outputs.swift }} kotlin: ${{ steps.select.outputs.kotlin }} harness: ${{ steps.select.outputs.harness }} + docs_only: ${{ steps.select.outputs.docs_only }} steps: - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: @@ -40,7 +41,9 @@ jobs: node-version: 22 package-manager-cache: false - name: Test path classifier - run: node scripts/select-pr-workflows_test.mjs + run: | + node scripts/select-pr-workflows_test.mjs + node scripts/verify-routed-sdk-gate_test.mjs - id: select name: Select SDK workflows run: | @@ -49,7 +52,7 @@ jobs: echo "::error::PR verification router requires a synthetic merge commit with a base parent" exit 1 fi - git diff --name-only HEAD^1 HEAD | \ + git diff --no-renames --name-only HEAD^1 HEAD | \ node scripts/select-pr-workflows.mjs --github-output "$GITHUB_OUTPUT" go: @@ -122,37 +125,8 @@ jobs: needs: [classify, core, go, go_consumer, python, ruby, lua, php, swift, kotlin, harness] runs-on: ubuntu-latest steps: + - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - name: Require every selected workflow to pass env: NEEDS: ${{ toJSON(needs) }} - run: | - node <<'NODE' - const needs = JSON.parse(process.env.NEEDS); - if (needs.classify.result !== "success") { - throw new Error(`classifier did not pass: ${needs.classify.result}`); - } - - const selected = needs.classify.outputs; - const required = { - typescript: ["core"], - rust: ["core"], - go: ["go", "go_consumer"], - python: ["python"], - ruby: ["ruby"], - lua: ["lua"], - php: ["php"], - swift: ["swift"], - kotlin: ["kotlin"], - harness: ["core", "harness"], - }; - - for (const [surface, jobs] of Object.entries(required)) { - if (selected[surface] !== "true") continue; - for (const job of jobs) { - if (needs[job].result !== "success") { - throw new Error(`${surface} selected ${job}, which finished ${needs[job].result}`); - } - } - } - console.log("all selected SDK workflows passed"); - NODE + run: node scripts/verify-routed-sdk-gate.mjs diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index fafa89539..00c3f0a63 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -91,7 +91,7 @@ jobs: - name: Checkout payment channels program uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 with: - repository: Moonsong-Labs/solana-payment-channels + repository: solana-foundation/payment-channels ref: 0c07d5751c8972abf6a219570a3f39a72f46f879 path: _payment-channels fetch-depth: 1 diff --git a/.github/workflows/release-gate.yml b/.github/workflows/release-gate.yml index 0d3cdfc62..661321eae 100644 --- a/.github/workflows/release-gate.yml +++ b/.github/workflows/release-gate.yml @@ -62,10 +62,14 @@ jobs: uses: ./.github/workflows/kotlin.yml secrets: inherit + semgrep: + name: Semgrep + uses: ./.github/workflows/semgrep.yml + gate: name: All release gates green runs-on: ubuntu-latest - needs: [ci, harness, go, go-consumer, python, ruby, lua, php, swift, kotlin] + needs: [ci, harness, go, go-consumer, python, ruby, lua, php, swift, kotlin, semgrep] steps: - name: Confirm run: echo "core CI, harness, on-chain legs, and every SDK matrix passed" diff --git a/.github/workflows/semgrep.yml b/.github/workflows/semgrep.yml index a1e25e768..6128f4e65 100644 --- a/.github/workflows/semgrep.yml +++ b/.github/workflows/semgrep.yml @@ -8,10 +8,8 @@ name: Semgrep (radar L7) # - self-test: every *.bad.* fixture MUST fire, every *.good.* MUST stay clean # - scan: run the ruleset over the real source tree (typescript/, go/, python/) # -# The scan step is advisory (does not fail the build) so a newly surfaced, -# to-be-triaged finding doesn't block unrelated PRs. The self-test step IS -# blocking: it guarantees the rules keep catching their known-bad and stay quiet -# on their known-good. Flip `continue-on-error` off once the tree is clean. +# Every source scan is blocking. A security-rule finding is either a real +# regression or a rule-quality defect that must be resolved before merge. on: push: @@ -29,16 +27,8 @@ jobs: steps: - uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 - - uses: actions/setup-python@v5 - with: - python-version: '3.12' - - - name: Install semgrep - run: pip install semgrep==1.168.0 - - name: Self-test rules against fixtures (blocking) - run: bash harness/semgrep/run.sh --test + run: docker run --rm -v "$PWD:/src" -w /src semgrep/semgrep@sha256:59fbed6127ea7c5dde3ba6a85142733bb20ea9aaa36120c953904f1539aaf66e bash harness/semgrep/run.sh --test - - name: Scan real source (advisory) - continue-on-error: true - run: bash harness/semgrep/run.sh typescript go python + - name: Scan real source (blocking) + run: docker run --rm -e SEMGREP_ERROR_ON_FINDINGS=1 -v "$PWD:/src" -w /src semgrep/semgrep@sha256:59fbed6127ea7c5dde3ba6a85142733bb20ea9aaa36120c953904f1539aaf66e bash harness/semgrep/run.sh typescript go python diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..39dfbe9c9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,24 @@ +# Contributing + +## Pull request scope + +Keep changes reviewable and independently green. Use one pull request per language when a coherent SDK feature or refactor is language-owned. Use one pull request per protocol flaw when the same invariant must change in multiple SDKs, for example `fix(upto): bind settlement amounts in Ruby and TypeScript`. + +Stacked pull requests must name their base and merge order. Do not mix unrelated language cleanup, protocol security changes, generated artifacts, and CI infrastructure solely to reduce the number of pull requests. + +## Verification + +Run the focused SDK tests, lint, typecheck, format, coverage, and owned harness legs before requesting review. Changes to shared vectors, schemas, routing, or harness infrastructure must run the full matrix; unknown paths deliberately fall back to full verification. + +Security guards need an adversarial reject case that executes the real verifier, plus a valid accept case proving the guard is not over-broad. A declared verifier mode without both outcomes is treated as untested. + +## Large pull requests and Greptile + +Greptile may skip diffs above its 100-file review ceiling. Prefer splitting those changes by language or protocol. When a large mechanical migration cannot be split safely: + +1. Separate and document the mechanical and semantic portions of the diff. +2. Keep the exact head green and resolve human review findings first. +3. Post `@greptile-apps please review` once on the meaningful final head. +4. Record the reviewed head commit in the pull request description; request another review only after a semantic change. + +This bypass is review friction, not a substitute for focused tests, the full integration matrix, or maintainer approval. diff --git a/harness/package.json b/harness/package.json index 3dbe7bacb..34372452f 100644 --- a/harness/package.json +++ b/harness/package.json @@ -25,6 +25,7 @@ "express": "^4.21.0", "tsx": "^4.19.2", "typescript": "^5.9.3", - "vitest": "^4.1.0" + "vitest": "^4.1.0", + "yaml": "^2.8.3" } } diff --git a/harness/pnpm-lock.yaml b/harness/pnpm-lock.yaml index 29aba6ca4..cb5e1464d 100644 --- a/harness/pnpm-lock.yaml +++ b/harness/pnpm-lock.yaml @@ -51,6 +51,9 @@ importers: vitest: specifier: ^4.1.0 version: 4.1.5(@types/node@25.6.0)(vite@8.0.10(@types/node@25.6.0)(esbuild@0.27.7)(tsx@4.21.0)(yaml@2.8.3)) + yaml: + specifier: ^2.8.3 + version: 2.8.3 packages: diff --git a/harness/runners/go.json b/harness/runners/go.json index 6fb39fa98..0fa24fd34 100644 --- a/harness/runners/go.json +++ b/harness/runners/go.json @@ -2,5 +2,10 @@ "language": "go", "command": ["go", "run", "./cmd/conformance"], "cwd": "go", - "intents": ["charge", "x402-exact", "session"] + "intents": ["charge", "x402-exact", "session"], + "modesByIntent": { + "charge": ["canonical-bytes"], + "session": ["canonical-bytes"], + "x402-exact": ["verify-x402-transaction"] + } } diff --git a/harness/runners/kotlin.json b/harness/runners/kotlin.json index 2229028ef..e06ec5db8 100644 --- a/harness/runners/kotlin.json +++ b/harness/runners/kotlin.json @@ -2,5 +2,9 @@ "language": "kotlin", "command": ["sh", "-c", "exec build/install/mpp-kotlin-conformance/bin/mpp-kotlin-conformance"], "cwd": "harness/kotlin-conformance", - "intents": ["session"] + "intents": ["charge", "session"], + "modesByIntent": { + "charge": ["canonical-bytes"], + "session": ["canonical-bytes"] + } } diff --git a/harness/runners/lua.json b/harness/runners/lua.json index 32bb1bb6c..83152bfb4 100644 --- a/harness/runners/lua.json +++ b/harness/runners/lua.json @@ -1,5 +1,10 @@ { "language": "lua", "command": ["luajit", "cmd/conformance/main.lua"], - "cwd": "lua" + "cwd": "lua", + "intents": ["charge", "x402-exact"], + "modesByIntent": { + "charge": ["canonical-bytes"], + "x402-exact": ["verify-x402-transaction"] + } } diff --git a/harness/runners/php.json b/harness/runners/php.json index d7b3a4e97..1f126a76d 100644 --- a/harness/runners/php.json +++ b/harness/runners/php.json @@ -1,5 +1,10 @@ { "language": "php", "command": ["php", "conformance/runner.php"], - "cwd": "php" + "cwd": "php", + "intents": ["charge", "x402-exact"], + "modesByIntent": { + "charge": ["canonical-bytes"], + "x402-exact": ["verify-x402-transaction"] + } } diff --git a/harness/runners/python.json b/harness/runners/python.json index fe3f2522a..9885c92a6 100644 --- a/harness/runners/python.json +++ b/harness/runners/python.json @@ -2,5 +2,10 @@ "language": "python", "command": ["uv", "run", "python", "conformance_runner.py"], "cwd": "python", - "intents": ["charge", "x402-exact", "session"] + "intents": ["charge", "x402-exact", "session"], + "modesByIntent": { + "charge": ["canonical-bytes"], + "x402-exact": ["verify-x402-transaction"], + "session": ["canonical-bytes"] + } } diff --git a/harness/runners/ruby.json b/harness/runners/ruby.json index 71ccd76c1..f19cda1b6 100644 --- a/harness/runners/ruby.json +++ b/harness/runners/ruby.json @@ -1,5 +1,10 @@ { "language": "ruby", "command": ["bundle", "exec", "ruby", "exe/conformance"], - "cwd": "ruby" + "cwd": "ruby", + "intents": ["charge", "x402-exact"], + "modesByIntent": { + "charge": ["canonical-bytes"], + "x402-exact": ["verify-x402-transaction"] + } } diff --git a/harness/runners/rust.json b/harness/runners/rust.json index c2180daec..ae578ea9e 100644 --- a/harness/runners/rust.json +++ b/harness/runners/rust.json @@ -2,5 +2,12 @@ "language": "rust", "command": ["bash", "-lc", "if [ -x target/debug/examples/conformance_runner ]; then exec target/debug/examples/conformance_runner; fi; exec cargo run -q -p solana-pay-kit --example conformance_runner --features x402,client"], "cwd": "rust", - "intents": ["x402-exact"] + "intents": ["charge", "x402-exact"], + "modesByIntent": { + "charge": ["canonical-bytes"], + "x402-exact": ["build-transaction", "verify-transaction", "verify-x402-transaction"] + }, + "strictModesByIntent": { + "x402-exact": ["verify-transaction", "verify-x402-transaction"] + } } diff --git a/harness/runners/swift.json b/harness/runners/swift.json index 6f1c7f1a4..5355b3982 100644 --- a/harness/runners/swift.json +++ b/harness/runners/swift.json @@ -2,5 +2,10 @@ "language": "swift", "command": ["swift", "run", "-c", "release", "mpp-conformance"], "cwd": "swift", - "intents": ["charge", "x402-exact", "session"] + "intents": ["charge", "x402-exact", "session"], + "modesByIntent": { + "charge": ["canonical-bytes"], + "x402-exact": ["verify-x402-transaction"], + "session": ["canonical-bytes"] + } } diff --git a/harness/runners/typescript.json b/harness/runners/typescript.json index b065982a6..57064f10d 100644 --- a/harness/runners/typescript.json +++ b/harness/runners/typescript.json @@ -1,5 +1,10 @@ { "language": "typescript", "command": ["pnpm", "exec", "node", "--import", "tsx", "src/conformance/ts-runner.ts"], - "cwd": "harness" + "cwd": "harness", + "intents": ["charge", "x402-exact"], + "modesByIntent": { + "charge": ["canonical-bytes"], + "x402-exact": ["verify-x402-transaction"] + } } diff --git a/harness/scripts/assert-run-count.mjs b/harness/scripts/assert-run-count.mjs index 3e645dd6e..e9031f77d 100644 --- a/harness/scripts/assert-run-count.mjs +++ b/harness/scripts/assert-run-count.mjs @@ -12,7 +12,7 @@ // actually EXECUTED does not match the leg's pinned expectation. // // Usage: -// node scripts/assert-run-count.mjs --report --min [--exact ] +// node scripts/assert-run-count.mjs --report --min [--exact ] [--all] // // `--min` is the floor (must be >= 1). `--exact`, when given, pins the count to // an exact value so a leg's selected pair count cannot silently drift. A @@ -23,7 +23,7 @@ import { readFileSync } from "node:fs"; function parseArgs(argv) { - const args = { report: undefined, min: undefined, exact: undefined }; + const args = { report: undefined, min: undefined, exact: undefined, all: false }; for (let i = 0; i < argv.length; i += 1) { const arg = argv[i]; if (arg === "--report") { @@ -38,6 +38,8 @@ function parseArgs(argv) { args.min = Number(arg.slice("--min=".length)); } else if (arg.startsWith("--exact=")) { args.exact = Number(arg.slice("--exact=".length)); + } else if (arg === "--all") { + args.all = true; } else { throw new Error(`Unknown argument: ${arg}`); } @@ -90,47 +92,48 @@ function main() { ); } - let executedPairs = 0; - let skippedPairs = 0; + let executed = 0; + let skipped = 0; for (const file of report.testResults ?? []) { for (const assertion of file.assertionResults ?? []) { - if (!isPairTitle(assertion.title)) { + if (!args.all && !isPairTitle(assertion.title)) { continue; } if (assertion.status === "passed") { - executedPairs += 1; + executed += 1; } else if (assertion.status === "skipped" || assertion.status === "pending") { - skippedPairs += 1; + skipped += 1; } } } - if (executedPairs === 0) { + const subject = args.all ? "test assertion(s)" : "settlement pair-tests"; + if (executed === 0) { throw new Error( - `Zero settlement pair-tests EXECUTED in this leg (report ${args.report}; ` + - `${skippedPairs} pair-test(s) were skipped/filtered). A leg that asserts no ` + + `Zero ${subject} EXECUTED in this leg (report ${args.report}; ` + + `${skipped} ${subject} were skipped/filtered). A leg that asserts no ` + "settlement is a false green: check the MPP_HARNESS_*/X402_HARNESS_* selectors.", ); } - if (args.exact !== undefined && executedPairs !== args.exact) { + if (args.exact !== undefined && executed !== args.exact) { throw new Error( - `Expected exactly ${args.exact} settlement pair-test(s) to execute in this ` + - `leg but ${executedPairs} did (report ${args.report}). The leg's pinned pair ` + + `Expected exactly ${args.exact} ${subject} to execute in this ` + + `leg but ${executed} did (report ${args.report}). The leg's pinned count ` + "count drifted: update the workflow's --exact value or fix the selectors.", ); } - if (args.exact === undefined && executedPairs < min) { + if (args.exact === undefined && executed < min) { throw new Error( - `Expected at least ${min} settlement pair-test(s) to execute in this leg but ` + - `only ${executedPairs} did (report ${args.report}).`, + `Expected at least ${min} ${subject} to execute in this leg but ` + + `only ${executed} did (report ${args.report}).`, ); } const bound = args.exact !== undefined ? `exactly ${args.exact}` : `>= ${min}`; console.log( - `[assert-run-count] ${executedPairs} settlement pair-test(s) executed (${bound}). OK.`, + `[assert-run-count] ${executed} ${subject} executed (${bound}). OK.`, ); } diff --git a/harness/semgrep/fixtures/compare-catch/compare.good.ts b/harness/semgrep/fixtures/compare-catch/compare.good.ts index a6a5ed706..8172f1c4c 100644 --- a/harness/semgrep/fixtures/compare-catch/compare.good.ts +++ b/harness/semgrep/fixtures/compare-catch/compare.good.ts @@ -16,3 +16,11 @@ function checkMac(payload: string, secretKey: string, providedMac: string): bool function isReplayOfVoucher(highestVoucherSignature: string, incoming: string): boolean { return highestVoucherSignature === incoming; } + +// A typeof guard on secret config material is a type check, not a byte +// comparison — it must never be flagged as a non-constant-time compare. +function validateChallengeBindingSecret(secret: unknown): asserts secret is string { + if (typeof secret !== 'string' || secret.length === 0) { + throw new Error('challengeBindingSecret must be a non-empty string.'); + } +} diff --git a/harness/semgrep/fixtures/failopen/store.good.go b/harness/semgrep/fixtures/failopen/store.good.go index c9f21178c..aa17794c8 100644 --- a/harness/semgrep/fixtures/failopen/store.good.go +++ b/harness/semgrep/fixtures/failopen/store.good.go @@ -3,7 +3,10 @@ package server // GOOD: a shared/persistent store is REQUIRED. No silent in-memory fallback — // mis-configuration fails CLOSED (error) rather than fanning out per-process. -import "errors" +import ( + "errors" + "os" +) type Config struct { Store SessionStore @@ -22,3 +25,38 @@ func newSingleProcessMethod() *Method { store := NewMemoryChannelStore() return &Method{store: store} } + +// GOOD: a local-memory fallback may exist only behind a concrete off-localnet +// rejection and a deliberate environment opt-in. +func newGuardedMethod(options Options, network string) (*Method, error) { + store := options.Store + usesMemoryStore := false + if store != nil { + _, usesMemoryStore = store.(*MemoryChannelStore) + } + if network != "localnet" && (store == nil || usesMemoryStore) && os.Getenv("ALLOW_MEMORY") != "1" { + return nil, errors.New("shared SessionStore required") + } + if store == nil { + store = NewMemoryChannelStore() + } + return &Method{store: store}, nil +} + +// GOOD: callers may combine an explicit option with an environment override +// before the fail-closed branch, rather than repeating os.Getenv in it. +func newGuardedMethodWithOption(options Options, network string) (*Method, error) { + store := options.Store + allowUnsafe := options.AllowUnsafe || os.Getenv("ALLOW_MEMORY") == "1" + usesMemoryStore := false + if store != nil { + _, usesMemoryStore = store.(*MemoryChannelStore) + } + if network != "localnet" && (store == nil || usesMemoryStore) && !allowUnsafe { + return nil, errors.New("shared SessionStore required") + } + if store == nil { + store = NewMemoryChannelStore() + } + return &Method{store: store}, nil +} diff --git a/harness/semgrep/fixtures/failopen/store.good.py b/harness/semgrep/fixtures/failopen/store.good.py index 29e3263df..8a2ff5454 100644 --- a/harness/semgrep/fixtures/failopen/store.good.py +++ b/harness/semgrep/fixtures/failopen/store.good.py @@ -13,3 +13,18 @@ def build_explicit_single_process(config): raise ValueError("memory store requires explicit single-process opt-in") explicit_single_process_store = MemoryStore() return explicit_single_process_store + + +def build_guarded(config, is_localnet): + uses_memory_store = config.store is None or isinstance(config.store, MemoryStore) + if uses_memory_store and not is_localnet and os.getenv("ALLOW_MEMORY") != "1": + raise ValueError("shared store required") + store = config.store if config.store is not None else MemoryStore() + return store + + +def build_guarded_absence(config, network): + if config.store is None and network != "localnet": + raise ValueError("shared store required") + store = config.store if config.store is not None else MemoryStore() + return store diff --git a/harness/semgrep/rules/failopen-default-store.yaml b/harness/semgrep/rules/failopen-default-store.yaml index 8d176512e..5b034c985 100644 --- a/harness/semgrep/rules/failopen-default-store.yaml +++ b/harness/semgrep/rules/failopen-default-store.yaml @@ -40,6 +40,40 @@ rules: - metavariable-regex: metavariable: $CTOR regex: (?i)(new)?(memory|inmemory|inmem|noop|null|nop|ephemeral).* + # A fallback is safe only after the same nil store has been rejected for + # non-localnet unless the operator made the memory mode explicit. + - pattern-not-inside: | + if $NETWORK != $LOCALNET && ($X == nil || $USES_MEMORY) && os.Getenv($ENV) != "1" { + ... + return ... + } + ... + if $X == nil { + ... + $X = $CTOR(...) + } + - pattern-not-inside: | + if $NETWORK != $LOCALNET && ($X == nil || $USES_MEMORY) && os.Getenv($ENV) != "1" { + ... + return ... + } + ... + if $X == nil { + ... + $X = $PKG.$CTOR(...) + } + - pattern-not-inside: | + $ALLOW := ... + ... + if $NETWORK != $LOCALNET && ($X == nil || $USES_MEMORY) && !$ALLOW { + ... + return ... + } + ... + if $X == nil { + ... + $X = $CTOR(...) + } - id: failopen-default-store-go-shortvar languages: [go] @@ -71,6 +105,31 @@ rules: - metavariable-regex: metavariable: $CTOR regex: (?i)(new)?(memory|inmemory|inmem|noop|null|nop|ephemeral).* + - pattern-not-inside: | + $X := $CONF + ... + if $NETWORK != $LOCALNET && ($X == nil || $USES_MEMORY) && os.Getenv($ENV) != "1" { + ... + return ... + } + ... + if $X == nil { + ... + $X = $CTOR(...) + } + - pattern-not-inside: | + $X := $CONF + $ALLOW := ... + ... + if $NETWORK != $LOCALNET && ($X == nil || $USES_MEMORY) && !$ALLOW { + ... + return ... + } + ... + if $X == nil { + ... + $X = $CTOR(...) + } - id: failopen-default-store-ts-nullish languages: [typescript, javascript] @@ -140,3 +199,19 @@ rules: - metavariable-regex: metavariable: $CTOR regex: (?i)(memory|inmemory|inmem|noop|null|nop|ephemeral).*(store|session|cache|map)? + # Python's guard must explicitly identify an absent/in-memory configured + # store, reject it off-localnet, then construct the local fallback. + - pattern-not-inside: | + $USES_MEMORY = $CONF is None or isinstance($CONF, $MEMORY) + ... + if $USES_MEMORY and not $IS_LOCALNET and os.getenv($ENV) != "1": + ... + raise $ERROR(...) + ... + $S = $CONF if $CONF is not None else $CTOR(...) + - pattern-not-inside: | + if $CONF is None and $NETWORK != $LOCALNET: + ... + raise $ERROR(...) + ... + $S = $CONF if $CONF is not None else $CTOR(...) diff --git a/harness/semgrep/rules/nonconstant-compare-and-swallow-catch.yaml b/harness/semgrep/rules/nonconstant-compare-and-swallow-catch.yaml index 5ae67a191..3f10553cc 100644 --- a/harness/semgrep/rules/nonconstant-compare-and-swallow-catch.yaml +++ b/harness/semgrep/rules/nonconstant-compare-and-swallow-catch.yaml @@ -41,6 +41,9 @@ rules: - pattern-not: $X.length - pattern-not: $X.byteLength - pattern-not: $X.size + # A runtime type check (`typeof secret !== 'string'`) inspects the + # value's type tag, not its bytes; it cannot leak match progress. + - pattern-not: typeof $X - metavariable-pattern: metavariable: $B patterns: diff --git a/harness/semgrep/rules/security-check-gated-optional-field.yaml b/harness/semgrep/rules/security-check-gated-optional-field.yaml index f2b3ee9de..afad9a1fe 100644 --- a/harness/semgrep/rules/security-check-gated-optional-field.yaml +++ b/harness/semgrep/rules/security-check-gated-optional-field.yaml @@ -8,6 +8,9 @@ # The attacker controls whether the field is present, and its absence is the # "happy path" that bypasses the proof. The safe form asserts the field is # present FIRST (throw when missing), then verifies unconditionally. +# A final voucher is deliberately excluded: session close may validly settle at +# the previously verified watermark without one, so a generic optional-field +# rule cannot distinguish that safe protocol path from a proof bypass. # # Tuned against real constructs in the pay-kit repo (2026-07): # typescript/.../mpp/src/server/session/on-chain.ts:507 @@ -47,7 +50,7 @@ rules: } - metavariable-regex: metavariable: $FIELD - regex: (?i)^(signature|sig|proof|attestation|onchainproof|txsig|txsignature|credential|voucher)$ + regex: (?i)^(signature|sig|proof|attestation|onchainproof|txsig|txsignature)$ - metavariable-regex: metavariable: $VERIFY regex: (?i).*(verif|checkonchain|onchain|assert|validate|confirm|proof|settle).* @@ -78,7 +81,7 @@ rules: $VERIFY(...) - metavariable-regex: metavariable: $FIELD - regex: (?i)^(signature|sig|proof|attestation|onchain_proof|tx_sig|credential|voucher)$ + regex: (?i)^(signature|sig|proof|attestation|onchain_proof|tx_sig)$ - metavariable-regex: metavariable: $VERIFY regex: (?i).*(verif|check_on_chain|on_chain|onchain|assert|validate|confirm|proof|settle).* @@ -110,7 +113,7 @@ rules: } - metavariable-regex: metavariable: $FIELD - regex: (?i)^(signature|sig|proof|attestation|onchainproof|txsig|credential|voucher)$ + regex: (?i)^(signature|sig|proof|attestation|onchainproof|txsig)$ - metavariable-regex: metavariable: $VERIFY regex: (?i).*(verif|checkonchain|onchain|assert|validate|confirm|proof|settle).* diff --git a/harness/semgrep/run.sh b/harness/semgrep/run.sh index 2589f03c6..624f7f2f0 100755 --- a/harness/semgrep/run.sh +++ b/harness/semgrep/run.sh @@ -57,4 +57,8 @@ if [[ ${#TARGETS[@]} -eq 0 ]]; then fi echo "== radar L7 scan: ${TARGETS[*]} ==" -semgrep --config "$RULES" "${EXCLUDES[@]}" "${TARGETS[@]}" +ERROR_ON_FINDINGS=() +if [[ "${SEMGREP_ERROR_ON_FINDINGS:-0}" == "1" ]]; then + ERROR_ON_FINDINGS+=(--error) +fi +semgrep --config "$RULES" "${ERROR_ON_FINDINGS[@]}" "${EXCLUDES[@]}" "${TARGETS[@]}" diff --git a/harness/src/conformance/mode-support.ts b/harness/src/conformance/mode-support.ts new file mode 100644 index 000000000..2318f654e --- /dev/null +++ b/harness/src/conformance/mode-support.ts @@ -0,0 +1,94 @@ +import type { + ConformanceVector, + RunnerResult, + VectorMode, + VectorOutcome, +} from "./schema"; +import type { ModeCapabilities } from "./runners"; + +export type ModeExecutionCounts = Map; + +const REQUIRED_STRICT_OUTCOMES = ["accept", "reject"] as const; + +function executionKey( + language: string, + intent: ConformanceVector["intent"], + mode: VectorMode, + outcome: VectorOutcome, +): string { + return `${language}:${intent}:${mode}:${outcome}`; +} + +export function recordModeExecution( + counts: ModeExecutionCounts, + language: string, + vector: Pick, + outcome: RunnerResult["outcome"], +): void { + if (outcome === "unsupported-mode") return; + const key = executionKey(language, vector.intent, vector.mode, outcome); + counts.set(key, (counts.get(key) ?? 0) + 1); +} + +export function countModeExecutions( + counts: ReadonlyMap, + language: string, + intent: ConformanceVector["intent"], + mode: VectorMode, +): number { + return REQUIRED_STRICT_OUTCOMES.reduce( + (total, outcome) => + total + (counts.get(executionKey(language, intent, mode, outcome)) ?? 0), + 0, + ); +} + +export function assertStrictModeCoverage( + language: string, + strictModesByIntent: ModeCapabilities | undefined, + counts: ReadonlyMap, +): void { + for (const [intent, modes] of Object.entries(strictModesByIntent ?? {})) { + const declaredIntent = intent as ConformanceVector["intent"]; + for (const mode of modes ?? []) { + for (const outcome of REQUIRED_STRICT_OUTCOMES) { + if ( + (counts.get(executionKey(language, declaredIntent, mode, outcome)) ?? + 0) === 0 + ) { + throw new Error( + `${language} strict mode ${intent}:${mode} executed no ${outcome} vector`, + ); + } + } + } + } +} + +export function declaresModeSupport( + modesByIntent: ModeCapabilities | undefined, + vector: Pick, +): boolean { + return modesByIntent?.[vector.intent]?.includes(vector.mode) ?? false; +} + +export function isUnsupportedMode(result: RunnerResult): boolean { + return ( + result.outcome === "unsupported-mode" || + (result.outcome === "reject" && + (result.error ?? "").startsWith("unsupported-mode")) + ); +} + +export function assertDeclaredModeWasExecuted( + language: string, + modesByIntent: ModeCapabilities | undefined, + vector: Pick, + result: RunnerResult, +): void { + if (declaresModeSupport(modesByIntent, vector) && isUnsupportedMode(result)) { + throw new Error( + `${language} declares ${vector.intent}:${vector.mode} support but returned unsupported-mode for eligible vector ${vector.id}`, + ); + } +} diff --git a/harness/src/conformance/runners.ts b/harness/src/conformance/runners.ts index d01b08171..0f4ec879c 100644 --- a/harness/src/conformance/runners.ts +++ b/harness/src/conformance/runners.ts @@ -16,6 +16,11 @@ import { readFileSync, readdirSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; +import type { ConformanceVector, VectorMode } from "./schema"; + +export type ModeCapabilities = Partial< + Record +>; export type RunnerManifest = { language: string; @@ -28,6 +33,12 @@ export type RunnerManifest = { // This lets a new intent (e.g. "session") land with only the SDKs that // implement it, without editing every other language's runner. intents?: string[]; + // Exact modes backed by a real verifier. Declaring a mode makes every + // eligible vector mandatory; unsupported-mode is then a conformance error. + modesByIntent?: ModeCapabilities; + // Verifier modes that must execute both an accept and a reject vector. + // Strict modes never inherit unsupported-mode exemptions. + strictModesByIntent?: ModeCapabilities; // Optional explicit identity when the spawned process intentionally reports // a shared implementation name instead of the manifest language. reportsAs?: string; @@ -36,11 +47,47 @@ export type RunnerManifest = { // The intents every runner is assumed to support when its manifest does not // declare an explicit `intents` list. const DEFAULT_INTENTS = ["charge", "x402-exact"]; +const KNOWN_INTENTS = new Set(["charge", "x402-exact", "session"]); +const KNOWN_MODES = new Set([ + "build-transaction", + "verify-transaction", + "canonical-bytes", + "verify-x402-transaction", +]); +const VERIFIER_MODES = new Set([ + "verify-transaction", + "verify-x402-transaction", +]); const here = dirname(fileURLToPath(import.meta.url)); const repoRoot = join(here, "..", "..", ".."); const manifestsDir = join(here, "..", "..", "runners"); +function isModeCapabilities( + value: unknown, + intents: string[], + allowedModes: ReadonlySet = KNOWN_MODES, +): value is ModeCapabilities { + if (typeof value !== "object" || value === null || Array.isArray(value)) { + return false; + } + for (const [intent, modes] of Object.entries(value)) { + if (!KNOWN_INTENTS.has(intent) || !intents.includes(intent)) return false; + if ( + !Array.isArray(modes) || + modes.length === 0 || + !modes.every( + (mode) => + typeof mode === "string" && allowedModes.has(mode as VectorMode), + ) + ) { + return false; + } + if (new Set(modes).size !== modes.length) return false; + } + return true; +} + function isRunnerManifest(value: unknown): value is RunnerManifest { if (typeof value !== "object" || value === null) return false; const m = value as Record; @@ -50,11 +97,41 @@ function isRunnerManifest(value: unknown): value is RunnerManifest { if (m.cwd !== undefined && typeof m.cwd !== "string") return false; if ( m.intents !== undefined && - (!Array.isArray(m.intents) || !m.intents.every((i) => typeof i === "string")) + (!Array.isArray(m.intents) || + !m.intents.every((i) => typeof i === "string")) ) { return false; } - if (m.reportsAs !== undefined && typeof m.reportsAs !== "string") return false; + const intents = m.intents ?? DEFAULT_INTENTS; + if ( + m.modesByIntent !== undefined && + !isModeCapabilities(m.modesByIntent, intents) + ) { + return false; + } + if (m.strictModesByIntent !== undefined) { + if ( + !isModeCapabilities(m.strictModesByIntent, intents, VERIFIER_MODES) || + m.modesByIntent === undefined + ) { + return false; + } + const declaredModes = m.modesByIntent as ModeCapabilities; + for (const [intent, strictModes] of Object.entries( + m.strictModesByIntent as ModeCapabilities, + )) { + const declaredIntent = intent as ConformanceVector["intent"]; + if ( + strictModes?.some( + (mode) => !declaredModes[declaredIntent]?.includes(mode), + ) + ) { + return false; + } + } + } + if (m.reportsAs !== undefined && typeof m.reportsAs !== "string") + return false; return true; } @@ -65,6 +142,8 @@ export type DiscoveredRunner = { cwd: string; // Resolved intent capabilities (manifest `intents` or the default set). intents: string[]; + modesByIntent?: ModeCapabilities; + strictModesByIntent?: ModeCapabilities; reportsAs?: string; }; @@ -88,6 +167,10 @@ export function discoverRunners(): DiscoveredRunner[] { command: parsed.command, cwd: parsed.cwd ? join(repoRoot, parsed.cwd) : repoRoot, intents: parsed.intents ?? DEFAULT_INTENTS, + ...(parsed.modesByIntent ? { modesByIntent: parsed.modesByIntent } : {}), + ...(parsed.strictModesByIntent + ? { strictModesByIntent: parsed.strictModesByIntent } + : {}), ...(parsed.reportsAs ? { reportsAs: parsed.reportsAs } : {}), }); } diff --git a/harness/src/conformance/select.ts b/harness/src/conformance/select.ts index 7d66b1b61..c667dcee2 100644 --- a/harness/src/conformance/select.ts +++ b/harness/src/conformance/select.ts @@ -77,3 +77,23 @@ export function parseLanguageAllowlist( .filter(Boolean); return langs.length > 0 ? new Set(langs) : undefined; } + +export function assertRequestedLanguagesResolved( + requested: ReadonlySet | undefined, + resolvedLanguages: Iterable, + availableLanguages: Iterable, + context: string, +): void { + if (!requested) return; + const resolved = new Set(resolvedLanguages); + const missing = [...requested] + .filter((language) => !resolved.has(language)) + .sort(); + if (missing.length === 0) return; + + throw new Error( + `${context} did not resolve requested language(s): ${missing.join(", ")} ` + + `(requested: ${[...requested].sort().join(", ")}; ` + + `available: ${[...availableLanguages].sort().join(", ") || "none"})`, + ); +} diff --git a/harness/src/conformance/x402.ts b/harness/src/conformance/x402.ts index 6de227892..895ccc848 100644 --- a/harness/src/conformance/x402.ts +++ b/harness/src/conformance/x402.ts @@ -637,6 +637,50 @@ async function deriveAta( return String(ata); } +const MANAGED_SIGNER_FUNDING_ERROR = + "invalid_exact_svm_payload_transaction_fee_payer_transferring_funds"; + +// A transferChecked multisig puts every required signer after the authority. +// Any server-managed signer in that tail could authorize the transfer. Its +// destination at position 2 is deliberately excluded: receiving funds does not +// authorize or source a transfer. The source itself must also not be a managed +// key or a managed key's ATA, derived with the transfer's real Token or +// Token-2022 program. +export async function assertNoManagedTransferFunding( + accountIndices: readonly number[], + staticAccounts: readonly string[], + mint: string, + transferProgram: string, + managedSigners: readonly string[], +): Promise { + const keyAt = (index: number): string => staticAccounts[index] ?? ""; + const source = keyAt(accountIndices[0]); + const managed = new Set(managedSigners); + + for (const accountIndex of accountIndices.slice(3)) { + if (managed.has(keyAt(accountIndex))) { + throw new Error(MANAGED_SIGNER_FUNDING_ERROR); + } + } + + for (const signer of managed) { + if (source === signer) { + throw new Error(MANAGED_SIGNER_FUNDING_ERROR); + } + try { + if (source === (await deriveAta(signer, mint, transferProgram))) { + throw new Error(MANAGED_SIGNER_FUNDING_ERROR); + } + } catch (error) { + if (error instanceof Error && error.message === MANAGED_SIGNER_FUNDING_ERROR) { + throw error; + } + // Invalid configured signer keys cannot derive an ATA and therefore + // cannot match the transaction's decoded source key. + } + } +} + // Run the 11-rule exact structural pass over a base64 versioned transaction. // Resolves on accept; rejects with a canonical `invalid_exact_svm_payload_*` // Error on the first rule failure. @@ -710,29 +754,16 @@ export async function verifyExactTransaction( const source = keyAt(transfer.accountIndices[0]); const mint = keyAt(transfer.accountIndices[1]); const destination = keyAt(transfer.accountIndices[2]); - const authority = keyAt(transfer.accountIndices[3]); - // Rule 5: fee-payer/managed-signer fund-mover guard (authority + source, - // and the managed signer's own source ATA for the mint). An appended - // instruction that merely references the fee-payer is NOT a fund move. - for (const managed of managedSigners) { - if (managed === authority || managed === source) { - throw new Error( - "invalid_exact_svm_payload_transaction_fee_payer_transferring_funds", - ); - } - let managedAta: string | undefined; - try { - managedAta = await deriveAta(managed, mint, transferProgram); - } catch { - managedAta = undefined; // an unparseable managed key can't be the source ATA - } - if (managedAta !== undefined && source === managedAta) { - throw new Error( - "invalid_exact_svm_payload_transaction_fee_payer_transferring_funds", - ); - } - } + // Rule 5: reject managed authorities, multisig signer tails, direct sources, + // and managed ATAs. Mirrors Go/Rust's exact transfer verifier. + await assertNoManagedTransferFunding( + transfer.accountIndices, + keys, + mint, + transferProgram, + managedSigners, + ); // Rule 6: mint match. if (mint !== requirement.asset) { diff --git a/harness/src/fixtures/typescript/pay-kit-adapter-boot.ts b/harness/src/fixtures/typescript/pay-kit-adapter-boot.ts new file mode 100644 index 000000000..f388e3a1a --- /dev/null +++ b/harness/src/fixtures/typescript/pay-kit-adapter-boot.ts @@ -0,0 +1,57 @@ +import http from "node:http"; + +import { configure } from "../../../../typescript/packages/pay-kit/src/config.js"; +import { Signer } from "../../../../typescript/packages/pay-kit/src/signer.js"; + +function requiredEnv(name: string): string { + const value = process.env[name]; + if (!value) throw new Error(`${name} is required`); + return value; +} + +function networkFromHarness( + network: string, +): "solana_devnet" | "solana_localnet" | "solana_mainnet" { + if (network === "devnet") return "solana_devnet"; + if (network === "localnet") return "solana_localnet"; + if (network === "mainnet" || network === "mainnet-beta") + return "solana_mainnet"; + throw new Error(`Unsupported MPP_HARNESS_NETWORK: ${network}`); +} + +async function main(): Promise { + const signer = await Signer.json( + requiredEnv("MPP_HARNESS_FEE_PAYER_SECRET_KEY"), + ); + await configure({ + accept: ["mpp"], + mpp: { challengeBindingSecret: requiredEnv("MPP_HARNESS_SECRET_KEY") }, + network: networkFromHarness(requiredEnv("MPP_HARNESS_NETWORK")), + operator: { recipient: requiredEnv("MPP_HARNESS_PAY_TO"), signer }, + preflight: false, + rpcUrl: requiredEnv("MPP_HARNESS_RPC_URL"), + }); + + const server = http.createServer((_request, response) => { + response.writeHead(404).end(); + }); + server.listen(0, "127.0.0.1", () => { + const address = server.address(); + if (!address || typeof address === "string") + throw new Error("Failed to bind TypeScript boot probe"); + console.log( + JSON.stringify({ + implementation: "typescript", + port: address.port, + role: "server", + type: "ready", + }), + ); + }); + + const shutdown = () => server.close(() => process.exit(0)); + process.on("SIGINT", shutdown); + process.on("SIGTERM", shutdown); +} + +void main(); diff --git a/harness/src/implementations.ts b/harness/src/implementations.ts index 199aa2478..13bc17e18 100644 --- a/harness/src/implementations.ts +++ b/harness/src/implementations.ts @@ -397,7 +397,13 @@ export const serverImplementations: ImplementationDefinition[] = [ id: "go", label: "Go PayKit umbrella server (dual protocol)", role: "server", - command: ["sh", "-c", "cd go-server && ./paykit-server"], + // The test fixture is intentionally process-local. Keep the production + // default fail-closed; boot-policy.test.ts starts this binary without it. + command: [ + "sh", + "-c", + "cd go-server && PAY_KIT_ALLOW_INMEMORY_REPLAY_STORE=1 ./paykit-server", + ], enabled: isEnabled("go", "MPP_HARNESS_SERVERS", true), intents: ["charge", "x402-exact"], // The Go umbrella server fixture reports the bare language tag diff --git a/harness/test/ci-coverage-gate.test.ts b/harness/test/ci-coverage-gate.test.ts index f4d9b36cb..e9b10e695 100644 --- a/harness/test/ci-coverage-gate.test.ts +++ b/harness/test/ci-coverage-gate.test.ts @@ -8,10 +8,11 @@ // workflow, or (b) listed in CI_EXEMPT with a concrete reason. A new test that // is neither wired nor exempted turns this RED — you cannot add a radar test and // forget to run it. -import { readdirSync, readFileSync } from "node:fs"; +import { existsSync, readdirSync, readFileSync } from "node:fs"; import { fileURLToPath } from "node:url"; import { dirname, join } from "node:path"; import { describe, expect, it } from "vitest"; +import { parse } from "yaml"; const here = dirname(fileURLToPath(import.meta.url)); // harness/test const testDir = here; @@ -23,35 +24,95 @@ const workflowsDir = join(here, "..", "..", ".github", "workflows"); // so they run in dedicated on-chain / matrix legs (harness.yml, go.yml // playground) or are opt-in, NOT the fast unit job. Keep this list SMALL and // justified; prefer wiring a test over exempting it. -const CI_EXEMPT: Record = { - "onchain.e2e.test.ts": - "on-chain E2E: needs a live surfnet + payment-channels program; core on-chain settlement is covered by the e2e.test.ts matrix legs (charge/x402-exact/x402-upto/session).", - "x402-upto.e2e.test.ts": - "on-chain E2E: needs surfnet + the payment-channels program; the x402-upto flow runs via the e2e.test.ts matrix leg.", +interface CiExemption { + owner: string; + reason: string; + lastReviewed: string; + removalCondition: string; +} + +const CI_EXEMPT: Record = { + "onchain.e2e.test.ts": { + owner: "harness", + reason: + "Needs a live surfnet and payment-channels program; deterministic state-transition coverage lives in the unit and conformance suites.", + lastReviewed: "2026-07-10", + removalCondition: + "Remove when the workflow provisions a deterministic local validator for this file.", + }, + "x402-upto.e2e.test.ts": { + owner: "x402", + reason: "Needs a live surfnet and the deployed payment-channels program.", + lastReviewed: "2026-07-10", + removalCondition: + "Remove when the standard matrix provisions the program and executes this file.", + }, // protocol-conformance.test.ts is no longer exempt: it now honors // MPP_CONFORMANCE_LANGUAGES (spawn loop filtered) and is wired into ci.yml // pinned to `typescript`, running the canonical challenge/receipt vectors // against the real TS reference codecs. The 6 divergences it caught are fixed. }; -// Strip YAML comments before matching: a test path that appears only in a -// comment / doc block is NOT execution, so it must not count as "wired". The -// real wirings live in `run:` command lines (and env/matrix entries). Strips -// BOTH full-line comments AND trailing inline comments (` # ...` — a YAML inline -// comment must be whitespace-preceded), so `run: vitest test/a.test.ts # test/b.test.ts` -// no longer falsely counts test/b as wired. Over-stripping (a `#` inside a -// value) only risks a FALSE NEGATIVE (RED), never a false green, so it errs safe. -function stripYamlComments(text: string): string { - return text +function isRecord(value: unknown): value is Record { + return typeof value === "object" && value !== null && !Array.isArray(value); +} + +function stripShellComments(run: string): string { + return run .split("\n") .map((line) => (/^\s*#/.test(line) ? "" : line.replace(/\s+#.*$/, ""))) .join("\n"); } -const workflowText = readdirSync(workflowsDir) - .filter((name) => /\.ya?ml$/.test(name)) - .map((name) => stripYamlComments(readFileSync(join(workflowsDir, name), "utf8"))) - .join("\n"); +function testsInvokedByRun(run: string): string[] { + const logical = stripShellComments(run).replace(/\\\s*\n/g, " "); + const invoked = new Set(); + for (const segment of logical.split(/\n|&&|\|\||;/)) { + const command = segment.trim(); + if ( + !/^(?:[A-Z_][A-Z0-9_]*=\S+\s+)*(?:pnpm\s+(?:exec\s+)?|npx\s+)?vitest\s+run\b/.test( + command, + ) + ) { + continue; + } + for (const match of command.matchAll( + /\btest\/([A-Za-z0-9._/-]+\.test\.ts)\b/g, + )) { + invoked.add(match[1]); + } + } + return [...invoked]; +} + +function collectExecutedHarnessTests(workflowYaml: string): Set { + const document = parse(workflowYaml) as unknown; + const executed = new Set(); + if (!isRecord(document) || !isRecord(document.jobs)) return executed; + + for (const job of Object.values(document.jobs)) { + if (!isRecord(job) || !Array.isArray(job.steps)) continue; + for (const step of job.steps) { + if (!isRecord(step) || typeof step.run !== "string") continue; + const workingDirectory = step["working-directory"]; + const runsInHarness = + workingDirectory === "harness" || + /(?:^|\n)\s*cd\s+(?:\.\/)?harness(?:\s|$)/.test(step.run); + if (!runsInHarness) continue; + for (const test of testsInvokedByRun(step.run)) executed.add(test); + } + } + return executed; +} + +const workflowFiles = readdirSync(workflowsDir).filter((name) => + /\.ya?ml$/.test(name), +); +const executedTests = new Set(); +for (const workflow of workflowFiles) { + const text = readFileSync(join(workflowsDir, workflow), "utf8"); + for (const test of collectExecutedHarnessTests(text)) executedTests.add(test); +} const DIRECT_NON_PUBLISH_WORKFLOWS = [ "android-demo.yml", @@ -65,6 +126,7 @@ const DIRECT_NON_PUBLISH_WORKFLOWS = [ "php.yml", "python.yml", "ruby.yml", + "semgrep.yml", "swift.yml", ] as const; @@ -75,25 +137,54 @@ const allTests = readdirSync(testDir) describe("CI coverage gate: every harness test runs in CI (or is documented-exempt)", () => { it("finds a non-trivial set of harness tests and workflow files", () => { expect(allTests.length).toBeGreaterThan(10); - expect(workflowText.length).toBeGreaterThan(100); + expect(workflowFiles.length).toBeGreaterThan(10); + expect(executedTests.size).toBeGreaterThan(10); + }); + + it("counts only test paths passed to a harness vitest command", () => { + const fixture = ` +jobs: + fake: + runs-on: ubuntu-latest + steps: + - name: test/dead-name.test.ts + working-directory: harness + env: + UNUSED_TEST: test/dead-env.test.ts + run: | + echo test/dead-echo.test.ts + # pnpm exec vitest run test/dead-comment.test.ts + pnpm exec vitest run \\ + test/live.test.ts +`; + expect([...collectExecutedHarnessTests(fixture)]).toEqual(["live.test.ts"]); }); it("does not carry stale CI_EXEMPT entries", () => { - for (const f of Object.keys(CI_EXEMPT)) { + for (const [f, exemption] of Object.entries(CI_EXEMPT)) { expect( allTests, `CI_EXEMPT names '${f}' but no such harness test exists — remove the stale exemption`, ).toContain(f); + expect(exemption.owner.trim(), `${f}.owner`).not.toBe(""); + expect(exemption.reason.trim(), `${f}.reason`).not.toBe(""); + expect(exemption.lastReviewed, `${f}.lastReviewed`).toMatch( + /^\d{4}-\d{2}-\d{2}$/, + ); + expect( + exemption.removalCondition.trim(), + `${f}.removalCondition`, + ).not.toBe(""); } }); for (const test of allTests) { it(`${test} is wired into a workflow or in CI_EXEMPT`, () => { - const wired = workflowText.includes(`test/${test}`); + const wired = executedTests.has(test); const exempt = Object.prototype.hasOwnProperty.call(CI_EXEMPT, test); if (!wired && !exempt) { throw new Error( - `harness/test/${test} is not referenced by any .github/workflows/*.yml ` + + `harness/test/${test} is not passed to a harness vitest command in any workflow ` + `and is not in CI_EXEMPT. Wire it into a CI step, or add it to ` + `CI_EXEMPT with a reason. (This gate exists because the audit found ` + `~21 harness tests silently dead in CI.)`, @@ -112,15 +203,18 @@ describe("CI coverage gate: every harness test runs in CI (or is documented-exem describe("workflow hygiene gate: direct non-publish workflows are read-only by default", () => { for (const workflow of DIRECT_NON_PUBLISH_WORKFLOWS) { it(`${workflow} declares top-level contents: read permissions`, () => { - const text = stripYamlComments(readFileSync(join(workflowsDir, workflow), "utf8")); + const text = readFileSync(join(workflowsDir, workflow), "utf8"); expect( /^permissions:\n(?:[ \t]+[A-Za-z-]+:[^\n]*\n)+/m.test(text), `${workflow} has no top-level permissions block; PR CI would inherit repository defaults`, ).toBe(true); - const block = text.match(/^permissions:\n((?:[ \t]+[A-Za-z-]+:[^\n]*\n)+)/m)?.[1] ?? ""; - expect(block, `${workflow} top-level permissions must include contents: read`).toMatch( - /^[ \t]+contents:[ \t]*read[ \t]*$/m, - ); + const block = + text.match(/^permissions:\n((?:[ \t]+[A-Za-z-]+:[^\n]*\n)+)/m)?.[1] ?? + ""; + expect( + block, + `${workflow} top-level permissions must include contents: read`, + ).toMatch(/^[ \t]+contents:[ \t]*read[ \t]*$/m); expect( block, `${workflow} top-level permissions must not grant write scopes; use job-level permissions only where needed`, @@ -129,6 +223,64 @@ describe("workflow hygiene gate: direct non-publish workflows are read-only by d } it("does not accidentally inspect publish workflows in the direct-workflow guard", () => { - expect([...DIRECT_NON_PUBLISH_WORKFLOWS].some((name) => name.includes("publish"))).toBe(false); + expect( + [...DIRECT_NON_PUBLISH_WORKFLOWS].some((name) => + name.includes("publish"), + ), + ).toBe(false); }); + + it("pins the Semgrep runtime and reserves blocking enforcement for release gates", () => { + const source = readFileSync(join(workflowsDir, "semgrep.yml"), "utf8"); + expect(source).toMatch(/semgrep\/semgrep@sha256:[a-f0-9]{64}/); + expect(source).not.toMatch(/pip install semgrep/); + expect(source).toMatch(/SEMGREP_ERROR_ON_FINDINGS=1/); + }); + + it("keeps the repaired missing-ATA settlement regression blocking", () => { + // This harness leaf owns the harness.yml missing-ATA step; python.yml's + // equivalent step is owned by the Python leaf (#228) and gated there, so + // this gate only asserts the file this leaf modifies. Both leaves make the + // step blocking; the step name is the reconciled #216-integration one (deliver-or-reject invariant). + for (const workflow of ["harness.yml"]) { + const source = readFileSync(join(workflowsDir, workflow), "utf8"); + const step = source.match( + /- name: Focused Python session missing-ATA settlement invariant \(deliver-or-reject\)([\s\S]*?)(?=\n\s*- name:|$)/, + )?.[1]; + expect(step, `${workflow} missing-ATA step`).toBeTruthy(); + expect(step, `${workflow} missing-ATA step must not swallow fund-loss failures`).not.toMatch( + /continue-on-error:\s*true/, + ); + expect(step).toMatch(/MPP_HARNESS_SESSION_RED_FAULTS:\s*"1"/); + } + }); +}); + +// --------------------------------------------------------------------------- +// Gate self-activation SEAL. The cascade root (ci: gates self-activate with +// their subjects) lets the Rust conformance/coverage steps and the python +// session leg report themselves pending while their subjects are absent, so +// earlier legs of the #216 redelivery chain stay green. This tree is the END +// STATE of that chain: every subject MUST exist here, because a missing one +// means a pending gate silently outlived its purpose and is still off. +// --------------------------------------------------------------------------- +describe("gate self-activation seal: every pending gate's subject exists in the end state", () => { + const repoRoot = join(here, "..", ".."); + const SUBJECTS = [ + // ci.yml: rust-conformance job + the TS-harness job's Rust vector steps + "rust/crates/kit/examples/conformance_runner.rs", + "rust/crates/kit/examples/protocol_runner.rs", + // ci.yml: the Rust coverage floor step + "scripts/check-rust-coverage.py", + // harness.yml: the focused python session leg + "harness/python-session-client/test_main.py", + ]; + for (const subject of SUBJECTS) { + it(`subject exists: ${subject}`, () => { + expect( + existsSync(join(repoRoot, subject)), + `${subject} must exist in the integrated tree; a pending gate is still off without it`, + ).toBe(true); + }); + } }); diff --git a/harness/test/conformance.test.ts b/harness/test/conformance.test.ts index 3694737de..311e5d2a0 100644 --- a/harness/test/conformance.test.ts +++ b/harness/test/conformance.test.ts @@ -33,8 +33,18 @@ import { assertRunnerResult, } from "../src/conformance/contract-schema"; import { classifyReject } from "../src/conformance/reject"; +import { + assertDeclaredModeWasExecuted, + assertStrictModeCoverage, + countModeExecutions, + isUnsupportedMode, + recordModeExecution, +} from "../src/conformance/mode-support"; import { discoverRunners } from "../src/conformance/runners"; -import { parseLanguageAllowlist } from "../src/conformance/select"; +import { + assertRequestedLanguagesResolved, + parseLanguageAllowlist, +} from "../src/conformance/select"; import { chargeScenarios } from "../src/intents/charge"; import { x402ExactScenarios } from "../src/intents/x402-exact"; import type { @@ -56,21 +66,22 @@ const MAX_VECTOR_FILES = 128; const MAX_VECTORS_PER_FILE = 5_000; const MAX_TOTAL_VECTORS = 20_000; -const REJECT_CODE_CLASSIFICATION_FIXTURES: Partial> = { - "compute-price-over-cap": "compute unit price 5000001 exceeds maximum", - "compute-limit-over-cap": "compute unit limit 250000 exceeds maximum", - "fee-payer-not-authority": "fee payer cannot authorize transfer", - "fee-payer-is-funds-source": "fee payer is funds source", - "splits-exceed-amount": "splits consume the entire amount", - "too-many-splits": "too many splits", - "unexpected-instruction": "unexpected program instruction", - "no-matching-transfer": "no matching transfer", - "amount-mismatch": "amount value mismatch", - "invalid-payload": "invalid payload", - "unsupported-version": "unsupported x402 version", - "wrong-network": "network mismatch", - "payment-identifier-required": "payment-identifier required", -}; +const REJECT_CODE_CLASSIFICATION_FIXTURES: Partial> = + { + "compute-price-over-cap": "compute unit price 5000001 exceeds maximum", + "compute-limit-over-cap": "compute unit limit 250000 exceeds maximum", + "fee-payer-not-authority": "fee payer cannot authorize transfer", + "fee-payer-is-funds-source": "fee payer is funds source", + "splits-exceed-amount": "splits consume the entire amount", + "too-many-splits": "too many splits", + "unexpected-instruction": "unexpected program instruction", + "no-matching-transfer": "no matching transfer", + "amount-mismatch": "amount value mismatch", + "invalid-payload": "invalid payload", + "unsupported-version": "unsupported x402 version", + "wrong-network": "network mismatch", + "payment-identifier-required": "payment-identifier required", + }; const REJECT_CODE_VECTOR_EXCEPTIONS: Partial< Record @@ -117,6 +128,16 @@ const UNSUPPORTED_MODE_EXEMPTIONS: Record< string, { owner: string; date: string; reason: string } > = { + "rust:charge:build-transaction": { + owner: "rust", + date: "2026-07-09", + reason: "The Rust runner currently exercises charge canonical bytes only.", + }, + "rust:charge:verify-transaction": { + owner: "rust", + date: "2026-07-09", + reason: "The Rust runner currently exercises charge canonical bytes only.", + }, "ruby:charge:build-transaction": { owner: "harness", date: "2026-07-09", @@ -149,6 +170,18 @@ const UNSUPPORTED_MODE_EXEMPTIONS: Record< reason: "Lua is currently server-only; its real exact verifier remains required.", }, + "kotlin:charge:build-transaction": { + owner: "harness", + date: "2026-07-09", + reason: + "Kotlin's conformance runner currently exercises canonical bytes only.", + }, + "kotlin:charge:verify-transaction": { + owner: "harness", + date: "2026-07-09", + reason: + "Kotlin's conformance runner currently exercises canonical bytes only.", + }, "swift:charge:verify-transaction": { owner: "harness", date: "2026-07-09", @@ -179,7 +212,9 @@ const UNSUPPORTED_MODE_EXEMPTIONS: Record< }; function loadVectors(): ConformanceVector[] { - const files = readdirSync(vectorsDir).filter((name) => name.endsWith(".json")); + const files = readdirSync(vectorsDir).filter((name) => + name.endsWith(".json"), + ); if (files.length > MAX_VECTOR_FILES) { throw new Error( `resource-bound: vector file count ${files.length} exceeds ${MAX_VECTOR_FILES}`, @@ -229,26 +264,22 @@ function loadVectors(): ConformanceVector[] { // MPP_CONFORMANCE_LANGUAGES (a comma-separated allowlist; see // scripts/select-conformance-runners.mjs). Unset = run every runner. const allowlist = parseLanguageAllowlist(process.env.MPP_CONFORMANCE_LANGUAGES); -const RUNNERS = discoverRunners().filter( +const DISCOVERED_RUNNERS = discoverRunners(); +const RUNNERS = DISCOVERED_RUNNERS.filter( (runner) => !allowlist || allowlist.has(runner.language), ); -// Anti-vacuous-pass guard: when MPP_CONFORMANCE_LANGUAGES pins an allowlist, at -// least one discovered runner MUST match it. A typo (e.g. "ruts"), a deleted or -// renamed manifest, or a stale language name would otherwise leave RUNNERS empty -// and every conformance describe below would register ZERO tests — a green run -// that exercised no SDK at all. This turns that into a hard RED. +// Anti-vacuous-pass guard: every requested language must have a discovered +// runner. A partially stale allowlist must not quietly exercise only its valid +// entries and pass green. describe("conformance runner selection", () => { - it("resolves at least one runner for the configured allowlist", () => { - if (allowlist) { - const available = discoverRunners().map((r) => r.language).join(", "); - expect( - RUNNERS.length, - `MPP_CONFORMANCE_LANGUAGES=${process.env.MPP_CONFORMANCE_LANGUAGES} matched no ` + - `discovered runner (available: ${available}). A typo or a missing manifest ` + - `would otherwise run zero SDKs and pass green.`, - ).toBeGreaterThan(0); - } + it("resolves every runner in the configured allowlist", () => { + assertRequestedLanguagesResolved( + allowlist, + RUNNERS.map((runner) => runner.language), + DISCOVERED_RUNNERS.map((runner) => runner.language), + `MPP_CONFORMANCE_LANGUAGES=${process.env.MPP_CONFORMANCE_LANGUAGES ?? ""}`, + ); }); }); @@ -379,7 +410,8 @@ async function assertShape( (t) => t.kind === wanted.kind && t.amount === wanted.amount && - (wantedDestination === undefined || t.destination === wantedDestination) && + (wantedDestination === undefined || + t.destination === wantedDestination) && (wanted.mint === undefined || t.mint === wanted.mint) && (wanted.decimals === undefined || t.decimals === wanted.decimals) && (wanted.tokenProgram === undefined || @@ -450,7 +482,10 @@ function assertEnvelopeShape( // asserted only against the spec pattern (the runner generated it). if (expected.paymentIdentifierId !== undefined) { expect(actual.paymentIdentifierId).toBe(expected.paymentIdentifierId); - } else if (expected.hasPaymentIdentifier && expected.paymentIdentifierRequired) { + } else if ( + expected.hasPaymentIdentifier && + expected.paymentIdentifierRequired + ) { expect(actual.paymentIdentifierId, "required id was not echoed").toMatch( /^[A-Za-z0-9_-]{16,128}$/, ); @@ -486,7 +521,10 @@ describe("cross-SDK conformance vectors", () => { it("requires spawned runner stdout to report implementation identity", () => { expect(() => - assertRunnerResult({ id: "identity-smoke", outcome: "accept" }, "identity-smoke"), + assertRunnerResult( + { id: "identity-smoke", outcome: "accept" }, + "identity-smoke", + ), ).toThrow(/violates the conformance ABI/); }); @@ -546,12 +584,17 @@ describe("cross-SDK conformance vectors", () => { it("canonical L6 codes are covered by scenarios or explicit exceptions", () => { for (const fixture of CANONICAL_CODE_CLASSIFICATION_FIXTURES) { - expect(classifyMessageToCanonicalCode(fixture.message)).toBe(fixture.code); + expect(classifyMessageToCanonicalCode(fixture.message)).toBe( + fixture.code, + ); } const scenarioCodes = new Set( [...chargeScenarios, ...x402ExactScenarios] .map((scenario) => scenario.expectedCode) - .filter((code): code is (typeof CANONICAL_CODES)[number] => code !== undefined), + .filter( + (code): code is (typeof CANONICAL_CODES)[number] => + code !== undefined, + ), ); for (const code of CANONICAL_CODES) { const exception = CANONICAL_CODE_COVERAGE_EXCEPTIONS[code]; @@ -580,18 +623,36 @@ describe("cross-SDK conformance vectors", () => { ).toThrow(/resource-bound: planted-depth-vector exceeds max JSON depth/); }); - for (const { language, command, cwd: runnerCwd, intents, reportsAs } of RUNNERS) { + for (const { + language, + command, + cwd: runnerCwd, + intents, + modesByIntent, + strictModesByIntent, + reportsAs, + } of RUNNERS) { describe(`${language} reference runner`, () => { const expectedIdentity = reportsAs ?? language; - const executedByGroup = new Map(); + const executionCounts = new Map(); + const vectorGroups = new Map< + string, + Pick + >(); for (const vector of vectors) { if (intents.includes(vector.intent)) { - executedByGroup.set(`${vector.intent}:${vector.mode}`, 0); + vectorGroups.set(`${vector.intent}:${vector.mode}`, vector); } } afterAll(() => { - for (const [group, executed] of executedByGroup) { + for (const [group, vector] of vectorGroups) { + const executed = countModeExecutions( + executionCounts, + language, + vector.intent, + vector.mode, + ); const key = `${language}:${group}`; const exception = UNSUPPORTED_MODE_EXEMPTIONS[key]; expect( @@ -604,6 +665,11 @@ describe("cross-SDK conformance vectors", () => { expect(exception.reason).toBeTruthy(); } } + assertStrictModeCoverage( + language, + strictModesByIntent, + executionCounts, + ); }); for (const vector of vectors) { @@ -616,7 +682,12 @@ describe("cross-SDK conformance vectors", () => { ctx.skip(); return; } - const result = await runVector(command, vector, runnerCwd, expectedIdentity); + const result = await runVector( + command, + vector, + runnerCwd, + expectedIdentity, + ); expect(result.id).toBe(vector.id); // A runner that does not support a vector's mode for this SDK's @@ -629,16 +700,22 @@ describe("cross-SDK conformance vectors", () => { // a reject (a client-only SDK cannot exercise a verify-reject // vector at all). Skip the vector for this language rather than // fail it. - if ( - (result.outcome as string) === "unsupported-mode" || - (result.outcome === "reject" && - (result.error ?? "").startsWith("unsupported-mode")) - ) { + if (isUnsupportedMode(result)) { + assertDeclaredModeWasExecuted( + language, + modesByIntent, + vector, + result, + ); ctx.skip(); return; } - const group = `${vector.intent}:${vector.mode}`; - executedByGroup.set(group, (executedByGroup.get(group) ?? 0) + 1); + recordModeExecution( + executionCounts, + language, + vector, + result.outcome, + ); expect( result.outcome, @@ -673,9 +750,14 @@ describe("cross-SDK conformance vectors", () => { if (vector.mode === "canonical-bytes") { const wanted = vector.expect.exactBytes; - expect(wanted, "canonical-bytes vector missing expect.exactBytes").toBeDefined(); + expect( + wanted, + "canonical-bytes vector missing expect.exactBytes", + ).toBeDefined(); if (wanted?.canonicalJson !== undefined) { - expect(result.exactBytes?.canonicalJson).toBe(wanted.canonicalJson); + expect(result.exactBytes?.canonicalJson).toBe( + wanted.canonicalJson, + ); } if (wanted?.base64Url !== undefined) { expect(result.exactBytes?.base64Url).toBe(wanted.base64Url); @@ -697,7 +779,10 @@ describe("cross-SDK conformance vectors", () => { } if (vector.expect.transactionShape) { - await assertShape(vector.expect.transactionShape, result.transactionShape); + await assertShape( + vector.expect.transactionShape, + result.transactionShape, + ); } }, 60_000); } diff --git a/harness/test/coverage-shape.test.ts b/harness/test/coverage-shape.test.ts index 1f02a2da0..b918452cb 100644 --- a/harness/test/coverage-shape.test.ts +++ b/harness/test/coverage-shape.test.ts @@ -3,12 +3,12 @@ import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; import { describe, expect, it } from "vitest"; -// Radar guard: a verify-capable protocol must ship BOTH accept and reject +// Radar guard: every verify mode of a protocol must ship BOTH accept and reject // executed vectors. One-sided coverage — accept-only, or reject-only — is how a // verifier regression escapes: an accept-only corpus never proves a bad payment // is refused, and a reject-only corpus never proves a good one still settles. -// This fails if any intent that has verify vectors is missing either outcome, -// so the reject bank for a protocol cannot be quietly deleted or never added. +// This fails if any intent:mode pair is missing either outcome, so coverage in +// one verifier cannot hide a one-sided corpus in another verifier. // // Session-voucher semantic verification is exercised directly against the pure // verifier in session-voucher-verify.test.ts (its corpus vectors are byte-level @@ -36,34 +36,39 @@ function loadTopLevelVectors(): Vector[] { return out; } -describe("coverage shape — no one-sided verify corpus", () => { +describe("coverage shape — no one-sided intent:verify-mode corpus", () => { const vectors = loadTopLevelVectors(); - it("every verify-capable intent has BOTH accept and reject vectors", () => { - const byIntent = new Map>(); + it("every intent:verify-mode has BOTH accept and reject vectors", () => { + const byIntentAndMode = new Map>(); for (const v of vectors) { if (!v.mode || !VERIFY_MODES.has(v.mode)) continue; const intent = v.intent ?? "(none)"; const outcome = v.expect?.outcome ?? "(none)"; - if (!byIntent.has(intent)) byIntent.set(intent, new Set()); - byIntent.get(intent)?.add(outcome); + const group = `${intent}:${v.mode}`; + if (!byIntentAndMode.has(group)) byIntentAndMode.set(group, new Set()); + byIntentAndMode.get(group)?.add(outcome); } - // Floor: the two protocols with a real verifier must be present, so a - // globbing regression cannot make this assertion vacuous. - expect([...byIntent.keys()].sort()).toEqual( - expect.arrayContaining(["charge", "x402-exact"]), + // Floor: every real verifier mode must be present, so deleting one entire + // mode cannot make the per-group assertion vacuous. + expect([...byIntentAndMode.keys()].sort()).toEqual( + expect.arrayContaining([ + "charge:verify-transaction", + "x402-exact:verify-transaction", + "x402-exact:verify-x402-transaction", + ]), ); const oneSided: string[] = []; - for (const [intent, outcomes] of byIntent) { + for (const [group, outcomes] of byIntentAndMode) { if (!(outcomes.has("accept") && outcomes.has("reject"))) { - oneSided.push(`${intent} (has: ${[...outcomes].sort().join(", ")})`); + oneSided.push(`${group} (has: ${[...outcomes].sort().join(", ")})`); } } expect( oneSided, - `Verify-capable intent(s) with one-sided coverage: ${oneSided.join("; ")}. ` + + `Intent:verify-mode group(s) with one-sided coverage: ${oneSided.join("; ")}. ` + "Add the missing accept or reject vectors so the verifier is proven in both directions.", ).toEqual([]); }); @@ -72,7 +77,10 @@ describe("coverage shape — no one-sided verify corpus", () => { // The corpus carries only byte-level session vectors; the adversarial // reject coverage lives in the direct suite. Assert it exists and drives // the real verifier so the semantic coverage cannot vanish unnoticed. - const suite = readFileSync(join(here, "session-voucher-verify.test.ts"), "utf8"); + const suite = readFileSync( + join(here, "session-voucher-verify.test.ts"), + "utf8", + ); expect(suite).toContain("verifyVoucherForChannel"); expect(suite).toContain("expires-within-settlement-window"); }); diff --git a/harness/test/e2e.test.ts b/harness/test/e2e.test.ts index 6d3b65ae8..c8bae6119 100644 --- a/harness/test/e2e.test.ts +++ b/harness/test/e2e.test.ts @@ -1276,7 +1276,7 @@ describe("mpp harness", () => { // The x402-upto settle path prepends idempotent createPayee + createTreasury // ATA instructions (see expectPaymentChannelSettlement); the SDK session // close path builds exactly [ed25519, settle, distribute] with NO create-ATA - // (see expectSessionChannelSettlement). Against the pinned d1dee6b program a + // (see expectSessionChannelSettlement). Against the pinned 0c07d575 program a // session close to a payee with no ATA does not revert — it returns 200 with // a settledSignature — but the on-chain distribute neither creates the payee // ATA nor delivers the payout: the recipient receives 0 and no ATA is diff --git a/harness/test/harness-gates.test.ts b/harness/test/harness-gates.test.ts index f9b04f72e..344973963 100644 --- a/harness/test/harness-gates.test.ts +++ b/harness/test/harness-gates.test.ts @@ -125,6 +125,32 @@ describe("M-8: assert-run-count run-count guard", () => { const { code, stderr } = runAssertRunCount(["--report", report, "--exact", "2"]); expect(code, stderr).toBe(0); }); + + it("fails all-assertion mode when every selected test was skipped", () => { + const report = writeReport({ + success: true, + testResults: [{ assertionResults: [{ title: "security suite", status: "skipped" }] }], + }); + const { code, stderr } = runAssertRunCount(["--report", report, "--all", "--min", "1"]); + expect(code, stderr).not.toBe(0); + expect(stderr).toContain("Zero test assertion(s) EXECUTED"); + }); + + it("counts every passed assertion in all-assertion mode", () => { + const report = writeReport({ + success: true, + testResults: [ + { + assertionResults: [ + { title: "security suite one", status: "passed" }, + { title: "security suite two", status: "passed" }, + ], + }, + ], + }); + const { code, stderr } = runAssertRunCount(["--report", report, "--all", "--exact", "2"]); + expect(code, stderr).toBe(0); + }); }); describe("M-9: on-chain settlement gate", () => { diff --git a/harness/test/matrix-coverage-gate.test.ts b/harness/test/matrix-coverage-gate.test.ts index 36082a2bb..76f170c0f 100644 --- a/harness/test/matrix-coverage-gate.test.ts +++ b/harness/test/matrix-coverage-gate.test.ts @@ -156,7 +156,7 @@ const OUTCOMES: string[] = [ // mpp-session voucher reject codes "below-min-delta", "channel-close-pending", - "channel-finalized", + "channel-sealed", "cumulative-not-monotonic", "exceeds-deposit", "expired", @@ -292,11 +292,10 @@ const COVERED: Record = { test: "vector x402-exact-fee-payer-as-source-ata (x402-exact-reject.json), run cross-SDK against the REAL Go + Rust verifiers via conformance.test.ts (MPP_CONFORMANCE_LANGUAGES=go|rust legs)", tier: "T0", }, - "x402-exact-verify-server::invalid_exact_svm_payload_transaction_instructions_compute_price_instruction_too_high": - { - test: "vector x402-exact-compute-price-too-high (x402-exact-reject.json)", - tier: "T0", - }, + "x402-exact-verify-server::invalid_exact_svm_payload_transaction_instructions_compute_price_instruction_too_high": { + test: "vector x402-exact-compute-price-too-high (x402-exact-reject.json)", + tier: "T0", + }, "x402-exact-verify-server::invalid_exact_svm_payload_memo_count": { test: "vector x402-exact-memo-count (x402-exact-reject.json)", tier: "T0", @@ -498,17 +497,50 @@ const COVERED: Record = { tier: "T0", }, // ---- mpp-session voucher (all direct-verified) ---- - "mpp-session-voucher::accepted": { test: "session-voucher-verify.test.ts (valid in-window)", tier: "T0" }, - "mpp-session-voucher::replayed": { test: "session-voucher-verify.test.ts (exact resubmission)", tier: "T0" }, - "mpp-session-voucher::below-min-delta": { test: "session-voucher-verify.test.ts", tier: "T0" }, - "mpp-session-voucher::channel-close-pending": { test: "session-voucher-verify.test.ts", tier: "T0" }, - "mpp-session-voucher::channel-finalized": { test: "session-voucher-verify.test.ts", tier: "T0" }, - "mpp-session-voucher::cumulative-not-monotonic": { test: "session-voucher-verify.test.ts", tier: "T0" }, - "mpp-session-voucher::exceeds-deposit": { test: "session-voucher-verify.test.ts", tier: "T0" }, - "mpp-session-voucher::expired": { test: "session-voucher-verify.test.ts", tier: "T0" }, - "mpp-session-voucher::expiry-too-soon": { test: "session-voucher-verify.test.ts (expires-within-settlement-window)", tier: "T0" }, - "mpp-session-voucher::invalid-cumulative": { test: "session-voucher-verify.test.ts", tier: "T0" }, - "mpp-session-voucher::invalid-signature": { test: "session-voucher-verify.test.ts", tier: "T0" }, + "mpp-session-voucher::accepted": { + test: "session-voucher-verify.test.ts (valid in-window)", + tier: "T0", + }, + "mpp-session-voucher::replayed": { + test: "session-voucher-verify.test.ts (exact resubmission)", + tier: "T0", + }, + "mpp-session-voucher::below-min-delta": { + test: "session-voucher-verify.test.ts", + tier: "T0", + }, + "mpp-session-voucher::channel-close-pending": { + test: "session-voucher-verify.test.ts", + tier: "T0", + }, + "mpp-session-voucher::channel-sealed": { + test: "session-voucher-verify.test.ts", + tier: "T0", + }, + "mpp-session-voucher::cumulative-not-monotonic": { + test: "session-voucher-verify.test.ts", + tier: "T0", + }, + "mpp-session-voucher::exceeds-deposit": { + test: "session-voucher-verify.test.ts", + tier: "T0", + }, + "mpp-session-voucher::expired": { + test: "session-voucher-verify.test.ts", + tier: "T0", + }, + "mpp-session-voucher::expiry-too-soon": { + test: "session-voucher-verify.test.ts (expires-within-settlement-window)", + tier: "T0", + }, + "mpp-session-voucher::invalid-cumulative": { + test: "session-voucher-verify.test.ts", + tier: "T0", + }, + "mpp-session-voucher::invalid-signature": { + test: "session-voucher-verify.test.ts", + tier: "T0", + }, "mpp-session-voucher-canonical-bytes::accept": { test: "session-voucher-verify.test.ts byte-layout + vector session-voucher-preimage-frozen (session-voucher.json)", tier: "T0", @@ -557,10 +589,7 @@ const COVERED: Record = { // a covering test should use and how to cover it (which vector/test to add). // severity x likelihood drives the ranked top-gap report. // --------------------------------------------------------------------------- -const KNOWN_GAP: Record< - string, - { tier: Tier; severity: Sev; likelihood: Sev; reason: string; how: string } -> = { +const KNOWN_GAP: Record = { // ---- x402-exact structural verifier: the untested slots of a fund-safety verifier ---- "x402-exact-verify-server::invalid_exact_svm_payload_transaction_instructions_length": { tier: "T0", @@ -569,22 +598,20 @@ const KNOWN_GAP: Record< reason: "No vector exercises the [3,6] instruction-count bound (verify.go:75).", how: "Add x402-exact-ix-count-out-of-range vectors (2-ix and 7-ix txs) to x402-exact-reject.json.", }, - "x402-exact-verify-server::invalid_exact_svm_payload_transaction_instructions_compute_limit_instruction": - { - tier: "T0", - severity: "high", - likelihood: "medium", - reason: "ix[0]-not-SetComputeUnitLimit path (verify.go:147) is unvectored; a payer could omit/spoof the CU-limit guard.", - how: "Add x402-exact-compute-limit-wrong-program vector (ix[0] = non-ComputeBudget) to x402-exact-reject.json.", - }, - "x402-exact-verify-server::invalid_exact_svm_payload_transaction_instructions_compute_price_instruction": - { - tier: "T0", - severity: "medium", - likelihood: "medium", - reason: "ix[1]-not-SetComputeUnitPrice path (verify.go:159) is unvectored (only the too-high price is tested).", - how: "Add x402-exact-compute-price-wrong-program vector to x402-exact-reject.json.", - }, + "x402-exact-verify-server::invalid_exact_svm_payload_transaction_instructions_compute_limit_instruction": { + tier: "T0", + severity: "high", + likelihood: "medium", + reason: "ix[0]-not-SetComputeUnitLimit path (verify.go:147) is unvectored; a payer could omit/spoof the CU-limit guard.", + how: "Add x402-exact-compute-limit-wrong-program vector (ix[0] = non-ComputeBudget) to x402-exact-reject.json.", + }, + "x402-exact-verify-server::invalid_exact_svm_payload_transaction_instructions_compute_price_instruction": { + tier: "T0", + severity: "medium", + likelihood: "medium", + reason: "ix[1]-not-SetComputeUnitPrice path (verify.go:159) is unvectored (only the too-high price is tested).", + how: "Add x402-exact-compute-price-wrong-program vector to x402-exact-reject.json.", + }, "x402-exact-verify-server::invalid_exact_svm_payload_unknown_fifth_instruction": { tier: "T0", severity: "low", @@ -906,12 +933,9 @@ const KNOWN_GAP: Record< // cannot arise on this path, each with a reason. // --------------------------------------------------------------------------- const NOT_APPLICABLE: Record = { - "x402-exact-verify-server::invalid_exact_svm_payload_transaction": - "Reference-only (@x402/svm) generic transaction failure; Go verify.go never emits it (documented divergence).", - "x402-exact-verify-server::invalid_exact_svm_payload_missing_fee_payer": - "Reference-only (@x402/svm); the Go structural verifier does not emit a missing-fee-payer code (divergence).", - "x402-exact-verify-server::invalid_exact_svm_payload_unknown_seventh_instruction": - "Unreachable in Go: the instruction count is capped at 6 (verify.go:74) before any 7th-slot check.", + "x402-exact-verify-server::invalid_exact_svm_payload_transaction": "Reference-only (@x402/svm) generic transaction failure; Go verify.go never emits it (documented divergence).", + "x402-exact-verify-server::invalid_exact_svm_payload_missing_fee_payer": "Reference-only (@x402/svm); the Go structural verifier does not emit a missing-fee-payer code (divergence).", + "x402-exact-verify-server::invalid_exact_svm_payload_unknown_seventh_instruction": "Unreachable in Go: the instruction count is capped at 6 (verify.go:74) before any 7th-slot check.", }; // --------------------------------------------------------------------------- @@ -935,7 +959,7 @@ const DEAD_OR_ALIAS: Record = { "challenge-route-mismatch": "legacy alias -> canonical challenge_route_mismatch (tracked as a KNOWN_GAP cell).", "invalid-method": "legacy alias -> challenge_route_mismatch.", "rpc-error": "legacy alias -> payment_invalid.", - "other": "legacy catch-all -> payment_invalid.", + other: "legacy catch-all -> payment_invalid.", "amount-mismatch": "normalized/legacy alias; x402 amount enforced via invalid_exact_svm_payload_amount_mismatch (covered), charge via charge_request_mismatch.", "decimals-mismatch": "normalized code that surfaces as no-matching-transfer in the reference (reject.ts note); covered via charge-transferchecked-decimals-mismatch.", "invalid-payload": "normalized generic fallback; exercised via x402-exact-defect-verify (undecodable) + flows invalid_payload.", @@ -1020,7 +1044,7 @@ const APPLICABLE_CELLS: string[] = [ "mpp-session-voucher::accepted", "mpp-session-voucher::below-min-delta", "mpp-session-voucher::channel-close-pending", - "mpp-session-voucher::channel-finalized", + "mpp-session-voucher::channel-sealed", "mpp-session-voucher::cumulative-not-monotonic", "mpp-session-voucher::exceeds-deposit", "mpp-session-voucher::expired", @@ -1140,11 +1164,7 @@ function vectorRejectStrings(): Set { return codes; } -const accountedOutcomes = new Set([ - ...cellKeys.map(outcomeOf), - ...Object.keys(NOT_APPLICABLE).map(outcomeOf), - ...Object.keys(DEAD_OR_ALIAS), -]); +const accountedOutcomes = new Set([...cellKeys.map(outcomeOf), ...Object.keys(NOT_APPLICABLE).map(outcomeOf), ...Object.keys(DEAD_OR_ALIAS)]); describe("matrix coverage gate: every applicable (path,outcome) is covered or a declared gap", () => { it("has a non-trivial matrix (paths, outcomes, cells)", () => { @@ -1159,16 +1179,11 @@ describe("matrix coverage gate: every applicable (path,outcome) is covered or a }); it("enumerates each applicable cell exactly once", () => { - const duplicates = APPLICABLE_CELLS.filter( - (key, index) => APPLICABLE_CELLS.indexOf(key) !== index, - ); + const duplicates = APPLICABLE_CELLS.filter((key, index) => APPLICABLE_CELLS.indexOf(key) !== index); expect(duplicates, `duplicate APPLICABLE_CELLS entries: ${duplicates.join(", ")}`).toEqual([]); const applicable = new Set(APPLICABLE_CELLS); const unlisted = cellKeys.filter((key) => !applicable.has(key)); - expect( - unlisted, - `classified cell(s) missing from APPLICABLE_CELLS: ${unlisted.join(", ")}`, - ).toEqual([]); + expect(unlisted, `classified cell(s) missing from APPLICABLE_CELLS: ${unlisted.join(", ")}`).toEqual([]); }); it("references only enumerated paths and outcomes (no typo'd axis)", () => { @@ -1178,9 +1193,7 @@ describe("matrix coverage gate: every applicable (path,outcome) is covered or a const badOutcome = cellKeys.filter((k) => !outcomes.has(outcomeOf(k))); expect(badPath, `cells on unknown path: ${badPath.join(", ")}`).toEqual([]); expect(badOutcome, `cells with unknown outcome: ${badOutcome.join(", ")}`).toEqual([]); - const naBad = Object.keys(NOT_APPLICABLE).filter( - (k) => !paths.has(pathOf(k)) || !outcomes.has(outcomeOf(k)), - ); + const naBad = Object.keys(NOT_APPLICABLE).filter((k) => !paths.has(pathOf(k)) || !outcomes.has(outcomeOf(k))); expect(naBad, `NOT_APPLICABLE on unknown path/outcome: ${naBad.join(", ")}`).toEqual([]); }); @@ -1190,19 +1203,14 @@ describe("matrix coverage gate: every applicable (path,outcome) is covered or a const orphanPaths = PATHS.filter((p) => !withCells.has(p)); expect( orphanPaths, - `protocol path(s) with no COVERED/KNOWN_GAP cell: ${orphanPaths.join(", ")}. ` + - "Classify at least one (path,outcome) cell (accept or a reject) or the path is untested-in-the-dark.", + `protocol path(s) with no COVERED/KNOWN_GAP cell: ${orphanPaths.join(", ")}. ` + "Classify at least one (path,outcome) cell (accept or a reject) or the path is untested-in-the-dark.", ).toEqual([]); }); // TRIPWIRE 2: a new reject code nobody mapped turns this red. it("accounts for every enumerated OUTCOME id", () => { const unaccounted = OUTCOMES.filter((o) => !accountedOutcomes.has(o)); - expect( - unaccounted, - `outcome id(s) not accounted: ${unaccounted.join(", ")}. ` + - "Bind to a matrix cell (COVERED/KNOWN_GAP), or add to NOT_APPLICABLE / DEAD_OR_ALIAS with a reason.", - ).toEqual([]); + expect(unaccounted, `outcome id(s) not accounted: ${unaccounted.join(", ")}. ` + "Bind to a matrix cell (COVERED/KNOWN_GAP), or add to NOT_APPLICABLE / DEAD_OR_ALIAS with a reason.").toEqual([]); }); // TRIPWIRE 3: a new normalized RejectCode in schema.ts turns this red. @@ -1210,22 +1218,16 @@ describe("matrix coverage gate: every applicable (path,outcome) is covered or a const live = schemaRejectCodes(); expect(live.length).toBeGreaterThan(10); const missing = live.filter((c) => !accountedOutcomes.has(c) && !OUTCOMES.includes(c)); - expect( - missing, - `schema.ts RejectCode(s) missing from the matrix taxonomy: ${missing.join(", ")}. ` + - "Add to OUTCOMES and classify.", - ).toEqual([]); + expect(missing, `schema.ts RejectCode(s) missing from the matrix taxonomy: ${missing.join(", ")}. ` + "Add to OUTCOMES and classify.").toEqual([]); }); // TRIPWIRE 4: a vector inventing an unmapped reject string turns this red. it("accounts for every reject string actually emitted by a vector on disk (live)", () => { const emitted = [...vectorRejectStrings()]; const unmapped = emitted.filter((c) => !accountedOutcomes.has(c) && !OUTCOMES.includes(c)); - expect( - unmapped, - `vector reject code(s) with no matrix classification: ${unmapped.join(", ")}. ` + - "Add to OUTCOMES and classify (a vector cannot emit a code the matrix does not know).", - ).toEqual([]); + expect(unmapped, `vector reject code(s) with no matrix classification: ${unmapped.join(", ")}. ` + "Add to OUTCOMES and classify (a vector cannot emit a code the matrix does not know).").toEqual( + [], + ); }); // Per-cell: every enumerated applicable cell must be COVERED, KNOWN_GAP, or @@ -1247,10 +1249,7 @@ describe("matrix coverage gate: every applicable (path,outcome) is covered or a } else if (notApplicable) { expect(notApplicable.length, `${key}: NOT_APPLICABLE must give a reason`).toBeGreaterThan(0); } else { - throw new Error( - `${key} is neither COVERED, KNOWN_GAP, nor NOT_APPLICABLE. An applicable cell ` + - "must be classified — cover it, declare the gap, or document why it cannot apply.", - ); + throw new Error(`${key} is neither COVERED, KNOWN_GAP, nor NOT_APPLICABLE. An applicable cell ` + "must be classified — cover it, declare the gap, or document why it cannot apply."); } }); } diff --git a/harness/test/mode-support.test.ts b/harness/test/mode-support.test.ts new file mode 100644 index 000000000..a9b162ac5 --- /dev/null +++ b/harness/test/mode-support.test.ts @@ -0,0 +1,102 @@ +import { describe, expect, it } from "vitest"; +import { + assertDeclaredModeWasExecuted, + assertStrictModeCoverage, + declaresModeSupport, + recordModeExecution, +} from "../src/conformance/mode-support"; +import { + discoverRunners, + type ModeCapabilities, +} from "../src/conformance/runners"; +import { assertRequestedLanguagesResolved } from "../src/conformance/select"; + +const capabilities: ModeCapabilities = { + "x402-exact": ["verify-x402-transaction"], +}; +const vector = { + id: "partial-runner-reject-vector", + intent: "x402-exact" as const, + mode: "verify-x402-transaction" as const, +}; +const strictCapabilities: ModeCapabilities = { + "x402-exact": ["verify-transaction", "verify-x402-transaction"], +}; + +function completeMode( + counts: Map, + mode: "verify-transaction" | "verify-x402-transaction", +): void { + for (const outcome of ["accept", "reject"] as const) { + recordModeExecution( + counts, + "strict-runner", + { intent: "x402-exact", mode }, + outcome, + ); + } +} + +describe("declared conformance mode support", () => { + it("rejects a runner that only executes part of a declared mode", () => { + expect(declaresModeSupport(capabilities, vector)).toBe(true); + expect(() => { + for (const result of [ + { id: "partial-runner-accept-vector", outcome: "accept" as const }, + { id: vector.id, outcome: "unsupported-mode" as const }, + ]) { + assertDeclaredModeWasExecuted( + "partial-runner", + capabilities, + vector, + result, + ); + } + }).toThrow( + /partial-runner.*declares.*verify-x402-transaction.*unsupported-mode/, + ); + }); + + it("pins Rust x402-exact to both strict verifier modes", () => { + const rust = discoverRunners().find((runner) => runner.language === "rust"); + expect(rust?.strictModesByIntent?.["x402-exact"]).toEqual([ + "verify-transaction", + "verify-x402-transaction", + ]); + }); + + it("rejects a missing strict mode", () => { + const counts = new Map(); + completeMode(counts, "verify-transaction"); + + expect(() => + assertStrictModeCoverage("strict-runner", strictCapabilities, counts), + ).toThrow(/verify-x402-transaction.*no accept/); + }); + + it("rejects a strict mode with only one outcome", () => { + const counts = new Map(); + completeMode(counts, "verify-transaction"); + recordModeExecution( + counts, + "strict-runner", + { intent: "x402-exact", mode: "verify-x402-transaction" }, + "accept", + ); + + expect(() => + assertStrictModeCoverage("strict-runner", strictCapabilities, counts), + ).toThrow(/verify-x402-transaction.*no reject/); + }); + + it("rejects a partially unmatched language allowlist", () => { + expect(() => + assertRequestedLanguagesResolved( + new Set(["rust", "ruts"]), + ["rust"], + ["rust", "typescript"], + "fixture allowlist", + ), + ).toThrow(/did not resolve requested language\(s\): ruts/); + }); +}); diff --git a/harness/test/protocol-conformance.test.ts b/harness/test/protocol-conformance.test.ts index d123008a8..a504d531b 100644 --- a/harness/test/protocol-conformance.test.ts +++ b/harness/test/protocol-conformance.test.ts @@ -19,7 +19,10 @@ import { discoverProtocolRunners, spawnedProtocolAdapter, } from "../src/protocol/runners/spawn"; -import { parseLanguageAllowlist } from "../src/conformance/select"; +import { + assertRequestedLanguagesResolved, + parseLanguageAllowlist, +} from "../src/conformance/select"; const cases = collectProtocolCases(); @@ -58,9 +61,9 @@ describe("mpp-protocol conformance (canonical vectors / TypeScript runner)", () }); it("rejects over-budget constructed wire before adapter spawn", () => { - expect(() => - materializeWire({ repeat: "x", count: 100_001 }), - ).toThrow(/resource-bound: constructed wire repeat count/); + expect(() => materializeWire({ repeat: "x", count: 100_001 })).toThrow( + /resource-bound: constructed wire repeat count/, + ); }); for (const testCase of cases) { @@ -75,7 +78,10 @@ describe("mpp-protocol conformance (canonical vectors / TypeScript runner)", () const result = await runCase(typescriptProtocolAdapter, testCase); // Assert the divergence persists. Remove the entry from // KNOWN_TS_DIVERGENCES once the TS core conforms. - expect(result.ok, `${key} now conforms — remove from KNOWN_TS_DIVERGENCES`).toBe(false); + expect( + result.ok, + `${key} now conforms — remove from KNOWN_TS_DIVERGENCES`, + ).toBe(false); }); continue; } @@ -181,9 +187,7 @@ describe("mpp-protocol conformance (pay-kit extra: adversarial cases vs TS refer // (loudly) the moment an SDK is fixed so its entry must be removed. php // conforms fully. const KNOWN_RUNNER_DIVERGENCES: Record> = { - typescript: new Set([ - ...KNOWN_TS_DIVERGENCES, - ]), + typescript: new Set([...KNOWN_TS_DIVERGENCES]), go: new Set([ "challenge.format :: error_format_crlf_in_description", "challenge.parse :: error_uppercase_method", @@ -215,25 +219,26 @@ const KNOWN_RUNNER_DIVERGENCES: Record> = { // in-process TypeScript-reference describe blocks above run regardless, so // wiring this file with `=typescript` already un-blinds the WWW-Authenticate / // receipt / canonical vectors against the reference verifier in CI. -const runnerAllowlist = parseLanguageAllowlist(process.env.MPP_CONFORMANCE_LANGUAGES); -const runners = discoverProtocolRunners().filter( +const runnerAllowlist = parseLanguageAllowlist( + process.env.MPP_CONFORMANCE_LANGUAGES, +); +const discoveredRunners = discoverProtocolRunners(); +const runners = discoveredRunners.filter( (runner) => !runnerAllowlist || runnerAllowlist.has(runner.language), ); -// Anti-vacuous-pass guard (mirrors conformance.test.ts): at least one spawned -// protocol runner MUST be selected. The in-process TypeScript blocks above -// always run, so a typo like "rustt" or deleting every manifest would otherwise -// exercise zero spawned SDKs and still pass. +// Anti-vacuous-pass guard (mirrors conformance.test.ts): every requested +// language must have a spawned protocol runner. The in-process TypeScript blocks +// above cannot make a partially stale allowlist count as cross-SDK coverage. describe("protocol conformance runner selection", () => { - it("resolves at least one spawned protocol runner", () => { + it("resolves every requested spawned protocol runner", () => { if (runnerAllowlist) { - const available = discoverProtocolRunners().map((r) => r.language).join(", "); - expect( - runners.length, - `MPP_CONFORMANCE_LANGUAGES=${process.env.MPP_CONFORMANCE_LANGUAGES} matched no ` + - `discovered protocol runner (available: ${available}). A typo or a missing ` + - `manifest would otherwise run zero spawned SDKs and pass green.`, - ).toBeGreaterThan(0); + assertRequestedLanguagesResolved( + runnerAllowlist, + runners.map((runner) => runner.language), + discoveredRunners.map((runner) => runner.language), + `MPP_CONFORMANCE_LANGUAGES=${process.env.MPP_CONFORMANCE_LANGUAGES ?? ""} protocol runners`, + ); } else { expect( runners.length, @@ -242,6 +247,28 @@ describe("protocol conformance runner selection", () => { } }); + it("gives every selected runner positive and error cases", () => { + for (const runner of runners) { + const eligibleCases = cases.filter((testCase) => + caseRunsOnAdapter(testCase, runner.language), + ); + const positive = eligibleCases.filter( + (testCase) => testCase.expectSuccess, + ); + const errors = eligibleCases.filter( + (testCase) => !testCase.expectSuccess, + ); + expect( + positive.length, + `${runner.language} protocol runner has no eligible positive case`, + ).toBeGreaterThan(0); + expect( + errors.length, + `${runner.language} protocol runner has no eligible error case`, + ).toBeGreaterThan(0); + } + }); + it("rejects spawned runner identity mismatch", async () => { const adapter = spawnedProtocolAdapter({ language: "go", diff --git a/harness/test/vector-accounting.test.ts b/harness/test/vector-accounting.test.ts index 996b52798..2013d20ef 100644 --- a/harness/test/vector-accounting.test.ts +++ b/harness/test/vector-accounting.test.ts @@ -15,19 +15,18 @@ import { describe, expect, it } from "vitest"; // nothing, which is exactly the false-green class this PR exists to kill. // // This test makes the vector tree self-accounting: every *.json under -// harness/vectors/ must map to a declared consumer below. Adding a new vector -// directory now fails here until its consuming driver is declared, so a future -// vector file cannot silently sit unexecuted. +// harness/vectors/ must map to a declared consumer below. The mapping is +// deliberately per FILE, not per directory: a new ignored-security-case.json +// beside a consumed protocol vector must fail closed instead of inheriting a +// directory's coverage claim. const here = dirname(fileURLToPath(import.meta.url)); const vectorsDir = join(here, "..", "vectors"); -// Each vector file's consumer, keyed by its immediate location under -// harness/vectors/. "conformance-driver" and the protocol/flow drivers EXECUTE -// their vectors; the *-catalog entries are non-executable reason banks that a -// dedicated schema test validates (regression-bank.test.ts for the known-bad -// bank; this file for the voucher reject catalog). Keep this map in sync with -// the drivers when a vector directory is added. +// "conformance-driver" and the protocol/flow drivers EXECUTE their vectors; +// the *-catalog entries are non-executable reason banks that a dedicated schema +// test validates. Every entry is explicit so a new file cannot silently inherit +// its sibling's consumer. type Consumer = | "conformance-driver" // test/conformance.test.ts (top-level *.json, executed) | "protocol-layer" // src/protocol/* (mpp-protocol/*, executed) @@ -36,13 +35,31 @@ type Consumer = | "voucher-reject-catalog" // this file (schema-validated) | "value-binding-catalog"; // spec mirror; cases executed inline by test/value-binding-verify.test.ts, shape-validated here -const DIRECTORY_CONSUMERS: Record = { - "": "conformance-driver", - "mpp-protocol": "protocol-layer", - "mpp-protocol-flows": "flow-driver", - "known-bad": "regression-bank-catalog", - "session-voucher": "voucher-reject-catalog", - "value-binding": "value-binding-catalog", +const FILE_CONSUMERS: Record = { + "canonical-bytes.json": "conformance-driver", + "charge-defaults.json": "conformance-driver", + "charge-envelope.json": "conformance-driver", + "charge-precedence.json": "conformance-driver", + "charge-rejects.json": "conformance-driver", + "session-voucher.json": "conformance-driver", + "wire-bytes.json": "conformance-driver", + "x402-build.json": "conformance-driver", + "x402-exact-reject.json": "conformance-driver", + "x402-extensions.json": "conformance-driver", + "x402-v1-build.json": "conformance-driver", + "x402-v1-verify.json": "conformance-driver", + "x402-verify.json": "conformance-driver", + "known-bad/regression-bank.json": "regression-bank-catalog", + "mpp-protocol-flows/flows.json": "flow-driver", + "mpp-protocol-flows/golden-results.json": "flow-driver", + "mpp-protocol/authorization.json": "protocol-layer", + "mpp-protocol/base64url.json": "protocol-layer", + "mpp-protocol/challenge-id.json": "protocol-layer", + "mpp-protocol/receipt.json": "protocol-layer", + "mpp-protocol/www-authenticate.json": "protocol-layer", + "session-voucher/session-voucher-reject.json": "voucher-reject-catalog", + "value-binding/open.json": "value-binding-catalog", + "value-binding/topup.json": "value-binding-catalog", }; function listJsonFiles(root: string): string[] { @@ -61,10 +78,16 @@ function listJsonFiles(root: string): string[] { return out; } -function immediateDir(fileFromVectors: string): string { - const rel = relative(vectorsDir, fileFromVectors); - const dir = dirname(rel); - return dir === "." ? "" : dir; +function relativeVectorPath(fileFromVectors: string): string { + return relative(vectorsDir, fileFromVectors).replaceAll("\\", "/"); +} + +function corpusGaps(files: readonly string[]): { unaccounted: string[]; stale: string[] } { + const actual = new Set(files.map(relativeVectorPath)); + return { + unaccounted: [...actual].filter((file) => !(file in FILE_CONSUMERS)).sort(), + stale: Object.keys(FILE_CONSUMERS).filter((file) => !actual.has(file)).sort(), + }; } describe("vector corpus accounting", () => { @@ -76,22 +99,27 @@ describe("vector corpus accounting", () => { expect(files.length).toBeGreaterThanOrEqual(10); }); - it("accounts for every *.json under vectors/ (no orphaned corpus)", () => { - const orphans: string[] = []; - for (const file of files) { - const dir = immediateDir(file); - if (!(dir in DIRECTORY_CONSUMERS)) { - orphans.push(relative(vectorsDir, file)); - } - } + it("accounts for every *.json under vectors/ by exact file path", () => { + const { unaccounted, stale } = corpusGaps(files); expect( - orphans, - `Unaccounted vector file(s): ${orphans.join(", ")}. ` + + unaccounted, + `Unaccounted vector file(s): ${unaccounted.join(", ")}. ` + "Every *.json under harness/vectors/ must be executed by a driver or " + - "validated as a catalog. Declare its directory in DIRECTORY_CONSUMERS " + + "validated as a catalog. Declare its exact path in FILE_CONSUMERS " + "(vector-accounting.test.ts) and wire the consuming driver, or the file " + "is a false green: it looks like coverage but guards nothing.", ).toEqual([]); + expect( + stale, + `Stale vector consumer entries: ${stale.join(", ")}. Remove the entry or restore the vector.`, + ).toEqual([]); + }); + + it("rejects an unconsumed file even when it sits beside consumed protocol vectors", () => { + const ignored = join(vectorsDir, "mpp-protocol", "ignored-security-case.json"); + expect(corpusGaps([...files, ignored]).unaccounted).toContain( + "mpp-protocol/ignored-security-case.json", + ); }); it("validates the session-voucher reject catalog shape", () => { @@ -99,11 +127,7 @@ describe("vector corpus accounting", () => { // so validate it as one and pin the security-critical voucher reject reasons // so the bank cannot silently drop them. Executing these against the runners // (as x402-exact-reject.json is executed) is the tracked follow-up. - const catalogPath = join( - vectorsDir, - "session-voucher", - "session-voucher-reject.json", - ); + const catalogPath = join(vectorsDir, "session-voucher", "session-voucher-reject.json"); const catalog = JSON.parse(readFileSync(catalogPath, "utf8")) as Array<{ tag: string; reason: string; @@ -121,9 +145,7 @@ describe("vector corpus accounting", () => { tags.add(entry.tag); expect(entry.reason, `${entry.tag}.reason`).toBe(entry.tag); expect(typeof entry.description, `${entry.tag}.description`).toBe("string"); - expect(entry.description.trim(), `${entry.tag}.description non-empty`).not.toBe( - "", - ); + expect(entry.description.trim(), `${entry.tag}.description non-empty`).not.toBe(""); } // The voucher trust model turns on these classes; a reject bank that drops @@ -135,7 +157,7 @@ describe("vector corpus accounting", () => { "expired", "expires-within-settlement-window", "invalid-signature", - "channel-finalized", + "channel-sealed", "channel-close-pending", ]; for (const reason of REQUIRED_REJECT_REASONS) { diff --git a/harness/test/x402-exact-managed-signer.test.ts b/harness/test/x402-exact-managed-signer.test.ts new file mode 100644 index 000000000..bb55fa461 --- /dev/null +++ b/harness/test/x402-exact-managed-signer.test.ts @@ -0,0 +1,55 @@ +import { address } from "@solana/kit"; +import { findAssociatedTokenPda } from "@solana-program/token"; +import { describe, expect, it } from "vitest"; +import { assertNoManagedTransferFunding } from "../src/conformance/x402"; + +const CANONICAL_ERROR = + "invalid_exact_svm_payload_transaction_fee_payer_transferring_funds"; +const TOKEN_PROGRAM = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; +const TOKEN_2022_PROGRAM = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"; +const MINT = "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU"; +const MANAGED_SIGNER = "6AfzJJo1KfhNWKe56wa5EWszTNQ7B1W5Kfh5SY2JkRGQ"; +const CUSTOMER = "CXhrFZJLKqjzmP3sjYLcF4dTeXWKCy9e2SXXZ2Yo6MPY"; + +describe("x402 exact managed signer transfer guard", () => { + it("rejects a managed multisig signer in the transfer account tail", async () => { + await expect( + assertNoManagedTransferFunding( + [0, 1, 2, 3, 4], + [CUSTOMER, MINT, CUSTOMER, CUSTOMER, MANAGED_SIGNER], + MINT, + TOKEN_PROGRAM, + [MANAGED_SIGNER], + ), + ).rejects.toThrow(CANONICAL_ERROR); + }); + + it("rejects a managed signer named directly as the transfer source", async () => { + await expect( + assertNoManagedTransferFunding( + [0, 1, 2, 3], + [MANAGED_SIGNER, MINT, CUSTOMER, CUSTOMER], + MINT, + TOKEN_PROGRAM, + [MANAGED_SIGNER], + ), + ).rejects.toThrow(CANONICAL_ERROR); + }); + + it("derives the managed source ATA with the transfer's Token-2022 program", async () => { + const [managedAta] = await findAssociatedTokenPda({ + mint: address(MINT), + owner: address(MANAGED_SIGNER), + tokenProgram: address(TOKEN_2022_PROGRAM), + }); + await expect( + assertNoManagedTransferFunding( + [0, 1, 2, 3], + [String(managedAta), MINT, CUSTOMER, CUSTOMER], + MINT, + TOKEN_2022_PROGRAM, + [MANAGED_SIGNER], + ), + ).rejects.toThrow(CANONICAL_ERROR); + }); +}); diff --git a/harness/vectors/canonical-bytes.json b/harness/vectors/canonical-bytes.json index 7b1a3d8f5..114d03f79 100644 --- a/harness/vectors/canonical-bytes.json +++ b/harness/vectors/canonical-bytes.json @@ -28,7 +28,11 @@ "expect": { "outcome": "accept", "exactBytes": { - "bytes": [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47], + "bytes": [ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, + 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47 + ], "base64Url": "AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4v" } } @@ -86,7 +90,7 @@ "mode": "canonical-bytes", "description": "Divergence class: JCS number canonicalization (RFC 8785 3.2.2.3 / ECMAScript Number-to-String). Non-normalized numeric literals must serialize to their shortest canonical form: 1.0 -> 1, 1E2 -> 100, 100.00 -> 100, 1.50 -> 1.5. An SDK whose JSON stack preserves the raw number token (Go json.Number, Python Decimal, arbitrary-precision decoders) re-emits 1.0/1E2/100.00 verbatim and fails RED. Expected bytes computed per RFC 8785 with the JS reference (jcs.ts), which is canonical.", "input": { - "value": { "a": 1.0, "b": 1E2, "c": 100.00, "d": 1.50 } + "value": { "a": 1.0, "b": 1e2, "c": 100.0, "d": 1.5 } }, "expect": { "outcome": "accept", @@ -95,5 +99,56 @@ "base64Url": "eyJhIjoxLCJiIjoxMDAsImMiOjEwMCwiZCI6MS41fQ" } } + }, + { + "id": "canonical-json-es6-number-boundaries", + "intent": "charge", + "mode": "canonical-bytes", + "description": "Pins ECMAScript Number-to-String at the 1e21/1e-7 exponent boundaries, the 1e-6 fixed boundary, negative zero, and the IEEE-754 rounding boundary above 2^53.", + "input": { + "value": { + "a": 1e21, + "b": 1e-7, + "c": 1e-6, + "d": -0, + "e": 9007199254740993 + } + }, + "expect": { + "outcome": "accept", + "exactBytes": { + "canonicalJson": "{\"a\":1e+21,\"b\":1e-7,\"c\":0.000001,\"d\":0,\"e\":9007199254740992}", + "base64Url": "eyJhIjoxZSsyMSwiYiI6MWUtNywiYyI6MC4wMDAwMDEsImQiOjAsImUiOjkwMDcxOTkyNTQ3NDA5OTJ9" + } + } + }, + { + "id": "canonical-json-string-values-and-empty-containers", + "intent": "charge", + "mode": "canonical-bytes", + "description": "Pins a valid surrogate pair in a string value plus empty object and array serialization; key-only astral coverage cannot catch value encoding drift.", + "input": { + "value": { "emptyArray": [], "emptyObject": {}, "emoji": "😀" } + }, + "expect": { + "outcome": "accept", + "exactBytes": { + "canonicalJson": "{\"emoji\":\"😀\",\"emptyArray\":[],\"emptyObject\":{}}", + "base64Url": "eyJlbW9qaSI6IvCfmIAiLCJlbXB0eUFycmF5IjpbXSwiZW1wdHlPYmplY3QiOnt9fQ" + } + } + }, + { + "id": "canonical-json-rejects-lone-surrogate-value", + "intent": "charge", + "mode": "canonical-bytes", + "description": "RFC 8785 requires invalid Unicode data to fail; a JSON parser/canonicalizer pair must not replace or serialize a lone UTF-16 surrogate.", + "input": { + "value": { "bad": "\ud800" } + }, + "expect": { + "outcome": "reject", + "rejectReason": "lone surrogate in string value" + } } ] diff --git a/harness/vectors/session-voucher/session-voucher-reject.json b/harness/vectors/session-voucher/session-voucher-reject.json index a6edc790b..6470077cd 100644 --- a/harness/vectors/session-voucher/session-voucher-reject.json +++ b/harness/vectors/session-voucher/session-voucher-reject.json @@ -10,9 +10,9 @@ "description": "A cooperative close was already requested; no further vouchers are accepted." }, { - "tag": "channel-finalized", - "reason": "channel-finalized", - "description": "The channel is already finalized on-chain." + "tag": "channel-sealed", + "reason": "channel-sealed", + "description": "The channel is already sealed and cannot accept a voucher." }, { "tag": "cumulative-not-monotonic", diff --git a/scripts/check-payment-channels-revision.sh b/scripts/check-payment-channels-revision.sh new file mode 100644 index 000000000..b53cf6116 --- /dev/null +++ b/scripts/check-payment-channels-revision.sh @@ -0,0 +1,56 @@ +#!/usr/bin/env bash +# +# Verify every workflow that builds payment-channels uses the same epoch-aware +# program revision. A mismatched checkout decodes the new openSlot bytes as a +# recipient count, so the session harness fails on-chain with InvalidRecipientCount. + +set -euo pipefail + +ROOT="${ROOT:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}" +readonly EXPECTED_REPOSITORY="solana-foundation/payment-channels" +readonly EXPECTED_REF="0c07d5751c8972abf6a219570a3f39a72f46f879" +readonly TARGETS=( + ".github/actions/build-payment-channels/action.yml" + ".github/workflows/go.yml" + ".github/workflows/harness.yml" + ".github/workflows/python.yml" +) + +fail=0 +for target in "${TARGETS[@]}"; do + path="$ROOT/$target" + if [ ! -f "$path" ]; then + echo "FAIL [payment-channels-revision]: missing $target" + fail=1 + continue + fi + + block="$(awk ' + /^[[:space:]]*-[[:space:]]+name:[[:space:]]+Checkout payment channels program[[:space:]]*$/ { active = 1; next } + active && /^[[:space:]]*-[[:space:]]+name:/ { exit } + active { print } + ' "$path")" + if [ -z "$block" ]; then + echo "FAIL [payment-channels-revision]: $target has no payment-channels checkout block" + fail=1 + continue + fi + if ! grep -Eq "^[[:space:]]*repository: $EXPECTED_REPOSITORY[[:space:]]*$" <<<"$block"; then + echo "FAIL [payment-channels-revision]: $target must check out $EXPECTED_REPOSITORY" + fail=1 + fi + if [ "$target" = ".github/actions/build-payment-channels/action.yml" ]; then + if ! grep -Fqx " default: $EXPECTED_REF" "$path"; then + echo "FAIL [payment-channels-revision]: $target must default its ref to $EXPECTED_REF" + fail=1 + fi + elif ! grep -Eq "^[[:space:]]*ref: $EXPECTED_REF[[:space:]]*$" <<<"$block"; then + echo "FAIL [payment-channels-revision]: $target must pin $EXPECTED_REF" + fail=1 + fi +done + +if [ "$fail" -ne 0 ]; then + exit 1 +fi +echo "payment-channels-revision: OK" diff --git a/scripts/check-payment-channels-revision_test.sh b/scripts/check-payment-channels-revision_test.sh new file mode 100644 index 000000000..f66fdab32 --- /dev/null +++ b/scripts/check-payment-channels-revision_test.sh @@ -0,0 +1,77 @@ +#!/usr/bin/env bash + +set -uo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +GUARD="$SCRIPT_DIR/check-payment-channels-revision.sh" +EXPECTED_REF="0c07d5751c8972abf6a219570a3f39a72f46f879" +tmp="$(mktemp -d)" +trap 'rm -rf "$tmp"' EXIT +fails=0 + +write_fixture() { + local root="$1" + mkdir -p "$root/.github/actions/build-payment-channels" "$root/.github/workflows" + cat > "$root/.github/actions/build-payment-channels/action.yml" < "$root/.github/workflows/$workflow.yml" <&1)"; rc=$? +assert_rc "aligned workflow fixture passes" 0 "$rc" + +stale="$tmp/stale" +write_fixture "$stale" +sed -i.bak 's/0c07d5751c8972abf6a219570a3f39a72f46f879/d1dee6b34d45d4e4a1ed3174ef421ca2e801aaea/' "$stale/.github/workflows/harness.yml" +out="$(ROOT="$stale" bash "$GUARD" 2>&1)"; rc=$? +assert_rc "stale payment-channels ref fails" 1 "$rc" +case "$out" in + *"harness.yml must pin"*) echo "ok - stale ref identifies harness workflow" ;; + *) echo "FAIL - stale ref report lacks harness workflow"; fails=1 ;; +esac + +wrong_repo="$tmp/wrong-repo" +write_fixture "$wrong_repo" +sed -i.bak 's#solana-foundation/payment-channels#Moonsong-Labs/solana-payment-channels#' "$wrong_repo/.github/workflows/go.yml" +out="$(ROOT="$wrong_repo" bash "$GUARD" 2>&1)"; rc=$? +assert_rc "wrong payment-channels repository fails" 1 "$rc" +case "$out" in + *"go.yml must check out"*) echo "ok - wrong repository identifies go workflow" ;; + *) echo "FAIL - wrong repository report lacks go workflow"; fails=1 ;; +esac + +if [ "$fails" -ne 0 ]; then + echo "check-payment-channels-revision_test: FAIL" + exit 1 +fi +echo "check-payment-channels-revision_test: PASS" diff --git a/scripts/check-publish-workflow-guards.sh b/scripts/check-publish-workflow-guards.sh index 09f9aeae6..3d5609f4d 100755 --- a/scripts/check-publish-workflow-guards.sh +++ b/scripts/check-publish-workflow-guards.sh @@ -77,40 +77,37 @@ check_one() { # but keep them flowing through the step-block boundary logic below. } - # ---- Guard (a): top-level permissions must be read-only ---- + # ---- Guard (a): top-level permissions must be exactly contents: read ---- # The top-level block is the only `permissions:` at column 0. /^permissions:[[:space:]]*$/ { in_top_perms = 1 + saw_contents_read = 0 next } /^permissions:[[:space:]]*\{/ { - # Flow-mapping form on one line, e.g. permissions: { contents: write }. - if (index(lower($0), "write") > 0) { - printf("FAIL[%s]: top-level permissions grants write (must be read-only): %s\n", file, trim($0)) > "/dev/stderr" - fail = 1 - } + # Require the reviewable block form. Accepting an arbitrary flow mapping + # makes it too easy to hide extra read scopes next to contents: read. + printf("FAIL[%s]: top-level permissions must use an explicit block containing only contents: read: %s\n", file, trim($0)) > "/dev/stderr" + fail = 1 next } /^permissions:[[:space:]]*[^[:space:]{]/ { # Scalar shorthand on one line, e.g. permissions: write-all / read-all. # (The block form and flow-mapping form above already consumed their lines, # so this only fires on a scalar value.) Least privilege at the workflow - # level means the sole acceptable scalar is read-all; write-all — or any - # other non-read scalar — grants blanket write to the whole release-gate - # fan-out and must fail. - scalar = $0 - sub(/^permissions:[[:space:]]*/, "", scalar) - sub(/[[:space:]]*#.*$/, "", scalar) # drop any trailing inline comment - scalar = trim(scalar) - if (lower(scalar) != "read-all") { - printf("FAIL[%s]: top-level permissions grants write (must be read-only): %s\n", file, trim($0)) > "/dev/stderr" - fail = 1 - } + # `read-all` is still broader than least privilege: it exposes every + # readable token scope, not only repository contents. + printf("FAIL[%s]: scalar top-level permissions are forbidden; use only contents: read: %s\n", file, trim($0)) > "/dev/stderr" + fail = 1 next } in_top_perms == 1 { # A new column-0 key (non-space at position 1) ends the block. if ($0 ~ /^[^[:space:]]/) { + if (!saw_contents_read) { + printf("FAIL[%s]: top-level permissions must contain contents: read\n", file) > "/dev/stderr" + fail = 1 + } in_top_perms = 0 # fall through so this same line is still processed by later rules } else if ($0 ~ /^[[:space:]]*$/) { @@ -118,8 +115,12 @@ check_one() { next } else { # A grant line inside the top-level permissions mapping. - if (index(lower($0), "write") > 0) { - printf("FAIL[%s]: top-level permissions grants write (must be read-only): %s\n", file, trim($0)) > "/dev/stderr" + grant = trim($0) + sub(/[[:space:]]*#.*$/, "", grant) + if (grant == "contents: read") { + saw_contents_read = 1 + } else if (grant != "") { + printf("FAIL[%s]: unexpected top-level permission; only contents: read is allowed: %s\n", file, grant) > "/dev/stderr" fail = 1 } next @@ -183,6 +184,10 @@ check_one() { } END { + if (in_top_perms && !saw_contents_read) { + printf("FAIL[%s]: top-level permissions must contain contents: read\n", file) > "/dev/stderr" + fail = 1 + } if (in_step) flush_step() if (fail) exit 1 } diff --git a/scripts/check-publish-workflow-guards_test.sh b/scripts/check-publish-workflow-guards_test.sh index 98c6b3ebf..2e994630c 100755 --- a/scripts/check-publish-workflow-guards_test.sh +++ b/scripts/check-publish-workflow-guards_test.sh @@ -127,10 +127,9 @@ if "$guard" "$writeall_perms" > "$work/writeall-perms.log" 2>&1; then fi echo "check-publish-workflow-guards_test: writeall-permissions (scalar) fixture rejected (non-zero exit)" -# ---- Case 3: scalar read-all top-level permissions must pass ---- -# The scalar shorthand can also grant read-only (`permissions: read-all`), which -# is least-privilege and must be accepted. This pins the guard so it rejects the -# scalar form only when it grants write, not on the mere presence of the scalar. +# ---- Case 3: scalar read-all top-level permissions must fail ---- +# `read-all` exposes every readable token scope and is broader than the release +# workflows need. The guard requires the explicit `contents: read` block. readall_perms="$work/readall-permissions.yml" awk ' /^permissions:[[:space:]]*$/ { print "permissions: read-all"; in_perms = 1; next } @@ -144,11 +143,25 @@ awk ' if ! grep -Eq '^permissions:[[:space:]]*read-all[[:space:]]*$' "$readall_perms"; then fail "test setup error: readall-permissions fixture did not produce a scalar read-all top-level grant" fi -if ! "$guard" "$readall_perms" > "$work/readall-perms.log" 2>&1; then +if "$guard" "$readall_perms" > "$work/readall-perms.log" 2>&1; then echo "---- guard output (readall-permissions) ----" >&2 cat "$work/readall-perms.log" >&2 - fail "guard rejected a workflow whose top-level permissions is the scalar read-all (read-only scalar must pass the least-privilege guard)" + fail "guard accepted scalar read-all even though only contents: read is required" fi -echo "check-publish-workflow-guards_test: readall-permissions (scalar) fixture accepted (exit 0)" +echo "check-publish-workflow-guards_test: readall-permissions (scalar) fixture rejected (non-zero exit)" + +# ---- Case 4: an extra read scope in block form must fail ---- +extra_read="$work/extra-read-permissions.yml" +awk ' + { print } + /^ contents:[[:space:]]*read[[:space:]]*$/ { print " actions: read" } +' "$npm_workflow" > "$extra_read" + +if "$guard" "$extra_read" > "$work/extra-read-perms.log" 2>&1; then + echo "---- guard output (extra-read-permissions) ----" >&2 + cat "$work/extra-read-perms.log" >&2 + fail "guard accepted an unnecessary top-level actions: read scope" +fi +echo "check-publish-workflow-guards_test: extra read scope fixture rejected (non-zero exit)" echo "check-publish-workflow-guards_test: PASS - least-privilege and publish-success gating are enforced" diff --git a/scripts/check-repo-hygiene.sh b/scripts/check-repo-hygiene.sh index 1cf7a273f..4eace2d98 100755 --- a/scripts/check-repo-hygiene.sh +++ b/scripts/check-repo-hygiene.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # -# Repo-hygiene guards for two regressions that no other CI gate catches and +# Repo-hygiene guards for regressions that no other CI gate catches and # that a prior audit had to clean up by hand: # # 1. Audit finding IDs (e.g. "H-1", "M-3", "C-1", "L-4", "I-2", and the @@ -13,6 +13,10 @@ # pins parked there are silently NOT enforced. They must live in the # project's pnpm-workspace.yaml. # +# 3. npm package tarballs committed below typescript/packages/. Release jobs +# build tarballs in ignored staging directories; package archives do not +# belong in the source tree or review diff. +# # Exit non-zero if either guard trips. Safe to run from anywhere. # # ROOT defaults to the repo this script lives in, but can be overridden (e.g. @@ -90,6 +94,27 @@ else fail=1 fi +# --- Guard 3: no committed npm package tarballs ------------------------------- +# Inspect the Git index rather than the filesystem. This catches accidentally +# force-added package artifacts without rejecting ignored local `pnpm pack` +# output or the release workflow's `.npm-pack/` staging directory. Source +# archives may not include `.git`; in that environment there is no tracked-file +# state to validate, so report the skip explicitly. +if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then + tgz_offenders="$(git ls-files -- ':(glob)typescript/packages/**/*.tgz' 2>/dev/null || true)" + if [ -z "$tgz_offenders" ]; then + echo "PASS [package-tarballs]: no npm package tarballs are tracked under typescript/packages" + else + echo "FAIL [package-tarballs]: npm package tarballs must not be committed under typescript/packages:" + while IFS= read -r artifact; do + [ -n "$artifact" ] && echo " - $artifact" + done <<< "$tgz_offenders" + fail=1 + fi +else + echo "PASS [package-tarballs]: skipped tracked-file check outside a Git worktree" +fi + if [ "$fail" -ne 0 ]; then echo "repo-hygiene: FAILED" exit 1 diff --git a/scripts/check-repo-hygiene_test.sh b/scripts/check-repo-hygiene_test.sh index 89b04173e..b0a7d76f2 100755 --- a/scripts/check-repo-hygiene_test.sh +++ b/scripts/check-repo-hygiene_test.sh @@ -42,6 +42,7 @@ make_fixture() { # > "$root/typescript/packages/mpp/src/errors.ts" printf '%s\n' '{"name":"root","private":true}' > "$root/package.json" printf '%s\n' '{"name":"mpp"}' > "$root/typescript/packages/mpp/package.json" + printf '%s\n' 'typescript/packages/**/*.tgz' > "$root/.gitignore" git -C "$root" init -q git -C "$root" add -A git -C "$root" -c user.email=t@t -c user.name=t commit -qm init @@ -87,6 +88,15 @@ if printf '%s' "$out" | grep -q 'bundle.gen.js'; then echo "FAIL - excluded *.gen.* bundle tripped the finding-id guard"; fails=1 else echo "ok - excluded *.gen.* bundle does not trip the finding-id guard"; fi +# A force-added tarball is tracked even though the fixture ignores local pack +# output, and therefore must be rejected by the real guard. +printf '%s\n' 'package bytes' > "$dirtyA/typescript/packages/mpp/committed.tgz" +git -C "$dirtyA" add -f typescript/packages/mpp/committed.tgz +git -C "$dirtyA" -c user.email=t@t -c user.name=t commit -qm tarball +out="$(ROOT="$dirtyA" bash "$GUARD" 2>&1)"; rc=$? +assert_rc "real guard rejects a tracked package tarball" 1 $rc +assert_contains "reports the tracked package tarball" "typescript/packages/mpp/committed.tgz" "$out" + # --- Case B: clean fixture must PASS (exit 0) -------------------------------- cleanB="$tmp/clean" make_fixture "$cleanB" @@ -104,7 +114,28 @@ git -C "$cleanB" -c user.email=t@t -c user.name=t commit -qm clean out="$(ROOT="$cleanB" bash "$GUARD" 2>&1)"; rc=$? assert_rc "real guard exits zero on a clean fixture" 0 $rc -# --- Case C: pattern unit checks, deriving ID_RE from the real script -------- +# --- Case C: ignored local tarballs must PASS -------------------------------- +ignoredC="$tmp/ignored" +make_fixture "$ignoredC" +printf '%s\n' 'local package bytes' > "$ignoredC/typescript/packages/mpp/local-only.tgz" +out="$(ROOT="$ignoredC" bash "$GUARD" 2>&1)"; rc=$? +assert_rc "ignored local package tarballs do not trip the tracked-file guard" 0 $rc +if git -C "$ignoredC" ls-files --error-unmatch typescript/packages/mpp/local-only.tgz >/dev/null 2>&1; then + echo "FAIL - ignored tarball fixture unexpectedly became tracked"; fails=1 +else echo "ok - local package tarball remains untracked and ignored"; fi + +# --- Case D: source archives without .git must PASS --------------------------- +archiveD="$tmp/source-archive" +mkdir -p "$archiveD/typescript/packages/mpp/src" +printf '%s\n' '{"name":"root","private":true}' > "$archiveD/package.json" +printf '%s\n' '{"name":"mpp"}' > "$archiveD/typescript/packages/mpp/package.json" +printf '%s\n' '// clean source archive' > "$archiveD/typescript/packages/mpp/src/index.ts" +printf '%s\n' 'archive-local package bytes' > "$archiveD/typescript/packages/mpp/archive.tgz" +out="$(ROOT="$archiveD" bash "$GUARD" 2>&1)"; rc=$? +assert_rc "source archive without Git metadata remains supported" 0 $rc +assert_contains "source archive reports the tracked-file check skip" "skipped tracked-file check outside a Git worktree" "$out" + +# --- Case E: pattern unit checks, deriving ID_RE from the real script -------- # Grep the finding-id regex out of the guard rather than duplicating it, so a # drift in the guard's pattern is reflected here automatically. ID_RE="$(grep -E "^ID_RE=" "$GUARD" | sed -E "s/^ID_RE='(.*)'\$/\1/")" diff --git a/scripts/fixtures/select-pr-workflows.json b/scripts/fixtures/select-pr-workflows.json new file mode 100644 index 000000000..074bca4a2 --- /dev/null +++ b/scripts/fixtures/select-pr-workflows.json @@ -0,0 +1,168 @@ +{ + "cases": [ + { + "name": "Go source directory", + "files": ["go/protocols/x402/verify.go"], + "enabled": ["go"] + }, + { + "name": "Go workflow exact file", + "files": [".github/workflows/go.yml"], + "enabled": ["go"] + }, + { + "name": "TypeScript source directory", + "files": ["typescript/packages/mpp/src/index.ts"], + "enabled": ["typescript"] + }, + { + "name": "HTML package belongs to TypeScript", + "files": ["html/src/index.ts"], + "enabled": ["typescript"] + }, + { + "name": "Rust source directory", + "files": ["rust/crates/kit/src/mpp/lib.rs"], + "enabled": ["rust"] + }, + { + "name": "Go-owned harness directory", + "files": ["harness/go-server/main.go"], + "enabled": ["go"] + }, + { + "name": "Python source directory", + "files": ["python/src/solana_pay_kit/protocols/mpp/server/session.py"], + "enabled": ["python"] + }, + { + "name": "Python server harness directory", + "files": ["harness/python-server/server.py"], + "enabled": ["python"] + }, + { + "name": "Python session client harness directory", + "files": ["harness/python-session-client/main.py"], + "enabled": ["python"] + }, + { + "name": "Python x402 exact client harness directory", + "files": ["harness/python-x402-client/main.py"], + "enabled": ["python"] + }, + { + "name": "Python x402 upto client harness directory", + "files": ["harness/python-x402-upto-client/main.py"], + "enabled": ["python"] + }, + { + "name": "Ruby-owned harness directory", + "files": ["harness/ruby-server/server.rb"], + "enabled": ["ruby"] + }, + { + "name": "Lua protocol runner harness directory", + "files": ["harness/lua-protocol-runner/runner.lua"], + "enabled": ["lua"] + }, + { + "name": "PHP-owned harness directory", + "files": ["harness/php-server/server.php"], + "enabled": ["php"] + }, + { + "name": "Swift package manifest exact file", + "files": ["Package.swift"], + "enabled": ["swift"] + }, + { + "name": "Kotlin-owned harness directory", + "files": ["harness/kotlin-conformance/settings.gradle.kts"], + "enabled": ["kotlin"] + }, + { + "name": "Multiple owned SDK paths combine", + "files": [ + "go/paykit/types.go", + "python/pyproject.toml", + "docs/routing.md" + ], + "enabled": ["go", "python"] + }, + { + "name": "Shared harness source runs everything", + "files": ["harness/src/implementations.ts"], + "enabled": "all" + }, + { + "name": "Shared harness vector runs everything", + "files": ["harness/vectors/canonical-bytes.json"], + "enabled": "all" + }, + { + "name": "Shared harness workflow runs everything", + "files": [".github/workflows/harness.yml"], + "enabled": "all" + }, + { + "name": "Shared harness action runs everything", + "files": [".github/actions/setup-harness/action.yml"], + "enabled": "all" + }, + { + "name": "Package manifest lookalike is not Swift", + "files": ["Package.swift.backup"], + "enabled": "all" + }, + { + "name": "Workflow lookalike is not Go", + "files": [".github/workflows/go.yml.disabled"], + "enabled": "all" + }, + { + "name": "Directory lookalike is not Go", + "files": ["governance/policy.yml"], + "enabled": "all" + }, + { + "name": "Directory name used as a file is not Go", + "files": ["go"], + "enabled": "all" + }, + { + "name": "Documentation directory name used as a file is unknown", + "files": ["docs"], + "enabled": "all" + }, + { + "name": "Owned harness directory lookalike is shared", + "files": ["harness/python-server-old/server.py"], + "enabled": "all" + }, + { + "name": "Unknown path runs everything", + "files": ["scripts/unclassified-security-check.sh"], + "enabled": "all" + }, + { + "name": "Empty input runs everything", + "files": [], + "enabled": "all" + }, + { + "name": "Documentation directory only runs nothing", + "files": ["docs/security.md", "docs/routing.txt"], + "enabled": [] + }, + { + "name": "Markdown only runs nothing", + "files": ["SECURITY.md", "ruby/README.md"], + "enabled": [] + }, + { + "name": "Issue template only runs nothing", + "files": [".github/ISSUE_TEMPLATE/bug.yml"], + "enabled": [] + } + ] +} diff --git a/scripts/generate-pr216-ledger.mjs b/scripts/generate-pr216-ledger.mjs new file mode 100644 index 000000000..b0fb92060 --- /dev/null +++ b/scripts/generate-pr216-ledger.mjs @@ -0,0 +1,146 @@ +#!/usr/bin/env node +import { existsSync, writeFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { + ALLOWED_STATUSES, + AUTHORITATIVE_SOURCE, + PLANNED_BUCKETS, + getCommitPaths, + getSourceInventory, +} from "./validate-pr216-ledger.mjs"; + +const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const ledgerPath = resolve(repoRoot, ".github/delivery/pr216-ledger.json"); +const languageRoots = new Set([ + "typescript", + "rust", + "go", + "python", + "ruby", + "lua", + "php", + "swift", + "kotlin", +]); + +function bucketForPath(path) { + const root = path.split("/", 1)[0]; + if (languageRoots.has(root)) { + return root; + } + + const harnessOwner = path.match( + /^harness\/(go|python|ruby|lua|php|swift|kotlin)(?:-|\/)/, + )?.[1]; + if (harnessOwner && languageRoots.has(harnessOwner)) { + return harnessOwner; + } + if ( + path.startsWith("harness/") || + path.startsWith(".github/") || + path.startsWith("scripts/") + ) { + return "harness-ci"; + } + return "cross-sdk"; +} + +function bucketForCommit(sha) { + const buckets = new Set(getCommitPaths(sha).map(bucketForPath)); + return buckets.size === 1 ? [...buckets][0] : "cross-sdk"; +} + +function unresolvedFields(bucket, subject) { + return { + owner: `pr216-${bucket}-lane`, + followUp: `Reconcile ${subject} in the planned ${bucket} protocol bucket and replace missing only with reviewable delivery evidence.`, + }; +} + +const force = process.argv.includes("--force"); +if (existsSync(ledgerPath) && !force) { + throw new Error(`${ledgerPath} already exists; pass --force to rebuild it`); +} + +const inventory = getSourceInventory(); +const commits = inventory.commits.map((sha) => { + const bucket = bucketForCommit(sha); + return { + sha, + subject: inventory.subjects.get(sha), + bucket, + status: "missing", + evidence: [ + { + kind: "not-claimed", + detail: + "No patch-equivalent delivery commit was established during ledger initialization; semantic delivery is not claimed.", + }, + ], + ...unresolvedFields(bucket, `source commit ${sha}`), + }; +}); + +const paths = inventory.paths.map((path) => { + const bucket = bucketForPath(path); + const sourceBlob = inventory.sourceBlobs.get(path); + const deliveryBlob = inventory.currentBlobs.get(path); + if (sourceBlob && sourceBlob === deliveryBlob) { + return { + path, + bucket, + status: "integrated", + evidence: [ + { + kind: "identical-tree-entry", + sourceBlob, + deliveryBlob, + sourceRef: `${AUTHORITATIVE_SOURCE.head}:${path}`, + deliveryRef: `${inventory.currentHead}:${path}`, + detail: + "The authoritative source-tip and delivery-baseline blobs are identical; this claims file-state delivery only.", + }, + ], + }; + } + + return { + path, + bucket, + status: "missing", + evidence: [ + { + kind: "not-claimed", + detail: + "The source path is inventoried, but equivalent PR216 semantics have not been established on the delivery branch.", + }, + ], + ...unresolvedFields(bucket, `source path ${path}`), + }; +}); + +const countStatuses = (records) => + Object.fromEntries( + ALLOWED_STATUSES.map((status) => [ + status, + records.filter((record) => record.status === status).length, + ]).filter(([, count]) => count > 0), + ); + +const ledger = { + schemaVersion: 1, + source: { ...AUTHORITATIVE_SOURCE }, + allowedStatuses: [...ALLOWED_STATUSES], + plannedBuckets: [...PLANNED_BUCKETS], + deliveryBaseline: inventory.currentHead, + summary: { + commits: countStatuses(commits), + paths: countStatuses(paths), + }, + commits, + paths, +}; + +writeFileSync(ledgerPath, `${JSON.stringify(ledger, null, 2)}\n`); +process.stdout.write(`generated ${ledgerPath}\n`); diff --git a/scripts/rebuild-pr216-rehearsal.sh b/scripts/rebuild-pr216-rehearsal.sh new file mode 100755 index 000000000..268117674 --- /dev/null +++ b/scripts/rebuild-pr216-rehearsal.sh @@ -0,0 +1,93 @@ +#!/usr/bin/env bash +# Rebuild the #216 integration rehearsal branch (PR #240) purely from the +# current redelivery leaf heads, in the canonical merge cascade order. +# +# Green by construction: every semantic fix lives in a leaf PR targeting +# split/pr216-ci-harness-mega (#219). This script performs ONLY mechanical +# merges. Any merge conflict aborts loudly: the resolution belongs in the +# LATER leaf of the conflicting pair (pre-merge the earlier sibling into it), +# never in the rehearsal branch itself. +# +# Usage: +# scripts/rebuild-pr216-rehearsal.sh # rebuild locally, report +# scripts/rebuild-pr216-rehearsal.sh --push # rebuild + force-push #240 +set -euo pipefail + +REMOTE=origin +BASE=split/pr216-ci-harness-mega +REHEARSAL=rehearsal/pr216-integration + +# Canonical cascade order (mirrors the planned merge order into #219). +# +# Ordering rule: the harness meta-leaf (#233) OWNS every shared CI/harness file +# (.github/workflows/*, harness/test/boot-policy.test.ts, ci-coverage-gate.test.ts, +# the pr216 ledger) and is merged LAST, so its blobs win for those paths and it +# is the single authoritative reconciler of the shared surface. #238, #228 and +# #239 all also touch ci.yml + boot-policy.test.ts; among them, the python leaf (#228) +# now precedes the mpp-session leaf (#239) — the telescoped branches carry the +# reconciliation merges in that order, so the cascade mirrors the PR chain. Every leaf's blob for its OWN +# files still lands verbatim; verified by a post-rebuild `git diff ` +# per owned path (all identical). x402 (#236) and rust (#227) carry the mpp/ +# subscription reconciliations; ruby (#235) then the harness leaf close it out. +LEAVES=( + "244:ci/pr216-gate-activation" + "237:fix/mpp-replay-store-hardening" + "238:fix/mpp-subscription-hardening" + "228:fix/python-security-hardening" + "239:fix/mpp-session-state-hardening" + "236:fix/x402-replay-hardening" + "227:fix/rust-security-hardening" + "235:fix/ruby-replay-store-capability" + "233:fix/harness-adversarial-hardening" +) + +git fetch "$REMOTE" --quiet +git checkout -q -B "$REHEARSAL" "$REMOTE/$BASE" +echo "rebased $REHEARSAL onto $REMOTE/$BASE ($(git rev-parse --short HEAD))" + +for leaf in "${LEAVES[@]}"; do + pr="${leaf%%:*}" + branch="${leaf##*:}" + if git merge --no-edit "$REMOTE/$branch" >/dev/null 2>&1; then + echo "merged #$pr $branch -> $(git rev-parse --short HEAD)" + else + echo "CONFLICT merging #$pr ($branch):" >&2 + git diff --name-only --diff-filter=U >&2 + echo "Fix belongs in the LATER leaf of the conflicting pair (pre-merge" >&2 + echo "the earlier sibling into #$pr), not in $REHEARSAL." >&2 + git merge --abort + exit 1 + fi +done + +echo "rebuild complete: $REHEARSAL @ $(git rev-parse --short HEAD)" + +# Ownership assertion — proves "green by construction". For every path any leaf +# touched, the composed blob MUST equal the LAST leaf in cascade order that +# touched it (the owner). A phantom-conflict reorder or a silent 3-way drop that +# corrupted a blob would fail here. This is the mechanical proof that #240 is a +# pure union of leaf heads, not a hand-edited branch. +# Pure-union proof: every NON-merge commit the rehearsal introduces over base +# must be contained in some leaf head. If any survives excluding base + all leaf +# heads, it was hand-authored on the rehearsal (a direct #240 patch) — exactly +# what Ludo forbade. The script's own merge commits are excluded via --no-merges. +# This is stacked-branch-safe (unlike a per-path diff): it does not care how the +# leaves overlap, only that no commit exists outside their union. +echo "verifying pure union (no hand-authored commits on the rehearsal)..." +excludes=("^$REMOTE/$BASE") +for leaf in "${LEAVES[@]}"; do + excludes+=("^$REMOTE/${leaf##*:}") +done +stray="$(git rev-list --no-merges HEAD "${excludes[@]}")" +if [[ -n "$stray" ]]; then + echo "PURE-UNION assertion FAILED: commits on $REHEARSAL not in any leaf head:" >&2 + echo "$stray" | while read -r c; do echo " $(git log --oneline -1 "$c")" >&2; done + echo "the rehearsal contains direct patches; do not push. Move each fix to its leaf." >&2 + exit 1 +fi +echo "pure-union OK: every commit on $REHEARSAL traces to base or a leaf head" + +if [[ "${1:-}" == "--push" ]]; then + git push --force-with-lease "$REMOTE" "$REHEARSAL" + echo "pushed $REHEARSAL" +fi diff --git a/scripts/reconcile-pr216-open-deliveries.mjs b/scripts/reconcile-pr216-open-deliveries.mjs new file mode 100644 index 000000000..8fdffba76 --- /dev/null +++ b/scripts/reconcile-pr216-open-deliveries.mjs @@ -0,0 +1,132 @@ +#!/usr/bin/env node +import { readFileSync, writeFileSync } from 'node:fs'; +import { execFileSync } from 'node:child_process'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = resolve(dirname(fileURLToPath(import.meta.url)), '..'); +const ledgerPath = resolve(root, '.github/delivery/pr216-ledger.json'); +const ledger = JSON.parse(readFileSync(ledgerPath, 'utf8')); +const currentHead = execFileSync('git', ['rev-parse', 'HEAD'], { cwd: root, encoding: 'utf8' }).trim(); + +const deliveries = { + 214: ['fix/go-idiomatic-cleanup', '92bdcbf'], + 227: ['fix/rust-security-hardening', '205b3d8'], + 228: ['fix/python-security-hardening', '8ac54e8'], + 229: ['fix/php-security-hardening', '0bd30c1'], + 230: ['fix/kotlin-canonical-json-hardening', 'd286dd9'], + 231: ['fix/swift-conformance-hardening', '63ca1c3'], + 232: ['fix/typescript-security-hardening', '74d4d99'], + 233: ['fix/harness-adversarial-hardening', 'd9815dc'], + 236: ['fix/x402-replay-hardening', '10708ce'], + 237: ['fix/mpp-replay-store-hardening', '9bfd9e1'], + 238: ['fix/mpp-subscription-hardening', '1865dfb'], + 239: ['fix/mpp-session-state-hardening', '34e7456'], +}; + +const commitOwners = new Map([ + ['3bb8202', [214, 231]], + ['272190c', [229]], + ['cd9d245', [227]], + ['e51727e', [227]], + ['a707983', [227]], + ['f1830dc', [230]], + ['a99a571', [227]], + ['7faeb0d', [232, 237]], + ['0ca5ef5', [239]], + ['2cca2ce', [214]], + ['51d1c4a', [214]], + ['8fd892b', [228]], + ['09b7e5f', [228]], + ['232bf91', [238]], + ['fa8ce84', [228]], + ['1ed6204', [227]], + ['fc6aabb', [214]], + ['ca15d94', [232]], + ['4efd4bb', [233]], + ['ef6e977', [232]], + ['36d493f', [238]], + ['45ad8c9', [238]], +]); + +function ownersForPath(path, bucket) { + if (bucket === 'go') return [214]; + if (bucket === 'kotlin') return [230]; + if (bucket === 'php') return [229]; + if (bucket === 'rust') return [227]; + if (bucket === 'swift') return [231]; + if (bucket === 'python') { + if (path.includes('/x402/')) return [236]; + if (path.includes('session_topup') || path.includes('session_voucher')) return [239]; + return [228]; + } + if (bucket === 'typescript') { + if (path.endsWith('.tgz') || path.includes('repo-hygiene')) return [233]; + if (path.includes('subscription')) return [238]; + if (path.includes('session-') || path.includes('/session')) return [239]; + if (path.includes('replay')) return [237]; + return [232]; + } + return [233]; +} + +function markOpen(record, prs, label) { + const named = prs.map((pr) => { + const [branch, commit] = deliveries[pr]; + return { pr, branch, deliveryCommit: commit }; + }); + record.status = 'open_pr'; + record.evidence = named.map(({ pr, branch, deliveryCommit }) => ({ + kind: 'open-delivery-head', + pr, + branch, + deliveryCommit, + detail: `${label} is assigned to PR #${pr} at or beyond ${deliveryCommit}; merge-time validation must replace this open evidence with exact integrated tree evidence.`, + })); + record.owner = named.map(({ pr, branch }) => `PR #${pr} / ${branch}`).join('; '); + record.followUp = `Land ${named.map(({ pr }) => `PR #${pr}`).join(' and ')}, then revalidate semantic and exact tree-state delivery on #219.`; +} + +for (const record of ledger.commits) { + if (record.status !== 'missing' && record.status !== 'open_pr') continue; + const owners = commitOwners.get(record.sha.slice(0, 7)); + if (!owners) throw new Error(`missing commit owner: ${record.sha}`); + markOpen(record, owners, `Source commit ${record.sha}`); +} + +for (const record of ledger.paths) { + if (record.status === 'missing' || record.status === 'open_pr') { + markOpen(record, ownersForPath(record.path, record.bucket), `Source path ${record.path}`); + continue; + } + if (record.status !== 'integrated') continue; + const identity = record.evidence.find((item) => item.kind === 'identical-tree-entry'); + if (!identity) throw new Error(`integrated path lacks identity evidence: ${record.path}`); + let currentBlob; + try { + currentBlob = execFileSync('git', ['rev-parse', `${currentHead}:${record.path}`], { + cwd: root, + encoding: 'utf8', + stdio: ['ignore', 'pipe', 'ignore'], + }).trim(); + } catch { + currentBlob = undefined; + } + if (currentBlob === identity.sourceBlob) { + identity.deliveryBlob = currentBlob; + identity.deliveryRef = `${currentHead}:${record.path}`; + continue; + } + markOpen(record, ownersForPath(record.path, record.bucket), `Source path ${record.path}`); +} + +const count = (records) => + Object.fromEntries( + ledger.allowedStatuses + .map((status) => [status, records.filter((record) => record.status === status).length]) + .filter(([, total]) => total > 0), + ); +ledger.summary = { commits: count(ledger.commits), paths: count(ledger.paths) }; +ledger.deliveryBaseline = currentHead; + +writeFileSync(ledgerPath, `${JSON.stringify(ledger, null, 2)}\n`); diff --git a/scripts/select-pr-workflows.mjs b/scripts/select-pr-workflows.mjs index c1e7eb319..0b45066a5 100644 --- a/scripts/select-pr-workflows.mjs +++ b/scripts/select-pr-workflows.mjs @@ -18,56 +18,79 @@ export const WORKFLOWS = [ ]; const LANGUAGE_PATHS = { - typescript: ["typescript/", "html/"], - rust: ["rust/"], - go: [ - "go/", - "harness/go-client/", - "harness/go-server/", - ".github/workflows/go.yml", - ".github/workflows/go-consumer.yml", - ], - python: [ - "python/", - "harness/python-server/", - ".github/workflows/python.yml", - ], - ruby: ["ruby/", "harness/ruby-server/", ".github/workflows/ruby.yml"], - lua: ["lua/", "harness/lua-server/", ".github/workflows/lua.yml"], - php: ["php/", "harness/php-server/", ".github/workflows/php.yml"], - swift: [ - "swift/", - "Package.swift", - "harness/swift-client/", - "harness/swift-x402-client/", - "harness/swift-x402-upto-client/", - ".github/workflows/swift.yml", - ], - kotlin: [ - "kotlin/", - "harness/kotlin-client/", - "harness/kotlin-conformance/", - "harness/kotlin-x402-client/", - "harness/kotlin-x402-upto-client/", - ".github/workflows/kotlin.yml", + typescript: { directories: ["typescript", "html"] }, + rust: { directories: ["rust"] }, + go: { + directories: ["go", "harness/go-client", "harness/go-server"], + files: [".github/workflows/go.yml", ".github/workflows/go-consumer.yml"], + }, + python: { + directories: [ + "python", + "harness/python-server", + "harness/python-session-client", + "harness/python-x402-client", + "harness/python-x402-upto-client", + ], + files: [".github/workflows/python.yml"], + }, + ruby: { + directories: ["ruby", "harness/ruby-server"], + files: [".github/workflows/ruby.yml"], + }, + lua: { + directories: ["lua", "harness/lua-server", "harness/lua-protocol-runner"], + files: [".github/workflows/lua.yml"], + }, + php: { + directories: ["php", "harness/php-server"], + files: [".github/workflows/php.yml"], + }, + swift: { + directories: [ + "swift", + "harness/swift-client", + "harness/swift-x402-client", + "harness/swift-x402-upto-client", + ], + files: ["Package.swift", ".github/workflows/swift.yml"], + }, + kotlin: { + directories: [ + "kotlin", + "harness/kotlin-client", + "harness/kotlin-conformance", + "harness/kotlin-x402-client", + "harness/kotlin-x402-upto-client", + ], + files: [".github/workflows/kotlin.yml"], + }, +}; + +const SHARED_HARNESS_PATHS = { + directories: [ + "harness", + ".github/actions/setup-harness", + ".github/actions/setup-harness-leg", ], + files: [".github/workflows/harness.yml"], }; -const HARNESS_PATHS = [ - "harness/", - ".github/actions/setup-harness/", - ".github/actions/setup-harness-leg/", - ".github/workflows/harness.yml", -]; +function matchesDirectory(path, directory) { + return path.startsWith(`${directory}/`); +} -function matches(path, prefixes) { - return prefixes.some((prefix) => path === prefix || path.startsWith(prefix)); +function matches(path, { directories = [], files = [] }) { + return ( + files.includes(path) || + directories.some((directory) => matchesDirectory(path, directory)) + ); } function isDocumentation(path) { return ( - path.startsWith("docs/") || - path.startsWith(".github/ISSUE_TEMPLATE/") || + matchesDirectory(path, "docs") || + matchesDirectory(path, ".github/ISSUE_TEMPLATE") || path.endsWith(".md") ); } @@ -89,16 +112,16 @@ export function selectWorkflows(files) { } const language = WORKFLOWS.find( - (name) => name !== "harness" && matches(changedPath, LANGUAGE_PATHS[name]), + (name) => + name !== "harness" && matches(changedPath, LANGUAGE_PATHS[name]), ); if (language) { selected[language] = true; continue; } - if (matches(changedPath, HARNESS_PATHS)) { - selected.harness = true; - continue; + if (matches(changedPath, SHARED_HARNESS_PATHS)) { + return allWorkflows(); } // An unclassified source or CI path must never silently skip verification. @@ -114,6 +137,7 @@ function main() { .map((path) => path.trim()) .filter(Boolean); const selected = selectWorkflows(files); + const docsOnly = files.length > 0 && Object.values(selected).every((enabled) => !enabled); const outputIndex = process.argv.indexOf("--github-output"); if (outputIndex === -1) { @@ -128,12 +152,20 @@ function main() { for (const [name, enabled] of Object.entries(selected)) { appendFileSync(outputPath, `${name}=${enabled}\n`); } - process.stdout.write(`selected: ${Object.entries(selected) - .filter(([, enabled]) => enabled) - .map(([name]) => name) - .join(", ") || "none"}\n`); + appendFileSync(outputPath, `docs_only=${docsOnly}\n`); + process.stdout.write( + `selected: ${ + Object.entries(selected) + .filter(([, enabled]) => enabled) + .map(([name]) => name) + .join(", ") || "none" + }\n`, + ); } -if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { +if ( + process.argv[1] && + resolve(process.argv[1]) === fileURLToPath(import.meta.url) +) { main(); } diff --git a/scripts/select-pr-workflows_test.mjs b/scripts/select-pr-workflows_test.mjs index f7d52c175..61272c752 100644 --- a/scripts/select-pr-workflows_test.mjs +++ b/scripts/select-pr-workflows_test.mjs @@ -8,32 +8,32 @@ import { WORKFLOWS, selectWorkflows } from "./select-pr-workflows.mjs"; const none = Object.fromEntries(WORKFLOWS.map((name) => [name, false])); const all = Object.fromEntries(WORKFLOWS.map((name) => [name, true])); -function expect(files, enabled) { +function expectedSelection(enabled) { + if (enabled === "all") { + return all; + } const expected = { ...none }; for (const name of enabled) { expected[name] = true; } - assert.deepEqual(selectWorkflows(files), expected, files.join(", ")); + return expected; } -expect(["go/protocols/x402/verify.go"], ["go"]); -expect(["typescript/packages/mpp/src/index.ts"], ["typescript"]); -expect(["html/src/index.ts"], ["typescript"]); -expect(["rust/crates/kit/src/mpp/lib.rs"], ["rust"]); -expect(["harness/go-server/main.go"], ["go"]); -expect(["python/src/solana_pay_kit/protocols/mpp/server/session.py"], ["python"]); -expect(["harness/python-server/server.py"], ["python"]); -expect(["ruby/lib/pay_kit/protocols/mpp/store.rb"], ["ruby"]); -expect(["lua/pay_kit/protocols/mpp/store.lua"], ["lua"]); -expect(["php/src/Protocol/Mpp/Store.php"], ["php"]); -expect(["swift/Sources/SolanaPayKit/Protocols/Mpp/Core/CanonicalJSON.swift"], ["swift"]); -expect(["kotlin/src/main/kotlin/com/solana/paykit/CanonicalJson.kt"], ["kotlin"]); -expect(["harness/vectors/canonical-bytes.json"], ["harness"]); -expect(["docs/security.md"], []); -assert.deepEqual(selectWorkflows(["scripts/unclassified-security-check.sh"]), all); -assert.deepEqual(selectWorkflows([]), all); - const repoRoot = join(dirname(fileURLToPath(import.meta.url)), ".."); +const fixture = JSON.parse( + readFileSync( + join(repoRoot, "scripts", "fixtures", "select-pr-workflows.json"), + "utf8", + ), +); +for (const testCase of fixture.cases) { + assert.deepEqual( + selectWorkflows(testCase.files), + expectedSelection(testCase.enabled), + testCase.name, + ); +} + const routerWorkflow = readFileSync( join(repoRoot, ".github", "workflows", "pr-routing.yml"), "utf8", @@ -47,13 +47,18 @@ assert.doesNotMatch(routerWorkflow, /github\.event\.pull_request\.head\.sha/); assert.match(routerWorkflow, /fetch-depth: 2/); assert.match(routerWorkflow, /set -o pipefail/); assert.match(routerWorkflow, /git rev-parse --verify HEAD\^1/); -assert.match(routerWorkflow, /git diff --name-only HEAD\^1 HEAD/); +assert.match(routerWorkflow, /git diff --no-renames --name-only HEAD\^1 HEAD/); assert.doesNotMatch(routerWorkflow, /github\.event\.pull_request\.base\.sha/); assert.doesNotMatch(routerWorkflow, /git fetch --no-tags --depth=1 origin/); assert.match(routerWorkflow, /uses: \.\/\.github\/workflows\/ci\.yml/); +assert.match(routerWorkflow, /docs_only: \$\{\{ steps\.select\.outputs\.docs_only \}\}/); +assert.match(routerWorkflow, /node scripts\/verify-routed-sdk-gate\.mjs/); assert.match(coreWorkflow, /^ workflow_call:/m); assert.doesNotMatch(coreWorkflow, /^ pull_request:/m); assert.doesNotMatch(coreWorkflow, /github\.event_name != 'workflow_call'/); -assert.match(coreWorkflow, /github\.event_name == 'push' \|\| inputs\.run_typescript/); +assert.match( + coreWorkflow, + /github\.event_name == 'push' \|\| inputs\.run_typescript/, +); console.log("select-pr-workflows_test: PASS"); diff --git a/scripts/validate-pr216-ledger.mjs b/scripts/validate-pr216-ledger.mjs new file mode 100644 index 000000000..c6fdc606a --- /dev/null +++ b/scripts/validate-pr216-ledger.mjs @@ -0,0 +1,352 @@ +#!/usr/bin/env node +import assert from "node:assert/strict"; +import { createHash } from "node:crypto"; +import { execFileSync } from "node:child_process"; +import { readFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +export const AUTHORITATIVE_SOURCE = Object.freeze({ + base: "49dc7975c674b34e461bed89d2a1a9e49e9e5920", + head: "45ad8c9acd7a71d4dd12b87321a9902c71fef865", + commitCount: 113, + pathCount: 237, + commitSetSha256: + "6db6ba37862590cb07f6d5dfd89a28416424b4946534ba255a90c41c8b0d18fa", + pathSetSha256: + "a7d381df019007c3d6f413d2b4377cca00beb27572308c908894e4b8dec835fa", +}); + +export const ALLOWED_STATUSES = Object.freeze([ + "integrated", + "open_pr", + "superseded", + "obsolete_test_only", + "missing", +]); + +export const PLANNED_BUCKETS = Object.freeze([ + "typescript", + "rust", + "go", + "python", + "ruby", + "lua", + "php", + "swift", + "kotlin", + "harness-ci", + "cross-sdk", +]); + +const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const defaultLedgerPath = resolve( + repoRoot, + ".github/delivery/pr216-ledger.json", +); + +function git(args, cwd = repoRoot) { + return execFileSync("git", args, { cwd, encoding: "utf8" }).trimEnd(); +} + +function lines(value) { + return value === "" ? [] : value.split("\n"); +} + +export function canonicalSetDigest(values) { + const canonical = `${[...values].sort().join("\n")}\n`; + return createHash("sha256").update(canonical).digest("hex"); +} + +function treeEntries(revision, cwd = repoRoot) { + const entries = new Map(); + for (const line of lines( + git(["ls-tree", "-r", "--full-tree", revision], cwd), + )) { + const match = line.match(/^\d+\s+\w+\s+([0-9a-f]{40})\t(.+)$/); + if (match) { + entries.set(match[2], match[1]); + } + } + return entries; +} + +export function getSourceInventory(cwd = repoRoot) { + const range = `${AUTHORITATIVE_SOURCE.base}..${AUTHORITATIVE_SOURCE.head}`; + const commits = lines(git(["rev-list", "--reverse", range], cwd)); + const paths = lines(git(["diff", "--name-only", range], cwd)); + const subjects = new Map( + commits.map((sha) => [sha, git(["show", "-s", "--format=%s", sha], cwd)]), + ); + const currentHead = git(["rev-parse", "HEAD"], cwd); + + return { + commits, + paths, + subjects, + sourceBlobs: treeEntries(AUTHORITATIVE_SOURCE.head, cwd), + currentBlobs: treeEntries("HEAD", cwd), + currentHead, + }; +} + +export function getCommitPaths(sha, cwd = repoRoot) { + return lines( + git(["diff-tree", "--no-commit-id", "--name-only", "-r", sha], cwd), + ); +} + +function requireString(value, label) { + assert.equal(typeof value, "string", `${label} must be a string`); + assert.notEqual(value.trim(), "", `${label} must not be empty`); +} + +function validateEvidence(record, label) { + assert.ok( + Array.isArray(record.evidence), + `${label}.evidence must be an array`, + ); + assert.ok(record.evidence.length > 0, `${label}.evidence must not be empty`); + for (const [index, item] of record.evidence.entries()) { + requireString(item?.kind, `${label}.evidence[${index}].kind`); + requireString(item?.detail, `${label}.evidence[${index}].detail`); + } +} + +function validateRecord(record, label) { + assert.ok(record && typeof record === "object", `${label} must be an object`); + assert.ok( + ALLOWED_STATUSES.includes(record.status), + `${label}.status must be one of ${ALLOWED_STATUSES.join(", ")}`, + ); + assert.ok( + PLANNED_BUCKETS.includes(record.bucket), + `${label}.bucket must name a planned protocol bucket`, + ); + validateEvidence(record, label); + + if (record.status === "open_pr" || record.status === "missing") { + requireString(record.owner, `${label}.owner`); + requireString(record.followUp, `${label}.followUp`); + } +} + +function validateIdentifiers(records, key, expected, digest, label) { + assert.equal(records.length, expected.length, `${label} count must be exact`); + const identifiers = records.map((record) => record[key]); + for (const [index, identifier] of identifiers.entries()) { + requireString(identifier, `${label}[${index}].${key}`); + } + assert.equal( + new Set(identifiers).size, + identifiers.length, + `${label} contains duplicates`, + ); + assert.equal( + canonicalSetDigest(identifiers), + digest, + `${label} authoritative set digest mismatch`, + ); + assert.deepEqual( + [...identifiers].sort(), + [...expected].sort(), + `${label} identifiers differ from the Git source range`, + ); +} + +function statusCounts(records) { + const counts = {}; + for (const record of records) { + counts[record.status] = (counts[record.status] ?? 0) + 1; + } + return counts; +} + +function validateIntegratedPath(record, inventory, label) { + const blobEvidence = record.evidence.find( + (item) => item.kind === "identical-tree-entry", + ); + assert.ok( + blobEvidence, + `${label} integrated path needs identical-tree-entry evidence`, + ); + requireString(blobEvidence.sourceBlob, `${label}.evidence.sourceBlob`); + requireString(blobEvidence.deliveryBlob, `${label}.evidence.deliveryBlob`); + + const sourceBlob = inventory.sourceBlobs.get(record.path); + const currentBlob = inventory.currentBlobs.get(record.path); + assert.ok(sourceBlob, `${label} has no blob at the authoritative source tip`); + assert.ok(currentBlob, `${label} has no blob at the current delivery head`); + assert.equal( + blobEvidence.sourceBlob, + sourceBlob, + `${label} source blob evidence is stale`, + ); + assert.equal( + blobEvidence.deliveryBlob, + currentBlob, + `${label} delivery blob evidence is stale`, + ); + assert.equal( + sourceBlob, + currentBlob, + `${label} source and delivery blobs differ`, + ); +} + +export function validateLedger(ledger, inventory) { + assert.equal(ledger.schemaVersion, 1, "schemaVersion must be 1"); + assert.deepEqual( + ledger.allowedStatuses, + ALLOWED_STATUSES, + "allowedStatuses must exactly match the validator contract", + ); + assert.deepEqual( + ledger.plannedBuckets, + PLANNED_BUCKETS, + "plannedBuckets must exactly match the validator contract", + ); + + const source = ledger.source; + assert.ok( + source && typeof source === "object", + "source metadata is required", + ); + assert.equal( + source.base, + AUTHORITATIVE_SOURCE.base, + "source.base is not authoritative", + ); + assert.equal( + source.head, + AUTHORITATIVE_SOURCE.head, + "source.head is not authoritative", + ); + assert.equal( + source.commitCount, + AUTHORITATIVE_SOURCE.commitCount, + "source commit count is not authoritative", + ); + assert.equal( + source.pathCount, + AUTHORITATIVE_SOURCE.pathCount, + "source path count is not authoritative", + ); + assert.equal( + source.commitSetSha256, + AUTHORITATIVE_SOURCE.commitSetSha256, + "source commit digest is not authoritative", + ); + assert.equal( + source.pathSetSha256, + AUTHORITATIVE_SOURCE.pathSetSha256, + "source path digest is not authoritative", + ); + + assert.equal( + inventory.commits.length, + AUTHORITATIVE_SOURCE.commitCount, + "Git range commit count changed", + ); + assert.equal( + inventory.paths.length, + AUTHORITATIVE_SOURCE.pathCount, + "Git range path count changed", + ); + assert.equal( + canonicalSetDigest(inventory.commits), + AUTHORITATIVE_SOURCE.commitSetSha256, + "Git range commit digest changed", + ); + assert.equal( + canonicalSetDigest(inventory.paths), + AUTHORITATIVE_SOURCE.pathSetSha256, + "Git range path digest changed", + ); + + assert.ok(Array.isArray(ledger.commits), "commits must be an array"); + assert.ok(Array.isArray(ledger.paths), "paths must be an array"); + validateIdentifiers( + ledger.commits, + "sha", + inventory.commits, + AUTHORITATIVE_SOURCE.commitSetSha256, + "commits", + ); + validateIdentifiers( + ledger.paths, + "path", + inventory.paths, + AUTHORITATIVE_SOURCE.pathSetSha256, + "paths", + ); + + for (const [index, record] of ledger.commits.entries()) { + const label = `commits[${index}]`; + validateRecord(record, label); + assert.equal( + record.subject, + inventory.subjects.get(record.sha), + `${label}.subject differs from Git`, + ); + if (record.status === "integrated") { + const patchEvidence = record.evidence.find( + (item) => item.kind === "patch-equivalent", + ); + assert.ok( + patchEvidence, + `${label} integrated commit needs patch-equivalent evidence`, + ); + requireString( + patchEvidence.deliveryCommit, + `${label}.evidence.deliveryCommit`, + ); + } + } + + for (const [index, record] of ledger.paths.entries()) { + const label = `paths[${index}]`; + validateRecord(record, label); + if (record.status === "integrated") { + validateIntegratedPath(record, inventory, label); + } + } + + assert.deepEqual( + ledger.summary?.commits, + statusCounts(ledger.commits), + "commit status summary is stale", + ); + assert.deepEqual( + ledger.summary?.paths, + statusCounts(ledger.paths), + "path status summary is stale", + ); + return { + commits: ledger.commits.length, + paths: ledger.paths.length, + commitStatuses: statusCounts(ledger.commits), + pathStatuses: statusCounts(ledger.paths), + }; +} + +function main() { + const ledgerPath = process.argv[2] + ? resolve(process.argv[2]) + : defaultLedgerPath; + const ledger = JSON.parse(readFileSync(ledgerPath, "utf8")); + const result = validateLedger(ledger, getSourceInventory()); + process.stdout.write(`pr216-ledger: OK ${JSON.stringify(result)}\n`); +} + +if ( + process.argv[1] && + resolve(process.argv[1]) === fileURLToPath(import.meta.url) +) { + try { + main(); + } catch (error) { + process.stderr.write(`pr216-ledger: FAIL ${error.message}\n`); + process.exitCode = 1; + } +} diff --git a/scripts/validate-pr216-ledger_test.mjs b/scripts/validate-pr216-ledger_test.mjs new file mode 100644 index 000000000..d450b1998 --- /dev/null +++ b/scripts/validate-pr216-ledger_test.mjs @@ -0,0 +1,101 @@ +#!/usr/bin/env node +import assert from "node:assert/strict"; +import { readFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import { + getSourceInventory, + validateLedger, +} from "./validate-pr216-ledger.mjs"; + +const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), ".."); +const ledger = JSON.parse( + readFileSync(resolve(repoRoot, ".github/delivery/pr216-ledger.json"), "utf8"), +); +const inventory = getSourceInventory(); +const ciWorkflow = readFileSync( + resolve(repoRoot, ".github/workflows/ci.yml"), + "utf8", +); + +validateLedger(ledger, inventory); + +const lintJob = ciWorkflow.match( + /\n lint:\n([\s\S]*?)(?=\n [a-z][a-z0-9-]*:\n)/, +)?.[1]; +assert.ok(lintJob, "ci.yml must define the lint job"); +assert.match( + lintJob, + /actions\/checkout@[a-f0-9]+[^\n]*\n\s+with:\n(?:\s+#[^\n]*\n)*\s+fetch-depth: 0\n/, + "the ledger gate needs full Git history in the lint job", +); + +function expectFailure(name, mutate, pattern) { + const candidate = structuredClone(ledger); + mutate(candidate); + assert.throws(() => validateLedger(candidate, inventory), pattern, name); +} + +expectFailure( + "same-count commit substitution fails", + (candidate) => { + candidate.commits[0].sha = "0000000000000000000000000000000000000000"; + }, + /authoritative set digest mismatch/, +); +expectFailure( + "same-count path substitution fails", + (candidate) => { + candidate.paths[0].path = "substituted/path.txt"; + }, + /authoritative set digest mismatch/, +); +expectFailure( + "unknown status fails", + (candidate) => { + candidate.commits[0].status = "done"; + }, + /status must be one of/, +); +expectFailure( + "evidence is mandatory", + (candidate) => { + candidate.commits[0].evidence = []; + }, + /evidence must not be empty/, +); +expectFailure( + "open delivery records require owners", + (candidate) => { + delete candidate.commits[0].owner; + }, + /owner must be a string/, +); +expectFailure( + "open delivery records require follow-ups", + (candidate) => { + delete candidate.paths.find((record) => record.status === "open_pr") + .followUp; + }, + /followUp must be a string/, +); +expectFailure( + "integrated blob substitution fails", + (candidate) => { + const integrated = candidate.paths.find( + (record) => record.status === "integrated", + ); + integrated.evidence[0].deliveryBlob = + "0000000000000000000000000000000000000000"; + }, + /delivery blob evidence is stale/, +); +expectFailure( + "status summaries cannot drift", + (candidate) => { + candidate.summary.commits.missing -= 1; + }, + /commit status summary is stale/, +); + +console.log("validate-pr216-ledger_test: PASS"); diff --git a/scripts/verify-routed-sdk-gate.mjs b/scripts/verify-routed-sdk-gate.mjs new file mode 100644 index 000000000..3df22dd64 --- /dev/null +++ b/scripts/verify-routed-sdk-gate.mjs @@ -0,0 +1,47 @@ +#!/usr/bin/env node + +const REQUIRED = { + typescript: ["core"], + rust: ["core"], + go: ["go", "go_consumer"], + python: ["python"], + ruby: ["ruby"], + lua: ["lua"], + php: ["php"], + swift: ["swift"], + kotlin: ["kotlin"], + harness: ["core", "harness"], +}; + +export function verifyRoutedSdkGate(needs) { + if (needs.classify?.result !== "success") { + throw new Error(`classifier did not pass: ${needs.classify?.result ?? "missing"}`); + } + + const outputs = needs.classify.outputs ?? {}; + for (const name of [...Object.keys(REQUIRED), "docs_only"]) { + if (outputs[name] !== "true" && outputs[name] !== "false") { + throw new Error(`classifier output ${name} is missing or invalid`); + } + } + + const selected = Object.keys(REQUIRED).filter((name) => outputs[name] === "true"); + const docsOnly = outputs.docs_only === "true"; + if (docsOnly === (selected.length > 0)) { + throw new Error("classifier must select at least one workflow or explicitly declare docs_only=true"); + } + + for (const surface of selected) { + for (const job of REQUIRED[surface]) { + if (needs[job]?.result !== "success") { + throw new Error(`${surface} selected ${job}, which finished ${needs[job]?.result ?? "missing"}`); + } + } + } +} + +if (process.argv[1] && import.meta.url === new URL(`file://${process.argv[1]}`).href) { + const needs = JSON.parse(process.env.NEEDS ?? "null"); + verifyRoutedSdkGate(needs); + console.log("all selected SDK workflows passed"); +} diff --git a/scripts/verify-routed-sdk-gate_test.mjs b/scripts/verify-routed-sdk-gate_test.mjs new file mode 100644 index 000000000..8f183a396 --- /dev/null +++ b/scripts/verify-routed-sdk-gate_test.mjs @@ -0,0 +1,40 @@ +#!/usr/bin/env node +import assert from "node:assert/strict"; +import { verifyRoutedSdkGate } from "./verify-routed-sdk-gate.mjs"; + +const surfaces = ["typescript", "rust", "go", "python", "ruby", "lua", "php", "swift", "kotlin", "harness"]; + +function needs(outputs, results = {}) { + return { + classify: { outputs, result: "success" }, + core: { result: "skipped" }, + go: { result: "skipped" }, + go_consumer: { result: "skipped" }, + python: { result: "skipped" }, + ruby: { result: "skipped" }, + lua: { result: "skipped" }, + php: { result: "skipped" }, + swift: { result: "skipped" }, + kotlin: { result: "skipped" }, + harness: { result: "skipped" }, + ...Object.fromEntries(Object.entries(results).map(([name, result]) => [name, { result }])), + }; +} + +const none = Object.fromEntries(surfaces.map((name) => [name, "false"])); +assert.doesNotThrow(() => verifyRoutedSdkGate(needs({ ...none, docs_only: "true" }))); +assert.doesNotThrow(() => + verifyRoutedSdkGate(needs({ ...none, docs_only: "false", python: "true" }, { python: "success" })), +); +assert.throws(() => verifyRoutedSdkGate(needs({})), /missing or invalid/); +assert.throws(() => verifyRoutedSdkGate(needs({ ...none, docs_only: "false" })), /select at least one/); +assert.throws( + () => verifyRoutedSdkGate(needs({ ...none, docs_only: "true", python: "true" }, { python: "success" })), + /select at least one/, +); +assert.throws( + () => verifyRoutedSdkGate(needs({ ...none, docs_only: "false", go: "true" }, { go: "success" })), + /go_consumer.*skipped/, +); + +console.log("verify-routed-sdk-gate_test: PASS"); diff --git a/typescript/packages/mpp/solana-mpp-0.2.0.tgz b/typescript/packages/mpp/solana-mpp-0.2.0.tgz deleted file mode 100644 index 5eb4aa9f4..000000000 Binary files a/typescript/packages/mpp/solana-mpp-0.2.0.tgz and /dev/null differ diff --git a/typescript/packages/mpp/solana-mpp-0.5.0.tgz b/typescript/packages/mpp/solana-mpp-0.5.0.tgz deleted file mode 100644 index 984414d5f..000000000 Binary files a/typescript/packages/mpp/solana-mpp-0.5.0.tgz and /dev/null differ