# Ready for v1 checklist v1.0 ships when every box is ticked. It gathers the roadmap's definition of done ([09](spec/09-roadmap.md)) and its open real-hardware checks, plus the security leftovers (08 §6). Tick a box only with proof: a date and what was seen. ## Built - [x] Milestones M0–M11 built and tested (simulated phones and a simulated voip.ms). - [x] Security review (M11-T8), with an independent review (08 §6). ## Real voip.ms account (M3) - [x] The trunk shows **Registered** in the UI (2026-10-21: green, voip.ms, the sub-account at its POP). - [x] A mobile → DID call rings a phone. 2026-10-21: DID → digital receptionist → browser phone; the DID came in the Request-URI (written down in 06 §3). - [x] An outbound call shows the DID as caller ID on the mobile (2026-10-21, owner). - [ ] Write down in 06 §4 whether per-call caller ID (Remote-Party-ID) is honored. ## Real phones (M8, M10) - [x] Linphone on a real phone registers by scanning the QR (2026-10-20, iPhone). - [x] An incoming call rings that Linphone while the app is open (2026-10-21, v0.0.2: DID → receptionist → 100 rings the iPhone). - [ ] A factory-reset Yealink pointed at the setup URL registers with the right name and BLF keys. - [ ] A Grandstream gets its keys the same way. - [ ] Paging auto-answers on a real Yealink or Grandstream. On hold until the owner has the phones (2026-10-21). ## Someone else installs it (M11) - [x] An outside tester follows only the admin guide and gets inbound and outbound calls working on a fresh VM (2026-10-28, owner). - [x] A backup restores on a second VM (2026-10-28, owner). ## A week on the owner's server - [x] 7 days handling real calls with no crash or restart of the api or Asterisk (2026-10-28, owner). - [x] Nightly backups restore cleanly (2026-10-28, owner). ## Updating Docker only, never bare metal (owner, 2026-10-21). - [x] The api backs up before it changes the database, and stops if it can't (2026-10-21). - [x] `scripts/update.sh` for compose installs, and the admin guide's "Updating" section for compose and Portainer (2026-10-21). - [x] `scripts/update.sh` on a throwaway compose install (Docker in Docker, 2026-10-21): `install.sh` at v0.0.2, then a test v0.0.3 with a migration (the api backed up, then migrated), then a test v0.0.4 whose api crashes after migrating: one backup despite the restarts, and the script went back to v0.0.3 with that backup restored. - [ ] A real compose install with the bundled Caddy updated with `scripts/update.sh`, with calls and backups. - [x] The owner's Portainer stack updated to a release that changes the database, several times (2026-10-28, owner). ## Security leftovers (08 §6) Owner's decision (2026-10-21): fix all of them. Each is in 08 §6 with its test. - [x] Asterisk no longer loads `app_system`, `func_shell`, `app_disa`, `res_agi` or `app_externalivr`; `pnpm test:asterisk` passes. - [x] Turning two-step sign-in on asks for the password again. - [x] `*97`/`*98`: one voicemail login at a time per phone, 10 an hour. - [x] An unknown MAC answers `/prov` like a known one (401). - [x] The login limiter forgets old entries. ## The release - [ ] Version 1.0.0 in every `package.json`, and a v1.0.0 entry in the [changelog](../CHANGELOG.md). - [x] The release builds and pushes images to both the Gitea registry and ghcr.io (2026-10-28, owner). ## Not needed for v1 The mobile app (owner, 2026-10-28), more SIP providers (Telnyx, Flowroute, Twilio), SMS, push notifications for phone apps, and the M12 list in the roadmap.