DocsReference

list

A bullet or numbered list. Constrain it with `minItems`, or hold each item to a bar with `each.falsifiable` / `each.sourced`. Close with `endlist`.

Leaf tag · open <!-- mdv: list … --> · close <!-- mdv: endlist -->

<!-- mdv: list minItems=2 -->
- Hull breach sealed on deck 7.
- Long-range sensors back online.
<!-- mdv: endlist -->

Props

PropSyntaxCategoryDescription
coverscovers=<option>listRequire the list to mention every top-level area present in a context-supplied changed-file list, so a change summary cannot silently omit a whole touched area. A missing context key reports missing-context-value rather than passing silently, and so does a key whose value is not a JSON array of paths.
covers.incovers.in=<option>listRequire the list to mention every top-level area present in a source-supplied changed-file list (a logical name or contract-relative file), so a change summary cannot silently omit a whole touched area. An unbound optional (trailing ?) source skips silently; a bound source grounds the check with no JSON-in-string plumbing.
each.definitioneach.definitionlistRequire every list item to be a **Term** — description (or : description) pair — a bold term, a delimiter, and a non-empty description. The dominant enumerate-named-things README idiom.
each.definition.delimitereach.definition.delimiter=<option>listRestrict the delimiter each.definition accepts between the term and its description — emdash, colon, or any (default).
each.ineach.in=<option>listRequire every list item, taken whole, to be a member of the source — for lists that mirror a catalogue line-for-line; the source's projection defines the line shape once.
each.mask.anyOfeach.mask.anyOf=<option>listRequire every list item to match ANY of several masks (sentinel row OR structured entry); the miss diagnostic names the closest alternative for that item.
each.maskeach.mask=<option>listRequire every list item to match a mask shape (e.g. "<mention> <text> by <date>") - each.minWords/maxWords for shape instead of length.
each.sentenceseach.sentences=<option>listRequire every list item to contain EXACTLY N sentences (line breaks count as sentence boundaries — see the rule's help text).
each.minWordseach.minWords=<option>listRequire every list item to reach at least N words, so no item is a one-word token gesture.
each.maxWordseach.maxWords=<option>listRequire every list item to stay within N words — mirrors each.minWords to keep items scannable.
minItemsminItems=<option>listRequire at least N list items (or checkboxes) — e.g. at least one reproduction step.
maxItemsmaxItems=<option>listAllow at most N list items (or checkboxes) — mirrors minItems to bound a list's length.
orderedTreeorderedTreelistRequire EVERY list in the section — top-level and nested — to be ordered (numbered); the deep counterpart to ordered for fully sequenced outlines.
orderedorderedlistRequire the section's top-level list to be ordered (numbered), for steps or ranked items where sequence matters; bullet sublists stay allowed.
timelineSumstimelineSumscontentRecompute the span between the first and last HH:MM(:SS)/ISO-timestamped list items (assuming a midnight rollover when the last clock reading is earlier than the first) and compare it against a stated duration (N h/hr/hour(s), N m/min/minute(s), or a combined '1h 30m') found anywhere in the field. Skips with <2 timestamped items, a mixed clock/ISO pair, no stated duration, or 2+ conflicting stated durations. Warns only.
each.falsifiableeach.falsifiablelistRequire every list item to be concrete and falsifiable — verifiable claims, not token gestures. Heuristic, so it warns by default; harden with error=each.falsifiable.
each.sourcedeach.sourcedlistRequire every list item to carry a resolvable citation (link, reference, or footnote). Deterministic, so it errors by default; soften with warn=each.sourced. A true-but-uncitable claim ends with (attested: <who/how>) instead.

Prop details

covers

Require the list to mention every top-level area present in a context-supplied changed-file list, so a change summary cannot silently omit a whole touched area. A missing context key reports missing-context-value rather than passing silently, and so does a key whose value is not a JSON array of paths.

covers=<option> · category: list · status: nursery · also on: evidenceList · src/pipeline/rules/list/coverage.ts

<!-- mdv: list covers=changedFiles -->
## Changes
- Reworked the `src/` compile pipeline entry.
- Regenerated `docs/` reference pages.
<!-- mdv: endlist -->

covers.in

Require the list to mention every top-level area present in a source-supplied changed-file list (a logical name or contract-relative file), so a change summary cannot silently omit a whole touched area. An unbound optional (trailing ?) source skips silently; a bound source grounds the check with no JSON-in-string plumbing.

covers.in=<option> · category: list · status: nursery · also on: evidenceList · src/pipeline/rules/list/coverage.ts

<!-- mdv: list covers.in=changedFiles? -->
## Changes
- Reworked the `src/` compile pipeline entry.
<!-- mdv: endlist -->

each.definition

Require every list item to be a **Term** — description (or : description) pair — a bold term, a delimiter, and a non-empty description. The dominant enumerate-named-things README idiom.

each.definition · category: list · status: stable · also on: evidenceList · src/pipeline/rules/list/each/each-definition.ts

Checks that every list item is a **Term** — description (or : description) definition pair: a bold term (optionally wrapping inline code, or a bold link), a delimiter (em-dash or colon), and a non-empty description. The single most common enumerate-named-things list idiom in real READMEs, expressible without a brittle hand-written pattern. Restrict the delimiter with the companion each.definition.delimiter=emdash|colon (default any accepts either). Targets a list/evidenceList.

<!-- mdv: list each.definition -->
- **driftline-core** — parsing, contract compilation, and the validation engine.
- **driftline-cli** — terminal front end; owns exit codes and output formatting.
<!-- mdv: endlist -->

each.definition.delimiter

Restrict the delimiter each.definition accepts between the term and its description — emdash, colon, or any (default).

each.definition.delimiter=<option> · category: list · status: stable · also on: evidenceList · src/pipeline/rules/list/each/each-definition.ts

Restricts which delimiter {@link eachDefinition} accepts between the term and the description: emdash, colon, or any (the default). A configuration carrier for the each.definition flag — it emits no diagnostics of its own; each.definition reads its value.

<!-- mdv: list each.definition each.definition.delimiter=colon -->
- **`--watch`**: re-run validation when any input file changes.
<!-- mdv: endlist -->

each.in

Require every list item, taken whole, to be a member of the source — for lists that mirror a catalogue line-for-line; the source's projection defines the line shape once.

each.in=<option> · category: list · status: stable · also on: evidenceList · src/pipeline/rules/list/each/each-in.ts

Every list item, taken whole, must be a member of the source — the list-shaped twin of entitiesIn. Built for lists that mirror a catalogue line-for-line (a crew roster, a service inventory): the source's projection template defines the line shape ONCE in config, and this rule needs no shape of its own — structure (the list) is the detector, membership is the law. A drifted line (a role changed in the catalogue, a retired entry kept) reports with the nearest synthesized member as the suggestion. Honest-null without a sources capability.

<!-- mdv: list required each.in=rosterLines? -->
- Captain Vex, callsign Ember — commanding officer (active)
<!-- mdv: endlist -->

each.mask.anyOf

Require every list item to match ANY of several masks (sentinel row OR structured entry); the miss diagnostic names the closest alternative for that item.

each.mask.anyOf=<option> · category: list · status: stable · also on: evidenceList · src/pipeline/rules/list/each/each-mask-any-of.ts

F2 (sol triage S-12): the per-item twin of pattern.mask.anyOf — every list item must match ANY of several quoted mask alternatives, tried in order. Ports pattern.mask.anyOf's alternatives parsing/validation (pattern-mask-any-of.ts) onto each.mask's per-item application (each-mask.ts): the exact "sentinel row OR structured entry" shape (an empty-state line, or a real item) that a single each.mask cannot express. A miss names the CLOSEST alternative for that one item (longest shared prefix, ties to first listed) — never the whole list. v2-only (GRAMMAR-SPEC's alternative-list form).

<!-- mdv: list required each.mask.anyOf=["No escalations this week.", "To <name>: <text> by <date>"] -->
- To Chief Vega: decision on spare-actuator budget by 2311-05-02.

each.mask

Require every list item to match a mask shape (e.g. "<mention> <text> by <date>") - each.minWords/maxWords for shape instead of length.

each.mask=<option> · category: list · status: stable · also on: evidenceList · src/pipeline/rules/list/each/each-mask.ts

Anchored pattern.mask, applied per list item instead of once over the whole section: every item must match the mask shape, not just the section as a whole. Composes the same :in(ref) membership modifier pattern.mask supports (<mention:in(./team.json)>) — once an item's shape matches, its captured value is checked against ctx.document.sources(ref) and reported as unknown-entity on a miss. A shape miss on an item never runs membership for that item; a run with no sources capability supplied degrades to a silent no-op (honest-null), same as pattern.mask/entitiesIn.

<!-- mdv: list each.mask="<mention> <text> by <date>" -->
## Action items
- @maya add queue-depth alert by 2026-07-21
- @sam run failover drill by 2026-08-01
<!-- mdv: endlist -->

each.sentences

Require every list item to contain EXACTLY N sentences (line breaks count as sentence boundaries — see the rule's help text).

each.sentences=<option> · category: list · status: stable · also on: evidenceList · src/pipeline/rules/list/each/each-sentences.ts

F3 (sol triage S-4, count family): every list item's prose must contain EXACTLY N sentences — "each win is exactly one sentence" (weekly-report trial). Reuses the P18 sentence projector's own splitter (splitIntoSentences in src/markdown/blocks/sentences.ts) — no second sentence-splitting implementation. Per the ratified severity doctrine, counts are proxies for the real property ("is this one clean clause"), never constitutive facts, so this rule's catalog codes default to WARN, not error.

CAVEAT (document in schema help text too): the projector treats a physical line break as a sentence boundary, same as every other P18 consumer — a soft-wrapped item split across two physical lines counts as two sentences even with no terminal punctuation between them.

<!-- mdv: list required each.sentences=1 -->
- Shipped the retry-budget fix; on-call load dropped 40%.
<!-- mdv: endlist -->

each.minWords

Require every list item to reach at least N words, so no item is a one-word token gesture.

each.minWords=<option> · category: list · status: stable · also on: evidenceList · src/pipeline/rules/list/each/each-words.ts

<!-- mdv: list each.minWords=3 -->
- the probe handles nested hatches
- the console aborts on drift
<!-- mdv: endlist -->

each.maxWords

Require every list item to stay within N words — mirrors each.minWords to keep items scannable.

each.maxWords=<option> · category: list · status: stable · also on: evidenceList · src/pipeline/rules/list/each/each-words.ts

Checks that every list item stays within a maximum word count; mirrors each.minWords. Targets a list or evidenceList (and the checkbox kinds).

<!-- mdv: list each.maxWords=12 -->
- keep the bridge alert short
- one sensor fault per line
<!-- mdv: endlist -->

minItems

Require at least N list items (or checkboxes) — e.g. at least one reproduction step.

minItems=<option> · category: list · status: stable · also on: taskList, evidenceList · src/pipeline/rules/list/items/items.ts

<!-- mdv: list minItems=2 -->
- rover wheel inspection
- habitat seal check
<!-- mdv: endlist -->

maxItems

Allow at most N list items (or checkboxes) — mirrors minItems to bound a list's length.

maxItems=<option> · category: list · status: stable · also on: taskList, evidenceList · src/pipeline/rules/list/items/items.ts

<!-- mdv: list maxItems=5 -->
- align the docking collar
- ping the Mars relay
<!-- mdv: endlist -->

orderedTree

Require EVERY list in the section — top-level and nested — to be ordered (numbered); the deep counterpart to ordered for fully sequenced outlines.

orderedTree · category: list · status: stable · src/pipeline/rules/list/ordering/ordered-tree.ts

Checks that EVERY list in the section — top-level and nested — is ordered (numbered), for an outline where the whole hierarchy is sequenced. The deep counterpart to ordered (which only checks the top list, allowing bullet sublists). No-op when the section has no list.

<!-- mdv: list orderedTree -->
1. Diagnose the comms blackout
   1. capture sensor inputs
   2. note the beacon trace
2. Patch the relay
<!-- mdv: endlist -->

ordered

Require the section's top-level list to be ordered (numbered), for steps or ranked items where sequence matters; bullet sublists stay allowed.

ordered · category: list · status: stable · src/pipeline/rules/list/ordering/ordered.ts

Checks that the section's list is an ordered (numbered) list, not bullets — for steps or ranked items where sequence matters. No-op when the section has no list (presence is required's job).

<!-- mdv: list ordered minItems=2 -->
1. Reproduce the docking alarm
2. Apply the guidance patch
<!-- mdv: endlist -->

timelineSums

Recompute the span between the first and last HH:MM(:SS)/ISO-timestamped list items (assuming a midnight rollover when the last clock reading is earlier than the first) and compare it against a stated duration (N h/hr/hour(s), N m/min/minute(s), or a combined '1h 30m') found anywhere in the field. Skips with <2 timestamped items, a mixed clock/ISO pair, no stated duration, or 2+ conflicting stated durations. Warns only.

timelineSums · category: content · status: stable · src/pipeline/rules/numeric/timeline-sums.ts

Recompute a postmortem-style timeline's span — from the first to the last item that opens with a timestamp (14:02, 14:02:30, or an ISO datetime) — and reconcile it against a stated total duration (47 minutes, 1h 12m, 30 min outage, 2 hours, ...) found anywhere else in the same field. A same-day clock pair assumes a midnight rollover when the last reading is earlier than the first. Skips (never fires) with fewer than two timestamped items, a mixed clock/ISO pair, or no single stated duration to reconcile against — honest-null, not a guess. Warns only; a contract hardens it with error=timeline-mismatch.

<!-- mdv: list timelineSums -->
- 14:02 - Alerts fired for elevated checkout latency.
- 14:09 - Incident declared; on-call paged.
- 14:49 - Fix deployed; checkout latency back to baseline.

Total outage: 47 minutes.
<!-- mdv: endlist -->

each.falsifiable

Require every list item to be concrete and falsifiable — verifiable claims, not token gestures. Heuristic, so it warns by default; harden with error=each.falsifiable.

each.falsifiable · category: list · status: stable · also on: evidenceList · src/pipeline/rules/plugins/evidence/each-falsifiable.ts

Checks that every list item is concrete and falsifiable — a claim someone could actually verify or refute, not a token gesture. The one spelling of this predicate. Heuristic, so it reports a WARNING by default; harden with error=each.falsifiable.

<!-- mdv: evidenceList each.falsifiable -->
- Ran `npm test`; 412 nav checks pass, 0 fail.
<!-- mdv: endevidenceList -->

each.sourced

Require every list item to carry a resolvable citation (link, reference, or footnote). Deterministic, so it errors by default; soften with warn=each.sourced. A true-but-uncitable claim ends with (attested: <who/how>) instead.

each.sourced · category: list · status: stable · also on: evidenceList · src/pipeline/rules/plugins/evidence/each-sourced.ts

Checks that every list item carries a citation that resolves (a link, reference, or footnote pointing at something real). The one spelling of this predicate. Deterministic, so it is a hard error by default; soften with warn=each.sourced. A true-but-uncitable claim's honest path is a trailing (attested: <who/how>) marker (P5 escape valve; see uncitedAttestation in markdown/blocks/citations.ts) — never a fabricated citation.

<!-- mdv: list each.sourced -->
- Antenna latency dropped after packet batching was enabled [1].
<!-- mdv: endlist -->

On this page