# D31. Warnings the author ignores: in course.json, by a key that lapses (13 Oct 2026)

On « La voix a peut-être avalé « de » » in the « Essais ElevenLabs » test module (13 Oct): the « de » of « trois de trop » is almost swallowed, a plosive barely heard, natural for a native speaker and less so for a learner who is not; the warning is right, but the author must be able to ignore it, case by case.
- **What existed: plan waivers** (D5, `plan.json` `waivers`). They are the client's approved exceptions to pedagogical warnings: part of the contract frozen by its hash, changed through a change request a human applies, with a reason and who approved it, listed as « dérogations » in the proof dossier, and scoped to a code and an id (a screen, a block) for good. An author's judgment on a take's audio is none of that: making it a waiver would turn one listened word into a change of the contract, silence every swallowed word of the screen, and outlive the take. So the waivers are kept for the client, and a sibling is added where the author decides alone; it reuses their place in the validator (`finish`, the engine's project checks and the build apply both) and their effect (the finding stays in the results, marked, and no longer counts).
- **A finding that may be ignored carries a `key`**: what it is about, then `@` and a fingerprint of what was found. `W_NARRATION_WORD_SWALLOWED` is now one finding per word, keyed by the screen, the line, the language, the word's place and text, and the first 16 hex digits of the SHA-256 of its take's audio file (`swallowedKey`: `client-mecontent/l2/fr/9:de@051bd18597521d7e`): timing the same audio again keeps the key, another take (or a recording) changes it, and the alert comes back, as the voice may now swallow the word for real. Only this check gives keys for now; another warning becomes ignorable by giving its findings a key that changes when what it found changes.
- **The choice is in the module**: `course.json` `ignored: [{ code, key }]`, written by one undoable command, `ignore_findings { findings: [{ code, key }], ignored }` (engine and `@elabora/node` edit; not `update_course`, so agents' course edits cannot drop it), which replaces an older choice about the same subject (the key before its `@`), so a word ignored in a new take leaves one entry, and refuses errors (an error is fixed or waived, never ignored). The validator marks the finding `ignored: true`; summaries count it apart (`summary.ignored`), as waived ones. The command line lists it no more and says « n ignored by the author »; the MCP's `elabora_validate` leaves it out (`includeIgnored` lists it) and tells agents to leave it alone, as do what an edit, `elabora_undo` and `elabora_build` give back; the alignment's `doubtful` does not report it again; the proof dossier names it « ignoré par l'auteur ». Nobody approves it: the client sees it in the proof dossier.
- In the editor « Ignorer » sits beside « Écouter · Nouvelle prise », in the script and the line's inspector, and the inspector says the word ignored, discreetly, with « Rétablir ». No list of ignored findings yet.
- **Extended to the checks that read the author's own content** (13 Oct 2026, after the « Nietzsche » course, where `W_QUIZ_NEGATION` fired on a quoted maxim and the only way out was a plan waiver). A warning deserves a key when it is a heuristic over the author's words or media that can misjudge one case, and when nobody but the author needs to agree: `W_QUIZ_NEGATION` (a negation inside a quotation; key: the question and its stem), `W_QUIZ_ALL_NONE` (the question, the option and its text), `W_QUIZ_OPTION_COUNT` (a true/false question; the number of options), `W_QUIZ_LENGTH_CUE` (a right answer that must be precise; the options), `W_IMAGE_ALT_SUSPECT` (a short alt that is the information; the alt), `W_NEUROMYTH` on a screen (a myth named to be refuted; each block that names one, keyed by its text, then the rest of the screen; in the plan it stays the client's), `W_TEXT_DENSITY` (a primary text to read; the screen and its number of words), `W_NARRATION_DUPLICATED` (a text read along on purpose; the line and the block's text), `W_NARRATION_LINE_LONG` (one breath on purpose; the line and its text, so that another take of the same words keeps the choice). Each key ends with a fingerprint of what the check read (`findingKey`: the first 12 hex digits of its SHA-256, or the count measured), so the warning comes back when that changes.
- **Not given a key, and why**: errors (fixed or waived, never ignored); the plan's and the course's design commitments (`W_OBJECTIVE_*`, `W_SPACING_MISSING`, `W_BUSINESS_GOAL_MISSING`, `W_EXPOSITION_STREAK`, `W_DECISION_WITHOUT_CONSEQUENCE`, `W_COMPLETION_MISMATCH`, `W_SEGMENT_TOO_LONG`, `W_AUTO_ADVANCE`): the client's contract, so a waiver; measured accessibility (`W_TEXT_CONTRAST_MEASURED`, `W_TEXT_TOO_FAST`, `W_MOTION_LONG`, `W_UI_LABELS_LANGUAGE`): conformance a client relies on, fixed or waived; defects that a check states, not guesses (`W_QUIZ_NO_CORRECT`, `W_NUMERIC_AMBIGUOUS`, `W_DEAD_BUTTON`, `W_UNREACHABLE_LAYER`, `W_EVENT_NO_ACTION`, timing, steps, narration audio missing or stale, media, packages, LMS profiles): fixing them is always right; the design layer's rules (`W_STYLE_*`, `W_COMPONENT_*`, `W_ASSET_SVG_TEXT`, object hygiene): code an agent fixes, where words in a figure cannot be translated whatever the author thinks; findings measured in a browser (`elabora fit`, `elabora look`): not part of the validator's results the editor lists.
- **Agents ignore nothing on their own.** `elabora validate` prints a finding's key with the command that ignores it; `elabora ignore [dir] <code> <key> [--restore]` and the MCP tool `elabora_ignore_finding` write the same change as « Ignorer », for when the author asks or agrees (the tool's description says so). In the editor, « Ignorer » is offered on every finding with a key in Vérifications and in a screen's inspector, ignored ones said discreetly with « Rétablir ».
*Revisit if:* more warnings become ignorable (the key is the only part each check adds), ignored findings pile up (entries whose subject no longer exists could be dropped on write), or clients want to approve them (they would then become waivers).
