Unprompted Turns Have a Bound of One
Rescued from the retired agent-turn-policy plan — Goldie may volunteer one turn on Form and then must wait, never on Document or in the block panel; the bound is read off the thread's last message and never stored; plus the ghost-prompt reasoning
Decision
Goldie may take at most one unprompted turn, on the Form surface only, and then must wait for the user. Owner ruling 2026-08-10, closing the agent-turn-policy plan's Open question 4 (R8.8, R8.7, R8.17).
In plain terms: after you fill in a field, Goldie may say "you may also want to consider X" once, and then it is your turn. She does not keep talking while you are still reading, and she never starts talking on her own in the Document view or in a block's own chat.
The rule, in three parts
- Form only. An unprompted turn is possible on Form alone. Never on Document (settled 2026-08-01: user-led posture is taken literally, and accepting a proposal is not an exception — a user who wants a follow-up asks for one). Never in the block panel, whose chat is reactive without exception (R8.17). This is the whole surface rule, not a list to extend one case at a time.
- One, then wait. An unprompted turn is refused when the thread's most recent message was itself agent-initiated. Goldie may not volunteer twice in a row.
- Derived, never stored. The bound is answered by reading the thread — was the last message agent-initiated? — so it needs no counter, no turn-policy record and no schema. This is consistent with No Interview Event Log. The plan's turn-policy state (R8.2) therefore collapsed to derived-with-no-schema.
The two remaining refusals are also derived: no unprompted turn while a
proposal is outstanding (read from the block's proposal state), and none
for a Reader, who lacks use-agent and so has no agent surface at all.
Why one, and not a counted N
A counted bound ("at most N per session") was the one answer that would have forced a persisted turn-policy record, and it is rejected for that reason as much as any other. Within the already-small territory (Form only), one-then-wait is the smallest rule that still permits initiative, and it stays correct if a later trigger is added — where "no bound" would silently stop being safe the moment the trigger set grew. Loosening later is cheap; retrofitting a bound after users have learned Goldie's rhythm is not.
The ghost prompt (Open questions 1 and 2)
The ghost prompt is the composer's placeholder text — what tells the user what this surface is for right now. It is not a turn: it is text in the input, not a message under Goldie's name.
- Q1 — agent-generated or policy-generated? The tension is latency
versus aliveness: an agent-generated prompt is genuinely specific to the
block but puts a model call behind a placeholder that recomputes on every
selection change (a hot path, R8.10), and a placeholder that arrives a
second late is its own problem. A policy-generated prompt — a pure function
of role and surface — is instant and cannot be wrong. What exists chose
policy-generated by construction:
agentComposerPlaceholderinsrc/entities/agent/lib/composer-placeholder.tsderives the block-panel placeholder from role and block family with no model call, and while it stays a pure function, selection changes do not spend a turn (R8.10) is satisfied for free. The "policy by default, agent once per panel open" middle position is not adopted; it would need an owner ruling. - Q2 — does the ghost prompt ever go quiet? Open. An input whose placeholder changes on every turn is either helpful or restless, and there may be states where the right ghost prompt is the plain one. Nobody should answer this without the owner.
Current vs Target
| Current (2026-09-12) | Target | |
|---|---|---|
| Bound of one on Form | Not enforced. No code refuses a second consecutive agent-initiated turn. | A pure check over the thread's last message, refusing the second turn; a test proves it. Backlog task. |
| Never in the block panel | Satisfied: the block chat has no unprompted trigger. | Unchanged. |
| Never on Document | Satisfied by the absence of any Document trigger. | Unchanged; posture must reach the server (resolveAgentPosture in packages/domain/src/access/document-access.ts has no convex caller — a separate Backlog task). |
| Ghost prompt, block panel | Policy-generated (agentComposerPlaceholder). | Unchanged. |
| Ghost prompt, filling chat | Static copy. | Policy-generated from surface and role (GB-7). |
| Q2, going quiet | Unanswered. | Owner question. |
Consequences
- No schema, table or column may be added to remember how many turns Goldie has taken; the thread is the record.
- No agent-generated placeholder may be introduced without an owner ruling on Q1's middle position.
- Interview Flow → 4c states the refusal list; this page is the ruling behind it.
Two Columns — Glyphs Print, Edges Do Not
Why the card keeps one glyph column for everything that prints as words and adds an edge column for screen chrome — cards, buttons, chips, the composer — whose contents take their own inset, and how this amends the 2026-08-09 print ruling
Work Bar Shows Where You Stand
Compact singular parent and current levels in the Work Bar, with named parent context above the card and paperless container screens