Skip to content

33. The catalogue has two layers, and only one of them has a target

Context

docs/expansion_ideas/HANDOVER-denckring-method-zoo.md §3 asks whether this collection admits mechanisms nobody writes with. Temurah, Ifá, the zāʾirja and the 231 gates are combinatorial devices that are faithfully specifiable and produce no text anyone wants to read. Under the acceptance test this catalogue has always used — run it, get text — they are not entries at all.

The decision has been deferred twice, on purpose, and the deferral has now run out. ADR 0031 records that neither of its two changes needed the layer, because both were schema changes to devices already shipping and neither added a row. Its amendment records the first thing that did press on it: Device.from_text builds rings from a reader's own text, and it gets no catalogue entry because attribution and attested between them offer no value meaning contemporary, with no source. The amendment names this ADR as where that hole would be decided.

The handover's §12 puts the decision third and gives the reason: the denominator. denckring status prints one line over 155 rows, and the project's stated target is 500. Adding temurah to that flat count moves both numbers without saying what changed, and every coverage figure recorded in ADRs 0025–0032 silently stops being comparable with the next one.

The kill criterion has already been run, and passed. The handover proposes dropping the layer if twenty Instrument entries go by without one of them changing how a Verfahren entry is modelled, and names ADR 0031's two changes as its first test cases. The muhmal mask came from al-Khalīl's neglected forms and is now how a device says which of its own readings are real; the naṣṭa/uddiṣṭa index pair came from Piṅgala and is now Device.at/address. Both arrived from the instrument side and both improved the generator side.

Decision

D1. One catalogue, one schema, one file, and a layer field on the row. Values are verfahren and instrument, defaulting to verfahren. Provenance rules do not change: an instrument carries source, attribution and attested under exactly the tests that already enforce them, because the scholarly bar is the reason to admit instruments at all and a second file would mean a second copy of that enforcement.

The German word stays, and that is a naming decision rather than an affectation. procedure is already taken at every level of this package — the YAML key, the registry, procedure_id, the CLI — so an English procedure/instrument pair would name one layer with the word that means both layers everywhere else in the codebase. verfahren is unambiguous precisely because nothing else here is called that.

D2. The layer selects the acceptance test, and that is the entire content of the split. A verfahren is accepted when it runs and yields text a checker scores. An instrument is accepted when its mechanism is faithfully formalised and sourced; output is optional. In practice an instrument's acceptance is exercised by the device protocol of ADR 0031 — radix, at, address, and the round-trip property between the last two — rather than by golden text cases.

D3. Two counters, and the existing line keeps its meaning. Coverage reports verfahren rows in the five-part line it prints today, and instruments on a line of their own. Folding both into one total would make 155 catalogued mean something different from what it meant in every ADR that recorded it, to no one's benefit; the point of separate counters is that the old denominator survives the change.

D4. The 500 target counts entries, and it belongs to verfahren alone. The handover's §15 leaves entries-versus-generators open and says the answer decides whether this split is bookkeeping or philosophy. It is entries: docs/seed/repo-seed.md sets the target against "500+ procedures as data" and distinguishes that from "the subset that is code", so a target counting generators would be a target about the implementation of a dataset whose whole claim is that it stands independent of one. The catalogue is at 155 of 500 under this reading and no instrument entry will ever move that fraction.

D5. The schema grows no value for "contemporary, with no source", and the layer split is not a way in for one. ADR 0031's amendment deferred that question here, and the answer is no. An instrument's bar is faithfully formalised and sourced; a mechanism invented in this repository last month fails the instrument test for the same reason it fails the procedure test. Device.from_text stays what the amendment made it — a constructor and a script, catalogued nowhere.

Consequences

Scope becomes unbounded, and the handover says so before we do. Once classification schemes are admissible there is no principled end to them: every divinatory system, every mnemonic wheel, every combinatorial theology is now in range. The provenance fields are the only brake, and they are a brake on quality, not on quantity. The 500 target used to bound the whole collection and now bounds only part of it.

The kill criterion is retained, and its two passes are weaker evidence than they look. Both test cases were gathered before the layer existed and by the same reading of the same document that proposed it, which is close to marking one's own exam. Twenty instrument entries with no effect on how a verfahren entry is modelled still means the layer is decoration and should be dropped, and the count starts now at zero rather than at two.

Nothing in src/ changes with this record, and the instrument counter will read 0 for some time. No row is added here. A counter sitting at zero is the expected state after this ADR, not an unfinished migration — the decision was owed before the first instrument-side entry, which is precisely why it is being taken with none in hand.

checkability now does two jobs, and this is a real cost. ADR 0002 keeps checkability: none rows permanently unregistered, and ADR 0011 makes checkability a property of the procedure. On the instrument layer none stops meaning "catalogued because the form belongs in an honest survey" and starts also meaning "this is a mechanism, not a text-producing rule" — one field, two readings, distinguishable only by looking at a second field. Left as-is rather than split, because a third checkability value would be schema change in service of a layer that has no entries yet.

Language coverage is a verfahren measurement and will need saying so. The figures in CLAUDE.md and ADR 0032 — en 121/121, de 121/121, fr 80/121 — are computed from meta.requires against a pack's capabilities. An instrument that formalises Ifá has no meaningful languages, and a coverage line that quietly included it would report a regression caused by an addition.

apps/explorer reads counts out of the library and has already broken once on this exact shape. A test there pinned the literal 154 catalogued and went red when the library catalogued a 155th row. Whatever first implements D3 has to run the app's own gate, not just the library's.

What this ADR does not decide. Which instruments are admitted first, and in what order — the handover's §12 items 8 onward are still a list of candidates, not a plan. Whether influence edges between entries become first-class data (§15) is untouched; the layer split neither needs them nor rules them out.