Skip to content

ci(release): fail on a commit release-please would silently drop, and provision the anchor key without displaying it - #9957

Merged
JSONbored merged 3 commits into
mainfrom
fix/release-please-commit-parsing-9948
Jul 30, 2026
Merged

ci(release): fail on a commit release-please would silently drop, and provision the anchor key without displaying it#9957
JSONbored merged 3 commits into
mainfrom
fix/release-please-commit-parsing-9948

Conversation

@JSONbored

@JSONbored JSONbored commented Jul 30, 2026

Copy link
Copy Markdown
Owner

Closes #9948.

The silent failure

release-please drops a commit it cannot parse — it contributes to neither the version bump nor the changelog — and the run still reports success. Two shipped fix(miner): commits were invisible to the release when this was found; the only evidence was a line buried in the job's logs.

I guarded the wrong thing first

Both failing commits ended in a double issue/PR suffix — (#9679) (#9905) — so that is what my first cut matched. Driving release-please's actual parser proves that shape is fine:

input commits parsed
subject ending (#9679) (#9905) 1 — fine
`existsSync(resolveEventLedgerDbPath(env))` at body col 1 0 — DROPPED
foo(bar(baz)) in the body 0 — DROPPED
the same nested text further along the line 1 — fine
foo(bar) in the body 1 — fine

The real trigger is nested parentheses in the body, and it is position-sensitive — the parser names a column (unexpected token '(' at 12:37), and the identical text parses when shifted right.

A regex cannot express that. My original guard would have caught nothing while reading as protection, which is worse than no guard at all.

So it matches nothing

It runs the parser release-please itself uses and asserts every commit on the branch survives it. release-please is a devDependency, and its own exported type is used for the signature so an API change on upgrade is a build error rather than a silently-wrong cast.

Scoped to the branch's own commits: history is immutable, main already carries messages that drop, and a check failing on those would be permanently red and switched off within a day.

A fixture holds the real dropped message with a regression test asserting it still fails to parse — so if an upgrade ever fixes the parser, that test goes red and tells us the guard can be relaxed, instead of silently protecting nothing.

Also here: provisioning the anchor key without ever displaying it

The keygen printed a private key to stdout, so provisioning meant copying a signing key out of a terminal — into scrollback, shell history, and whatever captured the session. One of ours had to be discarded for exactly that reason during this work.

--secret-file <path> writes the private half at 0600 and prints only the public half. It refuses to overwrite an existing file, since replacing a live signing key strands every anchor published under it.

Validation

  • 8 tests driving the real parser, including both counterweights: ordinary single-level parens must pass, and the double-ref subject must not be flagged.
  • release-commit-parsing:check, checkers-wired, import-specifiers, dead-exports, dead-source-files, publishable-deps, workspace-dep-ranges, turbo-inputs, docs:drift-check, typecheck all pass.

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 30, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Preview URL Updated (UTC)
✅ Deployment successful!
View logs
loopover-ui 167b233 Commit Preview URL

Branch Preview URL
Jul 30 2026, 09:49 PM

@loopover-orb

loopover-orb Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Caution

🛑 LoopOver review result - fixes required

Review updated: 2026-07-30 22:27:55 UTC

7 files · 1 AI reviewer · no blockers · CI failing · unstable

🛑 Suggested Action - Manual Review

Review summary
This PR adds a pre-merge gate that drives release-please's actual parser (not a regex) against every commit on the branch to catch messages that would be silently dropped from the changelog/version bump, backed by a regression fixture and solid negative/positive test coverage tracing the real production trigger (nested parens in the commit body). It also adds a `--secret-file` mode to the anchor-keygen script so the private key never touches stdout/scrollback, refusing to clobber an existing file. Both changes are narrowly scoped, correctly wired into `test:ci`, and the docs update matches the new script behavior; the `console.log`/magic-number flags from the brief are expected for a CLI script and not real defects.

Nits — 6 non-blocking
  • scripts/check-release-commit-parsing.ts:81-84 — `commitsOnThisBranch` swallows any `execFileSync` error (not just a missing base ref) and silently returns `[]`, so a transient git failure passes the gate instead of failing loudly; consider only swallowing the specific 'unknown revision' case.
  • scripts/gen-ledger-anchor-keypair.ts:70-71 — the flag-parsing block duplicates the pattern used elsewhere in the repo for argv flags; a small helper would avoid drift if a third flag is added later.
  • package.json — `release-please` is added as a devDependency with no lockfile diff shown inline (binary/too-large), so verify `package-lock.json` was actually regenerated in sync (the diff stat suggests it was).
  • The Superagent Supply Chain Scan flagged `release-please@​16.18.0` as lacking a published SLSA/sigstore attestation; worth a one-line acknowledgment in the PR description even though this is a devDependency only used in CI tooling, not shipped.
  • Consider tightening `commitsOnThisBranch`'s catch block to only treat 'unknown revision' stderr as the shallow-clone case, and let other git errors propagate so a broken CI environment doesn't silently pass the check.
  • PR author also opened the linked issue — Link an issue that was opened by a different contributor, or provide a rationale for why this self-authored issue represents genuine discovery work.

CI checks failing

  • Superagent Supply Chain Scan — Supply chain risks detected

Decision drivers

  • ✅ Code review — No blockers (1 reviewer)
  • ✅ Gate result — Passing (No configured blocker found.)
Context & advisory signals — never blocks the verdict
Signal Result Evidence
Linked issue ✅ Linked #9948
Related work ✅ No active overlap found No same-issue or scoped active PR overlap found.
Change scope ✅ 20/20 Low review scope from cached public metadata (1 linked issue).
Validation posture ✅ 25/25 PR body includes validation/test evidence.
Contributor workload ✅ 10/10 Author activity: 9 registered-repo PR(s), 8 merged, 287 issue(s).
Contributor context ✅ Confirmed Gittensor contributor JSONbored; Gittensor profile; 9 PR(s), 287 issue(s).
Improvement ✅ Minor risk: clean · value: minor
Linked issue satisfaction

Partially addressed
The PR directly fixes acceptance criterion #1 (fails loudly with a real-parser-driven CI check on unparseable commits, with tests showing the double-suffix shape is actually fine and nested parens are the real trigger) but does not address criterion #2 (pullRequestTitlePattern/componentNoSpace warning) or criterion #3 (the watcher vs release-please disagreement over whether a release is due), whic

Review context
  • Author: JSONbored
  • Role context: owner (maintainer lane)
  • Public audience mode: oss maintainer
  • Lane context: Repository is configured for direct PR review.
  • Public profile languages: Python, TypeScript, Ruby, Go, MDX, Shell, Solidity, JavaScript
  • Official Gittensor activity: 9 PR(s), 287 issue(s).
  • PR-specific overlap: none found.
Contributor next steps
  • Start here: Treat this as maintainer-lane context rather than normal contributor-lane activity.
Signal definitions
  • Related work = same linked issue, overlapping active PRs, or title/path similarity.
  • Change scope = cached public metadata such as size labels, draft state, and review-burden hints.
  • Validation posture = whether the PR provides enough public validation/test evidence for maintainer review.
  • Contributor workload = public contributor activity and cleanup pressure, not a repo-wide quality failure.
  • Contributor context = public GitHub/Gittensor identity context; non-Gittensor status is not a blocker.
🧪 Chat with LoopOver

Ask LoopOver a question about this PR directly in a comment — grounded only in the same cached, public-safe facts shown above, never a new claim.

  • @loopover ask &lt;question&gt; answers contribution-quality Q&A with source citations and freshness.
  • @loopover chat &lt;question&gt; answers in natural prose from cached decision-pack facts via local inference (maintainer/collaborator; read-only).
  • A plain-language @loopover mention with a real question is routed to the closest matching read-only command automatically — no exact syntax required.

Full command reference: https://loopover.ai/docs/loopover-commands

🧪 Experimental — new and may change.

Decision record
  • action: hold · clause: success
  • config: 149941c69c6f7abc480b4e9f6eb10d9da17e1a12db01b37e5b563d13a7d36b49 · pack: oss-anti-slop · ci: failed
  • record: 67fbec7ed792c3a4214cf4c8a757a8084d001d79a954678c9c232908f20ba37a (schema v6, head 167b233)
Visual preview
Route Viewport Before (production) After (this PR's preview) Diff
/ desktop before /
before /
after /
after /
/ mobile before / (mobile)
before / (mobile)
after / (mobile)
after / (mobile)

Click any thumbnail to open the full-size screenshot. Before = production · After = this PR's preview deploy.

Scroll preview
Route Before (production) After (this PR's preview)
/ before / (scroll)
before / (scroll)
after / (scroll)
after / (scroll)

A short scroll-through clip (desktop) — click either thumbnail to open the full animation. Evidence for scroll-linked behavior a single screenshot can't show.

🟩 Safe / merged · 🟦 Advisory · 🟨 Held for review · 🟥 Blocked / closed


💰 Earn for open-source contributions like this. Gittensor lets GitHub contributors earn for the work they already do — register to start earning →.

Checked by LoopOver, a quiet PR intelligence layer for OSS maintainers.

  • Re-run LoopOver review

@superagent-security

Copy link
Copy Markdown
Contributor

Superagent didn't find any vulnerabilities or security issues in this PR.

@codecov

codecov Bot commented Jul 30, 2026

Copy link
Copy Markdown

Bundle Report

Changes will increase total bundle size by 2.15kB (0.03%) ⬆️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
loopover-ui 7.89MB 2.15kB (0.03%) ⬆️

Affected Assets, Files, and Routes:

view changes for bundle: loopover-ui

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/add-scalar-classes-DQtEzQjs.js (New) 2.16MB 2.16MB 100.0% 🚀
assets/tanstack-vendor-BQteyi3L.js (New) 955.23kB 955.23kB 100.0% 🚀
assets/docs.fumadocs-spike-api-reference-B6w2Y4xH.js (New) 443.45kB 443.45kB 100.0% 🚀
assets/AgentScalarChatInterface.vue-TlR_nktt.js (New) 201.69kB 201.69kB 100.0% 🚀
assets/modal-BgJI4zLI.js (New) 184.5kB 184.5kB 100.0% 🚀
assets/client-C1ENMo8c.js (New) 151.47kB 151.47kB 100.0% 🚀
assets/self-hosting-configuration-BpnS4-1h.js (New) 118.62kB 118.62kB 100.0% 🚀
assets/maintainer-panel-oNqw5eL_.js (New) 78.97kB 78.97kB 100.0% 🚀
assets/routes-ChMgBQxl.js (New) 35.88kB 35.88kB 100.0% 🚀
assets/owner-panel-CRiIb5mW.js (New) 28.26kB 28.26kB 100.0% 🚀
assets/app-NfZwIA8-.js (New) 25.82kB 25.82kB 100.0% 🚀
assets/ui-vendor-hZzO-uW_.js (New) 24.57kB 24.57kB 100.0% 🚀
assets/fairness-hpRY92tM.js (New) 23.13kB 23.13kB 100.0% 🚀
assets/miner-panel-CK9CXOmY.js (New) 20.49kB 20.49kB 100.0% 🚀
assets/api._op-C57pfG4Q.js (New) 17.51kB 17.51kB 100.0% 🚀
assets/self-hosting-docs-audit-CpauQmIZ.js (New) 16.6kB 16.6kB 100.0% 🚀
assets/docs-client-loader-ChTB5d2W.js (New) 15.51kB 15.51kB 100.0% 🚀
assets/playground-panel-B8ZqXTz9.js (New) 14.35kB 14.35kB 100.0% 🚀
assets/app.audit-Dbiw_CFa.js (New) 10.22kB 10.22kB 100.0% 🚀
assets/app.config-generator-CQvkD-fS.js (New) 10.06kB 10.06kB 100.0% 🚀
assets/maintainers-DFmoZmqj.js (New) 8.06kB 8.06kB 100.0% 🚀
assets/miners-DX2xMrRP.js (New) 7.91kB 7.91kB 100.0% 🚀
assets/agents-9nutRbId.js (New) 7.74kB 7.74kB 100.0% 🚀
assets/commands-panel-DtQjmImE.js (New) 6.74kB 6.74kB 100.0% 🚀
assets/maintainer-workflow-hYdVvOkg.js (New) 6.52kB 6.52kB 100.0% 🚀
assets/digest-panel-B9Ey-DrL.js (New) 6.15kB 6.15kB 100.0% 🚀
assets/repos._owner._repo.quality-Bw8-Dh-3.js (New) 6.14kB 6.14kB 100.0% 🚀
assets/docs-nav-DYfmHyee.js (New) 6.12kB 6.12kB 100.0% 🚀
assets/docs.index-CV9HFXh-.js (New) 6.01kB 6.01kB 100.0% 🚀
assets/api.index-DoptAMvi.js (New) 4.7kB 4.7kB 100.0% 🚀
assets/docs-BLaFa1u0.js (New) 3.01kB 3.01kB 100.0% 🚀
assets/api-Cpqq2shP.js (New) 2.66kB 2.66kB 100.0% 🚀
assets/docs-page-Btkx22cO.js (New) 2.14kB 2.14kB 100.0% 🚀
assets/table-Ct5PtXP3.js (New) 1.75kB 1.75kB 100.0% 🚀
assets/app.workbench-rKHAfwb5.js (New) 1.58kB 1.58kB 100.0% 🚀
assets/tabs-CmiECeRf.js (New) 1.39kB 1.39kB 100.0% 🚀
assets/app.repos-DvsU3QMT.js (New) 1.07kB 1.07kB 100.0% 🚀
assets/input-BwvT2nJJ.js (New) 796 bytes 796 bytes 100.0% 🚀
assets/file-cog-DUEB2xdU.js (New) 758 bytes 758 bytes 100.0% 🚀
assets/docs._slug-BhdjhdlV.js (New) 549 bytes 549 bytes 100.0% 🚀
assets/app.maintainer-BCHv3ELb.js (New) 502 bytes 502 bytes 100.0% 🚀
assets/app.owner-DKtos90P.js (New) 474 bytes 474 bytes 100.0% 🚀
assets/app.commands-BAZP4f9o.js (New) 455 bytes 455 bytes 100.0% 🚀
assets/app.playground-BmR54P74.js (New) 442 bytes 442 bytes 100.0% 🚀
assets/index-BTF__Gq5.js (New) 438 bytes 438 bytes 100.0% 🚀
assets/app.digest-D8vLTOKs.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/eye-off-d3srp4zL.js (New) 430 bytes 430 bytes 100.0% 🚀
assets/app.miner-DVrn-x0m.js (New) 422 bytes 422 bytes 100.0% 🚀
assets/key-round-Ckhfnzi6.js (New) 355 bytes 355 bytes 100.0% 🚀
assets/bot-D2qOLO4-.js (New) 328 bytes 328 bytes 100.0% 🚀
assets/git-pull-request-arrow-C1a9n-bF.js (New) 321 bytes 321 bytes 100.0% 🚀
assets/list-checks-DDH5CjFj.js (New) 279 bytes 279 bytes 100.0% 🚀
assets/compass-ChF6tXzL.js (New) 251 bytes 251 bytes 100.0% 🚀
assets/history-DgV0zb2j.js (New) 237 bytes 237 bytes 100.0% 🚀
assets/message-square-BohCWayf.js (New) 233 bytes 233 bytes 100.0% 🚀
assets/lock-efrgICGz.js (New) 206 bytes 206 bytes 100.0% 🚀
assets/play-DIeIgu9R.js (New) 190 bytes 190 bytes 100.0% 🚀
assets/circle-check-BcJUjjhT.js (New) 178 bytes 178 bytes 100.0% 🚀
assets/add-scalar-classes-Cf3Nn6w3.js (Deleted) -2.16MB 0 bytes -100.0% 🗑️
assets/tanstack-vendor-CArzhjLP.js (Deleted) -955.23kB 0 bytes -100.0% 🗑️
assets/docs.fumadocs-spike-api-reference-Be8AWFqf.js (Deleted) -443.45kB 0 bytes -100.0% 🗑️
assets/AgentScalarChatInterface.vue-i7eu_zSl.js (Deleted) -201.69kB 0 bytes -100.0% 🗑️
assets/modal-DxObGOeQ.js (Deleted) -184.5kB 0 bytes -100.0% 🗑️
assets/client-CHpvhBzS.js (Deleted) -151.47kB 0 bytes -100.0% 🗑️
assets/self-hosting-configuration-Cfy8pMsY.js (Deleted) -116.47kB 0 bytes -100.0% 🗑️
assets/maintainer-panel-BitOO5AK.js (Deleted) -78.97kB 0 bytes -100.0% 🗑️
assets/routes-Dm_KJKg0.js (Deleted) -35.88kB 0 bytes -100.0% 🗑️
assets/owner-panel-xTdm1oxd.js (Deleted) -28.26kB 0 bytes -100.0% 🗑️
assets/app-CzQiyE11.js (Deleted) -25.82kB 0 bytes -100.0% 🗑️
assets/ui-vendor-CopOe5Wm.js (Deleted) -24.57kB 0 bytes -100.0% 🗑️
assets/fairness-Dz5JNgdL.js (Deleted) -23.13kB 0 bytes -100.0% 🗑️
assets/miner-panel-kBqAuSBh.js (Deleted) -20.49kB 0 bytes -100.0% 🗑️
assets/api._op-BPYGt70c.js (Deleted) -17.51kB 0 bytes -100.0% 🗑️
assets/self-hosting-docs-audit-BSCKW7_b.js (Deleted) -16.6kB 0 bytes -100.0% 🗑️
assets/docs-client-loader-BWG28Ey1.js (Deleted) -15.51kB 0 bytes -100.0% 🗑️
assets/playground-panel-DXFnOyb1.js (Deleted) -14.35kB 0 bytes -100.0% 🗑️
assets/app.audit-CjrFcal4.js (Deleted) -10.22kB 0 bytes -100.0% 🗑️
assets/app.config-generator-BNCfh0SX.js (Deleted) -10.06kB 0 bytes -100.0% 🗑️
assets/maintainers-B9m6eBK4.js (Deleted) -8.06kB 0 bytes -100.0% 🗑️
assets/miners-DHZuQnUp.js (Deleted) -7.91kB 0 bytes -100.0% 🗑️
assets/agents-DMl_7rOa.js (Deleted) -7.74kB 0 bytes -100.0% 🗑️
assets/commands-panel-gkRVSDbB.js (Deleted) -6.74kB 0 bytes -100.0% 🗑️
assets/maintainer-workflow-oRMyL0kw.js (Deleted) -6.52kB 0 bytes -100.0% 🗑️
assets/digest-panel-isbmABv4.js (Deleted) -6.15kB 0 bytes -100.0% 🗑️
assets/repos._owner._repo.quality-BVn025bU.js (Deleted) -6.14kB 0 bytes -100.0% 🗑️
assets/docs-nav-BGT7NsFf.js (Deleted) -6.12kB 0 bytes -100.0% 🗑️
assets/docs.index-Cnv1ZkB9.js (Deleted) -6.01kB 0 bytes -100.0% 🗑️
assets/api.index-BAm3MzNN.js (Deleted) -4.7kB 0 bytes -100.0% 🗑️
assets/docs-CCmQgG5I.js (Deleted) -3.01kB 0 bytes -100.0% 🗑️
assets/api-Cfxr3LTM.js (Deleted) -2.66kB 0 bytes -100.0% 🗑️
assets/docs-page-CNTFeRd6.js (Deleted) -2.14kB 0 bytes -100.0% 🗑️
assets/table-BSKrevt2.js (Deleted) -1.75kB 0 bytes -100.0% 🗑️
assets/app.workbench-CJ8Jx7vz.js (Deleted) -1.58kB 0 bytes -100.0% 🗑️
assets/tabs-CUPaw-wH.js (Deleted) -1.39kB 0 bytes -100.0% 🗑️
assets/app.repos-CzU5qUPb.js (Deleted) -1.07kB 0 bytes -100.0% 🗑️
assets/input-Camc98xc.js (Deleted) -796 bytes 0 bytes -100.0% 🗑️
assets/file-cog-DMwhJ6Nw.js (Deleted) -758 bytes 0 bytes -100.0% 🗑️
assets/docs._slug-DPOLwPoi.js (Deleted) -549 bytes 0 bytes -100.0% 🗑️
assets/app.maintainer-C1YxcfXb.js (Deleted) -502 bytes 0 bytes -100.0% 🗑️
assets/app.owner-BslY6Q5g.js (Deleted) -474 bytes 0 bytes -100.0% 🗑️
assets/app.commands-BoaA-NUX.js (Deleted) -455 bytes 0 bytes -100.0% 🗑️
assets/app.playground-B1zP7ODP.js (Deleted) -442 bytes 0 bytes -100.0% 🗑️
assets/index-BN0xmUfP.js (Deleted) -438 bytes 0 bytes -100.0% 🗑️
assets/app.digest-Bo0fiVHZ.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/eye-off-ESv1fUkZ.js (Deleted) -430 bytes 0 bytes -100.0% 🗑️
assets/app.miner-Dmw80Mx9.js (Deleted) -422 bytes 0 bytes -100.0% 🗑️
assets/key-round-CIAIFC6e.js (Deleted) -355 bytes 0 bytes -100.0% 🗑️
assets/bot-COadFKWP.js (Deleted) -328 bytes 0 bytes -100.0% 🗑️
assets/git-pull-request-arrow-DTawd7rT.js (Deleted) -321 bytes 0 bytes -100.0% 🗑️
assets/list-checks-IGJiaKKs.js (Deleted) -279 bytes 0 bytes -100.0% 🗑️
assets/compass-DuACOrh5.js (Deleted) -251 bytes 0 bytes -100.0% 🗑️
assets/history-D2CbX1zC.js (Deleted) -237 bytes 0 bytes -100.0% 🗑️
assets/message-square-D4EOLc35.js (Deleted) -233 bytes 0 bytes -100.0% 🗑️
assets/lock-KJDdYeAS.js (Deleted) -206 bytes 0 bytes -100.0% 🗑️
assets/play-GGEK4eeQ.js (Deleted) -190 bytes 0 bytes -100.0% 🗑️
assets/circle-check-DCdbT6qO.js (Deleted) -178 bytes 0 bytes -100.0% 🗑️

Refs #9948.

release-please DROPS a commit whose title it cannot parse -- no version bump, no
changelog entry -- and the job still reports success. Two shipped fix(miner)
commits were invisible to the release when this was found, and the only evidence
was buried in the run's logs.

The shape is a double reference suffix, '(#9679) (#9905)', which this repo
produces whenever a PR title already carries the issue number and the merge
appends the PR number.

Checked BEFORE release-please runs rather than by scraping its logs afterwards: a
title is a fact available at commit time, and a guard on the input is one nobody
has to remember to read.

Scoped to the commits a branch adds over its base, NOT to everything since the
last release tag. Git history is immutable and main already carries two titles of
this shape, so a check that failed on those would be permanently red, would block
every unrelated PR, and would be switched off within a day. Guarding new commits
stops the class going forward, which is the only thing a pre-merge gate can
honestly do about titles that already shipped.

The pattern is deliberately narrow -- it matches the one shape observed to break
the parser rather than reimplementing the conventional-commits grammar, which
would drift from the real parser and start rejecting titles release-please
handles fine.
Refs #9940.

The keygen printed the private key to stdout, so provisioning meant a human
copying a signing key out of a terminal -- where it lands in scrollback, in shell
history if piped, and in whatever captured the session. One of ours had to be
discarded for exactly that reason.

`--secret-file <path>` writes the private half directly at 0600 and prints only
the public half, which is meant to be published. Nothing to copy, nothing to
leak. Point LOOPOVER_LEDGER_ANCHOR_PRIVATE_KEY_FILE at the path -- the generic
<NAME>_FILE mechanism every self-host secret already supports -- and recreate the
container.

Refuses to overwrite an existing file: replacing a live signing key strands every
anchor published under it, which is the same reason a retired key is closed
rather than removed.

The printing mode stays for reading the shape before provisioning.
Refs #9948.

release-please DROPS a commit it cannot parse -- it contributes to neither the
version bump nor the changelog -- and the run still reports success. Two shipped
fix(miner) commits were invisible to the release when this was found.

The first cut of this guard matched the double issue/PR suffix in the subject,
'(#9679) (#9905)', because that is what the failing commits visibly had in
common. Driving release-please's actual parser proves that shape parses fine.
The real trigger is NESTED PARENTHESES IN THE BODY, and it is position-sensitive
-- the parser reports a column, and the same nested text parses when it sits
further along the line. That guard would have caught nothing while reading as
protection, which is worse than no guard.

So this matches nothing. It runs the parser release-please itself uses and
asserts every commit on the branch survives it, with release-please added as a
devDependency and its own exported type used for the signature so an upgrade that
changes the API is a build error rather than a silently-wrong cast.

Scoped to the branch's own commits: history is immutable, and a check that failed
on what already shipped would be permanently red and switched off within a day.

A fixture holds the real dropped message, with a regression test asserting it
STILL fails to parse -- so if an upgrade ever fixes the parser, that test goes red
and says the guard can be relaxed, rather than silently protecting nothing.
@JSONbored JSONbored changed the title ci(release): fail on a commit title release-please cannot parse ci(release): fail on a commit release-please would silently drop, and provision the anchor key without displaying it Jul 30, 2026
@superagent-security

Copy link
Copy Markdown
Contributor

Superagent Supply Chain Scan

Superagent flagged 1 dependency introduced by this pull request.

Risk: typescript@4.9.5

  • Change: added 4.9.5
  • Dependency path: package-lock.json → release-please → typescript
  • Why flagged: Detects log/console suppression combined with obfuscated code, a common malware evasion pattern. Location: package/lib/tsserver.js. Rules: threat-runtime-obfuscation-log-suppress
  • Risk score: 7.2

View Superagent Supply Chain Scan

@codecov

codecov Bot commented Jul 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 92.15%. Comparing base (81f28ca) to head (167b233).
⚠️ Report is 2 commits behind head on main.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #9957      +/-   ##
==========================================
+ Coverage   91.87%   92.15%   +0.27%     
==========================================
  Files         928      831      -97     
  Lines      113697    90708   -22989     
  Branches    27421    23513    -3908     
==========================================
- Hits       104460    83591   -20869     
+ Misses       7936     5994    -1942     
+ Partials     1301     1123     -178     
Flag Coverage Δ
backend 95.66% <ø> (ø)
control-plane ?
engine 72.35% <ø> (ø)
rees ?

Flags with carried forward coverage won't be shown. Click here to find out more.
see 97 files with indirect coverage changes

@loopover-orb loopover-orb Bot added the manual-review Gittensor contributor context label Jul 30, 2026
@JSONbored
JSONbored merged commit 43c7b0f into main Jul 30, 2026
12 of 13 checks passed
@JSONbored
JSONbored deleted the fix/release-please-commit-parsing-9948 branch July 30, 2026 22:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

manual-review Gittensor contributor context

Projects

None yet

Development

Successfully merging this pull request may close these issues.

release-please silently drops commits titled "... (#A) (#B)", and disagrees with the release-due watcher

1 participant