Add Zapier interface simulator, tree-node Merkle lookups, and user docs
Some checks are pending
offline / test (push) Waiting to run

In-process trace console validates hops, faults, recoveries, and
suggested changes before zapier-platform push. User guide covers
signup through central-chain and bulk-summary tree-node hash lookup.
This commit is contained in:
George Lambert 2026-09-11 12:58:03 -04:00
parent 3daa88866d
commit f3dc0e6eee
56 changed files with 2341 additions and 8 deletions

View file

@ -27,3 +27,18 @@ After seal is known, aggregator publishes `verae.archive.query`. Each WORM: bloo
## 5. Multipart attachments
Splitter emits one `archive.put` per file (`kind: file`, `contentSha256`). Chain never stores bytes.
## 6. Batch Merkle (bulk summary)
1. Zapier → `POST /v1/timestamp/batch` (one item per line)
2. Middleware hashes each item (leaves), builds Merkle tree
3. Chain seals **only the root**
4. Each leaf proof → `verae.archive.put` `kind: tree` on a sharded tree node
5. Central `GET /hashes/{leaf}` → miss (`itemizedOnMainChain: false`)
6. `GET /hashes/{leaf}?includeTree=true` → aggregator broadcasts `verae.archive.query` `kinds=["tree"]`
7. Tree node bloom hit → `archive.reply.<id>` with proof; others silent
8. Response: root seal + `tree-leaf` receipt
## 7. Simulator
`packages/verae-zapier-simulator` replays flows 16 in-process with a trace console, fault injection, and modification suggestions. It does not connect to live NATS.

View file

@ -17,6 +17,9 @@ Summaries, NATS contracts, and message flows for every Verae Time × Zapier modu
| verae-request-splitter | https://git.georgelambert.org/marchon/verae-request-splitter |
| verae-archive-worm | https://git.georgelambert.org/marchon/verae-archive-worm |
| verae-archive-aggregator | https://git.georgelambert.org/marchon/verae-archive-aggregator |
| verae-tree-node | https://git.georgelambert.org/marchon/verae-tree-node |
| verae-zapier-simulator | https://git.georgelambert.org/marchon/verae-zapier-simulator |
| zapier-user-docs | https://git.georgelambert.org/marchon/zapier-user-docs |
| **zapier-docs-master** (this repo) | https://git.georgelambert.org/marchon/zapier-docs-master |
Clone (SSH port 2223):
@ -34,6 +37,9 @@ Clone (SSH port 2223):
| request-splitter | Hash vs files | — | archive.put |
| archive-worm | Bloom WORM node | archive.query, archive.put | archive.reply.* (hit only) |
| archive-aggregator | Merge archive replies | archive.reply.* | archive.query |
| tree-node | Merkle leaf proofs | archive.query, archive.put | archive.reply.* (hit only) |
| zapier-simulator | Trace console (in-process) | — | — |
| zapier-user-docs | Signup → lookup guide | — | — |
## Documents in this repo

View file

@ -54,6 +54,7 @@ If later attach jobs exist for that hash, `receipts` is an array: seal first, th
| `verae.archive.reply.<correlationId>` | archive on bloom hit | aggregator |
Query payload: `{ correlationId, sha256, tenantId, kinds[] }`.
`kinds` may include `tree` for Merkle leaf proofs (hashes sealed only as a bulk summary root).
Reply payload: `{ archiveId, sha256, records[] }`.
Bloom miss → no reply. Aggregator timeout → complete with whatever arrived.

View file

@ -32,6 +32,9 @@ Zapier cloud **never** connects to NATS. Only middleware workers and archives do
| request-splitter | `verae-request-splitter` | In middleware | HTTP body / multipart | chain hash; `verae.archive.put` |
| archive-aggregator | `verae-archive-aggregator` | Worker / in wait | `includeAttached` on wait | `verae.archive.query`; reads `verae.archive.reply.<id>` |
| archive-worm | `verae-archive-worm` | N copies | `verae.archive.query`, `verae.archive.put` | `verae.archive.reply.<id>` if bloom hits |
| tree-node | `verae-tree-node` | N copies (WORM role) | `verae.archive.query`, `verae.archive.put` kind `tree` | `verae.archive.reply.<id>` if bloom hits |
| zapier-simulator | `verae-zapier-simulator` | Local HTTP :3847 | operator browser | in-process replay of all addresses |
| zapier-user-docs | `zapier-user-docs` | Static | — | catalog `/user-docs/` |
| verae-chain-client | `verae-chain-client` | Library | — | HTTPS `api.veraetime.net` or MOCK |
| docs-master | `zapier-docs-master` | Static | — | published on zapier.georgelambert.org |

View file

@ -0,0 +1,7 @@
# NATS — verae-tree-node
| Direction | Address | From / to | Body |
|-----------|---------|-----------|------|
| IN | `verae.archive.put` | merkle builder | `{ sha256, kind: "tree", record: { merkleRoot, proof, leafIndex, chainSealJobId } }` |
| IN | `verae.archive.query` | aggregator (broadcast) | `{ correlationId, sha256, kinds: ["tree", …] }` |
| OUT | `verae.archive.reply.<correlationId>` | aggregator | only if bloom.mightHave(sha256) |

View file

@ -0,0 +1,9 @@
# verae-tree-node
**Job:** Hold inclusion proofs for SHA-256 leaves that were registered only as part of a bulk Merkle summary. The main Verae chain itemizes the **root**, not each leaf.
**Expects messages from:** middleware batch path (`verae.archive.put` kind `tree`); aggregator (`verae.archive.query`).
**Sends messages to:** `verae.archive.reply.<correlationId>` on bloom hit.
**Does not talk to Zapier.** Same bloom-silence rule as `verae-archive-worm`.

View file

@ -0,0 +1,3 @@
# NATS — verae-zapier-simulator
In-process replay of `jobs.watch`, `jobs.events`, `archive.put`, `archive.query`, `archive.reply.*`. No live subscribe.

View file

@ -0,0 +1,7 @@
# verae-zapier-simulator
**Job:** Zapier-like UI + hop-by-hop trace console to validate messaging, assumptions, delays, failures, recoveries, and suggested modifications before `zapier-platform push`.
**Expects:** HTTP `:3847` or `Simulator.run` in tests.
**Sends:** nothing to live NATS / Zapier / Verae.

View file

@ -0,0 +1,3 @@
# NATS — zapier-user-docs
Static docs. Users never configure NATS in Zapier.

View file

@ -0,0 +1,3 @@
# zapier-user-docs
**Job:** Customer guide from signup through register, central-chain lookup, and tree-node lookup of bulk-summary leaves.