ADR-036: One scaffold for every entry kind — luria new, driven by the config
Status Active · Version 2 · Filed 2026-08-07 · Issue #42 · Influenced ADR-048 · ADR-049
Context
Entry creation was mediated for exactly one layer: luria journal new
stamped a devlog entry’s timestamp-path and frontmatter. The other layers
had the same shape without the tooling — decisions and principles are
“copy _template.md to the next free number” instructions in CLAUDE.md,
and changelog fragments carry a branch-slug naming convention a contributor
reconstructs by hand (#42).
Review on ADR-030 named the generalization: every scheme a project associates with its record is already discoverable in the config, so any prefix-coded scheme could have its fragments templated and new entries mediated by the CLI — and the journal-only command was the special case pretending to be the feature.
Decision
luria new [kind], where the kinds are the config. Journals by name,
schemes by lowercased prefix, fragment directories by their basename minus
.d. A project that adds [luria.schemes.RFC] gets luria new rfc with no
code change, and --help lists what this project scaffolds.
Compute identity, never content. The command fills in exactly what a
machine can know — the next free number, the timestamp path, today’s
date:, the fragment’s timestamped filename (v2; see history:) —
substitutes the real code for the
template’s <PREFIX>-NNN placeholders, prints the path, and stops. A
fragment is authored in a markdown-aware editor; the CLI’s job ends at
handing over a file that will pass the lint’s structural checks.
Fields are settable, not demanded. --title, --status, --summary,
--tags write frontmatter inline — useful for a tool driving the CLI — and
--title keeps the body heading in agreement so the scaffold never fails
the title check it just created. Nothing prompts; nothing is required.
A fragment is named for its filing moment (v2; see history:), the
identity the devlog already uses, so two contributions can never collide on
a name. An explicitly --named fragment is an address: asking for it again
reopens it rather than duplicating it. Two stamped fragments from one
contribution is fine — they collect into the same dated batch, so the
ADR-002 reading intent is preserved by the collector rather
than by filename discipline.
luria journal is removed, not shimmed (ADR-030): luria new is the
scaffold, luria index renders the books, and python -m luria.journal
remains for the interactive look at what is filed.
Alternatives considered
- Interrogate for fields on the command line — the journal command’s
posture (
luria journal new "A title"demanded the title). Rejected by the review that prompted this: documents have multi-field frontmatter, and a human authors it in an editor after the file exists; a required positional argument just makes the scaffold harder to reach. - Hardcode the three known kinds. Simpler dispatch, and it breaks the moment a project configures a second scheme or journal — the exact one-command-per-thing drift ADR-030 removed, rebuilt one layer down.
- Keep
luria journalbesideluria new. Two spellings of one scaffold, one of them narrower — the projection that drifts (DP-3), on the CLI surface that was just cleaned. - Generate from parsed-and-redumped YAML instead of line substitution. Structurally cleaner, and it strips the templates’ teaching comments — which are most of what a template hands a first-time author.
Consequences
- The contributor surface stays at six commands:
journalleaves asnewarrives, and the scaffold instructions in CLAUDE.md, the README table and the template scaffold now sayluria new. - The lint’s journal remedy (“run
luria newto file entries”) and the publish smoke test use the new spelling. - A scheme with no
_template.mdstill scaffolds: a minimal lint-passing fallback (status, title, tag, date, agreeing heading), soluria newworks in a project that deleted the teaching templates. - This decision’s own changelog fragment and devlog entry were filed with
luria new— the guard fired before being trusted (DP-6).