Menu

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).