{"entry":{"fixtureId":"payment-flow-v0","appSlug":"payment-flow","appName":"Payment Flow","reportId":"lab_payment-flow-v0_20260610225855205","generatedAt":"2026-06-10T22:58:55.205Z","status":"pass","jsonPath":"/bundle/server-functions/default/.nocklab/payment-flow.report.json","markdownPath":"/bundle/server-functions/default/.nocklab/payment-flow.report.md","reportHash":"sha256:ae23cd2bb676c10381d3f8159643eda865e6d59013d23e18c652cf7fb84a39f8","snapshotRoot":"3a6d6bff59cb624f","badgeCandidate":{"id":"badge-candidate-payment-flow","label":"Payment Flow Verification Candidate","reportSlug":"payment-flow","fixtureId":"payment-flow-v0","status":"ready","evidenceKind":"model-attested","statusReDerived":"pass","statusConsistent":true,"kernelHash":null,"kernelVerified":false,"baseDeploymentHash":null,"baseVerified":false,"signatureStatus":"unsigned","evidence":{"reportHash":"sha256:ae23cd2bb676c10381d3f8159643eda865e6d59013d23e18c652cf7fb84a39f8","snapshotRoot":"3a6d6bff59cb624f","invariantPacks":["payments-core-v0"]}},"stepsPassed":5,"stepsTotal":5,"invariantsPassed":5,"invariantsTotal":5,"alertsTriggered":0,"snapshotsCaptured":6,"adapterObservationCount":0,"invariantPackCount":1},"report":{"reportId":"lab_payment-flow-v0_20260610225855205","fixtureId":"payment-flow-v0","generatedAt":"2026-06-10T22:58:55.205Z","app":{"name":"Payment Flow","slug":"payment-flow","version":"0.1.0","kernel":"mock-payment-v0"},"environment":{"mode":"mock-fakenet","grpcEndpoint":"127.0.0.1:5555","fakenetCommand":"nockchain --fakenet --bind-public-grpc-addr 127.0.0.1:5555 --no-default-peers","notes":["Mock payment lifecycle for escrowed settlement runs.","Uses invariant packs to prove payment safety conditions before a real adapter exists."]},"summary":{"status":"pass","stepsPassed":5,"stepsFailed":0,"invariantsPassed":5,"invariantsFailed":0,"alertsClear":0,"alertsTriggered":0,"snapshotsCaptured":6,"durationMs":85,"expectRejected":false,"rawStatus":"pass"},"invariantPacks":[{"id":"payments-core-v0","name":"Payments Core","domain":"payments","version":"0.1.0","path":"../packs/payments.invariants.json","upstreamBasis":{"repo":"nockchain/nockchain","commit":"33ba97b1e206dd89b15c61b72b7802caf2136c18","build":"build-33ba97b1e206dd89b15c61b72b7802caf2136c18","protocolTrack":"bridge-withdrawal-settlement"},"sourceAnchors":[]}],"steps":[{"id":"boot-fakenet","type":"fakenet","title":"Boot mock payment fakenet","status":"pass","expectation":"gRPC endpoint configured at 127.0.0.1:5555","observed":"mock-fakenet profile ready at 127.0.0.1:5555","beforeHash":"08337dad0704df79","afterHash":"08337dad0704df79","stateDiffs":[],"durationMs":19},{"id":"lock-customer-funds","type":"poke","title":"Customer locks payment funds","status":"pass","actor":"customer","target":"/payment/lock","expectation":"payment.status == locked","observed":"locked","beforeHash":"08337dad0704df79","afterHash":"e135b8264951963f","stateDiffs":[{"path":"ledger.balances.customer","before":"2500","after":"1300"},{"path":"ledger.balances.escrow","before":"0","after":"1200"},{"path":"payment.status","before":"created","after":"locked"},{"path":"payment.events","before":"[]","after":"[{\"type\":\"locked\",\"actor\":\"customer\"}]"}],"durationMs":26},{"id":"merchant-accepts-payment","type":"poke","title":"Merchant accepts payment terms","status":"pass","actor":"merchant","target":"/payment/accept","expectation":"payment.receiptId == receipt-001","observed":"receipt-001","beforeHash":"e135b8264951963f","afterHash":"9c21c9c8ddf8f839","stateDiffs":[{"path":"payment.status","before":"locked","after":"accepted"},{"path":"payment.receiptId","before":"null","after":"receipt-001"},{"path":"payment.events","before":"[{\"type\":\"locked\",\"actor\":\"customer\"}]","after":"[{\"type\":\"locked\",\"actor\":\"customer\"},{\"type\":\"accepted\",\"actor\":\"merchant\"}]"}],"durationMs":33},{"id":"release-to-merchant","type":"poke","title":"Escrow releases settled payment","status":"pass","actor":"escrow-agent","target":"/payment/release","expectation":"ledger.balances.merchant == 8700","observed":"8700","beforeHash":"9c21c9c8ddf8f839","afterHash":"3a6d6bff59cb624f","stateDiffs":[{"path":"ledger.balances.merchant","before":"7500","after":"8700"},{"path":"ledger.balances.escrow","before":"1200","after":"0"},{"path":"payment.status","before":"accepted","after":"settled"},{"path":"payment.events","before":"[{\"type\":\"locked\",\"actor\":\"customer\"},{\"type\":\"accepted\",\"actor\":\"merchant\"}]","after":"[{\"type\":\"locked\",\"actor\":\"customer\"},{\"type\":\"accepted\",\"actor\":\"merchant\"},{\"type\":\"settled\",\"actor\":\"escrow-agent\"}]"}],"durationMs":40},{"id":"peek-payment-status","type":"peek","title":"Read settled payment status","status":"pass","target":"/payment","expectation":"payment.status == settled","observed":"settled","beforeHash":"3a6d6bff59cb624f","afterHash":"3a6d6bff59cb624f","stateDiffs":[],"durationMs":47}],"invariants":[{"id":"payments-supply-conserved","title":"Payment ledger conserves supply","severity":"critical","status":"pass","observed":"total=10000, supply=10000","expected":"ledger.balances sum equals ledger.totalSupply"},{"id":"payments-terminal-settled","title":"Payment reaches settled terminal state","severity":"critical","status":"pass","observed":"settled","expected":"payment.status == settled"},{"id":"payments-authorized-actors","title":"Payment pokes are performed by authorized actors","severity":"high","status":"pass","observed":"3/3 poke actors authorized","expected":"actors in [customer, merchant, escrow-agent]"},{"id":"payment-receipt-recorded","title":"Payment settlement records a receipt","severity":"high","status":"pass","observed":"receipt-001","expected":"payment.receiptId == receipt-001"},{"id":"payment-no-failure-alert","title":"Payment failure alert remains clear","severity":"critical","status":"pass","observed":"false","expected":"alerts.failed == false"}],"alerts":[],"adapterObservations":[],"stateSnapshots":[{"label":"Initial state","stateHash":"08337dad0704df79","state":{"ledger":{"totalSupply":10000,"balances":{"merchant":7500,"customer":2500,"escrow":0}},"payment":{"status":"created","amount":1200,"receiptId":null,"events":[]},"alerts":{"failed":false}}},{"label":"After boot-fakenet","stateHash":"08337dad0704df79","state":{"ledger":{"totalSupply":10000,"balances":{"merchant":7500,"customer":2500,"escrow":0}},"payment":{"status":"created","amount":1200,"receiptId":null,"events":[]},"alerts":{"failed":false}},"stepId":"boot-fakenet"},{"label":"After lock-customer-funds","stateHash":"e135b8264951963f","state":{"ledger":{"totalSupply":10000,"balances":{"merchant":7500,"customer":1300,"escrow":1200}},"payment":{"status":"locked","amount":1200,"receiptId":null,"events":[{"type":"locked","actor":"customer"}]},"alerts":{"failed":false}},"stepId":"lock-customer-funds"},{"label":"After merchant-accepts-payment","stateHash":"9c21c9c8ddf8f839","state":{"ledger":{"totalSupply":10000,"balances":{"merchant":7500,"customer":1300,"escrow":1200}},"payment":{"status":"accepted","amount":1200,"receiptId":"receipt-001","events":[{"type":"locked","actor":"customer"},{"type":"accepted","actor":"merchant"}]},"alerts":{"failed":false}},"stepId":"merchant-accepts-payment"},{"label":"After release-to-merchant","stateHash":"3a6d6bff59cb624f","state":{"ledger":{"totalSupply":10000,"balances":{"merchant":8700,"customer":1300,"escrow":0}},"payment":{"status":"settled","amount":1200,"receiptId":"receipt-001","events":[{"type":"locked","actor":"customer"},{"type":"accepted","actor":"merchant"},{"type":"settled","actor":"escrow-agent"}]},"alerts":{"failed":false}},"stepId":"release-to-merchant"},{"label":"After peek-payment-status","stateHash":"3a6d6bff59cb624f","state":{"ledger":{"totalSupply":10000,"balances":{"merchant":8700,"customer":1300,"escrow":0}},"payment":{"status":"settled","amount":1200,"receiptId":"receipt-001","events":[{"type":"locked","actor":"customer"},{"type":"accepted","actor":"merchant"},{"type":"settled","actor":"escrow-agent"}]},"alerts":{"failed":false}},"stepId":"peek-payment-status"}],"stateDiffs":[{"path":"ledger.balances.merchant","before":"7500","after":"8700"},{"path":"ledger.balances.customer","before":"2500","after":"1300"},{"path":"payment.status","before":"created","after":"settled"},{"path":"payment.receiptId","before":"null","after":"receipt-001"},{"path":"payment.events","before":"[]","after":"[{\"type\":\"locked\",\"actor\":\"customer\"},{\"type\":\"accepted\",\"actor\":\"merchant\"},{\"type\":\"settled\",\"actor\":\"escrow-agent\"}]"}],"nextActions":["Replace mock poke and peek execution with local fakenet adapter calls.","Replace command-backed fakenet metadata probes with stable gRPC-native probes once node surfaces are available.","Persist generated reports under a project workspace.","Add app-specific invariant packs as the NockApp interface stabilizes."]},"markdown":"# ✅ Payment Flow Lab Report\n\n> **PASS** — 5/5 steps · 5/5 invariants · 0 alerts · 85ms\n\n| Field | Value |\n| --- | --- |\n| Report | `lab_payment-flow-v0_20260610225855205` |\n| Fixture | `payment-flow-v0` |\n| Status | ✅ pass |\n| Steps | 5 passed, 0 failed |\n| Invariants | 5 passed, 0 failed |\n| Alerts | 0 clear, 0 triggered |\n| Snapshots | 6 |\n\n## Steps\n\n- ✅ `boot-fakenet` — mock-fakenet profile ready at 127.0.0.1:5555 _(gRPC endpoint configured at 127.0.0.1:5555)_; 08337dad0704df79 -> 08337dad0704df79\n- ✅ `lock-customer-funds` — locked _(payment.status == locked)_; 08337dad0704df79 -> e135b8264951963f\n  - ledger.balances.customer: 2500 -> 1300\n  - ledger.balances.escrow: 0 -> 1200\n  - payment.status: created -> locked\n  - payment.events: [] -> [{\"type\":\"locked\",\"actor\":\"customer\"}]\n- ✅ `merchant-accepts-payment` — receipt-001 _(payment.receiptId == receipt-001)_; e135b8264951963f -> 9c21c9c8ddf8f839\n  - payment.status: locked -> accepted\n  - payment.receiptId: null -> receipt-001\n  - payment.events: [{\"type\":\"locked\",\"actor\":\"customer\"}] -> [{\"type\":\"locked\",\"actor\":\"customer\"},{\"type\":\"accepted\",\"actor\":\"merchant\"}]\n- ✅ `release-to-merchant` — 8700 _(ledger.balances.merchant == 8700)_; 9c21c9c8ddf8f839 -> 3a6d6bff59cb624f\n  - ledger.balances.merchant: 7500 -> 8700\n  - ledger.balances.escrow: 1200 -> 0\n  - payment.status: accepted -> settled\n  - payment.events: [{\"type\":\"locked\",\"actor\":\"customer\"},{\"type\":\"accepted\",\"actor\":\"merchant\"}] -> [{\"type\":\"locked\",\"actor\":\"customer\"},{\"type\":\"accepted\",\"actor\":\"merchant\"},{\"type\":\"settled\",\"actor\":\"escrow-agent\"}]\n- ✅ `peek-payment-status` — settled _(payment.status == settled)_; 3a6d6bff59cb624f -> 3a6d6bff59cb624f\n\n## Invariants\n\n- ✅ `payments-supply-conserved` — total=10000, supply=10000 _(expected ledger.balances sum equals ledger.totalSupply)_\n- ✅ `payments-terminal-settled` — settled _(expected payment.status == settled)_\n- ✅ `payments-authorized-actors` — 3/3 poke actors authorized _(expected actors in [customer, merchant, escrow-agent])_\n- ✅ `payment-receipt-recorded` — receipt-001 _(expected payment.receiptId == receipt-001)_\n- ✅ `payment-no-failure-alert` — false _(expected alerts.failed == false)_\n\n## Alerts\n\n- No alert policies configured.\n\n## Adapter Observations\n\n- No adapter observations captured.\n\n## State Diffs\n\n- ledger.balances.merchant: 7500 -> 8700\n- ledger.balances.customer: 2500 -> 1300\n- payment.status: created -> settled\n- payment.receiptId: null -> receipt-001\n- payment.events: [] -> [{\"type\":\"locked\",\"actor\":\"customer\"},{\"type\":\"accepted\",\"actor\":\"merchant\"},{\"type\":\"settled\",\"actor\":\"escrow-agent\"}]\n\n## Snapshot Timeline\n\n- Initial state: 08337dad0704df79\n- After boot-fakenet: 08337dad0704df79\n- After lock-customer-funds: e135b8264951963f\n- After merchant-accepts-payment: 9c21c9c8ddf8f839\n- After release-to-merchant: 3a6d6bff59cb624f\n- After peek-payment-status: 3a6d6bff59cb624f\n\n","evidence":{"stateDiffCount":5,"snapshotCount":6,"alertCount":0,"triggeredAlertCount":0,"clearAlertCount":0,"triggeredCriticalAlertCount":0,"triggeredWarningAlertCount":0,"triggeredInfoAlertCount":0,"environmentMode":"mock-fakenet","grpcEndpoint":"127.0.0.1:5555","environmentNoteCount":2,"nextActionCount":4,"firstNextAction":"Replace mock poke and peek execution with local fakenet adapter calls.","invariantPackCount":1,"invariantPackIds":["payments-core-v0"],"invariantPackDomains":["payments"],"firstInvariantPackPath":"../packs/payments.invariants.json","changedPaths":["ledger.balances.merchant","ledger.balances.customer","payment.status","payment.receiptId","payment.events"],"markdownPreview":"# ✅ Payment Flow Lab Report"}}