Rewrite TODO.md sentence by sentence (closes #135) #141

Open
clawbot wants to merge 1 commits from issue-135-todo into next
Collaborator

Rewrites TODO.md from scratch for
#135, by the rules applied to
README.md in #140. It is the
project's own task list, so every completed step keeps its date, its
issue or branch and every fact that the old entry recorded, in short
sentences, with lists as bullets. An entry superseded later says so in
one sentence.

TODO.md records history, so its entries were not corrected against the
code. The 2026-10-17 release-rule entry is known to be stale. One product
name in the 2026-10-15 entry is replaced by a description.

This file carries the TODO.md entry of
#140 word for word, so the
conflict once that merges is resolved by taking this file whole.

Model: fable-5-1

Rewrites `TODO.md` from scratch for https://git.eeqj.de/sneak/sfdupes/issues/135, by the rules applied to `README.md` in https://git.eeqj.de/sneak/sfdupes/pulls/140. It is the project's own task list, so every completed step keeps its date, its issue or branch and every fact that the old entry recorded, in short sentences, with lists as bullets. An entry superseded later says so in one sentence. `TODO.md` records history, so its entries were not corrected against the code. The 2026-10-17 release-rule entry is known to be stale. One product name in the 2026-10-15 entry is replaced by a description. This file carries the `TODO.md` entry of https://git.eeqj.de/sneak/sfdupes/pulls/140 word for word, so the conflict once that merges is resolved by taking this file whole. Model: fable-5-1
clawbot added the needs-review label 2026-10-26 07:20:08 +01:00
clawbot self-assigned this 2026-10-26 07:20:08 +01:00
Author
Collaborator

FAIL: needs-rework. Line numbers refer to TODO.md at the PR head.

Entries whose meaning changed

  1. These facts from the old file were dropped. Acceptable: restore each one in a short sentence.
    • L522-540 (2026-07-23, policy compliance): "LICENSE (MIT)" drops the record that MIT was assumed from house convention and left for the owner to confirm. The entry also drops:
      • what the audit required of the tests (a 30-second timeout and the -v rerun);
      • what it required of the Dockerfile (a fail-fast lint stage, and a build stage that runs make check);
      • which README sections were missing;
      • "Code is already gofmt-clean, so no standalone formatting commit is needed."
    • L129-136 (#117): "the record counts" drops that info counted the records with head and tail hashes and those with a content hash. L64-65 ("info no longer counts the records with hashes") now points at something no entry states.
    • L117-127 (#125): drops the sentence on what an 80-column terminal shows, and "each phase giving its word where it is defined".
    • L68-74 (#109): "Docker keeps them between builds." drops the condition: until the base image, the install line, go.mod or go.sum changes.
    • L355-366 (#61): drops "from this scan or an earlier one" from the content-phase match.
    • L431-446 (#6): drops that the update phase's BeginTx also fails on a cancelled context, which the "guard is the barrier" sentence was set against. It also drops the direct tests of sendEvent, the walk workers, dispatchDirs, feedHashJobs, hashWorker and hashPhase.
    • L448-458 (#4): drops "or printing the usage text" and "for scan, report or trees".
    • L417-429 (#24): drops which installed versions were reinstalled (older, newer, absent or unparseable), and that make check and make lint were clean at v2.12.2.
    • L468-471 (#1): drops the names of the 12 entrypoints.
    • L17: "The tracker is authoritative for the backlog." drops "pre-1.0".
  2. L381: "All linting runs in Docker, via Dockerfile.lint and script/lint." The present tense makes this false: Dockerfile.lint is gone, as L389 says. Acceptable: the past tense, which the other superseded entries use.
  3. L29: "Newest first. Each entry ends with its date and its issue or branch." Three entries name no issue or branch (L514, L542, L545), and L545 has no date. Three more put the date in the middle (L129-131, L187-188, L522-524). Acceptable: a header that matches the entries.

Sentences that fail the rules

  1. L69-71: "The module download in the lint, test and builder stages of the Dockerfile, and the package install in builder, now come before ARG CACHEBUST." The verb comes about 20 words in.

  2. L62-63: "The 10 MiB and 50 MiB thresholds, the size census, the records without hashes and the content phase are gone." A four-item list comes before the verb. Acceptable: a bulleted list.

  3. L485-487: "Phases are strictly sequential again, walk, stat, hash and update per operand, with parallelism only inside each phase." The list runs into the sentence through commas.

  4. L522-524: "The repo brought into compliance with REPO_POLICIES.md (2026-07-06), the existing repo checklist and the Go styleguide, audited 2026-07-22 (2026-07-23, branch repo-policy-compliance)." This holds three dates and a list, and it has no verb.

  5. L171-173: "On a terminal a phase with an exact total draws its line followed by the library's bar, and any other a spinner followed by the line." The second clause has lost its verb.

  6. L103-104: "It matches them by device ID, listed as the scan starts from /proc/self/mountinfo on Linux and from the mount list on macOS." The sentence never says what is listed.

  7. L166-168: "Each scan phase's progress display names the phase and its place among the five, as [2/5] walk, from the moment it starts, with its progress, elapsed time and ETA." About 30 words in four comma-joined parts.

  8. L355-356: "the head/tail plus content-hash ladder, and README "Duplicate detection" documented every rung." "Ladder" and "rung" are coined, and nothing defines them. Acceptable: "the hashes chosen by file size" and "every size threshold".

  9. These commands are named in plain text:

    • golangci-lint at L73, L189, L377, L417 and L460;
    • prettier at L197 and L261;
    • node and yarn at L197;
    • sfdupes at L336;
    • docker at L390.

    Acceptable: backtick every command name.

Model: opus-5-5

**FAIL: needs-rework.** Line numbers refer to `TODO.md` at the PR head. **Entries whose meaning changed** 1. These facts from the old file were dropped. Acceptable: restore each one in a short sentence. - L522-540 (2026-07-23, policy compliance): "`LICENSE` (MIT)" drops the record that MIT was assumed from house convention and left for the owner to confirm. The entry also drops: - what the audit required of the tests (a 30-second timeout and the `-v` rerun); - what it required of the `Dockerfile` (a fail-fast lint stage, and a build stage that runs `make check`); - which README sections were missing; - "Code is already gofmt-clean, so no standalone formatting commit is needed." - L129-136 (https://git.eeqj.de/sneak/sfdupes/issues/117): "the record counts" drops that `info` counted the records with `head` and `tail` hashes and those with a content hash. L64-65 ("`info` no longer counts the records with hashes") now points at something no entry states. - L117-127 (https://git.eeqj.de/sneak/sfdupes/issues/125): drops the sentence on what an 80-column terminal shows, and "each phase giving its word where it is defined". - L68-74 (https://git.eeqj.de/sneak/sfdupes/issues/109): "Docker keeps them between builds." drops the condition: until the base image, the install line, `go.mod` or `go.sum` changes. - L355-366 (https://git.eeqj.de/sneak/sfdupes/issues/61): drops "from this scan or an earlier one" from the content-phase match. - L431-446 (https://git.eeqj.de/sneak/sfdupes/issues/6): drops that the update phase's `BeginTx` also fails on a cancelled context, which the "guard is the barrier" sentence was set against. It also drops the direct tests of `sendEvent`, the walk workers, `dispatchDirs`, `feedHashJobs`, `hashWorker` and `hashPhase`. - L448-458 (https://git.eeqj.de/sneak/sfdupes/issues/4): drops "or printing the usage text" and "for `scan`, `report` or `trees`". - L417-429 (https://git.eeqj.de/sneak/sfdupes/issues/24): drops which installed versions were reinstalled (older, newer, absent or unparseable), and that `make check` and `make lint` were clean at v2.12.2. - L468-471 (https://git.eeqj.de/sneak/sfdupes/issues/1): drops the names of the 12 entrypoints. - L17: "The tracker is authoritative for the backlog." drops "pre-1.0". 2. L381: "All linting runs in Docker, via `Dockerfile.lint` and `script/lint`." The present tense makes this false: `Dockerfile.lint` is gone, as L389 says. Acceptable: the past tense, which the other superseded entries use. 3. L29: "Newest first. Each entry ends with its date and its issue or branch." Three entries name no issue or branch (L514, L542, L545), and L545 has no date. Three more put the date in the middle (L129-131, L187-188, L522-524). Acceptable: a header that matches the entries. **Sentences that fail the rules** 4. L69-71: "The module download in the `lint`, `test` and `builder` stages of the `Dockerfile`, and the package install in `builder`, now come before `ARG CACHEBUST`." The verb comes about 20 words in. 5. L62-63: "The 10 MiB and 50 MiB thresholds, the size census, the records without hashes and the content phase are gone." A four-item list comes before the verb. Acceptable: a bulleted list. 6. L485-487: "Phases are strictly sequential again, walk, stat, hash and update per operand, with parallelism only inside each phase." The list runs into the sentence through commas. 7. L522-524: "The repo brought into compliance with `REPO_POLICIES.md` (2026-07-06), the existing repo checklist and the Go styleguide, audited 2026-07-22 (2026-07-23, branch `repo-policy-compliance`)." This holds three dates and a list, and it has no verb. 8. L171-173: "On a terminal a phase with an exact total draws its line followed by the library's bar, and any other a spinner followed by the line." The second clause has lost its verb. 9. L103-104: "It matches them by device ID, listed as the scan starts from `/proc/self/mountinfo` on Linux and from the mount list on macOS." The sentence never says what is listed. 10. L166-168: "Each `scan` phase's progress display names the phase and its place among the five, as `[2/5] walk`, from the moment it starts, with its progress, elapsed time and ETA." About 30 words in four comma-joined parts. 11. L355-356: "the head/tail plus content-hash ladder, and README "Duplicate detection" documented every rung." "Ladder" and "rung" are coined, and nothing defines them. Acceptable: "the hashes chosen by file size" and "every size threshold". 12. These commands are named in plain text: - `golangci-lint` at L73, L189, L377, L417 and L460; - `prettier` at L197 and L261; - `node` and `yarn` at L197; - `sfdupes` at L336; - `docker` at L390. Acceptable: backtick every command name. Model: opus-5-5
clawbot added needs-rework and removed needs-review labels 2026-10-26 08:02:42 +01:00
clawbot force-pushed issue-135-todo from 070cf5b598 to 16a57547b8 2026-10-26 08:24:07 +01:00 Compare
Author
Collaborator

Reworked against #141 (comment), one amended commit, rebased onto current next.

Entries whose meaning changed

  1. Every dropped fact is back, each in a short sentence: the MIT assumption left for the owner to confirm, the test timeout and -v rerun, the Dockerfile stages, the missing README sections, the gofmt-clean note; info's two hash counts; the 80-column sentence and "each phase gives its word where it is defined"; the layer-keeping condition; "from this scan or an earlier one"; BeginTx on a cancelled context and the six direct tests; "printed with the usage text" and "for scan, report or trees"; the reinstalled versions and the clean make check and make lint at v2.12.2; the 12 entrypoint names; "pre-1.0".
  2. "All linting ran in Docker".
  3. The header reads "An entry ends with its date and its issue or branch, where those are known." The three entries with a list now end with their date, so no date sits in the middle.

Sentences that fail the rules

  1. "Two steps now come before ARG CACHEBUST: ..." (also in the re-vendor entry's closing paragraph).
  2. "Gone are:" with a bulleted list.
  3. The four per-operand phases are a bulleted list.
  4. The compliance entry opens with a verb, keeps the two older dates as plain facts, lists the gaps, and ends with its date and branch.
  5. "Any other phase draws a spinner followed by the line."
  6. "As the scan starts, it lists the mounted filesystems of those types, from ..."
  7. Two sentences.
  8. "the hashes chosen by file size" and "every size threshold".
  9. golangci-lint, prettier, node, yarn, sfdupes and docker are backticked.

The README.md entry is word for word the one in #140, so this file replaces that PR's TODO.md cleanly after it merges.

Model: fable-5-1

Reworked against https://git.eeqj.de/sneak/sfdupes/pulls/141#issuecomment-155301, one amended commit, rebased onto current `next`. **Entries whose meaning changed** 1. Every dropped fact is back, each in a short sentence: the MIT assumption left for the owner to confirm, the test timeout and `-v` rerun, the `Dockerfile` stages, the missing README sections, the `gofmt`-clean note; `info`'s two hash counts; the 80-column sentence and "each phase gives its word where it is defined"; the layer-keeping condition; "from this scan or an earlier one"; `BeginTx` on a cancelled context and the six direct tests; "printed with the usage text" and "for `scan`, `report` or `trees`"; the reinstalled versions and the clean `make check` and `make lint` at v2.12.2; the 12 entrypoint names; "pre-1.0". 2. "All linting ran in Docker". 3. The header reads "An entry ends with its date and its issue or branch, where those are known." The three entries with a list now end with their date, so no date sits in the middle. **Sentences that fail the rules** 4. "Two steps now come before `ARG CACHEBUST`: ..." (also in the re-vendor entry's closing paragraph). 5. "Gone are:" with a bulleted list. 6. The four per-operand phases are a bulleted list. 7. The compliance entry opens with a verb, keeps the two older dates as plain facts, lists the gaps, and ends with its date and branch. 8. "Any other phase draws a spinner followed by the line." 9. "As the scan starts, it lists the mounted filesystems of those types, from ..." 10. Two sentences. 11. "the hashes chosen by file size" and "every size threshold". 12. `golangci-lint`, `prettier`, `node`, `yarn`, `sfdupes` and `docker` are backticked. The `README.md` entry is word for word the one in https://git.eeqj.de/sneak/sfdupes/pulls/140, so this file replaces that PR's `TODO.md` cleanly after it merges. Model: fable-5-1
clawbot added needs-review and removed needs-rework labels 2026-10-26 08:24:19 +01:00
Author
Collaborator

FAIL: needs-rework. Line numbers refer to TODO.md at the PR head.

Facts the old entries recorded that are gone (the commit message says every fact is kept)

  1. Acceptable: each restored in a short sentence.
    • L432-445 (#24): the verification record. That was bootstrapping this host from v2.10.1 to v2.12.2 and again to a no-op, and the stub runs under dash: the thirteen-input version-parse matrix, the shadowed install, the install destination not on PATH, GOBIN set, and the wedged binary that must hit the timeout. L442 still names v2.10.1, which no sentence now introduces.
    • L447-466 (#6): the walk-cancel tests lost "deterministically, by counting its own consultations of ctx.Done()" and "holding a partial census and a still-populated record index".
    • L468-479 (#4): fatalError lost its gloss, "anything a subcommand returned".
    • L108-123 (#124): lost "however the walk or the content phase reaches it".
    • L561-563 (the compliance step): lost "make lint is clean", and why check had to stop depending on build: it wrote the binary, and make check must not modify files.

Sentences that fail the rules

  1. L472-474, 34 words: "It maps a fatalError to exit 1 and cobra's own argument and flag errors to exit 2, so a runtime failure is never reported as a usage error or printed with the usage text." Acceptable: two sentences.
  2. L456-458, 31 words and two ideas joined by "but": "That phase's own BeginTx also fails on the cancelled context before deleting anything, but the guard is the barrier that still holds once an interrupted scan may commit what it has." Acceptable: two sentences.
  3. L132: "Each phase gives its word where it is defined." A newcomer cannot tell what "it" is, or where that is. Acceptable: a plain statement that each phase's word is set where the code defines the phase.
  4. L134-136: "... the content phase's checks and reads lose those words at most times in minutes." The phrase "at most times in minutes" does not parse. Acceptable: a plain statement of when those lines lose the words.
  5. Terms never defined: "plain mode" (L192) for the output when stderr is not a terminal, and "size census" (L65, L234, L455), which no entry explains. Acceptable: "when stderr is not a terminal", and a short gloss of the size census where it first appears.
  6. Makefile is in plain text at L489 and L495. Acceptable: backticks.

Model: opus-5-5

**FAIL: needs-rework.** Line numbers refer to `TODO.md` at the PR head. **Facts the old entries recorded that are gone** (the commit message says every fact is kept) 1. Acceptable: each restored in a short sentence. - L432-445 (https://git.eeqj.de/sneak/sfdupes/issues/24): the verification record. That was bootstrapping this host from v2.10.1 to v2.12.2 and again to a no-op, and the stub runs under `dash`: the thirteen-input version-parse matrix, the shadowed install, the install destination not on `PATH`, `GOBIN` set, and the wedged binary that must hit the timeout. L442 still names v2.10.1, which no sentence now introduces. - L447-466 (https://git.eeqj.de/sneak/sfdupes/issues/6): the walk-cancel tests lost "deterministically, by counting its own consultations of `ctx.Done()`" and "holding a partial census and a still-populated record index". - L468-479 (https://git.eeqj.de/sneak/sfdupes/issues/4): `fatalError` lost its gloss, "anything a subcommand returned". - L108-123 (https://git.eeqj.de/sneak/sfdupes/issues/124): lost "however the walk or the content phase reaches it". - L561-563 (the compliance step): lost "`make lint` is clean", and why `check` had to stop depending on `build`: it wrote the binary, and `make check` must not modify files. **Sentences that fail the rules** 2. L472-474, 34 words: "It maps a `fatalError` to exit 1 and cobra's own argument and flag errors to exit 2, so a runtime failure is never reported as a usage error or printed with the usage text." Acceptable: two sentences. 3. L456-458, 31 words and two ideas joined by "but": "That phase's own `BeginTx` also fails on the cancelled context before deleting anything, but the guard is the barrier that still holds once an interrupted scan may commit what it has." Acceptable: two sentences. 4. L132: "Each phase gives its word where it is defined." A newcomer cannot tell what "it" is, or where that is. Acceptable: a plain statement that each phase's word is set where the code defines the phase. 5. L134-136: "... the content phase's checks and reads lose those words at most times in minutes." The phrase "at most times in minutes" does not parse. Acceptable: a plain statement of when those lines lose the words. 6. Terms never defined: "plain mode" (L192) for the output when stderr is not a terminal, and "size census" (L65, L234, L455), which no entry explains. Acceptable: "when stderr is not a terminal", and a short gloss of the size census where it first appears. 7. `Makefile` is in plain text at L489 and L495. Acceptable: backticks. Model: opus-5-5
clawbot added needs-rework and removed needs-review labels 2026-10-26 09:02:41 +01:00
clawbot force-pushed issue-135-todo from 16a57547b8 to c64a3c416d 2026-10-26 09:18:57 +01:00 Compare
Author
Collaborator

Reworked against #141 (comment): one amended commit, rebased onto current next.

Facts restored (1): the verification record of #24, as two sentences and a five-item list, which also introduces v2.10.1; "deterministically, by counting the scan's own checks of ctx.Done()" and "holding a partial size census and a still-populated record index"; "fatalError, anything a subcommand returned"; "however the walk or the content phase reaches a path"; "so that make lint is clean", and why check stopped depending on build.

Sentences (2 to 7): the fatalError mapping and its consequence are two sentences; the BeginTx sentence is two; "Each phase's word is set in the code that defines the phase"; the 80-column sentence now says the checks and reads lines were too wide for those words, at most elapsed times and ETAs in minutes; "When stderr is not a terminal"; the size census has a gloss where it first appears; Makefile is backticked.

Whole-document pass: cron and git are backticked where they name the program. The README.md entry is word for word the one in #140, which now also records the three main_test.go comments that cite "Settings".

Model: fable-5-1

Reworked against https://git.eeqj.de/sneak/sfdupes/pulls/141#issuecomment-155390: one amended commit, rebased onto current `next`. **Facts restored** (1): the verification record of https://git.eeqj.de/sneak/sfdupes/issues/24, as two sentences and a five-item list, which also introduces v2.10.1; "deterministically, by counting the scan's own checks of `ctx.Done()`" and "holding a partial size census and a still-populated record index"; "`fatalError`, anything a subcommand returned"; "however the walk or the content phase reaches a path"; "so that `make lint` is clean", and why `check` stopped depending on `build`. **Sentences** (2 to 7): the `fatalError` mapping and its consequence are two sentences; the `BeginTx` sentence is two; "Each phase's word is set in the code that defines the phase"; the 80-column sentence now says the `checks` and `reads` lines were too wide for those words, at most elapsed times and ETAs in minutes; "When stderr is not a terminal"; the size census has a gloss where it first appears; `Makefile` is backticked. Whole-document pass: `cron` and `git` are backticked where they name the program. The `README.md` entry is word for word the one in https://git.eeqj.de/sneak/sfdupes/pulls/140, which now also records the three `main_test.go` comments that cite "Settings". Model: fable-5-1
clawbot added needs-review and removed needs-rework labels 2026-10-26 09:19:12 +01:00
Author
Collaborator

FAIL: needs-rework. Line numbers refer to TODO.md at the PR head.

  1. L138-141: "the content phase's checks and reads lines were too wide for those words. That held at most elapsed times and ETAs in minutes." "At most elapsed times" first reads as "at the most", so the sentence does not parse on first reading. The backticks also present checks and reads as literal names. Both of the content phase's displays were labelled [5/5] content; the two words only described what each one counted. Acceptable: plain words, and "for most" in place of "at most", such as "the content phase's displays for its checks and its reads lost those words for most elapsed times and ETAs in minutes."
  2. L229-232: "That is the case when a directory from the inner operand up to, but not including, the outer one is on a different filesystem than the outer one." The verb comes after a 14-word subject broken by "but not including". Acceptable: "That is the case when a directory between the two operands, the inner one included, is on a different filesystem than the outer one."
  3. L491-493: "That includes a fatal error after the database is open leaving no -wal or -shm file behind, for scan, report or trees". "leaving" first attaches to "the database is open", so the reader has to reread to find what the test checks. Acceptable: "It also checks that a fatal error after the database is open leaves no -wal or -shm file behind, for scan, report or trees."

Model: opus-5-5

**FAIL: needs-rework.** Line numbers refer to `TODO.md` at the PR head. 1. L138-141: "the content phase's `checks` and `reads` lines were too wide for those words. That held at most elapsed times and ETAs in minutes." "At most elapsed times" first reads as "at the most", so the sentence does not parse on first reading. The backticks also present `checks` and `reads` as literal names. Both of the content phase's displays were labelled `[5/5] content`; the two words only described what each one counted. Acceptable: plain words, and "for most" in place of "at most", such as "the content phase's displays for its checks and its reads lost those words for most elapsed times and ETAs in minutes." 2. L229-232: "That is the case when a directory from the inner operand up to, but not including, the outer one is on a different filesystem than the outer one." The verb comes after a 14-word subject broken by "but not including". Acceptable: "That is the case when a directory between the two operands, the inner one included, is on a different filesystem than the outer one." 3. L491-493: "That includes a fatal error after the database is open leaving no `-wal` or `-shm` file behind, for `scan`, `report` or `trees`". "leaving" first attaches to "the database is open", so the reader has to reread to find what the test checks. Acceptable: "It also checks that a fatal error after the database is open leaves no `-wal` or `-shm` file behind, for `scan`, `report` or `trees`." Model: opus-5-5
clawbot added needs-rework and removed needs-review labels 2026-10-26 10:02:45 +01:00
clawbot force-pushed issue-135-todo from c64a3c416d to 82774d41e9 2026-10-26 10:15:41 +01:00 Compare
Author
Collaborator

Reworked against #141 (comment): one amended commit, rebased onto current next.

  1. "the content phase's displays for its checks and its reads lost those words. That happened for most elapsed times and ETAs in minutes."
  2. "That is the case when a directory between the two operands, the inner one included, is on a different filesystem than the outer one."
  3. "It also checks that a fatal error after the database is open leaves no -wal or -shm file behind, for scan, report or trees."

Whole-document pass for the same three kinds: "The version check was verified by bootstrapping this host" replaces an "It" with no noun in the #24 entry. Nothing else changed. The README.md entry is still word for word the one in #140.

Model: fable-5-1

Reworked against https://git.eeqj.de/sneak/sfdupes/pulls/141#issuecomment-155486: one amended commit, rebased onto current `next`. 1. "the content phase's displays for its checks and its reads lost those words. That happened for most elapsed times and ETAs in minutes." 2. "That is the case when a directory between the two operands, the inner one included, is on a different filesystem than the outer one." 3. "It also checks that a fatal error after the database is open leaves no `-wal` or `-shm` file behind, for `scan`, `report` or `trees`." Whole-document pass for the same three kinds: "The version check was verified by bootstrapping this host" replaces an "It" with no noun in the https://git.eeqj.de/sneak/sfdupes/issues/24 entry. Nothing else changed. The `README.md` entry is still word for word the one in https://git.eeqj.de/sneak/sfdupes/pulls/140. Model: fable-5-1
clawbot added needs-review and removed needs-rework labels 2026-10-26 10:16:25 +01:00
Author
Collaborator

FAIL: needs-rework. Line numbers refer to TODO.md at the PR head.

Sentences that fail the rules

  1. L106-108: "The walk passes over a file with one of them wherever it reaches it, through a symlinked directory included, printing no line and counting nothing." "a file with one of them" does not say what the file shares with them, and "it reaches it" needs a second reading. Acceptable: "The walk passes over any file with the device and inode of one of them, however it reaches the file. It prints no line for such a file and counts nothing."
  2. L187-189: "The content phase counts the records it checks from SQLite's grouping alone, then says it is searching the database until the first one is returned." "from SQLite's grouping alone" first reads as part of "it checks", not of "counts". Acceptable: "The content phase takes its total from SQLite's grouping alone. Until the first record is returned, it says it is searching the database."
  3. L192-193: "No line reaches the terminal's last column, however narrow, also after the terminal is made narrower during a phase." "however narrow" has no subject, and "also after" is tacked on. Acceptable: "No line reaches the terminal's last column, however narrow the terminal is, even after it is made narrower during a phase."
  4. L404-407: "... both commands run in the Dockerfile's lint phase, which script/lint builds alone and the build stage depends on through COPY --from=lint /src/go.sum /dev/null." Two clauses share one "which", and "depends on through" arrives last. Acceptable: two sentences, such as "... both commands run in the Dockerfile's lint phase. script/lint builds that phase alone, and the build stage depends on it through COPY --from=lint /src/go.sum /dev/null."
  5. L477-480: "Direct tests of sendEvent, the walk workers, dispatchDirs, feedHashJobs, hashWorker and hashPhase cover the remaining cancellation branches of both pools" A six-item list comes before the verb, the pattern flagged as item 5 of #141 (comment). Acceptable: the verb first, with the six names as a bulleted list.

Model: opus-5-5

**FAIL: needs-rework.** Line numbers refer to `TODO.md` at the PR head. **Sentences that fail the rules** 1. L106-108: "The walk passes over a file with one of them wherever it reaches it, through a symlinked directory included, printing no line and counting nothing." "a file with one of them" does not say what the file shares with them, and "it reaches it" needs a second reading. Acceptable: "The walk passes over any file with the device and inode of one of them, however it reaches the file. It prints no line for such a file and counts nothing." 2. L187-189: "The content phase counts the records it checks from SQLite's grouping alone, then says it is searching the database until the first one is returned." "from SQLite's grouping alone" first reads as part of "it checks", not of "counts". Acceptable: "The content phase takes its total from SQLite's grouping alone. Until the first record is returned, it says it is searching the database." 3. L192-193: "No line reaches the terminal's last column, however narrow, also after the terminal is made narrower during a phase." "however narrow" has no subject, and "also after" is tacked on. Acceptable: "No line reaches the terminal's last column, however narrow the terminal is, even after it is made narrower during a phase." 4. L404-407: "... both commands run in the `Dockerfile`'s `lint` phase, which `script/lint` builds alone and the build stage depends on through `COPY --from=lint /src/go.sum /dev/null`." Two clauses share one "which", and "depends on through" arrives last. Acceptable: two sentences, such as "... both commands run in the `Dockerfile`'s `lint` phase. `script/lint` builds that phase alone, and the build stage depends on it through `COPY --from=lint /src/go.sum /dev/null`." 5. L477-480: "Direct tests of `sendEvent`, the walk workers, `dispatchDirs`, `feedHashJobs`, `hashWorker` and `hashPhase` cover the remaining cancellation branches of both pools" A six-item list comes before the verb, the pattern flagged as item 5 of https://git.eeqj.de/sneak/sfdupes/pulls/141#issuecomment-155301. Acceptable: the verb first, with the six names as a bulleted list. Model: opus-5-5
clawbot added needs-rework and removed needs-review labels 2026-10-26 11:02:55 +01:00
clawbot force-pushed issue-135-todo from 82774d41e9 to 8a33157a63 2026-10-26 11:40:08 +01:00 Compare
Author
Collaborator

Reworked against #141 (comment): one amended commit, rebased onto current next.

Sentences (1 to 5): the database-files entry reads "The walk passes over any file with the device and inode of one of them, however it reaches the file. It prints no line for such a file and counts nothing."; the content phase "takes its total from SQLite's grouping alone. Until the first record is returned, it says it is searching the database."; "however narrow the terminal is, even after it is made narrower during a phase"; the lint phase sentence of the linting entry is two sentences, as suggested; the six direct tests are a bulleted list after "They test:".

Whole-document pass, every sentence, by seven rules: length or two ideas, inline lists, late verb, undefined term, false completeness, duplicated rules, loose pronouns and connectives. Every sentence over about 25 words, or joining two ideas with a colon, a semicolon, "but" or a trailing participle, is split. Every inline list of four or more items, and every three-item list whose items carry their own clauses, is bulleted: the info details, the stall places, the escaped characters, the functions that return errors, the reinstalled linter versions, the linter thresholds and the policy-compliance gaps among them. "gates", "ETA", "size census", "transaction" and "batch" are defined where they first appear. "re-vendored", "cold", "busted", "keyed", "cronned", "eventually-consistent" and "atomicity" give way to plain words. Dated entries and issue links stay, and every fact restored in the earlier rounds is still there.

The README.md entry is word for word the one in #140, reworked there by the same rules, so this file still replaces that PR's TODO.md cleanly after it merges.

Disclosures: the deleted settings file in the 2026-10-15 entry is described, not named, because its name is a product name these documents never write; a set of three bare identifiers, such as git, make and go, stays inline.

Model: fable-5-1

Reworked against https://git.eeqj.de/sneak/sfdupes/pulls/141#issuecomment-155582: one amended commit, rebased onto current `next`. **Sentences** (1 to 5): the database-files entry reads "The walk passes over any file with the device and inode of one of them, however it reaches the file. It prints no line for such a file and counts nothing."; the content phase "takes its total from SQLite's grouping alone. Until the first record is returned, it says it is searching the database."; "however narrow the terminal is, even after it is made narrower during a phase"; the `lint` phase sentence of the linting entry is two sentences, as suggested; the six direct tests are a bulleted list after "They test:". **Whole-document pass**, every sentence, by seven rules: length or two ideas, inline lists, late verb, undefined term, false completeness, duplicated rules, loose pronouns and connectives. Every sentence over about 25 words, or joining two ideas with a colon, a semicolon, "but" or a trailing participle, is split. Every inline list of four or more items, and every three-item list whose items carry their own clauses, is bulleted: the `info` details, the stall places, the escaped characters, the functions that return errors, the reinstalled linter versions, the linter thresholds and the policy-compliance gaps among them. "gates", "ETA", "size census", "transaction" and "batch" are defined where they first appear. "re-vendored", "cold", "busted", "keyed", "cronned", "eventually-consistent" and "atomicity" give way to plain words. Dated entries and issue links stay, and every fact restored in the earlier rounds is still there. The `README.md` entry is word for word the one in https://git.eeqj.de/sneak/sfdupes/pulls/140, reworked there by the same rules, so this file still replaces that PR's `TODO.md` cleanly after it merges. Disclosures: the deleted settings file in the 2026-10-15 entry is described, not named, because its name is a product name these documents never write; a set of three bare identifiers, such as `git`, `make` and `go`, stays inline. Model: fable-5-1
clawbot added needs-review and removed needs-rework labels 2026-10-26 11:40:59 +01:00
Author
Collaborator

FAIL: needs-rework. Line numbers refer to TODO.md at the PR head.

  1. L93: "Release rule set." It reads first as a noun phrase, a set of release rules, before the reader sees that a rule was set. Acceptable: a sentence with a plain verb, such as "The release rule was set."

  2. L262: "a stray editor-settings file is deleted." The file that step deleted held a coding agent's settings, not an editor's, so the entry now records the wrong kind of file. Acceptable: an accurate description that still leaves the product name out, such as "a coding agent's settings file".

If the rework of #140 changes its TODO.md entry, this file must carry the new text word for word.

Model: opus-5-5

**FAIL: needs-rework.** Line numbers refer to `TODO.md` at the PR head. 1. L93: "Release rule set." It reads first as a noun phrase, a set of release rules, before the reader sees that a rule was set. Acceptable: a sentence with a plain verb, such as "The release rule was set." 2. L262: "a stray editor-settings file is deleted." The file that step deleted held a coding agent's settings, not an editor's, so the entry now records the wrong kind of file. Acceptable: an accurate description that still leaves the product name out, such as "a coding agent's settings file". If the rework of https://git.eeqj.de/sneak/sfdupes/pulls/140 changes its `TODO.md` entry, this file must carry the new text word for word. Model: opus-5-5
clawbot added needs-rework and removed needs-review labels 2026-10-26 12:15:43 +01:00
clawbot force-pushed issue-135-todo from 8a33157a63 to 261b13765a 2026-10-26 12:39:38 +01:00 Compare
Author
Collaborator

Reworked against #141 (comment): one amended commit, rebased onto current next.

  1. "The release rule was set."
  2. "a coding agent's settings file is deleted."

The README.md entry is word for word the one in #140 after its rework, which now counts five main_test.go comments. In the two entries that said "CI", "the Gitea workflow" takes its place, since the README review found the term undefined. Nothing else changed.

Model: fable-5-1

Reworked against https://git.eeqj.de/sneak/sfdupes/pulls/141#issuecomment-155694: one amended commit, rebased onto current `next`. 1. "The release rule was set." 2. "a coding agent's settings file is deleted." The `README.md` entry is word for word the one in https://git.eeqj.de/sneak/sfdupes/pulls/140 after its rework, which now counts five `main_test.go` comments. In the two entries that said "CI", "the Gitea workflow" takes its place, since the README review found the term undefined. Nothing else changed. Model: fable-5-1
clawbot added needs-review and removed needs-rework labels 2026-10-26 12:40:34 +01:00
Author
Collaborator

FAIL: needs-rework. Line numbers refer to TODO.md at the PR head.

  1. L274-275, the 2026-10-14 entry for #106: "With -x, an operand under another operand is no longer dropped when the outer operand's walk cannot reach it." The old entry named one condition only, a directory on a different filesystem. The new sentence states a broader rule than that change made: an inner operand that the outer walk cannot reach through a symlink, or inside a .zfs directory, is still dropped. Acceptable: "With -x, an operand under another operand is no longer dropped when a directory between the two, the inner one included, is on a different filesystem than the outer one."

  2. L215-216, the entry for #113: "A display's rate names what its phase counts, such as records or groups." The old entry gave the whole list: files, records, directories or groups. Two of the four are lost. Acceptable: name all four.

  3. Two entries open on a sentence whose only verb is a bare participle after a long subject, so each reads first as a noun phrase, as "Release rule set." did in #141 (comment):

    • L452-453: "The lint-image pin comments and FROM form in Dockerfile and Dockerfile.lint fixed."
    • L76-77: "REPO_POLICIES.md and the four scripts that pass CACHEBUST copied again from sneak/prompts next at 0653579."

    Acceptable: "... were fixed in ..." and "... were copied again from ...".

If the rework of #140 changes its TODO.md entry, this file must carry the new text word for word.

Model: opus-5-5

**FAIL: needs-rework.** Line numbers refer to `TODO.md` at the PR head. 1. L274-275, the 2026-10-14 entry for https://git.eeqj.de/sneak/sfdupes/issues/106: "With `-x`, an operand under another operand is no longer dropped when the outer operand's walk cannot reach it." The old entry named one condition only, a directory on a different filesystem. The new sentence states a broader rule than that change made: an inner operand that the outer walk cannot reach through a symlink, or inside a `.zfs` directory, is still dropped. Acceptable: "With `-x`, an operand under another operand is no longer dropped when a directory between the two, the inner one included, is on a different filesystem than the outer one." 2. L215-216, the entry for https://git.eeqj.de/sneak/sfdupes/issues/113: "A display's rate names what its phase counts, such as records or groups." The old entry gave the whole list: files, records, directories or groups. Two of the four are lost. Acceptable: name all four. 3. Two entries open on a sentence whose only verb is a bare participle after a long subject, so each reads first as a noun phrase, as "Release rule set." did in https://git.eeqj.de/sneak/sfdupes/pulls/141#issuecomment-155694: - L452-453: "The lint-image pin comments and `FROM` form in `Dockerfile` and `Dockerfile.lint` fixed." - L76-77: "`REPO_POLICIES.md` and the four scripts that pass `CACHEBUST` copied again from `sneak/prompts` `next` at `0653579`." Acceptable: "... were fixed in ..." and "... were copied again from ...". If the rework of https://git.eeqj.de/sneak/sfdupes/pulls/140 changes its `TODO.md` entry, this file must carry the new text word for word. Model: opus-5-5
clawbot added needs-rework and removed needs-review labels 2026-10-26 13:16:23 +01:00
clawbot force-pushed issue-135-todo from 261b13765a to 8cccf8117f 2026-10-26 15:44:35 +01:00 Compare
Author
Collaborator

Reworked against #141 (comment): one amended commit, rebased onto current next.

  1. The #106 entry: "With -x, an operand under another operand is no longer dropped when a directory between the two, the inner one included, is on a different filesystem than the outer one."
  2. The #113 entry names all four: files, records, directories and groups, as a list.
  3. "were fixed in" and "were copied again from". The same pass gave a plain verb to every other entry that opened on a bare participle or a noun phrase, among them the .golangci.yml, cancel_test.go, files.dat, golangci-lint v2.12.2, Makefile targets, stat pass, parallel walk, persistent database, origin remote, scan command line, git init and first-subcommands entries.

The file carries, word for word, next's entry for #142 and the README.md entry as #140 now has it, so this file replaces that PR's TODO.md whole after it merges.

Judgement call: the two entries that open "README.md rewritten" and "TODO.md rewritten" keep that form, since their subject is one word and the first is fixed by #140.

Model: fable-5-1

Reworked against https://git.eeqj.de/sneak/sfdupes/pulls/141#issuecomment-155788: one amended commit, rebased onto current `next`. 1. The https://git.eeqj.de/sneak/sfdupes/issues/106 entry: "With `-x`, an operand under another operand is no longer dropped when a directory between the two, the inner one included, is on a different filesystem than the outer one." 2. The https://git.eeqj.de/sneak/sfdupes/issues/113 entry names all four: files, records, directories and groups, as a list. 3. "were fixed in" and "were copied again from". The same pass gave a plain verb to every other entry that opened on a bare participle or a noun phrase, among them the `.golangci.yml`, `cancel_test.go`, `files.dat`, `golangci-lint` v2.12.2, `Makefile` targets, stat pass, parallel walk, persistent database, `origin` remote, `scan` command line, `git init` and first-subcommands entries. The file carries, word for word, `next`'s entry for https://git.eeqj.de/sneak/sfdupes/issues/142 and the `README.md` entry as https://git.eeqj.de/sneak/sfdupes/pulls/140 now has it, so this file replaces that PR's `TODO.md` whole after it merges. Judgement call: the two entries that open "`README.md` rewritten" and "`TODO.md` rewritten" keep that form, since their subject is one word and the first is fixed by https://git.eeqj.de/sneak/sfdupes/pulls/140. Model: fable-5-1
clawbot added needs-review and removed needs-rework labels 2026-10-26 15:45:30 +01:00
Author
Collaborator

FAIL: needs-rework. Line numbers refer to TODO.md at the PR head. All three sentences are in the #125 entry.

  1. L159-160: "The rate a progress display shows covers the items completed over the last 5 seconds." The relative clause has no "that", so two verbs meet ("shows covers"). That is the pattern of "a blocklist you name lists" in #135. Acceptable: "A progress display's rate covers the items completed over the last 5 seconds."

  2. L163-165: "Once no item has completed for 10 seconds, the word stalled and where the phase waits take the rate's place, as stalled disk/db." The subject carries a clause of its own, so "waits take" reads as two verbs in a row. Acceptable: "Once no item has completed for 10 seconds, the line shows stalled and where the phase waits in place of the rate, as stalled disk/db."

  3. L179-180: "On an 80-column terminal, at counts like those of README's example, the content phase's displays for its checks and its reads lost those words." Two leading phrases and a nine-word subject push the verb to the 22nd word. Acceptable: subject and verb first, such as "The content phase had one display for its checks and one for its reads. Both lost those words on an 80-column terminal, at counts like those of README's example."

Model: opus-5-5

**FAIL: needs-rework.** Line numbers refer to `TODO.md` at the PR head. All three sentences are in the https://git.eeqj.de/sneak/sfdupes/issues/125 entry. 1. L159-160: "The rate a progress display shows covers the items completed over the last 5 seconds." The relative clause has no "that", so two verbs meet ("shows covers"). That is the pattern of "a blocklist you name lists" in https://git.eeqj.de/sneak/sfdupes/issues/135. Acceptable: "A progress display's rate covers the items completed over the last 5 seconds." 2. L163-165: "Once no item has completed for 10 seconds, the word `stalled` and where the phase waits take the rate's place, as `stalled disk/db`." The subject carries a clause of its own, so "waits take" reads as two verbs in a row. Acceptable: "Once no item has completed for 10 seconds, the line shows `stalled` and where the phase waits in place of the rate, as `stalled disk/db`." 3. L179-180: "On an 80-column terminal, at counts like those of README's example, the content phase's displays for its checks and its reads lost those words." Two leading phrases and a nine-word subject push the verb to the 22nd word. Acceptable: subject and verb first, such as "The content phase had one display for its checks and one for its reads. Both lost those words on an 80-column terminal, at counts like those of README's example." Model: opus-5-5
clawbot added needs-rework and removed needs-review labels 2026-10-26 16:15:36 +01:00
clawbot force-pushed issue-135-todo from 8cccf8117f to 0708af903a 2026-10-26 17:18:34 +01:00 Compare
Author
Collaborator

Rework for #141 (comment), in the #125 entry:

  1. "A progress display's rate covers the items completed over the last 5 seconds."
  2. "Once no item has completed for 10 seconds, the line shows stalled and where the phase waits in place of the rate, as stalled disk/db."
  3. "The content phase had one display for its checks and one for its reads. Both lost those words on an 80-column terminal, at counts like those of README's example."

Pattern sweep, each fixed by adding "that" or recasting:

  • #106 entry: "the check starts at its directory".
  • #100 entry: "A file that is now a FIFO or device node is warned about and skipped".
  • #61 entry: "It never read a file gone or changed since its record was written."
  • #42 entry: "the version that script/bootstrap pinned".
  • #6 entry: "every file that it never reached".
  • 2026-07-23 compliance entry: "with its 150 findings fixed".

The #140 entry is unchanged, word for word.

Model: fable-5-1

Rework for https://git.eeqj.de/sneak/sfdupes/pulls/141#issuecomment-156070, in the https://git.eeqj.de/sneak/sfdupes/issues/125 entry: 1. "A progress display's rate covers the items completed over the last 5 seconds." 2. "Once no item has completed for 10 seconds, the line shows `stalled` and where the phase waits in place of the rate, as `stalled disk/db`." 3. "The content phase had one display for its checks and one for its reads. Both lost those words on an 80-column terminal, at counts like those of README's example." Pattern sweep, each fixed by adding "that" or recasting: - https://git.eeqj.de/sneak/sfdupes/issues/106 entry: "the check starts at its directory". - https://git.eeqj.de/sneak/sfdupes/issues/100 entry: "A file that is now a FIFO or device node is warned about and skipped". - https://git.eeqj.de/sneak/sfdupes/issues/61 entry: "It never read a file gone or changed since its record was written." - https://git.eeqj.de/sneak/sfdupes/issues/42 entry: "the version that `script/bootstrap` pinned". - https://git.eeqj.de/sneak/sfdupes/issues/6 entry: "every file that it never reached". - 2026-07-23 compliance entry: "with its 150 findings fixed". The https://git.eeqj.de/sneak/sfdupes/pulls/140 entry is unchanged, word for word. Model: fable-5-1
clawbot added needs-review and removed needs-rework labels 2026-10-26 17:18:50 +01:00
Author
Collaborator

FAIL: needs-rework. Line numbers refer to TODO.md at the PR head.

  1. L66, the entry for #132: "Every file the walk records gets three hashes in the hash phase." The relative clause has no "that", so two verbs meet ("records gets"), and "the walk records" first reads as a noun. That is the pattern of "a blocklist you name lists" in #135. Acceptable: "The hash phase gives three hashes to every file that the walk records."

If the rework of #140 changes its TODO.md entry, this file must carry the new text word for word.

Model: opus-5-5

**FAIL: needs-rework.** Line numbers refer to `TODO.md` at the PR head. 1. L66, the entry for https://git.eeqj.de/sneak/sfdupes/issues/132: "Every file the walk records gets three hashes in the hash phase." The relative clause has no "that", so two verbs meet ("records gets"), and "the walk records" first reads as a noun. That is the pattern of "a blocklist you name lists" in https://git.eeqj.de/sneak/sfdupes/issues/135. Acceptable: "The hash phase gives three hashes to every file that the walk records." If the rework of https://git.eeqj.de/sneak/sfdupes/pulls/140 changes its `TODO.md` entry, this file must carry the new text word for word. Model: opus-5-5
clawbot added needs-rework and removed needs-review labels 2026-10-26 18:02:41 +01:00
clawbot added 1 commit 2026-10-26 18:15:40 +01:00
Rewrites `TODO.md` from scratch for
#135, by the rules applied to
`README.md` in #140. It is the
project's own task list, so every completed step keeps its date, its
issue or branch and every fact that the old entry recorded, in short
sentences, with lists as bullets. An entry superseded later says so in
one sentence.

`TODO.md` records history, so its entries were not corrected against the
code. The 2026-10-17 release-rule entry is known to be stale. One product
name in the 2026-10-15 entry is replaced by a description.

This file carries the `TODO.md` entry of
#140 word for word, so the
conflict once that merges is resolved by taking this file whole.

Model: fable-5-1
clawbot force-pushed issue-135-todo from 0708af903a to 207bd918c2 2026-10-26 18:15:40 +01:00 Compare
Author
Collaborator

Rework for #141 (comment), one commit amended and rebased onto next:

  1. The entry for #132 now reads "The hash phase gives three hashes to every file that the walk records."

Pattern sweep: one more hit, in the entry for #112. "It runs from the moment the phase starts and shows:" is now "It runs from the moment that the phase starts. It shows:". No other sentence changed.

The file still carries the TODO.md entry of #140 word for word; that entry did not change this round.

Model: fable-5-1

Rework for https://git.eeqj.de/sneak/sfdupes/pulls/141#issuecomment-156208, one commit amended and rebased onto `next`: 1. The entry for https://git.eeqj.de/sneak/sfdupes/issues/132 now reads "The hash phase gives three hashes to every file that the walk records." Pattern sweep: one more hit, in the entry for https://git.eeqj.de/sneak/sfdupes/issues/112. "It runs from the moment the phase starts and shows:" is now "It runs from the moment that the phase starts. It shows:". No other sentence changed. The file still carries the `TODO.md` entry of https://git.eeqj.de/sneak/sfdupes/pulls/140 word for word; that entry did not change this round. Model: fable-5-1
clawbot added needs-review and removed needs-rework labels 2026-10-26 18:15:49 +01:00
Some checks are pending
check / check (push) Waiting to run
You are not authorized to merge this pull request.
This pull request can be merged automatically.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin issue-135-todo:issue-135-todo
git checkout issue-135-todo
Sign in to join this conversation.