Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,19 @@ BASE_SEPOLIA_RPC_URL=
# Hex deployer key for Foundry script runs. Keep the real value out of Git.
BASE_SEPOLIA_DEPLOYER_KEY_HEX=

# Optional explorer key for Base Sepolia source verification. Keep real values
# in your shell or ignored .env file only.
BASE_SEPOLIA_BASESCAN_API_KEY=
BASESCAN_API_KEY=

# Comma-separated FlowPulse-capable contract addresses for testnet reads.
BASE_SEPOLIA_FLOWPULSE_ADDRESSES=
BASE_SEPOLIA_FROM_BLOCK=
BASE_SEPOLIA_TO_BLOCK=
BASE_SEPOLIA_FINALIZED_BLOCK=

# Optional local artifact paths for rehearsal outputs.
BASE_SEPOLIA_REHEARSAL_PLAN_OUT=fixtures/deployments/base-sepolia-rehearsal-plan.json
BASE_SEPOLIA_REHEARSAL_ARTIFACT_OUT=fixtures/deployments/base-sepolia-rehearsal.latest.json

FLOWMEMORY_DASHBOARD_DATA_PATH=apps/dashboard/public/data/flowmemory-dashboard-v0.json
64 changes: 64 additions & 0 deletions apps/dashboard/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,70 @@ npm run dev

If the API is not running, the workbench marks the control-plane as offline, shows stale fixture fallback where appropriate, and keeps rendering deterministic local data. This app is for private/local validation and canary review only; it does not initiate value-bearing wallet flows.

## Beginner Demo Path

The full launch-demo script lives in:

```text
docs/LAUNCH_DEMO_RUNBOOK.md
```

From the repo root, the normal browser-demo setup is:

```powershell
npm run flowchain:init
npm run flowchain:start
npm run flowchain:demo
npm run flowchain:export
```

Then start the local API and workbench in separate PowerShell windows:

```powershell
npm run control-plane:serve
```

```powershell
npm run workbench:dev
```

Open the Vite URL, usually:

```text
http://127.0.0.1:5173/
```

Click path for a short demo:

1. **Workbench** (`/`) for local API status, setup path, object switcher, provenance, and raw private/local object views.
2. **Overview** (`/overview`) for local fixture metrics, recent FlowPulse observations, verifier attention, hardware risk, and devnet block window.
3. **Flow Memory** (`/flowmemory`) for MemorySignal, MemoryReceipt, RootfieldBundle, AgentMemoryView, and RootflowTransition state.
4. **Base canary** (`/canary`) for the isolated guarded canary review. This is not a production-readiness claim.
5. **Raw JSON** (`/raw`) only when a reviewer asks for the payload behind the UI.

Workbench panel meanings:

| Panel | Meaning |
| --- | --- |
| Node and API status | Local chain/API health, block height, state root, pending transaction count, and API URL. |
| Local setup path | Beginner command sequence for installing, refreshing launch fixtures, starting, smoking, and opening the workbench. |
| Control-plane endpoints and local actions | Local API endpoints and optional browser-safe actions when the API advertises them. |
| Workbench coverage metrics | Counts for data source, node views, chain objects, smoke objects, and challenges. |
| Object switcher | Clickable local object views such as blocks, transactions, agents, models, receipts, reports, memory cells, challenges, finality, bridge-shaped local test objects, provenance, hardware signals, and raw JSON. |

Canary panel meanings:

| Panel | Meaning |
| --- | --- |
| Canary boundary hero | Reminder that the current Base canary is visible on Base but still gated for production. |
| Reader command / review fixture / hard boundary strip | The reader shape, runtime fixture path, and no broad scan/no production/no real-funds boundary. |
| Canary metrics | Counts from the committed canary fixture, including rejected logs and duplicates. |
| Canary FlowPulse stream | Observed canary logs with block, pulse type, transaction hash, and log index. |
| FlowPulse contracts | Canary contracts that emitted FlowPulse logs in the review fixture. |
| Launch gates | Remaining boundaries before any production claim. |
| Canary Rootflow state | Rootflow transitions reconstructed from the canary observations. |
| Canary JSON | Full loaded canary dashboard payload for reviewer inspection. |

## Data Boundary

The canonical dashboard fixture is generated by the launch-core command and lives at:
Expand Down
70 changes: 35 additions & 35 deletions apps/dashboard/public/data/flowmemory-dashboard-base-canary-v0.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"metadata": {
"schema": "flowmemory.dashboard.fixture.v0",
"generatedAt": "2026-05-13T20:05:51.625Z",
"generatedAt": "2026-05-13T23:49:07.586Z",
"mode": "canary",
"description": "Generated Base mainnet canary dashboard data from the guarded FlowPulse reader. It is canary-only and not a production-readiness claim.",
"fixturePath": "fixtures/dashboard/flowmemory-dashboard-base-canary-v0.json",
Expand Down Expand Up @@ -136,7 +136,7 @@
"currentBlock": 45955540,
"finalizedBlock": 45955540,
"source": "live",
"lastUpdated": "2026-05-13T20:05:51.625Z"
"lastUpdated": "2026-05-13T23:49:07.586Z"
},
"flowPulseObservations": [
{
Expand All @@ -161,13 +161,13 @@
"uri": "flowmemory://base-canary/rootfield",
"summary": "rootfield registration from Base canary reader",
"status": "finalized",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
},
Expand All @@ -193,13 +193,13 @@
"uri": "flowmemory://uniswap-v4/after-swap",
"summary": "swap memory signal from Base canary reader",
"status": "finalized",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
},
Expand All @@ -225,13 +225,13 @@
"uri": "flowmemory://base-canary/root",
"summary": "root commitment from Base canary reader",
"status": "finalized",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
},
Expand All @@ -257,13 +257,13 @@
"uri": "flowmemory://uniswap-v4/after-swap",
"summary": "swap memory signal from Base canary reader",
"status": "finalized",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
}
Expand All @@ -284,13 +284,13 @@
],
"evidenceUri": "docs/DEPLOYMENTS/2026-05-13-base-canary-v0.md",
"status": "finalized",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
}
Expand Down Expand Up @@ -331,13 +331,13 @@
"logIndex": "229"
},
"id": "0xef6e3d4a6375fdaf3573db4550b7a6c4ac535f6ddbf8a2759014c7e6ee5dc17d",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
},
Expand Down Expand Up @@ -373,13 +373,13 @@
"logIndex": "274"
},
"id": "0x7da37f62f68f29fdd92dde90fdb5783bce555c868bfb0181187ae955eb2d8c95",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
},
Expand Down Expand Up @@ -415,13 +415,13 @@
"logIndex": "364"
},
"id": "0x508409804fe0dae77e8ced57cb45968877fcbad6f525a99b4f911ce58759eab7",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
},
Expand Down Expand Up @@ -457,13 +457,13 @@
"logIndex": "1212"
},
"id": "0x91d0da9bc41fad8cb3fa66b72ba804f6685d34f0c167bd3fbf1ac48f91402188",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
}
Expand Down Expand Up @@ -534,13 +534,13 @@
]
},
"id": "0x1d530aa927338513f49fbd12145d05b1428347b5cfa0fb241033a9d070123637",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
},
Expand Down Expand Up @@ -609,13 +609,13 @@
]
},
"id": "0x4dbf295239f26095033ddbc39dbb3d2780a554ca697d3ea89c588bda449939d1",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
},
Expand Down Expand Up @@ -684,13 +684,13 @@
]
},
"id": "0x79640fe5901417b9254f9de76f011cdd54ffe9587aaf564f241f4b0cc2ec82da",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
},
Expand Down Expand Up @@ -759,13 +759,13 @@
]
},
"id": "0x623c146bc8899c5edadaed215cc86a1292f1f5c97acb245e86c0462190078ca5",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
}
Expand Down Expand Up @@ -804,13 +804,13 @@
"unsupported": 0,
"reorged": 0
},
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "indexer",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
}
Expand Down Expand Up @@ -842,13 +842,13 @@
"Source verification and operator policy must be completed before any production claim."
],
"localOnly": false,
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "worker",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-indexer-state.json"
}
}
Expand All @@ -862,7 +862,7 @@
"severity": "info",
"title": "Canary mode",
"summary": "Base mainnet canary logs are visible, but verifier reports, source verification, multisig ownership, and production hook wiring are not complete.",
"openedAt": "2026-05-13T20:05:51.625Z",
"openedAt": "2026-05-13T23:49:07.586Z",
"linkedObjectIds": [
"0x2a7ADd68a1d45C3251E2F92fFe4926124654a97C",
"0x179Df6d52e9DeF5D02704583a2E4E5a9FF427245",
Expand All @@ -877,13 +877,13 @@
],
"recommendedAction": "Use this view for launch demonstrations and operator review only.",
"status": "unresolved",
"lastUpdated": "2026-05-13T20:05:51.625Z",
"lastUpdated": "2026-05-13T23:49:07.586Z",
"provenance": {
"subsystem": "alerts",
"origin": "live",
"chainContext": "base-mainnet-canary",
"fixturePath": "fixtures/deployments/base-canary-indexer-state.json",
"capturedAt": "2026-05-13T20:05:51.625Z",
"capturedAt": "2026-05-13T23:49:07.586Z",
"localPathHint": "fixtures/deployments/base-canary-v0.json"
}
}
Expand Down
8 changes: 8 additions & 0 deletions contracts/DEPLOYMENT_BOUNDARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,17 +121,25 @@ Private keys must not be committed to the repo, copied into docs, or stored in g
## Current Commands

```powershell
npm run deploy:base-sepolia:plan -- --json
npm run deploy:base-sepolia
npm run deploy:base-sepolia:broadcast
npm run read:base-sepolia -- --rpc-url <base-sepolia-rpc-url> --address <flowpulse-contract> --from-block <n> --to-block <n>
npm run read:base-sepolia -- --rpc-url <base-sepolia-rpc-url> --address <flowpulse-contract> --resume-from-checkpoint --to-block <n>
npm run verify:base-canary:sources -- --json
```

`deploy:base-sepolia:plan` requires no private key and writes a non-secret
rehearsal plan to `fixtures/deployments/base-sepolia-rehearsal-plan.json`.

`deploy:base-sepolia` requires `BASE_SEPOLIA_RPC_URL` and
`BASE_SEPOLIA_DEPLOYER_KEY_HEX` from the local shell or an untracked `.env`
loader. The example file is `.env.example`; real key material must stay
outside Git.

The detailed public testnet rehearsal runbook is
`docs/DEPLOYMENTS/BASE_SEPOLIA_REHEARSAL.md`.

`verify:base-canary:sources` reads `fixtures/deployments/base-canary-v0.json`
and prints a dry-run verification plan by default. It also writes the same
non-secret plan to
Expand Down
Loading
Loading