Skip to content

v3.3.0.1 — post-ship docs pass, plus the bare-command bug it found - #58

Merged
savvides merged 4 commits into
mainfrom
worktree-fix-audit-v3.3.0.0
Aug 5, 2026
Merged

v3.3.0.1 — post-ship docs pass, plus the bare-command bug it found#58
savvides merged 4 commits into
mainfrom
worktree-fix-audit-v3.3.0.0

Conversation

@savvides

@savvides savvides commented Aug 5, 2026

Copy link
Copy Markdown
Owner

Post-ship documentation pass over v3.3.0.0, plus one real bug the pass uncovered.

v3.3.0.0 merged in #57. This branch audits every doc against what actually shipped, and bumps to v3.3.0.1 for a behavior fix found along the way.

The bug (v3.3.0.1)

v3.3.0.0 banned bare /skill references because they resolve in neither CLI, and fixed them in bin/idstack-status. The guard enforcing it matched only the backticked form:

BARE_SLASH_RE='`/(needs-analysis|...)`'

Three plain-prose examples in templates/preamble.md (236, 241, 244) walked straight through it. That preamble is spliced into all 22 skill files, and those lines are the model's instructions for phrasing welcome-back and next-step messages — so the model copied their shape and told users things like:

Based on your progress, /assessment-design is the natural next step.

Typing that does nothing. It landed inside the context-recovery message v3.3.0.0 had just repaired, making it the first thing a user saw once welcome-back messages started working again.

Fixed by namespacing all three, widening the guard to catch a bare /skill in any command position, and adding a mutation case. Frontmatter stays exempt as before (description: is picker prose, not a command) — the six frontmatter matches were confirmed exempt, not "fixed".

Documentation

CONTRIBUTING.md — said a skill is "one directory, one file: SKILL.md" and named only smoke-test.sh. A new contributor following it would hand-edit a generated file and run 1 of 8 suites. Now documents the .tmpl source, the regen gate, every suite and what it covers, the Python 3.9 floor for embedded scripts, and the bin/lib/ rule.

CLAUDE.md / AGENTS.md — added idstack-migrate (incl. --init), manifest-merge, slugify, and --keep-legacy to Commands; added the eight test suites and CI matrix; documented the {{IDSTACK_RESOLVE}} placeholder and why it repeats per bash block; added the bin/lib/ section; documented the deliberate multi-section-write exception so needs-analysis and course-import no longer read as rule violations.

README.md — bare /course-quality-review and /learning-objectives in prose and in the sample transcript (the exact form this release banned); sample install output was from an install path that no longer exists; "Requirement: Claude Code" contradicted the Codex support claim three lines above; architecture block omitted bin/idstack-doctor, which the troubleshooting section tells users to run.

ROADMAP.md — was three releases behind, still showing v3.0.0 as newest. Added v3.1–v3.3, dropped the passed "(v2.6)" labels from pending items, normalized pre-v2 command syntax.

CHANGELOG.md — contributor-only work moved out of the user-facing "Changed" section into "For contributors"; added the git pull && ./setup line so the entry says how to receive the fixes. No entry reworded or removed. Corrected "16 behavioral tests" → 17 (f956177 split an assertion after the count was last audited) and "all seven suites" → eight.

TODOS.md — "All 7 skill preambles"; there are 11.

Verification

smoke              371/371
integration         25/25
setup               17/17
manifest-merge      21/21
version-classifier  27/27
plugin-status        9/9
preamble-python      6/6
mutation           14/14 guarded
gen-skills --dry-run  22 templates, 0 stale

A cross-model doc review (Codex, high reasoning) ran against the release diff; all 8 findings were verified against the source and applied.

Documentation debt

Not fixed here, recorded so it isn't lost:

  • ⚠️ bin/lib/*.sh, {{IDSTACK_RESOLVE}}, bin/idstack-migrate --init — now have reference coverage in CLAUDE.md / AGENTS.md / CONTRIBUTING.md, but no how-to or worked example. Would suit a how-to page.
  • ⚠️ The eight test suites — reference coverage only. No tutorial for "I fixed a bug, what do I write?" beyond the one-line mutation-suite rule.
  • ⚠️ README workflow diagram — labels stay unprefixed for column width, with a note above it giving the real invocation form. Prefixing them properly means rebuilding the two-column ASCII layout.
  • ⚠️ TODOS.md — 12 bare /skill prose references left as internal shorthand. Contributor backlog, not user-facing, and none are copyable instructions.
  • ⚠️ test/sample-cartridge.md, test/sample-course.md — bare /skill references in test fixture headers.

Suggest a docs-debt label.

🤖 Generated with Claude Code

savvides and others added 4 commits August 5, 2026 07:43
The release shipped new public surface, shared libraries, and eight test
suites; the docs described none of it. Corrections against the diff:

- CONTRIBUTING said a skill is "one directory, one file: SKILL.md" and
  named only smoke-test.sh. A new contributor following it would hand-edit
  a generated file and run 1 of 8 suites. Now documents the .tmpl source,
  the regen gate, every suite and what it covers, the Python 3.9 floor for
  embedded scripts, and the bin/lib rule (test the shipped file, not a copy).
- CLAUDE.md / AGENTS.md: added idstack-migrate (incl. --init), manifest-merge
  and slugify to Commands; added the eight test suites and the CI matrix;
  documented the {{IDSTACK_RESOLVE}} placeholder and why it repeats per bash
  block; added the bin/lib section.
- README: the contributing pointer repeated CONTRIBUTING's wrong instruction;
  the architecture block omitted idstack-doctor, which README's own
  troubleshooting section tells users to run.
- ROADMAP was three releases behind, still showing v3.0.0 as newest. Added
  v3.1-v3.3 and dropped the passed "(v2.6)" labels from pending items, which
  made them read as overdue rather than unscheduled. Same labels fixed in
  TODOS.md and CLAUDE.md.
- CHANGELOG: contributor-only work moved out of the user-facing "Changed"
  section into "For contributors"; added the git pull && ./setup line so the
  entry says how to actually receive the fixes. No entry reworded or removed.
  Corrected "16 behavioral tests" to 17 — f956177 split an assertion after
  the count was last audited; ./test/test-setup.sh reports 17/17.

Verified: gen-skills --dry-run clean (22 templates, 0 stale); all eight
suites pass (371 smoke, 25 integration, 17 setup, 21 manifest-merge, 27
version-classifier, 9 plugin-status, 6 preamble-python, 13/13 mutations
guarded).

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Eight findings from the Codex documentation review, each verified against
the shipped source before applying.

User-facing (README):
- Bare /course-quality-review and /learning-objectives in prose and in the
  sample transcript. This release banned exactly that form from skill text
  for not being a valid command; the README still handed it to users. Now
  /idstack:<skill>, with a note above the workflow diagram explaining that
  its unprefixed labels are for column width, not for typing.
- The sample install output was from an install path that no longer exists
  ("linked: ...", "installed successfully"). setup:176 prints "idstack
  installed (Claude Code) - scope: ..." and a skills list. Replaced with
  what it actually prints.
- "Requirement: Claude Code" contradicted line 7's Codex support claim.
  Codex is now named, with every setup flag documented.

Contributor guidance:
- --keep-legacy is a public flag with its own usage line (setup:32), fixed
  by this very release, and was documented nowhere. Added to both command
  lists.
- CLAUDE.md / AGENTS.md / CONTRIBUTING called inline manifest writes a
  deprecated fallback, but needs-analysis and course-import use them
  deliberately for multi-section writes. Undocumented, that reads as two
  skills violating the rule. Now stated as the one exception, with the
  standalone idstack-migrate --init requirement alongside it.

Counts:
- CHANGELOG said CI runs "all seven suites"; test.yml runs eight (seven in
  the matrix job, mutation in its own).
- TODOS said "All 7 skill preambles"; there are 11.
- ROADMAP: pre-v2 entries used /idstack <skill> and bare /red-team forms.
  Normalized to the colon namespace so nothing on the page is copy-pasteable
  and broken.

Verified: gen-skills --dry-run clean; smoke 371/371, integration 25/25,
setup 17/17.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The previous commit rebuilt this block from setup:176 onward and claimed it
was what setup prints. It skipped the three lines setup emits before that:
the regeneration notice (setup:49) and the "Installing idstack (scope)" /
"source:" header (setup:51-52), all unconditional.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
v3.3.0.0 banned bare /skill references because they resolve in neither CLI,
and fixed them in bin/idstack-status. The guard enforcing it matched only
backticked refs:

  BARE_SLASH_RE='`/(needs-analysis|...)`'

Three plain-prose examples in templates/preamble.md survived it (lines 236,
241, 244) — and the preamble is spliced into all 22 skill files. They are the
model's instructions for phrasing welcome-back and next-step messages, so the
model copied their shape and told users things like "Based on your progress,
/assessment-design is the natural next step." Typing that does nothing.

It landed inside the context-recovery message v3.3.0.0 had just repaired, so
it was the first thing a user saw once welcome-back messages started working
again.

- Namespaced all three. On Codex the existing translation rule renders them
  as $<skill>.
- Widened the guard to match a bare /skill in any command position (line
  start, whitespace, quote, paren, backtick), not only inside backticks. It
  will not match a slash preceded by a path character, so
  .idstack/exports/<slug>/red-team.html stays legal, and it cannot match
  /idstack:<skill> because the skill name does not follow the slash.
- Kept frontmatter exempt, as before: description: is picker prose, not a
  command. The check now strips through the closing --- and scans the body.
  Six frontmatter matches confirmed exempt rather than "fixed".
- Added a mutation case reintroducing an unbackticked bare reference.

Found by the doc sweep in /document-release, not by the suite — the guard
that was supposed to catch it is the thing that had the hole.

Verified: smoke 371/371, integration 25/25, setup 17/17, manifest-merge
21/21, version-classifier 27/27, plugin-status 9/9, preamble-python 6/6,
mutations 14/14 guarded. gen-skills --dry-run clean.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@savvides savvides added the docs-debt Documentation gaps recorded but not closed label Aug 5, 2026
@savvides
savvides merged commit 8ef4f00 into main Aug 5, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs-debt Documentation gaps recorded but not closed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant