Document verifiable public launch readiness

This commit is contained in:
SimpleTest 2026-07-25 16:46:45 +03:00
parent 6302fd4045
commit 62f1c4d9fc
4 changed files with 129 additions and 1 deletions

View File

@ -235,7 +235,9 @@ presented as an FCM or APNs implementation; an external provider must resolve
the stable user recipient to registered devices. the stable user recipient to registered devices.
The commands, boundaries, and unclaimed production properties are documented The commands, boundaries, and unclaimed production properties are documented
in [the operations runbook](docs/operations.md). in [the operations runbook](docs/operations.md). Use the
[public launch checklist](docs/public-launch-checklist.md) to keep automated
evidence separate from provider, staffing, and jurisdiction-specific approvals.
Local defaults are intentionally limited to local development. Copy Local defaults are intentionally limited to local development. Copy
`.env.example` to `.env` and replace every secret before any public deployment. `.env.example` to `.env` and replace every secret before any public deployment.

View File

@ -216,6 +216,10 @@ Check an environment without printing its secret values:
./scripts/check-environment-readiness.sh .env --require-release ./scripts/check-environment-readiness.sh .env --require-release
``` ```
The complete promotion sequence and the human/provider decisions that these
scripts cannot prove are listed in
[`docs/public-launch-checklist.md`](public-launch-checklist.md).
Provider downloads can be imported into that same file without placing Provider downloads can be imported into that same file without placing
secrets on a command line or printing them: secrets on a command line or printing them:

View File

@ -0,0 +1,116 @@
# Public launch checklist
This checklist separates properties the repository can verify from decisions
that require the operator, a provider, or jurisdiction-specific legal review.
Checking a box is an operator record, not proof created by the application.
Do not replace unknown values with estimates.
## 1. Freeze the candidate
- [ ] Record the candidate Git revision and immutable application, PostGIS,
socket-proxy, and edge image references.
- [ ] Confirm that the target is the independent production checkout, Compose
project, database, volumes, secrets, Google/Firebase project, SMTP
credentials, and Android identity.
- [ ] Keep development, hackathon test, and production credentials separate.
- [ ] Run the repository quality suite and retain its non-secret evidence.
```bash
git rev-parse HEAD
./scripts/quality.sh
```
## 2. Verify production configuration without exposing secrets
Run both checks against the single ignored production `.env`. The first reports
capabilities; the second additionally enforces the repository's release
requirements.
```bash
./scripts/validate-production-env.sh .env whoneedhelp.com
./scripts/check-environment-readiness.sh .env --require-release
```
The release check covers the application origin and secrets, database
selection, SMTP and support routing, Google OAuth, browser VAPID, Firebase/FCM,
Android package/signing configuration, and production App Links. It does not
prove that external providers will deliver successfully after deployment.
## 3. Record human and legal decisions
The following decisions are intentionally not generated by code:
- [ ] Launch jurisdictions and the exact local emergency contacts shown to
users have been approved.
- [ ] Privacy notice, Terms, medicine/prohibited-items guidance, and voluntary
payment/reimbursement wording have been reviewed for those jurisdictions.
- [ ] A retention and anonymisation schedule defines each account, safety,
dispute, moderation, support, legal, tracking-evidence, and backup record.
- [ ] The account-deletion executor and operator procedure have been approved
and tested against that schedule before destructive execution is enabled.
- [ ] Moderation, support, privacy, account-deletion, content-removal, and
incident queues have named owners and monitored contact paths.
- [ ] Provider terms and capacity are approved for email, map tiles, Google
identity, Web Push, Firebase/FCM, database hosting, backups, and monitoring.
- [ ] Representative load measurements from the intended host and traffic shape
justify database pools, action-limit policies, replica counts, memory/CPU
allocation, alerts, and any scaling thresholds.
- [ ] Backup ownership, encryption-key custody, off-site destination, restore
procedure, and measured recovery objectives have been approved.
Until the retention decision and tested executor exist, account-deletion cases
remain an audited operator workflow and automatic erasure stays disabled. The
software must not claim that an unresolved legal or operational item is
complete.
## 4. Rehearse recovery before promotion
Create a current custom-format backup and restore it only into the isolated
drill database. Then rehearse the current release against that backup.
```bash
backup_output=$(./scripts/backup-compose.sh)
backup_path=$(printf '%s\n' "$backup_output" | sed -n 's/^Backup: //p')
./scripts/restore-drill-compose.sh "$backup_path"
./scripts/upgrade-rehearsal-compose.sh "$backup_path"
./scripts/production-rollback-drill.sh
```
Local backups and local MinIO drills verify mechanics but are not proof of
off-site durability or a production recovery policy.
## 5. Promote with an explicit rollback point
Use the release workflow in `docs/operations.md`; do not copy mutable source
over a running production checkout. A successful release must retain the
generated rollback manifest, the pre-release backup checksum/catalog, and the
previous immutable image references. A forward-only migration must be treated
as forward-only rather than receiving an invented database rollback.
## 6. Verify the deployed product
- [ ] Public HTTPS home, liveness, readiness, WebSocket upgrade, manifest, and
`assetlinks.json` return the expected production identity.
- [ ] Registration, returning-user login, and settings linking complete against
the production Google OAuth client and exact callback origin.
- [ ] A production-generated authentication email reaches an external mailbox;
sender identity and every URL use the production domain.
- [ ] Browser Web Push reaches a real subscribed browser.
- [ ] The production Android build signs in, opens verified App Links, receives
FCM, and performs user-started foreground location sharing on a physical
device.
- [ ] The full two-person help flow passes: create, discover, accept, chat,
optional tracking, start, handover code, both confirmations, blind review,
report/block, and notification delivery.
- [ ] The Activity flow passes: create, request to join, approve/decline,
withdraw, rejoin, group chat, exact-location disclosure only after
approval, and reporting.
- [ ] Support, privacy/data, account-deletion, general content-removal, and
TAKE IT DOWN submissions reach the correct production operator queues.
- [ ] Database, application, worker, email, push, backup, and edge monitoring
are visible to the responsible operator.
Record observed timestamps, revision/image identities, and non-secret evidence
paths in `docs/verification.md`. Record failed checks as failed; do not convert
them into documentation-only success.

View File

@ -1611,6 +1611,12 @@ None of the observations below describe the current delivery path.
## Known work before a public production launch ## Known work before a public production launch
The operator-facing sequence is maintained in
[`docs/public-launch-checklist.md`](public-launch-checklist.md). That checklist
separates repository-verifiable evidence from external provider, staffing, and
jurisdiction-specific decisions; an unchecked or unknown item is not claimed
complete.
- Promote the tested release from `test.whoneedhelp.com` to the independent - Promote the tested release from `test.whoneedhelp.com` to the independent
production project only after explicit approval. Recheck the production production project only after explicit approval. Recheck the production
health endpoints, migrations, Google callback, and authentication-email flow health endpoints, migrations, Google callback, and authentication-email flow