Skip to content

docs: close 11 accuracy defects between idstack.org and the repo - #70

Merged
savvides merged 12 commits into
mainfrom
docs/landing-page-accuracy
Aug 15, 2026
Merged

docs: close 11 accuracy defects between idstack.org and the repo#70
savvides merged 12 commits into
mainfrom
docs/landing-page-accuracy

Conversation

@savvides

Copy link
Copy Markdown
Owner

Implements superpowers/specs/2026-08-14-github-page-accuracy-design.md.

An audit of idstack.org against the repo found 11 defects that the two existing
validators (check-doc-accuracy.py, check-evidence-cards.py) do not cover.
All 11 are closed here.

Corrected

  • Install headline said five minutes; README says 30 seconds for the same command.
  • JSON-LD claimed plain Windows support, but ./setup is a bash script.
  • The v3.4.0.1 release note covered one of the three items ROADMAP lists as shipped.
  • An "Eleven skills" headline accounted for ten; /idstack:pipeline is the eleventh.

Added

Prerequisites (bash shell, WSL or Git Bash on Windows, python3 optional),
bin/idstack-doctor and bin/idstack-status, and a link to PRIVACY.md under
the email signup form that previously had none.

Unpublished

static.yml uploaded docs/ verbatim, so internal design docs and
og-template.html were served at idstack.org. They are now excluded from the
staged artifact. Excluded rather than moved, for two independent reasons: the
brainstorming skill writes specs to docs/superpowers/ by default, so a move
alone is undone on its next run; and smoke-test.sh asserts
docs/og-template.html exists at that exact path, so that file cannot move.

Guarded

dateModified and sitemap lastmod were both stale. They are deleted rather
than corrected
: any check asserting such a date is current fails on commits
that did not introduce the defect — a PR left open a week, a merge dated after
the docs edit — and a check that cries wolf is one people learn to bypass.
check-doc-accuracy.py now asserts neither field returns, which cannot
false-positive, and mutation 22 proves the guard bites.

Found during execution, not in the plan

  • The spec itself named the retired CLI, tripping smoke-test.sh's sweep.
    Reworded rather than tagged IDSTACK_CLI_LEAK_ALLOW — that tag is for dated
    historical mentions.
  • That sweep read git-ignored agent scratch. Excluded, and .superpowers/ added
    to the root .gitignore so the exclusion's stated premise is actually true.
  • Mutations 16 and 17 had silently gone stale, both anchored on the exact
    install headline this branch corrected. Their replace() calls matched
    nothing, so they mutated nothing. Repointed, and both now assert their anchor
    matches before replacing — the pattern already used at mutation-test.sh:341.

Verified accurate, left alone

All version strings, the 108-studies / 11-domains claim, all 11 evidence cards,
every per-skill capability claim (UDL 3.0, WCAG 2.1 AA, SCORM 1.2, red-team's 5
dimensions, Nicol's 7 principles, three-level needs assessment), og-image.png,
and the repo's About/topics/homepage.

Testing

11 suites green; mutation suite 27/27 guarded, 0 not guarded.

After merge, curl should return 404 for
/superpowers/specs/2026-08-12-documentation-accuracy-design.md and
/og-template.html, and 200 for the site root.

🤖 Generated with Claude Code

savvides and others added 12 commits August 14, 2026 16:16
Audits idstack.org against the repo and finds 11 defects across three
kinds: claims that are untrue, material omissions, and files published
that were never meant to be public.

Two mechanism decisions worth noting:

- Internal design docs and og-template.html are excluded at build time in
  static.yml rather than relocated. The brainstorming skill hardcodes
  docs/superpowers/specs/, so a move alone gets silently undone on its
  next run; and smoke-test.sh asserts docs/og-template.html exists, so
  that file cannot move at all.

- dateModified and sitemap lastmod are deleted rather than corrected.
  A CI check asserting either date is current fails on commits that did
  not introduce the defect, and a check that cries wolf is one people
  learn to bypass. The guard becomes an absence assertion instead.

Spec lives outside docs/ on purpose — the skill's default location is
finding 10.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Item 5's primary fix is the install prose, not the JSON-LD string.
  A Windows visitor is stopped by prose they read, not by metadata they
  never see. The operatingSystem edit is a precision improvement only.
- Drop the search-engine claim from D2's rationale. The argument stands
  on the scoring model alone, and the spec should not carry a
  third-party assertion it cannot verify.
- Pin the staging step's position in static.yml and require the local
  dry-run before the workflow is edited.
- Note that superpowers/plans/ must be created; git mv won't.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Five tasks, each with its own test cycle. Task 1 is a genuine red-green
cycle: the new absence check fails against the current files, and deleting
the two stale date fields turns it green.

Both non-obvious verification commands were run against the tree before
being written into the plan -- the JSON-LD parse snippet and the Pages
staging dry-run, which produces exactly the eight entries the plan lists.

The dry-run also surfaced that _site was not gitignored, so a forgotten
cleanup could be committed. Added as Task 4 Step 1.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Confirm the PRIVACY.md blob URL resolves on main (200), so a 404 in the
  link sweep points at a typo rather than a missing file upstream.
- grep -c counts matching lines, not occurrences; the privacy-link check
  now uses grep -o | wc -l so a reflowed paragraph cannot read as failure.
- Note that a stray _site/ in git status is an uncleaned dry-run.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
dateModified in the JSON-LD and lastmod in sitemap.xml were both stale --
2026-08-06 and 2026-05-13 against docs changed through 2026-08-12. They are
deleted rather than corrected: any check asserting such a date is current
fails on commits that did not introduce the defect, and a check that cries
wolf gets bypassed. check-doc-accuracy.py now asserts neither field returns,
which cannot false-positive. Mutation 22 proves the guard bites.
smoke-test.sh sweeps every tracked file for references to the retired CLI
and this spec named it while describing an og-image verification result.
Reworded rather than tagged with IDSTACK_CLI_LEAK_ALLOW: the tag is for
dated historical mentions, and weakening the invariant to accommodate my
own prose is the wrong trade.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
.superpowers/ holds implementation reports and review notes written during
development. It is not shipped and CI never sees it, but notes discussing
the sweep tripped it, making the local gate unreliable. Matches the
.gstack/.idstack/.claude exclusions already on that line.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- Install headline said five minutes; README says 30 seconds for the same
  command. Reconciled to README.
- Pipeline lede accounted for ten skills under an 'Eleven skills' headline;
  /idstack:pipeline is the eleventh and now appears in the count.
- JSON-LD claimed plain Windows support; ./setup is a bash script.
- v3.4.0.1 release note covered only the evidence-card fix; ROADMAP lists
  two more items shipped in that patch.
…anding page

The page asked visitors to paste a bash script without saying a bash shell
is required, never mentioned bin/idstack-doctor or bin/idstack-status, and
collected email addresses without linking the privacy policy that already
exists in the repo.
static.yml uploaded docs/ verbatim, so design specs and og-template.html
were served at idstack.org. Stage a copy and drop both instead of moving
them: the brainstorming skill writes specs to docs/superpowers/ by default
so a move alone gets undone on its next run, and smoke-test.sh asserts
docs/og-template.html exists at that exact path so it cannot move at all.
Both anchored on the literal string 'Install in about five minutes.',
which this branch corrected to 'Install in 30 seconds.' Their replace()
calls matched nothing, so both silently mutated nothing and the suite
reported NOT-GUARDED. Repointed at the current text; what each mutation
proves is unchanged.
…n anchors

The --exclude-dir=.superpowers comment argued the directory is git-ignored
like .gstack/.idstack/.claude, but it was not in the root .gitignore -- only
a nested .superpowers/sdd/.gitignore made its contents untracked, so a file
directly under .superpowers/ would have been tracked and sweep-exempt.

Mutations 16 and 17 now assert their anchor matches before replacing, the
pattern already used at mutation-test.sh:341. Both had just gone stale by
silently matching nothing.
@savvides
savvides merged commit 330eee1 into main Aug 15, 2026
8 checks passed
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