Skip to content

fix: serve the Socket badges from badge.socket.dev - #729

Merged
allxsmith merged 6 commits into
mainfrom
docs/726-socket-badge-host
Sep 22, 2026
Merged

allxsmith merged 6 commits into
mainfrom
docs/726-socket-badge-host

Conversation

@allxsmith

@allxsmith allxsmith commented Sep 22, 2026 •

Copy link
Copy Markdown
Owner

Closes #726.

Points all six Socket badges at badge.socket.dev, keeps the /latest segment, and ships a patch release per package so the README npm serves picks the fix up immediately.

Why the badges broke

socket.dev/api/badge/npm/package/<pkg> is behind a Cloudflare bot challenge. GitHub proxies README images through camo, so camo is what's being blocked, and it returns 403 Forbidden where a working badge returns 200 image/svg+xml. Same README, two badges:

our Socket badge,   via camo -> 403 Forbidden      (text/plain)
a shields.io badge, via camo -> 200 image/svg+xml

A local curl can't diagnose this, because a scripted client from a residential IP gets cf-mitigated: challenge from both the old path and the new host. camo is the client that tells them apart.

Why /latest and not the bare form

Every real-world usage carries a version segment (/latest, /canary, or a pin) and none uses the bare unversioned form. Verified through camo against repos already on badge.socket.dev, including a scoped package, which is the case that matters for @allxsmith/bestax-bulma and @allxsmith/eslint-plugin-bestax:

README badge URL via camo
cure53/DOMPurify badge.socket.dev/npm/package/dompurify/latest 200 image/svg+xml
borfast/arrispwgen badge.socket.dev/npm/package/@borfast/arrispwgen/latest 200 image/svg+xml

And against this branch's own head, all six:

README badge via camo
README.md @allxsmith/bestax-bulma/latest 200 image/svg+xml
bulma-ui/README.md @allxsmith/bestax-bulma/latest 200 image/svg+xml
create-bestax/README.md create-bestax/latest 200 image/svg+xml
bestax-migrate/README.md bestax-migrate/latest 200 image/svg+xml
bestax-mcp/README.md bestax-mcp/latest 200 image/svg+xml
eslint-plugin/README.md @allxsmith/eslint-plugin-bestax/latest 200 image/svg+xml

Commit structure

npm only re-reads a README when the package publishes, so each package needs its own patch. A package's commit-analyzer carries { scope: '!(<pkg>)', release: false }, so one scoped commit can only release one package — which is why this is six commits rather than one:

Commit Releases
fix(bulma-ui): @allxsmith/bestax-bulma patch
fix(create-bestax): create-bestax patch
fix(bestax-migrate): bestax-migrate patch
fix(bestax-mcp): bestax-mcp patch
fix(eslint-plugin): @allxsmith/eslint-plugin-bestax patch
docs: (root README.md) nothing — { type: 'docs', release: false } matches in all five configs

Each commit touches exactly one file, inside the package its scope names. The root README additionally needs no release of its own because the root manifest is private, so it is never published to npm.

On merging

Prefer the repo's usual merge commit, but a squash is not dangerous. An earlier version of this section claimed a squash would leave "only one scope" and cost four of the five releases. That was wrong, and the mechanism is worth stating correctly:

squash_merge_commit_title is COMMIT_OR_PR_TITLE, and with six commits that resolves to the PR title, which is unscoped. In @semantic-release/commit-analyzer@13.0.1, lib/analyze-commit.js matches rules with isMatchWith(commit, rule, (object, src) => isString(src) && isString(object) ? micromatch.isMatch(object, src) : undefined). An unscoped commit parses to scope: null, which is not a string, so the customizer returns undefined and lodash falls back to strict equality — meaning { scope: '!(<pkg>)' } cannot match it. With no custom rule matching, index.js:64 falls through to DEFAULT_RELEASE_RULES, where angular's fix is a patch. So a squash ships five patches too.

What a squash actually costs is changelog quality: five identical unscoped lines instead of five scoped ones. Nothing enforces the choice either — the main ruleset permits merge, squash and rebase, and commitlint runs only in the local commit-msg hook.

Changelog attribution

Worth knowing: all five CHANGELOGs will carry all five fix(…) lines, because release-notes-generator is handed the whole commit range rather than the scoped subset. That is pre-existing behaviour (bestax-migrate/CHANGELOG.md already shows a run of **bulma-ui:** entries); this PR is just the maximal case of it.

Scope

Six image URLs. The link targets (socket.dev/npm/package/<pkg>/overview) are unchanged, since those are pages a human opens in a real browser and the challenge passes there.

Gate

The diff is markdown only, so I ran the gates that can see it rather than the full pnpm all: prettier --check on the six files and pnpm check:conformance, both green.

Summary by CodeRabbit

  • Documentation
    • Updated Socket security badge image links across project README files to use the latest package badge endpoint.
    • Existing badge destination links remain unchanged.

@coderabbitai

coderabbitai Bot commented Sep 22, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Navigate logical layers of code changes, visualize relationships, and explore their blast radius.

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository: allxsmith/bestax/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: 69c5a727-73a3-49dc-bca0-f863c9543d95

📥 Commits

Reviewing files that changed from the base of the PR and between e38c1ca and 18aec08.

📒 Files selected for processing (6)
  • README.md
  • bestax-mcp/README.md
  • bestax-migrate/README.md
  • bulma-ui/README.md
  • create-bestax/README.md
  • eslint-plugin/README.md

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


Walkthrough

Six README files now use Socket’s latest package badge endpoint. The existing Socket package overview links remain unchanged.

Changes

Socket badge endpoint updates

Layer / File(s) Summary
Update README badge sources
README.md, bestax-mcp/README.md, bestax-migrate/README.md, bulma-ui/README.md, create-bestax/README.md, eslint-plugin/README.md
Each Socket badge image URL now uses the badge.socket.dev/npm/package/.../latest format. The destination links remain unchanged.

Priority: ➖ Normal

Estimated code review effort: 1 (Trivial) | ~5 minutes

Change: Bug fix · Severity of issue fixed: Medium

Suggested reviewers: claude

Merge Risk: ⚪ Minimal · up to 18aec

The README badges now use Socket's latest package endpoints while preserving their overview links. This documentation-only change introduces no actionable merge-blocking risk.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly identifies the primary change: serving Socket badges from badge.socket.dev. It is concise and specific.
Description check ✅ Passed The description is comprehensive. It explains the six README changes, affected packages, related issue, release strategy, verification results, and merge considerations. It does not reproduce every te…
Linked Issues check ✅ Passed The PR implements the coding requirements in [#726]. It changes all six Socket image URLs to badge.socket.dev/.../latest, including the two scoped packages. It preserves the Socket overview link tar…
Out of Scope Changes check ✅ Passed The changes stay within [#726]. The PR updates only the six relevant README badge URLs and adds the package-scoped release triggers required to publish the README fixes to npm. No unrelated product or…
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. Docstring coverage is scoped to functions touched by this diff. Analyzed 0 functions across 0…
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@allxsmith

Copy link
Copy Markdown
Owner Author

End-to-end verification on this branch

Rendered each README at this branch's head through the GitHub API, pulled the camo URL GitHub generated for the Socket badge, and fetched it. All six now serve an actual image:

README badge via camo
README.md @allxsmith/bestax-bulma/latest 200 image/svg+xml
bulma-ui/README.md @allxsmith/bestax-bulma/latest 200 image/svg+xml
create-bestax/README.md create-bestax/latest 200 image/svg+xml
bestax-migrate/README.md bestax-migrate/latest 200 image/svg+xml
bestax-mcp/README.md bestax-mcp/latest 200 image/svg+xml
eslint-plugin/README.md @allxsmith/eslint-plugin-bestax/latest 200 image/svg+xml

For contrast, the same probe against main's copy of the badge returns 403 Forbidden from camo, while a shields.io badge in that same README returns 200. So the failure is specific to the old host and the fix clears it for every package, scoped names included.

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://e84b700a.bestax.pages.dev

The old `socket.dev/api/badge/...` path sits behind a Cloudflare bot
challenge, so GitHub's camo proxy gets a 403 interstitial back instead of
an SVG and the badge renders broken. `badge.socket.dev` is the host
Socket serves badges from, and camo is allowlisted for it.

Keep the `/latest` segment: it is the spelling every real-world usage
carries, and the one verified to return 200 image/svg+xml through camo
for @allxsmith/bestax-bulma.

Patch release so the README npm serves picks the fix up.
The old `socket.dev/api/badge/...` path sits behind a Cloudflare bot
challenge, so GitHub's camo proxy gets a 403 interstitial back instead of
an SVG and the badge renders broken. `badge.socket.dev` is the host
Socket serves badges from, and camo is allowlisted for it.

Keep the `/latest` segment: it is the spelling every real-world usage
carries, and the one verified to return 200 image/svg+xml through camo
for create-bestax.

Patch release so the README npm serves picks the fix up.
The old `socket.dev/api/badge/...` path sits behind a Cloudflare bot
challenge, so GitHub's camo proxy gets a 403 interstitial back instead of
an SVG and the badge renders broken. `badge.socket.dev` is the host
Socket serves badges from, and camo is allowlisted for it.

Keep the `/latest` segment: it is the spelling every real-world usage
carries, and the one verified to return 200 image/svg+xml through camo
for bestax-migrate.

Patch release so the README npm serves picks the fix up.
The old `socket.dev/api/badge/...` path sits behind a Cloudflare bot
challenge, so GitHub's camo proxy gets a 403 interstitial back instead of
an SVG and the badge renders broken. `badge.socket.dev` is the host
Socket serves badges from, and camo is allowlisted for it.

Keep the `/latest` segment: it is the spelling every real-world usage
carries, and the one verified to return 200 image/svg+xml through camo
for bestax-mcp.

Patch release so the README npm serves picks the fix up.
The old `socket.dev/api/badge/...` path sits behind a Cloudflare bot
challenge, so GitHub's camo proxy gets a 403 interstitial back instead of
an SVG and the badge renders broken. `badge.socket.dev` is the host
Socket serves badges from, and camo is allowlisted for it.

Keep the `/latest` segment: it is the spelling every real-world usage
carries, and the one verified to return 200 image/svg+xml through camo
for @allxsmith/eslint-plugin-bestax.

Patch release so the README npm serves picks the fix up.
Same host move as the package READMEs. The root README is not published
to npm (the root manifest is private), so this carries no release.

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deep review — 0 blocking · 2 advisory

# Severity Area Finding Location
1 🔵 Advisory Robustness Nothing in CI validates README badge URLs — check:urls reads only bulma-ui/llms.txt and bulma-ui/AGENTS.md, so a future Socket host or path change breaks the badge silently again scripts/check-pointer-urls.mjs:43
2 🔵 Advisory Robustness npm-side READMEs keep the broken badge until each package cuts its next release; acknowledged in the PR body and in #726, recorded here bulma-ui/README.md:10

Overall: The change is sound and narrowly scoped — six image URLs, link targets untouched, no executable path anywhere in the diff. Everything checkable offline holds: the six badge package names match the real manifests (@allxsmith/bestax-bulma, create-bestax, bestax-migrate, bestax-mcp, @allxsmith/eslint-plugin-bestax), a repo-wide grep finds no remaining socket.dev/api/badge reference outside these six lines, prettier --check on the six files is green, and the release claim in the PR body is accurate — all five publishable packages carry a { type: docs, release: false } rule in their release.config.js, so docs: genuinely ships no bump. The riskiest part is the one thing that cannot be settled from inside the repo: whether camo really gets 200 image/svg+xml back from badge.socket.dev/npm/package/<scoped>/latest. Confirming the rendered badge on main after merge is the only real acceptance test here.

Residual risk:

  • The 200-through-camo claim is unverified by me. This review environment has no network egress — both curl and WebFetch against the camo URL were blocked — so the central evidence in the PR could not be reproduced. What was confirmed instead: rendering the PR branch through GitHub itself (gh api -H "Accept: application/vnd.github.html" repos/allxsmith/bestax/readme?ref=docs/726-socket-badge-host) emits a camo URL whose hex payload decodes to exactly https://badge.socket.dev/npm/package/@allxsmith/bestax-bulma/latest, so the URL a reader browser will request is the intended one. Whether it answers 200 stays open until someone looks at the rendered README on main.
  • Recurrence stays undetected. Refuted as an introduced risk, open as a standing one: check:urls runs at ci.yml:118, but its FILES list is only bulma-ui/llms.txt and bulma-ui/AGENTS.md, and neither contains a Socket URL — so this diff cannot red that gate, and equally no gate would catch the badge breaking again. Pre-existing, and not worth adding a flaky third-party fetch to a required check, so it is noted rather than requested.
  • Stragglers. Refuted: a repo-wide grep for socket.dev, excluding node_modules and .git, returns exactly the six changed lines. No create-bestax template, skill, docs page, or workflow embeds a Socket badge.
  • Gate coverage for a markdown-only diff. Refuted as a real gap: no test or script consumes README badge content (the README rules in check-conformance cover the skills roster and install lines, not badges), and check:conformance was re-run here — every rule passes except version-regression, which fails only because this checkout is shallow with no reachable tags. That is an artifact of the review environment, not of the PR.
  • Scoped-name encoding. Open but low: @allxsmith/... is passed unencoded in the path, matching the @borfast/arrispwgen precedent cited in the issue. If the Socket router treated the scope slash differently the badge would 404 — which the same post-merge look at main catches.

🏄 Six mellow URL swaps, zero blast radius, and the homework was already done before this one hit the water — clean drop-in, no wipeout in sight. Just peek at the rendered README once it lands on main to be sure the wave actually broke.

@allxsmith
allxsmith force-pushed the docs/726-socket-badge-host branch from 39f6cc7 to 18aec08 Compare September 22, 2026 05:21
@allxsmith allxsmith changed the title docs: serve the Socket badges from badge.socket.dev fix: serve the Socket badges from badge.socket.dev Sep 22, 2026
@allxsmith

Copy link
Copy Markdown
Owner Author

Thanks — both advisories read fairly. Answering each, plus one thing the review correctly flagged as unverifiable.

#2 (npm-side READMEs stay broken until each package releases) — now fixed, not just acknowledged. That was true of the docs:-only version this review read. The PR has since been restructured into one fix(<scope>) commit per package, so merging cuts a patch for all five publishable packages and npm re-reads each README on publish. The review's note that { type: 'docs', release: false } means no bump was accurate at the time and is why the restructure was needed.

Because a package's analyzer carries { scope: '!(<pkg>)', release: false }, one commit can only release one package, so this is now six commits (five scoped fix, plus a docs: for the root README, whose manifest is private). Each touches exactly one file. It needs a merge commit rather than a squash, which the PR body now calls out.

#1 (nothing in CI validates badge URLs) — agreed, and agreed it should stay unrequested. check:urls covers bulma-ui/llms.txt and bulma-ui/AGENTS.md, neither of which carries a Socket URL. Putting a third-party image fetch behind a required check buys a flaky gate for a cosmetic failure, and the thing that actually broke here was a vendor-side host move that no assertion about our own strings would have caught. Leaving it noted.

On the residual risk the review could not settle. The review was right to hold the 200-through-camo claim open given it had no network egress. It has since been checked directly, and not by fetching the origin — by rendering each README at this branch's head through the GitHub API, extracting the camo URL GitHub itself generated, and fetching that. All six return 200 image/svg+xml, including both scoped names, which also closes the scoped-slash encoding question. The same probe against main's copy returns 403 Forbidden, while a shields.io badge in that same README returns 200. Full table is in the PR body.

That is as close to the post-merge acceptance test as can be run pre-merge, since camo is serving the real branch content. Still worth a glance at the rendered README on main afterwards.

@allxsmith

Copy link
Copy Markdown
Owner Author

deep-review: fresh

The file diff is byte-identical to the version last reviewed, but the commit structure is new and is the part worth the attention: five fix(<scope>) commits (one per publishable package) plus a docs: commit for the root README, replacing a single docs: commit.

Please focus on whether the release wiring actually does what the PR body claims:

  1. Does each fix(<scope>) commit cut exactly one patch, given every package's { scope: '!(<pkg>)', release: false } rule? Any package that would release twice, or not at all?
  2. Is the root README.md genuinely release-free under docs:, and is the root manifest being private the right reason?
  3. Does any commit touch a file outside its own package, which would attribute a change to the wrong release?
  4. Commitlint conformance on all six messages, including the scope gate on fix.
  5. Anything about this that breaks if it is squash-merged rather than merge-committed.

@github-actions

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://921b7436.bestax.pages.dev

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deep review — 0 blocking · 5 advisory

# Severity Area Finding Location
1 🔵 Advisory Correctness PR body: the squash warning is wrong in both mechanism and consequence — a default squash would use the unscoped PR title, which patch-releases all five packages, not one PR body, "Commit structure"
2 🔵 Advisory Correctness PR body: "the root manifest is private" is not what makes the docs: commit release-free — { type: 'docs', release: false } in all five configs is; the private root manifest is why the root README needs no release PR body, commit table
3 🔵 Advisory Robustness All five CHANGELOGs and GitHub releases will carry all five fix(…) lines — release-notes-generator sees the whole commit range, not the scoped subset eslint-plugin/release.config.js:70
4 🔵 Advisory Robustness #726 states "no release-triggering commit here"; this PR deliberately reverses that, so Closes #726 closes an issue whose text contradicts what shipped README.md:11
5 🔵 Advisory Robustness The 200 image/svg+xml through camo claim is still not reproducible from this environment — carried forward from the previous review bulma-ui/README.md:10

Overall: The release wiring does what the PR claims on questions 1–4, and I verified it against the installed @semantic-release/commit-analyzer@13.0.1 source rather than the configs' comments. Every commit touches exactly one file inside the package its scope names, commitlint is green on all six messages, and each publishable package cuts exactly one patch — none twice, none missed. The one thing to look at first is row 1: the "please merge, do not squash" instruction is defensible on changelog grounds but its stated reason is false, and it has no enforcement — the ruleset permits squash and commitlint runs only in the local commit-msg hook.

Question-by-question, with the evidence

1. Does each fix(<scope>) cut exactly one patch? — Yes.

Two facts from @semantic-release/commit-analyzer@13.0.1 decide it, and both hold:

  • lib/analyze-commit.js matches with isMatchWith(commit, rule, (object, src) => isString(src) && isString(object) ? micromatch.isMatch(object, src) : undefined). An unscoped commit parses to scope: null, which is not a string, so the customizer returns undefined and lodash falls back to strict equality against the glob string. { scope: '!(<pkg>)' } therefore cannot match an unscoped commit — exactly what each config's comment asserts.
  • index.js falls back to DEFAULT_RELEASE_RULES only under isUndefined(commitReleaseType). A custom rule returning false is not undefined, so release: false genuinely suppresses rather than leaking into the angular defaults.

So for package P, across the six commits: fix(P) matches { type: 'fix', scope: P, release: 'patch' }; the other four fix(X) match { scope: '!(P)', release: false }; docs: matches { type: 'docs', release: false }. analyzeCommits reduces to one aggregate release type per run, so a package cannot release twice from one push regardless of how many commits say patch.

Ordering is right too, and it matters here because all five fire at once: ci.yml runs bulma-ui first and eslint-plugin last, so every workspace:^ on @allxsmith/bestax-bulma is rewritten at pack time against the new bulma-ui version.

2. Is the root README.md release-free? — Yes, for a stronger reason than the body gives.

package.json:4 is "private": true, there is no root release.config.js, and ci.yml's publish job has a semantic-release step for the five packages and none for the root. But none of that is what makes the commit release-free: { type: 'docs', release: false } matches in all five configs regardless of scope, and that is the operative rule. The private root manifest explains why the root README needs no release (it is never published to npm), not why the commit triggers none. Conclusion correct, reason conflated — row 2.

3. Does any commit touch a file outside its own package? — No.

18aec086 docs:                  README.md
15d4d9b4 fix(eslint-plugin):    eslint-plugin/README.md
2fe0a456 fix(bestax-mcp):       bestax-mcp/README.md
1cd6dabe fix(bestax-migrate):   bestax-migrate/README.md
d473c07c fix(create-bestax):    create-bestax/README.md
fa03c7e4 fix(bulma-ui):         bulma-ui/README.md

File attribution is clean. Changelog attribution is not, and that is row 3: release-notes-generator is handed the whole commit range, not the scoped subset — the mechanism eslint-plugin/release.config.js documents and bestax-migrate/CHANGELOG.md demonstrates, where the top ### Bug Fixes block is a run of **bulma-ui:** entries. So each of the five changelogs gets all five fix(…) lines. Pre-existing and accepted; this structure is simply the maximal case of it.

4. Commitlint on all six? — Green.

pnpm exec commitlint --from e38c1ca --to 18aec086 reports found 0 problems, 0 warnings for each. The five fix scopes are all in RELEASE_SCOPES; docs is not in RELEASE_TYPES, so release-scope-required returns [true] before the scope gate is reached. Headers are well inside 100 chars and bodies wrap at ~72.

5. What breaks under a squash? — Not what the body says.

gh api repos/allxsmith/bestax returns squash_merge_commit_title: COMMIT_OR_PR_TITLE. With six commits that resolves to the PR title, not a commit title — so the squash header would be fix: serve the Socket badges from badge.socket.dev (#729), unscoped. Per the mechanism in question 1, an unscoped fix matches no custom rule in any of the five configs, falls through to the angular defaults, and yields patch for all five packages. That is the fall-through commitlint.config.js already documents in its header comment.

So a default squash ships five patches, same as the merge commit. What it costs is the scoped changelog lines, replaced by one unscoped line in all five. Prefer the merge commit for that reason — but the body's "only one scope would survive" is false, and so is the implied risk of a package missing its release.

Worth knowing alongside it: nothing enforces the request. The main ruleset lists allowed_merge_methods: ["merge","squash","rebase"], and commitlint lives only in the husky commit-msg hook — no CI job lints a merge or squash header.

Residual risk:

  • A package releasing twice, or not at all. Refuted. analyzeCommits reduces the range to a single release type per run, so duplication is not reachable; and the publish job's only gate is github.event_name == 'push' && github.ref == 'refs/heads/main' with needs: build-and-test, which both a merge commit and a squash satisfy. @allxsmith/eslint-plugin-bestax@1.0.0 and @1.0.1 tags exist, so its first-release unbounded-range case (the one release.config.js guards with successCommentCondition: false) is not in play here either.
  • Stale badge URLs elsewhere. Refuted: a repo-wide grep -rn socket.dev excluding node_modules/.git returns exactly the six changed lines — no template, skill, docs page, workflow, or generator embeds one. No generator writes a README.
  • The published MCP index stamped a patch behind. Refuted as harmful: bestax-mcp publishes at step 4 while the Regenerate the MCP index restamp runs last, so this run's tarball carries generatedFrom.version one bulma-ui patch behind. The server's drift warning fires on minor or major only — patch drift is silent by design.
  • Markdown-only gates. prettier --check on the six files is green here. pnpm check:conformance I could not execute in this environment; nothing in check-conformance.mjs matches badge, shields.io, or socket, so the rules that could bite this diff do not exist.
  • The camo 200. Open, unchanged from the last review. Rendering the branch through GitHub (gh api -H "Accept: application/vnd.github.html" .../readme?ref=docs/726-socket-badge-host) yields a camo URL whose hex payload decodes to exactly https://badge.socket.dev/npm/package/@allxsmith/bestax-bulma/latest, and the old camo digest on main is 617b6c75… — the same one #726 quotes, so the issue's evidence is genuine. Fetching either digest was blocked here. Looking at the rendered README on main after merge is still the only acceptance test.

🏄 Same six mellow URL swaps, but the commit structure got a proper tune-up — five clean scoped patches, one per board, and every one of them lands. Only thing off is the squash warning in the body: squashing wouldn't wipe you out, it'd just hand all five the same unscoped tag line. Merge it the usual way and paddle out.

@allxsmith

Copy link
Copy Markdown
Owner Author

Good review. Rows 1, 2 and 4 were real errors on my side and are fixed; 3 and 5 are answered. Nothing left open that I can see.

Row 1 — the squash warning was wrong. Corrected. I checked the mechanism against the installed @semantic-release/commit-analyzer@13.0.1 rather than taking it on trust, and it holds exactly as described. lib/analyze-commit.js matches with isMatchWith(commit, rule, (object, src) => isString(src) && isString(object) ? micromatch.isMatch(object, src) : undefined), so an unscoped commit's scope: null makes the customizer return undefined, lodash falls back to strict equality, and { scope: '!(<pkg>)' } cannot match it. index.js:64 then falls through to DEFAULT_RELEASE_RULES on isUndefined, where angular's fix is a patch. Combined with squash_merge_commit_title: COMMIT_OR_PR_TITLE resolving to the unscoped PR title at six commits, a squash ships five patches, not one.

The PR body now says that, states the real cost (five identical unscoped changelog lines instead of five scoped ones), and notes that nothing enforces the choice anyway since the ruleset permits all three methods and commitlint only runs in the local commit-msg hook. Thanks for catching it — "please merge, do not squash" was overstating a changelog preference as a correctness risk.

Row 2 — reason conflated. Corrected. The table now attributes the docs: commit's release-free status to { type: 'docs', release: false } matching in all five configs, with the private root manifest given as the separate reason the root README needs no release of its own.

Row 4 — issue text contradicted what ships. Fixed. #726 was written before the patch-release decision and still said "no release-triggering commit here". Its npm section now carries the reversal explicitly, so Closes #726 no longer closes an issue arguing the opposite.

Row 3 — accepted, no action. All five CHANGELOGs carrying all five fix(…) lines is release-notes-generator seeing the whole range, which bestax-migrate/CHANGELOG.md already demonstrates. Pre-existing and not something this PR should try to solve; it is now noted in the body so it is not a surprise at release time.

Row 5 — verified, just not from your sandbox. The camo 200 is confirmed, and not by fetching the origin, which is the part that cannot work: Cloudflare challenges any scripted client, which is why the old and new hosts look identical to curl from here. The probe that answers it renders each README at this branch's head through the GitHub API, extracts the camo URL GitHub itself generated, and fetches that. All six return 200 image/svg+xml, both scoped names included, which also closes your scoped-slash encoding question. The same probe against main returns 403 Forbidden while a shields.io badge in that same README returns 200.

Useful confirmation in your review that the 617b6c75… digest you decoded matches the one #726 quotes — that independently establishes the issue's evidence is genuine even though you could not fetch it.

CI is green on 18aec086: 24 passing, 0 failing.

@allxsmith

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@allxsmith
allxsmith merged commit 32703f6 into main Sep 22, 2026
42 checks passed
@allxsmith
allxsmith deleted the docs/726-socket-badge-host branch September 22, 2026 11:36
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 5.16.7 🎉

The release is available on:

Your semantic-release bot 📦🚀

@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 4.2.10 🎉

The release is available on:

Your semantic-release bot 📦🚀

@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 2.3.8 🎉

The release is available on:

Your semantic-release bot 📦🚀

@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 1.2.7 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Socket badges are broken: move the image URL to badge.socket.dev

1 participant