diff --git a/docs/experiment-review.md b/docs/experiment-review.md index 7f08e0d..4d0e9b0 100644 --- a/docs/experiment-review.md +++ b/docs/experiment-review.md @@ -242,10 +242,12 @@ That is also an injection and spam vector. Ticket ids are non-guessable (10 Crockford base32 characters), but sender policy belongs to the application, not to MAS. -## Decision gate (MAS-WP-0002), recommendation +## Decision gate (MAS-WP-0002) -The gate asks which additions answer a need the experiment demonstrated. -This is a recommendation; the decision is the founder's. +**Decided 2026-10-18 (founder):** the recommendation below, plus the +address composer pulled forward. Follow-up work: MAS-WP-0004 (Postfix +profile), MAS-WP-0005 (spec errata and v0.2 drafts), MAS-WP-0006 +(composer). MAS-WP-0007 retires the live test environment later. | Candidate | Demonstrated need? | Recommendation | |---|---|---| @@ -257,5 +259,6 @@ This is a recommendation; the decision is the founder's. | Signed statutes | Not shown; pinned local statutes covered the operator case (see Discovery) | Defer | | P3 economic profile | Not exercised | Defer | -T04 (SRS/VERP) could change the `!`/`=` row for forwarded mail. Revisit -this table once T04 is done. +T04 confirmed the table: SRS and list bounce addresses never collided with +MAS syntax, and the risks it found (forms refusing `=`, lower-casing) are +covered by SCP-6/SCP-7 and the composer. diff --git a/workplans/MAS-WP-0002-reference-experiment.md b/workplans/MAS-WP-0002-reference-experiment.md index 439569e..04492dc 100644 --- a/workplans/MAS-WP-0002-reference-experiment.md +++ b/workplans/MAS-WP-0002-reference-experiment.md @@ -8,7 +8,7 @@ status: done owner: claude topic_slug: coulomb-social created: "2026-10-08" -updated: "2026-10-08" +updated: "2026-10-18" state_hub_workstream_id: "17d1228a-bfd1-5fed-ac90-a314b64f6f5b" --- @@ -881,6 +881,16 @@ P3 economic profile Each addition should answer a demonstrated need from the experiment. +**Decided 2026-10-18 (founder)** on the evidence of this workplan and +MAS-WP-0003 (`docs/experiment-review.md`, `docs/spec-change-proposals.md`): +- **Build:** the Postfix integration profile (MAS-WP-0004); spec v0.1.1 + errata plus v0.2 drafts for SCP-6/SCP-7 (MAS-WP-0005); and the address + composer (MAS-WP-0006), pulled forward because provider forms refuse `=` + and lower-case addresses. +- **Defer:** the TypeScript and Go implementations, the mail-client + inspector, signed statutes, and the P3 economic profile. None of them + had a demonstrated need. + --- ## Initial execution order diff --git a/workplans/MAS-WP-0003-provider-live-test.md b/workplans/MAS-WP-0003-provider-live-test.md index 418b92e..2c8f7f0 100644 --- a/workplans/MAS-WP-0003-provider-live-test.md +++ b/workplans/MAS-WP-0003-provider-live-test.md @@ -4,7 +4,7 @@ type: workplan title: "MAS live provider test on a real subdomain" domain: communication repo: mail-address-semantics -status: active +status: finished owner: claude topic_slug: coulomb-social created: "2026-10-08" @@ -227,7 +227,7 @@ change the cap, edit `MAS_MAX_SENT` in the manifest and restart the pod. ```task id: MAS-WP-0003-T05 -status: progress +status: done priority: high state_hub_task_id: "63e86851-9c7d-5ce8-977f-5d09268d9dcc" ``` @@ -244,3 +244,17 @@ decision gate. auto-reply reflection). The review ends with a decision-gate recommendation; the founder decides. Pending: T04 results, then revisit SCP-4 and the gate table. +- 2026-10-18: T04 is folded in. SCP-6 (`--` alternate separator) and SCP-7 + (case-robust identifiers, now highest priority) were added. MAS-WP-0002 + decision gate taken by the founder: build the Postfix profile, the spec + errata and the composer; defer the rest. + +## Residuals + +Handed off as live work records (origin: residual, origin_ref MAS-WP-0003): +- MAS-WP-0004: Postfix integration profile. +- MAS-WP-0005: spec v0.1.1 errata, v0.2 drafts, case-robust ticket ids + in the reference service. +- MAS-WP-0006: address composer. +- MAS-WP-0007 (backlog): retire the live test environment. Namespace `mas` + stays up for follow-up validation, capped at 300 sends. diff --git a/workplans/MAS-WP-0004-postfix-integration-profile.md b/workplans/MAS-WP-0004-postfix-integration-profile.md new file mode 100644 index 0000000..27cb9b0 --- /dev/null +++ b/workplans/MAS-WP-0004-postfix-integration-profile.md @@ -0,0 +1,65 @@ +--- +id: MAS-WP-0004 +type: workplan +title: "MAS Postfix integration profile" +domain: communication +repo: mail-address-semantics +status: proposed +owner: claude +topic_slug: coulomb-social +created: "2026-10-18" +updated: "2026-10-18" +origin: residual +origin_ref: MAS-WP-0003 +--- + +# MAS Postfix integration profile + +Decision-gate outcome of MAS-WP-0002 (founder, 2026-10-18). MAS-WP-0003 +showed that a default Postfix silently drops every P2 (`!`) address, and +that the correct relay configuration is not obvious +(`docs/experiment-review.md`, operational findings). Turn the working +setup in `deploy/railiance/entrypoint.sh` into a documented, tested +integration profile. + +## Extract the profile + +```task +id: MAS-WP-0004-T01 +status: todo +priority: high +``` + +Write a standalone Postfix profile (main.cf/master.cf fragments plus +the relay regexp) for a MAS receiving domain: +- explicit `@DOMAIN` relay regexp, ending the restriction list in `reject`; +- `allow_untrusted_routing=yes`, `swap_bangpath=no` and `allow_percent_hack=no`; +- pipe to `mas-gateway`; +- optional authenticated relay with a send cap; +- null-sender discard. +Explain each setting and say why the stock config fails. + +## Probe the profile + +```task +id: MAS-WP-0004-T02 +status: todo +priority: high +``` + +Extend `experiments/postfix-probe/` to run the profile against the full +address corpus. Include the relay negatives (`x@other`, `x!y@other`, +`a@other@DOMAIN`, `a@DOMAIN@other`) and P2 forms. Make it part of the test +suite where Docker is available. + +## Exim notes + +```task +id: MAS-WP-0004-T03 +status: todo +priority: low +``` + +Check whether Exim has equivalent pitfalls for `!`/`%` local-parts and +record the needed settings. Build an Exim profile only if there is +demand. diff --git a/workplans/MAS-WP-0005-spec-errata-v0-1-1.md b/workplans/MAS-WP-0005-spec-errata-v0-1-1.md new file mode 100644 index 0000000..fcee0b6 --- /dev/null +++ b/workplans/MAS-WP-0005-spec-errata-v0-1-1.md @@ -0,0 +1,71 @@ +--- +id: MAS-WP-0005 +type: workplan +title: "MAS spec v0.1.1 errata and v0.2 proposals" +domain: communication +repo: mail-address-semantics +status: proposed +owner: claude +topic_slug: coulomb-social +created: "2026-10-18" +updated: "2026-10-18" +origin: residual +origin_ref: MAS-WP-0003 +--- + +# MAS spec v0.1.1 errata and v0.2 proposals + +Decision-gate outcome of MAS-WP-0002 (founder, 2026-10-18). Turn +`docs/spec-change-proposals.md` into spec text. The `mas-v0.1-spec/` bundle +is normative, and `mas_conformance/` plus `mas_core/schema/` are vendored +copies checked for drift, so each change updates the bundle, the vendored +copies, the fixtures and the implementation together. + +## Review the proposals with the founder + +```task +id: MAS-WP-0005-T01 +status: todo +priority: high +``` + +Walk through SCP-1 to SCP-7, settle the open options (SCP-2 (a) or (b), +SCP-6 split rules), and record which proposals are accepted. + +## v0.1.1 errata + +```task +id: MAS-WP-0005-T02 +status: todo +priority: high +``` + +Apply the accepted errata: SCP-1 (quoted equivalence), SCP-2 (lower-case +types), SCP-3 (type intake, `intake_for`), SCP-5 (intake auto-reply +bounds), and the SCP-7 recommendation (case-robust identifiers). Add +fixtures and update the parser, policy and schema. + +## Reference service: case-robust ticket ids + +```task +id: MAS-WP-0005-T03 +status: todo +priority: high +``` + +SCP-7 evidence: IONOS and Google Groups both lower-cased the recipient, +and a list post was lost to its ticket. Make the reference ticket service +issue and match ids case-insensitively. Crockford base32 is case-insensitive +by design. Verify on the live MX by repeating the Google Groups post. + +## v0.2 drafts: SCP-6 and the SCP-7 statute field + +```task +id: MAS-WP-0005-T04 +status: todo +priority: medium +``` + +Draft the statute fields `resource_syntax.alternate_separator` (`--` for +`=`, endorsed by the operator after the IONOS refusal) and +`equivalence.resource_id_case`, with policy semantics and fixtures. diff --git a/workplans/MAS-WP-0006-address-composer.md b/workplans/MAS-WP-0006-address-composer.md new file mode 100644 index 0000000..8ce48d4 --- /dev/null +++ b/workplans/MAS-WP-0006-address-composer.md @@ -0,0 +1,47 @@ +--- +id: MAS-WP-0006 +type: workplan +title: "MAS address composer" +domain: communication +repo: mail-address-semantics +status: proposed +owner: claude +topic_slug: coulomb-social +created: "2026-10-18" +updated: "2026-10-18" +origin: residual +origin_ref: MAS-WP-0003 +--- + +# MAS address composer + +Decision-gate outcome of MAS-WP-0002 (founder, 2026-10-18). Pulled +forward because provider configuration forms do not preserve MAS syntax: +the IONOS forwarding form refuses `=` and forces lower case, and Google +Groups lower-cases members (MAS-WP-0003 T04). Depends on the SCP-6/SCP-7 +outcome in MAS-WP-0005. + +## Scope and interface + +```task +id: MAS-WP-0006-T01 +status: todo +priority: medium +``` + +Define what the composer does: from a statute and an intent (resource, +facet, interaction), emit the canonical address and, when the statute +declares one, the forwarder-safe form (lower case, `--` separator). Warn +about the 64-octet budget and facet/interaction exclusivity. Decide +whether it is an extension of `mas generate`, a web page, or both. + +## Implement and test + +```task +id: MAS-WP-0006-T02 +status: todo +priority: medium +``` + +Build it on `mas_core.generator`, with fixtures for the forms seen in +MAS-WP-0003. diff --git a/workplans/MAS-WP-0007-retire-live-test-environment.md b/workplans/MAS-WP-0007-retire-live-test-environment.md new file mode 100644 index 0000000..45d4f21 --- /dev/null +++ b/workplans/MAS-WP-0007-retire-live-test-environment.md @@ -0,0 +1,42 @@ +--- +id: MAS-WP-0007 +type: workplan +title: "Retire the MAS live test environment" +domain: communication +repo: mail-address-semantics +status: backlog +owner: claude +topic_slug: coulomb-social +created: "2026-10-18" +updated: "2026-10-18" +origin: residual +origin_ref: MAS-WP-0003 +--- + +# Retire the MAS live test environment + +Residual of MAS-WP-0003. The live MX for `mas.coulomb.social` stays up for +follow-up validation (founder, 2026-10-18), capped at 300 sent replies. +Retire it once MAS-WP-0004 and MAS-WP-0005 no longer need it. Cluster-scoped +and external pieces do not disappear when the namespace is deleted. + +## Retire the environment + +```task +id: MAS-WP-0007-T01 +status: wait +priority: medium +``` + +Run when follow-up validation is done: +1. Export the evidence (`/var/lib/mas/events.jsonl` and the ticket DB from + the `mas-mx` pod) into the repo or an archive. +2. Delete namespace `mas`. +3. Notify ops-mason to remove OpenBao role `external-secrets-mas-tem-relay`, + policy `workload-kv-read-mas-tem-relay` and KV path + `platform/suppliers/scaleway/mas-tem-relay` (MASON-WP-0014 teardown). +4. Founder: revoke the Scaleway TEM API key and remove the TEM domain. +5. Founder: remove the `mas.coulomb.social` MX, A, SPF and DKIM records at + IONOS, the `mas-fwd@coulomb.social` forward, and the + `coulomb-social` Google Group if no longer used. +6. Remove the side-loaded `mas-live:wp0003-*` images from k3s containerd.