# W27 — The late terminator, and per-verb arity

Two defects, both of the same family this project already treats as invariant: **a write
that loses content and reports success**. One loses it on the way out to Discord, one loses
it on the way in from a shell.

## A. Request #6 is NOT closed — the late terminator (testbed #34)

W26's fix moved the Operator's title out of the masked link's text half, on the reading that
text outside the closed construct cannot malform it. The Operator read testbed **#34**'s card
live (2026-07-27) and it is **all literal** — the ref, the url, the title, one flat line:

```
[#34](https://discord.com/channels/1529274510539362364/1529984038230818896/1531201060595564559) | render proof: a title carrying the ](trap) shape, W25 daemon — now Backlog
```

No backslashes, so the W26 half held — nothing is escaping anything any more. What did NOT
hold is CONTEXT.md's claim that a title riding outside the brackets renders as the Operator
wrote it.

**Mechanism.** Discord's link rule does not stop at the construct's own `](`. Its text-half
scan admits a `]` whenever another `]` appears later in the message with no `[` between them,
so on this line it consumes the intended close, the url, the separator and most of the title,
then terminates on the title's OWN `](` — taking `trap` as the url. `trap` resolves to
nothing, so the renderer falls back and the entire line, url included, prints literal.

This is consistent with every measurement already in CONTEXT.md, and it explains one they did
not: testbed #33 (no symbols at all) rendered clickable because there was no later `](` to
terminate on. **The `](` sequence anywhere in the line is the whole defect** — inside the
text half or outside it makes no difference, which is why W26's move was necessary and not
sufficient.

- **T1 — registry.** `REQ-LINK-TEXT-MACHINE` STANDS (its claim about the text half was never
  falsified). Add the sibling `REQ-LINK-TAIL-NO-TERMINATOR`, activated `["doc","impl","unit"]`.
- **T2 — CONTEXT.md.** Correct the disproven clause and record #34 in the measured table.
  The doc is what changes: it asserted a property live proof took away.
  `<!-- [doc->REQ-LINK-TAIL-NO-TERMINATOR] -->`
- **T3 — impl.** One helper beside `jump_url`, applied to every plain-text tail the daemon
  writes next to a masked link: Seeds-thread entries, both Updates notes (capture + mint),
  the reconcile transition notes, and the Milestone card's sub-issue lines. It breaks the
  `](` sequence with a separating space — the smallest edit that makes the parser's `\]\(`
  terminator fail, and it leaves every other character of the Operator's words alone.
- **T4 — unit.** The `](` title against each composer; the ordinary title unchanged
  byte-for-byte; the url half byte-exact so `seed_entry_matches` still finds mirrors.
- **T5 — live proof.** A fresh testbed Request whose title carries `](`. **The Operator's
  card read is the verdict — unit-green is not proof, that is the mistake that shipped
  v0.4.2 and it is the mistake that shipped W26.**

## B. spt-progress-tool #32 — the shell-send op line drops text

`comment #N <stray>` posts only the line-2 body; `<stray>` vanishes and the ack says SUCCESS.
liam minted it, I am DRI. `src/payload.rs` collects every non-`--flag` token on line 1 into
one positional vector; a verb that reads `args[0]` and stops abandons `args[1..]`.

- **T6 — audit, not a patch.** `create` and `list` ALREADY refuse correctly and name the
  offending token. Copy that shape onto every other fixed-arity verb; `comment` and `watch`
  are confirmed leaking in the field. **Never refuse extras globally** — `tag`, `flag`,
  `milestone` and `dispatch`'s note consume trailing positionals by design.
- **T7 — unit.** One refusal test per fixed-arity verb, and a test that the variable-arity
  verbs still take their tails.

## Gate

`cargo test` green, `traceable-reqs check` exit 0. Then the release ships through
`spt adapter update alchemy` — the holding path, available on this node for the first time
since W25 registered the release pointer with `[update]`. **Report to doyle whether the
daemon comes up on new bits with no kill**; either outcome is the control he asked for.
Request #6 stays open until the Operator reads the T5 card.
