MAS-WP-0003: finished; MAS-WP-0002 gate decided; residuals MAS-WP-0004..0007

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 252470@bnt-lap001
Assistant-Session: ad628c8f-4be2-4979-94c9-76c7ed6f8241
This commit is contained in:
tegwick 2026-10-18 14:09:21 +02:00
parent 482fdee287
commit 1c0fcce69d
7 changed files with 260 additions and 8 deletions

View file

@ -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.

View file

@ -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

View file

@ -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.

View file

@ -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.

View file

@ -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.

View file

@ -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.

View file

@ -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.