Skip to content

test(rest): judge every authored page that teaches the meta state route, not a hand-kept list of two - #14769

Merged
os-trump merged 4 commits into
mainfrom
claude/issue-14561-teaching-sites-discovered-population
Sep 3, 2026
Merged

test(rest): judge every authored page that teaches the meta state route, not a hand-kept list of two#14769
os-trump merged 4 commits into
mainfrom
claude/issue-14561-teaching-sites-discovered-population

Conversation

@os-trump

@os-trump os-trump commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Fixes #14561

TEACHING_SITES in packages/rest/src/meta-state-route-doc-spelling.test.ts was a hand-maintained two-file list standing in for a fact already on disk — the same defect class the test itself exists to catch, and it had already gone stale. The population is now discovered: the test asks git for the authored-prose corpus and judges every file that mentions this route on the REST wire path.

Per triage's ruling (comment 5514084399), this implements conditional presence over a discovered population and deliberately does not build the negative plural scan — that half is settled by design, because the runtime's /meta dispatcher still matches both literals, so the plural is refused by a REST-fronted deployment and still answered wherever dispatch() is the front door (maintainer re-weigh, 2026-08-17 item 3, with its own pin suite).

The gap was live, and this proves it rather than asserting it

Measured on the merged base 7a17f3bf, over a 721-file corpus: three files carry this route on the REST wire path. Two were the hand-kept list. The third — docs/qa/platform-checklist/areas/api-backend.json — carries the wire path three times with concrete values, and spells it canonically by luck, not enforcement.

The rollback arm below is the demonstration: with that page rewritten to the retired plural, the pre-change test passes (4 passed). The new one reds, naming file and line.

Scope: four non-test files, each justified or reverted

The dispatch asked for a named forcing mechanism per file, or a revert. All four are kept; none is kept merely because a previous agent touched it.

File What forces it Evidence
scripts/cross-package-test-inputs.mjs Not a gate — see below measured turbo hash
turbo.json check:cross-package-test-inputs (Layer B) reverted alone: exit 1
.github/workflows/ci.yml check:ci-filter-parity (Layer C) reverted alone: exit 1
scripts/check-ci-filter-parity.mjs that gate's own --self-test pin reverted alone: exit 1, got 16

Each was reverted to origin/main individually, with the revert proved on disk by blob identity and restored under a trap … EXIT INT TERM on absolute paths; the tree ended with an empty git diff HEAD.

Quoted verdict lines:

FAIL: ci.yml's scheduling filters are out of step with CROSS_PACKAGE_TEST_INPUTS.
  - 1 declared glob(s) are covered by NEITHER `core` nor `crosspkg` ...
      docs/**   (declared by @objectstack/rest)
✗ check-ci-filter-parity --self-test — 1 of 41 assertion(s) failed
  • rolling `crosspkg` back to its pre-#10015 list uncovers ... -- got 16

The declaration itself is the interesting one: reverting it leaves the gate GREEN (exit 0). The detector cannot see this read — the corpus is composed by spreading a const array into a git ls-files argv, which is not one of the spellings AGENTS.md publishes. That is the documented "unseen read ... which means no declaration, silently". So the declaration is not gate-forced; it is forced by the rule and by the mechanism, measured directly:

ARM A  turbo.json WITH the declared roots     927 inputs hashed
       docs/ edit MOVES the task hash         89fad0cad84a682c -> ab2e74694205fe13
ARM B  turbo.json WITHOUT them (origin/main)  208 inputs hashed
       docs/ edit does NOT move it            0a521e115c7fe94d == 0a521e115c7fe94d

Undeclared, @objectstack/rest#test hashes 208 inputs, a docs/ edit does not move its hash, and the cache replays a green over the very corpus the test now judges — #7802's shape, one layer up. packages/types/src/driver-error-classification.callers.test.ts:79 states the same chain independently: "for a NEW top-level root, a matching entry in ci.yml's crosspkg: filter — check-ci-filter-parity.mjs is the gate that says so."

The widening is real, and it is stated rather than smuggled

content/**, docs/** and skills/** are declared as this package's cross-package input radius. content/** and skills/** were already crosspkg members; docs/** is a genuinely new top-level root — the first declaration to reach past docs/audits/..., which the WIDTH note in ci.yml had recorded as declined precisely because no declaration reached it. Price, charged to every docs PR: a diff under those roots now schedules Test Core and re-runs this package's suite (its own package set, not the workspace).

I did not widen further, and the radius is deliberately the roots rather than today's matching files: re-narrowing to the matches would be a second hand-kept list wearing the radius' clothes, and the next page to teach the route would land outside it.

Independence

Deriving the population from the same regex that judges it costs the pin the second opinion a hand-written list gave for free. Two mechanical answers, both in-file: PREDICATE_CASES (whole tiny inputs whose verdict is known by construction — three spellings the net must catch, four shapes it must not claim, including the dispatcher spelling that marks the population boundary), and a requirement that the discovered population still contain both named sites, so a net that goes blind reds.

Verification

  • Red-first, three arms — (1) clean corpus + new test: 8 passed. (2) api-backend.json rewritten to the retired plural, proved on disk (canonical-spelling lines 4 to 0, plural lines 0 to 4): 1 failed, naming docs/qa/platform-checklist/areas/api-backend.json:668 twice and :734. (3) same plural corpus, test rolled back to origin/main: 4 passed — the gap, demonstrated. Both mutations restored by blob identity under a trap; git diff HEAD empty.
  • Population — before: 2 hand-kept files. After: 3 discovered (content/docs/protocol/objectql/state-machine.mdx, docs/qa/platform-checklist/areas/api-backend.json, skills/objectstack-automation/SKILL.md), all canonical.
  • packages/rest — dependency closure built first; typecheck exit 0, and its check:test-typecheck leg compiles the test layer under the sibling tsconfig.test.json; the edited file is confirmed present in that program via --listFiles (1 hit / 672 files — it is absent from the default project, which is the documented sibling-tsconfig pattern, not a hole). Full suite: 173 files, 2884 tests passed.
  • Gate union on the final tree 773f0d0d99 (dispatch-gates --commands, exits captured before any pipe): 56 gates, 53 green, 0 red, 3 NOT MEASUREDcheck-test-completeness, check:dual-build-cjs-loads and check:type-check-debt all exit 3 = PREREQUISITE NOT MET (they need a full repo build or a saved turbo run test log). Quoted: "⛔ This is NOT a pass: nothing was measured."
  • Whole-repo pnpm lint — exit 0, no findings. Not narrowed.
  • Heavy runs went through scripts/pm/os-verify-lock.sh. The turbo dry runs executed no task and were run unlocked — declared.

No changeset: this publishes nothing from any package (a test file, two CI-internal scripts, turbo.json, ci.yml), which is the skip-changeset case lint.yml names in its own prose.

Attribution footer conflict is filed as #14663 and is not re-filed here.

🤖 Generated with Claude Code

https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza


Generated by Claude Code

os-trump and others added 4 commits September 2, 2026 21:56
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
Preserved from the previous agent's uncommitted working tree after a
container restart. Kept or reverted together with the ci.yml change it
pins — justification is the next step, not settled by this commit.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
… base

Two corrections, both re-measured on this tree rather than inherited:

- The cited base was 4d0d944 and the tree is now 7a17f3b; the population
  is re-derived there (721-file corpus, three files on the REST wire path).
- The header read the triaged "six files" as if the file's own net produced
  it. It does not: that count comes from a LINE-scoped sweep, and the three
  extra files name a DIFFERENT `/meta/object/...` route on a line that also
  contains the word "state", with no `/state/<field>` tail. That is exactly
  the sixth PREDICATE_CASES entry, so the distinction is already pinned.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016yfqQh2dBgPAymYd7xipza
@github-actions github-actions Bot added the size/m label Sep 3, 2026
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 224f8ea4a0776d72de0003a77695bfb98c2206cdpackageMentionDocs.

@os-trump os-trump added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed ci/cd tests labels Sep 3, 2026 — with Claude
@os-trump
os-trump marked this pull request as ready for review September 3, 2026 00:24
@os-trump
os-trump enabled auto-merge September 3, 2026 00:24
@os-trump
os-trump added this pull request to the merge queue Sep 3, 2026
Merged via the queue into main with commit fc648a2 Sep 3, 2026
45 checks passed
@os-trump
os-trump deleted the claude/issue-14561-teaching-sites-discovered-population branch September 3, 2026 02:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant