Skip to content

docs: fold the #476 syndication and skill-sync lessons into the CLAUDE.md files - #477

Merged
allxsmith merged 2 commits into
mainfrom
docs/claude-md-lessons-from-476
Aug 5, 2026
Merged

allxsmith merged 2 commits into
mainfrom
docs/claude-md-lessons-from-476

Conversation

@allxsmith

@allxsmith allxsmith commented Aug 5, 2026 •

Copy link
Copy Markdown
Owner

Guideline updates mined from the #476 (flagship post, PR #476) session. Every item corrects a rule that was wrong, missing, or session-only knowledge; future contributors' agents and both AI reviewers read these files as ground truth.

Lesson → edit

  • Syndicated posts are plain markdown throughout (docs/blog/CLAUDE.md): the JSX warning was scoped to cover images only. Generalized: no JSX, no ::: admonitions, plain fences instead of <PackageManagerTabs>. Retires a CodeRabbit false positive on docs: add the fighting AI training bias agent skills post #476, which cited the docs-tree rule.
  • Scoped the <PackageManagerTabs> rule to docs-tree pages (docs/CLAUDE.md), pointing at the blog syndication section for the exception.
  • Generated LLM artifacts are not routes (docs/blog/CLAUDE.md links bullet): /llms.txt, /llms-full.txt, and .md twins must be linked fully qualified; root-relative fails onBrokenLinks: 'throw' and the dev.to rewriter only covers /docs + /blog. Retires the second CodeRabbit false positive.
  • File naming for syndicated image posts (docs/blog/CLAUDE.md): the old rule ('folder form when the post ships images') steered syndicated posts into build/.devto-publish/<basename> collisions (every folder post emits index.md). Now: syndicated posts stay flat with /img/<slug>* assets; folder form is for never-syndicated posts (State of React keeps it).
  • canonical_url is slug-based (docs/blog/CLAUDE.md): generalized out of the State of React runbook; child issues kept speccing the legacy date-path form.
  • Section images + alt-text style (docs/blog/CLAUDE.md): same 1200x630 contract per in-body image, PNG embeds except the top banner, long-literal alt text mirrored into aria-label (previously undocumented house pattern).
  • sync-skills.mjs copies an allowlist, not skills/ (create-bestax/CLAUDE.md): the old bullet's claim was false. Documented the silent failure modes (unlisted skill never bundles, delisted skill vanishes, success line reports array length either way, no CI drift check) and the rosters that must stay in agreement. Policy stays neutral pending [Bug] Settled: create-bestax bundles the bestax-migrate skill; two docs still say otherwise #385.
  • New 'Adding a skill' checklist (skills/CLAUDE.md): every roster to update in the same PR (SKILLS allowlist + scaffolded CLAUDE_MD template when bundling, README's three hardcoded rosters, docs skills pages).
  • De-staled bestax-migrate/CLAUDE.md: it said the skill is 'deliberately not bundled... keep sync-skills.mjs untouched', which has been false since feat(bulma-ui): ship agent-discovery files in the npm tarball #345. Now states the contested reality and defers to [Bug] Settled: create-bestax bundles the bestax-migrate skill; two docs still say otherwise #385.
  • New docs/scripts/pixel-cover-lib.mjs: the reusable pixel-art core behind the five docs: add the fighting AI training bias agent skills post #476 covers (5x7 font, house palette, canvas/bevel/starfield helpers), so the five remaining blog-revival posts can script covers instead of rebuilding tooling. Referenced from the blog runbook's cover section. Smoke-tested end to end: a demo scene generated through the lib passes rasterize-cover.mjs's contract check.

Verified

pnpm lint (covers docs/scripts), pnpm format:check, and the docs production build all green; lib output accepted by the rasterizer.

Follow-up (not in this PR)

A conformance check comparing the SKILLS allowlist against skills/* directories (scripts/check-conformance.mjs) would turn the silent bundling drift into a CI failure — best landed together with the #385 policy decision.

Summary by CodeRabbit

  • Documentation
    • Clarified which skills are included when creating a new project and how skill lists stay synchronized.
    • Updated release guidance to reflect current skill bundling.
    • Clarified where package-manager tabs may appear in documentation.
    • Expanded blog publishing guidance for syndicated and non-syndicated posts, including canonical links, installation commands, images, accessibility text, and formatting requirements.
  • Chores
    • Added shared tooling to support consistent pixel-art cover generation for documentation content.

…E.md files

PR #476's review surfaced rules that lived only in session context: two
CodeRabbit nitpicks were false positives sourced from the guideline files
(PackageManagerTabs in a syndicated post; root-relative links to generated
LLM artifacts), the blog runbook steered syndicated image posts into the
.devto-publish basename collision, and the skill-bundling docs claimed
sync-skills.mjs copies all of skills/ when it copies a hardcoded allowlist.
States the bundling mechanism neutrally and leaves the bestax-migrate
policy to #385. Also extracts the pixel-cover core (font, palette, canvas
helpers behind the #476 covers) into docs/scripts/pixel-cover-lib.mjs for
future covers.
Copilot AI balanced review requested due to automatic review settings August 5, 2026 02:24

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@coderabbitai

coderabbitai Bot commented Aug 5, 2026 •

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@allxsmith, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 27 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: cf397db6-b02c-4a55-a3a4-4464d82fbbbe

📥 Commits

Reviewing files that changed from the base of the PR and between c845007 and bfd2586.

📒 Files selected for processing (2)
  • create-bestax/CLAUDE.md
  • docs/scripts/pixel-cover-lib.mjs

Walkthrough

The PR updates documentation for skill bundling and syndicated blog posts. It also adds a reusable pixel-art SVG cover library with deterministic rendering, pixel text, beveled shapes, accessibility output, and starfield generation.

Changes

Skill bundling guidance

Layer / File(s) Summary
Bundling policy and contributor rosters
create-bestax/CLAUDE.md, skills/CLAUDE.md, bestax-migrate/CLAUDE.md
Documents SKILLS allowlist behavior, roster update requirements, and the current bestax-migrate packaging policy.

Blog publishing and cover tooling

Layer / File(s) Summary
Syndicated blog rules
docs/blog/CLAUDE.md, docs/CLAUDE.md
Defines Markdown, frontmatter, canonical URL, asset, link, component, image, and rasterization rules for syndicated posts.
Pixel cover rendering API
docs/scripts/pixel-cover-lib.mjs
Adds deterministic pixel-art rendering with shared dimensions and colors, pixel text, beveled shapes, SVG accessibility output, and seeded starfields.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested labels: documentation, deep-review

Suggested reviewers: copilot

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the primary documentation changes based on lessons from PR #476.
Description check ✅ Passed The description clearly explains the documentation and tooling changes, verification results, and deferred follow-up work.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs/claude-md-lessons-from-476

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.

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://29a045bb.bestax.pages.dev

@coderabbitai coderabbitai 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.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@create-bestax/CLAUDE.md`:
- Around line 25-27: Update the checklist in create-bestax/CLAUDE.md to include
the scaffolded-app roster, specifically create-bestax/src/constants.ts and its
CLAUDE_MD template, alongside the existing allowlist, skills README, and
documentation roster requirements.

In `@docs/scripts/pixel-cover-lib.mjs`:
- Around line 256-264: Update Canvas.svg() to XML-escape ariaLabel before
interpolating it into the SVG’s aria-label attribute, including at least
ampersands and quotes (and other attribute-sensitive characters as appropriate).
Preserve the existing SVG structure while ensuring labels containing special
characters serialize as valid XML for rasterize-cover.mjs.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 43bd93a4-0dda-476e-814b-50460bdca9fa

📥 Commits

Reviewing files that changed from the base of the PR and between 8784762 and c845007.

📒 Files selected for processing (6)
  • bestax-migrate/CLAUDE.md
  • create-bestax/CLAUDE.md
  • docs/CLAUDE.md
  • docs/blog/CLAUDE.md
  • docs/scripts/pixel-cover-lib.mjs
  • skills/CLAUDE.md

Comment thread create-bestax/CLAUDE.md Outdated
Comment thread docs/scripts/pixel-cover-lib.mjs

@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 · 1 advisory

# Severity Area Finding Location
1 🔵 Advisory Robustness svg(ariaLabel) interpolates the alt string raw into aria-label="…"; an alt containing &, ", or < (e.g. "colors & branding") emits malformed XML — caught by the rasterizer's parse check, but with a misleading "did not parse as an SVG document" message. docs/scripts/pixel-cover-lib.mjs:258

Overall: The change is sound and lands mostly-documentation with one new helper. I verified every ground-truth claim against source rather than taking the PR body's word: the SKILLS allowlist in sync-skills.mjs (7 entries incl. bestax-migrate), its emptyDir + SKILLS.length success line, the README's three hardcoded rosters (lines 20/33/86), docs/docs/skills/intro.md, the CLAUDE_MD skill roster in constants.ts, the absent conformance check, and the dev.to rewrite scope (/(?:docs|blog)/ regex at devto-preprocessor.js:189) all match the prose exactly. The riskiest part is the new pixel-cover-lib.mjs, but it emits SVG that satisfies the rasterize-cover.mjs contract by construction (literal 1200x630, matching viewBox, opaque full-bleed bg rect), and its font table / helpers are pure axis-aligned rects. The human should focus on the advisory below only if a future cover's alt text is expected to carry &/".

Residual risk:

  • A doc claim silently drifts from code — refuted: I re-derived each of the six factual claims from the actual files (allowlist, rosters, conformance absence, rewrite regex) and all agreed.
  • The lib emits SVG that fails the rasterize gate — refuted for the normal path: the svg() output hard-codes width/height/viewBox and paints PALETTE.bg (opaque, no fill-opacity) as the first rect, exactly what the contract at rasterize-cover.mjs:83-144 checks. The only way it fails is the advisory's special-char case, and that fails loud (gate refuses), never shipping a broken PNG.
  • Silently-broken accessibility label — refuted: the breaking characters (&/"/<) make the SVG unparseable, so the rasterizer rejects it before the cover ships; there is no path where a truncated aria-label reaches production.

🏄 Pure glassy conditions on this one, dude — it's mostly doc cleanup that actually matches the code for once, and the little pixel-art lib paddles right into the rasterizer's contract without a wipeout. Only ripple is unescaped & in alt text, and even that just bails you at the gate instead of dragging you under. Ship it. 🌊

Copilot AI review requested due to automatic review settings August 5, 2026 02:57

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Preview Deployment

Preview URL: https://4a2b4e2b.bestax.pages.dev

@allxsmith
allxsmith merged commit 54b78cd into main Aug 5, 2026
54 checks passed
@allxsmith
allxsmith deleted the docs/claude-md-lessons-from-476 branch August 5, 2026 03:08
@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 5.8.1 🎉

The release is available on:

Your semantic-release bot 📦🚀

@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 4.0.2 🎉

The release is available on:

Your semantic-release bot 📦🚀

@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 1.0.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

@bestax-release-bot

Copy link
Copy Markdown

🎉 This PR is included in version 2.0.1 🎉

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.

2 participants