From f850002f1c562838f67cd40ae1403cfb85949203 Mon Sep 17 00:00:00 2001 From: George Lambert Date: Mon, 14 Sep 2026 13:50:45 -0400 Subject: [PATCH] Add developer credentials: URLs, lab keys, NATS token, staff IAM, git --- 00-sources.md | 55 + 01-nats-routes.md | 106 ++ 02-endpoint-io.md | 154 +++ 03-zapier-verae-path.md | 125 ++ 04-gaps-and-finish.md | 81 ++ 05-developer-credentials.md | 271 ++++ NATS.md | 9 + README.html | 2518 +++++++++++++++++++++++++++++++++++ README.md | 31 + README.pdf | Bin 0 -> 130274 bytes SUMMARY.md | 8 + package.json | 6 + 12 files changed, 3364 insertions(+) create mode 100644 00-sources.md create mode 100644 01-nats-routes.md create mode 100644 02-endpoint-io.md create mode 100644 03-zapier-verae-path.md create mode 100644 04-gaps-and-finish.md create mode 100644 05-developer-credentials.md create mode 100644 NATS.md create mode 100644 README.html create mode 100644 README.md create mode 100644 README.pdf create mode 100644 SUMMARY.md create mode 100644 package.json diff --git a/00-sources.md b/00-sources.md new file mode 100644 index 0000000..25e9d8d --- /dev/null +++ b/00-sources.md @@ -0,0 +1,55 @@ +# Sources (other documentation that names routes) + +This inventory is compiled from code and from these docs. Do not invent extra `verae.*` names. + +## Master maps + +| Path | What it names | +|------|----------------| +| `packages/docs-master/modules-and-nats.md` | Module catalog, subject table, HTTPS vs NATS | +| `packages/docs-master/MESSAGE-FLOWS.md` | Create/wait/includeAttached/batch Merkle | +| `packages/docs-master/archive-nats.md` | Archive put/query/reply | +| `docs/02-architecture/nats-subjects.md` | `verae.zapier.*` payloads + streams | +| `docs/02-architecture/modules-and-nats.md` | Same catalog as docs-master | +| `docs/02-architecture/overview.md` | Poller / events / webhooks | +| `packages/overview/03-nats-cluster.md` | Cluster URLs, who may connect | +| `packages/overview/06-address-routing.md` | Address pattern + plane mapping | +| `packages/verae-ops/06-linking-services.md` | How services attach | +| `packages/verae-nats-cluster/scripts/ensure-streams.sh` | Live stream create | +| `packages/verae-nats-cluster/conf/nats.conf.tmpl` | `:4222` / `:6222` / `:7422` / monitor `:8222` | +| `packages/verae-nats-cluster/conf/public-edge.conf.tmpl` | Public leaf `:4222`, WS `:14422` | +| `packages/verae-fleet/overlays/ns1/fleet.json` | Enabled vs in-process workers | +| `packages/verae-keep` `units.px-worker.json` | Worm/tree on LXC 510 | +| `packages/verae-zapier-middleware/src/nats/subjects.js` | Product subjects + consumers | +| `packages/zappier-account-balance/src/subjects.js` | Billing subjects | +| `packages/verae-access-authz/src/subjects.js` + `policy.js` | Authz + plane allow lists | +| `packages/zappier/src/billing-nats.ts` | Edge billing client | + +## Per-package `NATS.md` (Forgejo module copies also live under `docs-master/modules/`) + +| Package | Addresses | +|---------|-----------| +| `verae-zapier-middleware` | `jobs.watch` out, `jobs.events` in, archive.query via aggregator | +| `verae-jobs-events` | `jobs.events`; exclusive → `verae.internal.jobs.events` | +| `verae-request-splitter` | `archive.put` | +| `verae-archive-worm` | `archive.put` / `query` / `reply.` | +| `verae-tree-node` | same, `kind: tree` | +| `verae-archive-aggregator` | `query` out, `reply.` in | +| `zappier-account-balance` | `verae.billing.*` | +| `zappier` (edge) | package `NATS.md` is stale (“does not publish”); **code** publishes usage/payment/credit/customer.put when `NATS_URL` is set. Use `docs-master/modules/zappier/NATS.md` | +| `zappier-customer-service` | `statement.get`, `balance.adjust` | +| `zappier-sales-pricing` | `statement.get` | +| `zappier-accounting-export` | `statement.get` | +| `zappier-identity` | `identity.bind` / `lookup` | +| `verae-access-authz` | `authz.check` / `authz.deny` | +| `verae-access-web` | `access.web.in` / `access.web.billing.*` | +| `verae-access-api` | `access.api.*` | +| `verae-access-zapier` | `access.zapier.*` then HTTPS to middleware | +| `verae-access-leaf` | `access.leaf.in` | +| `verae-access-staff` | `access.staff.*` | +| `verae-nats-process` | `verae.example.process.*` (template) | +| `verae-nats-accounts` | policy only (INTERNAL vs LEAF) | +| `verae-zapier-simulator` | in-process replay of product addresses | +| `verae-keep` / `verae-fleet` / `verae-uptime` / `verae-backup` | no product subjects | + +Simulator `src/pipeline.js` and `src/monitors.js` list the same product addresses for traces; they are not live subscribers. diff --git a/01-nats-routes.md b/01-nats-routes.md new file mode 100644 index 0000000..34a4758 --- /dev/null +++ b/01-nats-routes.md @@ -0,0 +1,106 @@ +# Designed vs running NATS routes + +**Designed** = named in docs or in code. +**Running** = a process on NS1 is subscribed or publishing it **today**, and (for durable work) a JetStream stream exists. + +Cluster name `verae`. Internal clients use the three LXC on `vmbr1`. Public edge is a **leaf**, not a second cluster. + +Legend: **JS** = JetStream stream; **RR** = core request-reply; **pub** = core or JS fire-and-forget; **Q** = queue group. + +## Transport (TCP / leaf / public) + +These are NATS **server** routes, not `verae.*` subjects. + +| Endpoint | Designed | Running | Who | +|----------|----------|---------|-----| +| `10.10.10.21–23:4222` client | yes | **yes** | middleware, access-*, billing, worm/tree, identity, CS/sales/acct | +| `10.10.10.21–23:6222` cluster routes | yes | **yes** (private `vmbr1` only) | nats-a/b/c to each other | +| `10.10.10.21–23:7422` leaf hub | yes (public-edge) | **yes** | public edge remotes | +| `127.0.0.1:8222` monitor on each LXC | yes | **yes** | operators on the guest | +| `70.88.205.138:4222` public client | yes (token) | **yes** | leaf edge; **not** Zapier | +| `127.0.0.1:14422` WS on edge | yes | **yes** | Caddy → `wss://nats.zapier.georgelambert.org` | +| `127.0.0.1:8229` edge monitor | yes | **yes** | host loopback | +| `:6222` / `:7422` / `:8222` on `vmbr0` | **no** | **must stay closed** | — | +| Host leftover `127.0.0.1:4222` (docker-proxy) + `10.10.10.1:4222` socat | lab leftover | present | **do not** point product `NATS_URL` here | +| MQTT `:1883` | study only | **removed** | — | + +Internal keep/fleet/middleware URL: + +```text +nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222 +``` + +Public (token in `/etc/nats/public-edge.token` on NS1): `nats://@70.88.205.138:4222`. Isolation on the hub is still `$G` + private LAN. nkeys/mTLS sketched in `verae-nats-accounts`, **not** flipped. + +## JetStream streams (running) + +Created by `verae-nats-cluster/scripts/ensure-streams.sh` (middleware `ensureStreams` also creates the first three). + +| Stream | Subjects | Replicas | Storage | Who consumes | +|--------|----------|----------|---------|--------------| +| `ZAPIER_JOBS` | `verae.zapier.jobs.watch` | 3 | file | job-poller (in middleware process), Q `job-poller` | +| `ZAPIER_EVENTS` | `verae.zapier.jobs.events` | 3 | file | middleware wait + webhook router (`event-webhook-router`); optional exclusive `jobs-events` | +| `ZAPIER_WEBHOOKS` | `verae.zapier.webhooks.deliver` | 3 | file | webhook-deliver (in middleware), Q `webhook-deliver` | +| `ZAPIER_USAGE` | `verae.zapier.usage` | 3 | file | **no durable consumer** (`USAGE_WRITER` named only) | +| `VERAE_ARCHIVE` | `verae.archive.>` | 3 | file | worm + tree on LXC 510 (keep); aggregator **not** fleet-enabled | + +Billing is **core request-reply / pub**, not a JetStream stream. + +## Address inventory + +| Address | Kind | Designed | Running | Notes | +|---------|------|----------|---------|-------| +| `verae.zapier.jobs.watch` | JS work Q `job-poller` | yes | **yes** | middleware publishes; in-process poller consumes | +| `verae.zapier.jobs.events` | JS events | yes | **yes** | poller publishes; wait() subscribes; webhook worker routes | +| `verae.zapier.webhooks.deliver` | JS work Q `webhook-deliver` | yes | **yes** | same Node process as HTTP | +| `verae.zapier.usage` | JS optional | yes | stream **yes**, consumer **no** | middleware entitlement is **local files** | +| `verae.internal.jobs.events` | core republish | yes (`jobs-events` exclusive) | **partial** | only if `JOBS_EVENTS_EXCLUSIVE=1` | +| `verae.billing.statement.get` | RR Q `account-balance` | yes | **yes** | portal, CS, sales, accounting, access-web/api | +| `verae.billing.balance.get` | RR | yes | **yes** | account-balance | +| `verae.billing.balance.adjust` | RR | yes | **yes** | CS credits, portal reload | +| `verae.billing.usage.recorded` | pub | yes | **yes if edge `NATS_URL` set** | `zappier/src/app.ts` `onUsage` → `natsPublish`; account-balance subscribes | +| `verae.billing.payment.recorded` | pub | yes | **yes if `NATS_URL`** | portal reload (`portal.ts`) | +| `verae.billing.credit.applied` | pub | yes | **yes if `NATS_URL`** | admin/CS (`admin.ts`) | +| `verae.billing.customer.put` | pub | yes | **yes if `NATS_URL`** | `ledger.ts`; account-balance applies | +| `verae.access.authz.check` | RR Q `access-authz` | yes | **yes** | fleet keepFloor | +| `verae.access.authz.deny` | pub audit | yes | **yes** (on deny) | no SIEM sink | +| `verae.access.web.in` / `verae.access.web.billing.*` | ingress | yes | **yes** | mapped after authz, e.g. `verae.access.web.billing.statement.get` | +| `verae.access.api.*` | ingress | yes | **yes** | | +| `verae.access.zapier.*` | ingress | yes | **yes** | HTTPS plane; Zapier never speaks NATS | +| `verae.access.leaf.in` / `verae.access.leaf.*` | ingress | yes | **yes** | no billing | +| `verae.access.staff.*` | ingress | yes | **yes** | CS/sales/accounting | +| `verae.identity.bind` | RR Q `identity` | yes | **yes** | fleet | +| `verae.identity.lookup` | RR Q `identity` | yes | **yes** | | +| `verae.archive.put` | JS (`VERAE_ARCHIVE`) | yes | **partial** | splitter **in-process** in middleware; worm/tree on 510 consume | +| `verae.archive.query` | broadcast (no Q) | yes | **partial** | live aggregator hook **TBD** in middleware (simulator has it) | +| `verae.archive.reply.` | replies on bloom hit | yes | **partial** | worm/tree on 510 can reply; aggregator not fleet-enabled | +| `verae.splitter.in` | future | yes (docs) | **no** | splitter stays a library | +| `verae.example.process.in` / `.out` / `.reply.*` | template | yes | **no** | `verae-nats-process` is a model | +| `bench.*` | lab only | n/a | ephemeral | speed studies; not product | + +Plane mapping (`verae-access-authz`): internal `verae.billing.statement.get` + plane `web` → ingress `verae.access.web.billing.statement.get`. Planes never publish internal subjects until `authz.check` returns allow. + +## Durable consumers (named in middleware) + +| Name | Stream / subject | Running | +|------|------------------|---------| +| `job-poller` | `ZAPIER_JOBS` / `jobs.watch` | **yes** (in-process) | +| `event-webhook-router` | `ZAPIER_EVENTS` / `jobs.events` | **yes** (in-process) | +| `webhook-deliver` | `ZAPIER_WEBHOOKS` / `webhooks.deliver` | **yes** (in-process) | +| `usage-writer` | `ZAPIER_USAGE` / `verae.zapier.usage` | **no** | +| `jobs-events-exclusive` | `ZAPIER_EVENTS` | **no** unless `JOBS_EVENTS_EXCLUSIVE=1` | + +## Fleet overlay vs in-process + +`packages/verae-fleet/overlays/ns1/fleet.json` (2026-09-14): + +| Service | fleet `enabled` | Actual lab | +|---------|-----------------|------------| +| middleware-http | true | **running**; starts job-poller + webhook workers in-process when `NATS_ENABLED` | +| job-poller | **false** | covered by middleware; do not spawn a second copy | +| webhook-deliver | **false** | same | +| archive-aggregator | **false** | **not** running as a fleet worker | +| archive-worm / tree-node | **false** on host fleet | **running on LXC 510** via keep `units.px-worker.json` (1 worm + 1 tree) | +| account-balance, access-*, identity, jobs-events, CS/sales/acct, staff-iam/session, zappier-edge | true keepFloor | keepFloor | +| zapier-simulator | true, keepFloor false | optional | +| nats | managed false | 3-node cluster + leftover host loopback | diff --git a/02-endpoint-io.md b/02-endpoint-io.md new file mode 100644 index 0000000..38d1e5f --- /dev/null +++ b/02-endpoint-io.md @@ -0,0 +1,154 @@ +# Endpoint I/O + +Each product NATS address: **what it is for**, **who sends**, **who receives**, **how to attach**. + +Connect with a **long-lived** client (reconnect-per-message is the anti-pattern): + +```text +NATS_URL=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222 +``` + +Public edge (token in `/etc/nats/public-edge.token` on NS1): `nats://@70.88.205.138:4222`. Do not put that URL in Zapier or in Verae. + +--- + +## `verae.zapier.jobs.watch` + +| | | +|--|--| +| For | Work queue: “poll Verae until this `jobId` is terminal.” | +| In from | middleware `enqueueWatch` after `POST /api/timestamp` (or mock) returns `jobId` | +| Out to | job-poller worker (queue `job-poller`, durable on `ZAPIER_JOBS`) | +| Then | poller calls Verae `GET /api/status/{jobId}` over **HTTPS**, not NATS | + +Payload: `tenantId`, `veraeUserId`, `jobId`, `tokenRef`, `enqueuedAt`, `attempt`, `maxAttempts`, `intervalMs`, `traceId`. JWT stays in middleware (`tokenRef`); never on Zapier. + +**Connect Verae-side:** do **not** subscribe this from `api.veraetime.net`. The poller is the Verae HTTP client. To add another watcher, start another `job-poller` consumer in the same queue group. + +--- + +## `verae.zapier.jobs.events` + +| | | +|--|--| +| For | Terminal outcomes: `timestamp.completed` / `failed` / `timeout` | +| In from | job-poller after Verae status is not `pending` | +| Out to | (1) middleware `waitForJobEvent` (wait HTTP); (2) webhook router → `webhooks.deliver`; (3) optional `verae-jobs-events` mailbox `:3030` | + +If `JOBS_EVENTS_EXCLUSIVE=1`, only `verae-jobs-events` is the durable consumer and republishes `verae.internal.jobs.events`. Default lab: middleware wait + webhook worker share the stream. + +Payload: `event`, `tenantId`, `jobId`, `status`, `traceId`, `emittedAt`. + +--- + +## `verae.zapier.webhooks.deliver` + +| | | +|--|--| +| For | HTTPS POST to `hooks.zapier.com` (REST Hook) | +| In from | webhook worker on completed/failed events | +| Out to | Zapier cloud **HTTPS**, never NATS | + +Payload: `hookId`, `tenantId`, `targetUrl`, `event`, `payload`, `attempt`, `traceId`. Slow consumer: keep replica floors on the worker if you split it out of middleware. + +--- + +## `verae.zapier.usage` + +| | | +|--|--| +| For | Optional meter of Zap actions on NATS (JetStream) | +| In from | designed: middleware / edge | +| Out to | designed: `USAGE_WRITER` → books | +| Running | **stream exists; no writer; middleware uses local usage files** | + +Prepaid meter that **is** wired uses `verae.billing.usage.recorded` (core pub), not this stream. Finish: either publish here from `recordUsage` or drop the stream. + +--- + +## Billing (`verae.billing.*`) — account-balance source of truth + +Request-reply unless noted. Queue `account-balance`. **Not** JetStream. + +| Address | For | In from | Out to | +|---------|-----|---------|--------| +| `statement.get` | prepaid, credits, usage, payments | portal, CS, sales, accounting, access-web/api | reply to requester | +| `balance.get` | cents only | internal | reply | +| `balance.adjust` | CS credit or portal reload | CS, access-web (reload kind only) | books + reply | +| `usage.recorded` | meter pub | zappier-edge `meter()` `onUsage` when `NATS_URL` set | account-balance subscriber (debits prepaid) | +| `payment.recorded` | reload/invoice pub | portal | books | +| `credit.applied` | goodwill pub | CS/admin | books | +| `customer.put` | upsert customer | edge ledger | books | + +Authz **must** pass `verae.access.authz.check` before these from a public plane. Leaf plane **cannot** call billing (policy). + +Middleware `recordUsage` still writes **local tenant files** and does **not** publish `usage.recorded`. Two meters until that is unified. + +--- + +## Access planes + +| Address | For | In | Out | +|---------|-----|----|-----| +| `verae.access.authz.check` | allow/deny `{ plane, subject, principal }` | every plane + edge `billing-nats.ts` | `{ allow, reason }`; deny also pubs `authz.deny` | +| `verae.access.authz.deny` | audit | authz on deny | **nowhere yet** (no SIEM) | +| `verae.access.web.in` / `verae.access.web.billing.*` | browser portal | access-web HTTP | `statement.get` / `balance.adjust` kind=reload after authz | +| `verae.access.api.*` | customer `x-api-key` | access-api | statement; HTTPS to middleware for jobs | +| `verae.access.zapier.*` | Zapier HTTPS only | access-zapier | jobs.watch **via HTTP to middleware**, not Zapier NATS; usage.recorded allowed by policy | +| `verae.access.leaf.in` | S2S `{ token, target, payload }` | remote leaf | archive + jobs after authz; **never billing** | +| `verae.access.staff.*` | CS/sales/accounting | access-staff | billing after authz | + +Ingress mapping: `accessAddress(plane, 'verae.billing.statement.get')` → `verae.access..billing.statement.get`. + +--- + +## Identity + +| Address | For | In | Out | +|---------|-----|----|-----| +| `verae.identity.bind` | bind email/customerId → `veraeUserId` | portal / middleware | reply | +| `verae.identity.lookup` | lookup by customerId or veraeUserId | same | reply | + +Queue `identity`. Fleet keepFloor. + +--- + +## Archive / tree + +| Address | For | In | Out | +|---------|-----|----|-----| +| `verae.archive.put` | WORM/tree write (`kind`: publicMeta / privateMeta / file / tree) | splitter (in-process from middleware today) | every worm/tree (JS) | +| `verae.archive.query` | broadcast lookup | aggregator | **all** worm/tree, **no** queue group | +| `verae.archive.reply.` | bloom **hit only** | worm/tree | aggregator | + +Silence = miss. Chain seal does not wait on archive. Bytes never go to the chain. + +--- + +## Template / unused + +| Address | For | In | Out | Running | +|---------|-----|----|-----|---------| +| `verae.splitter.in` | future split-out splitter process | middleware | splitter | **no** | +| `verae.example.process.in` | template worker | any | `example-process` Q | **no** | +| `verae.example.process.out` | template fan-out | template | peers | **no** | +| `verae.example.process.reply.` | template reply | template | requester | **no** | +| `verae.internal.jobs.events` | exclusive mailbox republish | jobs-events | wait/webhook | **no** unless env | + +--- + +## How to connect **Verae API** to NATS + +`api.veraetime.net` is **HTTPS**. It does not subscribe. The glue is middleware: + +1. Set `VERAE_API_BASE_URL=https://api.veraetime.net` and `MOCK_VERAE=false`. +2. Middleware login (username/password) → JWT stored as `tokenRef`. +3. `POST /api/timestamp` → 202 `{ jobId }`. +4. Publish `verae.zapier.jobs.watch`. +5. Poller `GET /api/status/{jobId}` until `completed` / `failed`. +6. Publish `verae.zapier.jobs.events`. +7. Wait HTTP and/or REST Hook. + +Do **not** point Verae at `NATS_URL`. Do **not** put NATS in Zapier env. A new worker that must see seals uses `jobs.events` or HTTP `GET /zapier/v1/status/{jobId}`. + +Template for a new addressed process: clone `verae-nats-process`, rename `verae.example.process.*`, add the subject to `verae-access-authz` policy for the plane that may call it. diff --git a/03-zapier-verae-path.md b/03-zapier-verae-path.md new file mode 100644 index 0000000..a0c16de --- /dev/null +++ b/03-zapier-verae-path.md @@ -0,0 +1,125 @@ +# Zapier → Verae API → Zapier + +How a timestamp job is submitted, watched, and returned. Lab today: `MOCK_VERAE=true`. Live path is the same HTTP contract with `MOCK_VERAE=false`. + +## Rule + +```text +Zapier cloud --HTTPS only--> zap.zapier.georgelambert.org (access-zapier) + | + v HTTPS + middleware :3100 /zapier/v1 + | + +---------------+----------------+ + | HTTPS | NATS (private cluster) + v v + api.veraetime.net jobs.watch → poller + POST /api/timestamp GET /api/status/{jobId} + GET /api/status/{jobId} | + POST /api/verify v + jobs.events + | + +--------------------+--------------------+ + | wait subscriber | webhook-deliver + v v + HTTP response to Zap POST hooks.zapier.com +``` + +Zapier never has `NATS_URL`. Verae never has `NATS_URL`. + +## 1. Submit (async create) + +1. Zap action **Create Timestamp** (or curl) `POST https://zap.zapier.georgelambert.org/zapier/v1/timestamp` with portal API key `zmw_…` (not a Verae JWT). +2. access-zapier / edge: authz, then `meter()` records cents; if `NATS_URL` is set, `natsPublish(verae.billing.usage.recorded)`. +3. Forwards to middleware `POST /zapier/v1/timestamp`. +4. Middleware `checkEntitlement` (local plan limits today). +5. `veraeClient.createTimestamp`: + - **Mock:** in-process job, fake `jobId`. + - **Live:** `POST https://api.veraetime.net/api/timestamp` with JWT → **202** `{ jobId }`. +6. Splitter (in-process): hash vs attachments; optional `verae.archive.put` (bytes never go to chain). +7. `enqueueWatch` → JetStream **`verae.zapier.jobs.watch`**. +8. HTTP **202** `{ jobId, sha256, existing }` back to Zapier immediately. + +Same SHA-256 is idempotent (`existing: true`). + +## 2. Monitor (job poller) + +The poller is **in the middleware Node process** when `NATS_ENABLED=true` (`startJobPollerWorker`). Fleet does **not** spawn a second copy (`job-poller.enabled: false`). + +1. Durable consumer `job-poller` on `ZAPIER_JOBS` / `verae.zapier.jobs.watch`. +2. Resolve `tokenRef` → tenant Verae password → `POST` login → JWT (stays in middleware). +3. `GET /api/status/{jobId}` (mock or live timestamp server). +4. `pending` → `nak` after `intervalMs` (retry). +5. `completed` → publish `jobs.events` `{ event: timestamp.completed, status, jobId, tenantId, traceId }`. +6. `failed` → `timestamp.failed`. Too many attempts → `timestamp.timeout`. +7. `ack` the watch message. + +Live OpenAPI: poll until `completed` / `failed`. Hash lookup is **501** on live (`lookupHash`). Map `certificate`, `timestamp`, `blockIndex`, `sha256` into the receipt Zap samples expect. + +## 3. Wait (sync Zap step) + +**Create Timestamp and Wait** → `POST /zapier/v1/timestamp/wait`. + +1. Same as submit (watch is already on NATS). +2. `waitForJobEvent(jobId, WAIT_TIMEOUT_MS)` subscribes to **`verae.zapier.jobs.events`**. +3. On matching `jobId` event: return status JSON (certificate / receipt). +4. On timeout: `{ status: pending, jobId }` so the REST Hook can finish the Zap. + +`includeAttached`: after seal, aggregator should `verae.archive.query`; bloom hits merge extra receipts. **Simulator does this; live aggregator hook is TBD.** + +## 4. Push back to Zapier + +- **Wait response:** HTTP body on the same Zap step. +- **REST Hook:** Zapier subscribes `POST /zapier/v1/hooks`. On `jobs.events`, middleware enqueues **`verae.zapier.webhooks.deliver`**. Worker POSTs `targetUrl` (`hooks.zapier.com`). +- **Poll status:** Zap action **Find Job Status** → `GET /zapier/v1/status/{jobId}` → middleware `GET` Verae (or last event). + +## 5. Verify + +`POST /zapier/v1/verify` → middleware → Verae `POST /api/verify`. No job watch. + +## 6. Batch Merkle (designed; same bus) + +From `MESSAGE-FLOWS.md`: + +1. `POST /v1/timestamp/batch` — one item per line. +2. Middleware hashes leaves, builds Merkle tree. +3. Chain seals **only the root** (`POST /api/timestamp` on the root). +4. Each leaf proof → `verae.archive.put` `kind: tree`. +5. Central hash lookup of a leaf misses unless `includeTree=true`. +6. Aggregator broadcasts `verae.archive.query` `kinds=["tree"]`. +7. Tree node bloom hit → `archive.reply.` with proof. + +Live wait path does not yet call the aggregator, so tree-leaf receipts are not merged on NS1. + +## Connect live `api.veraetime.net` + +Still blocked on operator bind credentials. When ready: + +```bash +# middleware env +MOCK_VERAE=false +VERAE_API_BASE_URL=https://api.veraetime.net +NATS_ENABLED=true +NATS_URL=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222 +JETSTREAM_REPLICAS=3 +``` + +Then: working Verae login, one live seal, confirm 202/status/verify, map receipt fields, REST Hook to a private Zap. See `zapier-decisions/STATUS.md` “Once MOCK_VERAE=false”. + +## Billing on this path + +| Hop | Designed | Running | +|-----|----------|---------| +| Edge meter | `verae.billing.usage.recorded` | **coded**; fires when edge has `NATS_URL` | +| Account-balance | subscribe + debit prepaid; 402 if empty | **subscriber running**; 402 from books not proven on every Zap | +| Middleware quota | local files via `recordUsage` | **running**; not NATS | +| `verae.zapier.usage` | optional JS meter | stream only | + +## Connect a new internal process + +```bash +export NATS_URL=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222 +# clone verae-nats-process, rename subjects, register in verae-fleet +``` + +Jobs stay: HTTP in from Zapier → HTTPS to Verae → NATS watch/events → HTTP back to Zapier. diff --git a/04-gaps-and-finish.md b/04-gaps-and-finish.md new file mode 100644 index 0000000..4d3ad55 --- /dev/null +++ b/04-gaps-and-finish.md @@ -0,0 +1,81 @@ +# Gaps and finish list + +Modules and addresses that are designed but **not fully connected, not running as fleet workers, or not on the live Verae/Zapier path**. + +## Blocked on the operator (not a NATS bug) + +| Item | State | To finish | +|------|--------|-----------| +| Zapier Platform `push` | no login | `zapier login` → register → `MIDDLEWARE_BASE_URL=https://zap.zapier.georgelambert.org` → push private app | +| Live Verae | `MOCK_VERAE=true` | credentials; `MOCK_VERAE=false`; prove one seal | +| nkeys / mTLS | cluster `$G` only | `verae-nats-accounts` sketch; flip only after every `NATS_URL` has creds | +| Hash lookup on live OpenAPI | 501 | Verae API gap or our store | + +## Running on HTTP/NATS but incomplete routing + +| Module | Running? | NATS | Gap | +|--------|----------|------|-----| +| middleware HTTP + in-process job-poller + webhook-deliver | **yes** | watch/events/deliver | live Verae + Zapier push | +| account-balance | **yes** | billing RR + `usage.recorded` sub | prove 402 from books on a Zap when prepaid is 0 | +| zappier-edge | **yes** | `usage.recorded` / `payment.recorded` / `credit.applied` / `customer.put` **if `NATS_URL`** | confirm live process env; Stripe live | +| access-* + authz | **yes** | authz + ingress | — | +| identity | **yes** (fleet) | bind/lookup | confirm portal always binds `veraeUserId` | +| jobs-events mailbox `:3030` | **yes** (fleet) | events counter | exclusive consumer off unless `JOBS_EVENTS_EXCLUSIVE=1` | +| CS / sales / accounting | **yes** | statement/adjust | staff UX | +| archive-worm + tree-node | **yes on LXC 510** (keep) | `archive.put/query/reply` | only **1+1** copies; fleet overlay `enabled: false` for extra replicas | +| archive-aggregator | **no** as fleet worker | query/reply | enable overlay **or** finish in-process hook (`includeAttached` TBD in middleware) | +| request-splitter | library in middleware | `archive.put` | `verae.splitter.in` not used | +| `ZAPIER_USAGE` / `USAGE_WRITER` | stream yes | `verae.zapier.usage` | no consumer; middleware usage is local files | +| fleet job-poller / webhook-deliver **extra** copies | overlay **false** | same subjects | only enable if you want SSH-spread replicas **instead of** in-process (same queue names) | + +## Designed, not a live worker + +| Module | Address | What to do | +|--------|---------|------------| +| `verae-nats-process` | `verae.example.process.*` | template only; clone to add a function | +| `verae-activate` | none (HTTPS Zapier) | optional tiny app; needs Zapier login | +| `verae-zapier` (full app) | HTTPS | push after login | +| simulator | in-process fake NATS | local `:3847`; not production | +| `verae-nats-accounts` | nkeys policy | not flipped | + +## Aux (no product subjects, or HTTP only) + +| Module | NATS | Notes | +|--------|------|-------| +| `verae-keep` | none | HTTP health; restarts units | +| `verae-fleet` | none | catalog + keepFloor | +| `verae-uptime` | none | off-box HTTPS GET of public doors | +| `verae-backup` | none | disk / JetStream snapshot; no live event subject | +| `verae-bootstrap` / `verae-deploy` / `verae-proxmox` / `verae-ops` | none | install/link | +| staff-iam / staff-session / staff-ui | none | HTTP cookies | +| public NATS edge | leaf, token | **do not** use from Zapier; rotate token; later nkeys LEAF vs INTERNAL | + +## Billing triggers and event logging + +| Signal | Designed | Running | Finish | +|--------|----------|---------|--------| +| Timestamp/verify meter (edge) | `verae.billing.usage.recorded` | **code path exists** (`zappier/src/app.ts` `onUsage`) | Confirm `NATS_URL` on live edge; 402 from account-balance when prepaid empty | +| Middleware quota | local files `recordUsage` | **yes** | Either publish `usage.recorded` too or drop duplicate quota | +| Optional JS meter | `verae.zapier.usage` + `USAGE_WRITER` | stream only | Wire or delete | +| Portal reload | `payment.recorded` + `balance.adjust` | coded | confirm both fire on Stripe/test reload | +| CS credit | `balance.adjust` + `credit.applied` | coded | confirm applied pub on live | +| Customer upsert | `customer.put` | coded | — | +| Authz deny audit | `verae.access.authz.deny` | running on deny | **no SIEM sink** | +| Job lifecycle log | `jobs.events` | running | mailbox counts only — add structured log/export if needed | +| Archive put/query | `VERAE_ARCHIVE` | 510 worm/tree | aggregator not in wait path | +| Public edge | leaf | running | rotate token; do not expose `:6222` | + +## Ordered finish for message routing + +1. **Do not double-start** job-poller: either in-process **or** fleet copies, same queue `job-poller`. +2. Confirm edge **`NATS_URL`** so `usage.recorded` actually lands; then 402 from books. Unify or drop middleware local `recordUsage`. +3. Enable **archive-aggregator** (or in-process equivalent) so `includeAttached` and tree proofs work on wait/status. +4. Raise worm/tree **replica floors** on 510/more CTs if archive HA is required (fleet overlay min 3). +5. Operator: Zapier `push` + `MOCK_VERAE=false`. +6. Prove: Zap create → `jobs.watch` → live `GET /api/status` → `jobs.events` → wait body + REST Hook. +7. nkeys/mTLS after every client has creds; then lock down the public edge to accounts (LEAF vs INTERNAL). +8. Optional: exclusive `jobs-events` mailbox; SIEM on `authz.deny` and `jobs.events`; `verae.splitter.in` if splitter is split out; `USAGE_WRITER` or delete `ZAPIER_USAGE`. + +## What is already enough for a mock Zap + +HTTPS zap/mw → mock create → `jobs.watch` → in-process poller → mock status completed → `jobs.events` → wait returns mock certificate. Archive extras and live chain are the missing middle. diff --git a/05-developer-credentials.md b/05-developer-credentials.md new file mode 100644 index 0000000..916afea --- /dev/null +++ b/05-developer-credentials.md @@ -0,0 +1,271 @@ +# Developer credentials and connection info + +Lab pack for the Verae Time × Zapier stack on **NS1.GEORGELAMBERT.ORG** (`70.88.205.138`). Values below were checked **2026-09-14**. These are **lab defaults**, not production secrets. Rotate the public NATS token and admin secrets before treating this as a customer environment. + +Zapier cloud **never** gets a NATS URL or a Verae password. + +## 1. Who you are talking to + +| Host | Role | +|------|------| +| `70.88.205.138` | NS1 Proxmox. Public HTTPS + public NATS **client** edge | +| `10.10.10.20` | LXC 510 `verae-px-worker` (worm + tree) | +| `10.10.10.21–23` | LXC 511–513 `nats-a/b/c` JetStream cluster `verae` | + +SSH to the box: `ssh marchon@70.88.205.138` +Git SSH: `ssh://git@git.georgelambert.org:2223/marchon/.git` (port **2223**) + +## 2. Public HTTPS doors (live) + +Wildcard `*.zapier.georgelambert.org` → `70.88.205.138`. + +| URL | Process | Port | Last check | +|-----|---------|------|------------| +| https://zapier.georgelambert.org/ | docs catalog | files | 200 | +| https://git.georgelambert.org/ | Forgejo | :443 / SSH :2223 | 200 | +| https://portal.zapier.georgelambert.org/ | access-web → `/portal/` | :3021 | 302 → portal | +| https://api.zapier.georgelambert.org/health | access-api | :3022 | 200 | +| https://leaf.zapier.georgelambert.org/health | access-leaf | :3023 | 200 | +| https://zap.zapier.georgelambert.org/health | access-zapier | :3024 | 200 | +| https://staff.zapier.georgelambert.org/ | access-staff | :3025 | 302 login | +| https://login.zapier.georgelambert.org/ | staff-session | :3027 | 200 | +| https://iam.zapier.georgelambert.org/health | staff-iam | :3028 | 200 (`users: 5`) | +| https://cs.zapier.georgelambert.org/ | customer-service | :3011 | 302 | +| https://sales.zapier.georgelambert.org/ | sales-pricing | :3012 | 302 | +| https://acct.zapier.georgelambert.org/ | accounting-export | :3013 | 302 | +| https://mw.zapier.georgelambert.org/health | middleware | :3100 | 200 `mockVerae:true` `natsConnected:true` | +| https://fleet.zapier.georgelambert.org/ | fleet console | :3850 | 302 | +| https://nats.zapier.georgelambert.org/ | NATS WebSocket (Caddy) | 14422 | **400** on GET (expected; it is WS) | + +Loopback on NS1 (not public): zappier-edge **`127.0.0.1:13000`** (admin + Stripe + SQLite). Tunnel: + +```bash +ssh -L 13000:127.0.0.1:13000 marchon@70.88.205.138 +# then http://127.0.0.1:13000/admin and /docs +``` + +Operator console tunnel: `ssh -L 3850:127.0.0.1:3850 marchon@70.88.205.138` + +## 3. NATS + +### Internal cluster (workers, keep, fleet) + +No token. Private `vmbr1` only. + +```text +NATS_URL=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222 +JETSTREAM_REPLICAS=3 +``` + +| Port | Bind | Use | +|------|------|-----| +| `:4222` | `10.10.10.21–23` | clients | +| `:6222` | same, `vmbr1` | cluster routes — **do not publish** | +| `:7422` | same | leaf hubs for the public edge — **do not publish** | +| `:8222` | `127.0.0.1` on each LXC | monitor | + +From a laptop you **cannot** reach `10.10.10.x` unless you are on NS1 or you tunnel: + +```bash +ssh -L 14222:10.10.10.21:4222 -L 14223:10.10.10.22:4222 -L 14224:10.10.10.23:4222 marchon@70.88.205.138 +export NATS_URL=nats://127.0.0.1:14222,nats://127.0.0.1:14223,nats://127.0.0.1:14224 +``` + +### Public client edge (token) + +Live token (file `/etc/nats/public-edge.token` on NS1): + +```text +4743a49383ce2ce86e99d9d41c45c0004fe75eb23ef3a2b9 +``` + +```text +nats://4743a49383ce2ce86e99d9d41c45c0004fe75eb23ef3a2b9@70.88.205.138:4222 +wss://nats.zapier.georgelambert.org +``` + +`CONNECT` with that token returns `PONG` (checked 2026-09-14). `auth_required: true`. Server name `nats-public-edge`. **Do not** put this URL in Zapier. Recreate: `bash packages/verae-nats-cluster/scripts/expose-public.sh` on NS1. + +Leftover lab listeners (ignore for new clients): host `127.0.0.1:4222` docker-proxy, `10.10.10.1:4222` socat. zappier-edge process still has `NATS_URL=nats://127.0.0.1:4222` — billing pubs may miss the 3-node cluster until that env is flipped. + +nkeys/mTLS: **not** on. Isolation is LAN + token. + +## 4. Middleware (jobs) + +Live: `MOCK_VERAE=true`, `NATS_ENABLED=true`, cluster URL as above, `ADMIN_SECRET=change-me-admin` (default), `TOKEN_SECRET=dev-secret-change-me` (default). + +### Lab tenant (created 2026-09-14 for this pack) + +| Field | Value | +|-------|--------| +| tenantId | `tenant-dev-lab-local-89ab82de` | +| plan | free | +| API key | `zmw_pXdwlUUyMHkAvqj3RRoQ2gOG6yAUQlun` | +| mock Verae user | `lab-dev` / `lab-dev-pass` | +| veraeUserId | `vu_20ed6029b99efb2e` | + +Proven: `GET /zapier/v1/auth/me` → valid; `POST /zapier/v1/timestamp` → 202 `jobId`; wait → mock certificate `blockIndex: 42`. + +```bash +KEY=zmw_pXdwlUUyMHkAvqj3RRoQ2gOG6yAUQlun + +curl -sS -H "x-api-key: $KEY" https://mw.zapier.georgelambert.org/zapier/v1/auth/me + +curl -sS -H "x-api-key: $KEY" -H "content-type: application/json" \ + -d '{"sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}' \ + https://mw.zapier.georgelambert.org/zapier/v1/timestamp + +curl -sS -H "x-api-key: $KEY" -H "content-type: application/json" \ + -d '{"sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}' \ + https://mw.zapier.georgelambert.org/zapier/v1/timestamp/wait +``` + +Customer API plane (forwards `x-api-key` to middleware): + +```bash +curl -sS -H "x-api-key: $KEY" -H "content-type: application/json" \ + -d '{"sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}' \ + https://api.zapier.georgelambert.org/v1/timestamp +``` + +`https://zap.zapier.georgelambert.org` is the Zapier **plane**. It does **not** currently forward `x-api-key` on timestamp (401 if you curl it with a key). Zapier Platform push is still waiting on login; when it is live, set `MIDDLEWARE_BASE_URL=https://zap.zapier.georgelambert.org` and use a `zmw_…` key in the Zap. + +Mint another key (mock Verae accepts any username/password): + +```bash +curl -sS -H "content-type: application/json" \ + -d '{"email":"you@lab.local","name":"You","veraeUsername":"you","veraePassword":"you-pass"}' \ + https://mw.zapier.georgelambert.org/zapier/v1/signup +``` + +Admin list/provision: + +```bash +curl -sS -H "x-admin-secret: change-me-admin" \ + https://mw.zapier.georgelambert.org/zapier/v1/admin/tenants +``` + +## 5. Portal / zappier-edge (billing users) + +SQLite `/SSD3/moved/home-marchon/verae-stack/packages/zappier/zappier.db`. Bind `127.0.0.1:13000`. + +Seed **customer API keys** (`x-api-key` on edge `/v1/*`, **not** middleware `zmw_`): + +| Customer | tier | key | +|----------|------|-----| +| Ada (free) | free | `key-ada` | +| Grace (pro) | pro | `key-grace` | +| Linus (business) | business | `key-linus` | +| Docs Capture | free | `key-021851970d8a22c6` | + +These keys are for the **edge meter / portal**. Middleware jobs need a `zmw_…` key (section 4). + +Seed **admin console** (`/admin`, `x-admin-key` or login): + +| username | password | +|----------|----------| +| `admin` | `admin-dev-key` | +| `demo` | `$$$Adm1n###` | + +`ZAPPIER_ADMIN_KEY` default on CS/sales/staff processes: `admin-dev-key`. + +Stripe: **not** live (lab quotes only). Env `STRIPE_*` unset on the sampled edge process. + +Signup more customers at https://portal.zapier.georgelambert.org/portal/ + +## 6. Staff IAM + +https://login.zapier.georgelambert.org/ · https://iam.zapier.georgelambert.org/ + +Seed users (defaults; live IAM has these five): + +| username | password | role | +|----------|----------|------| +| `admin` | `admin-dev-key` | owner | +| `cs` | `cs-dev-key` | cs | +| `sales` | `sales-dev-key` | sales | +| `accounting` | `acct-dev-key` | accounting | +| `operator` | `fleet-dev-key` | operator | + +`STAFF_KEY` / session fallback: `admin-dev-key`. + +## 7. Leaf plane + +https://leaf.zapier.georgelambert.org/health → `verae.access.leaf.in` + +Live: `LEAF_TOKEN=leaf-dev-token` + +```bash +curl -sS -H "content-type: application/json" \ + -d '{"token":"leaf-dev-token","target":"verae.archive.put","payload":{},"principal":"dev"}' \ + https://leaf.zapier.georgelambert.org/ +``` + +Billing targets are **denied** on this plane. + +## 8. Git (Forgejo) + +| | | +|--|--| +| Web | https://git.georgelambert.org/marchon/ | +| SSH | `ssh://git@git.georgelambert.org:2223/marchon/.git` | +| User | `marchon` | +| Overview of routes | https://git.georgelambert.org/marchon/dev-overview | +| Monorepo | `master-zapier-plan-draft` | +| Bootstrap | https://git.georgelambert.org/marchon/verae-bootstrap | + +```bash +GIT_SSH_COMMAND="ssh -p 2223" git clone ssh://git@git.georgelambert.org:2223/marchon/dev-overview.git +``` + +Add your SSH public key on Forgejo (user **marchon** or a new account). Do not commit deploy tokens. + +Clone-all: + +```bash +git clone ssh://git@git.georgelambert.org:2223/marchon/verae-bootstrap.git +cd verae-bootstrap +export VERAE_SRC=$HOME/verae-src +bash scripts/fetch.sh ns1-all-in-one +``` + +## 9. Environment cheat sheet (new worker on the cluster) + +```bash +export NATS_URL=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222 +export JETSTREAM_REPLICAS=3 +export NATS_ENABLED=true +export MOCK_VERAE=true # flip to false only with live Verae login +export VERAE_API_BASE_URL=https://api.veraetime.net +export AUTHZ_URL=http://127.0.0.1:3020 +export ZAPPIER_UPSTREAM=http://127.0.0.1:3100 +export ZAPPIER_ADMIN_URL=http://127.0.0.1:13000 +export ZAPPIER_ADMIN_KEY=admin-dev-key +export LEAF_TOKEN=leaf-dev-token +export STAFF_IAM_URL=http://127.0.0.1:3028 +``` + +Template worker: clone `verae-nats-process`, rename `verae.example.process.*`. + +## 10. Not issued yet (blocked) + +| Item | Why | +|------|-----| +| Zapier Platform deploy key / `zapier login` | operator has not logged the CLI in | +| Live `api.veraetime.net` username/password | `MOCK_VERAE=true`; JWT would stay in middleware | +| NATS nkeys / account creds | cluster is `$G` + LAN | +| Stripe live secret | lab only | +| lan-134 SSH worker | disabled | + +When Zapier login exists: `MIDDLEWARE_BASE_URL=https://zap.zapier.georgelambert.org`, auth field `api_key` = `zmw_…`. + +When live Verae exists: middleware `MOCK_VERAE=false` + `VERAE_API_BASE_URL=https://api.veraetime.net` + working login. Zapier still never sees that password. + +## 11. Related docs + +- Routes: [01-nats-routes.md](01-nats-routes.md) +- Endpoint I/O: [02-endpoint-io.md](02-endpoint-io.md) +- Job path: [03-zapier-verae-path.md](03-zapier-verae-path.md) +- Gaps: [04-gaps-and-finish.md](04-gaps-and-finish.md) +- Ops start: https://zapier.georgelambert.org/packages/verae-ops/GETTING-STARTED.pdf +- Status: https://zapier.georgelambert.org/packages/zapier-decisions/STATUS.pdf diff --git a/NATS.md b/NATS.md new file mode 100644 index 0000000..3af73fb --- /dev/null +++ b/NATS.md @@ -0,0 +1,9 @@ +# NATS — dev-overview + +This repo does not subscribe. It documents every `verae.*` address and the cluster TCP/leaf ports. + +Cluster (running): `nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222` on `vmbr1`. Cluster routes `:6222`. Leaf hubs `:7422`. Monitor `127.0.0.1:8222`. + +Public client edge (token): `nats://70.88.205.138:4222` and `wss://nats.zapier.georgelambert.org`. Zapier cloud still uses **HTTPS only**. + +See [01-nats-routes.md](01-nats-routes.md) and [02-endpoint-io.md](02-endpoint-io.md). diff --git a/README.html b/README.html new file mode 100644 index 0000000..eccb533 --- /dev/null +++ b/README.html @@ -0,0 +1,2518 @@ + + + + + + + dev-overview — NATS routes and developer credentials + + + +
+

dev-overview — NATS routes and developer +credentials

+
+

dev-overview

+

Developer map of the Verae Time × Zapier NATS message +fabric: what was designed, what is actually running on NS1, how +a Zapier timestamp job reaches api.veraetime.net (or the +mock) and comes back, and what is still unwired.

+

Forgejo: +https://git.georgelambert.org/marchon/dev-overview
+SSH: +ssh://git@git.georgelambert.org:2223/marchon/dev-overview.git
+Catalog: +https://zapier.georgelambert.org/packages/dev-overview/
+Date: 2026-09-14

+

Zapier cloud never connects to NATS. It talks HTTPS +to https://zap.zapier.georgelambert.org (access-zapier) +then middleware. api.veraetime.net is HTTPS +only — middleware is the NATS client.

+

Contents

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DocWhat
00-sources.mdEvery other doc that names a NATS address or TCP route
01-nats-routes.mdTransport ports + every verae.* address: designed vs +running
02-endpoint-io.mdPer-address: purpose, inbound from, outbound to, how to connect +Verae API
03-zapier-verae-path.mdZapier → middleware → Verae timestamp server → poll → events → +Zapier
04-gaps-and-finish.mdModules not connected; billing/event/aux; ordered finish list
05-developer-credentials.mdURLs, tokens, lab API keys, staff/IAM, git, env cheat sheet
+

Cluster (running)

+
nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
+

JetStream streams (replicas=3, file): ZAPIER_JOBS, +ZAPIER_EVENTS, ZAPIER_WEBHOOKS, +ZAPIER_USAGE, VERAE_ARCHIVE.

+

Public token-gated client edge (not cluster routes): +nats://<token>@70.88.205.138:4222, +wss://nats.zapier.georgelambert.org. Do not put this in +Zapier.

+

Sources (other +documentation that names routes)

+

This inventory is compiled from code and from these docs. Do not +invent extra verae.* names.

+

Master maps

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PathWhat it names
packages/docs-master/modules-and-nats.mdModule catalog, subject table, HTTPS vs NATS
packages/docs-master/MESSAGE-FLOWS.mdCreate/wait/includeAttached/batch Merkle
packages/docs-master/archive-nats.mdArchive put/query/reply
docs/02-architecture/nats-subjects.mdverae.zapier.* payloads + streams
docs/02-architecture/modules-and-nats.mdSame catalog as docs-master
docs/02-architecture/overview.mdPoller / events / webhooks
packages/overview/03-nats-cluster.mdCluster URLs, who may connect
packages/overview/06-address-routing.mdAddress pattern + plane mapping
packages/verae-ops/06-linking-services.mdHow services attach
packages/verae-nats-cluster/scripts/ensure-streams.shLive stream create
packages/verae-nats-cluster/conf/nats.conf.tmpl:4222 / :6222 / :7422 / +monitor :8222
packages/verae-nats-cluster/conf/public-edge.conf.tmplPublic leaf :4222, WS :14422
packages/verae-fleet/overlays/ns1/fleet.jsonEnabled vs in-process workers
packages/verae-keep +units.px-worker.jsonWorm/tree on LXC 510
packages/verae-zapier-middleware/src/nats/subjects.jsProduct subjects + consumers
packages/zappier-account-balance/src/subjects.jsBilling subjects
packages/verae-access-authz/src/subjects.js + +policy.jsAuthz + plane allow lists
packages/zappier/src/billing-nats.tsEdge billing client
+

Per-package +NATS.md (Forgejo module copies also live under +docs-master/modules/)

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PackageAddresses
verae-zapier-middlewarejobs.watch out, jobs.events in, +archive.query via aggregator
verae-jobs-eventsjobs.events; exclusive → +verae.internal.jobs.events
verae-request-splitterarchive.put
verae-archive-wormarchive.put / query / +reply.<id>
verae-tree-nodesame, kind: tree
verae-archive-aggregatorquery out, reply.<id> in
zappier-account-balanceverae.billing.*
zappier (edge)package NATS.md is stale (“does not publish”); +code publishes usage/payment/credit/customer.put when +NATS_URL is set. Use +docs-master/modules/zappier/NATS.md
zappier-customer-servicestatement.get, balance.adjust
zappier-sales-pricingstatement.get
zappier-accounting-exportstatement.get
zappier-identityidentity.bind / lookup
verae-access-authzauthz.check / authz.deny
verae-access-webaccess.web.in / access.web.billing.*
verae-access-apiaccess.api.*
verae-access-zapieraccess.zapier.* then HTTPS to middleware
verae-access-leafaccess.leaf.in
verae-access-staffaccess.staff.*
verae-nats-processverae.example.process.* (template)
verae-nats-accountspolicy only (INTERNAL vs LEAF)
verae-zapier-simulatorin-process replay of product addresses
verae-keep / verae-fleet / +verae-uptime / verae-backupno product subjects
+

Simulator src/pipeline.js and +src/monitors.js list the same product addresses for traces; +they are not live subscribers.

+

Designed vs running NATS +routes

+

Designed = named in docs or in code.
+Running = a process on NS1 is subscribed or publishing +it today, and (for durable work) a JetStream stream +exists.

+

Cluster name verae. Internal clients use the three LXC +on vmbr1. Public edge is a leaf, not a +second cluster.

+

Legend: JS = JetStream stream; RR = +core request-reply; pub = core or JS fire-and-forget; +Q = queue group.

+

Transport (TCP / leaf / public)

+

These are NATS server routes, not +verae.* subjects.

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EndpointDesignedRunningWho
10.10.10.21–23:4222 clientyesyesmiddleware, access-*, billing, worm/tree, identity, +CS/sales/acct
10.10.10.21–23:6222 cluster routesyesyes (private vmbr1 only)nats-a/b/c to each other
10.10.10.21–23:7422 leaf hubyes (public-edge)yespublic edge remotes
127.0.0.1:8222 monitor on each LXCyesyesoperators on the guest
70.88.205.138:4222 public clientyes (token)yesleaf edge; not Zapier
127.0.0.1:14422 WS on edgeyesyesCaddy → wss://nats.zapier.georgelambert.org
127.0.0.1:8229 edge monitoryesyeshost loopback
:6222 / :7422 / :8222 on +vmbr0nomust stay closed—
Host leftover 127.0.0.1:4222 (docker-proxy) + +10.10.10.1:4222 socatlab leftoverpresentdo not point product NATS_URL +here
MQTT :1883study onlyremoved—
+

Internal keep/fleet/middleware URL:

+
nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
+

Public (token in /etc/nats/public-edge.token on NS1): +nats://<token>@70.88.205.138:4222. Isolation on the +hub is still $G + private LAN. nkeys/mTLS sketched in +verae-nats-accounts, not flipped.

+

JetStream streams (running)

+

Created by verae-nats-cluster/scripts/ensure-streams.sh +(middleware ensureStreams also creates the first +three).

+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
StreamSubjectsReplicasStorageWho consumes
ZAPIER_JOBSverae.zapier.jobs.watch3filejob-poller (in middleware process), Q job-poller
ZAPIER_EVENTSverae.zapier.jobs.events3filemiddleware wait + webhook router +(event-webhook-router); optional exclusive +jobs-events
ZAPIER_WEBHOOKSverae.zapier.webhooks.deliver3filewebhook-deliver (in middleware), Q webhook-deliver
ZAPIER_USAGEverae.zapier.usage3fileno durable consumer (USAGE_WRITER +named only)
VERAE_ARCHIVEverae.archive.>3fileworm + tree on LXC 510 (keep); aggregator not +fleet-enabled
+

Billing is core request-reply / pub, not a JetStream +stream.

+

Address inventory

+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressKindDesignedRunningNotes
verae.zapier.jobs.watchJS work Q job-polleryesyesmiddleware publishes; in-process poller consumes
verae.zapier.jobs.eventsJS eventsyesyespoller publishes; wait() subscribes; webhook worker routes
verae.zapier.webhooks.deliverJS work Q webhook-deliveryesyessame Node process as HTTP
verae.zapier.usageJS optionalyesstream yes, consumer nomiddleware entitlement is local files
verae.internal.jobs.eventscore republishyes (jobs-events exclusive)partialonly if JOBS_EVENTS_EXCLUSIVE=1
verae.billing.statement.getRR Q account-balanceyesyesportal, CS, sales, accounting, access-web/api
verae.billing.balance.getRRyesyesaccount-balance
verae.billing.balance.adjustRRyesyesCS credits, portal reload
verae.billing.usage.recordedpubyesyes if edge NATS_URL setzappier/src/app.ts onUsage → +natsPublish; account-balance subscribes
verae.billing.payment.recordedpubyesyes if NATS_URLportal reload (portal.ts)
verae.billing.credit.appliedpubyesyes if NATS_URLadmin/CS (admin.ts)
verae.billing.customer.putpubyesyes if NATS_URLledger.ts; account-balance applies
verae.access.authz.checkRR Q access-authzyesyesfleet keepFloor
verae.access.authz.denypub audityesyes (on deny)no SIEM sink
verae.access.web.in / +verae.access.web.billing.*ingressyesyesmapped after authz, +e.g. verae.access.web.billing.statement.get
verae.access.api.*ingressyesyes
verae.access.zapier.*ingressyesyesHTTPS plane; Zapier never speaks NATS
verae.access.leaf.in / +verae.access.leaf.*ingressyesyesno billing
verae.access.staff.*ingressyesyesCS/sales/accounting
verae.identity.bindRR Q identityyesyesfleet
verae.identity.lookupRR Q identityyesyes
verae.archive.putJS (VERAE_ARCHIVE)yespartialsplitter in-process in middleware; worm/tree on 510 +consume
verae.archive.querybroadcast (no Q)yespartiallive aggregator hook TBD in middleware (simulator +has it)
verae.archive.reply.<id>replies on bloom hityespartialworm/tree on 510 can reply; aggregator not fleet-enabled
verae.splitter.infutureyes (docs)nosplitter stays a library
verae.example.process.in / .out / +.reply.*templateyesnoverae-nats-process is a model
bench.*lab onlyn/aephemeralspeed studies; not product
+

Plane mapping (verae-access-authz): internal +verae.billing.statement.get + plane web → +ingress verae.access.web.billing.statement.get. Planes +never publish internal subjects until authz.check returns +allow.

+

Durable consumers (named +in middleware)

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NameStream / subjectRunning
job-pollerZAPIER_JOBS / jobs.watchyes (in-process)
event-webhook-routerZAPIER_EVENTS / jobs.eventsyes (in-process)
webhook-deliverZAPIER_WEBHOOKS / webhooks.deliveryes (in-process)
usage-writerZAPIER_USAGE / verae.zapier.usageno
jobs-events-exclusiveZAPIER_EVENTSno unless JOBS_EVENTS_EXCLUSIVE=1
+

Fleet overlay vs in-process

+

packages/verae-fleet/overlays/ns1/fleet.json +(2026-09-14):

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Servicefleet enabledActual lab
middleware-httptruerunning; starts job-poller + webhook workers +in-process when NATS_ENABLED
job-pollerfalsecovered by middleware; do not spawn a second copy
webhook-deliverfalsesame
archive-aggregatorfalsenot running as a fleet worker
archive-worm / tree-nodefalse on host fleetrunning on LXC 510 via keep +units.px-worker.json (1 worm + 1 tree)
account-balance, access-*, identity, jobs-events, CS/sales/acct, +staff-iam/session, zappier-edgetrue keepFloorkeepFloor
zapier-simulatortrue, keepFloor falseoptional
natsmanaged false3-node cluster + leftover host loopback
+

Endpoint I/O

+

Each product NATS address: what it is for, +who sends, who receives, how +to attach.

+

Connect with a long-lived client +(reconnect-per-message is the anti-pattern):

+
NATS_URL=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
+

Public edge (token in /etc/nats/public-edge.token on +NS1): nats://<token>@70.88.205.138:4222. Do not put +that URL in Zapier or in Verae.

+
+

verae.zapier.jobs.watch

+ ++++ + + + + + + + + + + + + + + + + + + +
ForWork queue: “poll Verae until this jobId is +terminal.”
In frommiddleware enqueueWatch after +POST /api/timestamp (or mock) returns +jobId
Out tojob-poller worker (queue job-poller, durable on +ZAPIER_JOBS)
Thenpoller calls Verae GET /api/status/{jobId} over +HTTPS, not NATS
+

Payload: tenantId, veraeUserId, +jobId, tokenRef, enqueuedAt, +attempt, maxAttempts, intervalMs, +traceId. JWT stays in middleware (tokenRef); +never on Zapier.

+

Connect Verae-side: do not +subscribe this from api.veraetime.net. The poller is the +Verae HTTP client. To add another watcher, start another +job-poller consumer in the same queue group.

+
+

verae.zapier.jobs.events

+ ++++ + + + + + + + + + + + + + + +
ForTerminal outcomes: timestamp.completed / +failed / timeout
In fromjob-poller after Verae status is not pending
Out to(1) middleware waitForJobEvent (wait HTTP); (2) webhook +router → webhooks.deliver; (3) optional +verae-jobs-events mailbox :3030
+

If JOBS_EVENTS_EXCLUSIVE=1, only +verae-jobs-events is the durable consumer and republishes +verae.internal.jobs.events. Default lab: middleware wait + +webhook worker share the stream.

+

Payload: event, tenantId, +jobId, status, traceId, +emittedAt.

+
+

verae.zapier.webhooks.deliver

+ + + + + + + + + + + + + + + +
ForHTTPS POST to hooks.zapier.com (REST Hook)
In fromwebhook worker on completed/failed events
Out toZapier cloud HTTPS, never NATS
+

Payload: hookId, tenantId, +targetUrl, event, payload, +attempt, traceId. Slow consumer: keep replica +floors on the worker if you split it out of middleware.

+
+

verae.zapier.usage

+ ++++ + + + + + + + + + + + + + + + + + + +
ForOptional meter of Zap actions on NATS (JetStream)
In fromdesigned: middleware / edge
Out todesigned: USAGE_WRITER → books
Runningstream exists; no writer; middleware uses local usage +files
+

Prepaid meter that is wired uses +verae.billing.usage.recorded (core pub), not this stream. +Finish: either publish here from recordUsage or drop the +stream.

+
+

Billing +(verae.billing.*) — account-balance source of truth

+

Request-reply unless noted. Queue account-balance. +Not JetStream.

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressForIn fromOut to
statement.getprepaid, credits, usage, paymentsportal, CS, sales, accounting, access-web/apireply to requester
balance.getcents onlyinternalreply
balance.adjustCS credit or portal reloadCS, access-web (reload kind only)books + reply
usage.recordedmeter pubzappier-edge meter() onUsage when +NATS_URL setaccount-balance subscriber (debits prepaid)
payment.recordedreload/invoice pubportalbooks
credit.appliedgoodwill pubCS/adminbooks
customer.putupsert customeredge ledgerbooks
+

Authz must pass +verae.access.authz.check before these from a public plane. +Leaf plane cannot call billing (policy).

+

Middleware recordUsage still writes local tenant +files and does not publish +usage.recorded. Two meters until that is unified.

+
+

Access planes

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressForInOut
verae.access.authz.checkallow/deny { plane, subject, principal }every plane + edge billing-nats.ts{ allow, reason }; deny also pubs +authz.deny
verae.access.authz.denyauditauthz on denynowhere yet (no SIEM)
verae.access.web.in / +verae.access.web.billing.*browser portalaccess-web HTTPstatement.get / balance.adjust kind=reload +after authz
verae.access.api.*customer x-api-keyaccess-apistatement; HTTPS to middleware for jobs
verae.access.zapier.*Zapier HTTPS onlyaccess-zapierjobs.watch via HTTP to middleware, not Zapier NATS; +usage.recorded allowed by policy
verae.access.leaf.inS2S { token, target, payload }remote leafarchive + jobs after authz; never billing
verae.access.staff.*CS/sales/accountingaccess-staffbilling after authz
+

Ingress mapping: +accessAddress(plane, 'verae.billing.statement.get') → +verae.access.<plane>.billing.statement.get.

+
+

Identity

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + +
AddressForInOut
verae.identity.bindbind email/customerId → veraeUserIdportal / middlewarereply
verae.identity.lookuplookup by customerId or veraeUserIdsamereply
+

Queue identity. Fleet keepFloor.

+
+

Archive / tree

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressForInOut
verae.archive.putWORM/tree write (kind: publicMeta / privateMeta / file +/ tree)splitter (in-process from middleware today)every worm/tree (JS)
verae.archive.querybroadcast lookupaggregatorall worm/tree, no queue group
verae.archive.reply.<correlationId>bloom hit onlyworm/treeaggregator
+

Silence = miss. Chain seal does not wait on archive. Bytes never go +to the chain.

+
+

Template / unused

+ +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AddressForInOutRunning
verae.splitter.infuture split-out splitter processmiddlewaresplitterno
verae.example.process.intemplate workeranyexample-process Qno
verae.example.process.outtemplate fan-outtemplatepeersno
verae.example.process.reply.<id>template replytemplaterequesterno
verae.internal.jobs.eventsexclusive mailbox republishjobs-eventswait/webhookno unless env
+
+

How to connect Verae +API to NATS

+

api.veraetime.net is HTTPS. It does not +subscribe. The glue is middleware:

+
    +
  1. Set VERAE_API_BASE_URL=https://api.veraetime.net and +MOCK_VERAE=false.
  2. +
  3. Middleware login (username/password) → JWT stored as +tokenRef.
  4. +
  5. POST /api/timestamp → 202 { jobId }.
  6. +
  7. Publish verae.zapier.jobs.watch.
  8. +
  9. Poller GET /api/status/{jobId} until +completed / failed.
  10. +
  11. Publish verae.zapier.jobs.events.
  12. +
  13. Wait HTTP and/or REST Hook.
  14. +
+

Do not point Verae at NATS_URL. Do +not put NATS in Zapier env. A new worker that must see +seals uses jobs.events or HTTP +GET /zapier/v1/status/{jobId}.

+

Template for a new addressed process: clone +verae-nats-process, rename +verae.example.process.*, add the subject to +verae-access-authz policy for the plane that may call +it.

+

Zapier → Verae API → Zapier

+

How a timestamp job is submitted, watched, and returned. Lab today: +MOCK_VERAE=true. Live path is the same HTTP contract with +MOCK_VERAE=false.

+

Rule

+
Zapier cloud  --HTTPS only-->  zap.zapier.georgelambert.org  (access-zapier)
+                                    |
+                                    v HTTPS
+                              middleware :3100 /zapier/v1
+                                    |
+                    +---------------+----------------+
+                    | HTTPS                         | NATS (private cluster)
+                    v                               v
+            api.veraetime.net              jobs.watch → poller
+            POST /api/timestamp            GET /api/status/{jobId}
+            GET  /api/status/{jobId}              |
+            POST /api/verify                      v
+                                           jobs.events
+                                              |
+                         +--------------------+--------------------+
+                         | wait subscriber                         | webhook-deliver
+                         v                                         v
+                    HTTP response to Zap                    POST hooks.zapier.com
+

Zapier never has NATS_URL. Verae never has +NATS_URL.

+

1. Submit (async create)

+
    +
  1. Zap action Create Timestamp (or curl) +POST https://zap.zapier.georgelambert.org/zapier/v1/timestamp +with portal API key zmw_… (not a Verae JWT).
  2. +
  3. access-zapier / edge: authz, then meter() records +cents; if NATS_URL is set, +natsPublish(verae.billing.usage.recorded).
  4. +
  5. Forwards to middleware POST /zapier/v1/timestamp.
  6. +
  7. Middleware checkEntitlement (local plan limits +today).
  8. +
  9. veraeClient.createTimestamp: +
      +
    • Mock: in-process job, fake jobId.
    • +
    • Live: +POST https://api.veraetime.net/api/timestamp with JWT → +202 { jobId }.
    • +
  10. +
  11. Splitter (in-process): hash vs attachments; optional +verae.archive.put (bytes never go to chain).
  12. +
  13. enqueueWatch → JetStream +verae.zapier.jobs.watch.
  14. +
  15. HTTP 202 { jobId, sha256, existing } +back to Zapier immediately.
  16. +
+

Same SHA-256 is idempotent (existing: true).

+

2. Monitor (job poller)

+

The poller is in the middleware Node process when +NATS_ENABLED=true (startJobPollerWorker). +Fleet does not spawn a second copy +(job-poller.enabled: false).

+
    +
  1. Durable consumer job-poller on ZAPIER_JOBS +/ verae.zapier.jobs.watch.
  2. +
  3. Resolve tokenRef → tenant Verae password → +POST login → JWT (stays in middleware).
  4. +
  5. GET /api/status/{jobId} (mock or live timestamp +server).
  6. +
  7. pending → nak after +intervalMs (retry).
  8. +
  9. completed → publish jobs.events +{ event: timestamp.completed, status, jobId, tenantId, traceId }.
  10. +
  11. failed → timestamp.failed. Too many +attempts → timestamp.timeout.
  12. +
  13. ack the watch message.
  14. +
+

Live OpenAPI: poll until completed / +failed. Hash lookup is 501 on live +(lookupHash). Map certificate, +timestamp, blockIndex, sha256 +into the receipt Zap samples expect.

+

3. Wait (sync Zap step)

+

Create Timestamp and Wait → +POST /zapier/v1/timestamp/wait.

+
    +
  1. Same as submit (watch is already on NATS).
  2. +
  3. waitForJobEvent(jobId, WAIT_TIMEOUT_MS) subscribes to +verae.zapier.jobs.events.
  4. +
  5. On matching jobId event: return status JSON +(certificate / receipt).
  6. +
  7. On timeout: { status: pending, jobId } so the REST Hook +can finish the Zap.
  8. +
+

includeAttached: after seal, aggregator should +verae.archive.query; bloom hits merge extra receipts. +Simulator does this; live aggregator hook is TBD.

+

4. Push back to Zapier

+
    +
  • Wait response: HTTP body on the same Zap step.
  • +
  • REST Hook: Zapier subscribes +POST /zapier/v1/hooks. On jobs.events, +middleware enqueues +verae.zapier.webhooks.deliver. Worker +POSTs targetUrl (hooks.zapier.com).
  • +
  • Poll status: Zap action Find Job +Status → GET /zapier/v1/status/{jobId} → +middleware GET Verae (or last event).
  • +
+

5. Verify

+

POST /zapier/v1/verify → middleware → Verae +POST /api/verify. No job watch.

+

6. Batch Merkle (designed; same +bus)

+

From MESSAGE-FLOWS.md:

+
    +
  1. POST /v1/timestamp/batch — one item per line.
  2. +
  3. Middleware hashes leaves, builds Merkle tree.
  4. +
  5. Chain seals only the root +(POST /api/timestamp on the root).
  6. +
  7. Each leaf proof → verae.archive.put +kind: tree.
  8. +
  9. Central hash lookup of a leaf misses unless +includeTree=true.
  10. +
  11. Aggregator broadcasts verae.archive.query +kinds=["tree"].
  12. +
  13. Tree node bloom hit → archive.reply.<id> with +proof.
  14. +
+

Live wait path does not yet call the aggregator, so tree-leaf +receipts are not merged on NS1.

+

Connect live +api.veraetime.net

+

Still blocked on operator bind credentials. When ready:

+
# middleware env
+MOCK_VERAE=false
+VERAE_API_BASE_URL=https://api.veraetime.net
+NATS_ENABLED=true
+NATS_URL=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
+JETSTREAM_REPLICAS=3
+

Then: working Verae login, one live seal, confirm 202/status/verify, +map receipt fields, REST Hook to a private Zap. See +zapier-decisions/STATUS.md “Once MOCK_VERAE=false”.

+

Billing on this path

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
HopDesignedRunning
Edge meterverae.billing.usage.recordedcoded; fires when edge has +NATS_URL
Account-balancesubscribe + debit prepaid; 402 if emptysubscriber running; 402 from books not proven on +every Zap
Middleware quotalocal files via recordUsagerunning; not NATS
verae.zapier.usageoptional JS meterstream only
+

Connect a new internal +process

+
export NATS_URL=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
+# clone verae-nats-process, rename subjects, register in verae-fleet
+

Jobs stay: HTTP in from Zapier → HTTPS to Verae → NATS watch/events → +HTTP back to Zapier.

+

Gaps and finish list

+

Modules and addresses that are designed but not fully +connected, not running as fleet workers, or not on the live Verae/Zapier +path.

+

Blocked on the operator +(not a NATS bug)

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ItemStateTo finish
Zapier Platform pushno loginzapier login → register → +MIDDLEWARE_BASE_URL=https://zap.zapier.georgelambert.org → +push private app
Live VeraeMOCK_VERAE=truecredentials; MOCK_VERAE=false; prove one seal
nkeys / mTLScluster $G onlyverae-nats-accounts sketch; flip only after every +NATS_URL has creds
Hash lookup on live OpenAPI501Verae API gap or our store
+

Running on HTTP/NATS +but incomplete routing

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ModuleRunning?NATSGap
middleware HTTP + in-process job-poller + webhook-deliveryeswatch/events/deliverlive Verae + Zapier push
account-balanceyesbilling RR + usage.recorded subprove 402 from books on a Zap when prepaid is 0
zappier-edgeyesusage.recorded / payment.recorded / +credit.applied / customer.put if +NATS_URLconfirm live process env; Stripe live
access-* + authzyesauthz + ingress—
identityyes (fleet)bind/lookupconfirm portal always binds veraeUserId
jobs-events mailbox :3030yes (fleet)events counterexclusive consumer off unless +JOBS_EVENTS_EXCLUSIVE=1
CS / sales / accountingyesstatement/adjuststaff UX
archive-worm + tree-nodeyes on LXC 510 (keep)archive.put/query/replyonly 1+1 copies; fleet overlay +enabled: false for extra replicas
archive-aggregatorno as fleet workerquery/replyenable overlay or finish in-process hook +(includeAttached TBD in middleware)
request-splitterlibrary in middlewarearchive.putverae.splitter.in not used
ZAPIER_USAGE / USAGE_WRITERstream yesverae.zapier.usageno consumer; middleware usage is local files
fleet job-poller / webhook-deliver extra +copiesoverlay falsesame subjectsonly enable if you want SSH-spread replicas instead +of in-process (same queue names)
+

Designed, not a live worker

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ModuleAddressWhat to do
verae-nats-processverae.example.process.*template only; clone to add a function
verae-activatenone (HTTPS Zapier)optional tiny app; needs Zapier login
verae-zapier (full app)HTTPSpush after login
simulatorin-process fake NATSlocal :3847; not production
verae-nats-accountsnkeys policynot flipped
+

Aux (no product subjects, +or HTTP only)

+ +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ModuleNATSNotes
verae-keepnoneHTTP health; restarts units
verae-fleetnonecatalog + keepFloor
verae-uptimenoneoff-box HTTPS GET of public doors
verae-backupnonedisk / JetStream snapshot; no live event subject
verae-bootstrap / verae-deploy / +verae-proxmox / verae-opsnoneinstall/link
staff-iam / staff-session / staff-uinoneHTTP cookies
public NATS edgeleaf, tokendo not use from Zapier; rotate token; later nkeys +LEAF vs INTERNAL
+

Billing triggers and event +logging

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SignalDesignedRunningFinish
Timestamp/verify meter (edge)verae.billing.usage.recordedcode path exists (zappier/src/app.ts +onUsage)Confirm NATS_URL on live edge; 402 from account-balance +when prepaid empty
Middleware quotalocal files recordUsageyesEither publish usage.recorded too or drop duplicate +quota
Optional JS meterverae.zapier.usage + USAGE_WRITERstream onlyWire or delete
Portal reloadpayment.recorded + balance.adjustcodedconfirm both fire on Stripe/test reload
CS creditbalance.adjust + credit.appliedcodedconfirm applied pub on live
Customer upsertcustomer.putcoded—
Authz deny auditverae.access.authz.denyrunning on denyno SIEM sink
Job lifecycle logjobs.eventsrunningmailbox counts only — add structured log/export if needed
Archive put/queryVERAE_ARCHIVE510 worm/treeaggregator not in wait path
Public edgeleafrunningrotate token; do not expose :6222
+

Ordered finish for message +routing

+
    +
  1. Do not double-start job-poller: either in-process +or fleet copies, same queue +job-poller.
  2. +
  3. Confirm edge NATS_URL so +usage.recorded actually lands; then 402 from books. Unify +or drop middleware local recordUsage.
  4. +
  5. Enable archive-aggregator (or in-process +equivalent) so includeAttached and tree proofs work on +wait/status.
  6. +
  7. Raise worm/tree replica floors on 510/more CTs if +archive HA is required (fleet overlay min 3).
  8. +
  9. Operator: Zapier push + +MOCK_VERAE=false.
  10. +
  11. Prove: Zap create → jobs.watch → live +GET /api/status → jobs.events → wait body + +REST Hook.
  12. +
  13. nkeys/mTLS after every client has creds; then lock down the public +edge to accounts (LEAF vs INTERNAL).
  14. +
  15. Optional: exclusive jobs-events mailbox; SIEM on +authz.deny and jobs.events; +verae.splitter.in if splitter is split out; +USAGE_WRITER or delete ZAPIER_USAGE.
  16. +
+

What is already enough +for a mock Zap

+

HTTPS zap/mw → mock create → jobs.watch → in-process +poller → mock status completed → jobs.events → wait returns +mock certificate. Archive extras and live chain are the missing +middle.

+

Developer credentials +and connection info

+

Lab pack for the Verae Time × Zapier stack on +NS1.GEORGELAMBERT.ORG (70.88.205.138). +Values below were checked 2026-09-14. These are +lab defaults, not production secrets. Rotate the public +NATS token and admin secrets before treating this as a customer +environment.

+

Zapier cloud never gets a NATS URL or a Verae +password.

+

1. Who you are talking to

+ ++++ + + + + + + + + + + + + + + + + + + + + +
HostRole
70.88.205.138NS1 Proxmox. Public HTTPS + public NATS client +edge
10.10.10.20LXC 510 verae-px-worker (worm + tree)
10.10.10.21–23LXC 511–513 nats-a/b/c JetStream cluster +verae
+

SSH to the box: ssh marchon@70.88.205.138
+Git SSH: +ssh://git@git.georgelambert.org:2223/marchon/<repo>.git +(port 2223)

+

2. Public HTTPS doors (live)

+

Wildcard *.zapier.georgelambert.org → +70.88.205.138.

+ ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
URLProcessPortLast check
https://zapier.georgelambert.org/docs catalogfiles200
https://git.georgelambert.org/Forgejo:443 / SSH :2223200
https://portal.zapier.georgelambert.org/access-web → /portal/:3021302 → portal
https://api.zapier.georgelambert.org/healthaccess-api:3022200
https://leaf.zapier.georgelambert.org/healthaccess-leaf:3023200
https://zap.zapier.georgelambert.org/healthaccess-zapier:3024200
https://staff.zapier.georgelambert.org/access-staff:3025302 login
https://login.zapier.georgelambert.org/staff-session:3027200
https://iam.zapier.georgelambert.org/healthstaff-iam:3028200 (users: 5)
https://cs.zapier.georgelambert.org/customer-service:3011302
https://sales.zapier.georgelambert.org/sales-pricing:3012302
https://acct.zapier.georgelambert.org/accounting-export:3013302
https://mw.zapier.georgelambert.org/healthmiddleware:3100200 mockVerae:true natsConnected:true
https://fleet.zapier.georgelambert.org/fleet console:3850302
https://nats.zapier.georgelambert.org/NATS WebSocket (Caddy)14422400 on GET (expected; it is WS)
+

Loopback on NS1 (not public): zappier-edge +127.0.0.1:13000 (admin + Stripe + SQLite). +Tunnel:

+
ssh -L 13000:127.0.0.1:13000 marchon@70.88.205.138
+# then http://127.0.0.1:13000/admin  and  /docs
+

Operator console tunnel: +ssh -L 3850:127.0.0.1:3850 marchon@70.88.205.138

+

3. NATS

+

Internal cluster (workers, +keep, fleet)

+

No token. Private vmbr1 only.

+
NATS_URL=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
+JETSTREAM_REPLICAS=3
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PortBindUse
:422210.10.10.21–23clients
:6222same, vmbr1cluster routes — do not publish
:7422sameleaf hubs for the public edge — do not publish
:8222127.0.0.1 on each LXCmonitor
+

From a laptop you cannot reach +10.10.10.x unless you are on NS1 or you tunnel:

+
ssh -L 14222:10.10.10.21:4222 -L 14223:10.10.10.22:4222 -L 14224:10.10.10.23:4222 marchon@70.88.205.138
+export NATS_URL=nats://127.0.0.1:14222,nats://127.0.0.1:14223,nats://127.0.0.1:14224
+

Public client edge (token)

+

Live token (file /etc/nats/public-edge.token on +NS1):

+
4743a49383ce2ce86e99d9d41c45c0004fe75eb23ef3a2b9
+
nats://4743a49383ce2ce86e99d9d41c45c0004fe75eb23ef3a2b9@70.88.205.138:4222
+wss://nats.zapier.georgelambert.org
+

CONNECT with that token returns PONG +(checked 2026-09-14). auth_required: true. Server name +nats-public-edge. Do not put this URL in +Zapier. Recreate: +bash packages/verae-nats-cluster/scripts/expose-public.sh +on NS1.

+

Leftover lab listeners (ignore for new clients): host +127.0.0.1:4222 docker-proxy, 10.10.10.1:4222 +socat. zappier-edge process still has +NATS_URL=nats://127.0.0.1:4222 — billing pubs may miss the +3-node cluster until that env is flipped.

+

nkeys/mTLS: not on. Isolation is LAN + token.

+

4. Middleware (jobs)

+

Live: MOCK_VERAE=true, NATS_ENABLED=true, +cluster URL as above, ADMIN_SECRET=change-me-admin +(default), TOKEN_SECRET=dev-secret-change-me (default).

+

Lab tenant (created +2026-09-14 for this pack)

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FieldValue
tenantIdtenant-dev-lab-local-89ab82de
planfree
API keyzmw_pXdwlUUyMHkAvqj3RRoQ2gOG6yAUQlun
mock Verae userlab-dev / lab-dev-pass
veraeUserIdvu_20ed6029b99efb2e
+

Proven: GET /zapier/v1/auth/me → valid; +POST /zapier/v1/timestamp → 202 jobId; wait → +mock certificate blockIndex: 42.

+
KEY=zmw_pXdwlUUyMHkAvqj3RRoQ2gOG6yAUQlun
+
+curl -sS -H "x-api-key: $KEY" https://mw.zapier.georgelambert.org/zapier/v1/auth/me
+
+curl -sS -H "x-api-key: $KEY" -H "content-type: application/json" \
+  -d '{"sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}' \
+  https://mw.zapier.georgelambert.org/zapier/v1/timestamp
+
+curl -sS -H "x-api-key: $KEY" -H "content-type: application/json" \
+  -d '{"sha256":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}' \
+  https://mw.zapier.georgelambert.org/zapier/v1/timestamp/wait
+

Customer API plane (forwards x-api-key to +middleware):

+
curl -sS -H "x-api-key: $KEY" -H "content-type: application/json" \
+  -d '{"sha256":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"}' \
+  https://api.zapier.georgelambert.org/v1/timestamp
+

https://zap.zapier.georgelambert.org is the Zapier +plane. It does not currently forward +x-api-key on timestamp (401 if you curl it with a key). +Zapier Platform push is still waiting on login; when it is live, set +MIDDLEWARE_BASE_URL=https://zap.zapier.georgelambert.org +and use a zmw_… key in the Zap.

+

Mint another key (mock Verae accepts any username/password):

+
curl -sS -H "content-type: application/json" \
+  -d '{"email":"you@lab.local","name":"You","veraeUsername":"you","veraePassword":"you-pass"}' \
+  https://mw.zapier.georgelambert.org/zapier/v1/signup
+

Admin list/provision:

+
curl -sS -H "x-admin-secret: change-me-admin" \
+  https://mw.zapier.georgelambert.org/zapier/v1/admin/tenants
+

5. Portal / zappier-edge +(billing users)

+

SQLite +/SSD3/moved/home-marchon/verae-stack/packages/zappier/zappier.db. +Bind 127.0.0.1:13000.

+

Seed customer API keys (x-api-key on +edge /v1/*, not middleware +zmw_):

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Customertierkey
Ada (free)freekey-ada
Grace (pro)prokey-grace
Linus (business)businesskey-linus
Docs Capturefreekey-021851970d8a22c6
+

These keys are for the edge meter / portal. +Middleware jobs need a zmw_… key (section 4).

+

Seed admin console (/admin, +x-admin-key or login):

+ + + + + + + + + + + + + + + + + +
usernamepassword
adminadmin-dev-key
demo$$$Adm1n###
+

ZAPPIER_ADMIN_KEY default on CS/sales/staff processes: +admin-dev-key.

+

Stripe: not live (lab quotes only). Env +STRIPE_* unset on the sampled edge process.

+

Signup more customers at +https://portal.zapier.georgelambert.org/portal/

+

6. Staff IAM

+

https://login.zapier.georgelambert.org/ · +https://iam.zapier.georgelambert.org/

+

Seed users (defaults; live IAM has these five):

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
usernamepasswordrole
adminadmin-dev-keyowner
cscs-dev-keycs
salessales-dev-keysales
accountingacct-dev-keyaccounting
operatorfleet-dev-keyoperator
+

STAFF_KEY / session fallback: +admin-dev-key.

+

7. Leaf plane

+

https://leaf.zapier.georgelambert.org/health → +verae.access.leaf.in

+

Live: LEAF_TOKEN=leaf-dev-token

+
curl -sS -H "content-type: application/json" \
+  -d '{"token":"leaf-dev-token","target":"verae.archive.put","payload":{},"principal":"dev"}' \
+  https://leaf.zapier.georgelambert.org/
+

Billing targets are denied on this plane.

+

8. Git (Forgejo)

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
Webhttps://git.georgelambert.org/marchon/
SSHssh://git@git.georgelambert.org:2223/marchon/<name>.git
Usermarchon
Overview of routeshttps://git.georgelambert.org/marchon/dev-overview
Monorepomaster-zapier-plan-draft
Bootstraphttps://git.georgelambert.org/marchon/verae-bootstrap
+
GIT_SSH_COMMAND="ssh -p 2223" git clone ssh://git@git.georgelambert.org:2223/marchon/dev-overview.git
+

Add your SSH public key on Forgejo (user marchon or +a new account). Do not commit deploy tokens.

+

Clone-all:

+
git clone ssh://git@git.georgelambert.org:2223/marchon/verae-bootstrap.git
+cd verae-bootstrap
+export VERAE_SRC=$HOME/verae-src
+bash scripts/fetch.sh ns1-all-in-one
+

9. +Environment cheat sheet (new worker on the cluster)

+
export NATS_URL=nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222
+export JETSTREAM_REPLICAS=3
+export NATS_ENABLED=true
+export MOCK_VERAE=true          # flip to false only with live Verae login
+export VERAE_API_BASE_URL=https://api.veraetime.net
+export AUTHZ_URL=http://127.0.0.1:3020
+export ZAPPIER_UPSTREAM=http://127.0.0.1:3100
+export ZAPPIER_ADMIN_URL=http://127.0.0.1:13000
+export ZAPPIER_ADMIN_KEY=admin-dev-key
+export LEAF_TOKEN=leaf-dev-token
+export STAFF_IAM_URL=http://127.0.0.1:3028
+

Template worker: clone verae-nats-process, rename +verae.example.process.*.

+

10. Not issued yet (blocked)

+ ++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ItemWhy
Zapier Platform deploy key / zapier loginoperator has not logged the CLI in
Live api.veraetime.net username/passwordMOCK_VERAE=true; JWT would stay in middleware
NATS nkeys / account credscluster is $G + LAN
Stripe live secretlab only
lan-134 SSH workerdisabled
+

When Zapier login exists: +MIDDLEWARE_BASE_URL=https://zap.zapier.georgelambert.org, +auth field api_key = zmw_….

+

When live Verae exists: middleware MOCK_VERAE=false + +VERAE_API_BASE_URL=https://api.veraetime.net + working +login. Zapier still never sees that password.

+ + + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..4be046f --- /dev/null +++ b/README.md @@ -0,0 +1,31 @@ +# dev-overview + +Developer map of the Verae Time × Zapier **NATS message fabric**: what was designed, what is actually running on NS1, how a Zapier timestamp job reaches `api.veraetime.net` (or the mock) and comes back, and what is still unwired. + +**Forgejo:** https://git.georgelambert.org/marchon/dev-overview +**SSH:** `ssh://git@git.georgelambert.org:2223/marchon/dev-overview.git` +**Catalog:** https://zapier.georgelambert.org/packages/dev-overview/ +**Date:** 2026-09-14 + +Zapier cloud **never** connects to NATS. It talks HTTPS to `https://zap.zapier.georgelambert.org` (access-zapier) then middleware. `api.veraetime.net` is **HTTPS only** — middleware is the NATS client. + +## Contents + +| Doc | What | +|-----|------| +| [00-sources.md](00-sources.md) | Every other doc that names a NATS address or TCP route | +| [01-nats-routes.md](01-nats-routes.md) | Transport ports + every `verae.*` address: designed vs running | +| [02-endpoint-io.md](02-endpoint-io.md) | Per-address: purpose, inbound from, outbound to, how to connect Verae API | +| [03-zapier-verae-path.md](03-zapier-verae-path.md) | Zapier → middleware → Verae timestamp server → poll → events → Zapier | +| [04-gaps-and-finish.md](04-gaps-and-finish.md) | Modules not connected; billing/event/aux; ordered finish list | +| [05-developer-credentials.md](05-developer-credentials.md) | URLs, tokens, lab API keys, staff/IAM, git, env cheat sheet | + +## Cluster (running) + +```text +nats://10.10.10.21:4222,nats://10.10.10.22:4222,nats://10.10.10.23:4222 +``` + +JetStream streams (replicas=3, file): `ZAPIER_JOBS`, `ZAPIER_EVENTS`, `ZAPIER_WEBHOOKS`, `ZAPIER_USAGE`, `VERAE_ARCHIVE`. + +Public token-gated **client** edge (not cluster routes): `nats://@70.88.205.138:4222`, `wss://nats.zapier.georgelambert.org`. Do not put this in Zapier. diff --git a/README.pdf b/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..53d92220e4443844c571a6a5b764684689033e88 GIT binary patch literal 130274 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 KNk!$wp#DD-h+`Z8 literal 0 HcmV?d00001 diff --git a/SUMMARY.md b/SUMMARY.md new file mode 100644 index 0000000..15ad1b3 --- /dev/null +++ b/SUMMARY.md @@ -0,0 +1,8 @@ +# dev-overview + +Developer map of **designed vs running** NATS addresses, transport ports, per-endpoint I/O, the Zapier → Verae timestamp path, and what is still unconnected. + +**Forgejo:** https://git.georgelambert.org/marchon/dev-overview +**Catalog:** https://zapier.georgelambert.org/packages/dev-overview/ + +Start: [README.md](README.md). Credentials: [05-developer-credentials.md](05-developer-credentials.md). diff --git a/package.json b/package.json new file mode 100644 index 0000000..50cd11b --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "name": "dev-overview", + "version": "0.1.0", + "private": true, + "description": "Developer map of designed vs running NATS routes, Zapier↔Verae job path, and remaining wiring" +}