81 lines
5.5 KiB
Markdown
81 lines
5.5 KiB
Markdown
# 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.
|