Add ADR 0009 defining the unit / integration / e2e tiers by the seam
each exercises, with the value-returning vs process-side-effecting line
as the boundary between in-process and e2e-only. Add one line to ADR
0008 noting the Result seam is what makes error propagation assertable
in-process, cross-linking 0009.
Split the view command out of the entry point and make its failure a
value rather than an exception. index.ts is now scaffolding plus
dispatch; view.ts owns the behaviour, returning Result<string, ViewError>
(a plain-data tagged union) via neverthrow, with try/catch confined to a
readFile adapter. The entry point matches the Result at the boundary.
Because viewFile is a pure in-process function it is now unit-tested
directly (and counted by coverage), while the subprocess tests stay as
the end-to-end check. ADR 0008 records the errors-as-values convention.
Replace the stale Bun-only project-scaffold spec with a Nix-aware
packaging spec, and record the flake-parts + bun2nix + pinned-Bun
decision as ADR 0007.
Bring core-parser.md in line with the resolved design in CONTEXT.md and
ADRs 0004/0005, and promote a new decision to normalise ingredient/cookware
units.
- Full sync of the core-parser spec: diagnostics/total-function channel,
container blocks (ListItemBlock, BlockquoteBlock), RawInline alongside
RawBlock via position-slicing, the unified WikilinkNode/TransclusionNode
shape as two typed nodes, and the minimal remark plugin set.
- New ADR 0006: normalise ingredient/cookware units via a known-alias table
with passthrough, case-insensitive, canonical-only; align Timer matching
to case-insensitive too.
- SPEC.md: units are normalised (new Units section, alias table); Timer table
marked case-insensitive.
- CONTEXT.md: add Unit Normalisation entry, resolve the open item.
- fixtures/basic.md: add a blockquote (callout) carrying an annotation and a
non-canonical unit so the integration test exercises containers and
normalisation.
- Expand the core test.todo checklists to cover the new behaviour (containers,
raw fallbacks, diagnostics, unit normalisation, wikilink/transclusion
variants); still pending, suite stays green.
Capture the design decisions reached while grilling the core-parser spec:
- Parser is a total function; invalid frontmatter YAML surfaces through a
new Document AST `diagnostics` channel instead of throwing (ADR 0004).
- Parse all of OFM losslessly via `RawBlock`/`RawInline` fallbacks with
position-sliced verbatim source and a minimal plugin set (ADR 0005).
- Grammar-driven (not last-space) quantity/unit split, fixing the
mixed-number collision, with trimming and multi-word unit rules.
- Container blocks nest `Block[]` so annotations surface inside
blockquotes and list items; unified wikilink/transclusion shape.
Update SPEC.md and CONTEXT.md accordingly; no parser code yet.