diff --git a/AGENTS.md b/AGENTS.md index 2acbc3c..faf8c17 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -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. 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 -downward. It stops where the package does, because one ceiling covering the tests and the harness -too would have to be their worst — 64 — which loosens the guard over the shipped code. It guards -against drift and never drives a refactor, so no cyclomatic rule and no second lint rule join it: -neither measure picked out what nine readers found hard (the comprehension panel, 2026-09-20). -Three switches are load-bearing: `IIFEs: true`, since oxlint exempts an IIFE otherwise; an explicit -`-c`, since finding no config it falls back to 96 default rules, green with the ceiling gone; and -`--deny-warnings`, since a rule from a category the config never names arrives as a warning it -exits 0 on. +`tsconfig.build.json` builds: a per-function line ceiling, set at that set's worst and moving only +downward. It covers the built files alone, since one ceiling over the tests too would have to be +their worst, loosening the guard over the shipped code. It guards against drift and never drives a +refactor, so no cyclomatic rule and no second lint rule join it: neither measure picked out what +nine readers found hard (the comprehension panel, 2026-09-20). Three switches guard a silent green: +`IIFEs: true`, since oxlint exempts an IIFE otherwise; an explicit `-c`, so a config gone missing +fails the leg instead of falling back to oxlint's own defaults; and `--deny-warnings`, since a rule +from a category this config never names arrives as a warning it exits 0 on. 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`. diff --git a/todo-history.md b/todo-history.md index 911e084..a82f1cb 100644 --- a/todo-history.md +++ b/todo-history.md @@ -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 `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 - it. The leg runs `oxlint --deny-warnings -c .oxlintrc.json src` beside the typecheck at 0.8s, - the two flags because oxlint exits 0 on a warning and, discovering no config, falls back to - 96 default rules; `skipBlankLines` and `skipComments` are spelled so a changed default cannot - move what 52 counts, and `IIFEs` because oxlint exempts an IIFE by default (the - stability-reviewer, 2026-09-20). The lockfile carries every platform binding, so `npm ci` - resolves the musl one inside the image. + it. `skipBlankLines` and `skipComments` are spelled at oxlint 1.83.0's defaults, so a changed + default cannot move what 52 counts. The leg runs `npm run size-ratchet` beside the typecheck + at 0.8s, and the lockfile carries every platform binding, so `npm ci` resolves the musl one + inside the image. §10 holds the rule and what each switch guards (the stability-reviewer, + 2026-09-20). - [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 below, so a node at depth d is spelled d times: three nested rule-first directive lists cost diff --git a/todo.md b/todo.md index 4fc268c..c48462f 100644 --- a/todo.md +++ b/todo.md @@ -18,7 +18,8 @@ Start a session with: `Read AGENTS.md and todo.md, then do what todo.md's "Next ## Milestones 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. 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 @@ -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 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. +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 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