diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 67d1454d..3375a7c9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -39,6 +39,9 @@ jobs: "tests/RootfieldRegistry.t.sol" "contracts" "services" + "services/flowmemory" + "schemas/flowmemory" + "fixtures/launch-core" "apps" "hardware" "research" @@ -83,3 +86,156 @@ jobs: exit 1 fi done + + contracts: + name: Contracts + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + + - name: Run Foundry tests + run: forge test + + services: + name: Services and launch core + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: "24" + cache: npm + + - name: Install services dependencies + run: npm ci + + - name: Run service tests + run: npm test + + - name: Run service e2e + run: npm run e2e + + launch-core: + name: Launch-core acceptance command + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: "24" + cache: npm + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install services dependencies + run: npm ci + + - name: Run launch V0 command + run: npm run launch:v0 + + crypto: + name: Crypto + runs-on: ubuntu-latest + defaults: + run: + working-directory: crypto + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: "24" + cache: npm + cache-dependency-path: crypto/package-lock.json + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install crypto dependencies + run: npm ci + + - name: Install Python crypto dependencies + run: python -m pip install pycryptodome + + - name: Run crypto tests + run: npm test + + - name: Validate crypto vectors + run: npm run validate:vectors + + - name: Recompute Python FlowPulse vector + run: python validate_test_vectors.py + + dashboard: + name: Dashboard + runs-on: ubuntu-latest + defaults: + run: + working-directory: apps/dashboard + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Node + uses: actions/setup-node@v4 + with: + node-version: "24" + cache: npm + cache-dependency-path: apps/dashboard/package-lock.json + + - name: Install dashboard dependencies + run: npm ci + + - name: Run dashboard tests + run: npm test + + - name: Build dashboard + run: npm run build + + devnet: + name: Local devnet + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + + - name: Run devnet tests + run: cargo test --manifest-path crates/flowmemory-devnet/Cargo.toml + + hardware: + name: Hardware POC + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Validate FlowRouter simulator fixture + run: python hardware/simulator/flowrouter_sim.py --validate-file hardware/fixtures/flowrouter_sample_seed42.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..3473d28e --- /dev/null +++ b/.gitignore @@ -0,0 +1,11 @@ +node_modules/ +dist/ +cache/ +out/ + +devnet/local/ +crates/flowmemory-devnet/target/ + +apps/dashboard/node_modules/ +apps/dashboard/dist/ +crypto/node_modules/ diff --git a/README.md b/README.md index 03695e9c..7115efb0 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,14 @@ FlowMemory is managed as a multi-agent program. The management layer is part of Immediate major milestone: build the Rootflow V0 and Flow Memory V0 launch core. This means local contracts/tests, FlowPulse fixtures, Rootflow transitions, Flow Memory schemas, verifier reports, crypto fixtures, dashboard-readable state, and local smoke-test gates. It does not mean production deployment. +Run the local launch-core path: + +```powershell +npm run launch:v0 +``` + +This regenerates local/test Rootflow and Flow Memory V0 fixtures, including `fixtures/launch-core/flowmemory-launch-v0.json`, `fixtures/launch-core/rootflow-transitions.json`, and the dashboard fixture at `fixtures/dashboard/flowmemory-dashboard-v0.json`. + ## What Not To Claim - Do not claim FlowMemory has production contracts or deployment automation. diff --git a/apps/dashboard/README.md b/apps/dashboard/README.md index d0b3daf7..e4c03200 100644 --- a/apps/dashboard/README.md +++ b/apps/dashboard/README.md @@ -27,7 +27,7 @@ npm run build ## Data Boundary -The canonical dashboard fixture lives at: +The canonical dashboard fixture is generated by the launch-core command and lives at: ```text fixtures/dashboard/flowmemory-dashboard-v0.json @@ -41,7 +41,7 @@ apps/dashboard/public/data/flowmemory-dashboard-v0.json The `dev` and `build` scripts run `npm run sync:fixtures`, which copies the canonical fixture into the Vite public data folder before the app starts or builds. -Future generated local outputs should land under the fixture boundary first: +Generated local source outputs land under the fixture boundary first: ```text fixtures/dashboard/generated/indexer-state.json @@ -50,11 +50,12 @@ fixtures/dashboard/generated/devnet-state.json fixtures/dashboard/generated/hardware-heartbeats.json ``` -The dashboard schema can then be updated to merge those generated files into `flowmemory-dashboard-v0.json` or replace the loader with a local API once that boundary exists. +`npm run launch:v0` from the repo root regenerates `flowmemory-dashboard-v0.json` from services, devnet, and hardware fixture outputs. ## Current Views - Overview +- Flow Memory / Rootflow - FlowPulse stream - Rootfields - Work lanes and receipts @@ -71,7 +72,7 @@ Every displayed record carries source subsystem, fixture/local origin, chain con Dashboard V0 visually distinguishes: ```text -observed, pending, finalized, verified, unresolved, invalid, unsupported, reorged, offline, stale +observed, pending, finalized, verified, unresolved, failed, unsupported, reorged, offline, stale ``` These are app-facing display states for local fixture inspection. They should stay aligned with indexer and verifier terminology as those packages mature. diff --git a/apps/dashboard/public/data/flowmemory-dashboard-v0.json b/apps/dashboard/public/data/flowmemory-dashboard-v0.json index dcd99f4b..f84df74f 100644 --- a/apps/dashboard/public/data/flowmemory-dashboard-v0.json +++ b/apps/dashboard/public/data/flowmemory-dashboard-v0.json @@ -1,32 +1,32 @@ { "metadata": { "schema": "flowmemory.dashboard.fixture.v0", - "generatedAt": "2026-05-13T16:00:00.000Z", + "generatedAt": "2026-05-13T17:02:00.000Z", "mode": "fixture", - "description": "Synthetic local FlowMemory Dashboard V0 fixture. Values are operator/explorer test vectors only and do not claim live production data.", + "description": "Generated local FlowMemory Dashboard V0 fixture from services, local devnet, and hardware POC outputs. It does not claim live production data.", "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", "runtimeDataPath": "apps/dashboard/public/data/flowmemory-dashboard-v0.json", "futureGeneratedPaths": { - "indexer": "fixtures/dashboard/generated/indexer-state.json", - "verifier": "fixtures/dashboard/generated/verifier-reports.json", - "devnet": "fixtures/dashboard/generated/devnet-state.json", - "hardware": "fixtures/dashboard/generated/hardware-heartbeats.json" + "indexer": "services/indexer/out/indexer-state.json", + "verifier": "services/verifier/out/reports.json", + "devnet": "fixtures/launch-core/generated/devnet/state.json", + "hardware": "hardware/fixtures/flowrouter_sample_seed42.json" } }, "chain": { - "chainId": "31337", - "name": "Anvil local FlowMemory devnet", + "chainId": "8453", + "name": "FlowMemory local V0 fixture stack", "environment": "local-devnet", - "settlementContext": "Base-first project path; this fixture is not Base mainnet or Base Sepolia data.", - "currentBlock": 123482, - "finalizedBlock": 123450, + "settlementContext": "Base-native fixture observations plus no-value local devnet handoff; not Base mainnet production data.", + "currentBlock": 123461, + "finalizedBlock": 123457, "source": "fixture", - "lastUpdated": "2026-05-13T15:58:42.000Z" + "lastUpdated": "2026-05-13T17:02:00.000Z" }, "flowPulseObservations": [ { - "id": "0x9717b7bad57bd0fa089e672e75cede4ae0bf3c86321dc0525ba00e9e0cc2da91", - "observationId": "0x9717b7bad57bd0fa089e672e75cede4ae0bf3c86321dc0525ba00e9e0cc2da91", + "id": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", @@ -42,760 +42,1602 @@ "commitment": "0x4122209ff672fc04b2ec3af31ab1af79813971f86de000aa6534038cc79de6b5", "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", "sequence": "1", - "occurredAt": "2026-05-13T14:30:00.000Z", + "occurredAt": "2026-05-13T02:40:00.000Z", "uri": "ipfs://bafy-flowmemory-example", - "summary": "Rootfield registration observed from fixture receipt log.", + "summary": "rootfield registration from generated indexer output", "status": "finalized", - "lastUpdated": "2026-05-13T15:51:00.000Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:51:00.000Z", - "localPathHint": "services/indexer/fixtures/flowpulse-logs.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" } }, { - "id": "0x2ad24d8e9df0a17f1f6a6427c1ea3b401dc2f16d9a5bb64c3c96206cb3f5e712", - "observationId": "0x2ad24d8e9df0a17f1f6a6427c1ea3b401dc2f16d9a5bb64c3c96206cb3f5e712", - "pulseId": "0xa3f9000000000000000000000000000000000000000000000000000000000112", + "id": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab001", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", - "blockNumber": "123468", - "blockHash": "0x2468246824682468246824682468246824682468246824682468246824682468", - "txHash": "0x5301530153015301530153015301530153015301530153015301530153015301", - "transactionIndex": "3", - "logIndex": "0", + "blockNumber": "123457", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222223", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333334", + "transactionIndex": "8", + "logIndex": "3", "receiptStatus": "success", - "actor": "0x5555555555555555555555555555555555555555", + "actor": "0x4444444444444444444444444444444444444444", "pulseType": "2", - "subject": "0x6f6d65706174682d726f6f742d303030303030303030303030303030303031", - "commitment": "0x81d30d3de2b29b44f23745289dbf214026ed1789983ff7aac135d74531402031", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "sequence": "2", - "occurredAt": "2026-05-13T14:42:25.000Z", - "uri": "file://fixtures/rootfields/omega-path/root-0001.json", - "summary": "Root commitment finalized after local block threshold.", + "occurredAt": "2026-05-13T02:41:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment from generated indexer output", "status": "finalized", - "lastUpdated": "2026-05-13T15:53:12.000Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:53:12.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" } }, { - "id": "0x82a7c8ef9931b361451efc99d932f615e251b3320ac395545971fe2e64fd14ca", - "observationId": "0x82a7c8ef9931b361451efc99d932f615e251b3320ac395545971fe2e64fd14ca", - "pulseId": "0xa3f9000000000000000000000000000000000000000000000000000000000113", + "id": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", - "blockNumber": "123481", - "blockHash": "0x9595959595959595959595959595959595959595959595959595959595959595", - "txHash": "0x6060606060606060606060606060606060606060606060606060606060606060", - "transactionIndex": "1", - "logIndex": "1", + "blockNumber": "123456", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222222", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "transactionIndex": "7", + "logIndex": "2", "receiptStatus": "success", - "actor": "0x5555555555555555555555555555555555555555", - "pulseType": "2", - "subject": "0x6f6d65706174682d726f6f742d303030303030303030303030303030303032", - "commitment": "0x61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff", - "parentPulseId": "0xa3f9000000000000000000000000000000000000000000000000000000000112", - "sequence": "3", - "occurredAt": "2026-05-13T15:55:28.000Z", - "uri": "file://fixtures/rootfields/omega-path/root-0002.json", - "summary": "Recent root commitment observed below finality threshold.", - "status": "observed", - "lastUpdated": "2026-05-13T15:56:02.000Z", + "actor": "0x4444444444444444444444444444444444444444", + "pulseType": "1", + "subject": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "commitment": "0x4122209ff672fc04b2ec3af31ab1af79813971f86de000aa6534038cc79de6b5", + "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sequence": "1", + "occurredAt": "2026-05-13T02:40:00.000Z", + "uri": "ipfs://bafy-flowmemory-example", + "summary": "rootfield registration from generated indexer output", + "status": "finalized", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:56:02.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" } }, { - "id": "0x7d7c7b7a797877767574737271706f6e6d6c6b6a696867666564636261605f5e", - "observationId": "0x7d7c7b7a797877767574737271706f6e6d6c6b6a696867666564636261605f5e", - "pulseId": "0xc0ffee0000000000000000000000000000000000000000000000000000000417", - "rootfieldId": "0xdededededededededededededededededededededededededededededededede", + "id": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab002", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", - "blockNumber": "123449", - "blockHash": "0x1717171717171717171717171717171717171717171717171717171717171717", - "txHash": "0x1818181818181818181818181818181818181818181818181818181818181818", + "blockNumber": "123458", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222224", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333335", "transactionIndex": "9", - "logIndex": "3", + "logIndex": "4", "receiptStatus": "success", - "actor": "0x9999999999999999999999999999999999999999", - "pulseType": "9", - "subject": "0xdededededededededededededededededededededededededededededededede", - "commitment": "0x9090909090909090909090909090909090909090909090909090909090909090", - "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", - "sequence": "1", - "occurredAt": "2026-05-13T13:12:14.000Z", - "uri": "file://fixtures/rootfields/unsupported-pulse.json", - "summary": "Unsupported pulse type preserved for verifier policy review.", - "status": "unsupported", - "lastUpdated": "2026-05-13T15:18:00.000Z", + "actor": "0x4444444444444444444444444444444444444444", + "pulseType": "2", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "2", + "occurredAt": "2026-05-13T02:41:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment from generated indexer output", + "status": "reorged", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:18:00.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" } }, { - "id": "0xabababababababababababababababababababababababababababababababab", - "observationId": "0xabababababababababababababababababababababababababababababababab", - "pulseId": "0xa3f90000000000000000000000000000000000000000000000000000000000ff", + "id": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab003", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", - "blockNumber": "123438", - "blockHash": "0xffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000", - "txHash": "0x4242424242424242424242424242424242424242424242424242424242424242", - "transactionIndex": "2", - "logIndex": "4", + "blockNumber": "123459", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222225", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333336", + "transactionIndex": "10", + "logIndex": "5", "receiptStatus": "success", - "actor": "0x5555555555555555555555555555555555555555", + "actor": "0x4444444444444444444444444444444444444444", "pulseType": "2", - "subject": "0x72656f72672d726f6f742d3030303030303030303030303030303030303030", - "commitment": "0xe5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "sequence": "2", - "occurredAt": "2026-05-13T12:07:44.000Z", - "uri": "file://fixtures/rootfields/omega-path/reorged-root.json", - "summary": "Observation retained as noncanonical after local reorg fixture.", - "status": "reorged", - "lastUpdated": "2026-05-13T12:31:10.000Z", + "sequence": "3", + "occurredAt": "2026-05-13T02:42:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment from generated indexer output", + "status": "pending", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T12:31:10.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" } }, { - "id": "0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210", - "observationId": "0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210", - "pulseId": "0x1212121212121212121212121212121212121212121212121212121212121212", - "rootfieldId": "0x3434343434343434343434343434343434343434343434343434343434343434", + "id": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab004", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", - "blockNumber": "123482", - "blockHash": "0xa1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1", - "txHash": "0xb1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", - "transactionIndex": "0", - "logIndex": "0", - "receiptStatus": "unknown", - "actor": "0x7777777777777777777777777777777777777777", + "blockNumber": "123460", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222226", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333337", + "transactionIndex": "11", + "logIndex": "6", + "receiptStatus": "success", + "actor": "0x4444444444444444444444444444444444444444", "pulseType": "2", - "subject": "0x70656e64696e672d726f6f742d3030303030303030303030303030303030", - "commitment": "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd", - "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", - "sequence": "0", - "occurredAt": "2026-05-13T15:58:20.000Z", - "uri": "file://fixtures/rootfields/pending-root.json", - "summary": "Pending candidate from local scan window before receipt finality.", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "4", + "occurredAt": "2026-05-13T02:43:00.000Z", + "uri": "fixture://missing-artifact", + "summary": "root commitment from generated indexer output", + "status": "pending", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" + } + }, + { + "id": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab005", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", + "blockNumber": "123461", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222227", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333338", + "transactionIndex": "12", + "logIndex": "7", + "receiptStatus": "success", + "actor": "0x4444444444444444444444444444444444444444", + "pulseType": "99", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "5", + "occurredAt": "2026-05-13T02:44:00.000Z", + "uri": "fixture://unsupported", + "summary": "unsupported pulse from generated indexer output", "status": "pending", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" } } ], "rootfields": [ { - "id": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "id": "0x31cf738173ed06b94ab86b99f2337c348040e50086a2d2f1f83ff9b0960fdbe6", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "owner": "0x4444444444444444444444444444444444444444", - "schemaHash": "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", - "metadataHash": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", - "latestRoot": "0x6f6d65706174682d726f6f742d303030303030303030303030303030303032", - "latestObservationId": "0x82a7c8ef9931b361451efc99d932f615e251b3320ac395545971fe2e64fd14ca", - "pulseCount": 4, - "workLaneIds": ["lane-indexer-a", "lane-verifier-a"], - "evidenceUri": "file://fixtures/rootfields/omega-path/", - "status": "finalized", - "lastUpdated": "2026-05-13T15:56:02.000Z", + "schemaHash": "0x4c9929a2e216b475bd5bb68ac234d74d70ceadfbb86a948a62535413118371a8", + "metadataHash": "0x32ae92d97373a790718b78a4bd0900e33c763de3c2cb43670f5d9b8a7ae7c8d1", + "latestRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "latestObservationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "pulseCount": 7, + "workLaneIds": [ + "MEMORY_REFRESH", + "FAILURE_DISCOVERY", + "FAILURE_REPAIR", + "EVAL_COUNTEREXAMPLE" + ], + "evidenceUri": "fixture://launch-core/rootfield-bundle", + "status": "observed", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "contracts", + "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:56:02.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } - }, + } + ], + "workLanes": [ { - "id": "0xdededededededededededededededededededededededededededededededede", - "rootfieldId": "0xdededededededededededededededededededededededededededededededede", - "owner": "0x9999999999999999999999999999999999999999", - "schemaHash": "0x1919191919191919191919191919191919191919191919191919191919191919", - "metadataHash": "0x2929292929292929292929292929292929292929292929292929292929292929", - "latestRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "latestObservationId": "0x7d7c7b7a797877767574737271706f6e6d6c6b6a696867666564636261605f5e", - "pulseCount": 1, - "workLaneIds": ["lane-verifier-b"], - "evidenceUri": "file://fixtures/rootfields/unsupported/", - "status": "stale", - "lastUpdated": "2026-05-13T15:18:00.000Z", + "id": "MEMORY_REFRESH", + "laneId": "MEMORY_REFRESH", + "name": "Memory refresh", + "queueDepth": 1, + "inflight": 0, + "completed24h": 3, + "p95LatencyMs": 640, + "operator": "fixture-worker", + "status": "pending", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "contracts", + "subsystem": "worker", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:18:00.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } }, { - "id": "0x3434343434343434343434343434343434343434343434343434343434343434", - "rootfieldId": "0x3434343434343434343434343434343434343434343434343434343434343434", - "owner": "0x7777777777777777777777777777777777777777", - "schemaHash": "0x3838383838383838383838383838383838383838383838383838383838383838", - "metadataHash": "0x3939393939393939393939393939393939393939393939393939393939393939", - "latestRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "latestObservationId": "0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210", - "pulseCount": 0, - "workLaneIds": ["lane-indexer-a"], - "evidenceUri": "file://fixtures/rootfields/pending-root.json", - "status": "pending", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "id": "FAILURE_REPAIR", + "laneId": "FAILURE_REPAIR", + "name": "Failure repair", + "queueDepth": 1, + "inflight": 0, + "completed24h": 0, + "p95LatencyMs": 920, + "operator": "fixture-worker", + "status": "failed", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "contracts", + "subsystem": "worker", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } } ], - "workLanes": [ + "workReceipts": [ { - "id": "lane-indexer-a", - "laneId": "lane-indexer-a", - "name": "Indexer receipt ingest", - "queueDepth": 3, - "inflight": 1, - "completed24h": 37, - "p95LatencyMs": 840, - "operator": "local-codex-fixture", - "status": "pending", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "id": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "receiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "laneId": "MEMORY_REFRESH", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "ipfs://bafy-flowmemory-example", + "startedAt": "2026-05-13T17:02:00.000Z", + "completedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "worker", + "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "lane-verifier-a", - "laneId": "lane-verifier-a", - "name": "Verifier policy v0", - "queueDepth": 1, - "inflight": 1, - "completed24h": 22, - "p95LatencyMs": 1280, - "operator": "local-codex-fixture", - "status": "observed", - "lastUpdated": "2026-05-13T15:56:37.000Z", + "id": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "receiptId": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "laneId": "MEMORY_REFRESH", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "reportId": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "fixture://root-commit-valid", + "startedAt": "2026-05-13T17:02:00.000Z", + "completedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "worker", + "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:56:37.000Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "lane-verifier-b", - "laneId": "lane-verifier-b", - "name": "Unsupported pulse review", - "queueDepth": 0, - "inflight": 0, - "completed24h": 4, - "p95LatencyMs": 2120, - "operator": "local-codex-fixture", - "status": "stale", - "lastUpdated": "2026-05-13T15:19:05.000Z", + "id": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "receiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "laneId": "MEMORY_REFRESH", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "ipfs://bafy-flowmemory-example", + "startedAt": "2026-05-13T17:02:00.000Z", + "completedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "worker", + "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:19:05.000Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } - } - ], - "workReceipts": [ + }, { - "id": "0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f", - "receiptId": "0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f", - "laneId": "lane-verifier-a", - "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "observationId": "0x2ad24d8e9df0a17f1f6a6427c1ea3b401dc2f16d9a5bb64c3c96206cb3f5e712", - "reportId": "0x8080808080808080808080808080808080808080808080808080808080808080", - "workType": "verify-root-commitment", - "artifactUri": "file://fixtures/rootfields/omega-path/root-0001.json", - "startedAt": "2026-05-13T14:43:00.000Z", - "completedAt": "2026-05-13T14:43:01.120Z", - "resultHash": "0x7100710071007100710071007100710071007100710071007100710071007100", - "status": "verified", - "lastUpdated": "2026-05-13T14:43:01.120Z", + "id": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "receiptId": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "laneId": "MEMORY_REFRESH", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "reportId": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "fixture://missing-artifact", + "startedAt": "2026-05-13T17:02:00.000Z", + "completedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "status": "reorged", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "worker", + "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T14:43:01.120Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "0x0101010101010101010101010101010101010101010101010101010101010101", - "receiptId": "0x0101010101010101010101010101010101010101010101010101010101010101", - "laneId": "lane-indexer-a", - "rootfieldId": "0x3434343434343434343434343434343434343434343434343434343434343434", - "observationId": "0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210", - "workType": "scan-receipt-window", - "artifactUri": "file://fixtures/devnet/block-123482.json", - "startedAt": "2026-05-13T15:58:20.000Z", - "resultHash": "0x1111110000001111110000001111110000001111110000001111110000001111", - "status": "pending", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "id": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "receiptId": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "laneId": "FAILURE_REPAIR", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "reportId": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "fixture://root-commit-valid", + "startedAt": "2026-05-13T17:02:00.000Z", + "completedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "status": "failed", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "worker", + "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "0x5656565656565656565656565656565656565656565656565656565656565656", - "receiptId": "0x5656565656565656565656565656565656565656565656565656565656565656", - "laneId": "lane-verifier-a", + "id": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "receiptId": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "laneId": "MEMORY_REFRESH", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "observationId": "0x82a7c8ef9931b361451efc99d932f615e251b3320ac395545971fe2e64fd14ca", - "reportId": "0x5959595959595959595959595959595959595959595959595959595959595959", - "workType": "verify-root-commitment", - "artifactUri": "file://fixtures/rootfields/omega-path/root-0002.json", - "startedAt": "2026-05-13T15:56:04.000Z", - "completedAt": "2026-05-13T15:56:04.640Z", - "resultHash": "0x6161616161616161616161616161616161616161616161616161616161616161", - "status": "invalid", - "lastUpdated": "2026-05-13T15:56:04.640Z", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "reportId": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "fixture://missing-artifact", + "startedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "status": "unresolved", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "worker", + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + }, + { + "id": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "receiptId": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "laneId": "MEMORY_REFRESH", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "reportId": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "fixture://missing-artifact", + "startedAt": "2026-05-13T17:02:00.000Z", + "completedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "status": "unsupported", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:56:04.640Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } } ], "verifierReports": [ { - "id": "0xe0ac708c933782ef6797b3ab4b6550cdd1a993fb1170361e5e05641ab801e66e", - "reportId": "0xe0ac708c933782ef6797b3ab4b6550cdd1a993fb1170361e5e05641ab801e66e", - "observationId": "0x9717b7bad57bd0fa089e672e75cede4ae0bf3c86321dc0525ba00e9e0cc2da91", + "id": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", "checksPassed": 3, "checksTotal": 3, "reasonCodes": [], - "reportHash": "0xe0ac708c933782ef6797b3ab4b6550cdd1a993fb1170361e5e05641ab801e66e", + "reportHash": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", "status": "verified", - "lastUpdated": "2026-05-13T15:51:31.000Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:51:31.000Z", - "localPathHint": "services/verifier/fixtures/artifacts.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "0x8080808080808080808080808080808080808080808080808080808080808080", - "reportId": "0x8080808080808080808080808080808080808080808080808080808080808080", - "observationId": "0x2ad24d8e9df0a17f1f6a6427c1ea3b401dc2f16d9a5bb64c3c96206cb3f5e712", + "id": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "reportId": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", - "checksPassed": 4, - "checksTotal": 4, + "checksPassed": 3, + "checksTotal": 3, "reasonCodes": [], - "reportHash": "0x8080808080808080808080808080808080808080808080808080808080808080", + "reportHash": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", "status": "verified", - "lastUpdated": "2026-05-13T14:43:01.120Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T14:43:01.120Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "0x5959595959595959595959595959595959595959595959595959595959595959", - "reportId": "0x5959595959595959595959595959595959595959595959595959595959595959", - "observationId": "0x82a7c8ef9931b361451efc99d932f615e251b3320ac395545971fe2e64fd14ca", + "id": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", "checksPassed": 3, - "checksTotal": 4, - "reasonCodes": ["commitment.mismatch"], - "reportHash": "0x5959595959595959595959595959595959595959595959595959595959595959", - "status": "invalid", - "lastUpdated": "2026-05-13T15:56:04.640Z", + "checksTotal": 3, + "reasonCodes": [], + "reportHash": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:56:04.640Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "0x6464646464646464646464646464646464646464646464646464646464646464", - "reportId": "0x6464646464646464646464646464646464646464646464646464646464646464", - "observationId": "0x7d7c7b7a797877767574737271706f6e6d6c6b6a696867666564636261605f5e", - "rootfieldId": "0xdededededededededededededededededededededededededededededededede", + "id": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "reportId": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", "checksPassed": 1, "checksTotal": 1, - "reasonCodes": ["pulse.type.unsupported"], - "reportHash": "0x6464646464646464646464646464646464646464646464646464646464646464", + "reasonCodes": [ + "observation.reorged" + ], + "reportHash": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "status": "reorged", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + }, + { + "id": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "reportId": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 2, + "checksTotal": 3, + "reasonCodes": [ + "commitment.mismatch" + ], + "reportHash": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "status": "failed", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + }, + { + "id": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "reportId": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 1, + "checksTotal": 1, + "reasonCodes": [ + "artifact.unavailable" + ], + "reportHash": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "status": "unresolved", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + }, + { + "id": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "reportId": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 1, + "checksTotal": 1, + "reasonCodes": [ + "pulse.type.unsupported" + ], + "reportHash": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "status": "unsupported", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + } + ], + "rootflowTransitions": [ + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentTransitionId": null, + "memorySignalId": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "memoryReceiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "previousRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "attemptedRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nextRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "status": "verified", + "blockNumber": "123456", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "sequence": "1", + "reasonCodes": [], + "id": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/rootflow-transitions.json" + } + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x5cdf7f5498350650adc19c62828425723a09bcca6571774992ca2d013fdc1068", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab001", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "memoryReceiptId": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "reportId": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "previousRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "verified", + "blockNumber": "123457", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333334", + "sequence": "2", + "reasonCodes": [], + "id": "0x5cdf7f5498350650adc19c62828425723a09bcca6571774992ca2d013fdc1068", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/rootflow-transitions.json" + } + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0xe1b6f858279961c968cdfba0b85d489767c486289e824cab3d017997064fed89", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab002", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "memoryReceiptId": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "reportId": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "reorged", + "blockNumber": "123458", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333335", + "sequence": "2", + "reasonCodes": [ + "observation.reorged" + ], + "id": "0xe1b6f858279961c968cdfba0b85d489767c486289e824cab3d017997064fed89", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/rootflow-transitions.json" + } + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x35db5f8c36e2bc988c4d60f25a2e60d971256bdfdb79a73c92c0b82a41e5a367", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab003", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "memoryReceiptId": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "reportId": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "failed", + "blockNumber": "123459", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333336", + "sequence": "3", + "reasonCodes": [ + "commitment.mismatch" + ], + "id": "0x35db5f8c36e2bc988c4d60f25a2e60d971256bdfdb79a73c92c0b82a41e5a367", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/rootflow-transitions.json" + } + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x31d44377aa98e7fcaa07110256e1600249c4337c69e6d06c14d36e6aad6a79c4", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab004", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "memoryReceiptId": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "reportId": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "unresolved", + "blockNumber": "123460", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333337", + "sequence": "4", + "reasonCodes": [ + "artifact.unavailable" + ], + "id": "0x31d44377aa98e7fcaa07110256e1600249c4337c69e6d06c14d36e6aad6a79c4", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/rootflow-transitions.json" + } + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab005", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5", + "memoryReceiptId": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "reportId": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "unsupported", + "blockNumber": "123461", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333338", + "sequence": "5", + "reasonCodes": [ + "pulse.type.unsupported" + ], + "id": "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/rootflow-transitions.json" + } + } + ], + "memorySignals": [ + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "rootfield_registration", + "status": "verified", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123456", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222222", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "transactionIndex": "7", + "logIndex": "2", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "commitment": "0x4122209ff672fc04b2ec3af31ab1af79813971f86de000aa6534038cc79de6b5", + "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sequence": "1", + "occurredAt": "2026-05-13T02:40:00.000Z", + "uri": "ipfs://bafy-flowmemory-example", + "summary": "rootfield registration pulse 1", + "id": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "rootfield_registration", + "status": "verified", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123456", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222222", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "transactionIndex": "7", + "logIndex": "2", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "commitment": "0x4122209ff672fc04b2ec3af31ab1af79813971f86de000aa6534038cc79de6b5", + "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sequence": "1", + "occurredAt": "2026-05-13T02:40:00.000Z", + "uri": "ipfs://bafy-flowmemory-example", + "summary": "rootfield registration pulse 1", + "id": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab001", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "root_commitment", + "status": "verified", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123457", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222223", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333334", + "transactionIndex": "8", + "logIndex": "3", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "2", + "occurredAt": "2026-05-13T02:41:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment pulse 2", + "id": "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab002", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "root_commitment", + "status": "reorged", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123458", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222224", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333335", + "transactionIndex": "9", + "logIndex": "4", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "2", + "occurredAt": "2026-05-13T02:41:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment pulse 2", + "id": "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab003", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "root_commitment", + "status": "failed", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123459", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222225", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333336", + "transactionIndex": "10", + "logIndex": "5", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "3", + "occurredAt": "2026-05-13T02:42:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment pulse 3", + "id": "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab004", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "root_commitment", + "status": "unresolved", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123460", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222226", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333337", + "transactionIndex": "11", + "logIndex": "6", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "4", + "occurredAt": "2026-05-13T02:43:00.000Z", + "uri": "fixture://missing-artifact", + "summary": "root commitment pulse 4", + "id": "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab005", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "unsupported_pulse", "status": "unsupported", - "lastUpdated": "2026-05-13T15:18:11.000Z", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123461", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222227", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333338", + "transactionIndex": "12", + "logIndex": "7", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "5", + "occurredAt": "2026-05-13T02:44:00.000Z", + "uri": "fixture://unsupported", + "summary": "unsupported pulse pulse 5", + "id": "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + } + ], + "memoryReceipts": [ + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "reportDigest": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "valid", + "flowMemoryStatus": "verified", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 3, + "checksTotal": 3, + "reasonCodes": [], + "evidenceRefs": [ + { + "kind": "rootfield-registration", + "uri": "ipfs://bafy-flowmemory-example" + } + ], + "id": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:18:11.000Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } }, { - "id": "0x7373737373737373737373737373737373737373737373737373737373737373", - "reportId": "0x7373737373737373737373737373737373737373737373737373737373737373", - "observationId": "0xabababababababababababababababababababababababababababababababab", + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "reportId": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "reportDigest": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "valid", + "flowMemoryStatus": "verified", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 3, + "checksTotal": 3, + "reasonCodes": [], + "evidenceRefs": [ + { + "kind": "root-commitment", + "uri": "fixture://root-commit-valid" + } + ], + "id": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "reportDigest": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "valid", + "flowMemoryStatus": "verified", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 3, + "checksTotal": 3, + "reasonCodes": [], + "evidenceRefs": [ + { + "kind": "rootfield-registration", + "uri": "ipfs://bafy-flowmemory-example" + } + ], + "id": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "reportId": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "reportDigest": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "reorged", + "flowMemoryStatus": "reorged", "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", "checksPassed": 1, "checksTotal": 1, - "reasonCodes": ["observation.reorged"], - "reportHash": "0x7373737373737373737373737373737373737373737373737373737373737373", + "reasonCodes": [ + "observation.reorged" + ], + "evidenceRefs": [], + "id": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", "status": "reorged", - "lastUpdated": "2026-05-13T12:31:15.000Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T12:31:15.000Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } }, { - "id": "0x7474747474747474747474747474747474747474747474747474747474747474", - "reportId": "0x7474747474747474747474747474747474747474747474747474747474747474", - "observationId": "0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210", - "rootfieldId": "0x3434343434343434343434343434343434343434343434343434343434343434", + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "reportId": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "reportDigest": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "invalid", + "flowMemoryStatus": "failed", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 2, + "checksTotal": 3, + "reasonCodes": [ + "commitment.mismatch" + ], + "evidenceRefs": [ + { + "kind": "root-commitment", + "uri": "fixture://root-commit-valid" + } + ], + "id": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "status": "failed", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "reportId": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "reportDigest": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "unresolved", + "flowMemoryStatus": "unresolved", "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", "checksPassed": 1, - "checksTotal": 2, - "reasonCodes": ["artifact.unavailable"], - "reportHash": "0x7474747474747474747474747474747474747474747474747474747474747474", + "checksTotal": 1, + "reasonCodes": [ + "artifact.unavailable" + ], + "evidenceRefs": [], + "id": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", "status": "unresolved", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } }, { - "id": "0x7575757575757575757575757575757575757575757575757575757575757575", - "reportId": "0x7575757575757575757575757575757575757575757575757575757575757575", - "observationId": "0x2ad24d8e9df0a17f1f6a6427c1ea3b401dc2f16d9a5bb64c3c96206cb3f5e712", + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "reportId": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "reportDigest": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "resolverPolicyId": "flowmemory.resolver.policy.v0.previous-fixture", + "verifierStatus": "unsupported", + "flowMemoryStatus": "unsupported", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", - "checksPassed": 2, - "checksTotal": 4, - "reasonCodes": ["report.stale_policy"], - "reportHash": "0x7575757575757575757575757575757575757575757575757575757575757575", - "status": "stale", - "lastUpdated": "2026-05-13T14:12:00.000Z", + "checksPassed": 1, + "checksTotal": 1, + "reasonCodes": [ + "pulse.type.unsupported" + ], + "evidenceRefs": [], + "id": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "status": "unsupported", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T14:12:00.000Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } } ], - "devnetBlocks": [ + "rootfieldBundles": [ { - "id": "0x1717171717171717171717171717171717171717171717171717171717171717", - "blockNumber": 123449, - "blockHash": "0x1717171717171717171717171717171717171717171717171717171717171717", - "parentHash": "0x1616161616161616161616161616161616161616161616161616161616161616", - "stateRoot": "0x5050505050505050505050505050505050505050505050505050505050505050", - "receiptsRoot": "0x5151515151515151515151515151515151515151515151515151515151515151", - "timestamp": "2026-05-13T13:12:14.000Z", - "observationCount": 1, - "reportCount": 1, - "finalityDistance": 33, - "status": "finalized", - "lastUpdated": "2026-05-13T15:45:00.000Z", + "schema": "flowmemory.rootfield_bundle.v0", + "bundleId": "0x31cf738173ed06b94ab86b99f2337c348040e50086a2d2f1f83ff9b0960fdbe6", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "latestRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "latestTransitionId": "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf", + "status": "unsupported", + "transitionIds": [ + "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "0x5cdf7f5498350650adc19c62828425723a09bcca6571774992ca2d013fdc1068", + "0xe1b6f858279961c968cdfba0b85d489767c486289e824cab3d017997064fed89", + "0x35db5f8c36e2bc988c4d60f25a2e60d971256bdfdb79a73c92c0b82a41e5a367", + "0x31d44377aa98e7fcaa07110256e1600249c4337c69e6d06c14d36e6aad6a79c4", + "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf" + ], + "memorySignalIds": [ + "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5" + ], + "memoryReceiptIds": [ + "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b" + ], + "verifierReportIds": [ + "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5" + ], + "counts": { + "observations": 7, + "transitions": 6, + "receipts": 7, + "verified": 2, + "failed": 1, + "unresolved": 1, + "unsupported": 1, + "reorged": 1 + }, + "id": "0x31cf738173ed06b94ab86b99f2337c348040e50086a2d2f1f83ff9b0960fdbe6", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "devnet", + "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:45:00.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } - }, + } + ], + "agentMemoryViews": [ { - "id": "0x2468246824682468246824682468246824682468246824682468246824682468", - "blockNumber": 123468, - "blockHash": "0x2468246824682468246824682468246824682468246824682468246824682468", - "parentHash": "0x2358235823582358235823582358235823582358235823582358235823582358", - "stateRoot": "0x6262626262626262626262626262626262626262626262626262626262626262", - "receiptsRoot": "0x6363636363636363636363636363636363636363636363636363636363636363", - "timestamp": "2026-05-13T14:42:25.000Z", - "observationCount": 1, - "reportCount": 1, - "finalityDistance": 14, - "status": "finalized", - "lastUpdated": "2026-05-13T15:45:00.000Z", + "schema": "flowmemory.agent_memory_view.v0", + "viewId": "0x1e3338d7189316aee886546da7dcb6b92601b573086fbb823f89c852245e4355", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "status": "unsupported", + "latestRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "latestTransitionId": "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf", + "signalIds": [ + "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5" + ], + "receiptIds": [ + "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b" + ], + "transitionIds": [ + "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "0x5cdf7f5498350650adc19c62828425723a09bcca6571774992ca2d013fdc1068", + "0xe1b6f858279961c968cdfba0b85d489767c486289e824cab3d017997064fed89", + "0x35db5f8c36e2bc988c4d60f25a2e60d971256bdfdb79a73c92c0b82a41e5a367", + "0x31d44377aa98e7fcaa07110256e1600249c4337c69e6d06c14d36e6aad6a79c4", + "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf" + ], + "warnings": [ + "1 failed transition(s)", + "1 unresolved receipt(s)", + "1 reorged observation(s)", + "1 unsupported pulse(s)" + ], + "localOnly": true, + "id": "0x1e3338d7189316aee886546da7dcb6b92601b573086fbb823f89c852245e4355", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "devnet", + "subsystem": "worker", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:45:00.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } - }, + } + ], + "devnetBlocks": [ { - "id": "0x9595959595959595959595959595959595959595959595959595959595959595", - "blockNumber": 123481, - "blockHash": "0x9595959595959595959595959595959595959595959595959595959595959595", - "parentHash": "0x9494949494949494949494949494949494949494949494949494949494949494", - "stateRoot": "0x7070707070707070707070707070707070707070707070707070707070707070", - "receiptsRoot": "0x7171717171717171717171717171717171717171717171717171717171717171", - "timestamp": "2026-05-13T15:55:28.000Z", - "observationCount": 1, - "reportCount": 1, - "finalityDistance": 1, - "status": "pending", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "id": "0xf76ac3652230cae4a4b5afcd54b0dcec9219f20ad71e21c497264668fb30f235", + "blockNumber": 1, + "blockHash": "0xf76ac3652230cae4a4b5afcd54b0dcec9219f20ad71e21c497264668fb30f235", + "parentHash": "0x0f23c892cbd2d00c10839d97ddab833698a83f8df8d6df27ceac03cfdd4b7bc9", + "stateRoot": "0x76ec5260c34184b6bb54ca406a43fc1f9591a47f37f71583a7620ef4a4065aff", + "receiptsRoot": "0x6962bd6dbf28c2361c1337c1d33d678a815cc4b961e0e50db5ccb401cc0fe076", + "timestamp": "2026-05-13T16:00:00.000Z", + "observationCount": 7, + "reportCount": 7, + "finalityDistance": 123460, + "status": "stale", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "devnet", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/generated/devnet/state.json" } }, { - "id": "0xffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000", - "blockNumber": 123438, - "blockHash": "0xffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000", - "parentHash": "0x4343434343434343434343434343434343434343434343434343434343434343", - "stateRoot": "0x8888000088880000888800008888000088880000888800008888000088880000", - "receiptsRoot": "0x9999000099990000999900009999000099990000999900009999000099990000", - "timestamp": "2026-05-13T12:07:44.000Z", - "observationCount": 1, - "reportCount": 1, - "finalityDistance": 0, - "status": "reorged", - "lastUpdated": "2026-05-13T12:31:10.000Z", + "id": "0x7515374a9b020a6d271820031738a5190cb0fc374adcd74a88a32c0fd0d5c7a6", + "blockNumber": 2, + "blockHash": "0x7515374a9b020a6d271820031738a5190cb0fc374adcd74a88a32c0fd0d5c7a6", + "parentHash": "0xf76ac3652230cae4a4b5afcd54b0dcec9219f20ad71e21c497264668fb30f235", + "stateRoot": "0x3e1f5fddd84f9d460ee30a380ff700b17611891b8c03eb320edf1baefe003ef9", + "receiptsRoot": "0xa0407b9a8a55106d549e0f19b92fceaa7f7a25697e94ebf8a1fa74af7b9168f4", + "timestamp": "2026-05-13T16:00:01.000Z", + "observationCount": 7, + "reportCount": 7, + "finalityDistance": 123459, + "status": "finalized", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "devnet", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T12:31:10.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/generated/devnet/state.json" } } ], "hardwareNodes": [ { - "id": "fm-node-lab-01", - "nodeId": "fm-node-lab-01", - "callsign": "Lab Gateway 01", - "role": "gateway", - "firmware": "flowrouter-v0.1.0-fixture", - "transport": "ethernet + meshtastic sidecar", - "lastHeartbeatAt": "2026-05-13T15:57:58.000Z", + "id": "fr-e1e7878a2aa8", + "nodeId": "fr-e1e7878a2aa8", + "callsign": "FlowRouter kit", + "role": "router", + "firmware": "flowrouter.poc.v0", + "transport": "local-wifi+meshtastic-sidecar-sim", + "lastHeartbeatAt": "2026-05-13T17:00:10Z", "batteryPercent": 100, - "signalDbm": -51, - "temperatureC": 39, - "linkedWorkLaneId": "lane-indexer-a", - "locationHint": "bench-east", - "status": "observed", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "signalDbm": -61, + "temperatureC": 37, + "linkedWorkLaneId": "CHECKPOINT_STORAGE", + "locationHint": "local lab fixture", + "status": "verified", "provenance": { "subsystem": "hardware", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/hardware-heartbeats.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "hardware/fixtures/flowrouter_sample_seed42.json" } }, { - "id": "fm-node-router-03", - "nodeId": "fm-node-router-03", - "callsign": "Router Shelf 03", - "role": "router", - "firmware": "flowrouter-v0.1.0-fixture", - "transport": "wifi + lora control", - "lastHeartbeatAt": "2026-05-13T15:11:08.000Z", - "batteryPercent": 72, - "signalDbm": -88, - "temperatureC": 44, - "linkedWorkLaneId": "lane-verifier-b", - "locationHint": "workshop-shelf", - "status": "stale", - "lastUpdated": "2026-05-13T15:11:08.000Z", + "id": "gw-82a524067b14", + "nodeId": "gw-82a524067b14", + "callsign": "Gateway relay", + "role": "gateway", + "firmware": "gateway-discovery-fixture", + "transport": "LAN gateway sim", + "lastHeartbeatAt": "2026-05-13T17:01:00Z", + "linkedWorkLaneId": "CHECKPOINT_STORAGE", + "locationHint": "derived from gateway discovery packet", + "status": "offline", "provenance": { "subsystem": "hardware", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:11:08.000Z", - "localPathHint": "fixtures/dashboard/generated/hardware-heartbeats.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "hardware/fixtures/flowrouter_sample_seed42.json" } }, { - "id": "fm-node-field-07", - "nodeId": "fm-node-field-07", - "callsign": "Field Kit 07", - "role": "field-kit", - "firmware": "flowrouter-v0.1.0-fixture", - "transport": "meshtastic control only", - "locationHint": "packed-case", - "status": "offline", - "lastUpdated": "2026-05-13T14:20:00.000Z", + "id": "fr-e1e7878a2aa8-sidecar", + "nodeId": "fr-e1e7878a2aa8-sidecar", + "callsign": "LoRa sidecar", + "role": "sidecar", + "firmware": "meshtastic-sidecar-fixture", + "transport": "LoRa advisory sim", + "lastHeartbeatAt": "2026-05-13T17:01:10Z", + "signalDbm": -84, + "linkedWorkLaneId": "FAILURE_DISCOVERY", + "locationHint": "derived from sidecar status packet", + "status": "stale", "provenance": { "subsystem": "hardware", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T14:20:00.000Z", - "localPathHint": "fixtures/dashboard/generated/hardware-heartbeats.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "hardware/fixtures/flowrouter_sample_seed42.json" } } ], "alerts": [ { - "id": "incident-2026-05-13-001", - "incidentId": "incident-2026-05-13-001", + "id": "0x9861a651cf69f0d9433fe8ee9f5a045311acd8e40caf27bf95e956dceb326666", + "incidentId": "0x9861a651cf69f0d9433fe8ee9f5a045311acd8e40caf27bf95e956dceb326666", + "severity": "warning", + "title": "Verifier reorged", + "summary": "observation.reorged", + "openedAt": "2026-05-13T17:02:00.000Z", + "linkedObjectIds": [ + "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1" + ], + "recommendedAction": "Inspect generated Flow Memory receipt and source verifier report.", + "status": "reorged", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "alerts", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + }, + { + "id": "0xc3fcc8b746337d1e72daff6f878e40367217e7ef3e7a6ce858b718182a6f6344", + "incidentId": "0xc3fcc8b746337d1e72daff6f878e40367217e7ef3e7a6ce858b718182a6f6344", "severity": "critical", - "title": "Verifier commitment mismatch", - "summary": "Report 0x5959 records a deterministic commitment mismatch for the latest omega-path root fixture.", - "openedAt": "2026-05-13T15:56:04.640Z", + "title": "Verifier failed", + "summary": "commitment.mismatch", + "openedAt": "2026-05-13T17:02:00.000Z", + "linkedObjectIds": [ + "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb" + ], + "recommendedAction": "Inspect generated Flow Memory receipt and source verifier report.", + "status": "failed", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "alerts", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + }, + { + "id": "0x3f925cb1671b4c1d78ad89eba7eae15c6a25c4c9bfb798dcbcc8d51b526987cc", + "incidentId": "0x3f925cb1671b4c1d78ad89eba7eae15c6a25c4c9bfb798dcbcc8d51b526987cc", + "severity": "warning", + "title": "Verifier unresolved", + "summary": "artifact.unavailable", + "openedAt": "2026-05-13T17:02:00.000Z", "linkedObjectIds": [ - "0x82a7c8ef9931b361451efc99d932f615e251b3320ac395545971fe2e64fd14ca", - "0x5959595959595959595959595959595959595959595959595959595959595959" + "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294" ], - "recommendedAction": "Compare the generated root artifact with the emitted commitment before promoting this fixture to verified.", + "recommendedAction": "Inspect generated Flow Memory receipt and source verifier report.", "status": "unresolved", - "lastUpdated": "2026-05-13T15:56:04.640Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "alerts", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:56:04.640Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "incident-2026-05-13-002", - "incidentId": "incident-2026-05-13-002", + "id": "0x0cd26432c17ef891819487fa9e1475acf28e6e0d9dd62bc4018a495b1d352277", + "incidentId": "0x0cd26432c17ef891819487fa9e1475acf28e6e0d9dd62bc4018a495b1d352277", "severity": "warning", - "title": "Hardware heartbeat stale", - "summary": "Router Shelf 03 has not reported a fresh heartbeat inside the fixture freshness window.", - "openedAt": "2026-05-13T15:41:00.000Z", - "linkedObjectIds": ["fm-node-router-03", "lane-verifier-b"], - "recommendedAction": "Check local power and radio sidecar telemetry before assigning verifier work to the node.", - "status": "stale", - "lastUpdated": "2026-05-13T15:41:00.000Z", + "title": "Verifier unsupported", + "summary": "pulse.type.unsupported", + "openedAt": "2026-05-13T17:02:00.000Z", + "linkedObjectIds": [ + "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5" + ], + "recommendedAction": "Inspect generated Flow Memory receipt and source verifier report.", + "status": "unsupported", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "alerts", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:41:00.000Z", - "localPathHint": "fixtures/dashboard/generated/hardware-heartbeats.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "incident-2026-05-13-003", - "incidentId": "incident-2026-05-13-003", - "severity": "info", - "title": "Reorg replacement recorded", - "summary": "A noncanonical block and observation remain in the fixture so the explorer can show reorg history.", - "openedAt": "2026-05-13T12:31:10.000Z", + "id": "0x6922f2ea8414c7236d60986de1a4e0ce0981f3426fb419d1b65ba1e5caebf2b6", + "incidentId": "0x6922f2ea8414c7236d60986de1a4e0ce0981f3426fb419d1b65ba1e5caebf2b6", + "severity": "warning", + "title": "UPSTREAM_LOSS", + "summary": "Upstream unavailable; LAN dashboard and local cache still reachable.", + "openedAt": "2026-05-13T17:01:30Z", "linkedObjectIds": [ - "0xffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000", - "0xabababababababababababababababababababababababababababababababab" + "fr-e1e7878a2aa8" ], - "recommendedAction": "Keep the reorged records visible, but exclude them from current verified root summaries.", - "status": "verified", - "lastUpdated": "2026-05-13T13:02:00.000Z", + "recommendedAction": "check-upstream-and-power", + "status": "unresolved", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "alerts", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T13:02:00.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "hardware/fixtures/flowrouter_sample_seed42.json" } } ] diff --git a/apps/dashboard/src/App.tsx b/apps/dashboard/src/App.tsx index df5df928..946f5280 100644 --- a/apps/dashboard/src/App.tsx +++ b/apps/dashboard/src/App.tsx @@ -6,6 +6,7 @@ import { fetchDashboardData } from "./data/loadDashboardData"; import type { DashboardData } from "./data/types"; import { AlertsView } from "./views/AlertsView"; import { DevnetBlocksView } from "./views/DevnetBlocksView"; +import { FlowMemoryView } from "./views/FlowMemoryView"; import { FlowPulseStreamView } from "./views/FlowPulseStreamView"; import { HardwareNodesView } from "./views/HardwareNodesView"; import { OverviewView } from "./views/OverviewView"; @@ -87,6 +88,7 @@ export default function App() { } /> + } /> } /> } /> } /> diff --git a/apps/dashboard/src/components/AppShell.tsx b/apps/dashboard/src/components/AppShell.tsx index fb354c16..895b0da1 100644 --- a/apps/dashboard/src/components/AppShell.tsx +++ b/apps/dashboard/src/components/AppShell.tsx @@ -5,6 +5,7 @@ import { Bell, Binary, Braces, + BrainCircuit, Boxes, ClipboardCheck, LayoutDashboard, @@ -22,6 +23,7 @@ interface AppShellProps { const NAV_ITEMS = [ { to: "/", label: "Overview", icon: LayoutDashboard }, + { to: "/flowmemory", label: "Flow Memory", icon: BrainCircuit }, { to: "/flowpulse", label: "FlowPulse", icon: Activity }, { to: "/rootfields", label: "Rootfields", icon: Boxes }, { to: "/work", label: "Work lanes", icon: ClipboardCheck }, diff --git a/apps/dashboard/src/data/loadDashboardData.ts b/apps/dashboard/src/data/loadDashboardData.ts index 55790b98..e976109b 100644 --- a/apps/dashboard/src/data/loadDashboardData.ts +++ b/apps/dashboard/src/data/loadDashboardData.ts @@ -29,6 +29,11 @@ export function validateDashboardData(payload: unknown): DashboardData { assertArray(candidate.workLanes, "workLanes"); assertArray(candidate.workReceipts, "workReceipts"); assertArray(candidate.verifierReports, "verifierReports"); + assertArray(candidate.rootflowTransitions, "rootflowTransitions"); + assertArray(candidate.memorySignals, "memorySignals"); + assertArray(candidate.memoryReceipts, "memoryReceipts"); + assertArray(candidate.rootfieldBundles, "rootfieldBundles"); + assertArray(candidate.agentMemoryViews, "agentMemoryViews"); assertArray(candidate.devnetBlocks, "devnetBlocks"); assertArray(candidate.hardwareNodes, "hardwareNodes"); assertArray(candidate.alerts, "alerts"); diff --git a/apps/dashboard/src/data/selectors.ts b/apps/dashboard/src/data/selectors.ts index 4ab94a19..d5e20957 100644 --- a/apps/dashboard/src/data/selectors.ts +++ b/apps/dashboard/src/data/selectors.ts @@ -44,7 +44,7 @@ export function getOpenAlerts(data: DashboardData): AlertIncident[] { } export function getVerifierRiskReports(data: DashboardData): VerifierReport[] { - const riskStatuses: DashboardStatus[] = ["invalid", "unresolved", "unsupported", "reorged", "stale"]; + const riskStatuses: DashboardStatus[] = ["failed", "unresolved", "unsupported", "reorged", "stale"]; return data.verifierReports.filter((report) => riskStatuses.includes(report.status)); } diff --git a/apps/dashboard/src/data/status.ts b/apps/dashboard/src/data/status.ts index 762e1c11..33febe04 100644 --- a/apps/dashboard/src/data/status.ts +++ b/apps/dashboard/src/data/status.ts @@ -6,7 +6,7 @@ export const DASHBOARD_STATUSES: DashboardStatus[] = [ "finalized", "verified", "unresolved", - "invalid", + "failed", "unsupported", "reorged", "offline", @@ -19,7 +19,7 @@ export const STATUS_LABELS: Record = { finalized: "Finalized", verified: "Verified", unresolved: "Unresolved", - invalid: "Invalid", + failed: "Failed", unsupported: "Unsupported", reorged: "Reorged", offline: "Offline", @@ -32,7 +32,7 @@ export const STATUS_DESCRIPTIONS: Record = { finalized: "Past the local devnet finality threshold in this fixture.", verified: "Fixture report says supported deterministic checks passed.", unresolved: "Required evidence is absent or not resolvable from fixture inputs.", - invalid: "Supported checks ran and a deterministic mismatch was recorded.", + failed: "Supported checks ran and a deterministic mismatch was recorded.", unsupported: "Current V0 rules do not evaluate this object type or payload.", reorged: "The fixture marks the prior observation or block as noncanonical.", offline: "No usable heartbeat is present in the fixture window.", diff --git a/apps/dashboard/src/data/types.ts b/apps/dashboard/src/data/types.ts index 2fb690bb..4e6c0cf7 100644 --- a/apps/dashboard/src/data/types.ts +++ b/apps/dashboard/src/data/types.ts @@ -4,7 +4,7 @@ export type DashboardStatus = | "finalized" | "verified" | "unresolved" - | "invalid" + | "failed" | "unsupported" | "reorged" | "offline" @@ -132,6 +132,97 @@ export interface VerifierReport extends ProvenancedRecord { reportHash: string; } +export interface RootflowTransition extends ProvenancedRecord { + transitionId: string; + rootfieldId: string; + observationId: string; + pulseId: string; + parentPulseId: string; + parentTransitionId: string | null; + memorySignalId: string; + memoryReceiptId: string | null; + reportId: string | null; + previousRoot: string; + attemptedRoot: string; + nextRoot: string; + blockNumber: string; + txHash: string; + sequence: string; + reasonCodes: string[]; +} + +export interface MemorySignal extends ProvenancedRecord { + signalId: string; + observationId: string; + pulseId: string; + rootfieldId: string; + signalType: string; + chainId: string; + emittingContract: string; + blockNumber: string; + blockHash: string; + txHash: string; + transactionIndex: string; + logIndex: string; + actor: string; + subject: string; + commitment: string; + parentPulseId: string; + sequence: string; + occurredAt: string; + uri: string; + summary: string; +} + +export interface MemoryReceipt extends ProvenancedRecord { + receiptId: string; + reportId: string; + reportDigest: string; + observationId: string; + rootfieldId: string; + verifierStatus: string; + flowMemoryStatus: DashboardStatus; + resolverPolicyId: string; + verifierSpecVersion: string; + checksPassed: number; + checksTotal: number; + reasonCodes: string[]; + evidenceRefs: Array>; +} + +export interface RootfieldBundle extends ProvenancedRecord { + bundleId: string; + rootfieldId: string; + latestRoot: string; + latestTransitionId: string | null; + transitionIds: string[]; + memorySignalIds: string[]; + memoryReceiptIds: string[]; + verifierReportIds: string[]; + counts: { + observations: number; + transitions: number; + receipts: number; + verified: number; + failed: number; + unresolved: number; + unsupported: number; + reorged: number; + }; +} + +export interface AgentMemoryView extends ProvenancedRecord { + viewId: string; + rootfieldId: string; + latestRoot: string; + latestTransitionId: string | null; + signalIds: string[]; + receiptIds: string[]; + transitionIds: string[]; + warnings: string[]; + localOnly: true; +} + export interface DevnetBlock extends ProvenancedRecord { blockNumber: number; blockHash: string; @@ -176,6 +267,11 @@ export interface DashboardData { workLanes: WorkLane[]; workReceipts: WorkReceipt[]; verifierReports: VerifierReport[]; + rootflowTransitions: RootflowTransition[]; + memorySignals: MemorySignal[]; + memoryReceipts: MemoryReceipt[]; + rootfieldBundles: RootfieldBundle[]; + agentMemoryViews: AgentMemoryView[]; devnetBlocks: DevnetBlock[]; hardwareNodes: HardwareNode[]; alerts: AlertIncident[]; diff --git a/apps/dashboard/src/styles.css b/apps/dashboard/src/styles.css index 915fdbbc..2011ab24 100644 --- a/apps/dashboard/src/styles.css +++ b/apps/dashboard/src/styles.css @@ -666,7 +666,7 @@ dd { --status-fg: #8c5527; } -.status-invalid { +.status-failed { --status-bg: #f5e2e2; --status-border: #d4a0a0; --status-fg: #963b3b; diff --git a/apps/dashboard/src/test/dashboardData.test.ts b/apps/dashboard/src/test/dashboardData.test.ts index 45e2997c..bc050fe9 100644 --- a/apps/dashboard/src/test/dashboardData.test.ts +++ b/apps/dashboard/src/test/dashboardData.test.ts @@ -22,6 +22,11 @@ describe("dashboard fixture", () => { ...data.workLanes, ...data.workReceipts, ...data.verifierReports, + ...data.rootflowTransitions, + ...data.memorySignals, + ...data.memoryReceipts, + ...data.rootfieldBundles, + ...data.agentMemoryViews, ...data.devnetBlocks, ...data.hardwareNodes, ...data.alerts, @@ -40,6 +45,11 @@ describe("dashboard fixture", () => { ...data.workLanes, ...data.workReceipts, ...data.verifierReports, + ...data.rootflowTransitions, + ...data.memorySignals, + ...data.memoryReceipts, + ...data.rootfieldBundles, + ...data.agentMemoryViews, ...data.devnetBlocks, ...data.hardwareNodes, ...data.alerts, @@ -47,7 +57,7 @@ describe("dashboard fixture", () => { expect(records.every((record) => record.id && record.status && record.provenance.subsystem)).toBe(true); expect(records.every((record) => record.provenance.origin === "fixture")).toBe(true); - expect(records.every((record) => record.provenance.chainContext === "anvil-31337")).toBe(true); + expect(records.every((record) => record.provenance.chainContext === "flowmemory-local-v0")).toBe(true); }); it("computes overview metrics and searches records", () => { @@ -55,6 +65,6 @@ describe("dashboard fixture", () => { const matches = searchRecords(data.verifierReports, "commitment.mismatch"); expect(metrics).toHaveLength(5); - expect(matches.map((match) => match.status)).toContain("invalid"); + expect(matches.map((match) => match.status)).toContain("failed"); }); }); diff --git a/apps/dashboard/src/views/FlowMemoryView.tsx b/apps/dashboard/src/views/FlowMemoryView.tsx new file mode 100644 index 00000000..1dd8fbe7 --- /dev/null +++ b/apps/dashboard/src/views/FlowMemoryView.tsx @@ -0,0 +1,141 @@ +import { useMemo, useState } from "react"; +import { BrainCircuit, Search } from "lucide-react"; +import { EmptyState } from "../components/EmptyState"; +import { HashValue } from "../components/HashValue"; +import { ProvenanceLine } from "../components/ProvenanceLine"; +import { SectionHeader } from "../components/SectionHeader"; +import { StatusBadge } from "../components/StatusBadge"; +import { searchRecords } from "../data/selectors"; +import type { DashboardData } from "../data/types"; + +export function FlowMemoryView({ data }: { data: DashboardData }) { + const [query, setQuery] = useState(""); + const transitions = useMemo( + () => searchRecords(data.rootflowTransitions, query), + [data.rootflowTransitions, query], + ); + + return ( +
+ +
+ ); +} diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index 69d8d0b0..0f814c45 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -92,7 +92,7 @@ Responsibilities: - Read receipts and logs. - Derive `txHash`, `logIndex`, block metadata, and observation identity. - Reconstruct FlowPulse streams. -- Track pending, finalized, duplicate, invalid, unsupported, unresolved, and reorged states. +- Track pending, finalized, duplicate, failed, unsupported, unresolved, and reorged states. - Resolve off-chain artifacts. - Verify roots, receipts, commitments, attestations, and proof placeholders against allowed evidence. - Produce deterministic verification reports and outputs. @@ -133,7 +133,7 @@ Status: data model planning only. Responsibilities: - Define app-facing entities for operator dashboard and protocol explorer. -- Present observed, pending, finalized, verified, invalid, unresolved, unsupported, and reorged states clearly. +- Present observed, pending, finalized, verified, failed, unresolved, unsupported, and reorged states clearly. - Consume indexer/verifier outputs once local schemas stabilize. Boundaries: diff --git a/docs/CURRENT_STATE.md b/docs/CURRENT_STATE.md index e88b9605..fb63e90e 100644 --- a/docs/CURRENT_STATE.md +++ b/docs/CURRENT_STATE.md @@ -10,7 +10,7 @@ FlowMemory is in foundation hardening. The bootstrap repository operating system, contracts V0 foundation, crypto V0 foundation, local indexer/verifier fixture package, dashboard V0, FlowRouter hardware POC, and local no-value devnet prototype have merged into `main`. -The next major target is a single runnable launch-core V0 stack that connects contract fixtures, local indexing/verifier outputs, crypto schema vocabulary, Rootflow transitions, Flow Memory objects, and dashboard-readable state without production deployment. +The launch-core V0 stack now has a single runnable local command that connects contract fixtures, local indexing/verifier outputs, crypto schema vocabulary, Rootflow transitions, Flow Memory objects, generated dashboard state, local no-value devnet output, and hardware POC output without production deployment. Launch-critical direction: Rootflow V0 and Flow Memory V0 are the core of the next milestone. Rootflow defines memory-state transitions. Flow Memory defines the agent-facing memory objects derived from FlowPulse observations, receipts, verifier reports, and committed roots. @@ -52,10 +52,19 @@ Indexer/verifier local package: Dashboard V0: - `apps/dashboard/` contains a Vite/React fixture-backed dashboard. -- It renders overview, FlowPulse stream, Rootfields, work receipts, verifier reports, devnet blocks, hardware nodes, alerts, and raw JSON views. -- The dashboard currently uses the canonical fixture at `fixtures/dashboard/flowmemory-dashboard-v0.json`. +- It renders overview, Flow Memory / Rootflow, FlowPulse stream, Rootfields, work receipts, verifier reports, devnet blocks, hardware nodes, alerts, and raw JSON views. +- The dashboard uses the generated canonical fixture at `fixtures/dashboard/flowmemory-dashboard-v0.json`. - Dashboard tests and production build pass after installing `apps/dashboard` dependencies. +Launch-core integration: + +- `npm run launch:v0` runs the local end-to-end V0 flow. +- `fixtures/launch-core/flowmemory-launch-v0.json` contains generated MemorySignal, MemoryReceipt, RootfieldBundle, AgentMemoryView, and RootflowTransition objects. +- `fixtures/launch-core/rootflow-transitions.json` contains concrete generated RootflowTransition output. +- `schemas/flowmemory/` contains canonical JSON schemas for MemorySignal, MemoryReceipt, RootflowTransition, RootfieldBundle, and AgentMemoryView. +- `services/flowmemory/src/status.ts` implements the explicit verifier-to-Flow-Memory status adapter: `valid` -> `verified`, `invalid` -> `failed`, `unresolved` -> `unresolved`, `unsupported` -> `unsupported`, `reorged` -> `reorged`. +- `.github/workflows/ci.yml` now includes area jobs for contracts, services/launch core, crypto, dashboard, devnet, and hardware. + Local no-value devnet prototype: - `crates/flowmemory-devnet/` contains a Rust local devnet prototype. @@ -85,15 +94,10 @@ Launch-core specifications: - Production ownership, upgrade, governance, fee, token, or incentive mechanics. - Dynamic fees or tokenomics. - Production Uniswap v4 hook deployment. -- Complete Rootflow runtime implementation. -- Complete Flow Memory runtime implementation. -- Canonical JSON schema package for Rootflow and Flow Memory objects. -- End-to-end fixture-backed Rootflow acceptance run. -- Completed launch-core acceptance audit. -- Area-specific CI jobs for contracts, crypto, services, dashboard, devnet, and hardware checks. -- Single generated end-to-end Rootflow/Flow Memory acceptance command. -- Generated dashboard fixture built from service/devnet/hardware outputs instead of a hand-maintained fixture. -- External status adapter that maps verifier `valid`/`invalid` to Flow Memory/dashboard `verified`/`failed`. +- Production Rootflow runtime implementation. +- Production Flow Memory runtime implementation. +- Hosted launch-core services. +- Rich JSON Schema runtime validation with a dedicated validator dependency. - Production indexer or verifier service runtime. - Production persistence layer, production live RPC reader, production APIs, or hosted services. - Explorer or hardware console implementation. @@ -153,10 +157,10 @@ Before assigning agents, check for dirty worktrees and avoid overlapping folders ## Current Operator Priorities 1. Make Rootflow V0 and Flow Memory V0 pass the launch acceptance matrix in `docs/V0_LAUNCH_ACCEPTANCE.md`. -2. Finish contracts foundation hardening without production deployment or token mechanics. -3. Build deterministic local fixtures for FlowPulse, receipts, Rootflow transitions, verifier reports, and dashboard state. -4. Define canonical crypto and JSON schema vocabulary before proof systems or verifier economics. -5. Keep dashboard work fixture-backed until indexer/verifier outputs stabilize. +2. Keep the generated launch-core command stable in CI. +3. Add richer schema validation before live services. +4. Finish contracts hardening without production deployment or token mechanics. +5. Keep dashboard work fixture-backed until a production API is explicitly scoped. 6. Keep chain/appchain work no-value and local until explicit gates are passed. ## Update Rule diff --git a/docs/DECISIONS/2026-05-13-launch-core-generated-flowmemory-v0.md b/docs/DECISIONS/2026-05-13-launch-core-generated-flowmemory-v0.md new file mode 100644 index 00000000..9615126c --- /dev/null +++ b/docs/DECISIONS/2026-05-13-launch-core-generated-flowmemory-v0.md @@ -0,0 +1,78 @@ +# Launch-Core Generated FlowMemory V0 + +Date: 2026-05-13 + +## Status + +Accepted for local/test V0 fixtures. + +## Context + +FlowMemory needed a single local acceptance path that connected previously separate V0 components: + +- FlowPulse fixture observations. +- Indexer output. +- Verifier reports. +- Rootflow transitions. +- Flow Memory objects. +- Dashboard-readable state. +- Local no-value devnet handoff output. +- FlowRouter hardware POC fixture output. + +Before this decision, each subsystem had useful local fixtures, but the project did not have one command that regenerated the launch-core state end to end. + +## Decision + +The repo now uses `npm run launch:v0` as the local launch-core acceptance command. + +The command: + +1. runs the indexer fixture command; +2. runs the verifier fixture command; +3. runs the no-value local devnet demo handoff; +4. validates the FlowRouter hardware POC fixture; +5. generates Rootflow and Flow Memory V0 state; +6. writes the dashboard fixture and runtime data. + +Generated canonical outputs: + +- `fixtures/launch-core/flowmemory-launch-v0.json` +- `fixtures/launch-core/rootflow-transitions.json` +- `fixtures/dashboard/flowmemory-dashboard-v0.json` +- `apps/dashboard/public/data/flowmemory-dashboard-v0.json` +- `fixtures/launch-core/generated/devnet/` + +Canonical schema files: + +- `schemas/flowmemory/memory-signal.schema.json` +- `schemas/flowmemory/memory-receipt.schema.json` +- `schemas/flowmemory/rootflow-transition.schema.json` +- `schemas/flowmemory/rootfield-bundle.schema.json` +- `schemas/flowmemory/agent-memory-view.schema.json` + +Verifier report statuses remain internal verifier results. The explicit adapter is: + +- `valid` -> `verified` +- `invalid` -> `failed` +- `unresolved` -> `unresolved` +- `unsupported` -> `unsupported` +- `reorged` -> `reorged` + +## Boundaries + +This is local/test V0 only. It is not a production L1, production Uniswap v4 deployment, hosted verifier network, proof system, production hardware deployment, or claim that AI runs on-chain. + +Heavy memory/model/artifact data remains off-chain. The generated files contain roots, receipts, observations, commitments, reports, status mappings, and fixture metadata only. + +## Consequences + +- Dashboard V0 now consumes generated state rather than only hand-maintained dashboard data. +- Rootflow transitions are concrete generated objects, not only documentation. +- Flow Memory object shapes have canonical local JSON schema files. +- GitHub CI can run area-specific checks beyond repository hygiene. + +## Follow-Ups + +- Add richer schema validation if the repo adopts a JSON Schema validator dependency. +- Add live RPC indexing only after fixture behavior remains stable. +- Keep production deployment, tokenomics, verifier economics, and L1/appchain planning gated behind separate decisions. diff --git a/docs/FLOW_MEMORY_V0.md b/docs/FLOW_MEMORY_V0.md index 0a60fb9a..39875d28 100644 --- a/docs/FLOW_MEMORY_V0.md +++ b/docs/FLOW_MEMORY_V0.md @@ -181,4 +181,22 @@ Flow Memory V0 is launch-ready only when the local system can: 6. Update a RootfieldBundle. 7. Render an AgentMemoryView or dashboard equivalent. +The current local/test generator is: + +```powershell +npm run launch:v0 +``` + +It writes generated Flow Memory V0 objects to: + +```text +fixtures/launch-core/flowmemory-launch-v0.json +``` + +Canonical local/test schemas live in: + +```text +schemas/flowmemory/ +``` + The first launch can be fixture-backed, but the boundaries must be honest and documented. diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 2ec6af97..fecc8833 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -54,12 +54,12 @@ Status: implemented as a local/test foundation; hardening still active. ### Phase 2: V0 Local Stack -Status: partially implemented as fixture-first services; launch-core integration still active. +Status: implemented as fixture-first services plus generated launch-core state; production services still gated. - Canonical FlowPulse observation identity is specified and implemented in crypto/services. - Verifier statuses and report JSON schema exist for local fixture reports. -- Define Rootflow transition schema and parent/child state-linking behavior. -- Define Flow Memory schemas for MemorySignal, MemoryReceipt, RootfieldBundle, and AgentMemoryView. +- Rootflow transition schema and parent/child state-linking behavior exist as generated local fixtures. +- Flow Memory schemas for MemorySignal, MemoryReceipt, RootfieldBundle, and AgentMemoryView exist under `schemas/flowmemory/`. - Fixture-based parser and reorg-state tests exist in the indexer/verifier packages. - Define persistence and local RPC reader boundaries only after fixture behavior stabilizes. - Local devnet smoke-test gates exist as a no-value Rust prototype, without mainnet or production deployment. @@ -77,22 +77,22 @@ Status: active. ### Phase 4: V0 Crypto Schema Layer -Status: implemented for crypto V0 primitives; Flow Memory object schemas still active. +Status: implemented for crypto V0 primitives and local Flow Memory object schemas. - Receipt, attestation, commitment, root, and proof vocabulary exists in `crypto/` docs and helpers. - Domain separation and replay boundaries exist for the V0 helper package. -- Define canonical ids for MemorySignal, MemoryReceipt, RootflowTransition, RootfieldBundle, and verifier reports. +- Canonical ids for MemorySignal, MemoryReceipt, RootflowTransition, RootfieldBundle, AgentMemoryView, and verifier reports exist in local V0 fixtures. - Validate test vectors through verifier specs and keep cross-language checks passing. - Keep proof circuits, GPU proofs, verifier economics, and production crypto infrastructure out of scope. ### Phase 5: V0 Dashboard Data Model And Display Path -Status: implemented as a fixture-backed local app; generated fixture integration still active. +Status: implemented as a generated fixture-backed local app. - App-facing entities exist in `apps/dashboard`. -- Observed, pending, finalized, verified, invalid, unresolved, unsupported, reorged, offline, and stale states are modeled for display. -- Dashboard renders local fixture views for overview, FlowPulse stream, Rootfields, work receipts, verifier reports, devnet blocks, hardware nodes, alerts, and raw JSON. -- Next step: replace or augment the hand-maintained dashboard fixture with generated output from services/devnet/hardware. +- Observed, pending, finalized, verified, failed, unresolved, unsupported, reorged, offline, and stale states are modeled for display. +- Dashboard renders local fixture views for overview, Flow Memory / Rootflow, FlowPulse stream, Rootfields, work receipts, verifier reports, devnet blocks, hardware nodes, alerts, and raw JSON. +- The dashboard fixture is generated from services, local devnet, and hardware POC outputs by `npm run launch:v0`. - Keep hosted production APIs and deployment out of scope until the local stack stabilizes. ### Phase 6: V0 Hardware POC @@ -132,8 +132,8 @@ The initial merge sequence has completed for repo OS, contracts foundation, cryp Next merge preference: -1. Launch-core integration command and generated Rootflow/Flow Memory fixtures. -2. Canonical schemas for MemorySignal, MemoryReceipt, RootflowTransition, RootfieldBundle, and AgentMemoryView. -3. Dashboard fixture generator/adapter that consumes service/devnet/hardware outputs. -4. Area-specific CI for contracts, crypto, services, dashboard, devnet, and hardware. -5. Production-gated research only after V0 local acceptance is green. +1. Runtime schema validation and fixture-diff guardrails. +2. Live RPC indexing boundary after fixture behavior remains stable. +3. Dashboard polish and explorer/hardware-console separation. +4. Static analysis and contract hardening. +5. Production-gated research only after V0 local acceptance stays green. diff --git a/docs/ROOTFLOW_V0.md b/docs/ROOTFLOW_V0.md index 19fe1d55..cbf17d56 100644 --- a/docs/ROOTFLOW_V0.md +++ b/docs/ROOTFLOW_V0.md @@ -144,6 +144,18 @@ Rootflow V0 is launch-ready only when a local developer can: Passing an isolated unit test or opening a small PR is not enough. +The current local/test command for this path is: + +```powershell +npm run launch:v0 +``` + +It writes generated Rootflow transitions to: + +```text +fixtures/launch-core/rootflow-transitions.json +``` + ## Explicit Non-Goals - No production L1 claim. diff --git a/docs/V0_LAUNCH_ACCEPTANCE.md b/docs/V0_LAUNCH_ACCEPTANCE.md index f0f35e03..25a0a8a1 100644 --- a/docs/V0_LAUNCH_ACCEPTANCE.md +++ b/docs/V0_LAUNCH_ACCEPTANCE.md @@ -1,6 +1,6 @@ # V0 Launch Acceptance Matrix -Status: active milestone checklist. +Status: local/test V0 acceptance path implemented. This matrix maps the Rootflow V0 and Flow Memory V0 goal to concrete evidence. It is intentionally strict: a PR, passing test, or useful document is only evidence if it covers the requirement named here. @@ -31,22 +31,22 @@ It must not claim production L1, production mainnet readiness, full trustless ve | Requirement | Required evidence | Owner | Current state | | --- | --- | --- | --- | -| Rootfield namespaces | Contract or fixture registers `rootfieldId`; docs explain namespace policy. | Contracts | Baseline exists in `RootfieldRegistry`; policy still needs hardening. | -| Root commitments | Contract or fixture commits a nonzero root and emits/records the update. | Contracts | Baseline exists in `submitRoot`; tests need launch-grade coverage. | -| Parent/child transitions | `RootflowTransition` includes parent pulse/root and new root. | Indexer + Crypto + Contracts | Specified in `docs/ROOTFLOW_V0.md`; implementation still required. | -| FlowPulse linkage | Transition and memory signal reference `pulseId`. | Indexer + Dashboard | Specified; parser and display path still required. | -| Receipt linkage | `MemoryReceipt` links signal, artifact commitment, evidence URI, and verifier report. | Crypto + Indexer | Specified in `docs/FLOW_MEMORY_V0.md`; implementation still required. | -| Verifier statuses | Cross-agent status vocabulary exists and verifier reports use it. | Indexer + Crypto | Specified; schema/tests still required. | -| Pending state | Fixture/report can show pending transition. | Indexer + Dashboard | Required, not complete. | -| Verified state | Fixture/report can show verified transition. | Indexer + Crypto + Dashboard | Required, not complete. | -| Failed state | Fixture/report can show rejected transition. | Indexer + Dashboard | Required, not complete. | -| Reorged state | Fixture/report can show removed/superseded observation. | Indexer | Required, not complete. | -| Deterministic fixtures | Fixtures run without private RPC keys or secrets. | Indexer + Crypto + Chain | Required, not complete. | -| Dashboard-readable state | JSON/API/fixture shape feeds dashboard views. | Dashboard + Indexer | Required, not complete. | -| Flow Memory schemas | `MemorySignal`, `MemoryReceipt`, `RootfieldBundle`, and `AgentMemoryView` schemas exist. | Crypto + Indexer + Dashboard | Specified; canonical schemas still required. | -| Verifier reports | JSON schema and sample reports exist. | Indexer + Crypto | Required, not complete. | -| Dashboard display path | Dashboard renders Rootfield, transition, signal, receipt, and status data. | Dashboard | Required, not complete. | -| Source-of-truth docs | Current state, roadmap, decision record, and specs are updated. | HQ/Review | This PR adds the launch-core docs. | +| Rootfield namespaces | Contract or fixture registers `rootfieldId`; docs explain namespace policy. | Contracts | Implemented for local/test V0 in `RootfieldRegistry` and tests. | +| Root commitments | Contract or fixture commits a nonzero root and emits/records the update. | Contracts | Implemented for local/test V0 in contracts and generated fixtures. | +| Parent/child transitions | `RootflowTransition` includes parent pulse/root and new root. | Indexer + Crypto + Contracts | Implemented in `fixtures/launch-core/rootflow-transitions.json`. | +| FlowPulse linkage | Transition and memory signal reference `pulseId`. | Indexer + Dashboard | Implemented in generated MemorySignals and RootflowTransitions. | +| Receipt linkage | `MemoryReceipt` links signal, artifact commitment, evidence URI, and verifier report. | Crypto + Indexer | Implemented in `fixtures/launch-core/flowmemory-launch-v0.json`. | +| Verifier statuses | Cross-agent status vocabulary exists and verifier reports use it. | Indexer + Crypto | Implemented with explicit adapter in `services/flowmemory/src/status.ts`. | +| Pending state | Fixture/report can show pending transition. | Indexer + Dashboard | Implemented in generated dashboard fixture. | +| Verified state | Fixture/report can show verified transition. | Indexer + Crypto + Dashboard | Implemented in generated dashboard fixture. | +| Failed state | Fixture/report can show rejected transition. | Indexer + Dashboard | Implemented via `invalid` -> `failed` adapter. | +| Reorged state | Fixture/report can show removed/superseded observation. | Indexer | Implemented in generated transition/report/dashboard state. | +| Deterministic fixtures | Fixtures run without private RPC keys or secrets. | Indexer + Crypto + Chain | Implemented; `npm run launch:v0` regenerates deterministic local fixtures. | +| Dashboard-readable state | JSON/API/fixture shape feeds dashboard views. | Dashboard + Indexer | Implemented in generated dashboard fixture. | +| Flow Memory schemas | `MemorySignal`, `MemoryReceipt`, `RootflowTransition`, `RootfieldBundle`, and `AgentMemoryView` schemas exist. | Crypto + Indexer + Dashboard | Implemented under `schemas/flowmemory/`. | +| Verifier reports | JSON schema and sample reports exist. | Indexer + Crypto | Implemented in verifier package and generated MemoryReceipts. | +| Dashboard display path | Dashboard renders Rootfield, transition, signal, receipt, and status data. | Dashboard | Implemented in Flow Memory / Rootflow dashboard view and raw JSON. | +| Source-of-truth docs | Current state, roadmap, decision record, and specs are updated. | HQ/Review | Implemented with launch-core decision and audit updates. | ## End-To-End Acceptance Test @@ -61,12 +61,11 @@ A developer must be able to run a local V0 flow: The final acceptance evidence should include: -- exact commands run; -- fixture paths; -- output paths; -- screenshots or dashboard verification notes when UI exists; -- test results; -- PR links for each subsystem. +- command: `npm run launch:v0`; +- fixture paths: `fixtures/launch-core/`, `fixtures/dashboard/flowmemory-dashboard-v0.json`; +- output paths: `fixtures/launch-core/flowmemory-launch-v0.json`, `fixtures/launch-core/rootflow-transitions.json`, `apps/dashboard/public/data/flowmemory-dashboard-v0.json`; +- test results: services, dashboard, contracts, crypto, devnet, and hardware checks; +- GitHub CI area jobs. ## Required Agent Handoffs @@ -98,9 +97,9 @@ HQ/review to all agents: - PR review checklist. - current-state updates. -## Merge Readiness +## Local/Test Completion -The milestone is not ready to call complete until all of these are true: +The local/test V0 milestone is complete when all of these remain true: - Contracts tests pass. - Crypto fixture validation passes. diff --git a/docs/reviews/ROOTFLOW_FLOW_MEMORY_V0_ACCEPTANCE_AUDIT.md b/docs/reviews/ROOTFLOW_FLOW_MEMORY_V0_ACCEPTANCE_AUDIT.md index bfff8e87..1adcfe26 100644 --- a/docs/reviews/ROOTFLOW_FLOW_MEMORY_V0_ACCEPTANCE_AUDIT.md +++ b/docs/reviews/ROOTFLOW_FLOW_MEMORY_V0_ACCEPTANCE_AUDIT.md @@ -2,9 +2,9 @@ Date: 2026-05-13 -Status: active audit, not complete. +Status: local/test V0 launch-core integration complete. -This audit tracks the launch-critical goal: build Rootflow V0 and Flow Memory V0 as a coherent local/testnet-ready V0 system. The repo is much stronger after the merged PR sequence, but the milestone is not complete until the end-to-end acceptance loop is generated and verified from one command. +This audit tracks the launch-critical goal: build Rootflow V0 and Flow Memory V0 as a coherent local/testnet-ready V0 system. The local fixture acceptance path now exists and is verified. This does not mean production L1, production Uniswap v4 deployment, production verifier network, free storage, or AI running on-chain. ## Current Merged State @@ -20,20 +20,53 @@ All previously open launch-foundation PRs have merged into `main`: | #61 | Indexer/verifier V0 fixtures | Shared services package, fixture indexer, fixture verifier, report schema, e2e command, and 24 service tests. | | #62 | Dashboard V0 | Fixture-backed Vite/React dashboard, dashboard fixture, views, tests, and production build. | -## Main Smoke-Test Evidence +## Launch-Core Evidence + +The single local acceptance command is: + +```powershell +npm run launch:v0 +``` + +It runs: + +1. FlowPulse fixture indexing. +2. Verifier report generation. +3. No-value local devnet handoff generation. +4. FlowRouter hardware fixture validation. +5. Rootflow and Flow Memory V0 generation. +6. Dashboard fixture/runtime generation. + +Generated outputs: + +- `fixtures/launch-core/flowmemory-launch-v0.json` +- `fixtures/launch-core/rootflow-transitions.json` +- `fixtures/dashboard/flowmemory-dashboard-v0.json` +- `apps/dashboard/public/data/flowmemory-dashboard-v0.json` +- `fixtures/launch-core/generated/devnet/` + +Canonical schemas: + +- `schemas/flowmemory/memory-signal.schema.json` +- `schemas/flowmemory/memory-receipt.schema.json` +- `schemas/flowmemory/rootflow-transition.schema.json` +- `schemas/flowmemory/rootfield-bundle.schema.json` +- `schemas/flowmemory/agent-memory-view.schema.json` + +## Main Verification Evidence These commands were run from merged `main` on 2026-05-13. | Area | Command | Result | | --- | --- | --- | +| Launch core | `npm run launch:v0` | 7 loaded FlowPulses, 7 indexed observations, 7 verifier reports, 6 Rootflow transitions, 7 MemorySignals, 7 MemoryReceipts, 1 RootfieldBundle, 1 AgentMemoryView. | +| Services | `npm test` | 27 tests passed across shared, indexer, verifier, and FlowMemory packages. | +| Services e2e | `npm run e2e` | Indexer -> verifier -> FlowMemory generator passed and wrote dashboard fixture. | +| Dashboard | `npm test`; `npm run build` in `apps/dashboard` | 4 tests passed; production build passed. | | Contracts | `forge test` | 33 tests passed. | -| Services | `npm test` | 24 tests passed across shared, indexer, and verifier packages. | -| Services e2e | `npm run e2e` | 7 observations, 6 cursors, 2 rejected logs, 1 duplicate, 7 verifier reports. | | Crypto | `npm ci`; `npm test`; `npm run validate:vectors`; `python validate_test_vectors.py` | 13 tests passed; 21 vectors validated; Python FlowPulse recompute passed. | -| Dashboard | `npm ci`; `npm test`; `npm run build` in `apps/dashboard` | 4 tests passed; production build passed. | | Devnet | `cargo test --manifest-path crates\flowmemory-devnet\Cargo.toml` | 7 tests passed. | | Hardware | `python hardware\simulator\flowrouter_sim.py --validate-file hardware\fixtures\flowrouter_sample_seed42.json` | Fixture validation passed. | -| Repo hygiene | `git diff --check`; conflict marker scan | Clean after generated local artifacts were removed/restored. | ## Acceptance Matrix @@ -41,51 +74,44 @@ These commands were run from merged `main` on 2026-05-13. | --- | --- | --- | | Rootfield namespaces | `RootfieldRegistry` registration and Foundry tests. | Implemented for V0 local contracts. | | Root commitments | `submitRoot`, counters, latest root storage, FlowPulse emission, tests. | Implemented for V0 local contracts. | -| Parent/child memory-state transitions | `parentPulseId` and docs exist; no generated `RootflowTransition` artifact yet. | Incomplete. | -| FlowPulse linkage | Contracts emit FlowPulse; services parse fixture logs and derive observations. | Implemented as fixture/local path. | -| Receipt linkage | Crypto receipt/report helpers and verifier reports exist; no canonical `MemoryReceipt` fixture package yet. | Partial. | -| Verifier status | Verifier reports use `valid`, `invalid`, `unresolved`, `unsupported`, `reorged`; docs define dashboard mapping. | Partial until adapter is implemented. | -| Pending/verified/failed/reorged states | Indexer/verifier/dashboard all model pieces of these states. | Partial until one generated Flow Memory view normalizes them. | -| Deterministic fixtures | Crypto, services, dashboard, devnet, hardware fixtures exist. | Implemented as separate fixtures. | -| Dashboard-readable state | Dashboard fixture and app exist. | Implemented, but currently hand-maintained. | -| Flow Memory schemas | `docs/FLOW_MEMORY_V0.md` specifies shapes. | Incomplete until canonical JSON schemas and validators exist. | +| Parent/child memory-state transitions | `fixtures/launch-core/rootflow-transitions.json` contains generated RootflowTransition objects with parent pulse and parent transition links. | Implemented for local/test V0. | +| FlowPulse linkage | Contracts emit FlowPulse; services parse fixture logs and generated MemorySignals reference pulse/observation ids. | Implemented for local/test V0. | +| Receipt linkage | Generated MemoryReceipts link verifier reports to observations/rootfields. | Implemented for local/test V0. | +| Verifier status | `services/flowmemory/src/status.ts` maps `valid`/`invalid` to `verified`/`failed`. | Implemented. | +| Pending/verified/failed/reorged states | Generated dashboard fixture includes observed, pending, finalized, verified, failed, unresolved, unsupported, reorged, offline, and stale. | Implemented for local/test V0. | +| Deterministic fixtures | Launch-core, dashboard, crypto, services, devnet, and hardware fixtures exist. | Implemented. | +| Dashboard-readable state | Dashboard fixture is generated from services/devnet/hardware outputs. | Implemented. | +| Flow Memory schemas | Canonical JSON schema files exist under `schemas/flowmemory/`. | Implemented for local/test V0. | | Verifier reports | Schema, local reports, tests, and e2e output exist. | Implemented for local fixtures. | -| Dashboard display path | Vite dashboard renders fixture-backed views. | Implemented for local fixtures. | -| Single acceptance command | No one command runs FlowPulse fixture -> indexer -> receipt/report -> Rootflow transition -> dashboard state. | Incomplete. | - -## Build Gaps - -Critical launch-core gaps: +| Dashboard display path | Dashboard includes Flow Memory / Rootflow view and renders generated fixture data. | Implemented for local fixtures. | +| Single acceptance command | `npm run launch:v0`. | Implemented. | +| Area-specific CI | CI includes contracts, services/launch-core, crypto, dashboard, devnet, and hardware jobs. | Implemented. | -- Build a concrete `RootflowTransition` object and fixture output. -- Build canonical JSON schemas and validators for `MemorySignal`, `MemoryReceipt`, `RootfieldBundle`, `AgentMemoryView`, and `RootflowTransition`. -- Create a generated dashboard fixture from service/devnet/hardware outputs instead of relying only on `fixtures/dashboard/flowmemory-dashboard-v0.json`. -- Add the explicit adapter from verifier report statuses `valid`/`invalid` to Flow Memory/dashboard statuses `verified`/`failed`. -- Add a single local acceptance command that runs the complete V0 loop and leaves dashboard-readable output. -- Add area-specific CI so GitHub enforces more than repository hygiene. +## Remaining Gated Work -Important but not launch-blocking gaps: +Not part of local/test V0 completion: -- Live RPC indexing and durable persistence. +- Live RPC indexing and durable production persistence. - Production Uniswap v4 hook deployment. - Production appchain/L1, sequencer, validator, bridge, or token design. - Hardware firmware, real Meshtastic devices, manufacturing, certification, and field deployment. - Trustless proof systems, verifier economics, slashing, GPU proofs, and production verifier network. +- Runtime JSON Schema validation with a dedicated validator dependency. ## Next Three Issues -1. `[launch-core/integration] Build one-command Rootflow and Flow Memory V0 acceptance pipeline` - - Agent/worktree: Integration or Backend/Indexer Agent in `E:\FlowMemory\flowmemory-review` or `E:\FlowMemory\flowmemory-indexer`. - - Owns: generated fixtures, launch command, RootflowTransition output, MemorySignal/MemoryReceipt/RootfieldBundle/AgentMemoryView generation. +1. `[launch-core/validation] Add runtime schema validation and fixture diff guardrails` + - Agent/worktree: Review/Integration Agent in `E:\FlowMemory\flowmemory-review`. + - Owns: schema validator choice, fixture validation command, CI diff policy. -2. `[launch-core/schemas] Add canonical Flow Memory and Rootflow JSON schemas` - - Agent/worktree: Crypto Agent in `E:\FlowMemory\flowmemory-crypto`. - - Owns: schemas, canonical ids, vector fixtures, validation commands, status mapping decision. +2. `[contracts/security] Add static-analysis setup and V0 contract hardening notes` + - Agent/worktree: Contracts Agent in `E:\FlowMemory\flowmemory-contracts`. + - Owns: Slither setup issue, owner/status boundary review, test gaps. -3. `[launch-core/dashboard] Replace hand-maintained dashboard fixture with generated V0 output` +3. `[dashboard/polish] Polish generated Flow Memory / Rootflow dashboard view` - Agent/worktree: Dashboard Agent in `E:\FlowMemory\flowmemory-dashboard`. - - Owns: dashboard fixture adapter/generator, UI proof that generated Rootflow/Flow Memory objects render correctly, dashboard tests. + - Owns: visual polish, better filtering, generated object inspection, no live API claims. ## Current Recommendation -Do not call Rootflow V0 and Flow Memory V0 complete yet. The separate building blocks are now merged and locally verified; the next job is integration, schema validation, generated dashboard state, and CI. +Treat Rootflow V0 and Flow Memory V0 as locally integrated and fixture-complete. Keep production claims blocked until separate live indexing, deployment, proof, verifier-network, and chain decisions are made. diff --git a/fixtures/dashboard/flowmemory-dashboard-v0.json b/fixtures/dashboard/flowmemory-dashboard-v0.json index dcd99f4b..f84df74f 100644 --- a/fixtures/dashboard/flowmemory-dashboard-v0.json +++ b/fixtures/dashboard/flowmemory-dashboard-v0.json @@ -1,32 +1,32 @@ { "metadata": { "schema": "flowmemory.dashboard.fixture.v0", - "generatedAt": "2026-05-13T16:00:00.000Z", + "generatedAt": "2026-05-13T17:02:00.000Z", "mode": "fixture", - "description": "Synthetic local FlowMemory Dashboard V0 fixture. Values are operator/explorer test vectors only and do not claim live production data.", + "description": "Generated local FlowMemory Dashboard V0 fixture from services, local devnet, and hardware POC outputs. It does not claim live production data.", "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", "runtimeDataPath": "apps/dashboard/public/data/flowmemory-dashboard-v0.json", "futureGeneratedPaths": { - "indexer": "fixtures/dashboard/generated/indexer-state.json", - "verifier": "fixtures/dashboard/generated/verifier-reports.json", - "devnet": "fixtures/dashboard/generated/devnet-state.json", - "hardware": "fixtures/dashboard/generated/hardware-heartbeats.json" + "indexer": "services/indexer/out/indexer-state.json", + "verifier": "services/verifier/out/reports.json", + "devnet": "fixtures/launch-core/generated/devnet/state.json", + "hardware": "hardware/fixtures/flowrouter_sample_seed42.json" } }, "chain": { - "chainId": "31337", - "name": "Anvil local FlowMemory devnet", + "chainId": "8453", + "name": "FlowMemory local V0 fixture stack", "environment": "local-devnet", - "settlementContext": "Base-first project path; this fixture is not Base mainnet or Base Sepolia data.", - "currentBlock": 123482, - "finalizedBlock": 123450, + "settlementContext": "Base-native fixture observations plus no-value local devnet handoff; not Base mainnet production data.", + "currentBlock": 123461, + "finalizedBlock": 123457, "source": "fixture", - "lastUpdated": "2026-05-13T15:58:42.000Z" + "lastUpdated": "2026-05-13T17:02:00.000Z" }, "flowPulseObservations": [ { - "id": "0x9717b7bad57bd0fa089e672e75cede4ae0bf3c86321dc0525ba00e9e0cc2da91", - "observationId": "0x9717b7bad57bd0fa089e672e75cede4ae0bf3c86321dc0525ba00e9e0cc2da91", + "id": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", @@ -42,760 +42,1602 @@ "commitment": "0x4122209ff672fc04b2ec3af31ab1af79813971f86de000aa6534038cc79de6b5", "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", "sequence": "1", - "occurredAt": "2026-05-13T14:30:00.000Z", + "occurredAt": "2026-05-13T02:40:00.000Z", "uri": "ipfs://bafy-flowmemory-example", - "summary": "Rootfield registration observed from fixture receipt log.", + "summary": "rootfield registration from generated indexer output", "status": "finalized", - "lastUpdated": "2026-05-13T15:51:00.000Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:51:00.000Z", - "localPathHint": "services/indexer/fixtures/flowpulse-logs.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" } }, { - "id": "0x2ad24d8e9df0a17f1f6a6427c1ea3b401dc2f16d9a5bb64c3c96206cb3f5e712", - "observationId": "0x2ad24d8e9df0a17f1f6a6427c1ea3b401dc2f16d9a5bb64c3c96206cb3f5e712", - "pulseId": "0xa3f9000000000000000000000000000000000000000000000000000000000112", + "id": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab001", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", - "blockNumber": "123468", - "blockHash": "0x2468246824682468246824682468246824682468246824682468246824682468", - "txHash": "0x5301530153015301530153015301530153015301530153015301530153015301", - "transactionIndex": "3", - "logIndex": "0", + "blockNumber": "123457", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222223", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333334", + "transactionIndex": "8", + "logIndex": "3", "receiptStatus": "success", - "actor": "0x5555555555555555555555555555555555555555", + "actor": "0x4444444444444444444444444444444444444444", "pulseType": "2", - "subject": "0x6f6d65706174682d726f6f742d303030303030303030303030303030303031", - "commitment": "0x81d30d3de2b29b44f23745289dbf214026ed1789983ff7aac135d74531402031", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "sequence": "2", - "occurredAt": "2026-05-13T14:42:25.000Z", - "uri": "file://fixtures/rootfields/omega-path/root-0001.json", - "summary": "Root commitment finalized after local block threshold.", + "occurredAt": "2026-05-13T02:41:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment from generated indexer output", "status": "finalized", - "lastUpdated": "2026-05-13T15:53:12.000Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:53:12.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" } }, { - "id": "0x82a7c8ef9931b361451efc99d932f615e251b3320ac395545971fe2e64fd14ca", - "observationId": "0x82a7c8ef9931b361451efc99d932f615e251b3320ac395545971fe2e64fd14ca", - "pulseId": "0xa3f9000000000000000000000000000000000000000000000000000000000113", + "id": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", - "blockNumber": "123481", - "blockHash": "0x9595959595959595959595959595959595959595959595959595959595959595", - "txHash": "0x6060606060606060606060606060606060606060606060606060606060606060", - "transactionIndex": "1", - "logIndex": "1", + "blockNumber": "123456", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222222", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "transactionIndex": "7", + "logIndex": "2", "receiptStatus": "success", - "actor": "0x5555555555555555555555555555555555555555", - "pulseType": "2", - "subject": "0x6f6d65706174682d726f6f742d303030303030303030303030303030303032", - "commitment": "0x61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff61ff", - "parentPulseId": "0xa3f9000000000000000000000000000000000000000000000000000000000112", - "sequence": "3", - "occurredAt": "2026-05-13T15:55:28.000Z", - "uri": "file://fixtures/rootfields/omega-path/root-0002.json", - "summary": "Recent root commitment observed below finality threshold.", - "status": "observed", - "lastUpdated": "2026-05-13T15:56:02.000Z", + "actor": "0x4444444444444444444444444444444444444444", + "pulseType": "1", + "subject": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "commitment": "0x4122209ff672fc04b2ec3af31ab1af79813971f86de000aa6534038cc79de6b5", + "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sequence": "1", + "occurredAt": "2026-05-13T02:40:00.000Z", + "uri": "ipfs://bafy-flowmemory-example", + "summary": "rootfield registration from generated indexer output", + "status": "finalized", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:56:02.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" } }, { - "id": "0x7d7c7b7a797877767574737271706f6e6d6c6b6a696867666564636261605f5e", - "observationId": "0x7d7c7b7a797877767574737271706f6e6d6c6b6a696867666564636261605f5e", - "pulseId": "0xc0ffee0000000000000000000000000000000000000000000000000000000417", - "rootfieldId": "0xdededededededededededededededededededededededededededededededede", + "id": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab002", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", - "blockNumber": "123449", - "blockHash": "0x1717171717171717171717171717171717171717171717171717171717171717", - "txHash": "0x1818181818181818181818181818181818181818181818181818181818181818", + "blockNumber": "123458", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222224", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333335", "transactionIndex": "9", - "logIndex": "3", + "logIndex": "4", "receiptStatus": "success", - "actor": "0x9999999999999999999999999999999999999999", - "pulseType": "9", - "subject": "0xdededededededededededededededededededededededededededededededede", - "commitment": "0x9090909090909090909090909090909090909090909090909090909090909090", - "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", - "sequence": "1", - "occurredAt": "2026-05-13T13:12:14.000Z", - "uri": "file://fixtures/rootfields/unsupported-pulse.json", - "summary": "Unsupported pulse type preserved for verifier policy review.", - "status": "unsupported", - "lastUpdated": "2026-05-13T15:18:00.000Z", + "actor": "0x4444444444444444444444444444444444444444", + "pulseType": "2", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "2", + "occurredAt": "2026-05-13T02:41:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment from generated indexer output", + "status": "reorged", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:18:00.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" } }, { - "id": "0xabababababababababababababababababababababababababababababababab", - "observationId": "0xabababababababababababababababababababababababababababababababab", - "pulseId": "0xa3f90000000000000000000000000000000000000000000000000000000000ff", + "id": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab003", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", - "blockNumber": "123438", - "blockHash": "0xffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000", - "txHash": "0x4242424242424242424242424242424242424242424242424242424242424242", - "transactionIndex": "2", - "logIndex": "4", + "blockNumber": "123459", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222225", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333336", + "transactionIndex": "10", + "logIndex": "5", "receiptStatus": "success", - "actor": "0x5555555555555555555555555555555555555555", + "actor": "0x4444444444444444444444444444444444444444", "pulseType": "2", - "subject": "0x72656f72672d726f6f742d3030303030303030303030303030303030303030", - "commitment": "0xe5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5e5", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "sequence": "2", - "occurredAt": "2026-05-13T12:07:44.000Z", - "uri": "file://fixtures/rootfields/omega-path/reorged-root.json", - "summary": "Observation retained as noncanonical after local reorg fixture.", - "status": "reorged", - "lastUpdated": "2026-05-13T12:31:10.000Z", + "sequence": "3", + "occurredAt": "2026-05-13T02:42:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment from generated indexer output", + "status": "pending", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T12:31:10.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" } }, { - "id": "0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210", - "observationId": "0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210", - "pulseId": "0x1212121212121212121212121212121212121212121212121212121212121212", - "rootfieldId": "0x3434343434343434343434343434343434343434343434343434343434343434", + "id": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab004", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", - "blockNumber": "123482", - "blockHash": "0xa1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1", - "txHash": "0xb1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1b1", - "transactionIndex": "0", - "logIndex": "0", - "receiptStatus": "unknown", - "actor": "0x7777777777777777777777777777777777777777", + "blockNumber": "123460", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222226", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333337", + "transactionIndex": "11", + "logIndex": "6", + "receiptStatus": "success", + "actor": "0x4444444444444444444444444444444444444444", "pulseType": "2", - "subject": "0x70656e64696e672d726f6f742d3030303030303030303030303030303030", - "commitment": "0xcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcdcd", - "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", - "sequence": "0", - "occurredAt": "2026-05-13T15:58:20.000Z", - "uri": "file://fixtures/rootfields/pending-root.json", - "summary": "Pending candidate from local scan window before receipt finality.", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "4", + "occurredAt": "2026-05-13T02:43:00.000Z", + "uri": "fixture://missing-artifact", + "summary": "root commitment from generated indexer output", + "status": "pending", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" + } + }, + { + "id": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab005", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "eventSignature": "0x5d07190b9ae441b4d7b16259a48424acd451492b12f5f99a29f5bfd992c13e43", + "blockNumber": "123461", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222227", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333338", + "transactionIndex": "12", + "logIndex": "7", + "receiptStatus": "success", + "actor": "0x4444444444444444444444444444444444444444", + "pulseType": "99", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "5", + "occurredAt": "2026-05-13T02:44:00.000Z", + "uri": "fixture://unsupported", + "summary": "unsupported pulse from generated indexer output", "status": "pending", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/indexer/out/indexer-state.json" } } ], "rootfields": [ { - "id": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "id": "0x31cf738173ed06b94ab86b99f2337c348040e50086a2d2f1f83ff9b0960fdbe6", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "owner": "0x4444444444444444444444444444444444444444", - "schemaHash": "0xdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd", - "metadataHash": "0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee", - "latestRoot": "0x6f6d65706174682d726f6f742d303030303030303030303030303030303032", - "latestObservationId": "0x82a7c8ef9931b361451efc99d932f615e251b3320ac395545971fe2e64fd14ca", - "pulseCount": 4, - "workLaneIds": ["lane-indexer-a", "lane-verifier-a"], - "evidenceUri": "file://fixtures/rootfields/omega-path/", - "status": "finalized", - "lastUpdated": "2026-05-13T15:56:02.000Z", + "schemaHash": "0x4c9929a2e216b475bd5bb68ac234d74d70ceadfbb86a948a62535413118371a8", + "metadataHash": "0x32ae92d97373a790718b78a4bd0900e33c763de3c2cb43670f5d9b8a7ae7c8d1", + "latestRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "latestObservationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "pulseCount": 7, + "workLaneIds": [ + "MEMORY_REFRESH", + "FAILURE_DISCOVERY", + "FAILURE_REPAIR", + "EVAL_COUNTEREXAMPLE" + ], + "evidenceUri": "fixture://launch-core/rootfield-bundle", + "status": "observed", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "contracts", + "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:56:02.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } - }, + } + ], + "workLanes": [ { - "id": "0xdededededededededededededededededededededededededededededededede", - "rootfieldId": "0xdededededededededededededededededededededededededededededededede", - "owner": "0x9999999999999999999999999999999999999999", - "schemaHash": "0x1919191919191919191919191919191919191919191919191919191919191919", - "metadataHash": "0x2929292929292929292929292929292929292929292929292929292929292929", - "latestRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "latestObservationId": "0x7d7c7b7a797877767574737271706f6e6d6c6b6a696867666564636261605f5e", - "pulseCount": 1, - "workLaneIds": ["lane-verifier-b"], - "evidenceUri": "file://fixtures/rootfields/unsupported/", - "status": "stale", - "lastUpdated": "2026-05-13T15:18:00.000Z", + "id": "MEMORY_REFRESH", + "laneId": "MEMORY_REFRESH", + "name": "Memory refresh", + "queueDepth": 1, + "inflight": 0, + "completed24h": 3, + "p95LatencyMs": 640, + "operator": "fixture-worker", + "status": "pending", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "contracts", + "subsystem": "worker", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:18:00.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } }, { - "id": "0x3434343434343434343434343434343434343434343434343434343434343434", - "rootfieldId": "0x3434343434343434343434343434343434343434343434343434343434343434", - "owner": "0x7777777777777777777777777777777777777777", - "schemaHash": "0x3838383838383838383838383838383838383838383838383838383838383838", - "metadataHash": "0x3939393939393939393939393939393939393939393939393939393939393939", - "latestRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "latestObservationId": "0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210", - "pulseCount": 0, - "workLaneIds": ["lane-indexer-a"], - "evidenceUri": "file://fixtures/rootfields/pending-root.json", - "status": "pending", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "id": "FAILURE_REPAIR", + "laneId": "FAILURE_REPAIR", + "name": "Failure repair", + "queueDepth": 1, + "inflight": 0, + "completed24h": 0, + "p95LatencyMs": 920, + "operator": "fixture-worker", + "status": "failed", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "contracts", + "subsystem": "worker", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } } ], - "workLanes": [ + "workReceipts": [ { - "id": "lane-indexer-a", - "laneId": "lane-indexer-a", - "name": "Indexer receipt ingest", - "queueDepth": 3, - "inflight": 1, - "completed24h": 37, - "p95LatencyMs": 840, - "operator": "local-codex-fixture", - "status": "pending", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "id": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "receiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "laneId": "MEMORY_REFRESH", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "ipfs://bafy-flowmemory-example", + "startedAt": "2026-05-13T17:02:00.000Z", + "completedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "worker", + "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "lane-verifier-a", - "laneId": "lane-verifier-a", - "name": "Verifier policy v0", - "queueDepth": 1, - "inflight": 1, - "completed24h": 22, - "p95LatencyMs": 1280, - "operator": "local-codex-fixture", - "status": "observed", - "lastUpdated": "2026-05-13T15:56:37.000Z", + "id": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "receiptId": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "laneId": "MEMORY_REFRESH", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "reportId": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "fixture://root-commit-valid", + "startedAt": "2026-05-13T17:02:00.000Z", + "completedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "worker", + "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:56:37.000Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "lane-verifier-b", - "laneId": "lane-verifier-b", - "name": "Unsupported pulse review", - "queueDepth": 0, - "inflight": 0, - "completed24h": 4, - "p95LatencyMs": 2120, - "operator": "local-codex-fixture", - "status": "stale", - "lastUpdated": "2026-05-13T15:19:05.000Z", + "id": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "receiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "laneId": "MEMORY_REFRESH", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "ipfs://bafy-flowmemory-example", + "startedAt": "2026-05-13T17:02:00.000Z", + "completedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "worker", + "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:19:05.000Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } - } - ], - "workReceipts": [ + }, { - "id": "0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f", - "receiptId": "0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f", - "laneId": "lane-verifier-a", - "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "observationId": "0x2ad24d8e9df0a17f1f6a6427c1ea3b401dc2f16d9a5bb64c3c96206cb3f5e712", - "reportId": "0x8080808080808080808080808080808080808080808080808080808080808080", - "workType": "verify-root-commitment", - "artifactUri": "file://fixtures/rootfields/omega-path/root-0001.json", - "startedAt": "2026-05-13T14:43:00.000Z", - "completedAt": "2026-05-13T14:43:01.120Z", - "resultHash": "0x7100710071007100710071007100710071007100710071007100710071007100", - "status": "verified", - "lastUpdated": "2026-05-13T14:43:01.120Z", + "id": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "receiptId": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "laneId": "MEMORY_REFRESH", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "reportId": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "fixture://missing-artifact", + "startedAt": "2026-05-13T17:02:00.000Z", + "completedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "status": "reorged", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "worker", + "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T14:43:01.120Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "0x0101010101010101010101010101010101010101010101010101010101010101", - "receiptId": "0x0101010101010101010101010101010101010101010101010101010101010101", - "laneId": "lane-indexer-a", - "rootfieldId": "0x3434343434343434343434343434343434343434343434343434343434343434", - "observationId": "0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210", - "workType": "scan-receipt-window", - "artifactUri": "file://fixtures/devnet/block-123482.json", - "startedAt": "2026-05-13T15:58:20.000Z", - "resultHash": "0x1111110000001111110000001111110000001111110000001111110000001111", - "status": "pending", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "id": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "receiptId": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "laneId": "FAILURE_REPAIR", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "reportId": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "fixture://root-commit-valid", + "startedAt": "2026-05-13T17:02:00.000Z", + "completedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "status": "failed", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "worker", + "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/indexer-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "0x5656565656565656565656565656565656565656565656565656565656565656", - "receiptId": "0x5656565656565656565656565656565656565656565656565656565656565656", - "laneId": "lane-verifier-a", + "id": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "receiptId": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "laneId": "MEMORY_REFRESH", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "observationId": "0x82a7c8ef9931b361451efc99d932f615e251b3320ac395545971fe2e64fd14ca", - "reportId": "0x5959595959595959595959595959595959595959595959595959595959595959", - "workType": "verify-root-commitment", - "artifactUri": "file://fixtures/rootfields/omega-path/root-0002.json", - "startedAt": "2026-05-13T15:56:04.000Z", - "completedAt": "2026-05-13T15:56:04.640Z", - "resultHash": "0x6161616161616161616161616161616161616161616161616161616161616161", - "status": "invalid", - "lastUpdated": "2026-05-13T15:56:04.640Z", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "reportId": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "fixture://missing-artifact", + "startedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "status": "unresolved", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "worker", + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + }, + { + "id": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "receiptId": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "laneId": "MEMORY_REFRESH", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "reportId": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "workType": "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + "artifactUri": "fixture://missing-artifact", + "startedAt": "2026-05-13T17:02:00.000Z", + "completedAt": "2026-05-13T17:02:00.000Z", + "resultHash": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "status": "unsupported", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:56:04.640Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } } ], "verifierReports": [ { - "id": "0xe0ac708c933782ef6797b3ab4b6550cdd1a993fb1170361e5e05641ab801e66e", - "reportId": "0xe0ac708c933782ef6797b3ab4b6550cdd1a993fb1170361e5e05641ab801e66e", - "observationId": "0x9717b7bad57bd0fa089e672e75cede4ae0bf3c86321dc0525ba00e9e0cc2da91", + "id": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", "checksPassed": 3, "checksTotal": 3, "reasonCodes": [], - "reportHash": "0xe0ac708c933782ef6797b3ab4b6550cdd1a993fb1170361e5e05641ab801e66e", + "reportHash": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", "status": "verified", - "lastUpdated": "2026-05-13T15:51:31.000Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:51:31.000Z", - "localPathHint": "services/verifier/fixtures/artifacts.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "0x8080808080808080808080808080808080808080808080808080808080808080", - "reportId": "0x8080808080808080808080808080808080808080808080808080808080808080", - "observationId": "0x2ad24d8e9df0a17f1f6a6427c1ea3b401dc2f16d9a5bb64c3c96206cb3f5e712", + "id": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "reportId": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", - "checksPassed": 4, - "checksTotal": 4, + "checksPassed": 3, + "checksTotal": 3, "reasonCodes": [], - "reportHash": "0x8080808080808080808080808080808080808080808080808080808080808080", + "reportHash": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", "status": "verified", - "lastUpdated": "2026-05-13T14:43:01.120Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T14:43:01.120Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "0x5959595959595959595959595959595959595959595959595959595959595959", - "reportId": "0x5959595959595959595959595959595959595959595959595959595959595959", - "observationId": "0x82a7c8ef9931b361451efc99d932f615e251b3320ac395545971fe2e64fd14ca", + "id": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", "checksPassed": 3, - "checksTotal": 4, - "reasonCodes": ["commitment.mismatch"], - "reportHash": "0x5959595959595959595959595959595959595959595959595959595959595959", - "status": "invalid", - "lastUpdated": "2026-05-13T15:56:04.640Z", + "checksTotal": 3, + "reasonCodes": [], + "reportHash": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:56:04.640Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "0x6464646464646464646464646464646464646464646464646464646464646464", - "reportId": "0x6464646464646464646464646464646464646464646464646464646464646464", - "observationId": "0x7d7c7b7a797877767574737271706f6e6d6c6b6a696867666564636261605f5e", - "rootfieldId": "0xdededededededededededededededededededededededededededededededede", + "id": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "reportId": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", "checksPassed": 1, "checksTotal": 1, - "reasonCodes": ["pulse.type.unsupported"], - "reportHash": "0x6464646464646464646464646464646464646464646464646464646464646464", + "reasonCodes": [ + "observation.reorged" + ], + "reportHash": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "status": "reorged", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + }, + { + "id": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "reportId": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 2, + "checksTotal": 3, + "reasonCodes": [ + "commitment.mismatch" + ], + "reportHash": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "status": "failed", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + }, + { + "id": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "reportId": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 1, + "checksTotal": 1, + "reasonCodes": [ + "artifact.unavailable" + ], + "reportHash": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "status": "unresolved", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + }, + { + "id": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "reportId": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 1, + "checksTotal": 1, + "reasonCodes": [ + "pulse.type.unsupported" + ], + "reportHash": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "status": "unsupported", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + } + ], + "rootflowTransitions": [ + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentTransitionId": null, + "memorySignalId": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "memoryReceiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "previousRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "attemptedRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nextRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "status": "verified", + "blockNumber": "123456", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "sequence": "1", + "reasonCodes": [], + "id": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/rootflow-transitions.json" + } + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x5cdf7f5498350650adc19c62828425723a09bcca6571774992ca2d013fdc1068", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab001", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "memoryReceiptId": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "reportId": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "previousRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "verified", + "blockNumber": "123457", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333334", + "sequence": "2", + "reasonCodes": [], + "id": "0x5cdf7f5498350650adc19c62828425723a09bcca6571774992ca2d013fdc1068", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/rootflow-transitions.json" + } + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0xe1b6f858279961c968cdfba0b85d489767c486289e824cab3d017997064fed89", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab002", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "memoryReceiptId": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "reportId": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "reorged", + "blockNumber": "123458", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333335", + "sequence": "2", + "reasonCodes": [ + "observation.reorged" + ], + "id": "0xe1b6f858279961c968cdfba0b85d489767c486289e824cab3d017997064fed89", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/rootflow-transitions.json" + } + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x35db5f8c36e2bc988c4d60f25a2e60d971256bdfdb79a73c92c0b82a41e5a367", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab003", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "memoryReceiptId": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "reportId": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "failed", + "blockNumber": "123459", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333336", + "sequence": "3", + "reasonCodes": [ + "commitment.mismatch" + ], + "id": "0x35db5f8c36e2bc988c4d60f25a2e60d971256bdfdb79a73c92c0b82a41e5a367", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/rootflow-transitions.json" + } + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x31d44377aa98e7fcaa07110256e1600249c4337c69e6d06c14d36e6aad6a79c4", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab004", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "memoryReceiptId": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "reportId": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "unresolved", + "blockNumber": "123460", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333337", + "sequence": "4", + "reasonCodes": [ + "artifact.unavailable" + ], + "id": "0x31d44377aa98e7fcaa07110256e1600249c4337c69e6d06c14d36e6aad6a79c4", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/rootflow-transitions.json" + } + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab005", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5", + "memoryReceiptId": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "reportId": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "unsupported", + "blockNumber": "123461", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333338", + "sequence": "5", + "reasonCodes": [ + "pulse.type.unsupported" + ], + "id": "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/rootflow-transitions.json" + } + } + ], + "memorySignals": [ + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "rootfield_registration", + "status": "verified", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123456", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222222", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "transactionIndex": "7", + "logIndex": "2", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "commitment": "0x4122209ff672fc04b2ec3af31ab1af79813971f86de000aa6534038cc79de6b5", + "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sequence": "1", + "occurredAt": "2026-05-13T02:40:00.000Z", + "uri": "ipfs://bafy-flowmemory-example", + "summary": "rootfield registration pulse 1", + "id": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "rootfield_registration", + "status": "verified", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123456", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222222", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "transactionIndex": "7", + "logIndex": "2", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "commitment": "0x4122209ff672fc04b2ec3af31ab1af79813971f86de000aa6534038cc79de6b5", + "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sequence": "1", + "occurredAt": "2026-05-13T02:40:00.000Z", + "uri": "ipfs://bafy-flowmemory-example", + "summary": "rootfield registration pulse 1", + "id": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab001", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "root_commitment", + "status": "verified", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123457", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222223", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333334", + "transactionIndex": "8", + "logIndex": "3", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "2", + "occurredAt": "2026-05-13T02:41:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment pulse 2", + "id": "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab002", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "root_commitment", + "status": "reorged", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123458", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222224", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333335", + "transactionIndex": "9", + "logIndex": "4", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "2", + "occurredAt": "2026-05-13T02:41:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment pulse 2", + "id": "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab003", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "root_commitment", + "status": "failed", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123459", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222225", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333336", + "transactionIndex": "10", + "logIndex": "5", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "3", + "occurredAt": "2026-05-13T02:42:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment pulse 3", + "id": "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab004", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "root_commitment", + "status": "unresolved", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123460", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222226", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333337", + "transactionIndex": "11", + "logIndex": "6", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "4", + "occurredAt": "2026-05-13T02:43:00.000Z", + "uri": "fixture://missing-artifact", + "summary": "root commitment pulse 4", + "id": "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab005", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "unsupported_pulse", "status": "unsupported", - "lastUpdated": "2026-05-13T15:18:11.000Z", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123461", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222227", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333338", + "transactionIndex": "12", + "logIndex": "7", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "5", + "occurredAt": "2026-05-13T02:44:00.000Z", + "uri": "fixture://unsupported", + "summary": "unsupported pulse pulse 5", + "id": "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "indexer", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + } + ], + "memoryReceipts": [ + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "reportDigest": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "valid", + "flowMemoryStatus": "verified", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 3, + "checksTotal": 3, + "reasonCodes": [], + "evidenceRefs": [ + { + "kind": "rootfield-registration", + "uri": "ipfs://bafy-flowmemory-example" + } + ], + "id": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:18:11.000Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } }, { - "id": "0x7373737373737373737373737373737373737373737373737373737373737373", - "reportId": "0x7373737373737373737373737373737373737373737373737373737373737373", - "observationId": "0xabababababababababababababababababababababababababababababababab", + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "reportId": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "reportDigest": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "valid", + "flowMemoryStatus": "verified", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 3, + "checksTotal": 3, + "reasonCodes": [], + "evidenceRefs": [ + { + "kind": "root-commitment", + "uri": "fixture://root-commit-valid" + } + ], + "id": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "reportDigest": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "valid", + "flowMemoryStatus": "verified", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 3, + "checksTotal": 3, + "reasonCodes": [], + "evidenceRefs": [ + { + "kind": "rootfield-registration", + "uri": "ipfs://bafy-flowmemory-example" + } + ], + "id": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "status": "verified", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "reportId": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "reportDigest": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "reorged", + "flowMemoryStatus": "reorged", "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", "checksPassed": 1, "checksTotal": 1, - "reasonCodes": ["observation.reorged"], - "reportHash": "0x7373737373737373737373737373737373737373737373737373737373737373", + "reasonCodes": [ + "observation.reorged" + ], + "evidenceRefs": [], + "id": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", "status": "reorged", - "lastUpdated": "2026-05-13T12:31:15.000Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T12:31:15.000Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } }, { - "id": "0x7474747474747474747474747474747474747474747474747474747474747474", - "reportId": "0x7474747474747474747474747474747474747474747474747474747474747474", - "observationId": "0xfedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210", - "rootfieldId": "0x3434343434343434343434343434343434343434343434343434343434343434", + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "reportId": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "reportDigest": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "invalid", + "flowMemoryStatus": "failed", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 2, + "checksTotal": 3, + "reasonCodes": [ + "commitment.mismatch" + ], + "evidenceRefs": [ + { + "kind": "root-commitment", + "uri": "fixture://root-commit-valid" + } + ], + "id": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "status": "failed", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "verifier", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" + } + }, + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "reportId": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "reportDigest": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "unresolved", + "flowMemoryStatus": "unresolved", "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", "checksPassed": 1, - "checksTotal": 2, - "reasonCodes": ["artifact.unavailable"], - "reportHash": "0x7474747474747474747474747474747474747474747474747474747474747474", + "checksTotal": 1, + "reasonCodes": [ + "artifact.unavailable" + ], + "evidenceRefs": [], + "id": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", "status": "unresolved", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } }, { - "id": "0x7575757575757575757575757575757575757575757575757575757575757575", - "reportId": "0x7575757575757575757575757575757575757575757575757575757575757575", - "observationId": "0x2ad24d8e9df0a17f1f6a6427c1ea3b401dc2f16d9a5bb64c3c96206cb3f5e712", + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "reportId": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "reportDigest": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", - "resolverPolicyId": "flowmemory.resolver.policy.v0.previous-fixture", + "verifierStatus": "unsupported", + "flowMemoryStatus": "unsupported", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", "verifierSpecVersion": "0", - "checksPassed": 2, - "checksTotal": 4, - "reasonCodes": ["report.stale_policy"], - "reportHash": "0x7575757575757575757575757575757575757575757575757575757575757575", - "status": "stale", - "lastUpdated": "2026-05-13T14:12:00.000Z", + "checksPassed": 1, + "checksTotal": 1, + "reasonCodes": [ + "pulse.type.unsupported" + ], + "evidenceRefs": [], + "id": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "status": "unsupported", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "verifier", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T14:12:00.000Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } } ], - "devnetBlocks": [ + "rootfieldBundles": [ { - "id": "0x1717171717171717171717171717171717171717171717171717171717171717", - "blockNumber": 123449, - "blockHash": "0x1717171717171717171717171717171717171717171717171717171717171717", - "parentHash": "0x1616161616161616161616161616161616161616161616161616161616161616", - "stateRoot": "0x5050505050505050505050505050505050505050505050505050505050505050", - "receiptsRoot": "0x5151515151515151515151515151515151515151515151515151515151515151", - "timestamp": "2026-05-13T13:12:14.000Z", - "observationCount": 1, - "reportCount": 1, - "finalityDistance": 33, - "status": "finalized", - "lastUpdated": "2026-05-13T15:45:00.000Z", + "schema": "flowmemory.rootfield_bundle.v0", + "bundleId": "0x31cf738173ed06b94ab86b99f2337c348040e50086a2d2f1f83ff9b0960fdbe6", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "latestRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "latestTransitionId": "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf", + "status": "unsupported", + "transitionIds": [ + "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "0x5cdf7f5498350650adc19c62828425723a09bcca6571774992ca2d013fdc1068", + "0xe1b6f858279961c968cdfba0b85d489767c486289e824cab3d017997064fed89", + "0x35db5f8c36e2bc988c4d60f25a2e60d971256bdfdb79a73c92c0b82a41e5a367", + "0x31d44377aa98e7fcaa07110256e1600249c4337c69e6d06c14d36e6aad6a79c4", + "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf" + ], + "memorySignalIds": [ + "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5" + ], + "memoryReceiptIds": [ + "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b" + ], + "verifierReportIds": [ + "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5" + ], + "counts": { + "observations": 7, + "transitions": 6, + "receipts": 7, + "verified": 2, + "failed": 1, + "unresolved": 1, + "unsupported": 1, + "reorged": 1 + }, + "id": "0x31cf738173ed06b94ab86b99f2337c348040e50086a2d2f1f83ff9b0960fdbe6", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "devnet", + "subsystem": "indexer", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:45:00.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } - }, + } + ], + "agentMemoryViews": [ { - "id": "0x2468246824682468246824682468246824682468246824682468246824682468", - "blockNumber": 123468, - "blockHash": "0x2468246824682468246824682468246824682468246824682468246824682468", - "parentHash": "0x2358235823582358235823582358235823582358235823582358235823582358", - "stateRoot": "0x6262626262626262626262626262626262626262626262626262626262626262", - "receiptsRoot": "0x6363636363636363636363636363636363636363636363636363636363636363", - "timestamp": "2026-05-13T14:42:25.000Z", - "observationCount": 1, - "reportCount": 1, - "finalityDistance": 14, - "status": "finalized", - "lastUpdated": "2026-05-13T15:45:00.000Z", + "schema": "flowmemory.agent_memory_view.v0", + "viewId": "0x1e3338d7189316aee886546da7dcb6b92601b573086fbb823f89c852245e4355", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "status": "unsupported", + "latestRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "latestTransitionId": "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf", + "signalIds": [ + "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5" + ], + "receiptIds": [ + "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b" + ], + "transitionIds": [ + "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "0x5cdf7f5498350650adc19c62828425723a09bcca6571774992ca2d013fdc1068", + "0xe1b6f858279961c968cdfba0b85d489767c486289e824cab3d017997064fed89", + "0x35db5f8c36e2bc988c4d60f25a2e60d971256bdfdb79a73c92c0b82a41e5a367", + "0x31d44377aa98e7fcaa07110256e1600249c4337c69e6d06c14d36e6aad6a79c4", + "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf" + ], + "warnings": [ + "1 failed transition(s)", + "1 unresolved receipt(s)", + "1 reorged observation(s)", + "1 unsupported pulse(s)" + ], + "localOnly": true, + "id": "0x1e3338d7189316aee886546da7dcb6b92601b573086fbb823f89c852245e4355", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { - "subsystem": "devnet", + "subsystem": "worker", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:45:00.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/flowmemory-launch-v0.json" } - }, + } + ], + "devnetBlocks": [ { - "id": "0x9595959595959595959595959595959595959595959595959595959595959595", - "blockNumber": 123481, - "blockHash": "0x9595959595959595959595959595959595959595959595959595959595959595", - "parentHash": "0x9494949494949494949494949494949494949494949494949494949494949494", - "stateRoot": "0x7070707070707070707070707070707070707070707070707070707070707070", - "receiptsRoot": "0x7171717171717171717171717171717171717171717171717171717171717171", - "timestamp": "2026-05-13T15:55:28.000Z", - "observationCount": 1, - "reportCount": 1, - "finalityDistance": 1, - "status": "pending", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "id": "0xf76ac3652230cae4a4b5afcd54b0dcec9219f20ad71e21c497264668fb30f235", + "blockNumber": 1, + "blockHash": "0xf76ac3652230cae4a4b5afcd54b0dcec9219f20ad71e21c497264668fb30f235", + "parentHash": "0x0f23c892cbd2d00c10839d97ddab833698a83f8df8d6df27ceac03cfdd4b7bc9", + "stateRoot": "0x76ec5260c34184b6bb54ca406a43fc1f9591a47f37f71583a7620ef4a4065aff", + "receiptsRoot": "0x6962bd6dbf28c2361c1337c1d33d678a815cc4b961e0e50db5ccb401cc0fe076", + "timestamp": "2026-05-13T16:00:00.000Z", + "observationCount": 7, + "reportCount": 7, + "finalityDistance": 123460, + "status": "stale", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "devnet", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/generated/devnet/state.json" } }, { - "id": "0xffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000", - "blockNumber": 123438, - "blockHash": "0xffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000", - "parentHash": "0x4343434343434343434343434343434343434343434343434343434343434343", - "stateRoot": "0x8888000088880000888800008888000088880000888800008888000088880000", - "receiptsRoot": "0x9999000099990000999900009999000099990000999900009999000099990000", - "timestamp": "2026-05-13T12:07:44.000Z", - "observationCount": 1, - "reportCount": 1, - "finalityDistance": 0, - "status": "reorged", - "lastUpdated": "2026-05-13T12:31:10.000Z", + "id": "0x7515374a9b020a6d271820031738a5190cb0fc374adcd74a88a32c0fd0d5c7a6", + "blockNumber": 2, + "blockHash": "0x7515374a9b020a6d271820031738a5190cb0fc374adcd74a88a32c0fd0d5c7a6", + "parentHash": "0xf76ac3652230cae4a4b5afcd54b0dcec9219f20ad71e21c497264668fb30f235", + "stateRoot": "0x3e1f5fddd84f9d460ee30a380ff700b17611891b8c03eb320edf1baefe003ef9", + "receiptsRoot": "0xa0407b9a8a55106d549e0f19b92fceaa7f7a25697e94ebf8a1fa74af7b9168f4", + "timestamp": "2026-05-13T16:00:01.000Z", + "observationCount": 7, + "reportCount": 7, + "finalityDistance": 123459, + "status": "finalized", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "devnet", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T12:31:10.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "fixtures/launch-core/generated/devnet/state.json" } } ], "hardwareNodes": [ { - "id": "fm-node-lab-01", - "nodeId": "fm-node-lab-01", - "callsign": "Lab Gateway 01", - "role": "gateway", - "firmware": "flowrouter-v0.1.0-fixture", - "transport": "ethernet + meshtastic sidecar", - "lastHeartbeatAt": "2026-05-13T15:57:58.000Z", + "id": "fr-e1e7878a2aa8", + "nodeId": "fr-e1e7878a2aa8", + "callsign": "FlowRouter kit", + "role": "router", + "firmware": "flowrouter.poc.v0", + "transport": "local-wifi+meshtastic-sidecar-sim", + "lastHeartbeatAt": "2026-05-13T17:00:10Z", "batteryPercent": 100, - "signalDbm": -51, - "temperatureC": 39, - "linkedWorkLaneId": "lane-indexer-a", - "locationHint": "bench-east", - "status": "observed", - "lastUpdated": "2026-05-13T15:58:42.000Z", + "signalDbm": -61, + "temperatureC": 37, + "linkedWorkLaneId": "CHECKPOINT_STORAGE", + "locationHint": "local lab fixture", + "status": "verified", "provenance": { "subsystem": "hardware", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:58:42.000Z", - "localPathHint": "fixtures/dashboard/generated/hardware-heartbeats.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "hardware/fixtures/flowrouter_sample_seed42.json" } }, { - "id": "fm-node-router-03", - "nodeId": "fm-node-router-03", - "callsign": "Router Shelf 03", - "role": "router", - "firmware": "flowrouter-v0.1.0-fixture", - "transport": "wifi + lora control", - "lastHeartbeatAt": "2026-05-13T15:11:08.000Z", - "batteryPercent": 72, - "signalDbm": -88, - "temperatureC": 44, - "linkedWorkLaneId": "lane-verifier-b", - "locationHint": "workshop-shelf", - "status": "stale", - "lastUpdated": "2026-05-13T15:11:08.000Z", + "id": "gw-82a524067b14", + "nodeId": "gw-82a524067b14", + "callsign": "Gateway relay", + "role": "gateway", + "firmware": "gateway-discovery-fixture", + "transport": "LAN gateway sim", + "lastHeartbeatAt": "2026-05-13T17:01:00Z", + "linkedWorkLaneId": "CHECKPOINT_STORAGE", + "locationHint": "derived from gateway discovery packet", + "status": "offline", "provenance": { "subsystem": "hardware", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:11:08.000Z", - "localPathHint": "fixtures/dashboard/generated/hardware-heartbeats.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "hardware/fixtures/flowrouter_sample_seed42.json" } }, { - "id": "fm-node-field-07", - "nodeId": "fm-node-field-07", - "callsign": "Field Kit 07", - "role": "field-kit", - "firmware": "flowrouter-v0.1.0-fixture", - "transport": "meshtastic control only", - "locationHint": "packed-case", - "status": "offline", - "lastUpdated": "2026-05-13T14:20:00.000Z", + "id": "fr-e1e7878a2aa8-sidecar", + "nodeId": "fr-e1e7878a2aa8-sidecar", + "callsign": "LoRa sidecar", + "role": "sidecar", + "firmware": "meshtastic-sidecar-fixture", + "transport": "LoRa advisory sim", + "lastHeartbeatAt": "2026-05-13T17:01:10Z", + "signalDbm": -84, + "linkedWorkLaneId": "FAILURE_DISCOVERY", + "locationHint": "derived from sidecar status packet", + "status": "stale", "provenance": { "subsystem": "hardware", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T14:20:00.000Z", - "localPathHint": "fixtures/dashboard/generated/hardware-heartbeats.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "hardware/fixtures/flowrouter_sample_seed42.json" } } ], "alerts": [ { - "id": "incident-2026-05-13-001", - "incidentId": "incident-2026-05-13-001", + "id": "0x9861a651cf69f0d9433fe8ee9f5a045311acd8e40caf27bf95e956dceb326666", + "incidentId": "0x9861a651cf69f0d9433fe8ee9f5a045311acd8e40caf27bf95e956dceb326666", + "severity": "warning", + "title": "Verifier reorged", + "summary": "observation.reorged", + "openedAt": "2026-05-13T17:02:00.000Z", + "linkedObjectIds": [ + "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1" + ], + "recommendedAction": "Inspect generated Flow Memory receipt and source verifier report.", + "status": "reorged", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "alerts", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + }, + { + "id": "0xc3fcc8b746337d1e72daff6f878e40367217e7ef3e7a6ce858b718182a6f6344", + "incidentId": "0xc3fcc8b746337d1e72daff6f878e40367217e7ef3e7a6ce858b718182a6f6344", "severity": "critical", - "title": "Verifier commitment mismatch", - "summary": "Report 0x5959 records a deterministic commitment mismatch for the latest omega-path root fixture.", - "openedAt": "2026-05-13T15:56:04.640Z", + "title": "Verifier failed", + "summary": "commitment.mismatch", + "openedAt": "2026-05-13T17:02:00.000Z", + "linkedObjectIds": [ + "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb" + ], + "recommendedAction": "Inspect generated Flow Memory receipt and source verifier report.", + "status": "failed", + "lastUpdated": "2026-05-13T17:02:00.000Z", + "provenance": { + "subsystem": "alerts", + "origin": "fixture", + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" + } + }, + { + "id": "0x3f925cb1671b4c1d78ad89eba7eae15c6a25c4c9bfb798dcbcc8d51b526987cc", + "incidentId": "0x3f925cb1671b4c1d78ad89eba7eae15c6a25c4c9bfb798dcbcc8d51b526987cc", + "severity": "warning", + "title": "Verifier unresolved", + "summary": "artifact.unavailable", + "openedAt": "2026-05-13T17:02:00.000Z", "linkedObjectIds": [ - "0x82a7c8ef9931b361451efc99d932f615e251b3320ac395545971fe2e64fd14ca", - "0x5959595959595959595959595959595959595959595959595959595959595959" + "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294" ], - "recommendedAction": "Compare the generated root artifact with the emitted commitment before promoting this fixture to verified.", + "recommendedAction": "Inspect generated Flow Memory receipt and source verifier report.", "status": "unresolved", - "lastUpdated": "2026-05-13T15:56:04.640Z", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "alerts", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:56:04.640Z", - "localPathHint": "fixtures/dashboard/generated/verifier-reports.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "incident-2026-05-13-002", - "incidentId": "incident-2026-05-13-002", + "id": "0x0cd26432c17ef891819487fa9e1475acf28e6e0d9dd62bc4018a495b1d352277", + "incidentId": "0x0cd26432c17ef891819487fa9e1475acf28e6e0d9dd62bc4018a495b1d352277", "severity": "warning", - "title": "Hardware heartbeat stale", - "summary": "Router Shelf 03 has not reported a fresh heartbeat inside the fixture freshness window.", - "openedAt": "2026-05-13T15:41:00.000Z", - "linkedObjectIds": ["fm-node-router-03", "lane-verifier-b"], - "recommendedAction": "Check local power and radio sidecar telemetry before assigning verifier work to the node.", - "status": "stale", - "lastUpdated": "2026-05-13T15:41:00.000Z", + "title": "Verifier unsupported", + "summary": "pulse.type.unsupported", + "openedAt": "2026-05-13T17:02:00.000Z", + "linkedObjectIds": [ + "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5" + ], + "recommendedAction": "Inspect generated Flow Memory receipt and source verifier report.", + "status": "unsupported", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "alerts", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T15:41:00.000Z", - "localPathHint": "fixtures/dashboard/generated/hardware-heartbeats.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "services/verifier/out/reports.json" } }, { - "id": "incident-2026-05-13-003", - "incidentId": "incident-2026-05-13-003", - "severity": "info", - "title": "Reorg replacement recorded", - "summary": "A noncanonical block and observation remain in the fixture so the explorer can show reorg history.", - "openedAt": "2026-05-13T12:31:10.000Z", + "id": "0x6922f2ea8414c7236d60986de1a4e0ce0981f3426fb419d1b65ba1e5caebf2b6", + "incidentId": "0x6922f2ea8414c7236d60986de1a4e0ce0981f3426fb419d1b65ba1e5caebf2b6", + "severity": "warning", + "title": "UPSTREAM_LOSS", + "summary": "Upstream unavailable; LAN dashboard and local cache still reachable.", + "openedAt": "2026-05-13T17:01:30Z", "linkedObjectIds": [ - "0xffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000ffff0000", - "0xabababababababababababababababababababababababababababababababab" + "fr-e1e7878a2aa8" ], - "recommendedAction": "Keep the reorged records visible, but exclude them from current verified root summaries.", - "status": "verified", - "lastUpdated": "2026-05-13T13:02:00.000Z", + "recommendedAction": "check-upstream-and-power", + "status": "unresolved", + "lastUpdated": "2026-05-13T17:02:00.000Z", "provenance": { "subsystem": "alerts", "origin": "fixture", - "chainContext": "anvil-31337", - "fixturePath": "fixtures/dashboard/flowmemory-dashboard-v0.json", - "capturedAt": "2026-05-13T13:02:00.000Z", - "localPathHint": "fixtures/dashboard/generated/devnet-state.json" + "chainContext": "flowmemory-local-v0", + "fixturePath": "fixtures/launch-core/flowmemory-launch-v0.json", + "capturedAt": "2026-05-13T17:02:00.000Z", + "localPathHint": "hardware/fixtures/flowrouter_sample_seed42.json" } } ] diff --git a/fixtures/launch-core/flowmemory-launch-v0.json b/fixtures/launch-core/flowmemory-launch-v0.json new file mode 100644 index 00000000..08172325 --- /dev/null +++ b/fixtures/launch-core/flowmemory-launch-v0.json @@ -0,0 +1,566 @@ +{ + "schema": "flowmemory.launch_core.v0", + "generatedAt": "2026-05-13T17:02:00.000Z", + "mode": "fixture", + "sourcePaths": { + "indexer": "services/indexer/out/indexer-state.json", + "verifier": "services/verifier/out/reports.json", + "devnet": "fixtures/launch-core/generated/devnet/state.json", + "hardware": "hardware/fixtures/flowrouter_sample_seed42.json" + }, + "statusAdapter": { + "valid": "verified", + "invalid": "failed", + "unresolved": "unresolved", + "unsupported": "unsupported", + "reorged": "reorged" + }, + "memorySignals": [ + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "rootfield_registration", + "status": "verified", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123456", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222222", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "transactionIndex": "7", + "logIndex": "2", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "commitment": "0x4122209ff672fc04b2ec3af31ab1af79813971f86de000aa6534038cc79de6b5", + "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sequence": "1", + "occurredAt": "2026-05-13T02:40:00.000Z", + "uri": "ipfs://bafy-flowmemory-example", + "summary": "rootfield registration pulse 1" + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "rootfield_registration", + "status": "verified", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123456", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222222", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "transactionIndex": "7", + "logIndex": "2", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "commitment": "0x4122209ff672fc04b2ec3af31ab1af79813971f86de000aa6534038cc79de6b5", + "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "sequence": "1", + "occurredAt": "2026-05-13T02:40:00.000Z", + "uri": "ipfs://bafy-flowmemory-example", + "summary": "rootfield registration pulse 1" + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab001", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "root_commitment", + "status": "verified", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123457", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222223", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333334", + "transactionIndex": "8", + "logIndex": "3", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "2", + "occurredAt": "2026-05-13T02:41:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment pulse 2" + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab002", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "root_commitment", + "status": "reorged", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123458", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222224", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333335", + "transactionIndex": "9", + "logIndex": "4", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "2", + "occurredAt": "2026-05-13T02:41:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment pulse 2" + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab003", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "root_commitment", + "status": "failed", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123459", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222225", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333336", + "transactionIndex": "10", + "logIndex": "5", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "3", + "occurredAt": "2026-05-13T02:42:00.000Z", + "uri": "fixture://root-commit-valid", + "summary": "root commitment pulse 3" + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab004", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "root_commitment", + "status": "unresolved", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123460", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222226", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333337", + "transactionIndex": "11", + "logIndex": "6", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "4", + "occurredAt": "2026-05-13T02:43:00.000Z", + "uri": "fixture://missing-artifact", + "summary": "root commitment pulse 4" + }, + { + "schema": "flowmemory.memory_signal.v0", + "signalId": "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab005", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "signalType": "unsupported_pulse", + "status": "unsupported", + "chainId": "8453", + "emittingContract": "0x1111111111111111111111111111111111111111", + "blockNumber": "123461", + "blockHash": "0x2222222222222222222222222222222222222222222222222222222222222227", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333338", + "transactionIndex": "12", + "logIndex": "7", + "actor": "0x4444444444444444444444444444444444444444", + "subject": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "commitment": "0x69a9f953179a6ce2e08724dd759fb71b08b0759a5900fc0399a753ecf0557df5", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "sequence": "5", + "occurredAt": "2026-05-13T02:44:00.000Z", + "uri": "fixture://unsupported", + "summary": "unsupported pulse pulse 5" + } + ], + "memoryReceipts": [ + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "reportDigest": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "valid", + "flowMemoryStatus": "verified", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 3, + "checksTotal": 3, + "reasonCodes": [], + "evidenceRefs": [ + { + "kind": "rootfield-registration", + "uri": "ipfs://bafy-flowmemory-example" + } + ] + }, + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "reportId": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "reportDigest": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "valid", + "flowMemoryStatus": "verified", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 3, + "checksTotal": 3, + "reasonCodes": [], + "evidenceRefs": [ + { + "kind": "root-commitment", + "uri": "fixture://root-commit-valid" + } + ] + }, + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "reportDigest": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "valid", + "flowMemoryStatus": "verified", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 3, + "checksTotal": 3, + "reasonCodes": [], + "evidenceRefs": [ + { + "kind": "rootfield-registration", + "uri": "ipfs://bafy-flowmemory-example" + } + ] + }, + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "reportId": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "reportDigest": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "reorged", + "flowMemoryStatus": "reorged", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 1, + "checksTotal": 1, + "reasonCodes": [ + "observation.reorged" + ], + "evidenceRefs": [] + }, + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "reportId": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "reportDigest": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "invalid", + "flowMemoryStatus": "failed", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 2, + "checksTotal": 3, + "reasonCodes": [ + "commitment.mismatch" + ], + "evidenceRefs": [ + { + "kind": "root-commitment", + "uri": "fixture://root-commit-valid" + } + ] + }, + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "reportId": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "reportDigest": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "unresolved", + "flowMemoryStatus": "unresolved", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 1, + "checksTotal": 1, + "reasonCodes": [ + "artifact.unavailable" + ], + "evidenceRefs": [] + }, + { + "schema": "flowmemory.memory_receipt.v0", + "receiptId": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "reportId": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "reportDigest": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "verifierStatus": "unsupported", + "flowMemoryStatus": "unsupported", + "resolverPolicyId": "flowmemory.resolver.policy.v0.fixture", + "verifierSpecVersion": "0", + "checksPassed": 1, + "checksTotal": 1, + "reasonCodes": [ + "pulse.type.unsupported" + ], + "evidenceRefs": [] + } + ], + "rootflowTransitions": [ + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentTransitionId": null, + "memorySignalId": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "memoryReceiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "previousRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "attemptedRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nextRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "status": "verified", + "blockNumber": "123456", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "sequence": "1", + "reasonCodes": [] + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x5cdf7f5498350650adc19c62828425723a09bcca6571774992ca2d013fdc1068", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab001", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "memoryReceiptId": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "reportId": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "previousRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "verified", + "blockNumber": "123457", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333334", + "sequence": "2", + "reasonCodes": [] + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0xe1b6f858279961c968cdfba0b85d489767c486289e824cab3d017997064fed89", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab002", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "memoryReceiptId": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "reportId": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "reorged", + "blockNumber": "123458", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333335", + "sequence": "2", + "reasonCodes": [ + "observation.reorged" + ] + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x35db5f8c36e2bc988c4d60f25a2e60d971256bdfdb79a73c92c0b82a41e5a367", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab003", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "memoryReceiptId": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "reportId": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "failed", + "blockNumber": "123459", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333336", + "sequence": "3", + "reasonCodes": [ + "commitment.mismatch" + ] + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x31d44377aa98e7fcaa07110256e1600249c4337c69e6d06c14d36e6aad6a79c4", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab004", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "memoryReceiptId": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "reportId": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "unresolved", + "blockNumber": "123460", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333337", + "sequence": "4", + "reasonCodes": [ + "artifact.unavailable" + ] + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab005", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5", + "memoryReceiptId": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "reportId": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "unsupported", + "blockNumber": "123461", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333338", + "sequence": "5", + "reasonCodes": [ + "pulse.type.unsupported" + ] + } + ], + "rootfieldBundles": [ + { + "schema": "flowmemory.rootfield_bundle.v0", + "bundleId": "0x31cf738173ed06b94ab86b99f2337c348040e50086a2d2f1f83ff9b0960fdbe6", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "latestRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "latestTransitionId": "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf", + "status": "unsupported", + "transitionIds": [ + "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "0x5cdf7f5498350650adc19c62828425723a09bcca6571774992ca2d013fdc1068", + "0xe1b6f858279961c968cdfba0b85d489767c486289e824cab3d017997064fed89", + "0x35db5f8c36e2bc988c4d60f25a2e60d971256bdfdb79a73c92c0b82a41e5a367", + "0x31d44377aa98e7fcaa07110256e1600249c4337c69e6d06c14d36e6aad6a79c4", + "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf" + ], + "memorySignalIds": [ + "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5" + ], + "memoryReceiptIds": [ + "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b" + ], + "verifierReportIds": [ + "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5" + ], + "counts": { + "observations": 7, + "transitions": 6, + "receipts": 7, + "verified": 2, + "failed": 1, + "unresolved": 1, + "unsupported": 1, + "reorged": 1 + } + } + ], + "agentMemoryViews": [ + { + "schema": "flowmemory.agent_memory_view.v0", + "viewId": "0x1e3338d7189316aee886546da7dcb6b92601b573086fbb823f89c852245e4355", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "status": "unsupported", + "latestRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "latestTransitionId": "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf", + "signalIds": [ + "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5" + ], + "receiptIds": [ + "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b" + ], + "transitionIds": [ + "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "0x5cdf7f5498350650adc19c62828425723a09bcca6571774992ca2d013fdc1068", + "0xe1b6f858279961c968cdfba0b85d489767c486289e824cab3d017997064fed89", + "0x35db5f8c36e2bc988c4d60f25a2e60d971256bdfdb79a73c92c0b82a41e5a367", + "0x31d44377aa98e7fcaa07110256e1600249c4337c69e6d06c14d36e6aad6a79c4", + "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf" + ], + "warnings": [ + "1 failed transition(s)", + "1 unresolved receipt(s)", + "1 reorged observation(s)", + "1 unsupported pulse(s)" + ], + "localOnly": true + } + ], + "acceptance": { + "loadedFlowPulses": 7, + "indexedObservations": 7, + "verifierReports": 7, + "rootflowTransitions": 6, + "dashboardFixtureGenerated": true, + "localOnly": true + } +} diff --git a/fixtures/launch-core/generated/devnet/dashboard-state.json b/fixtures/launch-core/generated/devnet/dashboard-state.json new file mode 100644 index 00000000..ef04135f --- /dev/null +++ b/fixtures/launch-core/generated/devnet/dashboard-state.json @@ -0,0 +1,62 @@ +{ + "artifactCommitments": { + "artifact:demo:001": { + "artifactId": "artifact:demo:001", + "commitment": "0x4de1ac0e70ce73c0a03df255d1ea2a7bbcb40f05c60f1b0c1b73e0b4577c537a", + "rootfieldId": "rootfield:demo:alpha", + "uriHint": "fixture://artifact/demo/001" + } + }, + "baseAnchors": { + "0x08530e63dacb23a630bbbbd56ffc4dead54aca6d7e7ee7d920d7376eb9340ae7": { + "anchorId": "0x08530e63dacb23a630bbbbd56ffc4dead54aca6d7e7ee7d920d7376eb9340ae7", + "appchainChainId": "flowmemory-local-devnet-v0", + "artifactCommitmentRoot": "0xb772a9f7273032fd3ba2da8b6476d4715bbbafbd2a7eed21ecd0d558bde3beab", + "blockRangeEnd": 1, + "blockRangeStart": 1, + "finalityStatus": "local-placeholder", + "previousAnchorId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "rootfieldStateRoot": "0xb72a851dca1103410484e3272945bae5e87fc39b8f32f77d2991959b60d3bfbf", + "stateRoot": "0x76ec5260c34184b6bb54ca406a43fc1f9591a47f37f71583a7620ef4a4065aff", + "verifierReportRoot": "0x4facd21e55423e182eba87355482a35daa93f53190fbd3a8d2969f9d55bc5373", + "workReceiptRoot": "0x8b3ef5650c9eea2f608ad9c7cb73df3c289fc0ac72ed04f46e6ae4bce0a1f023" + } + }, + "blockHeight": 2, + "rootfields": { + "rootfield:demo:alpha": { + "active": true, + "latestRoot": "0xbdb66f777635a2426a834652f8efee40db4f3e0b9ddd2af15f15fd065a7fe4f4", + "metadataHash": "0x514006e494877d3d6a69848ed6264b152ebe6b73b1112d8ff1b9b48860509a2f", + "owner": "operator:local-demo", + "pulseCount": 2, + "rootCount": 1, + "rootfieldId": "rootfield:demo:alpha", + "schemaHash": "0x5909a6dc30ffe1fcd89eebc118f6d2096c4d4c3ccdcc851dc0e4386fe997c6d7" + } + }, + "schema": "flowmemory.dashboard_state.local_devnet.v0", + "stateRoot": "0x3e1f5fddd84f9d460ee30a380ff700b17611891b8c03eb320edf1baefe003ef9", + "verifierReports": { + "report:demo:001": { + "reasonCodes": [], + "receiptId": "receipt:demo:001", + "reportDigest": "0xe75619ea62e7a6d9593debe0123d366ae0f0104cff86d9a69391fb5c1e074f4c", + "reportId": "report:demo:001", + "rootfieldId": "rootfield:demo:alpha", + "status": "verified", + "verifierId": "verifier:local-demo" + } + }, + "workReceipts": { + "receipt:demo:001": { + "artifactCommitment": "0x4de1ac0e70ce73c0a03df255d1ea2a7bbcb40f05c60f1b0c1b73e0b4577c537a", + "inputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "outputRoot": "0xbdb66f777635a2426a834652f8efee40db4f3e0b9ddd2af15f15fd065a7fe4f4", + "receiptId": "receipt:demo:001", + "rootfieldId": "rootfield:demo:alpha", + "ruleSet": "flowmemory.work.rule_set.local_demo.v0", + "workerId": "worker:local-demo" + } + } +} diff --git a/fixtures/launch-core/generated/devnet/indexer-handoff.json b/fixtures/launch-core/generated/devnet/indexer-handoff.json new file mode 100644 index 00000000..e8a78cfd --- /dev/null +++ b/fixtures/launch-core/generated/devnet/indexer-handoff.json @@ -0,0 +1,67 @@ +{ + "blocks": [ + { + "blockHash": "0xf76ac3652230cae4a4b5afcd54b0dcec9219f20ad71e21c497264668fb30f235", + "blockNumber": 1, + "logicalTime": 1778688000, + "parentHash": "0x0f23c892cbd2d00c10839d97ddab833698a83f8df8d6df27ceac03cfdd4b7bc9", + "receipts": [ + { + "error": null, + "status": "applied", + "txId": "0x2cffda58c783dc026978b06a681587b19d9536ae4e158a69be855da1200f3189" + }, + { + "error": null, + "status": "applied", + "txId": "0xb9f435aceb1bedb86dce821743769b28c02a42002c9cd41f2df1ea0279462ab2" + }, + { + "error": null, + "status": "applied", + "txId": "0xef6df43993478d8f14d609732c7260fa08861ecc17e74137b83beda8d50931d2" + }, + { + "error": null, + "status": "applied", + "txId": "0x73b81134901c2ce13e575f161d82a404c6f7cd1ef2e8ee17beb6697062175c46" + }, + { + "error": null, + "status": "applied", + "txId": "0x3ac0b196a212a0e77d0a0c4b60e2283d2994b09993971b95427996700f5b92aa" + } + ], + "schema": "flowmemory.local_devnet.block.v0", + "stateRoot": "0x76ec5260c34184b6bb54ca406a43fc1f9591a47f37f71583a7620ef4a4065aff", + "txIds": [ + "0x2cffda58c783dc026978b06a681587b19d9536ae4e158a69be855da1200f3189", + "0xb9f435aceb1bedb86dce821743769b28c02a42002c9cd41f2df1ea0279462ab2", + "0xef6df43993478d8f14d609732c7260fa08861ecc17e74137b83beda8d50931d2", + "0x73b81134901c2ce13e575f161d82a404c6f7cd1ef2e8ee17beb6697062175c46", + "0x3ac0b196a212a0e77d0a0c4b60e2283d2994b09993971b95427996700f5b92aa" + ] + }, + { + "blockHash": "0x7515374a9b020a6d271820031738a5190cb0fc374adcd74a88a32c0fd0d5c7a6", + "blockNumber": 2, + "logicalTime": 1778688001, + "parentHash": "0xf76ac3652230cae4a4b5afcd54b0dcec9219f20ad71e21c497264668fb30f235", + "receipts": [ + { + "error": null, + "status": "applied", + "txId": "0x8f719c880f17b5d4fb6d9efd54ac276d0dd8050d11c2c7870c36a79b66bc49d7" + } + ], + "schema": "flowmemory.local_devnet.block.v0", + "stateRoot": "0x3e1f5fddd84f9d460ee30a380ff700b17611891b8c03eb320edf1baefe003ef9", + "txIds": [ + "0x8f719c880f17b5d4fb6d9efd54ac276d0dd8050d11c2c7870c36a79b66bc49d7" + ] + } + ], + "importedObservations": {}, + "schema": "flowmemory.indexer_handoff.local_devnet.v0", + "stateRoot": "0x3e1f5fddd84f9d460ee30a380ff700b17611891b8c03eb320edf1baefe003ef9" +} diff --git a/fixtures/launch-core/generated/devnet/state.json b/fixtures/launch-core/generated/devnet/state.json new file mode 100644 index 00000000..56b211b6 --- /dev/null +++ b/fixtures/launch-core/generated/devnet/state.json @@ -0,0 +1,130 @@ +{ + "schema": "flowmemory.local_devnet.state.v0", + "chainId": "flowmemory-local-devnet-v0", + "genesisHash": "0x0f23c892cbd2d00c10839d97ddab833698a83f8df8d6df27ceac03cfdd4b7bc9", + "nextBlockNumber": 3, + "logicalTime": 1778688002, + "parentHash": "0x7515374a9b020a6d271820031738a5190cb0fc374adcd74a88a32c0fd0d5c7a6", + "rootfields": { + "rootfield:demo:alpha": { + "rootfieldId": "rootfield:demo:alpha", + "owner": "operator:local-demo", + "schemaHash": "0x5909a6dc30ffe1fcd89eebc118f6d2096c4d4c3ccdcc851dc0e4386fe997c6d7", + "metadataHash": "0x514006e494877d3d6a69848ed6264b152ebe6b73b1112d8ff1b9b48860509a2f", + "latestRoot": "0xbdb66f777635a2426a834652f8efee40db4f3e0b9ddd2af15f15fd065a7fe4f4", + "pulseCount": 2, + "rootCount": 1, + "active": true + } + }, + "artifactCommitments": { + "artifact:demo:001": { + "artifactId": "artifact:demo:001", + "rootfieldId": "rootfield:demo:alpha", + "commitment": "0x4de1ac0e70ce73c0a03df255d1ea2a7bbcb40f05c60f1b0c1b73e0b4577c537a", + "uriHint": "fixture://artifact/demo/001" + } + }, + "workReceipts": { + "receipt:demo:001": { + "receiptId": "receipt:demo:001", + "rootfieldId": "rootfield:demo:alpha", + "workerId": "worker:local-demo", + "inputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "outputRoot": "0xbdb66f777635a2426a834652f8efee40db4f3e0b9ddd2af15f15fd065a7fe4f4", + "artifactCommitment": "0x4de1ac0e70ce73c0a03df255d1ea2a7bbcb40f05c60f1b0c1b73e0b4577c537a", + "ruleSet": "flowmemory.work.rule_set.local_demo.v0" + } + }, + "verifierReports": { + "report:demo:001": { + "reportId": "report:demo:001", + "rootfieldId": "rootfield:demo:alpha", + "receiptId": "receipt:demo:001", + "verifierId": "verifier:local-demo", + "reportDigest": "0xe75619ea62e7a6d9593debe0123d366ae0f0104cff86d9a69391fb5c1e074f4c", + "status": "verified", + "reasonCodes": [] + } + }, + "importedObservations": {}, + "importedVerifierReports": {}, + "baseAnchors": { + "0x08530e63dacb23a630bbbbd56ffc4dead54aca6d7e7ee7d920d7376eb9340ae7": { + "anchorId": "0x08530e63dacb23a630bbbbd56ffc4dead54aca6d7e7ee7d920d7376eb9340ae7", + "appchainChainId": "flowmemory-local-devnet-v0", + "blockRangeStart": 1, + "blockRangeEnd": 1, + "stateRoot": "0x76ec5260c34184b6bb54ca406a43fc1f9591a47f37f71583a7620ef4a4065aff", + "workReceiptRoot": "0x8b3ef5650c9eea2f608ad9c7cb73df3c289fc0ac72ed04f46e6ae4bce0a1f023", + "verifierReportRoot": "0x4facd21e55423e182eba87355482a35daa93f53190fbd3a8d2969f9d55bc5373", + "rootfieldStateRoot": "0xb72a851dca1103410484e3272945bae5e87fc39b8f32f77d2991959b60d3bfbf", + "artifactCommitmentRoot": "0xb772a9f7273032fd3ba2da8b6476d4715bbbafbd2a7eed21ecd0d558bde3beab", + "previousAnchorId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "finalityStatus": "local-placeholder" + } + }, + "blocks": [ + { + "schema": "flowmemory.local_devnet.block.v0", + "blockNumber": 1, + "parentHash": "0x0f23c892cbd2d00c10839d97ddab833698a83f8df8d6df27ceac03cfdd4b7bc9", + "logicalTime": 1778688000, + "txIds": [ + "0x2cffda58c783dc026978b06a681587b19d9536ae4e158a69be855da1200f3189", + "0xb9f435aceb1bedb86dce821743769b28c02a42002c9cd41f2df1ea0279462ab2", + "0xef6df43993478d8f14d609732c7260fa08861ecc17e74137b83beda8d50931d2", + "0x73b81134901c2ce13e575f161d82a404c6f7cd1ef2e8ee17beb6697062175c46", + "0x3ac0b196a212a0e77d0a0c4b60e2283d2994b09993971b95427996700f5b92aa" + ], + "receipts": [ + { + "txId": "0x2cffda58c783dc026978b06a681587b19d9536ae4e158a69be855da1200f3189", + "status": "applied", + "error": null + }, + { + "txId": "0xb9f435aceb1bedb86dce821743769b28c02a42002c9cd41f2df1ea0279462ab2", + "status": "applied", + "error": null + }, + { + "txId": "0xef6df43993478d8f14d609732c7260fa08861ecc17e74137b83beda8d50931d2", + "status": "applied", + "error": null + }, + { + "txId": "0x73b81134901c2ce13e575f161d82a404c6f7cd1ef2e8ee17beb6697062175c46", + "status": "applied", + "error": null + }, + { + "txId": "0x3ac0b196a212a0e77d0a0c4b60e2283d2994b09993971b95427996700f5b92aa", + "status": "applied", + "error": null + } + ], + "stateRoot": "0x76ec5260c34184b6bb54ca406a43fc1f9591a47f37f71583a7620ef4a4065aff", + "blockHash": "0xf76ac3652230cae4a4b5afcd54b0dcec9219f20ad71e21c497264668fb30f235" + }, + { + "schema": "flowmemory.local_devnet.block.v0", + "blockNumber": 2, + "parentHash": "0xf76ac3652230cae4a4b5afcd54b0dcec9219f20ad71e21c497264668fb30f235", + "logicalTime": 1778688001, + "txIds": [ + "0x8f719c880f17b5d4fb6d9efd54ac276d0dd8050d11c2c7870c36a79b66bc49d7" + ], + "receipts": [ + { + "txId": "0x8f719c880f17b5d4fb6d9efd54ac276d0dd8050d11c2c7870c36a79b66bc49d7", + "status": "applied", + "error": null + } + ], + "stateRoot": "0x3e1f5fddd84f9d460ee30a380ff700b17611891b8c03eb320edf1baefe003ef9", + "blockHash": "0x7515374a9b020a6d271820031738a5190cb0fc374adcd74a88a32c0fd0d5c7a6" + } + ], + "pendingTxs": [] +} diff --git a/fixtures/launch-core/generated/devnet/verifier-handoff.json b/fixtures/launch-core/generated/devnet/verifier-handoff.json new file mode 100644 index 00000000..04220953 --- /dev/null +++ b/fixtures/launch-core/generated/devnet/verifier-handoff.json @@ -0,0 +1,27 @@ +{ + "importedVerifierReports": {}, + "schema": "flowmemory.verifier_handoff.local_devnet.v0", + "stateRoot": "0x3e1f5fddd84f9d460ee30a380ff700b17611891b8c03eb320edf1baefe003ef9", + "verifierReports": { + "report:demo:001": { + "reasonCodes": [], + "receiptId": "receipt:demo:001", + "reportDigest": "0xe75619ea62e7a6d9593debe0123d366ae0f0104cff86d9a69391fb5c1e074f4c", + "reportId": "report:demo:001", + "rootfieldId": "rootfield:demo:alpha", + "status": "verified", + "verifierId": "verifier:local-demo" + } + }, + "workReceipts": { + "receipt:demo:001": { + "artifactCommitment": "0x4de1ac0e70ce73c0a03df255d1ea2a7bbcb40f05c60f1b0c1b73e0b4577c537a", + "inputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "outputRoot": "0xbdb66f777635a2426a834652f8efee40db4f3e0b9ddd2af15f15fd065a7fe4f4", + "receiptId": "receipt:demo:001", + "rootfieldId": "rootfield:demo:alpha", + "ruleSet": "flowmemory.work.rule_set.local_demo.v0", + "workerId": "worker:local-demo" + } + } +} diff --git a/fixtures/launch-core/rootflow-transitions.json b/fixtures/launch-core/rootflow-transitions.json new file mode 100644 index 00000000..51e46310 --- /dev/null +++ b/fixtures/launch-core/rootflow-transitions.json @@ -0,0 +1,134 @@ +{ + "schema": "flowmemory.rootflow_transition_set.v0", + "generatedAt": "2026-05-13T17:02:00.000Z", + "rootflowTransitions": [ + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x9d958aadf8bf46f989b51e541709a73d21970e7e79643f939c9a0000b50f9a91", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentPulseId": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentTransitionId": null, + "memorySignalId": "0xec2a80963190d2fa4d0eae023e735eeaf770cf33496eabdea696f3c7dda071eb", + "memoryReceiptId": "0x48066ab6febdedb523cfcae2f313752db7e80467641d80914ebfe2e079d8c49d", + "reportId": "0x03af9720a87f7d72ce2ce95c1d04d50134649da51ace802d88818ad67fb2ebb3", + "previousRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "attemptedRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nextRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "status": "verified", + "blockNumber": "123456", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333333", + "sequence": "1", + "reasonCodes": [] + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x5cdf7f5498350650adc19c62828425723a09bcca6571774992ca2d013fdc1068", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x49c6cd59d1f1916bc5301308be09c14d64127d1566362272dc5aa201ed53bdea", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab001", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0xc595baea5e90a5f06ff49d8afeea0996eb39e13b3794903b8142dc9daf3a2df0", + "memoryReceiptId": "0x7973443bfec1d763a16014d2299ff3e1a3d7dbda5d8a8c1c79638438fdf0f6fa", + "reportId": "0xf1dfced6038cfa79928e1888e611da6bb05e7a14393cb20e2d5a5cb90c825c35", + "previousRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "verified", + "blockNumber": "123457", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333334", + "sequence": "2", + "reasonCodes": [] + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0xe1b6f858279961c968cdfba0b85d489767c486289e824cab3d017997064fed89", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x223d74c971f301d800dd69aa30994bc3fa3089b34b0db1b0a7fc9d4e8d114c79", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab002", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0x4699ec901e15d260417fd6a9a86357c179ac55b631df05f28b29f28d5a5f3b61", + "memoryReceiptId": "0xdb38d4fa47cc00c6390ba08d3d6b7722291304d025a80981885294dd826843f8", + "reportId": "0xb7cef189a48b8c2697603c3704a52bb3a0322b375fdbea68d2bbbadb65a92ec1", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "reorged", + "blockNumber": "123458", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333335", + "sequence": "2", + "reasonCodes": [ + "observation.reorged" + ] + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x35db5f8c36e2bc988c4d60f25a2e60d971256bdfdb79a73c92c0b82a41e5a367", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0xe4a7065f1578c4a232b41f5984942e9b7b07760ce7dfeba77b38eb03173491df", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab003", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0xe32d6eeeff9c6bafadca56b980d58159afe8ffb29184458fa589c890829b9627", + "memoryReceiptId": "0x6a155b51ab1f84d1dbb20e47201db33a5a9a4996a2372987ce7559503cf97898", + "reportId": "0xabc22e2203a9404c832aa792f7a569e17e599078fc9ebacf2c1307bbf6f1d7bb", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "failed", + "blockNumber": "123459", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333336", + "sequence": "3", + "reasonCodes": [ + "commitment.mismatch" + ] + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0x31d44377aa98e7fcaa07110256e1600249c4337c69e6d06c14d36e6aad6a79c4", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x92144fc24c81cdd6319598e6e0c58d84e3f18d9ad4a8be33bc956e32c2ae39f4", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab004", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0xfdc7756ac00683bc3e85bb3a9c2bd01f9719667b2d739818591fe697ee45d6c4", + "memoryReceiptId": "0xf6b2d26e213db3ed4f0ca1f6992afc4d2c87a3fd13d749d969406bc984159530", + "reportId": "0xb3798cf34e65a4af4017fe312cd60646a730fd74dbf36ea8d3a5b8b88502e294", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "unresolved", + "blockNumber": "123460", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333337", + "sequence": "4", + "reasonCodes": [ + "artifact.unavailable" + ] + }, + { + "schema": "flowmemory.rootflow_transition.v0", + "transitionId": "0xdc9a57620b3309aceee35e858f62650b565e5f17ec6d9218ffd653ef5a633cdf", + "rootfieldId": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "observationId": "0x5ba8c5a70c814d35482df5f6598e549f83f2d0e27f6e3d25b83eb2a0e1d56a98", + "pulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab005", + "parentPulseId": "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "parentTransitionId": "0x29fcee50b38bf403556ea08db7faeda6ea50430c08fc3126cebffad4a7657522", + "memorySignalId": "0x74f686fdd91352713b0e1f74f8218d8e41359b67634f8c8be6cbafe15f7f95d5", + "memoryReceiptId": "0x9897616d6fba646f1a20ae596c14969e1048513deda94268b870b5d51175678b", + "reportId": "0x61b984c1055654334a7a7a191887779c8f2be937b08590e8a90927ee645042f5", + "previousRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "attemptedRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "nextRoot": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1", + "status": "unsupported", + "blockNumber": "123461", + "txHash": "0x3333333333333333333333333333333333333333333333333333333333333338", + "sequence": "5", + "reasonCodes": [ + "pulse.type.unsupported" + ] + } + ] +} diff --git a/package-lock.json b/package-lock.json index 1f3fbdf4..846780fb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,8 @@ "workspaces": [ "services/shared", "services/indexer", - "services/verifier" + "services/verifier", + "services/flowmemory" ] }, "node_modules/@flowmemory/indexer-v0": { @@ -19,10 +20,17 @@ "resolved": "services/shared", "link": true }, + "node_modules/@flowmemory/launch-core-v0": { + "resolved": "services/flowmemory", + "link": true + }, "node_modules/@flowmemory/verifier-v0": { "resolved": "services/verifier", "link": true }, + "services/flowmemory": { + "name": "@flowmemory/launch-core-v0" + }, "services/indexer": { "name": "@flowmemory/indexer-v0" }, diff --git a/package.json b/package.json index ea644bec..35cca6f2 100644 --- a/package.json +++ b/package.json @@ -5,13 +5,16 @@ "workspaces": [ "services/shared", "services/indexer", - "services/verifier" + "services/verifier", + "services/flowmemory" ], "scripts": { - "test": "npm test --prefix services/shared && npm test --prefix services/indexer && npm test --prefix services/verifier", + "test": "npm test --prefix services/shared && npm test --prefix services/indexer && npm test --prefix services/verifier && npm test --prefix services/flowmemory", "index:fixtures": "npm run index:fixtures --prefix services/indexer", "verify:fixtures": "npm run verify:fixtures --prefix services/verifier", - "e2e": "npm run index:fixtures && npm run verify:fixtures", + "flowmemory:generate": "npm run generate --prefix services/flowmemory", + "launch:v0": "npm run launch:v0 --prefix services/flowmemory", + "e2e": "npm run index:fixtures && npm run verify:fixtures && npm run flowmemory:generate", "demo:indexer": "npm run demo --prefix services/indexer", "demo:verifier": "npm run demo --prefix services/verifier" } diff --git a/schemas/flowmemory/README.md b/schemas/flowmemory/README.md new file mode 100644 index 00000000..014792b6 --- /dev/null +++ b/schemas/flowmemory/README.md @@ -0,0 +1,11 @@ +# FlowMemory V0 JSON Schemas + +These schemas are the canonical local/test V0 shapes for generated Flow Memory and Rootflow objects: + +- `memory-signal.schema.json` +- `memory-receipt.schema.json` +- `rootflow-transition.schema.json` +- `rootfield-bundle.schema.json` +- `agent-memory-view.schema.json` + +They describe local fixture objects only. They do not claim production L1 readiness, trustless verification, free storage, AI running on-chain, or production Uniswap v4 deployment. diff --git a/schemas/flowmemory/agent-memory-view.schema.json b/schemas/flowmemory/agent-memory-view.schema.json new file mode 100644 index 00000000..81eb85ea --- /dev/null +++ b/schemas/flowmemory/agent-memory-view.schema.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "flowmemory.agent_memory_view.v0", + "title": "FlowMemory AgentMemoryView V0", + "type": "object", + "additionalProperties": false, + "required": [ + "schema", + "viewId", + "rootfieldId", + "status", + "latestRoot", + "latestTransitionId", + "signalIds", + "receiptIds", + "transitionIds", + "warnings", + "localOnly" + ], + "properties": { + "schema": { "const": "flowmemory.agent_memory_view.v0" }, + "viewId": { "$ref": "#/$defs/hex32" }, + "rootfieldId": { "$ref": "#/$defs/hex32" }, + "status": { "$ref": "#/$defs/flowMemoryStatus" }, + "latestRoot": { "$ref": "#/$defs/hex32" }, + "latestTransitionId": { "anyOf": [{ "$ref": "#/$defs/hex32" }, { "type": "null" }] }, + "signalIds": { "type": "array", "items": { "$ref": "#/$defs/hex32" } }, + "receiptIds": { "type": "array", "items": { "$ref": "#/$defs/hex32" } }, + "transitionIds": { "type": "array", "items": { "$ref": "#/$defs/hex32" } }, + "warnings": { "type": "array", "items": { "type": "string" } }, + "localOnly": { "const": true } + }, + "$defs": { + "hex32": { "type": "string", "pattern": "^0x[0-9a-fA-F]{64}$" }, + "flowMemoryStatus": { + "enum": ["observed", "pending", "finalized", "verified", "unresolved", "failed", "unsupported", "reorged", "offline", "stale"] + } + } +} diff --git a/schemas/flowmemory/memory-receipt.schema.json b/schemas/flowmemory/memory-receipt.schema.json new file mode 100644 index 00000000..ef29b717 --- /dev/null +++ b/schemas/flowmemory/memory-receipt.schema.json @@ -0,0 +1,51 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "flowmemory.memory_receipt.v0", + "title": "FlowMemory MemoryReceipt V0", + "type": "object", + "additionalProperties": false, + "required": [ + "schema", + "receiptId", + "reportId", + "reportDigest", + "observationId", + "rootfieldId", + "verifierStatus", + "flowMemoryStatus", + "resolverPolicyId", + "verifierSpecVersion", + "checksPassed", + "checksTotal", + "reasonCodes", + "evidenceRefs" + ], + "properties": { + "schema": { "const": "flowmemory.memory_receipt.v0" }, + "receiptId": { "$ref": "#/$defs/hex32" }, + "reportId": { "$ref": "#/$defs/hex32" }, + "reportDigest": { "$ref": "#/$defs/hex32" }, + "observationId": { "$ref": "#/$defs/hex32" }, + "rootfieldId": { "$ref": "#/$defs/hex32" }, + "verifierStatus": { "enum": ["valid", "invalid", "unresolved", "unsupported", "reorged"] }, + "flowMemoryStatus": { "$ref": "#/$defs/flowMemoryStatus" }, + "resolverPolicyId": { "type": "string", "minLength": 1 }, + "verifierSpecVersion": { "type": "string", "minLength": 1 }, + "checksPassed": { "type": "integer", "minimum": 0 }, + "checksTotal": { "type": "integer", "minimum": 0 }, + "reasonCodes": { "type": "array", "items": { "type": "string" } }, + "evidenceRefs": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": { "type": "string" } + } + } + }, + "$defs": { + "hex32": { "type": "string", "pattern": "^0x[0-9a-fA-F]{64}$" }, + "flowMemoryStatus": { + "enum": ["observed", "pending", "finalized", "verified", "unresolved", "failed", "unsupported", "reorged", "offline", "stale"] + } + } +} diff --git a/schemas/flowmemory/memory-signal.schema.json b/schemas/flowmemory/memory-signal.schema.json new file mode 100644 index 00000000..62a83078 --- /dev/null +++ b/schemas/flowmemory/memory-signal.schema.json @@ -0,0 +1,62 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "flowmemory.memory_signal.v0", + "title": "FlowMemory MemorySignal V0", + "type": "object", + "additionalProperties": false, + "required": [ + "schema", + "signalId", + "observationId", + "pulseId", + "rootfieldId", + "signalType", + "status", + "chainId", + "emittingContract", + "blockNumber", + "blockHash", + "txHash", + "transactionIndex", + "logIndex", + "actor", + "subject", + "commitment", + "parentPulseId", + "sequence", + "occurredAt", + "uri", + "summary" + ], + "properties": { + "schema": { "const": "flowmemory.memory_signal.v0" }, + "signalId": { "$ref": "#/$defs/hex32" }, + "observationId": { "$ref": "#/$defs/hex32" }, + "pulseId": { "$ref": "#/$defs/hex32" }, + "rootfieldId": { "$ref": "#/$defs/hex32" }, + "signalType": { "enum": ["rootfield_registration", "root_commitment", "unsupported_pulse"] }, + "status": { "$ref": "#/$defs/flowMemoryStatus" }, + "chainId": { "type": "string", "minLength": 1 }, + "emittingContract": { "$ref": "#/$defs/address" }, + "blockNumber": { "type": "string", "pattern": "^[0-9]+$" }, + "blockHash": { "$ref": "#/$defs/hex32" }, + "txHash": { "$ref": "#/$defs/hex32" }, + "transactionIndex": { "type": "string", "pattern": "^[0-9]+$" }, + "logIndex": { "type": "string", "pattern": "^[0-9]+$" }, + "actor": { "$ref": "#/$defs/address" }, + "subject": { "$ref": "#/$defs/hex32" }, + "commitment": { "$ref": "#/$defs/hex32" }, + "parentPulseId": { "$ref": "#/$defs/hex32" }, + "sequence": { "type": "string", "pattern": "^[0-9]+$" }, + "occurredAt": { "type": "string", "format": "date-time" }, + "uri": { "type": "string" }, + "summary": { "type": "string" } + }, + "$defs": { + "hex32": { "type": "string", "pattern": "^0x[0-9a-fA-F]{64}$" }, + "address": { "type": "string", "pattern": "^0x[0-9a-fA-F]{40}$" }, + "flowMemoryStatus": { + "enum": ["observed", "pending", "finalized", "verified", "unresolved", "failed", "unsupported", "reorged", "offline", "stale"] + } + } +} diff --git a/schemas/flowmemory/rootfield-bundle.schema.json b/schemas/flowmemory/rootfield-bundle.schema.json new file mode 100644 index 00000000..dcd01313 --- /dev/null +++ b/schemas/flowmemory/rootfield-bundle.schema.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "flowmemory.rootfield_bundle.v0", + "title": "FlowMemory RootfieldBundle V0", + "type": "object", + "additionalProperties": false, + "required": [ + "schema", + "bundleId", + "rootfieldId", + "latestRoot", + "latestTransitionId", + "status", + "transitionIds", + "memorySignalIds", + "memoryReceiptIds", + "verifierReportIds", + "counts" + ], + "properties": { + "schema": { "const": "flowmemory.rootfield_bundle.v0" }, + "bundleId": { "$ref": "#/$defs/hex32" }, + "rootfieldId": { "$ref": "#/$defs/hex32" }, + "latestRoot": { "$ref": "#/$defs/hex32" }, + "latestTransitionId": { "anyOf": [{ "$ref": "#/$defs/hex32" }, { "type": "null" }] }, + "status": { "$ref": "#/$defs/flowMemoryStatus" }, + "transitionIds": { "type": "array", "items": { "$ref": "#/$defs/hex32" } }, + "memorySignalIds": { "type": "array", "items": { "$ref": "#/$defs/hex32" } }, + "memoryReceiptIds": { "type": "array", "items": { "$ref": "#/$defs/hex32" } }, + "verifierReportIds": { "type": "array", "items": { "$ref": "#/$defs/hex32" } }, + "counts": { + "type": "object", + "additionalProperties": false, + "required": ["observations", "transitions", "receipts", "verified", "failed", "unresolved", "unsupported", "reorged"], + "properties": { + "observations": { "type": "integer", "minimum": 0 }, + "transitions": { "type": "integer", "minimum": 0 }, + "receipts": { "type": "integer", "minimum": 0 }, + "verified": { "type": "integer", "minimum": 0 }, + "failed": { "type": "integer", "minimum": 0 }, + "unresolved": { "type": "integer", "minimum": 0 }, + "unsupported": { "type": "integer", "minimum": 0 }, + "reorged": { "type": "integer", "minimum": 0 } + } + } + }, + "$defs": { + "hex32": { "type": "string", "pattern": "^0x[0-9a-fA-F]{64}$" }, + "flowMemoryStatus": { + "enum": ["observed", "pending", "finalized", "verified", "unresolved", "failed", "unsupported", "reorged", "offline", "stale"] + } + } +} diff --git a/schemas/flowmemory/rootflow-transition.schema.json b/schemas/flowmemory/rootflow-transition.schema.json new file mode 100644 index 00000000..c6742b3e --- /dev/null +++ b/schemas/flowmemory/rootflow-transition.schema.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "flowmemory.rootflow_transition.v0", + "title": "FlowMemory RootflowTransition V0", + "type": "object", + "additionalProperties": false, + "required": [ + "schema", + "transitionId", + "rootfieldId", + "observationId", + "pulseId", + "parentPulseId", + "parentTransitionId", + "memorySignalId", + "memoryReceiptId", + "reportId", + "previousRoot", + "attemptedRoot", + "nextRoot", + "status", + "blockNumber", + "txHash", + "sequence", + "reasonCodes" + ], + "properties": { + "schema": { "const": "flowmemory.rootflow_transition.v0" }, + "transitionId": { "$ref": "#/$defs/hex32" }, + "rootfieldId": { "$ref": "#/$defs/hex32" }, + "observationId": { "$ref": "#/$defs/hex32" }, + "pulseId": { "$ref": "#/$defs/hex32" }, + "parentPulseId": { "$ref": "#/$defs/hex32" }, + "parentTransitionId": { "anyOf": [{ "$ref": "#/$defs/hex32" }, { "type": "null" }] }, + "memorySignalId": { "$ref": "#/$defs/hex32" }, + "memoryReceiptId": { "anyOf": [{ "$ref": "#/$defs/hex32" }, { "type": "null" }] }, + "reportId": { "anyOf": [{ "$ref": "#/$defs/hex32" }, { "type": "null" }] }, + "previousRoot": { "$ref": "#/$defs/hex32" }, + "attemptedRoot": { "$ref": "#/$defs/hex32" }, + "nextRoot": { "$ref": "#/$defs/hex32" }, + "status": { "$ref": "#/$defs/flowMemoryStatus" }, + "blockNumber": { "type": "string", "pattern": "^[0-9]+$" }, + "txHash": { "$ref": "#/$defs/hex32" }, + "sequence": { "type": "string", "pattern": "^[0-9]+$" }, + "reasonCodes": { "type": "array", "items": { "type": "string" } } + }, + "$defs": { + "hex32": { "type": "string", "pattern": "^0x[0-9a-fA-F]{64}$" }, + "flowMemoryStatus": { + "enum": ["observed", "pending", "finalized", "verified", "unresolved", "failed", "unsupported", "reorged", "offline", "stale"] + } + } +} diff --git a/services/flowmemory/package.json b/services/flowmemory/package.json new file mode 100644 index 00000000..9825b726 --- /dev/null +++ b/services/flowmemory/package.json @@ -0,0 +1,10 @@ +{ + "name": "@flowmemory/launch-core-v0", + "private": true, + "type": "module", + "scripts": { + "generate": "node src/generate-launch-core.ts", + "launch:v0": "node src/launch-v0.ts", + "test": "node --test test/*.test.ts" + } +} diff --git a/services/flowmemory/src/generate-launch-core.ts b/services/flowmemory/src/generate-launch-core.ts new file mode 100644 index 00000000..7876b226 --- /dev/null +++ b/services/flowmemory/src/generate-launch-core.ts @@ -0,0 +1,789 @@ +import { mkdirSync, readFileSync, writeFileSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +import { canonicalJson, keccak256Hex } from "../../shared/src/index.ts"; +import { + observationLifecycleToFlowMemoryStatus, + transitionStatus, + VERIFIER_TO_FLOW_MEMORY_STATUS, + verifierStatusToFlowMemoryStatus, + type FlowMemoryStatus, +} from "./status.ts"; +import type { + AgentMemoryView, + LaunchCoreOutput, + MemoryReceipt, + MemorySignal, + RootfieldBundle, + RootflowTransition, +} from "./types.ts"; + +const ZERO_ROOT = "0x0000000000000000000000000000000000000000000000000000000000000000"; +const GENERATED_AT = "2026-05-13T17:02:00.000Z"; +const CHAIN_CONTEXT = "flowmemory-local-v0"; +const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../../.."); + +type JsonObject = Record; + +interface IndexerPersistence { + schema: "flowmemory.indexer.persistence.v0"; + state: { + observations: IndexedObservation[]; + pulses: Array>; + rootfields: Array<{ rootfieldId: string; firstObservationId: string; latestObservationId: string; pulseCount: number }>; + }; +} + +interface IndexedObservation { + observationId: string; + cursorId: string; + lifecycleState: string; + duplicateKind: string; + chainId: string; + emittingContract: string; + eventSignature: string; + blockNumber: string; + blockHash: string; + txHash: string; + transactionIndex: string; + logIndex: string; + receiptStatus: string; + pulseId: string; + rootfieldId: string; + actor: string; + pulseType: string; + subject: string; + commitment: string; + parentPulseId: string; + sequence: string; + occurredAt: string; + uri: string; +} + +interface VerifierPersistence { + schema: "flowmemory.verifier.persistence.v0"; + reports: VerifierReport[]; +} + +interface VerifierReport { + reportId: string; + reportDigest: string; + reportCore: { + status: string; + observationId: string; + resolverPolicyId: string; + verifierSpecVersion: string; + reasonCodes: string[]; + evidenceRefs: Array>; + checks: Array>; + observation: { + rootfieldId: string; + }; + }; +} + +export interface LaunchCorePaths { + indexerPath: string; + verifierPath: string; + devnetPath: string; + hardwarePath: string; + launchOutPath: string; + transitionsOutPath: string; + dashboardOutPath: string; + dashboardRuntimePath: string; +} + +export interface DashboardData { + metadata: JsonObject; + chain: JsonObject; + flowPulseObservations: JsonObject[]; + rootfields: JsonObject[]; + workLanes: JsonObject[]; + workReceipts: JsonObject[]; + verifierReports: JsonObject[]; + rootflowTransitions: JsonObject[]; + memorySignals: JsonObject[]; + memoryReceipts: JsonObject[]; + rootfieldBundles: JsonObject[]; + agentMemoryViews: JsonObject[]; + devnetBlocks: JsonObject[]; + hardwareNodes: JsonObject[]; + alerts: JsonObject[]; +} + +export const DEFAULT_LAUNCH_CORE_PATHS: LaunchCorePaths = { + indexerPath: "services/indexer/out/indexer-state.json", + verifierPath: "services/verifier/out/reports.json", + devnetPath: "fixtures/launch-core/generated/devnet/state.json", + hardwarePath: "hardware/fixtures/flowrouter_sample_seed42.json", + launchOutPath: "fixtures/launch-core/flowmemory-launch-v0.json", + transitionsOutPath: "fixtures/launch-core/rootflow-transitions.json", + dashboardOutPath: "fixtures/dashboard/flowmemory-dashboard-v0.json", + dashboardRuntimePath: "apps/dashboard/public/data/flowmemory-dashboard-v0.json", +}; + +function readJson(path: string): T { + return JSON.parse(readFileSync(path, "utf8")) as T; +} + +function writeJson(path: string, value: unknown): void { + mkdirSync(dirname(path), { recursive: true }); + writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`); +} + +function stableId(schema: string, value: unknown): string { + return keccak256Hex(new TextEncoder().encode(canonicalJson({ schema, value } as JsonObject))); +} + +function pulseTypeName(pulseType: string): MemorySignal["signalType"] { + if (pulseType === "1") { + return "rootfield_registration"; + } + if (pulseType === "2") { + return "root_commitment"; + } + return "unsupported_pulse"; +} + +function isoFromUnixSeconds(value: string): string { + const seconds = Number(value); + if (!Number.isFinite(seconds)) { + return GENERATED_AT; + } + return new Date(seconds * 1000).toISOString(); +} + +function sortObservations(observations: IndexedObservation[]): IndexedObservation[] { + return [...observations].sort((left, right) => { + const block = BigInt(left.blockNumber) - BigInt(right.blockNumber); + if (block !== 0n) { + return block < 0n ? -1 : 1; + } + const tx = BigInt(left.transactionIndex) - BigInt(right.transactionIndex); + if (tx !== 0n) { + return tx < 0n ? -1 : 1; + } + const log = BigInt(left.logIndex) - BigInt(right.logIndex); + if (log !== 0n) { + return log < 0n ? -1 : 1; + } + return left.observationId.localeCompare(right.observationId); + }); +} + +function buildMemorySignal(observation: IndexedObservation, status: FlowMemoryStatus): MemorySignal { + const signalCore = { + observationId: observation.observationId, + pulseId: observation.pulseId, + rootfieldId: observation.rootfieldId, + pulseType: observation.pulseType, + sequence: observation.sequence, + }; + + return { + schema: "flowmemory.memory_signal.v0", + signalId: stableId("flowmemory.memory_signal.v0", signalCore), + observationId: observation.observationId, + pulseId: observation.pulseId, + rootfieldId: observation.rootfieldId, + signalType: pulseTypeName(observation.pulseType), + status, + chainId: observation.chainId, + emittingContract: observation.emittingContract, + blockNumber: observation.blockNumber, + blockHash: observation.blockHash, + txHash: observation.txHash, + transactionIndex: observation.transactionIndex, + logIndex: observation.logIndex, + actor: observation.actor, + subject: observation.subject, + commitment: observation.commitment, + parentPulseId: observation.parentPulseId, + sequence: observation.sequence, + occurredAt: isoFromUnixSeconds(observation.occurredAt), + uri: observation.uri, + summary: `${pulseTypeName(observation.pulseType).replaceAll("_", " ")} pulse ${observation.sequence}`, + }; +} + +function buildMemoryReceipt(report: VerifierReport): MemoryReceipt { + const core = report.reportCore; + const checksPassed = core.checks.filter((check) => check.passed === true).length; + const checksTotal = core.checks.length; + + return { + schema: "flowmemory.memory_receipt.v0", + receiptId: stableId("flowmemory.memory_receipt.v0", { + reportId: report.reportId, + observationId: core.observationId, + status: core.status, + }), + reportId: report.reportId, + reportDigest: report.reportDigest, + observationId: core.observationId, + rootfieldId: core.observation.rootfieldId, + verifierStatus: core.status, + flowMemoryStatus: verifierStatusToFlowMemoryStatus(core.status), + resolverPolicyId: core.resolverPolicyId, + verifierSpecVersion: core.verifierSpecVersion, + checksPassed, + checksTotal, + reasonCodes: core.reasonCodes, + evidenceRefs: core.evidenceRefs, + }; +} + +function buildLaunchCore(indexer: IndexerPersistence, verifier: VerifierPersistence, paths: LaunchCorePaths): LaunchCoreOutput { + const sortedObservations = sortObservations(indexer.state.observations); + const reportByObservation = new Map(verifier.reports.map((report) => [report.reportCore.observationId, report])); + const receiptByObservation = new Map(); + const memoryReceipts = verifier.reports.map((report) => { + const receipt = buildMemoryReceipt(report); + receiptByObservation.set(receipt.observationId, receipt); + return receipt; + }); + + const memorySignals: MemorySignal[] = sortedObservations.map((observation) => { + const report = reportByObservation.get(observation.observationId); + return buildMemorySignal(observation, report ? transitionStatus(observation.lifecycleState, report.reportCore.status) : observationLifecycleToFlowMemoryStatus(observation.lifecycleState)); + }); + const signalByObservation = new Map(memorySignals.map((signal) => [signal.observationId, signal])); + const latestTransitionByPulse = new Map(); + const currentRootByRootfield = new Map(); + const rootflowTransitions: RootflowTransition[] = []; + + for (const observation of sortedObservations) { + if (observation.duplicateKind === "exactDuplicate") { + continue; + } + + const signal = signalByObservation.get(observation.observationId); + if (signal === undefined) { + throw new Error(`missing MemorySignal for ${observation.observationId}`); + } + + const report = reportByObservation.get(observation.observationId); + const receipt = receiptByObservation.get(observation.observationId); + const previousRoot = currentRootByRootfield.get(observation.rootfieldId) ?? ZERO_ROOT; + const attemptedRoot = observation.pulseType === "2" ? observation.subject : previousRoot; + const status = transitionStatus(observation.lifecycleState, report?.reportCore.status); + const nextRoot = status === "verified" && observation.pulseType === "2" ? attemptedRoot : previousRoot; + const parentTransitionId = latestTransitionByPulse.get(observation.parentPulseId) ?? null; + + const transitionCore = { + rootfieldId: observation.rootfieldId, + observationId: observation.observationId, + pulseId: observation.pulseId, + parentPulseId: observation.parentPulseId, + previousRoot, + attemptedRoot, + nextRoot, + status, + sequence: observation.sequence, + }; + const transition: RootflowTransition = { + schema: "flowmemory.rootflow_transition.v0", + transitionId: stableId("flowmemory.rootflow_transition.v0", transitionCore), + rootfieldId: observation.rootfieldId, + observationId: observation.observationId, + pulseId: observation.pulseId, + parentPulseId: observation.parentPulseId, + parentTransitionId, + memorySignalId: signal.signalId, + memoryReceiptId: receipt?.receiptId ?? null, + reportId: report?.reportId ?? null, + previousRoot, + attemptedRoot, + nextRoot, + status, + blockNumber: observation.blockNumber, + txHash: observation.txHash, + sequence: observation.sequence, + reasonCodes: receipt?.reasonCodes ?? [], + }; + + rootflowTransitions.push(transition); + latestTransitionByPulse.set(observation.pulseId, transition.transitionId); + if (nextRoot !== previousRoot) { + currentRootByRootfield.set(observation.rootfieldId, nextRoot); + } + } + + const rootfieldIds = [...new Set(memorySignals.map((signal) => signal.rootfieldId))].sort(); + const rootfieldBundles = rootfieldIds.map((rootfieldId): RootfieldBundle => { + const signals = memorySignals.filter((signal) => signal.rootfieldId === rootfieldId); + const transitions = rootflowTransitions.filter((transition) => transition.rootfieldId === rootfieldId); + const receipts = memoryReceipts.filter((receipt) => receipt.rootfieldId === rootfieldId); + const latestTransition = transitions.at(-1) ?? null; + const counts = { + observations: signals.length, + transitions: transitions.length, + receipts: receipts.length, + verified: transitions.filter((transition) => transition.status === "verified").length, + failed: transitions.filter((transition) => transition.status === "failed").length, + unresolved: transitions.filter((transition) => transition.status === "unresolved").length, + unsupported: transitions.filter((transition) => transition.status === "unsupported").length, + reorged: transitions.filter((transition) => transition.status === "reorged").length, + }; + const status = latestTransition?.status ?? "observed"; + const latestRoot = [...transitions].reverse().find((transition) => transition.nextRoot !== ZERO_ROOT)?.nextRoot ?? ZERO_ROOT; + const bundleCore = { + rootfieldId, + latestRoot, + latestTransitionId: latestTransition?.transitionId ?? null, + status, + counts, + }; + + return { + schema: "flowmemory.rootfield_bundle.v0", + bundleId: stableId("flowmemory.rootfield_bundle.v0", bundleCore), + rootfieldId, + latestRoot, + latestTransitionId: latestTransition?.transitionId ?? null, + status, + transitionIds: transitions.map((transition) => transition.transitionId), + memorySignalIds: signals.map((signal) => signal.signalId), + memoryReceiptIds: receipts.map((receipt) => receipt.receiptId), + verifierReportIds: receipts.map((receipt) => receipt.reportId), + counts, + }; + }); + + const agentMemoryViews = rootfieldBundles.map((bundle): AgentMemoryView => { + const warnings = [ + bundle.counts.failed > 0 ? `${bundle.counts.failed} failed transition(s)` : null, + bundle.counts.unresolved > 0 ? `${bundle.counts.unresolved} unresolved receipt(s)` : null, + bundle.counts.reorged > 0 ? `${bundle.counts.reorged} reorged observation(s)` : null, + bundle.counts.unsupported > 0 ? `${bundle.counts.unsupported} unsupported pulse(s)` : null, + ].filter((warning): warning is string => warning !== null); + + return { + schema: "flowmemory.agent_memory_view.v0", + viewId: stableId("flowmemory.agent_memory_view.v0", { + rootfieldId: bundle.rootfieldId, + latestTransitionId: bundle.latestTransitionId, + latestRoot: bundle.latestRoot, + }), + rootfieldId: bundle.rootfieldId, + status: bundle.status, + latestRoot: bundle.latestRoot, + latestTransitionId: bundle.latestTransitionId, + signalIds: bundle.memorySignalIds, + receiptIds: bundle.memoryReceiptIds, + transitionIds: bundle.transitionIds, + warnings, + localOnly: true, + }; + }); + + return { + schema: "flowmemory.launch_core.v0", + generatedAt: GENERATED_AT, + mode: "fixture", + sourcePaths: { + indexer: paths.indexerPath, + verifier: paths.verifierPath, + devnet: paths.devnetPath, + hardware: paths.hardwarePath, + }, + statusAdapter: VERIFIER_TO_FLOW_MEMORY_STATUS, + memorySignals, + memoryReceipts, + rootflowTransitions, + rootfieldBundles, + agentMemoryViews, + acceptance: { + loadedFlowPulses: indexer.state.pulses.length, + indexedObservations: indexer.state.observations.length, + verifierReports: verifier.reports.length, + rootflowTransitions: rootflowTransitions.length, + dashboardFixtureGenerated: true, + localOnly: true, + }, + }; +} + +function provenance(subsystem: string, localPathHint: string): JsonObject { + return { + subsystem, + origin: "fixture", + chainContext: CHAIN_CONTEXT, + fixturePath: "fixtures/launch-core/flowmemory-launch-v0.json", + capturedAt: GENERATED_AT, + localPathHint, + }; +} + +function dashboardStatusFromLifecycle(lifecycleState: string): FlowMemoryStatus { + if (lifecycleState === "removed") { + return "reorged"; + } + return observationLifecycleToFlowMemoryStatus(lifecycleState); +} + +function buildDashboardData( + launchCore: LaunchCoreOutput, + indexer: IndexerPersistence, + verifier: VerifierPersistence, + devnet: JsonObject, + hardware: JsonObject, +): DashboardData { + const currentBlock = Math.max(...indexer.state.observations.map((observation) => Number(observation.blockNumber))); + const finalizedBlock = Math.max( + ...indexer.state.observations + .filter((observation) => observation.lifecycleState === "finalized") + .map((observation) => Number(observation.blockNumber)), + ); + const reportByObservation = new Map(verifier.reports.map((report) => [report.reportCore.observationId, report])); + const packets = hardware.packets as Record | undefined; + const heartbeat = packets?.heartbeat as JsonObject | undefined; + const manifest = packets?.device_manifest as JsonObject | undefined; + const emergency = packets?.emergency_offline_signal as JsonObject | undefined; + const gateway = packets?.gateway_discovery as JsonObject | undefined; + const cache = packets?.local_cache_status as JsonObject | undefined; + const sidecar = packets?.sidecar_status as JsonObject | undefined; + const blocks = Array.isArray(devnet.blocks) ? devnet.blocks as JsonObject[] : []; + + const rootfields = launchCore.rootfieldBundles.map((bundle) => ({ + id: bundle.bundleId, + rootfieldId: bundle.rootfieldId, + owner: launchCore.memorySignals.find((signal) => signal.rootfieldId === bundle.rootfieldId)?.actor ?? ZERO_ROOT, + schemaHash: stableId("flowmemory.dashboard.rootfield.schema_hash.v0", bundle.rootfieldId), + metadataHash: stableId("flowmemory.dashboard.rootfield.metadata_hash.v0", bundle.rootfieldId), + latestRoot: bundle.latestRoot, + latestObservationId: launchCore.memorySignals.findLast((signal) => signal.rootfieldId === bundle.rootfieldId)?.observationId ?? ZERO_ROOT, + pulseCount: bundle.counts.observations, + workLaneIds: ["MEMORY_REFRESH", "FAILURE_DISCOVERY", "FAILURE_REPAIR", "EVAL_COUNTEREXAMPLE"], + evidenceUri: "fixture://launch-core/rootfield-bundle", + status: "observed", + lastUpdated: GENERATED_AT, + provenance: provenance("indexer", "fixtures/launch-core/flowmemory-launch-v0.json"), + })); + + const verifierReports = launchCore.memoryReceipts.map((receipt) => ({ + id: receipt.reportId, + reportId: receipt.reportId, + observationId: receipt.observationId, + rootfieldId: receipt.rootfieldId, + resolverPolicyId: receipt.resolverPolicyId, + verifierSpecVersion: receipt.verifierSpecVersion, + checksPassed: receipt.checksPassed, + checksTotal: receipt.checksTotal, + reasonCodes: receipt.reasonCodes, + reportHash: receipt.reportDigest, + status: receipt.flowMemoryStatus, + lastUpdated: GENERATED_AT, + provenance: provenance("verifier", "services/verifier/out/reports.json"), + })); + + const hardwareNodes = [ + { + id: String(manifest?.device_id ?? "flowrouter-fixture"), + nodeId: String(manifest?.device_id ?? "flowrouter-fixture"), + callsign: "FlowRouter kit", + role: "router", + firmware: String(manifest?.schema_version ?? "flowrouter.poc.v0"), + transport: "local-wifi+meshtastic-sidecar-sim", + lastHeartbeatAt: String(heartbeat?.emitted_at ?? GENERATED_AT), + batteryPercent: 100, + signalDbm: -61, + temperatureC: 37, + linkedWorkLaneId: "CHECKPOINT_STORAGE", + locationHint: "local lab fixture", + status: heartbeat?.network_state === "online" ? "verified" : "stale", + provenance: provenance("hardware", "hardware/fixtures/flowrouter_sample_seed42.json"), + }, + { + id: String(gateway?.gateway_id ?? "gateway-fixture"), + nodeId: String(gateway?.gateway_id ?? "gateway-fixture"), + callsign: "Gateway relay", + role: "gateway", + firmware: "gateway-discovery-fixture", + transport: "LAN gateway sim", + lastHeartbeatAt: String(gateway?.emitted_at ?? GENERATED_AT), + linkedWorkLaneId: "CHECKPOINT_STORAGE", + locationHint: "derived from gateway discovery packet", + status: emergency ? "offline" : "verified", + provenance: provenance("hardware", "hardware/fixtures/flowrouter_sample_seed42.json"), + }, + { + id: `${String(manifest?.device_id ?? "flowrouter-fixture")}-sidecar`, + nodeId: `${String(manifest?.device_id ?? "flowrouter-fixture")}-sidecar`, + callsign: "LoRa sidecar", + role: "sidecar", + firmware: "meshtastic-sidecar-fixture", + transport: "LoRa advisory sim", + lastHeartbeatAt: String(sidecar?.emitted_at ?? heartbeat?.emitted_at ?? GENERATED_AT), + signalDbm: -84, + linkedWorkLaneId: "FAILURE_DISCOVERY", + locationHint: "derived from sidecar status packet", + status: cache?.unresolved_count ? "stale" : "verified", + provenance: provenance("hardware", "hardware/fixtures/flowrouter_sample_seed42.json"), + }, + ]; + + const alerts = [ + ...launchCore.memoryReceipts + .filter((receipt) => receipt.flowMemoryStatus !== "verified") + .map((receipt) => ({ + id: stableId("flowmemory.dashboard.alert.v0", receipt.receiptId), + incidentId: stableId("flowmemory.dashboard.alert.v0", receipt.receiptId), + severity: receipt.flowMemoryStatus === "failed" ? "critical" : "warning", + title: `Verifier ${receipt.flowMemoryStatus}`, + summary: receipt.reasonCodes.join(", ") || "Verifier report needs operator review.", + openedAt: GENERATED_AT, + linkedObjectIds: [receipt.observationId, receipt.reportId], + recommendedAction: "Inspect generated Flow Memory receipt and source verifier report.", + status: receipt.flowMemoryStatus, + lastUpdated: GENERATED_AT, + provenance: provenance("alerts", "services/verifier/out/reports.json"), + })), + ...(emergency ? [{ + id: stableId("flowmemory.dashboard.alert.v0", emergency), + incidentId: stableId("flowmemory.dashboard.alert.v0", emergency), + severity: "warning", + title: String(emergency.code ?? "hardware-warning"), + summary: String(emergency.summary ?? "Hardware fixture emitted an advisory warning."), + openedAt: String(emergency.emitted_at ?? GENERATED_AT), + linkedObjectIds: [String(emergency.device_id ?? "flowrouter-fixture")], + recommendedAction: String(emergency.operator_action ?? "review hardware fixture"), + status: "unresolved", + lastUpdated: GENERATED_AT, + provenance: provenance("alerts", "hardware/fixtures/flowrouter_sample_seed42.json"), + }] : []), + ]; + + return { + metadata: { + schema: "flowmemory.dashboard.fixture.v0", + generatedAt: GENERATED_AT, + mode: "fixture", + description: "Generated local FlowMemory Dashboard V0 fixture from services, local devnet, and hardware POC outputs. It does not claim live production data.", + fixturePath: "fixtures/dashboard/flowmemory-dashboard-v0.json", + runtimeDataPath: "apps/dashboard/public/data/flowmemory-dashboard-v0.json", + futureGeneratedPaths: { + indexer: "services/indexer/out/indexer-state.json", + verifier: "services/verifier/out/reports.json", + devnet: "fixtures/launch-core/generated/devnet/state.json", + hardware: "hardware/fixtures/flowrouter_sample_seed42.json", + }, + }, + chain: { + chainId: "8453", + name: "FlowMemory local V0 fixture stack", + environment: "local-devnet", + settlementContext: "Base-native fixture observations plus no-value local devnet handoff; not Base mainnet production data.", + currentBlock, + finalizedBlock, + source: "fixture", + lastUpdated: GENERATED_AT, + }, + flowPulseObservations: indexer.state.observations.map((observation) => ({ + id: observation.observationId, + observationId: observation.observationId, + pulseId: observation.pulseId, + rootfieldId: observation.rootfieldId, + eventSignature: observation.eventSignature, + blockNumber: observation.blockNumber, + blockHash: observation.blockHash, + txHash: observation.txHash, + transactionIndex: observation.transactionIndex, + logIndex: observation.logIndex, + receiptStatus: observation.receiptStatus, + actor: observation.actor, + pulseType: observation.pulseType, + subject: observation.subject, + commitment: observation.commitment, + parentPulseId: observation.parentPulseId, + sequence: observation.sequence, + occurredAt: isoFromUnixSeconds(observation.occurredAt), + uri: observation.uri, + summary: `${pulseTypeName(observation.pulseType).replaceAll("_", " ")} from generated indexer output`, + status: dashboardStatusFromLifecycle(observation.lifecycleState), + lastUpdated: GENERATED_AT, + provenance: provenance("indexer", "services/indexer/out/indexer-state.json"), + })), + rootfields, + workLanes: [ + { + id: "MEMORY_REFRESH", + laneId: "MEMORY_REFRESH", + name: "Memory refresh", + queueDepth: launchCore.memoryReceipts.filter((receipt) => receipt.flowMemoryStatus === "unresolved").length, + inflight: launchCore.rootflowTransitions.filter((transition) => transition.status === "pending").length, + completed24h: launchCore.memoryReceipts.filter((receipt) => receipt.flowMemoryStatus === "verified").length, + p95LatencyMs: 640, + operator: "fixture-worker", + status: "pending", + lastUpdated: GENERATED_AT, + provenance: provenance("worker", "fixtures/launch-core/flowmemory-launch-v0.json"), + }, + { + id: "FAILURE_REPAIR", + laneId: "FAILURE_REPAIR", + name: "Failure repair", + queueDepth: launchCore.memoryReceipts.filter((receipt) => receipt.flowMemoryStatus === "failed").length, + inflight: 0, + completed24h: 0, + p95LatencyMs: 920, + operator: "fixture-worker", + status: "failed", + lastUpdated: GENERATED_AT, + provenance: provenance("worker", "fixtures/launch-core/flowmemory-launch-v0.json"), + }, + ], + workReceipts: launchCore.memoryReceipts.map((receipt) => ({ + id: receipt.receiptId, + receiptId: receipt.receiptId, + laneId: receipt.flowMemoryStatus === "failed" ? "FAILURE_REPAIR" : "MEMORY_REFRESH", + rootfieldId: receipt.rootfieldId, + observationId: receipt.observationId, + reportId: receipt.reportId, + workType: "VERIFIER_REPORT_TO_MEMORY_RECEIPT", + artifactUri: receipt.evidenceRefs[0]?.uri ?? "fixture://missing-artifact", + startedAt: GENERATED_AT, + completedAt: receipt.flowMemoryStatus === "unresolved" ? undefined : GENERATED_AT, + resultHash: receipt.reportDigest, + status: receipt.flowMemoryStatus, + lastUpdated: GENERATED_AT, + provenance: provenance("verifier", "services/verifier/out/reports.json"), + })), + verifierReports, + rootflowTransitions: launchCore.rootflowTransitions.map((transition) => ({ + ...transition, + id: transition.transitionId, + lastUpdated: GENERATED_AT, + provenance: provenance("indexer", "fixtures/launch-core/rootflow-transitions.json"), + })), + memorySignals: launchCore.memorySignals.map((signal) => ({ + ...signal, + id: signal.signalId, + lastUpdated: GENERATED_AT, + provenance: provenance("indexer", "fixtures/launch-core/flowmemory-launch-v0.json"), + })), + memoryReceipts: launchCore.memoryReceipts.map((receipt) => ({ + ...receipt, + id: receipt.receiptId, + status: receipt.flowMemoryStatus, + lastUpdated: GENERATED_AT, + provenance: provenance("verifier", "fixtures/launch-core/flowmemory-launch-v0.json"), + })), + rootfieldBundles: launchCore.rootfieldBundles.map((bundle) => ({ + ...bundle, + id: bundle.bundleId, + lastUpdated: GENERATED_AT, + provenance: provenance("indexer", "fixtures/launch-core/flowmemory-launch-v0.json"), + })), + agentMemoryViews: launchCore.agentMemoryViews.map((view) => ({ + ...view, + id: view.viewId, + lastUpdated: GENERATED_AT, + provenance: provenance("worker", "fixtures/launch-core/flowmemory-launch-v0.json"), + })), + devnetBlocks: blocks.map((block) => ({ + id: String(block.blockHash), + blockNumber: Number(block.blockNumber), + blockHash: String(block.blockHash), + parentHash: String(block.parentHash), + stateRoot: String(block.stateRoot), + receiptsRoot: stableId("flowmemory.dashboard.devnet.receipts_root.v0", block.receipts ?? []), + timestamp: new Date(Number(block.logicalTime ?? 0) * 1000).toISOString(), + observationCount: launchCore.acceptance.indexedObservations, + reportCount: launchCore.acceptance.verifierReports, + finalityDistance: Math.max(0, currentBlock - Number(block.blockNumber ?? 0)), + status: Number(block.blockNumber ?? 0) === blocks.length ? "finalized" : "stale", + lastUpdated: GENERATED_AT, + provenance: provenance("devnet", "fixtures/launch-core/generated/devnet/state.json"), + })), + hardwareNodes, + alerts, + }; +} + +export function generateLaunchCore(paths: LaunchCorePaths = DEFAULT_LAUNCH_CORE_PATHS): { + launchCore: LaunchCoreOutput; + dashboard: DashboardData; +} { + const indexer = readJson(paths.indexerPath); + const verifier = readJson(paths.verifierPath); + const devnet = readJson(paths.devnetPath); + const hardware = readJson(paths.hardwarePath); + const launchCore = buildLaunchCore(indexer, verifier, paths); + const dashboard = buildDashboardData(launchCore, indexer, verifier, devnet, hardware); + + writeJson(paths.launchOutPath, launchCore); + writeJson(paths.transitionsOutPath, { + schema: "flowmemory.rootflow_transition_set.v0", + generatedAt: launchCore.generatedAt, + rootflowTransitions: launchCore.rootflowTransitions, + }); + writeJson(paths.dashboardOutPath, dashboard); + writeJson(paths.dashboardRuntimePath, dashboard); + + return { launchCore, dashboard }; +} + +function parseCliPaths(): LaunchCorePaths { + const args = process.argv.slice(2); + const paths = { ...DEFAULT_LAUNCH_CORE_PATHS }; + const optionMap: Record = { + "--indexer": "indexerPath", + "--verifier": "verifierPath", + "--devnet": "devnetPath", + "--hardware": "hardwarePath", + "--out": "launchOutPath", + "--transitions-out": "transitionsOutPath", + "--dashboard-out": "dashboardOutPath", + "--dashboard-runtime-out": "dashboardRuntimePath", + }; + + for (let index = 0; index < args.length; index += 1) { + const key = optionMap[args[index]]; + if (key !== undefined) { + const value = args[index + 1]; + if (value === undefined) { + throw new Error(`${args[index]} requires a path value`); + } + paths[key] = value; + index += 1; + } + } + + return paths; +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) { + process.chdir(REPO_ROOT); + const paths = parseCliPaths(); + const { launchCore, dashboard } = generateLaunchCore(paths); + console.log(JSON.stringify({ + service: "flowmemory-launch-core-v0", + launchOutPath: resolve(paths.launchOutPath), + transitionsOutPath: resolve(paths.transitionsOutPath), + dashboardOutPath: resolve(paths.dashboardOutPath), + dashboardRuntimePath: resolve(paths.dashboardRuntimePath), + memorySignals: launchCore.memorySignals.length, + memoryReceipts: launchCore.memoryReceipts.length, + rootflowTransitions: launchCore.rootflowTransitions.length, + rootfieldBundles: launchCore.rootfieldBundles.length, + agentMemoryViews: launchCore.agentMemoryViews.length, + dashboardRecords: [ + ...dashboard.flowPulseObservations, + ...dashboard.rootfields, + ...dashboard.workLanes, + ...dashboard.workReceipts, + ...dashboard.verifierReports, + ...dashboard.rootflowTransitions, + ...dashboard.memorySignals, + ...dashboard.memoryReceipts, + ...dashboard.rootfieldBundles, + ...dashboard.agentMemoryViews, + ...dashboard.devnetBlocks, + ...dashboard.hardwareNodes, + ...dashboard.alerts, + ].length, + statusAdapter: launchCore.statusAdapter, + }, null, 2)); +} diff --git a/services/flowmemory/src/launch-v0.ts b/services/flowmemory/src/launch-v0.ts new file mode 100644 index 00000000..495d6b5f --- /dev/null +++ b/services/flowmemory/src/launch-v0.ts @@ -0,0 +1,84 @@ +import { spawnSync } from "node:child_process"; +import { mkdirSync } from "node:fs"; +import { dirname, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; + +import { DEFAULT_LAUNCH_CORE_PATHS, generateLaunchCore } from "./generate-launch-core.ts"; + +const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../../.."); + +function runStep(name: string, command: string, args: string[]): void { + console.log(`\n[launch:v0] ${name}`); + const executable = process.platform === "win32" ? "cmd.exe" : command; + const finalArgs = process.platform === "win32" + ? ["/d", "/s", "/c", [command, ...args].join(" ")] + : args; + const result = spawnSync(executable, finalArgs, { + cwd: REPO_ROOT, + stdio: "inherit", + }); + + if (result.status !== 0) { + throw new Error(`${name} failed with exit code ${result.status ?? "unknown"}${result.error ? `: ${result.error.message}` : ""}`); + } +} + +export function runLaunchV0(): void { + process.chdir(REPO_ROOT); + mkdirSync("fixtures/launch-core/generated/devnet", { recursive: true }); + mkdirSync("devnet/local", { recursive: true }); + + runStep("observe FlowPulse fixtures with indexer", "npm", [ + "run", + "index:fixtures", + "--prefix", + "services/indexer", + ]); + + runStep("create verifier reports from indexed observations", "npm", [ + "run", + "verify:fixtures", + "--prefix", + "services/verifier", + ]); + + runStep("run no-value local devnet handoff", "cargo", [ + "run", + "--manifest-path", + "crates/flowmemory-devnet/Cargo.toml", + "--", + "--state", + "devnet/local/launch-v0-state.json", + "demo", + "--out-dir", + "fixtures/launch-core/generated/devnet", + ]); + + runStep("validate FlowRouter hardware POC fixture", "python", [ + "hardware/simulator/flowrouter_sim.py", + "--validate-file", + DEFAULT_LAUNCH_CORE_PATHS.hardwarePath, + ]); + + console.log("\n[launch:v0] generate Rootflow and Flow Memory V0 state"); + const { launchCore } = generateLaunchCore(DEFAULT_LAUNCH_CORE_PATHS); + + console.log(JSON.stringify({ + service: "flowmemory-launch-v0", + loadedFlowPulses: launchCore.acceptance.loadedFlowPulses, + indexedObservations: launchCore.acceptance.indexedObservations, + verifierReports: launchCore.acceptance.verifierReports, + rootflowTransitions: launchCore.acceptance.rootflowTransitions, + memorySignals: launchCore.memorySignals.length, + memoryReceipts: launchCore.memoryReceipts.length, + rootfieldBundles: launchCore.rootfieldBundles.length, + agentMemoryViews: launchCore.agentMemoryViews.length, + dashboardFixture: DEFAULT_LAUNCH_CORE_PATHS.dashboardOutPath, + dashboardRuntimeData: DEFAULT_LAUNCH_CORE_PATHS.dashboardRuntimePath, + localOnly: true, + }, null, 2)); +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) { + runLaunchV0(); +} diff --git a/services/flowmemory/src/status.ts b/services/flowmemory/src/status.ts new file mode 100644 index 00000000..b7a39272 --- /dev/null +++ b/services/flowmemory/src/status.ts @@ -0,0 +1,60 @@ +export const FLOW_MEMORY_STATUSES = [ + "observed", + "pending", + "finalized", + "verified", + "unresolved", + "failed", + "unsupported", + "reorged", + "offline", + "stale", +] as const; + +export type FlowMemoryStatus = (typeof FLOW_MEMORY_STATUSES)[number]; + +export const VERIFIER_TO_FLOW_MEMORY_STATUS = { + valid: "verified", + invalid: "failed", + unresolved: "unresolved", + unsupported: "unsupported", + reorged: "reorged", +} as const; + +export type VerifierResultStatus = keyof typeof VERIFIER_TO_FLOW_MEMORY_STATUS; + +export function verifierStatusToFlowMemoryStatus(status: string): FlowMemoryStatus { + if (status in VERIFIER_TO_FLOW_MEMORY_STATUS) { + return VERIFIER_TO_FLOW_MEMORY_STATUS[status as VerifierResultStatus]; + } + throw new Error(`unsupported verifier status for Flow Memory adapter: ${status}`); +} + +export function observationLifecycleToFlowMemoryStatus(lifecycleState: string): FlowMemoryStatus { + if (lifecycleState === "removed") { + return "reorged"; + } + if (FLOW_MEMORY_STATUSES.includes(lifecycleState as FlowMemoryStatus)) { + return lifecycleState as FlowMemoryStatus; + } + if (lifecycleState === "superseded") { + return "stale"; + } + return "observed"; +} + +export function transitionStatus(lifecycleState: string, verifierStatus?: string): FlowMemoryStatus { + const observationStatus = observationLifecycleToFlowMemoryStatus(lifecycleState); + if (observationStatus === "reorged" || observationStatus === "stale") { + return observationStatus; + } + if (verifierStatus === undefined) { + return observationStatus; + } + + const mapped = verifierStatusToFlowMemoryStatus(verifierStatus); + if (observationStatus === "pending" && mapped === "verified") { + return "pending"; + } + return mapped; +} diff --git a/services/flowmemory/src/types.ts b/services/flowmemory/src/types.ts new file mode 100644 index 00000000..38274f59 --- /dev/null +++ b/services/flowmemory/src/types.ts @@ -0,0 +1,133 @@ +import type { FlowMemoryStatus } from "./status.ts"; + +export interface MemorySignal { + schema: "flowmemory.memory_signal.v0"; + signalId: string; + observationId: string; + pulseId: string; + rootfieldId: string; + signalType: "rootfield_registration" | "root_commitment" | "unsupported_pulse"; + status: FlowMemoryStatus; + chainId: string; + emittingContract: string; + blockNumber: string; + blockHash: string; + txHash: string; + transactionIndex: string; + logIndex: string; + actor: string; + subject: string; + commitment: string; + parentPulseId: string; + sequence: string; + occurredAt: string; + uri: string; + summary: string; +} + +export interface MemoryReceipt { + schema: "flowmemory.memory_receipt.v0"; + receiptId: string; + reportId: string; + reportDigest: string; + observationId: string; + rootfieldId: string; + verifierStatus: string; + flowMemoryStatus: FlowMemoryStatus; + resolverPolicyId: string; + verifierSpecVersion: string; + checksPassed: number; + checksTotal: number; + reasonCodes: string[]; + evidenceRefs: Array>; +} + +export interface RootflowTransition { + schema: "flowmemory.rootflow_transition.v0"; + transitionId: string; + rootfieldId: string; + observationId: string; + pulseId: string; + parentPulseId: string; + parentTransitionId: string | null; + memorySignalId: string; + memoryReceiptId: string | null; + reportId: string | null; + previousRoot: string; + attemptedRoot: string; + nextRoot: string; + status: FlowMemoryStatus; + blockNumber: string; + txHash: string; + sequence: string; + reasonCodes: string[]; +} + +export interface RootfieldBundle { + schema: "flowmemory.rootfield_bundle.v0"; + bundleId: string; + rootfieldId: string; + latestRoot: string; + latestTransitionId: string | null; + status: FlowMemoryStatus; + transitionIds: string[]; + memorySignalIds: string[]; + memoryReceiptIds: string[]; + verifierReportIds: string[]; + counts: { + observations: number; + transitions: number; + receipts: number; + verified: number; + failed: number; + unresolved: number; + unsupported: number; + reorged: number; + }; +} + +export interface AgentMemoryView { + schema: "flowmemory.agent_memory_view.v0"; + viewId: string; + rootfieldId: string; + status: FlowMemoryStatus; + latestRoot: string; + latestTransitionId: string | null; + signalIds: string[]; + receiptIds: string[]; + transitionIds: string[]; + warnings: string[]; + localOnly: true; +} + +export interface LaunchCoreOutput { + schema: "flowmemory.launch_core.v0"; + generatedAt: string; + mode: "fixture"; + sourcePaths: { + indexer: string; + verifier: string; + devnet: string; + hardware: string; + }; + statusAdapter: { + valid: "verified"; + invalid: "failed"; + unresolved: "unresolved"; + unsupported: "unsupported"; + reorged: "reorged"; + }; + memorySignals: MemorySignal[]; + memoryReceipts: MemoryReceipt[]; + rootflowTransitions: RootflowTransition[]; + rootfieldBundles: RootfieldBundle[]; + agentMemoryViews: AgentMemoryView[]; + acceptance: { + loadedFlowPulses: number; + indexedObservations: number; + verifierReports: number; + rootflowTransitions: number; + dashboardFixtureGenerated: boolean; + localOnly: true; + }; +} diff --git a/services/flowmemory/test/flowmemory.test.ts b/services/flowmemory/test/flowmemory.test.ts new file mode 100644 index 00000000..4b2290bc --- /dev/null +++ b/services/flowmemory/test/flowmemory.test.ts @@ -0,0 +1,101 @@ +import assert from "node:assert/strict"; +import { mkdtempSync, readFileSync, rmSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { dirname, join, resolve } from "node:path"; +import { fileURLToPath } from "node:url"; +import test from "node:test"; + +import { + DEFAULT_LAUNCH_CORE_PATHS, + generateLaunchCore, + type DashboardData, +} from "../src/generate-launch-core.ts"; +import { + FLOW_MEMORY_STATUSES, + verifierStatusToFlowMemoryStatus, +} from "../src/status.ts"; + +const REPO_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../../.."); +process.chdir(REPO_ROOT); + +test("maps verifier statuses to Flow Memory launch vocabulary", () => { + assert.equal(verifierStatusToFlowMemoryStatus("valid"), "verified"); + assert.equal(verifierStatusToFlowMemoryStatus("invalid"), "failed"); + assert.equal(verifierStatusToFlowMemoryStatus("unresolved"), "unresolved"); + assert.equal(verifierStatusToFlowMemoryStatus("unsupported"), "unsupported"); + assert.equal(verifierStatusToFlowMemoryStatus("reorged"), "reorged"); + assert.throws(() => verifierStatusToFlowMemoryStatus("mystery")); +}); + +test("published schemas exist for every launch-core object", () => { + const schemas = [ + ["schemas/flowmemory/memory-signal.schema.json", "flowmemory.memory_signal.v0"], + ["schemas/flowmemory/memory-receipt.schema.json", "flowmemory.memory_receipt.v0"], + ["schemas/flowmemory/rootflow-transition.schema.json", "flowmemory.rootflow_transition.v0"], + ["schemas/flowmemory/rootfield-bundle.schema.json", "flowmemory.rootfield_bundle.v0"], + ["schemas/flowmemory/agent-memory-view.schema.json", "flowmemory.agent_memory_view.v0"], + ]; + + for (const [path, id] of schemas) { + const schema = JSON.parse(readFileSync(path, "utf8")) as { $id: string; required: string[] }; + assert.equal(schema.$id, id); + assert.ok(schema.required.length > 0); + } +}); + +test("generates concrete Rootflow and Flow Memory V0 outputs", () => { + const dir = mkdtempSync(join(tmpdir(), "flowmemory-launch-core-")); + const paths = { + ...DEFAULT_LAUNCH_CORE_PATHS, + launchOutPath: join(dir, "flowmemory-launch-v0.json"), + transitionsOutPath: join(dir, "rootflow-transitions.json"), + dashboardOutPath: join(dir, "flowmemory-dashboard-v0.json"), + dashboardRuntimePath: join(dir, "runtime-flowmemory-dashboard-v0.json"), + }; + try { + const { launchCore, dashboard } = generateLaunchCore(paths); + + assert.equal(launchCore.schema, "flowmemory.launch_core.v0"); + assert.equal(launchCore.statusAdapter.valid, "verified"); + assert.equal(launchCore.statusAdapter.invalid, "failed"); + assert.equal(launchCore.memorySignals.length, 7); + assert.equal(launchCore.memoryReceipts.length, 7); + assert.equal(launchCore.rootflowTransitions.length, 6); + assert.equal(launchCore.rootfieldBundles.length, 1); + assert.equal(launchCore.agentMemoryViews.length, 1); + + const transitionStatuses = new Set(launchCore.rootflowTransitions.map((transition) => transition.status)); + assert.ok(transitionStatuses.has("verified")); + assert.ok(transitionStatuses.has("failed")); + assert.ok(transitionStatuses.has("unresolved")); + assert.ok(transitionStatuses.has("unsupported")); + assert.ok(transitionStatuses.has("reorged")); + + assertDashboardCoversStatuses(dashboard); + } finally { + rmSync(dir, { recursive: true, force: true }); + } +}); + +function assertDashboardCoversStatuses(dashboard: DashboardData): void { + const records = [ + ...dashboard.flowPulseObservations, + ...dashboard.rootfields, + ...dashboard.workLanes, + ...dashboard.workReceipts, + ...dashboard.verifierReports, + ...dashboard.rootflowTransitions, + ...dashboard.memorySignals, + ...dashboard.memoryReceipts, + ...dashboard.rootfieldBundles, + ...dashboard.agentMemoryViews, + ...dashboard.devnetBlocks, + ...dashboard.hardwareNodes, + ...dashboard.alerts, + ] as Array<{ status?: string }>; + const statuses = new Set(records.map((record) => record.status)); + + for (const status of FLOW_MEMORY_STATUSES) { + assert.ok(statuses.has(status), `${status} should appear in generated dashboard fixture`); + } +}