{"entry":{"fixtureId":"forfeit-limbo-fairness-v0","appSlug":"forfeit-limbo","appName":"Forfeit Limbo (fairness)","reportId":"lab_forfeit-limbo-fairness-v0_20260610225855216","generatedAt":"2026-06-10T22:58:55.216Z","status":"pass","jsonPath":"/bundle/server-functions/default/.nocklab/forfeit-limbo-fairness.report.json","markdownPath":"/bundle/server-functions/default/.nocklab/forfeit-limbo-fairness.report.md","reportHash":"sha256:4a9ed6401d1a323ab3ef6756ed20ec82d2fe47d3cfb6ac2d24c34ca705ea443b","snapshotRoot":"e20ee592bdf03a70","badgeCandidate":{"id":"badge-candidate-forfeit-limbo","label":"Forfeit Limbo (fairness) Verification Candidate","reportSlug":"forfeit-limbo","fixtureId":"forfeit-limbo-fairness-v0","status":"ready","evidenceKind":"model-attested","statusReDerived":"pass","statusConsistent":true,"kernelHash":null,"kernelVerified":false,"baseDeploymentHash":null,"baseVerified":false,"signatureStatus":"unsigned","evidence":{"reportHash":"sha256:4a9ed6401d1a323ab3ef6756ed20ec82d2fe47d3cfb6ac2d24c34ca705ea443b","snapshotRoot":"e20ee592bdf03a70","invariantPacks":[]}},"stepsPassed":1,"stepsTotal":1,"invariantsPassed":4,"invariantsTotal":4,"alertsTriggered":0,"snapshotsCaptured":2,"adapterObservationCount":0,"invariantPackCount":0},"report":{"reportId":"lab_forfeit-limbo-fairness-v0_20260610225855216","fixtureId":"forfeit-limbo-fairness-v0","generatedAt":"2026-06-10T22:58:55.216Z","app":{"name":"Forfeit Limbo (fairness)","slug":"forfeit-limbo","version":"0.0.1","kernel":"forfeit-limbo"},"environment":{"mode":"mock-fakenet","grpcEndpoint":"n/a","fakenetCommand":"model","notes":["Positive proof of the forfeit-limbo fairness invariants over a resolved round.","Peek surface is commitment-only (no seed); revealed seeds hash to their commitments; nonce strictly increases.","Crash multiplier max(1.00, 0.99·2^24/(u+1)) from a recomputable uniform draw; player wins iff it reaches the fixed 2.00x target (49.5%).","Honest limit: this proves the MODEL and that the invariants are well-formed, not the compiled Hoon. Real-VM poke/peek awaits generic-cause nockapp-run."]},"summary":{"status":"pass","stepsPassed":1,"stepsFailed":0,"invariantsPassed":4,"invariantsFailed":0,"alertsClear":0,"alertsTriggered":0,"snapshotsCaptured":2,"durationMs":17,"expectRejected":false,"rawStatus":"pass"},"invariantPacks":[],"steps":[{"id":"peek-commit-surface","type":"peek","title":"Peek the commitment-only surface","status":"pass","target":"/round","expectation":"peekSurface.nonce == 4","observed":"4","beforeHash":"e20ee592bdf03a70","afterHash":"e20ee592bdf03a70","stateDiffs":[],"durationMs":19}],"invariants":[{"id":"commit-only-peek","title":"Peek surface never exposes an unrevealed seed","severity":"critical","status":"pass","observed":"peek surface clean: 6 field(s), no unrevealed secret","expected":"no unrevealed seed/secret in the peek surface at peekSurface"},{"id":"seeds-hashlock","title":"Revealed seeds hash to their commitments (provable fairness)","severity":"critical","status":"pass","observed":"all 2 revealed seed(s) hash to their commitment","expected":"sha256(seed) == commit for every revealed pair under reveals"},{"id":"nonce-monotonic","title":"Nonce strictly increases (replay safety)","severity":"high","status":"pass","observed":"[0,1,2,3,4]","expected":"nonceSequence is a strictly-increasing numeric sequence (replay/nonce safety)"},{"id":"multiplier-floor","title":"Multiplier never drops below 1.00x (x100 >= 100)","severity":"high","status":"pass","observed":"104","expected":"100 <= peekSurface.multiplierX100 <= 1675200"}],"alerts":[],"adapterObservations":[],"stateSnapshots":[{"label":"Initial state","stateHash":"e20ee592bdf03a70","state":{"peekSurface":{"nonce":4,"commitHouse":"e0e77a507412b120f6ede61f62295b1a7b2ff19d3dcc8f7253e51663470c888e","commitPlayer":"4ca14526b2751b640d549ce7caf8ac39438592211a0ec370064d57666a682ad6","multiplierX100":104,"target":200,"outcome":false},"reveals":[{"label":"house","seed":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","commit":"e0e77a507412b120f6ede61f62295b1a7b2ff19d3dcc8f7253e51663470c888e"},{"label":"player","seed":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","commit":"4ca14526b2751b640d549ce7caf8ac39438592211a0ec370064d57666a682ad6"}],"nonceSequence":[0,1,2,3,4]}},{"label":"After peek-commit-surface","stateHash":"e20ee592bdf03a70","state":{"peekSurface":{"nonce":4,"commitHouse":"e0e77a507412b120f6ede61f62295b1a7b2ff19d3dcc8f7253e51663470c888e","commitPlayer":"4ca14526b2751b640d549ce7caf8ac39438592211a0ec370064d57666a682ad6","multiplierX100":104,"target":200,"outcome":false},"reveals":[{"label":"house","seed":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","commit":"e0e77a507412b120f6ede61f62295b1a7b2ff19d3dcc8f7253e51663470c888e"},{"label":"player","seed":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","commit":"4ca14526b2751b640d549ce7caf8ac39438592211a0ec370064d57666a682ad6"}],"nonceSequence":[0,1,2,3,4]},"stepId":"peek-commit-surface"}],"stateDiffs":[],"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":"# ✅ Forfeit Limbo (fairness) Lab Report\n\n> **PASS** — 1/1 steps · 4/4 invariants · 0 alerts · 17ms\n\n| Field | Value |\n| --- | --- |\n| Report | `lab_forfeit-limbo-fairness-v0_20260610225855216` |\n| Fixture | `forfeit-limbo-fairness-v0` |\n| Status | ✅ pass |\n| Steps | 1 passed, 0 failed |\n| Invariants | 4 passed, 0 failed |\n| Alerts | 0 clear, 0 triggered |\n| Snapshots | 2 |\n\n## Steps\n\n- ✅ `peek-commit-surface` — 4 _(peekSurface.nonce == 4)_; e20ee592bdf03a70 -> e20ee592bdf03a70\n\n## Invariants\n\n- ✅ `commit-only-peek` — peek surface clean: 6 field(s), no unrevealed secret _(expected no unrevealed seed/secret in the peek surface at peekSurface)_\n- ✅ `seeds-hashlock` — all 2 revealed seed(s) hash to their commitment _(expected sha256(seed) == commit for every revealed pair under reveals)_\n- ✅ `nonce-monotonic` — [0,1,2,3,4] _(expected nonceSequence is a strictly-increasing numeric sequence (replay/nonce safety))_\n- ✅ `multiplier-floor` — 104 _(expected 100 <= peekSurface.multiplierX100 <= 1675200)_\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\n## Snapshot Timeline\n\n- Initial state: e20ee592bdf03a70\n- After peek-commit-surface: e20ee592bdf03a70\n\n","evidence":{"stateDiffCount":0,"snapshotCount":2,"alertCount":0,"triggeredAlertCount":0,"clearAlertCount":0,"triggeredCriticalAlertCount":0,"triggeredWarningAlertCount":0,"triggeredInfoAlertCount":0,"environmentMode":"mock-fakenet","grpcEndpoint":"n/a","environmentNoteCount":4,"nextActionCount":4,"firstNextAction":"Replace mock poke and peek execution with local fakenet adapter calls.","invariantPackCount":0,"invariantPackIds":[],"invariantPackDomains":[],"firstInvariantPackPath":"","changedPaths":[],"markdownPreview":"# ✅ Forfeit Limbo (fairness) Lab Report"}}