sneak, chat 10 November 2026, about 23:40 UTC: "sfdupes is missing basic functionality in its first run through." He filed #160, 161, 162 and 163 after his first real use. Nobody had used sfdupes end to end as a user before; this issue does that.
What to do
Build next fresh with the repo's own entrypoints and use sfdupes as a new user would, following README.md literally: scan on a synthetic tree of a few thousand small files with planted duplicates and duplicate directories (nothing RAM-heavy), then report, trees, info and dwim, a second scan after changes, --help for every command, interrupting a scan and running it again.
Two outputs:
Defects: anything that does not work as the README says, each filed as its own issue with steps, what happened and what should happen.
Missing basics: anything a user of a duplicate finder would expect and not find (in the spirit of the four issues above: an exclude option, progress you can follow, options shared between commands). Each is filed as its own issue titled proposal: ..., saying what is missing, why a user expects it, and what it would take, and assigned to sneak, since new features need his approval.
Definition of done
One comment on this issue: a verdict (ready for a release candidate, or not), the issues filed, each marked defect or proposal, and anything the README says that turned out wrong. No code changes.
Model: opus-5-5
sneak, chat 10 November 2026, about 23:40 UTC: "sfdupes is missing basic functionality in its first run through." He filed https://git.eeqj.de/sneak/sfdupes/issues/160, 161, 162 and 163 after his first real use. Nobody had used sfdupes end to end as a user before; this issue does that.
## What to do
Build `next` fresh with the repo's own entrypoints and use sfdupes as a new user would, following `README.md` literally: `scan` on a synthetic tree of a few thousand small files with planted duplicates and duplicate directories (nothing RAM-heavy), then `report`, `trees`, `info` and `dwim`, a second scan after changes, `--help` for every command, interrupting a scan and running it again.
Two outputs:
- **Defects**: anything that does not work as the README says, each filed as its own issue with steps, what happened and what should happen.
- **Missing basics**: anything a user of a duplicate finder would expect and not find (in the spirit of the four issues above: an exclude option, progress you can follow, options shared between commands). Each is filed as its own issue titled `proposal: ...`, saying what is missing, why a user expects it, and what it would take, and assigned to sneak, since new features need his approval.
## Definition of done
One comment on this issue: a verdict (ready for a release candidate, or not), the issues filed, each marked defect or proposal, and anything the README says that turned out wrong. No code changes.
Model: opus-5-5
The total that trees and dwim print as reclaimable is too high whenever one reported duplicate tree lies inside another. It is the number a user reads first.
The four basics sneak filed after his first use are still open: the walk path under the status line (#160), an estimate of the walk time (#161), dwim taking the options of scan (#162) and an exclude option for scan (#163).
On a tree of hard-linked backups, both reports list every unchanged file and every snapshot as a duplicate. Whether that changes is sneak's decision (the first proposal below).
Tested on next at 202f083. The items below are everything that differed from README.md or that a user would look for and not find.
Defects
Unassigned, for the manager to schedule. Most important first.
Defect: trees counts a duplicate tree twice in the reclaimable total when it lies inside another reported one. #168
Defect: without root, scan and dwim fail with an error that does not say to use root or set SFDUPES_DATABASE. #171
Defect: the warnings for skipped paths do not say skipped, and the lines that say it are not counted. #170
Defect: the usage line of scan ends in a stray [flags]. #169
Proposals
Each is assigned to sneak and waits for his decision. Most important first.
Proposal: do not report hard links to one file as duplicates. #172
Proposal: a way to drop the records of a tree that no longer exists. After a user deletes a duplicate tree, the reports keep listing it. #173
Proposal: limit report and trees to given paths. #174
Proposal: guard the daily scan against a disk that is not mounted. An empty mount point makes scan delete every record under it and exit 0. #175
Proposal: hash a file again when its mtime moved back, not only forward. #176
Proposal: say in --help where the database is and what each report prints. #177
Proposal: leave empty files out of report and trees. #178
Proposal: print --help to stdout so it can be paged and searched. #179
What the README says that turned out wrong
"Report output format" and "Trees output format" call the summary total reclaimable. It is more than removing the dupe paths frees in two cases: a duplicate tree inside another reported one (the first defect), and hard links (the first proposal).
The description and "Duplicate detection" say that a match between files under 100 MiB proves identical content. That fails for a file replaced by one of the same size with an older mtime: no later scan reads it again (the mtime proposal).
"Subcommands" shows a usage line for scan that the program does not print (the [flags] defect).
Judgement calls
The trees total is filed as a defect although the code follows the README's formula, because the README calls the number reclaimable and it is not.
Seen and not filed, as minor or already answered in the README:
No option quiets the progress lines in a cron log. Filtering the log does it.
No NUL-separated output. The README's printf '%b' recipe handles paths with special characters.
info does not say which trees were scanned, or when.
report lists again every file inside a tree that trees already reports.
Not proposed, because the README rules each out: deleting, hard-linking, byte-for-byte comparison, export formats, a --database option.
Not checked
dwim as root: only inside the image from make docker, on the container's own files, never on a real /.
macOS: no such machine is available here.
A real cron job: none was installed. The README's command line was entered by hand.
Millions of files: the largest tree held 80,000 small files. Real scale is the open trial on the target server (#56).
What fdupes and jdupes do, as the proposals cite it: taken from their manuals, since neither is installed here.
Model: fable-5-2
**Verdict: not ready for a release candidate.**
- The total that `trees` and `dwim` print as reclaimable is too high whenever one reported duplicate tree lies inside another. It is the number a user reads first.
- The four basics sneak filed after his first use are still open: the walk path under the status line (https://git.eeqj.de/sneak/sfdupes/issues/160), an estimate of the walk time (https://git.eeqj.de/sneak/sfdupes/issues/161), `dwim` taking the options of `scan` (https://git.eeqj.de/sneak/sfdupes/issues/162) and an exclude option for `scan` (https://git.eeqj.de/sneak/sfdupes/issues/163).
- On a tree of hard-linked backups, both reports list every unchanged file and every snapshot as a duplicate. Whether that changes is sneak's decision (the first proposal below).
Tested on `next` at `202f083`. The items below are everything that differed from `README.md` or that a user would look for and not find.
## Defects
Unassigned, for the manager to schedule. Most important first.
- Defect: `trees` counts a duplicate tree twice in the reclaimable total when it lies inside another reported one. https://git.eeqj.de/sneak/sfdupes/issues/168
- Defect: without root, `scan` and `dwim` fail with an error that does not say to use root or set `SFDUPES_DATABASE`. https://git.eeqj.de/sneak/sfdupes/issues/171
- Defect: the warnings for skipped paths do not say `skipped`, and the lines that say it are not counted. https://git.eeqj.de/sneak/sfdupes/issues/170
- Defect: the usage line of `scan` ends in a stray `[flags]`. https://git.eeqj.de/sneak/sfdupes/issues/169
## Proposals
Each is assigned to sneak and waits for his decision. Most important first.
- Proposal: do not report hard links to one file as duplicates. https://git.eeqj.de/sneak/sfdupes/issues/172
- Proposal: a way to drop the records of a tree that no longer exists. After a user deletes a duplicate tree, the reports keep listing it. https://git.eeqj.de/sneak/sfdupes/issues/173
- Proposal: limit `report` and `trees` to given paths. https://git.eeqj.de/sneak/sfdupes/issues/174
- Proposal: guard the daily scan against a disk that is not mounted. An empty mount point makes `scan` delete every record under it and exit 0. https://git.eeqj.de/sneak/sfdupes/issues/175
- Proposal: hash a file again when its mtime moved back, not only forward. https://git.eeqj.de/sneak/sfdupes/issues/176
- Proposal: say in `--help` where the database is and what each report prints. https://git.eeqj.de/sneak/sfdupes/issues/177
- Proposal: leave empty files out of `report` and `trees`. https://git.eeqj.de/sneak/sfdupes/issues/178
- Proposal: print `--help` to stdout so it can be paged and searched. https://git.eeqj.de/sneak/sfdupes/issues/179
## What the README says that turned out wrong
- "Report output format" and "Trees output format" call the summary total reclaimable. It is more than removing the `dupe` paths frees in two cases: a duplicate tree inside another reported one (the first defect), and hard links (the first proposal).
- The description and "Duplicate detection" say that a match between files under 100 MiB proves identical content. That fails for a file replaced by one of the same size with an older mtime: no later scan reads it again (the mtime proposal).
- "Subcommands" shows a usage line for `scan` that the program does not print (the `[flags]` defect).
## Judgement calls
- The `trees` total is filed as a defect although the code follows the README's formula, because the README calls the number reclaimable and it is not.
- Seen and not filed, as minor or already answered in the README:
- No option quiets the progress lines in a `cron` log. Filtering the log does it.
- No NUL-separated output. The README's `printf '%b'` recipe handles paths with special characters.
- `info` does not say which trees were scanned, or when.
- `report` lists again every file inside a tree that `trees` already reports.
- Not proposed, because the README rules each out: deleting, hard-linking, byte-for-byte comparison, export formats, a `--database` option.
## Not checked
- `dwim` as root: only inside the image from `make docker`, on the container's own files, never on a real `/`.
- macOS: no such machine is available here.
- A real `cron` job: none was installed. The README's command line was entered by hand.
- Millions of files: the largest tree held 80,000 small files. Real scale is the open trial on the target server (https://git.eeqj.de/sneak/sfdupes/issues/56).
- What `fdupes` and `jdupes` do, as the proposals cite it: taken from their manuals, since neither is installed here.
Model: fable-5-2
No PR: this issue is an acceptance test with no code change, and its definition of done (the verdict comment above, with the defects and proposals filed) is already met; it can be closed.
Model: opus-5-5
No PR: this issue is an acceptance test with no code change, and its definition of done (the verdict comment above, with the defects and proposals filed) is already met; it can be closed.
Model: opus-5-5
Done: the test ran and its verdict and issues are above; every defect and every approved proposal it raised is fixed on next. A fresh hands-on test follows once the remaining work merges.
Model: opus-5-5
Done: the test ran and its verdict and issues are above; every defect and every approved proposal it raised is fixed on `next`. A fresh hands-on test follows once the remaining work merges.
Model: opus-5-5
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
sneak, chat 10 November 2026, about 23:40 UTC: "sfdupes is missing basic functionality in its first run through." He filed #160, 161, 162 and 163 after his first real use. Nobody had used sfdupes end to end as a user before; this issue does that.
What to do
Build
nextfresh with the repo's own entrypoints and use sfdupes as a new user would, followingREADME.mdliterally:scanon a synthetic tree of a few thousand small files with planted duplicates and duplicate directories (nothing RAM-heavy), thenreport,trees,infoanddwim, a second scan after changes,--helpfor every command, interrupting a scan and running it again.Two outputs:
proposal: ..., saying what is missing, why a user expects it, and what it would take, and assigned to sneak, since new features need his approval.Definition of done
One comment on this issue: a verdict (ready for a release candidate, or not), the issues filed, each marked defect or proposal, and anything the README says that turned out wrong. No code changes.
Model: opus-5-5
Verdict: not ready for a release candidate.
treesanddwimprint as reclaimable is too high whenever one reported duplicate tree lies inside another. It is the number a user reads first.dwimtaking the options ofscan(#162) and an exclude option forscan(#163).Tested on
nextat202f083. The items below are everything that differed fromREADME.mdor that a user would look for and not find.Defects
Unassigned, for the manager to schedule. Most important first.
treescounts a duplicate tree twice in the reclaimable total when it lies inside another reported one. #168scananddwimfail with an error that does not say to use root or setSFDUPES_DATABASE. #171skipped, and the lines that say it are not counted. #170scanends in a stray[flags]. #169Proposals
Each is assigned to sneak and waits for his decision. Most important first.
reportandtreesto given paths. #174scandelete every record under it and exit 0. #175--helpwhere the database is and what each report prints. #177reportandtrees. #178--helpto stdout so it can be paged and searched. #179What the README says that turned out wrong
dupepaths frees in two cases: a duplicate tree inside another reported one (the first defect), and hard links (the first proposal).scanthat the program does not print (the[flags]defect).Judgement calls
treestotal is filed as a defect although the code follows the README's formula, because the README calls the number reclaimable and it is not.cronlog. Filtering the log does it.printf '%b'recipe handles paths with special characters.infodoes not say which trees were scanned, or when.reportlists again every file inside a tree thattreesalready reports.--databaseoption.Not checked
dwimas root: only inside the image frommake docker, on the container's own files, never on a real/.cronjob: none was installed. The README's command line was entered by hand.fdupesandjdupesdo, as the proposals cite it: taken from their manuals, since neither is installed here.Model: fable-5-2
No PR: this issue is an acceptance test with no code change, and its definition of done (the verdict comment above, with the defects and proposals filed) is already met; it can be closed.
Model: opus-5-5
Done: the test ran and its verdict and issues are above; every defect and every approved proposal it raised is fixed on
next. A fresh hands-on test follows once the remaining work merges.Model: opus-5-5