# D70. The author approves a translated plan through their agent, who asks first (5 Nov 2026)

Until now the core refused an agent author that approved a translated plan (`E_PLAN_PERSON_ONLY`), as it refuses one that makes a version of the plan or records its validation (D52). For an author who works alone, with no client to validate plans and translations, this was a wall: on 5 Nov 2026 the sample modules' sessions could not approve their translations although the founder asked them to, and the only way through was a false `ELABORA_AUTHOR=human`. The founder: an agent that warns before a generation costing much of the ElevenLabs quota (D29) is a good experience, and approvals could work the same way, above all for translations; plans are more dangerous to have validated by an agent, and they do not hold back publication.

Decided:
- **A translated plan is the author's decision, which their agent carries out on their yes.** `approve_translation` from an agent (`elabora_translation_approve`, `elabora translate approve` run by an agent) without `authorApproved` writes nothing: the MCP tool returns `needsApproval`, `approval` (the language, the translated plan's `contentHash`, its title and number of items, its own texts translated or not, the name the approval would show) and `ask`, what to put to the author, in English for the agent to say in the author's language. The CLI prints the same and exits with code 3, as `voice generate` without `--spend`. With the author's yes the agent calls again with `authorApproved`, the `contentHash` it was given (CLI `--author-approved`). A plan translated differently, or whose source changed, in between has another hash: refused and asked again (`E_TRANSLATION_ASK_AUTHOR`), so no yes is ever carried over to a plan the author was not shown. A plan with texts left untranslated or stale is refused to the agent: translate first.
- **Who decided and who carried it out are both kept.** The approval file (`translations/<lang>.approval.json`) holds `by`, the author's name, and `agent`, the agent that recorded it (its name as the journal knows it); the journal's entry is the agent's, with `authorApproved` in its arguments, and `elabora history` says « recorded the author's approval of the en plan, on their yes ». The translated course's V1 carries `validation.agent` (schema `plan-version` 0.1.11). The app shows the approval as before; it is one change, which ⌘Z and `elabora undo` take back.
- **The name.** An agent may leave `by` out: the approval then shows the author's name as their earlier approvals through an agent show it (the latest one in the module). With none, `approval.by` is `null` and the agent asks the author's name as it asks their yes. A client's approval names the client, and is never used for this.
- **The same path everywhere.** The MCP tool, the CLI, `elabora tools call`, the skill `elabora-translation`, the agent guide and the course rules (`AGENTS.md`, revision 20) say it. In Elabora's chat, the app asks the author itself with a card when the agent calls with `authorApproved`, as it does for a paid generation: the click is the yes, and the agent does not ask in words first.
- **Plans stay people's.** `plan version` and `plan approve` keep refusing an agent (`E_PLAN_PERSON_ONLY`). A validation names a client who signed: an agent never records it. A version is what the author sends a client, with its notes for them; it holds nothing back (a module publishes without one), and the app makes one in a click (« Créer la V3 »). An author working alone has no use for versions beyond the diff, which the working copy already shows.

Weighed:
- **A switch « I work alone » that lets agents approve without asking.** Rejected: the author would no longer see what they approve, and a module shared later would carry approvals nobody read. Asking costs one sentence.
- **A boolean `authorApproved: true`.** Rejected: a yes would cover whatever the plan became since the question; the hash ties it to the plan shown, as `approvedPercent` ties a spend to its figure.
- **`plan version` on the same path.** Possible, weighed against the founder's words: not needed (nothing waits on a version) and closer to the client's contract. Left as it is.

*Revisit if:* authors working alone want versions made by their agent (a snapshot before a large rewrite, for instance), or a client's reviewer approves through an agent of their own.
