chore(release-skill): tighten Rust-crates count and commit-list truncation#276
Merged
Conversation
…ation - Rust crates count now specifies exactly which Cargo.toml files are in scope (workspace members only, not templates or clones). v0.15.0 and v0.15.1 shipped '7 Rust crates' because the rule was vague; v0.16.0 correctly shows 2 but the drift shouldn't rely on luck. - @@COMMIT_LIST scaling table now documents a 42-char subject cap for the ≤13 case. Previously only 14-26 and ≥27 had explicit truncation rules, forcing renderers to hand-pick a cap that fits the 444px B2 panel.
…per release Every release until v0.16.0 (#275) produced /tmp/render_cover.py, /tmp/render_chain.py, /tmp/render_notes.py, /tmp/render_manifest.py, /tmp/render_pr_body.py as scratch files with hardcoded scalars (VERSION, commit lists, RPC values). That wastes work, drifts from the data contracts in covers/*.data.md, and — more importantly — hardcoded VERSION strings are fabricated values, violating the skill's own "no fabricated values" rule. render.py with argparse subcommands replaces that pattern: cover Runs the full cover.data.md contract: computes every scalar from git, generates the 6 variable-count fragments (COMMIT_LIST, DAILY_TIMELINE, CONTRIBUTOR_LIST, BAR_CHART, COMMIT_TYPES, REPO_STATE) per documented scaling rules, xmllint + zero-unresolved assertions. cover-chain Walks endpoint primary -> fallbacks (User-Agent header added so rpc.polkadot.io stops 403-ing on Python's default UA), executes the one-shot capture sequence, writes nothing + exit 0 if all endpoints fail (per the "never fabricate, never cache-reuse" rule). notes, manifest, pr-body Scalar tokens come from args (what the skill already decided) and git shortstat; narrative markers come from --summary-file / --whats-new-file / --commits-file / --breaking-file so the LLM-authored prose stays separate from deterministic rendering. Also fixed in SKILL.md: - Phase 4 commit subject was `chore(release): vX.Y.Z` but COMMIT_CONVENTIONS.md says it MUST be `Release v{VERSION}` (caught during v0.16.0 cut — the downstream regex `^Release v[0-9]+\.[0-9]+\.[0-9]+ \(#[0-9]+\)$` would not have matched the squashed commit; PR title rescued the squash subject by luck). - All 3c/3d/3g sections now show the render.py invocation instead of prescribing "compute scalars + substitute + validate" in prose. - Cover-chain skip path is now explicit ("renderer exits 0 and writes nothing; omit the footer embed"). End-to-end tested: manifest, cover-chain (live RPC), cover (local git), notes, pr-body all produce xmllint-clean / yaml-valid outputs with zero unresolved tokens.
Drift check on the chore/improve-release-skill branch flagged that hero-dark.svg and hero-light.svg still embed v0.15.1 in the caption line, while Cargo.toml on master is now 0.16.0 post-release. The v0.16.0 release PR (#275) did not regenerate the brand assets after bumping the workspace version, so this branch picks up the drift on rebase. Regenerated via generate.sh; the only diff is the version string in the caption.
4012509 to
fd51621
Compare
This was referenced Apr 20, 2026
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.
Summary
Three clarifications to the
/releaseskill, caught while cutting v0.16.0 (#275).What's changing
1.
render.py— stop generating Python scripts per releaseEvery release until v0.16.0 produced
/tmp/render_cover.py,/tmp/render_chain.py,/tmp/render_notes.py,/tmp/render_manifest.py,/tmp/render_pr_body.pyas one-off scratch files with hardcoded scalars (VERSION strings, commit lists, RPC-captured values) re-typed each release. That's wasteful and — more importantly — hardcodedVERSION = "0.16.0"literals are fabricated values, violating the skill's own "no fabricated values" rule..claude/skills/release/render.pynow ships as the single committed renderer with argparse subcommands:covercover.data.mdcontract: scalars from git, 6 variable-count fragments per the documented scaling rules,xmllint+ zero-unresolved assertions.cover-chainrpc.polkadot.iowas 403'ing Python's default UA), runs the one-shot capture, writes nothing + exit 0 if every endpoint fails (per the "never fabricate, never cache-reuse" rule).notes,manifest,pr-bodygit diff --shortstat; narrative markers from--summary-file/--whats-new-file/--commits-file/--breaking-fileso LLM-authored prose stays separate from deterministic rendering.End-to-end tested: all 5 subcommands produce xmllint-clean / yaml-valid outputs with zero unresolved tokens.
SKILL.mdnow shows therender.py ... --out ...invocation in each render section instead of prescribing the substitution pipeline in prose.2. Fix wrong commit subject in
SKILL.mdPhase 4Phase 4 told the skill to commit with
chore(release): vX.Y.Z, butCOMMIT_CONVENTIONS.mdsays the subject must beRelease v{VERSION}— the downstream tag regex^Release v[0-9]+\.[0-9]+\.[0-9]+ \(#[0-9]+\)$matches squash-merged commits on master. During the v0.16.0 cut I followed SKILL.md and committedchore(release): v0.16.0; only the PR title rescued the squash subject toRelease v0.16.0 (#275). Fixed.3.
Rust cratescount is now unambiguous (from the earlier commit on this branch)The old rule — "count
[package]sections across workspace Cargo.toml files" — was vague enough that v0.15.0 and v0.15.1 shipped 7 Rust crates even though the live workspace has only two members (dot/sdk+dot/cli). v0.16.0 correctly shows 2 because I interpreted the rule strictly, but the drift shouldn't depend on the renderer's judgment. The new rule is explicit about scope (workspacemembersonly, not templates, not clones) and pins the expected answer so future drifts are obvious.render.py cmd_coverparsesmembers = [ … ]directly, matching the documented rule.4.
@@COMMIT_LIST≤13 case now has a truncation capThe scaling table previously specified truncation for 14–26 commits (
32 chars + …) and ≥27 commits, but said nothing for ≤13 commits. The B2 terminal panel is 444 px wide at font-size 10 (monospace), which fits about 46 chars after the│ {sha} {icon}prefix. Addedsubject truncated to 42 chars with …. Matches what v0.15.1 and v0.16.0 already did by eyeballing, and whatrender.pynow enforces.Test plan
cover.data.mdrule changes read correctlyrender.pysyntax +--helpparserender.py manifestproduces valid YAMLrender.py cover-chainhitsrpc.polkadot.io(UA header works) and renders a 15 KB SVG, xmllint-cleanrender.py coverrenders against live git range (v0.15.1..HEAD), xmllint-clean, zero unresolvedrender.py notessubstitutes scalars + reads marker filesrender.py pr-bodycomputes stats fromgit diff --shortstat, embeds{{HEAD_SHA}}-pinned cover URLSKILL.mdPhase 4 now usesRelease vX.Y.Zsubject per conventionsrender.pyend-to-end