--- id: MAS-WP-0006 type: workplan title: "MAS address composer" 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: "0934280a-f85a-55f1-a17c-61c5255b5e3b" --- # 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: done priority: medium state_hub_task_id: "13071dfc-fbaa-503e-bd0d-ddd6c2377758" ``` 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 a new CLI command (the CLI has no generate command yet), a web page, or both. The library side exists: `mas_core.generator.for_destination` (MAS-WP-0005 T09). ## Implement and test ```task id: MAS-WP-0006-T02 status: done priority: medium state_hub_task_id: "69cb22fe-9995-55c3-91de-63eab5c09282" ``` Build it on `mas_core.generator`, with fixtures for the forms seen in MAS-WP-0003. ## Outcome - Interface (T01): a CLI command only, `mas compose DOMAIN TARGET [--facet F] [--interaction MODE] [--for DESTINATION] [--statute FILE | --no-discover]`. There is no web page: it would need a second parser in JS, and nothing asks for one yet. TARGET is `TYPE=ID` or a registry name. - Output: the canonical address with its octet count. If the statute declares stand-ins, also the forwarder-safe form (stand-ins, then lower case). `--for` adds the named destination profiles. The composer warns when fewer than 16 of the 64 octets are left, and when the statute would not handle the address. It refuses facet + interaction (exit 1). A form the namespace would misread is reported as "cannot express". - Tests (T02): `tests/test_compose.py`, using the MAS-WP-0003 forms (IONOS `ticket--gs-85qj8wc09p+comments`, Google Groups lower case, `ticket---callback`, `ticket=RE=2026-4711` not expressible).