Affected
.claude/skills/release/SKILL.md § 3.5 (marketing-site version bump) + its durable guard .claude/hooks/tests/test_site_counts.sh.
Given / When / Then
Given /release § 3.5 lists seven version strings in site/index.html that must move with each cut (JSON-LD softwareVersion + dateModified, hero pill apexyard vX.Y, hero link text + href, releases-shipped count + range),
When v3.0.0 was cut,
Then only a subset was bumped — the hero pill (~L1568) still reads apexyard v2.2, and the releases-shipped metric (~L1696) still reads 12 / (v0.1 → v2.2) (CHANGELOG now has 14 release entries and the line is v3.0.0). The site advertises v2.2 in the badge while the hero link beside it says v3.0.0.
The drift went unnoticed because the durable guard test_site_counts.sh asserts only the JSON-LD softwareVersion against the CHANGELOG top entry. The other six § 3.5 locations — pill, dateModified, link text/href, count, range — are unguarded, so they can drift while CI stays green. § 3.5 itself even claims "the drift can no longer accumulate silently," but that guarantee only holds for one of the seven strings.
Repro
- Cut a release where the agent bumps
softwareVersion + the hero link but misses the pill / metric (easy — § 3.5 relies on the operator hand-applying 7 separate edits).
- CI
site-counts-check.yml → test_site_counts.sh passes (it only checks softwareVersion).
- The site ships with a stale badge (observed at v3.0.0: pill
v2.2, metric 12 / (v0.1 → v2.2)).
Framework version
v3.0.0
Severity
major — public marketing site advertises the wrong version next to the correct one; the documented "durable guard" gives false confidence because it covers 1 of 7 strings.
Notes
- Suggested fix: extend
test_site_counts.sh to also assert (a) the hero pill apexyard vX.Y and (b) the releases-shipped range (v0.1 → vX.Y) against the CHANGELOG top entry's major.minor, and (c) the releases-shipped count against grep -cE '^## \[[0-9]' CHANGELOG.md. That brings the guarded set up to match § 3.5's promise. Optionally, replace the 7 hand-edits with a single deterministic bump helper invoked by /release.
- Companion fix PR corrects the stale strings in the same change.
Glossary
| Term |
Definition |
| § 3.5 |
The /release skill step that bumps hard-coded version strings in the marketing site. |
| durable guard |
A CI-run test (test_site_counts.sh via site-counts-check.yml) meant to fail when site/CHANGELOG versions drift. |
| hero pill |
The version badge at the top-left of site/index.html (<span class="pill">apexyard vX.Y</span>). |
| releases-shipped metric |
The site/index.html stat showing release count + range (N · (v0.1 → vX.Y)). |
Affected
.claude/skills/release/SKILL.md§ 3.5 (marketing-site version bump) + its durable guard.claude/hooks/tests/test_site_counts.sh.Given / When / Then
Given
/release§ 3.5 lists seven version strings insite/index.htmlthat must move with each cut (JSON-LDsoftwareVersion+dateModified, hero pillapexyard vX.Y, hero link text + href, releases-shipped count + range),When v3.0.0 was cut,
Then only a subset was bumped — the hero pill (
~L1568) still readsapexyard v2.2, and the releases-shipped metric (~L1696) still reads12/(v0.1 → v2.2)(CHANGELOG now has 14 release entries and the line is v3.0.0). The site advertises v2.2 in the badge while the hero link beside it says v3.0.0.The drift went unnoticed because the durable guard
test_site_counts.shasserts only the JSON-LDsoftwareVersionagainst the CHANGELOG top entry. The other six § 3.5 locations — pill, dateModified, link text/href, count, range — are unguarded, so they can drift while CI stays green. § 3.5 itself even claims "the drift can no longer accumulate silently," but that guarantee only holds for one of the seven strings.Repro
softwareVersion+ the hero link but misses the pill / metric (easy — § 3.5 relies on the operator hand-applying 7 separate edits).site-counts-check.yml→test_site_counts.shpasses (it only checkssoftwareVersion).v2.2, metric12 / (v0.1 → v2.2)).Framework version
v3.0.0
Severity
major — public marketing site advertises the wrong version next to the correct one; the documented "durable guard" gives false confidence because it covers 1 of 7 strings.
Notes
test_site_counts.shto also assert (a) the hero pillapexyard vX.Yand (b) the releases-shipped range(v0.1 → vX.Y)against the CHANGELOG top entry's major.minor, and (c) the releases-shipped count againstgrep -cE '^## \[[0-9]' CHANGELOG.md. That brings the guarded set up to match § 3.5's promise. Optionally, replace the 7 hand-edits with a single deterministic bump helper invoked by/release.Glossary
/releaseskill step that bumps hard-coded version strings in the marketing site.test_site_counts.shviasite-counts-check.yml) meant to fail when site/CHANGELOG versions drift.site/index.html(<span class="pill">apexyard vX.Y</span>).site/index.htmlstat showing release count + range (N·(v0.1 → vX.Y)).