Skip to content

Stricter lint rules, unused-code checks, editor and Git defaults, and a weekly link check - #180

Merged
lwwmanning merged 9 commits into
mainfrom
wm/tooling-review-304a70
Nov 4, 2026
Merged

lwwmanning merged 9 commits into
mainfrom
wm/tooling-review-304a70

Conversation

@lwwmanning

@lwwmanning lwwmanning commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

This PR does the items from the tooling backlog that still help.

  • Biome: thirteen rules are now errors for both sites. Only noImgElement stays off. The PR removes 192 non-null assertions, moves CSS rules to fix 13 specificity findings, and adds a reason comment at each deliberate exception.
  • knip finds unused files, exports, and dependencies. CI runs it.
  • New .editorconfig, .gitattributes, and PR template.
  • New links.yml: lychee checks the blog's external links each week. It is not a required check.
  • The PR removes the Tailwind leftovers and updates the README.

The first comment has the decision for each backlog item.

🤖 Generated with Claude Code

Set noExplicitAny, noArrayIndexKey, noAssignInExpressions,
noShadowRestrictedNames, useImportType, noParameterAssign,
useExhaustiveDependencies, noForEach, noUselessFragments, and
noDangerouslySetInnerHtml to error for both sites. Fix the eight findings
in code, and mark the nine deliberate uses with a biome-ignore comment
that gives the reason. CLAUDE.md lists the four rules that stay off, with
the findings each would raise.

Signed-off-by: Will Manning <will@willmanning.io>
…g notes

.editorconfig gives LF, UTF-8, and 2-space defaults to the files Biome does
not format. .gitattributes stores text with LF endings, keeps the license
texts unchanged, and marks bun.lock as generated and src/vendor as
vendored. The PR template asks for the DCO sign-off, check:ci, and a REUSE
annotation for each new asset.

Remove what Tailwind left behind (the VS Code extension and settings, the
Renovate group, and stale notes), add the license to package.json, and
bring the README up to date: Bun 1.4, Node 26, bench, and the test scripts.

Signed-off-by: Will Manning <will@willmanning.io>
links.yml runs lychee (lychee-action v2.9.0, pinned by SHA) on the blog
posts and on the posts from other sites that the blog index lists. It runs
weekly, on a PR that changes src/content, and by hand. It is not a required
check. LinkedIn and the ACM Digital Library block automated requests, so the
check skips them.

Signed-off-by: Will Manning <will@willmanning.io>
@vercel

vercel Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
vortex Ready Ready Preview Nov 4, 2026 7:27am UTC

Request Review

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-11-04T07:30:16.807216Z b7c2a0c Manual request
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@lwwmanning

lwwmanning commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor Author

Assessment of the tooling backlog (2026-11-04)

Item Decision Reason
husky and lint-staged Not now (recommendation only) CI runs check:ci on every PR, and .vscode formats on save with Biome. A hook needs two new dev dependencies. If wanted later, biome check --staged in a committed .githooks/pre-commit (enabled with git config core.hooksPath .githooks) needs no dependency. Trigger: outside contributors' PRs fail check:ci often.
Tighten Biome rules Done On, at error: noExplicitAny (1 finding), noArrayIndexKey (2, both deliberate), noAssignInExpressions (2), noShadowRestrictedNames (1), useImportType (0; was warn, which does not fail CI), noParameterAssign (0), useExhaustiveDependencies (0 on the site; bench had it on), noForEach (4), noUselessFragments (0), noDangerouslySetInnerHtml (7, all deliberate). Added later in this PR: noNonNullAssertion (192 fixed; tests use a new defined() helper), noDescendingSpecificity (13 fixed by moving CSS rules; every element's computed style on bench's pages is the same before and after), and noImportantStyles for bench (3, each with a reason). Still off: noImgElement (5; SVG and small PNG logos).
.editorconfig Done Defaults for Markdown, YAML, SQL, shell, and Python, which Biome does not format. Biome output does not change.
.gitattributes Done LF endings, bun.lock as generated, src/vendor as vendored, license texts unchanged. No file needed renormalizing.
PR template Done DCO sign-off, check:ci, and REUSE annotations for new assets.
Image pipeline Not needed now The largest raster image is 32 kB (src/assets/logos/hudi.png). No blog post has an image. Trigger: a raster image over 200 kB, or a post with screenshots.
External link checker Done 97 unique external URLs in the blog and links.ts. Today 96 return 200; the ACM Digital Library returns 403 to bots and is excluded. The 32 posts on other sites are the most likely to disappear. Weekly, not required.
ci.yml audit comment Obsolete @lhci/cli is gone, and the audit job has no --ignore flags. The comment is correct now.
Stale CLAUDE.md Obsolete CLAUDE.md was refreshed. This PR fixes one Tailwind mention and the lint section.
Missing LICENSE Obsolete LICENSE (Apache-2.0) and REUSE.toml exist. This PR adds "license": "Apache-2.0" to package.json.

New gaps found:

Item Decision Reason
Tailwind leftovers Done .vscode recommended the Tailwind extension, renovate.json had a Tailwind group, and a verify.ts comment named Tailwind classes.
README out of date Done It gave Bun 1.3 and Node 22 (now 1.4 and 26), did not mention bench, and did not list test or test:bench.
Unused files and exports (knip) Done knip 6.43.0 is a dev dependency (past the 7-day cooldown, no install scripts). knip.json names the entry points. It found 9 exports and 10 types used only in their own file, and 2 types not used at all. CI runs it after the build.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2eed03774b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread .github/workflows/links.yml Resolved
@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

🔦 Lighthouse audit

URL Perf A11y Best practices SEO
/ 🟢 100 🟢 100 🟢 100 🟢 100
/bench 🟢 100 🟢 100 🟢 100 🟢 100
/bench/chart/ct.eyJrIjoiQ29tcHJlc3Npb25UaW1lIiwiZGF0YXNldCI6ImFyYWRlIiwiZGF0YXNldF92YXJpYW50IjpudWxsfQ 🟢 100 🟢 100 🟢 100 🟢 100
/blog 🟢 100 🟢 100 🟢 100 🟢 100
/blog/btrblocks-compressor 🟢 100 🟢 100 🟢 100 🟢 100

Run 41792401007 · 2026-11-04 07:29 UTC

lychee skips a file whose extension is not in its extension list, even
when the file is named on the command line, and the default list has no
ts. Pass --extensions mdx,ts.

Signed-off-by: Will Manning <will@willmanning.io>
The previous commit said lychee skipped links.ts. It did not: the link
check counted 106 links both before and after --extensions mdx,ts, and the
files hold about 100, 32 of them in links.ts. lychee 0.24.2 checks a file
named on its command line whatever the extension. Keep the flag, and say
what it does.

Signed-off-by: Will Manning <will@willmanning.io>
Turn on noDescendingSpecificity and noImportantStyles for both sites.

The 13 descending-specificity findings are fixed by moving rules, with no
change to any computed style: a check of every element on bench's landing,
chart, and methodology pages (with and without JavaScript) found the same
styles before and after. Each move passes no rule that sets the same
property at the same specificity on the same element. The later
.group-summary corner rule repeated the base rule's value, so it is gone.

bench's three !important declarations stay, each with a biome-ignore that
gives the reason: two beat Chart.js's inline canvas size, and one hides
controls that need JavaScript.

Signed-off-by: Will Manning <will@willmanning.io>
Production code now handles a missing value where it could occur: an
anchor falls back to the group's own, a rank lookup uses Object.hasOwn
with a fallback, and the query helpers default an absent row. mapLimit's
workers now share one iterator over the items.

Tests use a new helper, defined() in src/lib/defined.ts, which throws
with a message when a value is null or undefined, in place of `!`.

Signed-off-by: Will Manning <will@willmanning.io>
knip reports unused files, exports, and dependencies. knip.json names
the entry points that no import reaches: the Lighthouse, velite, and
bench PostCSS configs, and the scripts that CI or a person runs. It
skips the vendored design-system renderer.

Nine exports and eight exported types were used only in their own
file, so they are no longer exported. Two types were not used at all,
so they are gone. The GPU result's Parquet times now take their length
from PARQUET_CONFIGS, the list they were documented to follow.

CI runs `bun run knip` after the build, because knip resolves
`#site/content` to .velite/, which the build writes.

Signed-off-by: Will Manning <will@willmanning.io>
CLAUDE.md now says which rules are on, how tests replace non-null assertions, how a CSS reorder is checked, and where knip's entry points go. The README lists `bun run knip`.

Signed-off-by: Will Manning <will@willmanning.io>
@lwwmanning lwwmanning changed the title Stricter lint rules, editor and Git defaults, a PR template, and a weekly link check Stricter lint rules, unused-code checks, editor and Git defaults, and a weekly link check Nov 4, 2026
@lwwmanning

Copy link
Copy Markdown
Contributor Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Already looking forward to the next diff.

Reviewed commit: b7c2a0ccf5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@lwwmanning
lwwmanning merged commit bc381a8 into main Nov 4, 2026
22 checks passed
@lwwmanning
lwwmanning deleted the wm/tooling-review-304a70 branch November 4, 2026 07:32

This branch was successfully deployed

1 active deployment
Preview — b7c2a0cc Deployed Nov 4, 2026 by vercel[bot]
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.

1 participant