Score and rank todo.md in one table, and leave the empty-release and weighing rules to the global loop #153

Merged
lilleman merged 6 commits from ranked-todo into main 2026-10-02 22:43:49 +02:00
2 changed files with 25 additions and 24 deletions
Showing only changes of commit 7adab8e19e - Show all commits
+4 -4
View File
@@ -130,10 +130,10 @@ One-line commit messages and PR titles; short PR summaries. No AI-attribution ma
## 7. The working loop ## 7. The working loop
A session works one chunk, starting from the first item in `todo.md` whose prerequisites have A session works one chunk, starting from the first item in `todo.md` whose "Lands after item N"
landed, and stops when that chunk merges, whatever it was asked to finish: a release is a chain of items have all landed, and stops when that chunk merges, whatever it was asked to finish: a release
sessions, so an instruction to work until a release is done names the chain, not the session. An is a chain of sessions, so an instruction to work until a release is done names the chain, not the
open PR is a chunk already in flight, and finishing it is the session. session. An open PR is a chunk already in flight, and finishing it is the session.
Per chunk: Per chunk:
1. Fresh worktree off updated `origin/main`; implement tests-first (§3). 1. Fresh worktree off updated `origin/main`; implement tests-first (§3).
+21 -20
View File
@@ -35,7 +35,7 @@
| 42 | 0.3.0 | | **Trim a text leaf's trailing blanks in linear time.** | 1 | 2 | 5 | 9 | 8 | 12.5 | | 42 | 0.3.0 | | **Trim a text leaf's trailing blanks in linear time.** | 1 | 2 | 5 | 9 | 8 | 12.5 |
| 48 | 0.3.0 | question | **Keep the release path publishing past npm's bypass-2FA token retirement.** | 4 | 4 | 8 | 3 | 9 | 11.7 | | 48 | 0.3.0 | question | **Keep the release path publishing past npm's bypass-2FA token retirement.** | 4 | 4 | 8 | 3 | 9 | 11.7 |
| 31 | 0.3.0 | | **Make the branch-coverage figure repeat across runs of an unchanged tree.** | 2 | 3 | 3 | 4 | 1 | 11.2 | | 31 | 0.3.0 | | **Make the branch-coverage figure repeat across runs of an unchanged tree.** | 2 | 3 | 3 | 4 | 1 | 11.2 |
| 33 | 0.3.0 | | **Emit a line in time linear in its mark runs, in `adfToMarkdown` and the plain reduction.** | 4 | 5 | 6 | 9 | 8 | 10.7 | | 33 | 0.3.0 | | **Emit a line in time linear in its mark runs, in `adfToMarkdown` and `adfToPlainMarkdown`.** | 4 | 5 | 6 | 9 | 8 | 10.7 |
| 46 | 0.3.0 | | **Publish the bundle size in the README, failing the release pipeline when it drifts.** | 2 | 4 | 5 | 5 | 7, 9 | 10.3 | | 46 | 0.3.0 | | **Publish the bundle size in the README, failing the release pipeline when it drifts.** | 2 | 4 | 5 | 5 | 7, 9 | 10.3 |
| 9 | 0.3.0 | | **Ship an online sandbox: a web page with two textboxes converting between ADF and markdown on the library's browser build.** | 2 | 6 | 6 | 8 | 9 | 10.3 | | 9 | 0.3.0 | | **Ship an online sandbox: a web page with two textboxes converting between ADF and markdown on the library's browser build.** | 2 | 6 | 6 | 8 | 9 | 10.3 |
| 8 | 0.4.0 | question | **Ship a CLI.** | 4 | 7 | 5 | 5 | 9 | 5.3 | | 8 | 0.4.0 | question | **Ship a CLI.** | 4 | 7 | 5 | 5 | 9 | 5.3 |
@@ -44,15 +44,17 @@
### 40. Make `markdownToAdf(adfToMarkdown(doc))` deep-equal `doc` for every document `adfToMarkdown` takes. ### 40. Make `markdownToAdf(adfToMarkdown(doc))` deep-equal `doc` for every document `adfToMarkdown` takes.
takes.
Today it holds for editor-normal documents only: two adjacent text nodes with the same marks merge, Today it holds for editor-normal documents only: two adjacent text nodes with the same marks merge,
an empty `attrs`, `marks` or `content` drops, and `-0` reads back `0` — shapes pipelines and bots an empty `attrs`, `marks` or `content` drops, and `-0` reads back `0` — shapes pipelines and bots
build. Spell each so it reads back as written; CommonMark's spelling stays wherever the document build. Spell each so it reads back as written; CommonMark's spelling stays wherever the document
holds none of these shapes. The spellings are part of the chunk. `docs/decisions.md` §Equality is editor-normal, `spec/flavour.md` holds none of these shapes. The spellings are part of the chunk. `docs/decisions.md` §Equality is
and `corpus/README.md` follow, and the tests drop `toEditorNormal`. editor-normal, `spec/flavour.md` and `corpus/README.md` follow, and the tests drop `toEditorNormal`.
### 7. Ship HTML: `adfToHtml`, `htmlToAdf`, and `markdownToHtml` / `htmlToMarkdown` composed through ADF. ### 7. Ship HTML: `adfToHtml`, `htmlToAdf`, and `markdownToHtml` / `htmlToMarkdown` composed through ADF.
Builds on item 6. Once it lands, the CommonMark spec suite runs against `markdownToHtml`. The README Lands after item 6. The CommonMark spec suite also runs against `markdownToHtml`. The README
documents HTML as it documents markdown, and its tagline and `package.json`'s `description` regain documents HTML as it documents markdown, and its tagline and `package.json`'s `description` regain
HTML. HTML.
@@ -83,11 +85,11 @@ already escape it.
### 47. Open the README with what the package is, what it does and for whom. ### 47. Open the README with what the package is, what it does and for whom.
It opens with the pre-launch rationale — Atlassian's REST APIs, `pf-editor-service/convert` being It opens with the pre-launch rationale — Atlassian's REST APIs, `pf-editor-service/convert` being
decommissioned, a link to JRACLOUD-77436. The background goes entirely, no endpoint, ticket or decommissioned, a link to JRACLOUD-77436. The background goes entirely, no endpoint, ticket or "why"
"why" note left. The badges are npm's version and the Gitea Actions status. The README names the note left. The badges are npm's version and the Gitea Actions status. The README names the lossy
lossy pair, `adfToPlainMarkdown` and `plainMarkdownToAdf`, and the flavours it writes and reads — pair, `adfToPlainMarkdown` and `plainMarkdownToAdf`, and the flavours it writes and reads — GitHub
GitHub Flavored Markdown's alerts and task lists, Obsidian Flavored Markdown's callouts — so a Flavored Markdown's alerts and task lists, Obsidian Flavored Markdown's callouts — so a search for
search for either finds the package. any of these names finds the package.
### 34. Read emphasis flanking by the whole character beside an astral symbol. ### 34. Read emphasis flanking by the whole character beside an astral symbol.
@@ -108,11 +110,10 @@ writes was not enough, and npm answered `EOTP` until the token itself bypassed.
bypass-2FA tokens for direct publishing around January 2027, leaving them `npm stage publish`, which bypass-2FA tokens for direct publishing around January 2027, leaving them `npm stage publish`, which
a maintainer approves with 2FA; its replacement — trusted publishing over OIDC — supports a maintainer approves with 2FA; its replacement — trusted publishing over OIDC — supports
GitHub-hosted Actions, GitLab.com's shared runners and CircleCI's cloud, self-hosted runners planned GitHub-hosted Actions, GitLab.com's shared runners and CircleCI's cloud, self-hosted runners planned
without a date. Revisit: without a date. Revisit: whether npm has added Gitea or self-hosted OIDC, and otherwise whether the
whether npm has added Gitea or self-hosted OIDC, and otherwise whether the release moves to the release moves to the staged publish — which fits badly with publish-on-merge, and is the
staged publish — which fits badly with publish-on-merge, and is the maintainer's trade to weigh. maintainer's trade to weigh. The Goals and G cells are provisional: no README goal covers the
The Goals and G cells are provisional: no README goal covers the release path. It stays out of `0.2.0` knowing the cutoff may land release path. It stays out of `0.2.0` knowing the cutoff may land first.
first.
### 31. Make the branch-coverage figure repeat across runs of an unchanged tree. ### 31. Make the branch-coverage figure repeat across runs of an unchanged tree.
@@ -125,7 +126,7 @@ moves upward, so the first raise to the measured figure reddens a run that chang
measurement repeatable, or state the number the floor may be raised to and why it is not the measurement repeatable, or state the number the floor may be raised to and why it is not the
measured one. measured one.
### 33. Emit a line in time linear in its mark runs, in `adfToMarkdown` and the plain reduction. ### 33. Emit a line in time linear in its mark runs, in `adfToMarkdown` and `adfToPlainMarkdown`.
`adfToMarkdown` spends 23 s on one paragraph of 2000 × `un` plus `**-r**`: each run its flanking `adfToMarkdown` spends 23 s on one paragraph of 2000 × `un` plus `**-r**`: each run its flanking
cannot spell re-emits the whole line before riding the carry, quadratic in the runs, and the plain cannot spell re-emits the whole line before riding the carry, quadratic in the runs, and the plain
@@ -135,11 +136,11 @@ reduction's `spellableLine` drops one mark per re-emit the same way. Make both l
Lands after item 7, which changes it. The quantity is what a consumer downloads and loads: the Lands after item 7, which changes it. The quantity is what a consumer downloads and loads: the
tarball `npm pack` produces, its unpacked `dist`, and the built JavaScript minified + gzipped — the tarball `npm pack` produces, its unpacked `dist`, and the built JavaScript minified + gzipped — the
figure the competitors advertise (marklassian's "12kb") and the only apples-to-apples one, since ours figure the competitors advertise (marklassian's "12kb") and the only apples-to-apples one, since
ships tsc's unminified output and no minifier yet (decide here whether to minify for the build or ours ships tsc's unminified output and no minifier yet (decide here whether to minify for the build
report the unminified gzip). The figure lands in README §The package beside the "no runtime or report the unminified gzip). The figure lands in README §The package beside the "no runtime
dependencies" claim. Measured today, unminified: tarball 60.4 kB, unpacked 221.5 kB, JS gzipped dependencies" claim. Measured today, unminified: tarball 60.4 kB, unpacked 221.5 kB, JS gzipped 45.6
45.6 kB. kB.
### 8. Ship a CLI. ### 8. Ship a CLI.