# 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.