codetruss 0.2.55 - #20
Merged
Merged
Conversation
Points the formula at the v0.2.55 release archive. Digest measured off the downloaded asset; the URL was fetched independently and cmp'd against it. 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.
Points the formula at the
v0.2.55release archive.That digest was measured off the downloaded release asset, not copied from the release notes, and the URL written above was fetched independently with
curlandcmpd against it. The asset is byte-identical topublic/downloads/codetruss-cli-0.2.55.tgzin the monorepo, to the bytes codetruss.com serves, to the site'slatestpointer, and to the archive rebuilt independently in the mirror from its own lockfile — five copies, allcmpclean.gh attestation verify codetruss-cli-0.2.55.tgz --repo CodeTruss/codetruss-clipasses — the command was derived fromattestationCommand()inpackages/cli/scripts/release-metadata.mjsrather than retyped, and matches theattestationCommandfield the live manifest publishes. It was run with--format jsonrather than trusting a bare exit code, so the subject it actually verified (codetruss-cli-0.2.55.tgz, digest12010c43…) and the signer identity (https://github.com/CodeTruss/codetruss-cli/.github/workflows/release.yml@refs/tags/v0.2.55, issuertoken.actions.githubusercontent.com) are on the record.The release carries all three attestations:
https://slsa.dev/provenance/v1codetruss-cli-0.2.55.tgz@12010c43…gh attestation verify --format jsonhttps://cyclonedx.org/bomcodetruss-cli-0.2.55.tgz@12010c43…gh attestation verify --predicate-type … --format json, CycloneDX 1.6, 5 componentshttps://in-toto.io/attestation/release/v0.2pkg:github/CodeTruss/codetruss-cli@v0.2.55@69a0e5c5…(the annotated tag object)gh2.85 exits 1 on this predicate because it is signed bydotcom.releases.github.com, not an Actions OIDC identityThe exit 0 is not vacuous. The same
cmpagainst 0.2.53 — the version this formula pointed at until now — exits 1.gh attestation verifywas checked against a tampered copy of the archive (one appended NUL), against the pre-transferDeliriumPulse/codetruss-clislug, and against an unrelated repository; all three exit 1, and the attestations API returns HTTP 404 for the tampered digest.Nothing else changes.
.github/workflows/test.ymlderives the expected version frombrew inforather than a literal, so it needs no edit; the version assertion in CI is what proves the installed binary matches the formula.What 0.2.55 carries
This release supersedes 0.2.54, which was merged but never released — no tag, no GitHub release, no formula bump. That has precedent (0.2.42 and 0.2.47 through 0.2.49 are all merged-but-unreleased). It is not retroactively released; its change ships inside these bytes.
0.2.54 — the README's profile id is derived instead of restated. The 0.2.53 archive contradicted itself:
README.mdsaid receipts identify the 15-passlocal-registry-v4profile whileCHANGELOG.md, packed beside it in the same eight-file tarball, saidlocal-registry-v5. That was recorded as a known wart in the 0.2.53 formula bump. A build step now readsLOCAL_ANALYSIS_PROFILE.idfrompackages/cli/src/types.tsand the analyzer count fromANALYZERSin the engine registry, and fails the release build when the README disagrees with either.0.2.55 — the mirror's CI can now fail on a rule. The public source repository carries
packages/cli/and the engine'ssrc, but no roottests/and no engine test directory, so its nine required contexts verified packaging — reproducible archive, tamper-rejecting verifier, changelog chain — and a SAST behaviour regression could pass all nine.packages/cli/scripts/test-acceptance.mjsnow runs the builtdist/cli.cjsover committed fixtures and asserts the adjudicated verdicts from the cross-tool benchmark: a drizzlesql`…`tagged template that must not be reported, andclient.query(param, …)on a database-shaped receiver that must be reported at HIGH.No analyzer, rule, or receipt behaviour changes.
git diffbetween the 0.2.53 and 0.2.55 source trees reports zero changes underpackages/cli/srcorpackages/analyzer-engine/src.dist/cli.cjsmoves 828,029 → 828,065 bytes (+36), 2 changed lines out of 296, and that delta is entirely the inlinedpackage.json: the version string plus the 36 characters of&& node scripts/test-acceptance.mjs. Receipts stay onlocal-registry-v5, and every frozen profile renderer (v1 through v5) pins an unchanged SHA-256.Verified against the published archive, not a local build
Installed into a dedicated
npm --prefixand invoked by absolute path — this machine also carries a stale globalcodetruss(0.2.28, from Homebrew) that must not be allowed to answer:codetruss --version→codetruss 0.2.55(the stale global still answerscodetruss 0.2.28, so the absolute path is doing real work)dist/cli.cjsis byte-identical to the one inside the downloaded release archiveREADME.mdinside the installed package readslocal-registry-v5— the 0.2.54 correction is genuinely in these bytesProfile: `local-registry-v5`andcodetruss verify latestaccepts its signature (PASS)The new acceptance check is not decoration either: it was demonstrated red in both directions before being trusted. Reverting the tagged-template exemption reports
CRITICAL sql-injection at src/db/rpc.ts:11where none is allowed; switching the caller-supplied-argument gate off yieldsexpected exactly 1 sql-injection finding …, got 0. It ran in the public repository's CI and printedreproduced 2 adjudicated verdicts over 2 fixturesin all six contexts that execute the test suite, and in the tag-triggered release job that produced this archive.One known wart
The 0.2.55 changelog entry inside this archive says the acceptance script "runs in all nine compatibility contexts". It runs in six of nine: the upstream
ci.ymlgates itsTeststep onmatrix.node != '20.9.0', so the three Node 20.9.0 contexts skip it — confirmed from the job step conclusions, not inferred. The check is real and the coverage gap it closes is closed on every context that runs the suite; only the count in the prose is wrong.It is recorded rather than patched, because these bytes are already tagged, attested and served. A correction belongs in 0.2.56.
🤖 Generated with Claude Code