Skip to content

docs(qa): R4 coverage sweep — retire both stale waivers, author 8 items for the post-2026-08-08 window - #9309

Merged
os-zhuang merged 3 commits into
mainfrom
claude/issue-9299-checklist-coverage-sweep
Aug 17, 2026
Merged

docs(qa): R4 coverage sweep — retire both stale waivers, author 8 items for the post-2026-08-08 window#9309
os-zhuang merged 3 commits into
mainfrom
claude/issue-9299-checklist-coverage-sweep

Conversation

@os-zhuang

@os-zhuangos-zhuang commented Aug 17, 2026

Copy link
Copy Markdown
Contributor

Fixes#9299

Part of the #9296 QA wave (round 4, ran in parallel with R0). Docs-only diff:
docs/qa/platform-checklist/** and nothing else.

Result

node scripts/check-platform-checklist.mjs green at d23a746c7:

✓ checklist-select self-test: 17 cases pass.
check-platform-checklist: OK — 15 areas, 190 items (190 active); coverage: 30 kinds mapped, 0 waived.
readingbeforeafter
items182190
kinds mapped2830
waived20
since:v17 selectable1420

Both surviving waivers were stale

book and doc each claimed the kind is "display-only ... no independent runtime
behavior to gate beyond serving". Grounding disproved it. The REST read layer runs:

  • a three-member audience vocabulary (public / org / { permissionSet }) with an
    ADR-0049 fail-closed branch — unresolvable permission-set holdings deny;
  • a two-layer gate: the book audience gates the tree, then entries are filtered
    again by each doc's effective audience (the union over claiming books), so an
    anonymous reader never sees a nav entry that would refuse on click;
  • a deliberate non-leak rule — the synthetic Uncategorized orphan group is excluded
    from claimed-docs resolution because including it "would leak every unclaimed doc of a
    package through any public book it ships";
  • implicit per-package book fallback, and doc locale resolution.

That is an access-control surface, and it now has an item. Running total: 6 of 6
waivers ever written turned out stale — SWEEP.md records that, since it is the
strongest argument in the file for auditing waivers against the runtime rather than
against their own prose.

Items authored

Each was grounded in a real file path before anything was asserted, and each names the
sibling item it deliberately does not duplicate.

idwhy it was invisible
platform-core.docs-audience-gatekind was waived, so no ratchet looked
access-security.no-active-org-session-semantics (P0)ADR-0123 — new behavior across already-mapped kinds
api-backend.filter-comparand-conformanceoperators were covered; comparand types were not
api-backend.date-range-preset-matrixenum landed 2026-08-15, never pinned
api-backend.retired-def-refusalretired keys covered; retired definitions not
integration-system.datasource-credential-refusal-matrix (P0)datasource already mapped; the doors are not enum members
cli.migrate-meta-codemodlisted as a variant of the DB-migrate item, asserted nowhere
cli.scaffold-console-first-paintthe seam between two first-run items

Two new variants matrices are pinned with enumSource, verified against the
validator's own extractor rather than by eye:

  • ACCEPTED_FILTER_COMPARAND_TYPES — 6 members
  • DATE_RANGE_PRESETS — 13 members

I also probed SCALAR_FILTER_HEAD_TYPES and did not pin it: it is a new Set([...]),
which the extractor reads as zero members, so a pin would have been a permanently
vacuous green.

The blind spot the card predicted, confirmed

The window added 156 non-test source files but zero new metadata kinds. Every
finding above is new behavior inside an already-mapped kind — invisible to the coverage
ratchet (no new kind) and to the enumSource ratchet (no new enum member). So none of it
could have been caught by check:platform-checklist however often it ran. That is now
stated explicitly in SWEEP.md.

One refinement to the card's framing, from evidence: the gap is not only recency. Two
of the eight items cover capabilities that predate the ledger's own baseline
(since: v14.1 and v14.7) and were simply never authored. Under-authoring of v17 is
real — since:v17 goes 14 → 20 here — but recency was not the whole story.

SWEEP.md fact correction

The runbook claimed the validator runs in "CI, every PR" and that this half "needs no
human at all". It does not run in CI: .github/workflows/lint.yml:426 carries the
maintainer decision as a comment with norun: step, and the only two mentions of
the script in all of .github/workflows/ are that comment. Corrected the fact, kept the
posture, and spelled out the consequence a sweep actually depends on — the ratchets catch
drift at the next manual run, so a green ledger is not evidence that drift is gated.

On cost: my own measurements came out above the ones supplied with the card (validator
~0.12–0.18 s vs ~80 ms; pnpm check:platform-checklist ~2.9 s wall vs 0.165 s), which I
attribute to the parallel cold install running in the same container plus pnpm's own
startup. Rather than bake in a figure that will read as wrong on the next machine, the
corrected text records the direct-node cost (~0.25 s for self-test + validator) and warns
that timing through pnpm measures the wrapper. Flagged for you in FOLLOW-UPS.md §5c.

FOLLOW-UPS.md

New 2026-08-17 section, carrying one drift finding, the checked-and-clean readings, and
notes for you.

One hypothesis this sweep raised was refuted by source-checking, and is recorded as
refuted.
I read the blank template's bare "dev": "objectstack dev" against
quick-start's npx os dev --ui and inferred that npm run dev would strand a newcomer
with no console. Tracing the chain disproves it:

  • packages/cli/src/commands/serve.ts:221ui: Flags.boolean({ …, default: true, allowNo: true }); the console is default-ON at serve, and --no-ui is the off switch.
  • packages/cli/src/commands/dev.ts:370...(flags.ui ? ['--ui'] : []) only ever adds the flag, never forwards --no-ui; with dev.ts:69 declaring ui with no default, an unflagged dev inherits serve's default.
  • content/docs/deployment/cli.mdx:139 states it outright: "--ui | Force Console UI on (already on by default in dev)".

So --ui on dev is a no-op forwarder, the bare script is correct, and there is no
divergence. The reading now lives in §5b as a checked-and-clean entry with the full
trace rather than being deleted — the wrong inference is an easy one to make twice, and
a bare deletion invites the next sweep to re-derive it.

cli.scaffold-console-first-paint survives, because the seam it covers is real: no other
item drives the console against a freshly scaffolded blank project (cli.scaffold-first-run
boots headless via os start --artifact; cli.dev-boot-contract drives the fully-populated
showcase). Its clause 3 now asserts the two invocations agree, with a difference
between them as the failure, and its negatives cover the real regressions — a future ui
default of false on dev, or --no-ui being forwarded.

The remaining drift row is a stale note in packages/spec/liveness/doc.json describing a
tags defect that is fixed (DocSchema declares tags now) — reported, not edited,
since it sits outside this card's file surface.

Checked and clean, recorded so the next sweep does not re-derive it: no published doc
prescribes a retired scaffolder template (zero hits across content/docs/ for all five),
and npm run validate is the same binary as npx os validate.

Verification

Docs-only; no path-derived gate families (node scripts/pm/dispatch-gates.mjs on the
changed paths places none). Run at d23a746c7, after the final commit:

  • node scripts/checklist-select.mjs --self-test — 17 cases pass
  • node scripts/check-platform-checklist.mjs — OK, 190 items, 0 waived
  • node scripts/check-nul-bytes.mjs — OK, 6067 files, no raw control bytes
  • every new id resolves through checklist-select.mjs, including the two new
    since: values

No changeset: docs-only, publishes nothing. Carrying this repo's real skip-changeset
label rather than an empty changeset.

⛔ Draft, per the card. Not merged, no auto-merge, not enqueued.


Generated by Claude Code

…ms for the post-2026-08-08 window (#9299)
Re-audit of the platform-checklist ledger against the window since the
2026-08-08 sweep. 182 -> 190 items; coverage 28 mapped / 2 waived -> 30
mapped / 0 waived.
Both surviving coverage waivers were factually stale. `book` and `doc`
both claimed the kinds are "display-only, no independent runtime
behavior to gate beyond serving". The REST read layer in fact runs a
three-member audience vocabulary with an ADR-0049 fail-closed branch, a
two-layer gate (book audience, then per-entry doc-audience union), a
deliberate orphan-group non-leak rule, and locale resolution -- an
access-control surface. Retired both; `platform-core.docs-audience-gate`
now covers them. Running total: 6 of 6 waivers ever written turned out
stale.
New items, each grounded in a real file path before assertion:
- platform-core.docs-audience-gate book/doc audience gating
- access-security.no-active-org-session-semantics ADR-0123 (P0)
- api-backend.filter-comparand-conformance pinned, 6 members
- api-backend.date-range-preset-matrix pinned, 13 members
- api-backend.retired-def-refusal retired DEFS, not keys
- integration-system.datasource-credential-refusal-matrix (P0)
- cli.migrate-meta-codemod the prescription's honesty
- cli.scaffold-console-first-paint documented first-run seam
The dominant find matches the ledger's structural blind spot: new
behavior inside an already-mapped kind is invisible to both ratchets
(no new kind, no new enum member), so none of the above could have been
caught by `check:platform-checklist` however often it ran.
SWEEP.md fact correction: the runbook claimed the validator runs in
"CI, every PR". It does not -- by maintainer decision it is manual and
periodic (README "Operating cadence"; the recorded note at
.github/workflows/lint.yml:426, which has no `run:` step). Corrected the
fact and spelled out the consequence a sweep depends on: the ratchets
catch drift at the NEXT manual run, so a green ledger is not evidence
that drift is gated. CI posture itself left untouched.
FOLLOW-UPS.md gains a 2026-08-17 section: one docs-drift finding (the
blank template's `dev` script omits the `--ui` flag that serves the
console quick-start sends newcomers to), one stale liveness note, and
the checked-and-clean readings so the next sweep need not re-derive them.
Fixes#9299
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ai9gUdihXjg7FumzsBNSSs
@os-zhuangos-zhuang added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 17, 2026 — with Claude
@github-actionsgithub-actionsBot added the documentation Improvements or additions to documentation label Aug 17, 2026
…it (#9299)
The R4 sweep flagged the blank template's bare `"dev": "objectstack dev"`
against quick-start's `npx os dev --ui` and inferred that `npm run dev`
would strand a newcomer with no console. It was reported as unbooted, and
the hedge was right: tracing the chain disproves it.
serve.ts:221 ui: Flags.boolean({ ..., default: true, allowNo: true })
dev.ts:370 ...(flags.ui ? ['--ui'] : []) adds only, never --no-ui
dev.ts:69 ui declared with NO default
cli.mdx:139 "--ui | Force Console UI on (already on by default in dev)"
An unflagged `dev` spawns `serve` with no ui flag, so serve's own
default-on applies. `--ui` on `dev` is a no-op forwarder. The bare script
is correct and there is no divergence.
An expected-divergence probe that encodes correct behavior as a divergence
teaches the next run to grade a working platform as broken — the
records-forms.action-location-matrix failure mode. So:
- FOLLOW-UPS.md: the E1 drift row is gone; the reading is rewritten as a
checked-and-clean entry in 5b with the full trace, because the wrong
inference is an easy one to make twice and deletion would invite it.
The stale liveness-note row renumbers E2 -> E1.
- cli.scaffold-console-first-paint: clause 3 now asserts the two
invocations AGREE, with a difference between them as the failure; the
negatives cover the real regressions (a future `ui` default of false on
dev, or --no-ui being forwarded); source cites the whole chain; the
history entry records the refutation so it is not re-derived.
The item itself stands — the seam it covers is real: no other item drives
the console against a freshly scaffolded blank project.
Validator green, unchanged at 190 items / 30 kinds mapped / 0 waived.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ai9gUdihXjg7FumzsBNSSs
@os-zhuang
os-zhuang added this pull request to the merge queueAug 17, 2026
Merged via the queue into main with commit 4cd104fAug 17, 2026
21 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-9299-checklist-coverage-sweep branch August 17, 2026 13:51
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/lskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

QA wave R4: coverage sweep (checklist-author) — re-audit the ledger against the 727 commits since the 2026-08-08 sweep

2 participants

@os-zhuang@claude