Specs: point a stock ihasmail at the migrated server afterwards

Asked for by John, 2026-09-19. Public ihasmail is Stalwart-facing and knows
nothing about INBUXA, so running an unmodified one against the migrated
server checks something the fork's own suites cannot: that a client written
for upstream still works.

Each difference it finds is one of two things, and the point is to say
which: a regression against upstream's contract, which the fork's tests
would not catch because they test the fork; or a feature that now expects
INBUXA's own front ends, which belongs in the contract and the release
notes rather than in a user's surprise.

After mail is flowing, not as a gate. It informs the contract; it doesn't
block a cutover.
This commit is contained in:
2026-09-19 21:36:10 -07:00
parent 7d468ad22e
commit f338ddf57d
2 changed files with 39 additions and 1 deletions
+26 -1
View File
@@ -4,7 +4,9 @@ Status: draft, 2026-09-19. Nothing here has been rehearsed yet.
SPEC.md §7 step 4. This run is also the first run of the migration tool SPEC.md §7 step 4. This run is also the first run of the migration tool
INBUXA will ship (`migration.md`): what is done by hand here is what that INBUXA will ship (`migration.md`): what is done by hand here is what that
tool automates, including its rollback. Steps 1 to 3 are met: the fork builds and its suites pass tool automates, including its rollback.
Steps 1 to 3 are met: the fork builds and its suites pass
(`container-tests.md`), and all eight compat tests pass against a copy of (`container-tests.md`), and all eight compat tests pass against a copy of
INBUXA's store (`compat-tests.md`). What is left is running it as the mail INBUXA's store (`compat-tests.md`). What is left is running it as the mail
server. server.
@@ -143,6 +145,29 @@ never been checked, and checking it is worth an hour beforehand rather than
an argument at 2am. Until it is checked, treat the fork's store as an argument at 2am. Until it is checked, treat the fork's store as
forward-only. forward-only.
## After: stock ihasmail against the fork
Once the migration is done, point an **unmodified public ihasmail**
container at the new server — it can run on a laptop, since it talks JMAP
and OAuth over the network (SPEC.md §5.3) — and work through what it can
do. It needs an OAuth client it is allowed to use and a reachable URL for
the server, nothing else.
This is the one check that comes from outside the fork's own world. Public
ihasmail is Stalwart-facing by design (SPEC.md §5) and knows nothing about
INBUXA, so whatever it can no longer do is one of two things, and both are
worth knowing:
- a **regression**: the fork broke something upstream's clients rely on,
which the fork's own suites wouldn't catch because they test the fork;
- a **gap by design**: a feature that now needs INBUXA's own front ends,
which belongs in the contract (SPEC.md §5.2) and in the release notes
rather than being discovered by a user.
Write down which of the two each difference is. Do it after mail is
flowing, not as a gate: it informs the contract, it doesn't block the
cutover.
## The first week ## The first week
- **Certificate renewal.** The one thing that fails quietly and late. Watch - **Certificate renewal.** The one thing that fails quietly and late. Watch
+13
View File
@@ -83,6 +83,19 @@ The same checks as `cutover.md`, run by the tool rather than by hand:
A failed check is a failed migration, and the tool rolls back rather than A failed check is a failed migration, and the tool rolls back rather than
leaving a half-migrated server for the operator to reason about at 2am. leaving a half-migrated server for the operator to reason about at 2am.
## After a migration: the stock client
A migration that passes its own verification has proved the fork works for
the fork. Pointing an **unmodified public ihasmail** at the migrated server
proves something else: that a client which knows nothing about INBUXA still
works against it. It runs anywhere — JMAP and OAuth over the network — and
needs only an OAuth client it may use.
Each difference it turns up is either a regression against upstream's
contract or a feature that now expects INBUXA's own front ends. The tool
doesn't run this; it belongs in the release notes and the contract
(SPEC.md §5.2). It is named here so the first migration doesn't skip it.
## Rollback ## Rollback
A first-class path, not an appendix. A first-class path, not an appendix.