Context

A NOTE’s status says how deeply a work was read, and a LIT’s status says whether the work was reached. The two are recorded separately, and nothing checked that they agree. A survey of authors on 2026-11-01 found NOTE-1437 on LIT-536, which is Unfetched, and reported it as an inconsistency. The owner asked for a rule in the luria config to flag that sort of thing.

The note is not an inconsistency. It is Skimmed and covers “the Introduction alone”, and the note-statuses vocabulary defines Skimmed as “abstract, figures and selected sections”. Eight notes in the record are like it: each is a skim of a précis, an introduction or an excerpt of a work whose full text was not reached. The contradiction the vocabularies do define is narrower. Read is “the full text, closely enough to state its assumptions and results exactly”. Unavailable (ADR-041) and Unfetched (ADR-053) both say the full text was not reached. A Read note on such a work means one of the two records is wrong. So does a Read note on a Deferred LIT, which lit-statuses defines as “not yet read closely enough to place … or reading stopped at the abstract or a skim”.

Decision

Three patterns are declared with report: true and listed in lint.fail_on:

read_but_unreached:
  match: "(n:NOTE {status: 'Read'})-[:paper]->(l:LIT {status: 'Unavailable'})"
read_but_unfetched:
  match: "(n:NOTE {status: 'Read'})-[:paper]->(l:LIT {status: 'Unfetched'})"
read_but_unreviewed:
  match: "(n:NOTE {status: 'Read'})-[:paper]->(l:LIT {status: 'Deferred'})"

They are three patterns because the pattern grammar matches one literal per property. When one fires, the fix is one of two:

  • The work was read in full. The LIT is placed: it returns to reading, as the Unavailable and Unfetched blurbs already say a supplied copy does, and its status note is updated.
  • Only part was reached. The note is Skimmed, and its summary says which part.

A pattern-ok: directive in the note can excuse a match, as for the ADR-057 checks. It is not expected to be needed.

Verification

The record as of this decision pairs note and LIT statuses as follows: Read with Active, Proposed, Rejected and Superseded; Skimmed with Active, Deferred (3), Unavailable (4) and Unfetched (4); Superseded with Active. No Read note sits on an Unavailable, Unfetched or Deferred LIT, and pattern_rules.reported() returns no match for any of the three patterns. In a scratch copy with NOTE-1437 and NOTE-832 set to Read, it returned read_but_unfetched: (NOTE-1437, LIT-536) and read_but_unreached: (NOTE-832, LIT-1004).

Alternatives considered

  • Flag every note on an unreached work. This was the first proposal. It flags eight skims that the vocabularies allow, and each would need a directive to say so.
  • A warning rather than a failure. The ADR-057 checks fail CI because they were at zero when adopted, and this is at zero too. A warning would let the first contradiction land.
  • Derive the LIT’s status from its notes. A LIT’s status records a search for a copy, and a note doesn’t. Neither can be computed from the other.

Consequences

A filing that reads a work in full, but forgets to move its LIT off Unavailable, Unfetched or Deferred, now fails docs-check. Skims are untouched: a Skimmed note may sit on a LIT of any status.