---
title: Confirmation line
summary: The after-the-fact line for a send the person's own turn already asked for ("asking is approving," ADR matched by said_intents) - it happened, here's what, with Undo where that's real.
audience: builders
owner: app-design
status: draft
---

# Confirmation line

When the person's own turn said what to do ("email the team the update"), the Gate matches the
send against that said intent and it goes out with no held card - "asking is approving." This is
the line that reports it happened, distinct from `ask-card.md`/`draft-card.md`'s held-and-decide
cards, which are for the OTHER case: a send the Gate could not match to anything the person asked
for. New 30 Sep, the user's chat-components ask; the underlying match rule is `plans/assistant.md`
section 3.6's `said_intents` (reviewed and confirmed with vault, cohesion, sessions in CHAT.md).

| Surface | Implementing file | Status |
|---|---|---|
| Deck | none | not built |
| App | none | not built |
| Lumen | none | not built |

## Anatomy

Not a card - a single row, the same shape `toast.md`'s in-place placement already uses (height
44, padding 0 14, gap 10, fill `--hover`, `--rule` top border), reused rather than invented fresh:

1. **Glyph**, 16, `--text-2`: a plain check (sent/done), never a colour.
2. **Line**, base, `--text`, one line, ellipsis: "Sent to the team · 3 recipients" or "Posted to
   #updates" or "Scheduled the meeting for Thursday" - the destination and the kind, in the same
   plain words `ask-card.md`'s H1 content rules already require for a held card (this line is
   held to the same honesty standard even though nothing was held).
3. **Undo** (ghost, only when the action is genuinely reversible within the window - see States):
   same as `toast.md`'s Undo button.
4. **"You said to"** (steplink, quiet, `--label`): opens the exact turn text that matched, inline,
   no navigation - this is the line's one piece of real accountability. A person can always see
   which of their own words the Gate matched against, not just trust that it matched correctly.

## Variants

- **In the transcript** (most common): sits at the point in the turn where the send happened, in
  flow with the agent's own text, not a separate card.
- **In Needs you / the activity list**: same row shape, used as a plain history row rather than a
  live confirmation - no Undo once the window has passed, "You said to" still works (it's a
  permanent link to the matched turn, not a time-limited affordance).

## Sizes

44 tall (in-place), full width of the content column. Same as `toast.md`.

## States

- **Fresh** (just happened): glyph, line, Undo (if reversible), "You said to" - as above.
- **Undo window closed**: Undo disappears (silently, no strikethrough or greyed button - it's
  simply gone, matching `toast.md`'s own "only ever offers Undo while Undo can still work" rule).
- **Undone**: the line updates in place to "Undone · was sent to the team" (`--label`), no new row.
- **Batch**: several matched sends in one turn collapse to one line, "3 things sent" with "Show
  what" (steplink) expanding to the individual lines above - never more than one confirmation row
  per turn cluttering the transcript.

## Keyboard and touch

Undo and "You said to" are the only interactive parts; both are plain buttons/links in the normal
tab order, no shortcut of their own (matching `toast.md`, which reserves no global key for Undo
either).

## Motion

None on arrival - it's not an optimistic action being confirmed, it already happened server-side
by the time this line renders. Undo's disappearance and the Undone state follow `toast.md`'s own
timing rules where they apply (a reversible send keeps the same practical undo window a manual
send would get).

## Copy

"Sent to <who> · <count> recipients", "Posted to <channel>", "Scheduled <what> for <when>", "You
said to", "Undone · was sent to <who>". Never "Auto-sent", never "AI acted on your behalf" -
the line states the fact plainly, the same register every other confirmation in this system uses.

## Emission (agreed with vault, sessions, assistant - the said_intents match)

Not a `renderer:<tool>` result from the agent's own call - the confirmation is generated by the
Gate itself at match time (`plans/assistant.md` section 3.6: vault's Gate matches an outward call
against `said_intents` in the thread's lineage; a match runs with no Touch ID). The event this
line renders from is the Gate's own match event (proposed name gate.matched - not yet built, TBD with vault, tracked
in CHAT.md) rather than a tool's `render` field, since the confirmation's job is partly to prove
independence from the calling agent's own account of what it did.

## What the person's actions do

Undo (where real) reverses the specific send if the destination's own API allows it (an email
already delivered can't be recalled everywhere; a scheduled meeting can be uninvited). "You said
to" is read-only.

## What agents can do for the person

Nothing here is agent-triggered beyond the original send itself, which already happened under the
"asking is approving" rule before this line exists - by the time this component renders, the
agent's part is done.

## Accessibility

- `aria-live="polite"`: a fresh confirmation is announced once, the same as `toast.md`'s pattern.
- The glyph is `aria-hidden`; the line's text carries the full meaning.

## Gaps

Everything - new component, no surface has built it. Depends on vault naming the real Gate event
this line reads from (flagged above, tracked in CHAT.md).
