Release CodeTruss CLI v0.2.51 - #44
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
Syncs the 0.2.51 source from the private monorepo, byte for byte against the monorepo git objects (211 paths compared by blob hash, 0 mismatches, 0 missing).
That digest was not copied into
release-reference.json:pnpm release:artifactwas run against this tree, resolved from this repository's own lockfile, and the rebuilt archivecmps clean against the monorepo's copy, against the monorepo'slatestpointer, and against the bytes codetruss.com is serving right now — as does thedist/cli.cjsinside it. The samecmpagainst 0.2.50 exits 1, so the comparison is capable of failing.Why this one is urgent
https://codetruss.com/downloads/codetruss-cli-latest.jsonalready advertises 0.2.51, and itsreleaseUrl—.../releases/tag/v0.2.51— currently 404s, because the release does not exist yet. So does the verify command the same manifest publishes. Tagging this merge is what makes the advertised URL resolve.More to the point: 0.2.51 is the version that makes this tool usable on real repositories at all. Anyone who installs 0.2.50 today and runs it on a large TypeScript codebase hits the defect below in under two seconds.
What 0.2.51 is
A file CodeTruss could not parse reported the user's change as FAILED. On
sindresorhus/kyat3419113, appending a single comment line tosource/index.tsreturnsFAILED, exit 2, for a reason that names no file:1 file(s) could not be parsed locally. The trigger is aunique symboldeclaration — standard TypeScript since 2018 — insource/utils/merge.ts, which the bundled zero-dependency grammar cannot read. Reproduced identically onhonojs/honoandcolinhacks/zod. Becausecodetruss setupinstalls a pre-commit hook, FAILED also blocks the nextgit commit, with uninstalling as the only escape.Our inability to read a file is our limitation, not a defect in the change. Evidence issues are now classified where their cause is still known rather than by matching on message text at the verdict:
missing— no evidence at all — still FAILS, because nothing can be concluded from such a run in either direction;partial— a hole in evidence that otherwise exists, such as an unparseable file, a size bound, a wall-clock ceiling, a truncated diff — is nowREVIEW_REQUIRED. It withholds PASS, is named on the receipt, and exits 1, which the pre-commit hook allows.Coverage gaps now name their files. The engine recorded that n files could not be parsed and dropped which ones before the receipt was signed. A count with no path is unactionable. Parse failures and in-file scan errors are now carried as bounded path lists through the scan diagnostics, disclosed in the pass detail, and recorded in the signed pass metrics.
A commented-out regex ran the analyzer phase past seven minutes at 100% CPU.
colinhacks/zodnever finished a review. The literal-stripping expression shared by thecomplexityandcomment-slopanalyzers spelled its escape handling as(?:\\.|(?!\1).)*, which lets a backslash be consumed by either branch; on an unterminated literal the engine then tries every partition of the backslashes in it.packages/zod/src/v3/types.ts:607is a commented-out email regex with 133 backslashes and no closing quote: 2^133 on one 928-character line. It outlived both advertised wall-clock ceilings because those bound the SAST pass and this runs in the registry analyzers. Excluding the backslash from the second branch makes the alternatives disjoint; the same line now completes in under a millisecond with byte-identical output, and the fixture is pinned in the test suite.Also carried: a new
excludekey in.codetruss.ymlthat keeps a file out of the analysis index while still inventorying it, classifying it against scope, and naming it — with its glob and matched paths — in the receipt's coverage notes, and entering it into the policy fingerprint, because an exclusion that hid itself would be a worse bug than the coverage gap it works around. And one design asset committed with a text-ish extension no longer forces REVIEW_REQUIRED forever.Not touched
pnpm-workspace.yaml,.npmrc,pnpm-lock.yaml,package.json(root) and.github/are unchanged — the sync never writes mirror-owned files.public/downloads/grammars/is carried verbatim. No previously published artifact is modified:git statusunderpublic/downloads/reports nothing outsidecodetruss-cli-0.2.51.*and thelatestpointers, so 0.2.44 through 0.2.50 still have exactly the bytes they were attested with.CHANGELOG.mdat the root is regenerated frompackages/cli/CHANGELOG.mdby the same rule as before. The generator was checked by feeding it the 0.2.50 package changelog and confirming it reproduces the committed 0.2.50 root changelog byte-for-byte, so a generator that had drifted would not have passed. Its npm-trail sentence moves from 0.2.41 to 0.2.50, because npmlatestis 0.2.50 as of today and the old sentence had gone false.Checked locally before opening
pnpm install --frozen-lockfileresolves with the lockfile untouched (the only source change topackages/cli/package.jsonis the version string).pnpm validatepasses against this branch: typecheck,release:artifact,pnpm test(35 files, 433 tests),release:verify, andtest:install. The rebuilt archive reproduced0dbd333a…exactly, andrelease-reference.json's three digests were each measured off the files rather than transcribed.The blob-hash comparison was run a second time against the pre-sync tree as a negative control: it reported 30 mismatched paths and exited 1, so a sync that silently dropped a file would not have passed.
The release workflow's
awkextraction of the changelog entry was dry-run against the regeneratedCHANGELOG.mdand returns 66 non-empty lines, so the release note will not be install-steps-only.🤖 Generated with Claude Code