The outside install, restores, the week on the owner's server, Portainer updates and both registries are done. The mobile app is after v1.
79 lines
3.5 KiB
Markdown
79 lines
3.5 KiB
Markdown
# 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.
|