Skip to content

Three translations described a product the English page had stopped describing - #812

Merged
MongLong0214 merged 1 commit into
mainfrom
readme-translation-parity
Aug 20, 2026
Merged

Three translations described a product the English page had stopped describing#812
MongLong0214 merged 1 commit into
mainfrom
readme-translation-parity

Conversation

@MongLong0214

Copy link
Copy Markdown
Owner

Closes #795.

The 2026-08-19 redesign rebuilt README.md and left the three translations on the structure that preceded it — 14 headings against 20, no brand logo, a hero the redesign had already reformatted. A reader following the language links landed on a different document, not a translated one.

The tests did not catch it, and that is the part worth stating. Every suite asserts per-file contracts — install pin, guard figures, exposure table, refs/notes/*, section order — and each translation satisfied its own. Nothing asked whether the four files describe the same product in the same order, so the divergence was invisible to CI while every assertion passed.

All four now agree:

README.md ko ja zh-CN
## headings 14 14 14 14
logo ref 1 1 1 1
hero on one line 1 1 1 1
](docs/COMPATIBILITY.md) 1 1 1 1

Plus the facts the English rewrite restored: the #167 exposure table, the trailers-versus-notes distinction, the host-policy sentence, and guard precision 44.8% / recall 22.0%.

Limit, in the commit: parity is shown here by four counts that happen to agree, not by a test. A parity assertion written in this change would pass by construction — it belongs in its own change where it can be made to fail first.

143 README assertions pass; full suite 3452 passed.

…escribing

The 2026-08-19 redesign rebuilt `README.md` and left `README.ko.md`,
`README.ja.md` and `README.zh-CN.md` on the structure that preceded it. A reader
following the language links landed on a different document, not a translated
one: 14 headings against 20, no brand logo, and a hero image the redesign had
already reformatted.

The tests did not catch it, and that is the part worth stating. Every suite here
asserts per-file contracts -- the install pin, the guard figures, the exposure
table, the `refs/notes/*` distinction, section order -- and each translation
satisfied its own. Nothing asked whether the four files describe the same
product in the same order, so the divergence was invisible to CI while every
assertion passed.

All four now carry the same 14 headings, the same `<!-- README:* -->` markers in
the same order, the animated logo at 440px, the hero on one line with a
translated alt, one `docs/COMPATIBILITY.md` link, and the facts the English
rewrite had restored: the #167 exposure table, the trailers-versus-notes
distinction, the host-policy sentence and the guard precision and recall.

Record-Id: r-readmeparity
Provenance: authored
Certainty: firm
Blast: local
Undo: easy
Ruled-out: retranslating from scratch | the existing Korean, Japanese and Chinese prose is better than a fresh pass would be, and the divergence was structural rather than a translation problem
Ruled-out: a parity assertion in this change | it would be written against the shape this commit just produced, so it would pass by construction rather than by checking; it belongs in its own change where it can be made to fail first
Limit: parity is asserted here by four counts that happen to agree, not by a test. Nothing stops the next English edit from separating them again, which is the same hole this commit is closing and the reason the assertion is worth writing next
Verified: the four files were compared on heading count, logo reference, single-line hero markup and compatibility-link count before and after, and 143 assertions across the six README suites pass. Full suite 3452 passed
CommitLore-Version: 2.0.0
@github-actions

Copy link
Copy Markdown

CommitLore — record lint

Trailers: clean — 1 commit in origin/main..dc89a2ee010d316555adda77ce2001ae4c6bf644
Active constraints: 87 limits · 134 ruled-out · 22 warnings — from 99 records over 3 changed paths

Active constraints for the paths this PR touches

Limits (87)

  • r-readmeparity dc89a2e — parity is asserted here by four counts that happen to agree, not by a test. Nothing stops the next English edit from separating them again, which is the same hole this commit is closing and the reason the assertion is worth writing next
  • r-release120 b073960 — the passive notice only speaks once a check has landed, so the first invocation after this install says nothing however out of date the next release finds it. That is the trade the zero-latency design buys, and the answer arrives on the following command
  • r-rel114 9692b6d — the README restructure and the mobile hero redesign are not in this release, so the four READMEs remain long and the hero's labels remain small at 375px
  • r-oneblock 308be65 — the block moved out of the surface most readers see, so a benchmark number now costs one click to reach
  • r-onepointer a3d3b95 — a reader in the upgrade section now has no inline route to the generation table, only to the command that names the affected repositories
  • r-ssotfive 9cff5ac — the translated sections were written to match the English contract rather than translated from it, so a later edit to one has no mechanical way of reaching the other three
  • r-rel113 17a1301#749 question 1 stays open -- a fix that lives in the hook reaches a repository only on its next visit, and nothing on this machine knows which repositories exist
  • r-koregdrift ca4f99b — nothing checks this -- the rule lives in the PR that established it and in a comment, and the next section written in the wrong register will land the same way these did, from a branch that never touched the file the rule was recorded on
  • r-kohumanize 8e9cb09 — terminology is still doubled in places (path/경로, host/호스트, wiring/배선), and that is translation-consistency work that has to move ja and zh at the same time; one connective comma survives behind bold markers where splitting would make the span cross a sentence
  • r-heromeaning 9c85ad4 — nothing checks that the hero and the payload block below it stay consistent -- the test asserts the inversion is absent, not that the two describe the same record
  • r-protoown cac5cde — the evidence block is the other four-way duplicate and is untouched here -- check-readme-numbers.mjs still owns it in all four READMEs, and moving it is its own change with its own negative control
  • r-heroalt22 19969c7 — the two contracts are still enforced in separate files, so nothing fails if one of them is deleted -- the note is what connects them, and a note is weaker than a check
  • r-onevisual 5833281 — at 375px the README embeds at width="100%", so the 840px canvas scales by 0.446 and the 18px labels land near 8px -- better than the 1200px canvas it replaces (7.5px) and still under the 12px a caption usually needs; three columns and this copy do not fit under a 700px canvas, so the canvas question is unresolved rather than answered
  • r-rel112 ad6fee3 — the readback confirms the link, not that the interpreter behind it runs -- doctor remains the check for that
  • r-rel112 ad6fee3 — this repairs the installer; a machine already upgraded to 1.1.0 or 1.1.1 keeps its stale current until the installer is re-run, which is why the note names the command to check
  • r-readmewin111 b396de9 — the claim is Codex, Gemini CLI and Hermes on one machine at 1.1.1 -- claude-code is still notDetected there with its config present, and the READMEs do not promise otherwise
  • r-rel111 8c29f5d — Hermes still fails on that machine for a cause that is not this one and is not yet named (Windows: every detected host fails to wire — the temp filename carries the whole path, and hasCommand cannot see a .cmd #716)
  • r-rel111 8c29f5d — a zero-byte .cursor/mcp.json on the tester's machine is a user file; the installer read the file it says it reads and reported the true reason
  • r-rel111why 8c29f5d — this changes the note, not the behaviour -- the behaviour shipped in the merged branch and is already covered by artifact:verify
  • r-rel110 d9a041f — this release does not make host wiring work on Windows -- detection still cannot see a .cmd and spawn still cannot run one (Windows: every detected host fails to wire — the temp filename carries the whole path, and hasCommand cannot see a .cmd #716)
  • r-rel110 d9a041f — 1.0.0 through 1.0.2 have no CHANGELOG entries; a pointer to the releases page stands in rather than reconstructing them
  • r-rellock110 d9a041f — nineteen version surfaces was already wrong before this -- the lockfile makes it twenty-one, and the count is only ever known after the gate says so
  • r-relmanifest110 d9a041f — this is the release commit's own repair, not a fix -- the next release will need the same regeneration for the same reason
  • r-rel102 25c11ed — an installer-boundary fix reaches nobody until it is released
  • r-rel101 b65e34f — a distribution-boundary fix reaches nobody until it is released
  • r-680ver 47359a1 — an assertion that reads the source it checks proves nothing
  • r-rel100 47359a1 — a published install URL must resolve the moment it is published
  • r-rel0820 59c6730 — release versions must agree across manifests, lockfile roots, installer pins, and the runtime CLI
  • r-pretag01 86e0153registers_commitlore reads the key, so a config that registers under a different key -- a host with its own naming -- still reads as unregistered and is wired again
  • r-staleclaim1 59cb5d9 — withholding uses the same pattern table as every other route, so a payload that trips nothing still passes; this closes a route that had no grading at all, not the heuristic behind it
  • r-release081 ffe702a — the capture half reaches a host that surfaces MCP instructions; one that ignores that field still needs --agents-md, and nothing detects which kind a host is
  • r-saywhat01 56444db — entailment is still unchecked, and this narrows the claim rather than closing the gap -- the protection remains that no drafted record is ever delivered as a directive
  • r-winstall1 0b4e551 — this pins what the repository says about itself, and cannot check that the tag it names has been published -- the install gate does that, after the tag exists
  • r-authdir01 ae2a66f — in the default mode a directive establishes that the commit's author string matched a configured one, and nothing about who produced the commit
  • r-authdir01 ae2a66f — in signature mode a verified signature establishes that a key the verifier trusts signed this commit -- not that its holder has authority over this repository, and not that the record's content is true or safe
  • r-codexplug e5fe95a — a plugin can put a skill in front of a session; it cannot make the session follow it, and nothing here reports whether one did
  • r-readme001 7f82d47 — the README still cannot tell a reader whether their particular host will follow a written procedure; only the hosts with a plugin or an installer have that answered by a mechanism rather than by hope
  • r-readmeorder 383f77d — the hook leads with the headline number, so a reader who stops there has the effect without the conditions on it; the section naming those conditions is now two screens up rather than at the end, which is a shorter path than before but still a path
  • r-m5sources b910dba — the seven shards are declared individually, so a shard added later is invisible to this block until someone lists it -- which is the property the declaration was built for and the cost that comes with it
  • r-rel071 af8e0ab — 0.7.0 stays published with its notes amended to name the defect at the top; retracting a tag people may already have installed trades a known-bad version for an unknown one
  • r-rel070 d4a4d8b — the README's behaviour claim now rests on M5 while the generated numbers block beneath it still publishes M4, which is The README's generated numbers block still publishes M4; M5 measured the thing the README leads with #480 rather than a release-time edit
  • r-claimsmatch 506ada4 — this fixes the sentences an external reviewer found; no systematic pass was made over every claim in the four files against every published measurement
  • r-priorart 507ae24 — the comparison is against Lore's README and its abstract; the full paper was not read, so a lifecycle described only in the PDF would have been missed
  • r-scaleproof 4c093f2 — the 100,000-commit figures come from a synthetic repository built by the deterministic harness, not from a real codebase of that size, so they describe the index's shape rather than any particular project
  • r-extbaseline 064daf6 — the band is four Python repositories chosen for having enough revert history to backfill from, so it is evidence about large long-lived Python projects rather than about repositories in general
  • r-surfacedeliv fae9e1e — every figure in the table is measured on this repository measuring itself, which is the weakest part of the evidence and is stated in the paragraph rather than left for a reader to discover
  • r-rel060 e999b9d — the install one-liner in all four READMEs now points at a tag that does not exist until this is tagged, so the window between merging to main and pushing v0.6.0 is one where the documented install is broken
  • r-pipesplit b4fa571 — test/dogfood.test.ts validates every record in this history, so a new violation class is only available if it rejects none of the 620 Ruled-out: values already written
  • r-readmesplit344 7314a03 — three checks bind content to a position in the README, so the complete record example, the protocol vocabulary table and the generated benchmark block could not move
  • r-failopen abc54ea — with the gate installed and no CLI resolvable, commits are still refused -- that is the one hook holding a verdict back, and this change does not reach it
  • r-heropolish f6144bc — README.ko.md still switches from 존댓말 to 해라체 below the hero; that split is older than this change and belongs to the restructure in README still carries the reference manual it should be linking to #344
  • r-pluginpath353 e364f3a — a plugin manifest has no way to add anything to PATH, so no plugin-side change can make the documented commands resolve
  • r-realoutput f9efea0 — a README block introduced as what the tool prints is a behavioural claim, and inventing its shape is the same defect as inventing a number
  • r-release051 19810d2 — the hook is written at install time, so no release repairs a repository that already has one; every release touching hook behaviour has to restate what does
  • r-heroinherit 89b13ac — a headline that implies detection commits the product to guard's numbers, and guard is an advisory measured at 22% recall
  • r-convertreadme e12c816 — 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
  • r-fieldreport 753f4e7 — 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
  • r-readmefinal 40aeae0 — 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
  • r-release050 ad402c7 — the hook is written at install time, so a corrected release never reaches a repository that already has one; every release fixing hook behaviour has to say what repairs an existing install
  • r-compat1122 e7d8516 — a non-empty guard does not detect deletion; each table's row keys have to be asserted as a set or the statement can silently shrink to one row
  • r-compat1122 e7d8516 — substring comparison hides a narrowing -- ./ is inside ../ and Edit|Write is inside Edit|Write|MultiEdit|NotebookEdit -- so cells are compared as their rendered form
  • r-compat1122 e7d8516 — a sentinel containing \0 makes git treat the file as binary, which costs it diff, blame and log -p permanently
  • r-compat1122 e7d8516 — the plugin path needs bash, because scripts/commitlore-run.sh carries a #!/bin/bash shebang, and no install script checks for it
  • r-muslbullet1126 04ac181 — this ticket owns four bullets and not the tests that read the section around them, so a check that breaks here means a region was taken that was not allocated
  • r-t1120nodeinst 14deeb4 — git and node are hard prerequisites now, so a host without them installs nothing and says which one is missing
  • r-gateb3rev a2e38b9 — the shipped install.sh downloads a platform asset, so no document may describe it as Node-only until the installer itself changes
  • r-rel041notes 71efe1f — 0.4.1 makes the installer honest about a verification it cannot complete rather than fixing the kill, so an upgrading user may still see the unverified message instead of a version
  • r-rel040pins b76c40b — the pin names a tag that does not exist until the tag is pushed; between this merge and that push the documented command refers forward
  • r-t1016svg 321c6f1 — byte-exactness is verified on this platform; a different platform's Node could in principle render differently, and nothing here proves it does not
  • r-t1021known 8dfffc1 — the figures are measured against one archived 417-decision corpus, which is deliberately hard and is not deployment prevalence
  • r-pin030readme 504b54e — install.sh must already support tag-based download for the one-liner to work; verified that the URL resolves to a tagged tree
  • r-hero172a bc0d971 — Stale-exposure benchmark is one corpus, one query, and one pinned embedding model at a fixed two-record budget
  • r-be140cost 8c01bd5 — no per-turn provider token ledger or observed avoided-work cost exists yet
  • r-readme129 ab5f210 — the break-even rests on tokens estimated from bytes at the product's own four-characters-per-token constant, so it moves with that assumption
  • r-m4basis 5e2d2cb — the guard question stays unanswered until the exposure instrument is verified and M4 is rerun on it
  • r-m4withdraw e5f9b73 — the guard question is now unanswered rather than answered null
  • r-readmeux1 b664205 — interactive record building does not exist, so the honest answer is still "an agent writes it or you do"
  • r-expomerge1 d6ad014 — M4's existing rows have no exposure field and must read as unknown, not as not-exposed — backfilling by inference would erase the finding
  • r-rdme96a 9c9371c — scripts/check-readme-numbers.mjs's withdrawal-notice and stray-statistic checks constrain what can appear outside the (absent, here) generated benchmark block — re-checked after every edit, not just at the end
  • r-relinstall c6e1d04 — never tested against the real GitHub release infrastructure (no release exists yet — that is the owner's action) — verified against a locally built SEA binary, a hand-made SHA256SUMS, and a local HTTP server standing in for GitHub's release-asset redirects, which is everything this repository lets a change verify before a tag exists.
  • r-fix70a1 d707fc7 — one encoding layer and explicit lexical forms in the four published languages; semantic paraphrases, nested encodings, and split payloads remain outside coverage
  • r-shallow66 60a8659 — a depth-1 clone can only inspect its reachable commit history
  • r-7a3e91 cf859e4 — better-sqlite3 stays external because it is native — the bundle degrades to --no-index without it, which only works because r-6f2a08 made that load lazy first
  • r-6e1a72 5e09846npx commitlore is the first thing a reader will try, and it fails until the package is published
  • r-9d31b7 4ac6e30 — the example lives in four translated files, so any fix that is not mechanically enforced will drift again on the next edit
  • r-c0f4e2 3d249cd — npm gitlore is held by an active same-domain CLI, so the owner's first-choice name was not available
  • r-a8f3c1 ef48843 — Rename must land before any code exists -- after 27 tickets it would touch spec, fixtures, index, hooks and every doc

Ruled out (134)

  • r-readmeparity dc89a2e — retranslating from scratch | the existing Korean, Japanese and Chinese prose is better than a fresh pass would be, and the divergence was structural rather than a translation problem
  • r-readmeparity dc89a2e — a parity assertion in this change | it would be written against the shape this commit just produced, so it would pass by construction rather than by checking; it belongs in its own change where it can be made to fail first
  • r-readmewin111 b396de9 — leave the row and add a Windows-only footnote | the row is what a reader checks first, and a footnote does not repair a sentence that reads as exclusion
  • r-rel111 8c29f5d — claim Windows host wiring works | two of the four detected hosts wire, and a release note that rounds that up is the false green this release exists to remove
  • r-rel110 d9a041f — fold the second Windows cause into this release | it arrived as Fix Windows host resolution and batch spawning (#716) #720 with real Windows evidence and needs its own judgement, and holding this back would make the note about what is still broken false in both directions
  • r-rellock110 d9a041f — replace the version string throughout the lockfile | it matches four dependencies that are really at 1.0.2, and nothing in the suite would have caught it
  • r-signer597 3dc75e7 — signer email or author header matching | either is commit-controlled metadata and does not bind the verified key to repository authority
  • r-rel0820 59c6730 — rebuild dist | the CLI reads package.json at runtime and a rebuild changes the bundle digest without changing behaviour
  • r-authdir01 ae2a66f — requiring signatures by default | it would demote every existing repository's records for a risk this project is not currently exposed to, and a silent capability removal on upgrade is its own kind of dishonesty
  • r-authdir01 ae2a66f — deleting the directive tier to make the claims true | the tier is how a record says it is a constraint, and removing it would resolve the wording by removing the feature
  • r-relfix01 96102b4 — keeping "floor, measured" and footnoting it | the sentence is the claim a reader takes away, and a footnote that contradicts it is worse than either alone
  • r-readme001 7f82d47 — deleting the evidence and audit material to shorten the page | the willingness to publish unflattering results is the asset, and shortening by removing it would trade the strongest thing here for a faster read
  • r-readmeorder 383f77d — cutting the positioning prose rather than moving it | it answers the second question a reader has, and a document that only shows the example leaves them without the frame for it
  • r-readmeorder 383f77d — keeping "Known limitations" as the heading to avoid touching the test | the heading is the reason the section went unread, and a test that pins a name is meant to keep the disclosure honest rather than to keep the name
  • r-m5sources b910dba — globbing bench/results for m5-*.jsonl | the file next to them is a withdrawn design log, and a glob is how the wrong dataset gets published without anyone deciding to
  • r-m5sources b910dba — reporting only the 1,160 and dropping the row count | the rows are on disk and a reader who counts them would find the block understating; naming both and the reason is what makes either checkable
  • r-rel071 af8e0ab — deleting the v0.7.0 tag and re-cutting it | rewriting a published ref breaks every clone that already fetched it, and the release notes can carry the truth without that
  • r-rel071 af8e0ab — reading the flag with a nullish check and documenting the commander default | the documentation would sit in this file while the defect sits in every install, which is the arrangement that produced this
  • r-rel070 d4a4d8b — bumping the manifests first and the README pins after | the readme suite pins them to package.json, so the intermediate commit is one where CI is red and the documented install is wrong
  • r-rel070 d4a4d8b — rebuilding dist for the version change | the version is read at runtime, and a rebuild would move the digest every M5 row records without changing a byte of behaviour
  • r-claimsmatch 506ada4 — Softening the delivery paragraph instead | it is the accurate one, and the scene was the sentence out of step with it
  • r-claimsmatch 506ada4 — Deleting the pricing scene | it is the clearest illustration in the README of what a record contains, and the defect was its last sentence rather than the scene
  • r-priorart 507ae24 — Saying nothing | the survey found it in an afternoon and anyone evaluating this project will
  • r-priorart 507ae24 — Framing it as convergent design | it may well be, but "we arrived independently" is unfalsifiable and asks for exactly the trust this project argues should not be extended to unverifiable claims
  • r-priorart 507ae24 — A feature-by-feature comparison table | Lore is a design paper with a small implementation, and scoring it against a shipped tool would be unfair and would read as defensive
  • r-scaleproof 4c093f2 — Quoting only the 496 ms | it is one arm of a run whose other arm is 86,673 ms, and a reader who found that later would be right to distrust the first number
  • r-scaleproof 4c093f2 — A latency table | three figures do not need one, and the README just had its reference material moved into docs/
  • r-extbaseline 064daf6 — Quoting the 100.0% delivery figure | it is the value the attachment predicate forces on one-line backfilled records, not a retrieval result, and on a README it would read as the opposite
  • r-extbaseline 064daf6 — Leading with the external band instead of our own 81.7% | the external corpus has no real records in it, so it cannot carry the claim the delivery number makes
  • r-surfacedeliv fae9e1e — Leading with the token figures | 511,412 against 673,134 is the smaller half of the result, and a token-reduction headline is the claim this market makes without a harness behind it
  • r-surfacedeliv fae9e1e — Citing the resolve-rate numbers from the same table | they were not extracted from the PDF in this session, and the paper's own sentence carries the argument without them
  • r-rel060 e999b9d — 0.5.2 | three observable behaviour changes and one narrowed acceptance rule are not a patch, and an upgrader reading the number would not go looking
  • r-rel060 e999b9d — Publishing the delivery figure in the README | the measurement is one corpus and one repository, and the README already carries more numbers than a first-time reader can weigh; docs/evidence.md and bench/ hold it
  • r-pipesplit b4fa571 — Splitting on the last pipe instead of the first | this repository's own records refute the premise that reasons rarely contain a pipe: two of the three multi-pipe values carry it in the reason, so the change would break two correct records to fix one
  • r-pipesplit b4fa571 — Defining a backslash escape for the separator | that is a new grammar rather than a clarification -- parser, renderer and validator would all have to agree on unescaping, and it changes what a conforming record looks like, which needs sign-off this fix does not have
  • r-pipesplit b4fa571 — Making any value with more than one pipe a format violation | it invalidates 616005d and aa68a9a, whose extra pipe sits in the reason and whose split is already correct, and dogfood validates all of history
  • r-pipesplit b4fa571 — Having guard score both the first-pipe and last-pipe splits and keep the better one | it invents an alternative no author wrote and then reports it as recorded, which puts the silent wrong answer in a new place instead of removing it
  • r-pipesplit b4fa571 — Rendering every Ruled-out: value pre-split in the query output | it rewrites 620 lines of output to mark 3, and the annotation is only information where the split is actually in doubt
  • r-pipesplit b4fa571 — Warning on the code-span case rather than refusing it | a span that crosses the separator is provable rather than suspected, and this repository refuses what it can prove instead of hoping the author reads stderr
  • r-readmesplit344 7314a03 — Moving the complete record example to docs/protocol.md as the issue asks | spec/verify.sh compares the last fenced text block in every README byte for byte with spec/fixtures/valid/11-readme-example.txt and has no second location to read
  • r-readmesplit344 7314a03 — Moving the vocabulary table to spec/SPEC.md | spec/schema/readme-vocab-check.mjs requires every SPEC section 3 key to appear in a table row of each README, so removing the table reports all of them as missing
  • r-readmesplit344 7314a03 — Moving the benchmark block to docs/evidence.md | scripts/check-readme-numbers.mjs regenerates and byte-compares it in README.md and test/readme-numbers.test.ts asserts the marker in all four, so a moved block is an absent block
  • r-readmesplit344 7314a03 — Loosening any of those three so the issue's table could be followed literally | they are the honesty guarantees the document is trusted for, and a restructure that weakens them buys length with credibility
  • r-readmesplit344 7314a03 — Adding docs/COMPATIBILITY.md to the new documentation index | test/compatibility-matrix.test.ts pins each README to exactly one pointer, and a second link would have failed it
  • r-failopen abc54ea — A third replaceAll turning exit 1 into exit 0 | it rewrites any future exit 1 added to the shared body too, which is how these two acquired this ending in the first place
  • r-failopen abc54ea — Adding hooks uninstall --all and leaving the default alone | the hooks left behind are the reported defect, so a default that still leaves them documents the trap instead of removing it
  • r-failopen abc54ea — Having the two hooks say nothing at all | a hook that captured no record and reported nothing is the silent-success shape doctor's own fix breaks git fetch and git pull, then reports ok #63 and inject --hook-input is byte-identical on malformed input and on no-records: silent fail-open #67 were, and the state it hides is one command away from being fixed
  • r-heropolish f6144bc — Hero nav links to install, demo and how-it-works | there is no install heading to anchor against, and minting one is a restructure, not a copy change
  • r-heropolish f6144bc — Moving the pain line back out of the demo | it was tried as the hero and moved here on purpose, and readme-order.test.ts records why
  • r-pluginpath353 e364f3a — Wiring scripts/commitlore-bootstrap.sh into the plugin | it npm installs an unclaimed registry name into the plugin data directory, which was closed as a supply-chain hole, and re-arming it to make a README sentence true trades a documentation defect for an execution one
  • r-pluginpath353 e364f3a — Adding a bin entry to package.json | the package is private and publishes nothing, so the entry would name an install path no user can take
  • r-pluginpath353 e364f3a — Rewriting the later sections to drop the bare commitlore form | three skills and both quickstart blocks use it, the CLI is real for anyone who ran the installer, and rewriting a correct command is a larger edit than naming its source once
  • r-realoutput f9efea0 — Keeping the invented labels and marking the block an illustration | it was introduced as what the agent receives, and a reader has no way to tell an illustration from a transcript once the framing says receives
  • r-realoutput f9efea0 — Fixing hooks uninstall to remove all three instead | that is a behaviour change with its own failure modes -- the two remaining hooks fail closed -- and it belongs in a ticket rather than beside a documentation correction
  • r-release051 19810d2 — Waiting for 0.5.2 to carry index ingests any key: value line as a trailer; doctor reports 106 records where git has 0, and context serves commit subjects to the agent #335 | false decision context reaching an agent is the inversion of the product claim, and a stable release should not hold it
  • r-release051 19810d2 — 0.6.0 | no command is added and nothing breaks; calling it minor would hide a correctness fix behind a feature number
  • r-release051 19810d2 — Filtering Verified: because a report listed it as noise | it is vocabulary, and separating a release-note use from a record use needs a guess that can discard real records
  • r-heroinherit 89b13ac — Keeping "Stop re-reviewing the same bad idea" as the hero | it names a verdict on ideas rather than a lifecycle on decisions, and any review tool could carry it
  • r-heroinherit 89b13ac — "Never let agents make the same mistake twice" | guard cannot support a never, and the sentence sells detection this product does not perform
  • r-heroinherit 89b13ac — Leading with "decision authority" alone | precise in the architecture sections, and not a phrase a first-time reader converts on
  • r-convertreadme e12c816 — 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
  • r-convertreadme e12c816 — 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
  • r-convertreadme e12c816 — 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
  • r-convertreadme e12c816 — Dropping "decision authority" everywhere | it is the right term in the architecture sections; it is only the wrong term for a first screen
  • r-fieldreport 753f4e7 — 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
  • r-fieldreport 753f4e7 — Paraphrasing his account in the product's voice | the credibility is that somebody outside the project said it, and paraphrase throws exactly that away
  • r-fieldreport 753f4e7 — 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
  • r-readmefinal 40aeae0 — 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
  • r-readmefinal 40aeae0 — Checking only the English README | the contradiction shipped in four languages, and a reader sees one of them
  • r-readmefinal 40aeae0 — 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
  • r-release050 ad402c7 — 0.4.2 | a new command and a platform support claim are not a patch, and calling them one hides both from anyone reading version numbers to decide whether to upgrade
  • r-release050 ad402c7 — 1.0.0 | nothing here breaks an existing install, and the milestone that closed is Gate B rather than a stability commitment
  • r-release050 ad402c7 — Describing Windows as supported without the caveat | the word is the one most likely to be read as more than it is, and the release that earns it is the right place to bound it
  • r-compat1122 e7d8516 — Carrying the README's musl reason into the matrix | it cites glibc-only binaries, and there are no binaries; repeating it would document a mechanism that no longer exists
  • r-compat1122 e7d8516 — Reading the gate's removal as musl support | absence of a check is not evidence of working, which is why it was executed on two architectures instead
  • r-compat1122 e7d8516 — Claiming musl as a class from one image | alpine:3.21 is what ran, so other musl distributions are undecided rather than promised
  • r-compat1122 e7d8516 — One prerequisite column covering both install paths | the plugin path checks nothing, so a shared column would imply an enforcement a user does not get
  • r-compat1122 e7d8516 — Asserting the documented install command as its own string | it is <plugin>@<marketplace>, so deriving it from the two manifests makes a rename of either fail here
  • r-muslbullet1126 04ac181 — Replacing the bullet with "musl is supported" | T-1122 owns the compatibility statement, and a second summary in the README is the duplication the ownership map exists to prevent
  • r-muslbullet1126 04ac181 — Removing the Windows bullet beside it | it is still true, test/readme.test.ts uses its exact wording as a mutation oracle, and T-1124 owns that claim
  • r-muslbullet1126 04ac181 — Folding this into T-1122's pull request | that ticket's forbidden scope is one pointer line per README and nothing else; widening it to fix an adjacent owner's debris is how single-writer discipline decays
  • r-muslbullet1126 04ac181 — Merging T-1122 first and cleaning up afterwards | two ordinary merges are not transactional, and the window where dev contradicts itself has no upper bound
  • r-t1120nodeinst 14deeb4 — Hardcoding the release version in install.sh as the default | it would add a bump obligation to every release and a stale default between a tag and the bump; git ls-remote resolves the newest tag with no API token and no rate limit
  • r-t1120nodeinst 14deeb4 — Defaulting to a branch when no tag is given | installing a moving target is what pinning exists to prevent, and the release gate already forbids a dev-referencing one-liner
  • r-t1120nodeinst 14deeb4 — Writing the wrapper with cp over the destination | an in-place overwrite of a file that may be executing is the defect that forced a same-day patch release; the wrapper is written beside the target and renamed
  • r-t1120nodeinst 14deeb4 — Letting post-install verification decide the exit code | that was the other half of the same defect, where a killed --version became the installer's exit status; verification now retries once and reports, and an install that succeeded exits 0
  • r-t1120nodeinst 14deeb4 — Editing the shell profile when the wrapper directory is not on PATH | an active record on this file rejects it, and printing the line is what this script does about PATH
  • r-t1120nodeinst 14deeb4 — A test-only environment hook to force a verification failure | a source repository whose bundle exits non-zero is a real broken release and needs no seam in shipped code
  • r-t1120nodeinst 14deeb4 — Checking for git with command -v alone | a git that cannot execute is as useless here as a missing one, so the check runs git --version and catches both
  • r-gateb3rev a2e38b9 — Keeping the compiled binary as an optional extra alongside the Node path | the entire platform surface exists because of that one artifact, so optional keeps the release matrix, the per-target checksums, the binary-versus-script classification and the target compatibility matrix
  • r-gateb3rev a2e38b9 — Deleting ADR-0015 instead of marking it superseded | ADR-0011 links to it, and a record that vanishes leaves a broken reference and hides that the decision was ever made
  • r-gateb3rev a2e38b9 — Rewriting the README shell install instructions in this change | the shipped installer still downloads a platform asset, so the rewrite would describe behaviour the code does not have
  • r-gateb3rev a2e38b9 — Leading the install documentation with the shell one-liner and mentioning the plugin second | for a Claude Code user the plugin is one step that also registers MCP, the pre-edit hook and the skills, so leading with a CLI-only script hides the shorter path and leaves the agent surfaces unwired
  • r-gateb3rev a2e38b9 — Adding placeholder Gate B rows for the re-planned distribution work | an acceptance row with no approved ticket is the dangling authority the Gate A matrix was written to stop
  • r-gateb3rev a2e38b9 — Removing the compiled-binary code in this change | a scope reversal and a code removal are different reviews, and combining them lets the removal skip its own
  • r-rel041notes 71efe1f — folding this into the next feature release | the documented install is broken for upgraders now, and every day it stays tagged is a day the one-liner in the README fails for them
  • r-rel041notes 71efe1f — moving the v0.4.0 tag to the fixed commit | a tag users may already have fetched must not change under them; the fix gets its own version
  • r-rel040pins b76c40b — pinning after the tag exists so the reference is never briefly dangling | the notes, the version and the pin have to land together or the release is internally inconsistent at the moment it is cut, and the tag follows within the same promotion
  • r-t1016svg 321c6f1 — a terminal recorder dependency | the artifact would then depend on a tool's output format, and reproducing it would mean reproducing that tool's version
  • r-t1016svg 321c6f1 — a frame manifest with tolerance instead of byte comparison | a check that tolerates drift stops detecting the drift it exists to detect
  • r-t1021known 8dfffc1 — stating precision alone | precision without recall reads as a quality score and hides the failure mode that matters, which is silence
  • r-t1021known 8dfffc1 — publishing the point estimates without the Wilson interval | a figure without its interval is the defect this project removed from the README twice already
  • r-pin030readme 504b54e — referencing main instead of a tag | main is also mutable and does not name a reviewed release
  • r-pin030readme 504b54e — leaving the pin at v0.2.0 until the next release | v0.3.0 is tagged and published; the mismatch with package.json is a documentation defect now, not a timing issue
  • r-be140cost 8c01bd5 — retaining a modelled break-even figure | a ratio inherits its weakest input, and the denominator is assumed rather than observed
  • r-readme129 ab5f210 — writing that CommitLore saves tokens | the cost is measured and the threshold is arithmetic, but nothing here shows the guard clears it, and that gap is the whole reason the section states three things instead of one
  • r-m4basis 5e2d2cb — keeping the non-delivery wording as a hedged claim | it asserts something I never established, and a verdict that overstates its own evidence is the defect this repository exists to catch
  • r-m4withdraw e5f9b73 — retracting the dataset or calling M4 invalid | the data is valid and its provenance is clean; what it measured was not the treatment, and those are different words
  • r-readmeux1 b664205 — describing harvest as automatic record creation | it drafts from a transcript and a human still commits, and claiming otherwise is the overreach this project keeps closing issues about
  • r-m4docs1 32d5bf1 — keeping the withdrawal notice and only landing the verdict document | bench/report.ts already draws this line -- a provenanced dataset that still shows a withdrawal is a hard failure in check-readme-numbers.mjs (checked here), not a style choice left open
  • r-rel0200a a074754 — bumping ci.yml's "v0.1.0 was published with zero attached assets" comments | those describe a historical fact about the actual v0.1.0 release, not a version this project declares; the check they document (releases/latest/download/SHA256SUMS returning 200) is written to start exercising the real path automatically the day any release ships assets, v0.2.0 included, with no workflow edit
  • r-rel0200a a074754 — touching docs/adr/ADR-0001-scope-v010.md, docs/tickets/release.md, bench/VERDICT-M1.md, HANDOFF.md, bench/ROUTE-GAP.md | planning and historical-record prose that names v0.1.0 as a past decision or measurement subject, not a live version carrier
  • r-rel0200a a074754 — changing test/mcp.test.ts's CommitLore-Version: 0.1.0 fixture trailer | that's protocol-version content inside a synthetic seed commit (what an old commit's trailer looked like), unrelated to and never asserted against package.json's version
  • r-rdme96a 9c9371c — dropping the git-clone / source-build paths from the top entirely | install.sh is the fast path, not a universal one (no Windows binary yet, per ADR-0015) — the detailed section has to stay reachable, just not first
  • r-relinstall c6e1d04 — guessing the current version to build the asset URL directly | would need either the GitHub API (rate-limited, needs no-auth headers handled correctly) or trusting a redirect's final Location header parsing. Downloading the fixed-URL SHA256SUMS first and reading the real asset name back out of it needs neither and is what the checksum step has to fetch anyway.
  • r-relinstall c6e1d04local for scoping — not POSIX per se, but supported by dash, bash, and every shell this script is realistically piped into (verified directly, see Verified) | not used in the end; the script has few enough variables that scoping was not needed, only noted here because it was considered.
  • r-fix70a1 d707fc7 — exhaustive per-language phrase enumeration | unbounded phrase lists cannot provide semantic coverage, so this fix documents a bounded lexical policy and independent corpus
  • r-6f92c4 3cebb89 — restating the withdrawn numbers as prose ("we measured a reduction") | it is the same claim with the evidence removed
  • r-6f92c4 3cebb89 — leading with the protocol's features and putting the measurement record near the bottom | that is the arrangement of someone hoping it is not read
  • r-2b58d4 4842356 — exempting datasets written before the fields existed | it is one line and it deletes the guarantee
  • r-6b83f2 4c1a503 — deleting both sentences | the clone-runs-without-installing claim is true for validate, context, guard and the MCP server, and dropping it would understate what a clone gives you as badly as the old text overstated it
  • r-7a3e91 cf859e4 — inlining spec/SPEC.md and the schema into the bundle | SPEC.md would need a codegen step that itself needs a drift guard, and the package-root walk removes the reason to want it
  • r-7a3e91 cf859e4 — replacing the tsc output with the bundle | test/cli.test.ts, test/hooks.test.ts and test/mcp.test.ts import dist internals by path
  • r-c53d19 110be8c — leaving the claim and letting T-706 · Bundle the CLI as a single file — run from a clone alone #38 make it true later | the README is what someone reads while deciding to adopt this, and a claim that is false today does not become honest because it is scheduled
  • r-0d4b81 8005227 — a longer quickstart that demonstrates context, limits, ruled-out, warnings and stale | an agent calls those itself once the MCP server is registered, so listing them teaches the human a workflow that is not theirs
  • r-6e1a72 5e09846 — leave the banner until release | it understates for weeks and readers leave rather than build from source
  • r-6e1a72 5e09846 — update English only and translate later | the lag is itself a wrong answer for whoever reads the other three
  • r-9d31b7 4ac6e30 — fix the values and move on | the same drift already happened once through a rename, and prose review did not catch it either time
  • r-9d31b7 4ac6e30 — parse the README at runtime in the CLI | the check belongs in the conformance suite, not in shipped code
  • r-c0f4e2 3d249cd — GitLore published as git-lore | the binary and search results still collide with the existing gitlore tool
  • r-c0f4e2 3d249cd — keep Annals | the sound problem does not decay, and with code near zero this is the cheapest moment the project will ever have
  • r-c0f4e2 3d249cd — rename code and spec first, documents later | the drift window makes every artifact written in it wrong
  • r-a8f3c1 ef48843 — keep name, change vocabulary only | vocabulary is the protocol, so half the change leaves the substance untouched
  • r-a8f3c1 ef48843 — drop Certainty as a dead field | a real route exists -- stale sweep prioritizes guess-level records for review

Warnings (22)

  • r-readmeorder 383f77d (claim) — the pinned heading now differs per language and lives in a regex, so a translation that rewords it fails the suite rather than silently dropping the disclosure -- intended, and it will read as a naming failure rather than a coverage one
  • r-m5sources b910dba (claim) — the generator's supersession key is task, condition and seed, which is M5's cell shape; a study whose cell is keyed differently would silently collapse rows that are not duplicates
  • r-rel071 af8e0ab (claim) — any option declared with a non-nullish default has the same shape, and nothing checks for it -- this fix repairs one site, not the class
  • r-rel070 d4a4d8b (claim) — between the promotion merge and the tag push, every README install one-liner points at a tag that does not exist -- tag promptly and confirm the URL rather than assuming
  • r-t1120nodeinst 14deeb4 (claim) — keep install.sh ASCII only -- a non-ASCII character in a string silently terminated /bin/sh here while sh -n accepted the file
  • r-gateb3rev a2e38b9 (claim) — two files carry Security: commitlore.bin and COMMITLORE_BIN are executed, and the env path lacks the guard the config path has #71 install-root containment -- removing the binary arm must preserve that property for the wrapper case rather than delete the check with it
  • r-hero172a bc0d971 (claim) — BM25 recall is 0/2 beyond zero distractors; do not state it is 1/2 throughout
  • r-be140cost 8c01bd5 (claim) — do not restore a break-even figure without both measurements
  • r-rel0200a a074754 (claim) — scripts/commitlore-bootstrap.sh is orphaned -- no hooks.json entry invokes it, and its npm-install strategy contradicts ADR-0011. It still carries a live version default, now bumped for consistency, but nothing exercises it. Worth a follow-up issue: either wire it up correctly or delete it.
  • r-fix70a1 d707fc7 (claim) — add malicious and benign fixtures together when extending scanner patterns; false positives can make the defence unusable
  • r-shallow66 60a8659 (claim) — shallow history remains advisory; query and guard exit-code semantics are unchanged
  • r-6f92c4 3cebb89 (claim) — with no numbers, the first-impression case now rests entirely on the test links. If M3-b also comes back null, this framing is what the project has
  • r-2b58d4 4842356 (claim) — this leaves the README with no measured numbers at all until M3-b runs. That is the honest state and it is also a worse first impression. The alternative was publishing numbers produced by a binary nobody recorded
  • r-6b83f2 4c1a503 (claim) — the second claim will become true when ADR-0012 lands and false again if the notes refspec story changes. A README sentence about distribution needs a test, and there is none — scripts/check-readme-numbers.mjs checks numbers
  • r-7a3e91 cf859e4 (claim) — hardcoding ../ counts back to the package root is what broke this — new code reads assets through installedPath(), never through import.meta.url
  • r-c53d19 110be8c (claim) — r-6f2a08's message says the clone gap closes with B-09 · Single static binary — remove the Node runtime dependency #39; it closes with T-706 · Bundle the CLI as a single file — run from a clone alone #38. The commit message is history and stays as written
  • r-0d4b81 8005227 (claim)claude mcp add commitlore -- commitlore mcp is Claude Code's syntax — other MCP clients register a stdio server their own way
  • r-6e1a72 5e09846 (claim) — the moment v0.1.0 is published this banner is wrong again -- it names npx not working, which release makes false
  • r-9d31b7 4ac6e30 (claim) — the four READMEs must keep the example block byte-identical -- translating the code block will fail spec/verify.sh
  • r-c0f4e2 3d249cd (claim) — ADR-0008 and ADR-0009 keep the literal string Annals on purpose -- mechanical substitution there destroys the decision trail
  • r-c0f4e2 3d249cd (claim) — the residual grep for lore_query reports a false positive because commitlore_query contains it as a substring, so check the prefix
  • r-a8f3c1 ef48843 (claim) — docs/adr/ADR-0008 is the canonical vocabulary -- do not reintroduce old terms from memory

git log --follow accepts exactly one pathspec, so renames are not followed for 3 paths; query one path at a time to follow its rename chain

withheld the content of 2 record(s) graded blocked: a Verified trailer matching an injection pattern is reported, never quoted (SPEC §7)

Trailer violations fail this check. Active constraints are informational — they are what the repository already decided, not a verdict on this PR.

@MongLong0214
MongLong0214 merged commit 04bd8e5 into main Aug 20, 2026
13 checks passed
@MongLong0214
MongLong0214 deleted the readme-translation-parity branch August 20, 2026 10:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The three translated READMEs still carry the pre-redesign structure

1 participant