Profile in integrations/postfix (install.sh + README), now used by the live deployment. Probe runs every conformance-corpus local-part and the relay negatives against it; tests/test_postfix_profile.py runs it where Docker is available. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 5787@bnt-lap001 Assistant-Session: 5db26b82-138b-40cc-9856-4d5eb0f752fd
86 lines
2.8 KiB
Markdown
86 lines
2.8 KiB
Markdown
---
|
|
id: MAS-WP-0004
|
|
type: workplan
|
|
title: "MAS Postfix integration profile"
|
|
domain: communication
|
|
repo: mail-address-semantics
|
|
status: finished
|
|
owner: claude
|
|
topic_slug: coulomb-social
|
|
created: "2026-10-18"
|
|
updated: "2026-10-19"
|
|
origin: residual
|
|
origin_ref: MAS-WP-0003
|
|
state_hub_workstream_id: "bf5eebc0-3b97-5c78-9c3a-58834258744e"
|
|
---
|
|
|
|
# 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: done
|
|
priority: high
|
|
state_hub_task_id: "e1d1c1fb-b34e-5ea3-98e5-10556b80a83b"
|
|
```
|
|
|
|
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;
|
|
- sender authentication: OpenDKIM (verify) + OpenDMARC milters,
|
|
annotate-only. Forged A-R headers for the host's authserv-id are
|
|
stripped with a Postfix `header_checks` IGNORE rule, because OpenDKIM's
|
|
`RemoveARFrom` did not work in testing. The milters run in the
|
|
foreground (MAS-WP-0005 T11; spec §14 item 10).
|
|
Explain each setting and say why the stock config fails.
|
|
|
|
## Probe the profile
|
|
|
|
```task
|
|
id: MAS-WP-0004-T02
|
|
status: done
|
|
priority: high
|
|
state_hub_task_id: "dcdf491a-3be8-566e-8111-c496a7970b4b"
|
|
```
|
|
|
|
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: done
|
|
priority: low
|
|
state_hub_task_id: "a3ddf4f1-6b21-5ee7-8dae-4926fcf4181e"
|
|
```
|
|
|
|
Check whether Exim has equivalent pitfalls for `!`/`%` local-parts and
|
|
record the needed settings. Build an Exim profile only if there is
|
|
demand.
|
|
|
|
## Outcome
|
|
|
|
- Profile: `integrations/postfix/install.sh` and `README.md`. The live
|
|
deployment (`deploy/railiance/entrypoint.sh`) now uses it.
|
|
- Probe: `probe.py --profile mas-profile --corpus`, run in pytest as
|
|
`tests/test_postfix_profile.py` where Docker is available. Every corpus
|
|
address arrives unchanged up to RFC 5321 quoting: Postfix adds quotes
|
|
around non-dot-atoms (`.bernd` becomes `".bernd"`), and those are still
|
|
invalid MAS. All relay negatives get 554.
|
|
- Exim: `integrations/exim/NOTES.md`. The stock ACL rejects `!`/`%` for
|
|
local domains. No profile is built, because there is no demand yet.
|