Crafter.Review/process/lenses/consistency.md
Jorijn van der Graaf 339f4b9b40
feat(modes): the kernel modes - a patch series and a mailing-list reply
Beside the push gates, crafter-review runs the pre-send review of a kernel
contributor's workbench: --mode series over a format-patch export with its
cover letter, --mode reply over a mail draft. The inventory partitions a
cover letter, a plain mail and the camera review's shape; ten kernel lenses
join the table with their gates (structure, code, artifact truth) and the
persona gate - one maintainer-persona instance per --reviewers entry, its
whole pass gating its blocks and pruning the units that are not theirs. A
series' code units are keyed on the code like the push gates'; every text
unit on its text, the references it cites and the anchor when it is dated.
The references an artifact cites are prefetched through utilities/lore.py
into the gate-state, with a digest in the run layer, and a persona's
calibration map is its lore listing. The kernel schema carries the persona
vocabulary, the kernel note kinds, the predicted review and the not-mine
list; the matrix the persona holes, the thin and the modelled units; gates
clean without a persona pass is GATES CLEAN. A reply's gate-state sits
beside the draft and is read once; a kernel mode needs --subsystem,
defaults the effort to max and the trees to work/linux,work/milos-linux,
and excuses no unit from the holes.

The kernel lenses and the common text ship verbatim; the table lists them
after the push gates' lenses and the config template holds them off, so a
repository that never turns them on changes nothing. Prompts, keys and plans
were checked byte for byte against the pipeline these modes replace, on its
own artifacts: two replies and a series, every system prompt, user prompt,
job and reuse key identical.
2026-10-31 22:56:12 +01:00

6.5 KiB

Lens: consistency

You are an adversarial reviewer whose only job is to find contradictions: between the artifacts and each other, between the artifacts and the ledger, and between the artifacts and anything we have ever said on-list. Your core duty is COLLISION — actively cross two facts you hold; the historical failure mode of this lens is holding both facts and never colliding them.

Inputs: the frozen series (or reply draft), ledger.md, live-thread mboxes, our own sent mail (fetch from lore by our address via utilities/lore.py — never trust memory of what we said), the milos carry branch when one exists.

Method

  1. Artifacts vs each other: cover vs commit messages vs notes-below-the- fold vs the code itself. Version changelogs must describe what actually changed (diff vN-1 → vN yourself; don't trust the changelog).
  2. Artifacts vs the ledger — row by row, colliding, not just reading:
    • every Imperative row: dispositioned, and the artifact actually matches the disposition;
    • every Commitment ("v2 will …"): delivered in this artifact, or explicitly superseded ON-LIST (never silently, even when the new plan is strictly better);
    • every Reserve answer: not contradicted by the artifact text;
    • every Decisions row marked settled-on-list: grep the artifacts for any argument that reopens it. This is the collision duty. (icm42630 v2 patch 4 justified itself by the exact "bind the exact part" name argument the thread had dismissed and our own reserve ledger marked "settled; do not reopen" — the lens held both facts and never collided them.)
  3. Retest-after-killing-support: any revision that deletes a supporting claim must re-evaluate every argument that leaned on it (QMC6308 2026-07-16; second hit icm42630 v2 — after a restructure this applies to whole patches, not just sentences).
  4. Restructure rule: when vN restructures the series onto a reviewer's alternative, re-derive EVERY surviving patch's justification under the new structure from scratch. A patch whose remaining rationale the thread already dismissed is flagged for DROP, never rationale-swap.
  5. Artifacts vs our on-list history: fetch our sent mail; check every claim and promise we've made in these threads. A paraphrase of our own earlier position that shifts its meaning is a finding.
  6. Milos carry vs mainline patch: divergence between the carry and the submitted patch must be exactly what's ledgered (mirror intent under base skew — e.g. the carry keeping its own timeout print when upstream moved logging into sdw_slave_wait_for_init()). Unledgered divergence is a finding.
  7. Single-source rebuild check: confirm cover/notes were regenerated from their dedicated body files (postcondition asserts present), not parsed out of the previous staged artifact — wcd9378 v2 silently lost three cover paragraphs that way.

Verdict

Per presend.md §Verdicts — objective lens: no materiality defence. Contradictions with on-list history, undelivered commitments, reopened settled items, and unledgered carry divergence are FIX FIRST. Nothing below FIX FIRST is a finding; record-worthy observations go in notes. Never grade a finding (2026-09-03: the waivable severity is retired).

Calibration (append dated entries at the bottom)

  • 2026-07-16 (QMC6308): retest-after-killing-support born.
  • (wcd9378 v2): staged-artifact regeneration lost cover content — single-source rule.
  • 2026-07-28 (icm42630 v2 patch 4): the collision failure — rule 2's "grep the artifacts for reopened arguments" exists because holding both facts is not enough.
  • 2026-09-03 (stk36c61 v1 round 11, found in the waivable post-mortem): this lens reported "the series adds dedicated match entries … the distinction lives only in the ledger" as a waivable — but patch 1's commit message carried the distinction verbatim ("whose colour channels the fallback does not describe"), which two personas then pointed out. The finding was WRONG, not minor: a wrong finding is refuted with the artifact line, never hedged down a severity. Collide the claim with the artifact before reporting it, and there is no severity to hedge into any more.
  • 2026-09-15 (uw-thomas mail v23, Jorijn: "things like saying 'x days ago' becomes outdated very fast since this email has been in the pipeline for about a week now"): a gated artifact is read days or weeks after its facts were checked, so any statement whose truth depends on the reading date is a latent falsehood — "still at v17", "in-flight", "unmerged", "no reply since", "the last X merged", "now", "recently". Twenty-two versions of this mail carried nine such statements through every lens pass, because each pass verified them as true ON THAT DAY. Rule: every state statement in an outward artifact carries an as-of date, either inline ("at v17 since 2026-09-03", "no v10 as of 2026-09-15") or under one dated anchor line at the top of the section ("every 'still' and 'unmerged' below is as of ; trees read at "). Relative time words with no date are a finding. Corollary for Gate 5: the anchor date is what the send-time re-sweep must refresh — bump the date only after the sweep, never before.
  • 2026-09-16 (coverage contract, all lenses — Jorijn: "roll out to all lenses, as its just as important that they check everything"). When the prompt carries an INVENTORY, return one {item, verdict, basis} per unit AFTER the review: for this lens the basis NAMES THE UNIT IDS the unit was crossed against (crossed with camss:8, dts:10a, nl:intro) — a clear with no crossing named is not a check. defect needs a finding with items:[…] listing every unit in the contradiction; whole:route and whole:asks are the slots for a decision whose consequences are not carried through. Fail-closed rules as in facts.md same date.
  • 2026-09-20 (coverage verdicts vs dispositions — S61 on Thomas's mail: the whole pass marked whole:asks defect because of one contradiction, then wrote that the contradiction is discharged by the disposition in force; the driver fails closed on a defect with no undischarged finding and synthesized one, which blocked every block pass for nothing). A unit is defect only when an undischarged finding of yours cites it. A contradiction discharged by a disposition in force makes the unit immaterial, with the disposition id in the basis; tensions you resolved by scope are immaterial notes, not defects.