Stop the README saying Windows is unsupported, and check that it cannot again - #339
Merged
Conversation
…ot again `docs/COMPATIBILITY.md` has called Windows supported since T-1124 established #71's containment there by execution. Every README went on saying the opposite five sections later, in four languages, while pointing at that document as the authority. A Windows user read the plugin install path, then `supported`, then `unsupported`. This is the second time. `Alpine and other musl Linux hosts are unsupported` outlived the executed install that made it false and was removed the same way. Both sat in a section the compatibility work was forbidden to edit, and both were found by reading rather than by anything failing -- which is the part worth fixing. So the missing direction is asserted now: for every host the table calls `supported`, no README declares it unsupported. Proved by restoring the bullet and watching it fail, in the language the reader would see it in. The oracle that anchored on that bullet moves with it. `readme.test.ts` mutated `Windows is unsupported` to show an unrelated change does not disturb the guard assertions -- and a `replace` whose needle is gone is a no-op, so it would have kept passing while testing nothing. It anchors on a bullet that exists, and asserts the needle is present before relying on it. `uninstall` also had no documentation anywhere. It shipped in 0.5.0 and the four READMEs never mentioned it. The section states what it removes, and what it deliberately leaves to the commands that own it. Record-Id: r-readmefinal Limit: a mutation oracle anchored on a claim that can become false will silently stop testing when the claim is removed; the needle has to be asserted present Ruled-out: Rewriting the bullet to say Windows is supported | the compatibility document owns the support statement, and a second copy in four READMEs is the duplication the ownership map exists to prevent Ruled-out: Checking only the English README | the contradiction shipped in four languages, and a reader sees one of them Ruled-out: Asserting every host row against every README line | only the `supported` direction is decidable from the table; a host the table calls undecided may honestly be described either way Certainty: firm Blast: local Undo: easy Verified: restoring the Windows bullet fails the new assertion with the offending line quoted, and removing it passes; readme, readme-order, readme-numbers, compatibility-matrix and install-script suites pass at 92; check-readme-numbers exits 0 Unverified: nothing executable changed
CommitLore — record lintTrailers: clean — 3 commits in Active constraints for the paths this PR touchesLimits (46)
Ruled out (103)
Warnings (31)
Trailer violations fail this check. Active constraints are informational — they are what the repository already decided, not a verdict on this PR. |
The README argued the product well and demonstrated it only on its own corpus. A field report from a ~768-commit Swift MCP server gives the thing an argument cannot: a specific moment where a path-scoped query changed what an engineer was about to build. The query returned a merged pull request from two weeks earlier that had already removed eight of the sites he was cataloguing. What it changed was not his task list but his model of the problem -- the surviving sites were not "the coordinate problem", they were the residual after a shipped removal campaign, which is a different engineering problem with a different risk assessment. The line worth quoting is his: none of it was in any chat history; it was in the repository, and he got it by naming a file path. That is the whole product claim, stated by somebody who did not write it. Attributed as one engineer's report, not presented as a benchmark. The numbers that travel with it -- one command, 7.4 seconds for 768 commits -- are his measurements on his machine and are labelled as such. Overstating here would cost the one property this repository has that most tools in the category do not, and which the same report singles out: it prints its own weak numbers next to the feature they belong to. The three properties in the closing list are his framing too: reviewable, owned by the repository, travels with a clone. They are the reason the authority is Git rather than a service, and they read better as consequences of a real session than as bullet points arriving unprompted. Record-Id: r-fieldreport Limit: this section reports one engineer's day on one repository; it is evidence that the mechanism works there, not a measured effect size, and the wording has to keep those apart Ruled-out: Presenting the 7.4s index and 768 commits as product benchmarks | they are one machine's numbers on one corpus, and bench/ is where measured claims live under ADR-0018's provenance rules Ruled-out: Paraphrasing his account in the product's voice | the credibility is that somebody outside the project said it, and paraphrase throws exactly that away Ruled-out: Leading the README with this | the opening claim is the product's own and should stay first; this belongs where a reader who is already interested asks what it looks like in practice Certainty: firm Blast: local Undo: easy Verified: readme, readme-order, readme-numbers, compatibility-matrix and install-script suites pass at 92 across all four languages; check-readme-numbers.mjs exits 0, so the generated block and the stray-statistic rule are both intact Unverified: nothing executable changed
The README argued the product accurately and asked a first-time visitor to read a long way before finding out what it prevents. A conversion review put the gap plainly: this document explains how CommitLore was built, not why a team using coding agents already has the problem. So the hero states the failure first -- an agent proposing a fix the team rejected six months ago, and somebody spending the review explaining a decision that was already made. The precise claim stays, one line down, in bold: an agent must not revive a decision the repository already reversed. Order changed; accuracy did not. Then the scene that makes it concrete. A session reuses `calculatePrice` for admin quotes because the inputs look alike, and the team gains a flag, a wrapper and a compatibility branch guarding a use case the function never owned. With the record present the agent shares the calculation primitives and leaves the policy entrypoint alone. That failure is recognisable to anyone who has reviewed agent-written code; the installer's musl story, which the field report section tells, is true but specific to this project. Four sentences replace three bullets for the comparison, because "which decisions still apply to this code path" only reads as different from RAG when the two sit in the same table. Four use cases replace none: a module boundary, a rejected workaround, temporary compatibility code, a verification gap -- each a sentence a diff cannot carry and a reviewer would otherwise say twice. Two recommendations were not taken. `Keep coding normally` after the install block would be the third time this repository shipped a document ahead of its code. The skill that ships to Claude Code still triggers on explicit CommitLore requests and still teaches the manual harvest path (#340). The sentence becomes true when that lands, not before. Testimonials from three external teams would need three external teams. One engineer's field report exists and is quoted as his; inventing the other two is the one thing that would cost this project the property it has and most tools in the category do not. Record-Id: r-convertreadme Limit: a README claim about the default workflow is only true if the shipped skill performs it, and the skill currently requires the user to name CommitLore first Ruled-out: Adding "Keep coding normally" now | the commit skill still triggers on explicit requests and teaches harvest; shipping the sentence first repeats the doc-ahead-of-code failure this session fixed twice Ruled-out: Writing testimonials to fill the social-proof section | one real field report exists, and fabricated or padded quotes would cost the claim honesty that is this project's strongest asset Ruled-out: Moving the benchmark block and protocol detail out of the README now | the generated block is byte-compared by check-readme-numbers and the guard figures are asserted inside the limitations slice; the move is worth doing and is worth its own change Ruled-out: Dropping "decision authority" everywhere | it is the right term in the architecture sections; it is only the wrong term for a first screen Certainty: firm Blast: local Undo: easy Verified: readme, readme-order, readme-numbers, compatibility-matrix, install-script and manifest suites pass at 116 across four languages; check-readme-numbers exits 0, so the generated block and the stray-statistic rule are intact; the order test's product anchor moves with the heading it names Unverified: whether any of this converts a visitor, which is not measurable from here
MongLong0214
force-pushed
the
docs-readme-final
branch
from
August 1, 2026 00:59
337bd5f to
e12c816
Compare
This was referenced Aug 1, 2026
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Found by an external review of v0.5.0.
The contradiction
docs/COMPATIBILITY.mdhas called Windows supported since T-1124 established #71's containment there by execution. Every README went on saying the opposite five sections later — in four languages — while pointing at that document as the authority.A Windows user read: the plugin install path →
supportedin the compatibility doc →Windows is unsupportedat the end of the same README.It is the second time
Alpine and other musl Linux hosts are unsupportedoutlived the executed install that made it false, and was removed the same way (#324). Both bullets sat in a section the compatibility work was forbidden to edit, and both were found by reading rather than by anything failing.That is the part worth fixing, so the missing direction is asserted:
Proved by restoring the bullet and watching it fail:
The oracle moved with the bullet
readme.test.tsmutatedWindows is unsupportedto show an unrelated change does not disturb the guard assertions. Areplacewhose needle is gone is a no-op, so removing the bullet would have left that oracle passing while testing nothing — the same false-green class this file exists to catch. It anchors on a bullet that exists now, and asserts the needle is present before relying on it.uninstallhad no documentationIt shipped in 0.5.0 and no README mentioned it. Added in all four, stating what it removes and what it deliberately leaves to the commands that own it.
Verification
node scripts/check-readme-numbers.mjs— exit 0