{"entry":{"fixtureId":"bridge-pack-v0","appSlug":"bridge-pack","appName":"Bridge Settlement Pack","reportId":"lab_bridge-pack-v0_20260610225855210","generatedAt":"2026-06-10T22:58:55.210Z","status":"pass","jsonPath":"/bundle/server-functions/default/.nocklab/bridge-pack.report.json","markdownPath":"/bundle/server-functions/default/.nocklab/bridge-pack.report.md","reportHash":"sha256:8bbe0a3108e4bc01d39ee216e7a8ad16b38eab13b8481ca817962805fe9b228d","snapshotRoot":"4f32a77e5f441ed6","badgeCandidate":{"id":"badge-candidate-bridge-pack","label":"Bridge Settlement Pack Verification Candidate","reportSlug":"bridge-pack","fixtureId":"bridge-pack-v0","status":"ready","evidenceKind":"model-attested","statusReDerived":"pass","statusConsistent":true,"kernelHash":null,"kernelVerified":false,"baseDeploymentHash":null,"baseVerified":false,"signatureStatus":"unsigned","evidence":{"reportHash":"sha256:8bbe0a3108e4bc01d39ee216e7a8ad16b38eab13b8481ca817962805fe9b228d","snapshotRoot":"4f32a77e5f441ed6","invariantPacks":["bridge-settlement-core-v0"]}},"stepsPassed":5,"stepsTotal":5,"invariantsPassed":6,"invariantsTotal":6,"alertsTriggered":0,"snapshotsCaptured":6,"adapterObservationCount":0,"invariantPackCount":1},"report":{"reportId":"lab_bridge-pack-v0_20260610225855210","fixtureId":"bridge-pack-v0","generatedAt":"2026-06-10T22:58:55.210Z","app":{"name":"Bridge Settlement Pack","slug":"bridge-pack","version":"0.1.0","kernel":"mock-bridge-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 bridge withdrawal settlement run exercising the bridge-settlement invariant pack.","Relayer and sequencer pokes advance settlement through observed, proven, and finalized states.","Pack authority is pinned to the bridge withdrawal execution commit; see upstreamBasis.","Metadata-only: no raw withdrawal proofs, sequencer signing material, PMA slabs, or state jams are represented."]},"summary":{"status":"pass","stepsPassed":5,"stepsFailed":0,"invariantsPassed":6,"invariantsFailed":0,"alertsClear":0,"alertsTriggered":0,"snapshotsCaptured":6,"durationMs":85,"expectRejected":false,"rawStatus":"pass"},"invariantPacks":[{"id":"bridge-settlement-core-v0","name":"Bridge Settlement Core","domain":"bridge-settlement","version":"0.1.0","path":"../packs/bridge.invariants.json","upstreamBasis":{"repo":"nockchain/nockchain","commit":"33ba97b1e206dd89b15c61b72b7802caf2136c18","build":"build-33ba97b1e206dd89b15c61b72b7802caf2136c18","protocolTrack":"bridge-withdrawal-execution"},"sourceAnchors":[{"id":"bridge-withdrawal-submission","upstreamRepo":"nockchain/nockchain","upstreamFile":"crates/bridge/src/withdrawal/submission.rs","upstreamUrl":"https://github.com/nockchain/nockchain/blob/33ba97b1e206dd89b15c61b72b7802caf2136c18/crates/bridge/src/withdrawal/submission.rs","docTier":"tier-1-scoped","note":"Sequencer authorization, submission, and confirmation depth gate the finalized terminal state this pack asserts."},{"id":"bridge-withdrawals-spec","upstreamRepo":"nockchain/nockchain","upstreamFile":"crates/bridge/docs/bridge-withdrawals.md","upstreamUrl":"https://github.com/nockchain/nockchain/blob/33ba97b1e206dd89b15c61b72b7802caf2136c18/crates/bridge/docs/bridge-withdrawals.md","docTier":"tier-1-scoped","note":"Canonical bridge withdrawal lifecycle: peer-canonical is not submit-ready; confirmed requires observed inclusion plus depth."}]}],"steps":[{"id":"boot-fakenet","type":"fakenet","title":"Boot mock bridge 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":"afaaf73fc6161a56","afterHash":"afaaf73fc6161a56","stateDiffs":[],"durationMs":19},{"id":"relayer-observes-base","type":"poke","title":"Relayer observes the withdrawal on Base","status":"pass","actor":"relayer","target":"/bridge/observe","expectation":"settlement.observedOnBase == true","observed":"true","beforeHash":"afaaf73fc6161a56","afterHash":"5d8611e1747f984c","stateDiffs":[{"path":"settlement.status","before":"initiated","after":"observed"},{"path":"settlement.observedOnBase","before":"false","after":"true"}],"durationMs":26},{"id":"sequencer-records-proof","type":"poke","title":"Sequencer records the settlement proof","status":"pass","actor":"sequencer","target":"/bridge/proof","expectation":"settlement.proofSeen == true","observed":"true","beforeHash":"5d8611e1747f984c","afterHash":"045d7b93142c68be","stateDiffs":[{"path":"settlement.status","before":"observed","after":"proven"},{"path":"settlement.proofSeen","before":"false","after":"true"}],"durationMs":33},{"id":"sequencer-finalizes","type":"poke","title":"Sequencer finalizes the withdrawal at confirmation depth","status":"pass","actor":"sequencer","target":"/bridge/finalize","expectation":"settlement.status == finalized","observed":"finalized","beforeHash":"045d7b93142c68be","afterHash":"4f32a77e5f441ed6","stateDiffs":[{"path":"settlement.status","before":"proven","after":"finalized"},{"path":"settlement.confirmedHeight","before":"0","after":"6"}],"durationMs":40},{"id":"peek-settlement","type":"peek","title":"Read finalized settlement status","status":"pass","target":"/bridge","expectation":"settlement.status == finalized","observed":"finalized","beforeHash":"4f32a77e5f441ed6","afterHash":"4f32a77e5f441ed6","stateDiffs":[],"durationMs":47}],"invariants":[{"id":"bridge-terminal-finalized","title":"Bridge withdrawal reaches finalized terminal state","severity":"critical","status":"pass","observed":"finalized","expected":"settlement.status == finalized"},{"id":"bridge-proof-seen","title":"Settlement proof was observed before finalization","severity":"critical","status":"pass","observed":"true","expected":"settlement.proofSeen == true"},{"id":"bridge-observed-on-base","title":"Withdrawal was observed on Base","severity":"high","status":"pass","observed":"true","expected":"settlement.observedOnBase == true"},{"id":"bridge-no-failure-alert","title":"Bridge failure alert remains clear","severity":"critical","status":"pass","observed":"false","expected":"alerts.failed == false"},{"id":"bridge-authorized-relayer","title":"Bridge pokes are performed by authorized relayer/sequencer actors","severity":"high","status":"pass","observed":"3/3 poke actors authorized","expected":"actors in [relayer, sequencer]"},{"id":"bridge-confirmed-depth","title":"Withdrawal reaches a positive confirmation depth","severity":"high","status":"pass","observed":"6","expected":"settlement.confirmedHeight >= 6"}],"alerts":[],"adapterObservations":[],"stateSnapshots":[{"label":"Initial state","stateHash":"afaaf73fc6161a56","state":{"settlement":{"status":"initiated","proofSeen":false,"observedOnBase":false,"confirmedHeight":0},"alerts":{"failed":false}}},{"label":"After boot-fakenet","stateHash":"afaaf73fc6161a56","state":{"settlement":{"status":"initiated","proofSeen":false,"observedOnBase":false,"confirmedHeight":0},"alerts":{"failed":false}},"stepId":"boot-fakenet"},{"label":"After relayer-observes-base","stateHash":"5d8611e1747f984c","state":{"settlement":{"status":"observed","proofSeen":false,"observedOnBase":true,"confirmedHeight":0},"alerts":{"failed":false}},"stepId":"relayer-observes-base"},{"label":"After sequencer-records-proof","stateHash":"045d7b93142c68be","state":{"settlement":{"status":"proven","proofSeen":true,"observedOnBase":true,"confirmedHeight":0},"alerts":{"failed":false}},"stepId":"sequencer-records-proof"},{"label":"After sequencer-finalizes","stateHash":"4f32a77e5f441ed6","state":{"settlement":{"status":"finalized","proofSeen":true,"observedOnBase":true,"confirmedHeight":6},"alerts":{"failed":false}},"stepId":"sequencer-finalizes"},{"label":"After peek-settlement","stateHash":"4f32a77e5f441ed6","state":{"settlement":{"status":"finalized","proofSeen":true,"observedOnBase":true,"confirmedHeight":6},"alerts":{"failed":false}},"stepId":"peek-settlement"}],"stateDiffs":[{"path":"settlement.status","before":"initiated","after":"finalized"},{"path":"settlement.proofSeen","before":"false","after":"true"},{"path":"settlement.observedOnBase","before":"false","after":"true"},{"path":"settlement.confirmedHeight","before":"0","after":"6"}],"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":"# ✅ Bridge Settlement Pack Lab Report\n\n> **PASS** — 5/5 steps · 6/6 invariants · 0 alerts · 85ms\n\n| Field | Value |\n| --- | --- |\n| Report | `lab_bridge-pack-v0_20260610225855210` |\n| Fixture | `bridge-pack-v0` |\n| Status | ✅ pass |\n| Steps | 5 passed, 0 failed |\n| Invariants | 6 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)_; afaaf73fc6161a56 -> afaaf73fc6161a56\n- ✅ `relayer-observes-base` — true _(settlement.observedOnBase == true)_; afaaf73fc6161a56 -> 5d8611e1747f984c\n  - settlement.status: initiated -> observed\n  - settlement.observedOnBase: false -> true\n- ✅ `sequencer-records-proof` — true _(settlement.proofSeen == true)_; 5d8611e1747f984c -> 045d7b93142c68be\n  - settlement.status: observed -> proven\n  - settlement.proofSeen: false -> true\n- ✅ `sequencer-finalizes` — finalized _(settlement.status == finalized)_; 045d7b93142c68be -> 4f32a77e5f441ed6\n  - settlement.status: proven -> finalized\n  - settlement.confirmedHeight: 0 -> 6\n- ✅ `peek-settlement` — finalized _(settlement.status == finalized)_; 4f32a77e5f441ed6 -> 4f32a77e5f441ed6\n\n## Invariants\n\n- ✅ `bridge-terminal-finalized` — finalized _(expected settlement.status == finalized)_\n- ✅ `bridge-proof-seen` — true _(expected settlement.proofSeen == true)_\n- ✅ `bridge-observed-on-base` — true _(expected settlement.observedOnBase == true)_\n- ✅ `bridge-no-failure-alert` — false _(expected alerts.failed == false)_\n- ✅ `bridge-authorized-relayer` — 3/3 poke actors authorized _(expected actors in [relayer, sequencer])_\n- ✅ `bridge-confirmed-depth` — 6 _(expected settlement.confirmedHeight >= 6)_\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- settlement.status: initiated -> finalized\n- settlement.proofSeen: false -> true\n- settlement.observedOnBase: false -> true\n- settlement.confirmedHeight: 0 -> 6\n\n## Snapshot Timeline\n\n- Initial state: afaaf73fc6161a56\n- After boot-fakenet: afaaf73fc6161a56\n- After relayer-observes-base: 5d8611e1747f984c\n- After sequencer-records-proof: 045d7b93142c68be\n- After sequencer-finalizes: 4f32a77e5f441ed6\n- After peek-settlement: 4f32a77e5f441ed6\n\n","evidence":{"stateDiffCount":4,"snapshotCount":6,"alertCount":0,"triggeredAlertCount":0,"clearAlertCount":0,"triggeredCriticalAlertCount":0,"triggeredWarningAlertCount":0,"triggeredInfoAlertCount":0,"environmentMode":"mock-fakenet","grpcEndpoint":"127.0.0.1:5555","environmentNoteCount":4,"nextActionCount":4,"firstNextAction":"Replace mock poke and peek execution with local fakenet adapter calls.","invariantPackCount":1,"invariantPackIds":["bridge-settlement-core-v0"],"invariantPackDomains":["bridge-settlement"],"firstInvariantPackPath":"../packs/bridge.invariants.json","changedPaths":["settlement.status","settlement.proofSeen","settlement.observedOnBase","settlement.confirmedHeight"],"markdownPreview":"# ✅ Bridge Settlement Pack Lab Report"}}