{"entry":{"fixtureId":"mining-pow-v0","appSlug":"mining-pow","appName":"Mining and PoW Pack","reportId":"lab_mining-pow-v0_20260610225855212","generatedAt":"2026-06-10T22:58:55.212Z","status":"pass","jsonPath":"/bundle/server-functions/default/.nocklab/mining-pow.report.json","markdownPath":"/bundle/server-functions/default/.nocklab/mining-pow.report.md","reportHash":"sha256:fb6b63e3fe1b85c411d4139d0b9c43d4237cd086677878455aa42fee73907b2e","snapshotRoot":"b60af7179b49d019","badgeCandidate":{"id":"badge-candidate-mining-pow","label":"Mining and PoW Pack Verification Candidate","reportSlug":"mining-pow","fixtureId":"mining-pow-v0","status":"ready","evidenceKind":"model-attested","statusReDerived":"pass","statusConsistent":true,"kernelHash":null,"kernelVerified":false,"baseDeploymentHash":null,"baseVerified":false,"signatureStatus":"unsigned","evidence":{"reportHash":"sha256:fb6b63e3fe1b85c411d4139d0b9c43d4237cd086677878455aa42fee73907b2e","snapshotRoot":"b60af7179b49d019","invariantPacks":["mining-pow-core-v0"]}},"stepsPassed":4,"stepsTotal":4,"invariantsPassed":6,"invariantsTotal":6,"alertsTriggered":0,"snapshotsCaptured":5,"adapterObservationCount":0,"invariantPackCount":1},"report":{"reportId":"lab_mining-pow-v0_20260610225855212","fixtureId":"mining-pow-v0","generatedAt":"2026-06-10T22:58:55.212Z","app":{"name":"Mining and PoW Pack","slug":"mining-pow","version":"0.1.0","kernel":"mock-mining-v0"},"environment":{"mode":"mock-fakenet","grpcEndpoint":"127.0.0.1:5555","fakenetCommand":"nockchain --fakenet --mine --mining-pkh <pkh> --bind-public-grpc-addr 127.0.0.1:5555 --no-default-peers","notes":["Mock fakenet mining run exercising the mining-pow invariant pack.","A miner poke mines a block (advances height, meets the PoW target); a node poke confirms the new heaviest chain.","Metadata-only: no raw candidate noun, raw proof, PMA slabs, state jams, or mining-key secret material is represented."]},"summary":{"status":"pass","stepsPassed":4,"stepsFailed":0,"invariantsPassed":6,"invariantsFailed":0,"alertsClear":0,"alertsTriggered":0,"snapshotsCaptured":5,"durationMs":68,"expectRejected":false,"rawStatus":"pass"},"invariantPacks":[{"id":"mining-pow-core-v0","name":"Mining and PoW Core","domain":"mining-pow","version":"0.1.0","path":"../packs/mining-pow.invariants.json","upstreamBasis":{"repo":"nockchain/nockchain","commit":"33ba97b1e206dd89b15c61b72b7802caf2136c18","build":"build-33ba97b1e206dd89b15c61b72b7802caf2136c18","protocolTrack":"mining-pow"},"sourceAnchors":[{"id":"mining-driver","upstreamRepo":"nockchain/nockchain","upstreamFile":"crates/nockchain/src/mining.rs","upstreamUrl":"https://github.com/nockchain/nockchain/blob/33ba97b1e206dd89b15c61b72b7802caf2136c18/crates/nockchain/src/mining.rs","docTier":"tier-1-scoped","note":"Mining driver wire/attempt logic underpins the block-height floor and authorized-miner assertions here."},{"id":"pow-check-target","upstreamRepo":"nockchain/nockchain","upstreamFile":"hoon/common/pow.hoon","upstreamUrl":"https://github.com/nockchain/nockchain/blob/33ba97b1e206dd89b15c61b72b7802caf2136c18/hoon/common/pow.hoon","docTier":"tier-1-scoped","note":"check-target / proof-to-pow define when a proof meets the target; this pack asserts the PoW target is met."},{"id":"heaviest-chain-trace","upstreamRepo":"nockchain/nockchain","upstreamFile":"crates/nockchain/src/traces.rs","upstreamUrl":"https://github.com/nockchain/nockchain/blob/33ba97b1e206dd89b15c61b72b7802caf2136c18/crates/nockchain/src/traces.rs","docTier":"tier-1-scoped","note":"new_heaviest_chain / new_heaviest_miner / block_height define heaviest-chain progression; this pack asserts mining tracks the heaviest chain."}]}],"steps":[{"id":"boot-fakenet","type":"fakenet","title":"Boot mock mining fakenet","status":"pass","expectation":"gRPC endpoint configured at 127.0.0.1:5555 with mining enabled","observed":"mock-fakenet profile ready at 127.0.0.1:5555","beforeHash":"e9838fcec3bbb64e","afterHash":"e9838fcec3bbb64e","stateDiffs":[],"durationMs":19},{"id":"miner-mines-block","type":"poke","title":"Miner mines a block meeting the PoW target","status":"pass","actor":"miner","target":"/mining/attempt","expectation":"mining.blockHeight == 1005","observed":"1005","beforeHash":"e9838fcec3bbb64e","afterHash":"b60af7179b49d019","stateDiffs":[{"path":"mining.blockHeight","before":"1000","after":"1005"},{"path":"mining.powTargetMet","before":"false","after":"true"}],"durationMs":26},{"id":"node-confirms-heaviest","type":"poke","title":"Node confirms the new heaviest chain","status":"pass","actor":"node","target":"/mining/heaviest","expectation":"mining.onHeaviestChain == true","observed":"true","beforeHash":"b60af7179b49d019","afterHash":"b60af7179b49d019","stateDiffs":[],"durationMs":33},{"id":"peek-pow-target","type":"peek","title":"Read proof-of-work target status","status":"pass","target":"/mining","expectation":"mining.powTargetMet == true","observed":"true","beforeHash":"b60af7179b49d019","afterHash":"b60af7179b49d019","stateDiffs":[],"durationMs":40}],"invariants":[{"id":"mining-block-height-floor","title":"Mined block height does not regress below its floor","severity":"critical","status":"pass","observed":"1005","expected":"mining.blockHeight >= 1000"},{"id":"mining-pow-target-met","title":"Proof of work meets the difficulty target","severity":"critical","status":"pass","observed":"true","expected":"mining.powTargetMet == true"},{"id":"mining-on-heaviest-chain","title":"Mining tracks the heaviest chain, not a stale candidate","severity":"high","status":"pass","observed":"true","expected":"mining.onHeaviestChain == true"},{"id":"mining-network-context","title":"Mining evidence records the fakenet network context","severity":"medium","status":"pass","observed":"fakenet","expected":"mining.network == fakenet"},{"id":"mining-authorized-miner","title":"Mining pokes are performed by authorized miners","severity":"high","status":"pass","observed":"2/2 poke actors authorized","expected":"actors in [miner, node]"},{"id":"mining-no-failure-alert","title":"Mining failure alert remains clear","severity":"critical","status":"pass","observed":"false","expected":"alerts.failed == false"}],"alerts":[],"adapterObservations":[],"stateSnapshots":[{"label":"Initial state","stateHash":"e9838fcec3bbb64e","state":{"mining":{"blockHeight":1000,"powTargetMet":false,"onHeaviestChain":true,"network":"fakenet"},"alerts":{"failed":false}}},{"label":"After boot-fakenet","stateHash":"e9838fcec3bbb64e","state":{"mining":{"blockHeight":1000,"powTargetMet":false,"onHeaviestChain":true,"network":"fakenet"},"alerts":{"failed":false}},"stepId":"boot-fakenet"},{"label":"After miner-mines-block","stateHash":"b60af7179b49d019","state":{"mining":{"blockHeight":1005,"powTargetMet":true,"onHeaviestChain":true,"network":"fakenet"},"alerts":{"failed":false}},"stepId":"miner-mines-block"},{"label":"After node-confirms-heaviest","stateHash":"b60af7179b49d019","state":{"mining":{"blockHeight":1005,"powTargetMet":true,"onHeaviestChain":true,"network":"fakenet"},"alerts":{"failed":false}},"stepId":"node-confirms-heaviest"},{"label":"After peek-pow-target","stateHash":"b60af7179b49d019","state":{"mining":{"blockHeight":1005,"powTargetMet":true,"onHeaviestChain":true,"network":"fakenet"},"alerts":{"failed":false}},"stepId":"peek-pow-target"}],"stateDiffs":[{"path":"mining.blockHeight","before":"1000","after":"1005"},{"path":"mining.powTargetMet","before":"false","after":"true"}],"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":"# ✅ Mining and PoW Pack Lab Report\n\n> **PASS** — 4/4 steps · 6/6 invariants · 0 alerts · 68ms\n\n| Field | Value |\n| --- | --- |\n| Report | `lab_mining-pow-v0_20260610225855212` |\n| Fixture | `mining-pow-v0` |\n| Status | ✅ pass |\n| Steps | 4 passed, 0 failed |\n| Invariants | 6 passed, 0 failed |\n| Alerts | 0 clear, 0 triggered |\n| Snapshots | 5 |\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 with mining enabled)_; e9838fcec3bbb64e -> e9838fcec3bbb64e\n- ✅ `miner-mines-block` — 1005 _(mining.blockHeight == 1005)_; e9838fcec3bbb64e -> b60af7179b49d019\n  - mining.blockHeight: 1000 -> 1005\n  - mining.powTargetMet: false -> true\n- ✅ `node-confirms-heaviest` — true _(mining.onHeaviestChain == true)_; b60af7179b49d019 -> b60af7179b49d019\n- ✅ `peek-pow-target` — true _(mining.powTargetMet == true)_; b60af7179b49d019 -> b60af7179b49d019\n\n## Invariants\n\n- ✅ `mining-block-height-floor` — 1005 _(expected mining.blockHeight >= 1000)_\n- ✅ `mining-pow-target-met` — true _(expected mining.powTargetMet == true)_\n- ✅ `mining-on-heaviest-chain` — true _(expected mining.onHeaviestChain == true)_\n- ✅ `mining-network-context` — fakenet _(expected mining.network == fakenet)_\n- ✅ `mining-authorized-miner` — 2/2 poke actors authorized _(expected actors in [miner, node])_\n- ✅ `mining-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- mining.blockHeight: 1000 -> 1005\n- mining.powTargetMet: false -> true\n\n## Snapshot Timeline\n\n- Initial state: e9838fcec3bbb64e\n- After boot-fakenet: e9838fcec3bbb64e\n- After miner-mines-block: b60af7179b49d019\n- After node-confirms-heaviest: b60af7179b49d019\n- After peek-pow-target: b60af7179b49d019\n\n","evidence":{"stateDiffCount":2,"snapshotCount":5,"alertCount":0,"triggeredAlertCount":0,"clearAlertCount":0,"triggeredCriticalAlertCount":0,"triggeredWarningAlertCount":0,"triggeredInfoAlertCount":0,"environmentMode":"mock-fakenet","grpcEndpoint":"127.0.0.1:5555","environmentNoteCount":3,"nextActionCount":4,"firstNextAction":"Replace mock poke and peek execution with local fakenet adapter calls.","invariantPackCount":1,"invariantPackIds":["mining-pow-core-v0"],"invariantPackDomains":["mining-pow"],"firstInvariantPackPath":"../packs/mining-pow.invariants.json","changedPaths":["mining.blockHeight","mining.powTargetMet"],"markdownPreview":"# ✅ Mining and PoW Pack Lab Report"}}