{"reportId":"lab_hello_counter_001","fixtureId":"hello-counter-v0","generatedAt":"2026-05-30T00:00:00.000Z","app":{"name":"Hello Counter","slug":"hello-counter","version":"0.0.1","kernel":"hoon-counter-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":["Modeled after the official local fakenet flow.","This report is mock-backed until the adapter can call a live node."]},"summary":{"status":"pass","stepsPassed":4,"stepsFailed":0,"invariantsPassed":4,"invariantsFailed":0,"alertsClear":0,"alertsTriggered":0,"snapshotsCaptured":5,"durationMs":128},"invariantPacks":[],"steps":[{"id":"boot-fakenet","type":"fakenet","title":"Boot mock fakenet profile","status":"pass","expectation":"gRPC endpoint configured at 127.0.0.1:5555","observed":"Mock endpoint accepted for deterministic run","beforeHash":"7f278f7d37bf2b99","afterHash":"7f278f7d37bf2b99","stateDiffs":[],"durationMs":24},{"id":"poke-increment-alice","type":"poke","title":"Alice increments counter","status":"pass","actor":"alice","target":"/counter","expectation":"counter moves from 0 to 1","observed":"counter=1","beforeHash":"7f278f7d37bf2b99","afterHash":"3e0e6d4db4892e2d","stateDiffs":[{"path":"counter","before":"0","after":"1"}],"durationMs":31},{"id":"poke-increment-bob","type":"poke","title":"Bob increments counter","status":"pass","actor":"bob","target":"/counter","expectation":"counter moves from 1 to 2","observed":"counter=2","beforeHash":"3e0e6d4db4892e2d","afterHash":"937aeb078db9aa10","stateDiffs":[{"path":"counter","before":"1","after":"2"},{"path":"balances.alice","before":"1000","after":"700"},{"path":"balances.bob","before":"0","after":"300"}],"durationMs":29},{"id":"peek-counter","type":"peek","title":"Read counter value","status":"pass","target":"/counter","expectation":"peek returns 2","observed":"2","beforeHash":"937aeb078db9aa10","afterHash":"937aeb078db9aa10","stateDiffs":[],"durationMs":44}],"invariants":[{"id":"counter-non-negative","title":"Counter is never negative","severity":"critical","status":"pass","observed":"2","expected":">= 0"},{"id":"counter-final-value","title":"Counter final value matches fixture","severity":"medium","status":"pass","observed":"2","expected":"2"},{"id":"poke-actors-declared","title":"Every poke has a declared actor","severity":"high","status":"pass","observed":"2/2 poke steps declared actors","expected":"all poke steps declare actors"},{"id":"supply-conserved","title":"NOCK-denominated balances conserve supply","severity":"critical","status":"pass","observed":"alice=700, bob=300, total=1000","expected":"totalSupply=1000"}],"alerts":[],"adapterObservations":[],"stateSnapshots":[{"label":"Initial state","stateHash":"7f278f7d37bf2b99","state":{"counter":0,"totalSupply":1000,"balances":{"alice":1000,"bob":0}}},{"label":"After boot-fakenet","stepId":"boot-fakenet","stateHash":"7f278f7d37bf2b99","state":{"counter":0,"totalSupply":1000,"balances":{"alice":1000,"bob":0}}},{"label":"After poke-increment-alice","stepId":"poke-increment-alice","stateHash":"3e0e6d4db4892e2d","state":{"counter":1,"totalSupply":1000,"balances":{"alice":1000,"bob":0}}},{"label":"After poke-increment-bob","stepId":"poke-increment-bob","stateHash":"937aeb078db9aa10","state":{"counter":2,"totalSupply":1000,"balances":{"alice":700,"bob":300}}},{"label":"After peek-counter","stepId":"peek-counter","stateHash":"937aeb078db9aa10","state":{"counter":2,"totalSupply":1000,"balances":{"alice":700,"bob":300}}}],"stateDiffs":[{"path":"counter","before":"0","after":"2"},{"path":"balances.bob","before":"0","after":"300"}],"nextActions":["Replace mock step execution with a local fakenet gRPC adapter.","Persist generated reports under a project workspace.","Add per-app invariant packs for payment, intent, bridge, and token workflows."]}