# Work log Running record of milestones. Ordered by dependency. | ID | Item | Depends on | Status | |----|------|------------|--------| | M0 | Import zappier + middleware + research; git checkin | — | done `b4150c8` | | M1 | Organize layout + activate app + tests + Zapier setup guide | M0 | done `b814501` | | M2 | Git checkin after green tests | M1 | done `b814501` | | M3 | Per-module MD (params, callees, returns) | M2 | done (74 modules) | | M4 | Sphinx + PDF for every module + 10 models | M3 | done | | M5 | Git checkin docs + lessons | M4 | this commit | | M6 | Integration hardening (`/v1/add` on zappier, Add Numbers local) | M2 | done for activate-now | | M7 | Ready-to-activate final checkin | M5 | done `10c663c` | | M8 | Phase 9 wait-via-NATS + tests | M7 | done | | M9 | Phase 12 smoke | M8 | done | | M10 | Hash idempotent register/lookup mock | M7 | done | | M11 | Zappier /v1/timestamp + hash-lookup | M10 | done | | M12 | NS1 NATS 70.88.205.138 via SSH tunnel | — | done | | M13 | Echo action on activate app | M7 | done | ## Learned (M1) - Zapier Platform `perform` runs in Zapier cloud. Add Numbers can be pure arithmetic so a first push needs **no public URL**. - CLI on this machine is `zapier-platform` 19.x; app core must match (`19.1.0`). - `zapier-platform validate` is structurally sound for `packages/verae-activate`. - Hosted path is optional: zappier `POST /v1/add` is free on the rate card (`operationId: add`). - Do not mix `zapier-sdk` (consume) with `zapier-platform` (publish). ## Learned (M3–M7) - Extracting signatures from JS/TS with regex is good enough for a first API atlas; JSDoc `@param`/`@returns` is sparse in older files — fill those as we touch modules. - Sphinx `include` paths are relative to the RST file; copy MD beside RST. - Combined reportlab books fail if any flowable is taller than a page; keep one PDF per module. - Middleware gates 2–6 and 10 pass with `MOCK_VERAE=true` and NATS off. Gates 7–9/12 still need a local NATS (not required to push Add Numbers). - `zapier-platform validate` is clean with `cleanInputData: false` and a docs link on the optional API key field.