{"entry":{"fixtureId":"pma-safety-v0","appSlug":"pma-safety","appName":"PMA State Safety Pack","reportId":"lab_pma-safety-v0_20260610225855211","generatedAt":"2026-06-10T22:58:55.211Z","status":"pass","jsonPath":"/bundle/server-functions/default/.nocklab/pma-safety.report.json","markdownPath":"/bundle/server-functions/default/.nocklab/pma-safety.report.md","reportHash":"sha256:18c8b94142961d969041a80d8d65e580beabf94416eb511f4e6ffca49f5afa7d","snapshotRoot":"50695c632860eb95","badgeCandidate":{"id":"badge-candidate-pma-safety","label":"PMA State Safety Pack Verification Candidate","reportSlug":"pma-safety","fixtureId":"pma-safety-v0","status":"ready","evidenceKind":"model-attested","statusReDerived":"pass","statusConsistent":true,"kernelHash":null,"kernelVerified":false,"baseDeploymentHash":null,"baseVerified":false,"signatureStatus":"unsigned","evidence":{"reportHash":"sha256:18c8b94142961d969041a80d8d65e580beabf94416eb511f4e6ffca49f5afa7d","snapshotRoot":"50695c632860eb95","invariantPacks":["pma-safety-core-v0"]}},"stepsPassed":4,"stepsTotal":4,"invariantsPassed":6,"invariantsTotal":6,"alertsTriggered":0,"snapshotsCaptured":5,"adapterObservationCount":0,"invariantPackCount":1},"report":{"reportId":"lab_pma-safety-v0_20260610225855211","fixtureId":"pma-safety-v0","generatedAt":"2026-06-10T22:58:55.211Z","app":{"name":"PMA State Safety Pack","slug":"pma-safety","version":"0.1.0","kernel":"mock-pma-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 PMA/state-jam durability run exercising the pma-safety invariant pack.","A node poke advances the checkpoint height and event-log boundary; a migration poke preserves kernel-state continuity.","Metadata-only: no raw PMA slabs, event-log SQLite, or state jams are 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":"pma-safety-core-v0","name":"PMA State Safety Core","domain":"pma-safety","version":"0.1.0","path":"../packs/pma-safety.invariants.json","upstreamBasis":{"repo":"nockchain/nockchain","commit":"33ba97b1e206dd89b15c61b72b7802caf2136c18","build":"build-33ba97b1e206dd89b15c61b72b7802caf2136c18","protocolTrack":"pma-snapshot-event-log"},"sourceAnchors":[{"id":"pma-source","upstreamRepo":"nockchain/nockchain","upstreamFile":"crates/nockvm/rust/nockvm/src/pma.rs","upstreamUrl":"https://github.com/nockchain/nockchain/blob/33ba97b1e206dd89b15c61b72b7802caf2136c18/crates/nockvm/rust/nockvm/src/pma.rs","docTier":"tier-1-scoped","note":"PMA trailer metadata and growth/migration journal recovery underpin the checkpoint-height floor and kernel-state continuity asserted here."},{"id":"event-log-replay","upstreamRepo":"nockchain/nockchain","upstreamFile":"crates/nockapp/src/event_log.rs","upstreamUrl":"https://github.com/nockchain/nockchain/blob/33ba97b1e206dd89b15c61b72b7802caf2136c18/crates/nockapp/src/event_log.rs","docTier":"tier-1-scoped","note":"Event-log replay boundary must not regress; this pack asserts a monotonic event-log boundary floor."}]}],"steps":[{"id":"boot-fakenet","type":"fakenet","title":"Boot mock PMA 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":"a97790ec4546edfe","afterHash":"a97790ec4546edfe","stateDiffs":[],"durationMs":19},{"id":"node-advances-checkpoint","type":"poke","title":"Node advances the checkpoint and event-log boundary","status":"pass","actor":"node","target":"/pma/checkpoint","expectation":"pma.checkpointHeight == 105","observed":"105","beforeHash":"a97790ec4546edfe","afterHash":"50695c632860eb95","stateDiffs":[{"path":"pma.checkpointHeight","before":"100","after":"105"},{"path":"pma.eventLogBoundary","before":"4200","after":"4230"}],"durationMs":26},{"id":"migration-preserves-continuity","type":"poke","title":"Migration preserves kernel-state continuity","status":"pass","actor":"migration","target":"/pma/migrate","expectation":"pma.kernelStateContinuous == true","observed":"true","beforeHash":"50695c632860eb95","afterHash":"50695c632860eb95","stateDiffs":[],"durationMs":33},{"id":"peek-pma-continuity","type":"peek","title":"Read kernel-state continuity","status":"pass","target":"/pma","expectation":"pma.kernelStateContinuous == true","observed":"true","beforeHash":"50695c632860eb95","afterHash":"50695c632860eb95","stateDiffs":[],"durationMs":40}],"invariants":[{"id":"pma-checkpoint-height-floor","title":"PMA checkpoint height does not regress below its floor","severity":"critical","status":"pass","observed":"105","expected":"pma.checkpointHeight >= 100"},{"id":"pma-event-boundary-floor","title":"Event-log replay boundary does not regress below its floor","severity":"high","status":"pass","observed":"4230","expected":"pma.eventLogBoundary >= 4200"},{"id":"pma-kernel-state-continuous","title":"Kernel state remains continuous across the snapshot boundary","severity":"critical","status":"pass","observed":"true","expected":"pma.kernelStateContinuous == true"},{"id":"pma-network-context","title":"PMA evidence records the fakenet network context","severity":"medium","status":"pass","observed":"fakenet","expected":"pma.network == fakenet"},{"id":"pma-authorized-writer","title":"PMA-advancing pokes are performed by authorized writers","severity":"high","status":"pass","observed":"2/2 poke actors authorized","expected":"actors in [node, migration]"},{"id":"pma-no-failure-alert","title":"PMA failure alert remains clear","severity":"critical","status":"pass","observed":"false","expected":"alerts.failed == false"}],"alerts":[],"adapterObservations":[],"stateSnapshots":[{"label":"Initial state","stateHash":"a97790ec4546edfe","state":{"pma":{"checkpointHeight":100,"eventLogBoundary":4200,"kernelStateContinuous":true,"network":"fakenet"},"alerts":{"failed":false}}},{"label":"After boot-fakenet","stateHash":"a97790ec4546edfe","state":{"pma":{"checkpointHeight":100,"eventLogBoundary":4200,"kernelStateContinuous":true,"network":"fakenet"},"alerts":{"failed":false}},"stepId":"boot-fakenet"},{"label":"After node-advances-checkpoint","stateHash":"50695c632860eb95","state":{"pma":{"checkpointHeight":105,"eventLogBoundary":4230,"kernelStateContinuous":true,"network":"fakenet"},"alerts":{"failed":false}},"stepId":"node-advances-checkpoint"},{"label":"After migration-preserves-continuity","stateHash":"50695c632860eb95","state":{"pma":{"checkpointHeight":105,"eventLogBoundary":4230,"kernelStateContinuous":true,"network":"fakenet"},"alerts":{"failed":false}},"stepId":"migration-preserves-continuity"},{"label":"After peek-pma-continuity","stateHash":"50695c632860eb95","state":{"pma":{"checkpointHeight":105,"eventLogBoundary":4230,"kernelStateContinuous":true,"network":"fakenet"},"alerts":{"failed":false}},"stepId":"peek-pma-continuity"}],"stateDiffs":[{"path":"pma.checkpointHeight","before":"100","after":"105"},{"path":"pma.eventLogBoundary","before":"4200","after":"4230"}],"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":"# ✅ PMA State Safety Pack Lab Report\n\n> **PASS** — 4/4 steps · 6/6 invariants · 0 alerts · 68ms\n\n| Field | Value |\n| --- | --- |\n| Report | `lab_pma-safety-v0_20260610225855211` |\n| Fixture | `pma-safety-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)_; a97790ec4546edfe -> a97790ec4546edfe\n- ✅ `node-advances-checkpoint` — 105 _(pma.checkpointHeight == 105)_; a97790ec4546edfe -> 50695c632860eb95\n  - pma.checkpointHeight: 100 -> 105\n  - pma.eventLogBoundary: 4200 -> 4230\n- ✅ `migration-preserves-continuity` — true _(pma.kernelStateContinuous == true)_; 50695c632860eb95 -> 50695c632860eb95\n- ✅ `peek-pma-continuity` — true _(pma.kernelStateContinuous == true)_; 50695c632860eb95 -> 50695c632860eb95\n\n## Invariants\n\n- ✅ `pma-checkpoint-height-floor` — 105 _(expected pma.checkpointHeight >= 100)_\n- ✅ `pma-event-boundary-floor` — 4230 _(expected pma.eventLogBoundary >= 4200)_\n- ✅ `pma-kernel-state-continuous` — true _(expected pma.kernelStateContinuous == true)_\n- ✅ `pma-network-context` — fakenet _(expected pma.network == fakenet)_\n- ✅ `pma-authorized-writer` — 2/2 poke actors authorized _(expected actors in [node, migration])_\n- ✅ `pma-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- pma.checkpointHeight: 100 -> 105\n- pma.eventLogBoundary: 4200 -> 4230\n\n## Snapshot Timeline\n\n- Initial state: a97790ec4546edfe\n- After boot-fakenet: a97790ec4546edfe\n- After node-advances-checkpoint: 50695c632860eb95\n- After migration-preserves-continuity: 50695c632860eb95\n- After peek-pma-continuity: 50695c632860eb95\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":["pma-safety-core-v0"],"invariantPackDomains":["pma-safety"],"firstInvariantPackPath":"../packs/pma-safety.invariants.json","changedPaths":["pma.checkpointHeight","pma.eventLogBoundary"],"markdownPreview":"# ✅ PMA State Safety Pack Lab Report"}}