Prose pass: the config is discovered, so -c guards only its absence
CI / gate (push) Successful in 29s
CI / publish (push) Successful in 4s

This commit was merged in pull request #111.
This commit is contained in:
2026-09-20 18:29:39 +02:00
parent f79241f56f
commit 77ae596d2e
3 changed files with 33 additions and 16 deletions
+8 -9
View File
@@ -257,15 +257,14 @@ functions, and a branch floor that only ever moves upward. It sits below 100 bec
compared against `undefined` — have a half no valid document reaches. compared against `undefined` — have a half no valid document reaches.
The size ratchet is the other such number, `.oxlintrc.json`'s single rule over the files The size ratchet is the other such number, `.oxlintrc.json`'s single rule over the files
`tsconfig.build.json` builds: no function past 52 lines, today's worst (`parseInline`), moving only `tsconfig.build.json` builds: a per-function line ceiling, set at that set's worst and moving only
downward. It stops where the package does, because one ceiling covering the tests and the harness downward. It covers the built files alone, since one ceiling over the tests too would have to be
too would have to be their worst — 64 — which loosens the guard over the shipped code. It guards their worst, loosening the guard over the shipped code. It guards against drift and never drives a
against drift and never drives a refactor, so no cyclomatic rule and no second lint rule join it: refactor, so no cyclomatic rule and no second lint rule join it: neither measure picked out what
neither measure picked out what nine readers found hard (the comprehension panel, 2026-09-20). nine readers found hard (the comprehension panel, 2026-09-20). Three switches guard a silent green:
Three switches are load-bearing: `IIFEs: true`, since oxlint exempts an IIFE otherwise; an explicit `IIFEs: true`, since oxlint exempts an IIFE otherwise; an explicit `-c`, so a config gone missing
`-c`, since finding no config it falls back to 96 default rules, green with the ceiling gone; and fails the leg instead of falling back to oxlint's own defaults; and `--deny-warnings`, since a rule
`--deny-warnings`, since a rule from a category the config never names arrives as a warning it from a category this config never names arrives as a warning it exits 0 on.
exits 0 on.
The corpus, all checked in: hand-built fixtures per node and combination; real ADF Atlassian's The corpus, all checked in: hand-built fixtures per node and combination; real ADF Atlassian's
editor wrote; the CommonMark spec suite against `markdownToAdf` and `markdownToHtml`. editor wrote; the CommonMark spec suite against `markdownToAdf` and `markdownToHtml`.
+5 -6
View File
@@ -872,12 +872,11 @@ The done `todo.md` items in full, as they were written. `todo.md` keeps a one-li
else runs, over the 40 files `tsconfig.build.json` builds — the tests and else runs, over the 40 files `tsconfig.build.json` builds — the tests and
`property-harness.ts` out, five functions over the ceiling with them, the worst 64. The `property-harness.ts` out, five functions over the ceiling with them, the worst 64. The
ceiling is 52, `parseInline`'s length and the built set's worst; at 51 the gate reddens on ceiling is 52, `parseInline`'s length and the built set's worst; at 51 the gate reddens on
it. The leg runs `oxlint --deny-warnings -c .oxlintrc.json src` beside the typecheck at 0.8s, it. `skipBlankLines` and `skipComments` are spelled at oxlint 1.83.0's defaults, so a changed
the two flags because oxlint exits 0 on a warning and, discovering no config, falls back to default cannot move what 52 counts. The leg runs `npm run size-ratchet` beside the typecheck
96 default rules; `skipBlankLines` and `skipComments` are spelled so a changed default cannot at 0.8s, and the lockfile carries every platform binding, so `npm ci` resolves the musl one
move what 52 counts, and `IIFEs` because oxlint exempts an IIFE by default (the inside the image. §10 holds the rule and what each switch guards (the stability-reviewer,
stability-reviewer, 2026-09-20). The lockfile carries every platform binding, so `npm ci` 2026-09-20).
resolves the musl one inside the image.
- [x] **18 — The subtree the directive spelling asks about (`0.2.0`).** The parser asks - [x] **18 — The subtree the directive spelling asks about (`0.2.0`).** The parser asks
`commonMarkSpelling` at every directive-spelled block and the answer emits the whole subtree `commonMarkSpelling` at every directive-spelled block and the answer emits the whole subtree
below, so a node at depth d is spelled d times: three nested rule-first directive lists cost below, so a node at depth d is spelled d times: three nested rule-first directive lists cost
+20 -1
View File
@@ -18,7 +18,8 @@ Start a session with: `Read AGENTS.md and todo.md, then do what todo.md's "Next
## Milestones ## Milestones
Shipping order: 3h, 3i, 3j, 5a, 5b, 5c, 5d, 5 → `0.1.0` (shipped 2026-09-05); 3k, 11, 4, 12, 13, 4b, Shipping order: 3h, 3i, 3j, 5a, 5b, 5c, 5d, 5 → `0.1.0` (shipped 2026-09-05); 3k, 11, 4, 12, 13, 4b,
4c, 14, 15, 16, 18, 4d, 28, 17, 19, 20, 21, 22, 23, 24, 25, 26, 27, 10, 6, 7, 5f, 5g → `0.2.0`; 4c, 14, 15, 16, 18, 4d, 28, 17, 29, 19, 20, 21, 22, 23, 24, 25, 30, 26, 27, 10, 6, 7, 5f, 5g →
`0.2.0`;
8, 9 → TBD; 5e last. 8, 9 → TBD; 5e last.
The numbering is the order the work was planned in, not the order it ships. Everything known and The numbering is the order the work was planned in, not the order it ships. Everything known and
shaped ships in one release rather than a string of them: nothing waits on a version, and no shaped ships in one release rather than a string of them: nothing waits on a version, and no
@@ -36,7 +37,25 @@ head (2026-09-20). They read ahead of 6, 7 and 10 because every one of them is c
HTML format lands than after: 19 and 20 because HTML has no answer without them, 21 to 24 because HTML format lands than after: 19 and 20 because HTML has no answer without them, 21 to 24 because
HTML doubles the importers and the file count they touch, and 25 to 27 because they are what the HTML doubles the importers and the file count they touch, and 25 to 27 because they are what the
panel says the next reader pays for. panel says the next reader pays for.
29 and 30 come from 17's prose pass (2026-09-20). 29 reads first because every goal is what a later
ask is settled against, 19's included; 30 sits beside 25, the other chunk rereading AGENTS.md.
- [ ] **29 — Goal 3 names the whole of the exception (`0.2.0`).** README §Goals 3 says "the three
carve-outs and the one gap below are the whole of the exception", and §The guarantees says
"apart from the raw HTML below, with three carve-outs … and one gap". Raw HTML is a fourth
exception, the commonest one in markdown written elsewhere, and `unmappable-html` refuses it
today. Name it in the goal, or stop enumerating there. Settle at the same time whether the
goal is written for `0.2.0`, where the element mapping the error text promises could make
raw HTML convert — the answer decides which repair is the true one, so it is the
maintainer's.
- [ ] **30 — AGENTS.md says each thing once (`0.2.0`).** §15's ask protocol — name the class, cite
the earlier asks of it, never "A or B?" — is the rule reviewers cite most and has no heading,
two thirds down a 50-line section in a file with no index. Give it one. §15 also offers "the
gate's seconds" as a stated number that is kept, and no such number is stated anywhere, §14
forbidding the category outright; drop the example. Then the restatements: §15 repeats the
one-chunk rule three times and `version`/`NPM_TOKEN` twice, §12 says the default is delete
twice, and §5's "few, each earning its keep; they never reach a consumer" is npm's own
definition of the field. Cut to one copy each, the one carrying the why.
- [ ] **19 — A home for what both formats read (`0.2.0`).** Settle where a construct both formats - [ ] **19 — A home for what both formats read (`0.2.0`).** Settle where a construct both formats
need lives, and say so in AGENTS.md §11. Today `adf/` may hold no format knowledge and each need lives, and say so in AGENTS.md §11. Today `adf/` may hold no format knowledge and each
format directory holds its own shared layer, so there is no third place; the first ADF-shaped format directory holds its own shared layer, so there is no third place; the first ADF-shaped