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

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.

FileWhat forces itEvidence
scripts/cross-package-test-inputs.mjsNot a gate — see belowmeasured turbo hash
turbo.jsoncheck:cross-package-test-inputs (Layer B)reverted alone: exit 1
.github/workflows/ci.ymlcheck:ci-filter-parity (Layer C)reverted alone: exit 1
scripts/check-ci-filter-parity.mjsthat gate's own --self-test pinreverted 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-trumpand 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

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-trumpos-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 added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit fc648a2Sep 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant

@os-trump
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
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

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.

FileWhat forces itEvidence
scripts/cross-package-test-inputs.mjsNot a gate — see belowmeasured turbo hash
turbo.jsoncheck:cross-package-test-inputs (Layer B)reverted alone: exit 1
.github/workflows/ci.ymlcheck:ci-filter-parity (Layer C)reverted alone: exit 1
scripts/check-ci-filter-parity.mjsthat gate's own --self-test pinreverted 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-trumpand 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

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-trumpos-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 added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit fc648a2Sep 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant

@os-trump
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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.

FileWhat forces itEvidence
scripts/cross-package-test-inputs.mjsNot a gate — see belowmeasured turbo hash
turbo.jsoncheck:cross-package-test-inputs (Layer B)reverted alone: exit 1
.github/workflows/ci.ymlcheck:ci-filter-parity (Layer C)reverted alone: exit 1
scripts/check-ci-filter-parity.mjsthat gate's own --self-test pinreverted 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-trumpand 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

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-trumpos-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 added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit fc648a2Sep 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant

@os-trump
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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.

FileWhat forces itEvidence
scripts/cross-package-test-inputs.mjsNot a gate — see belowmeasured turbo hash
turbo.jsoncheck:cross-package-test-inputs (Layer B)reverted alone: exit 1
.github/workflows/ci.ymlcheck:ci-filter-parity (Layer C)reverted alone: exit 1
scripts/check-ci-filter-parity.mjsthat gate's own --self-test pinreverted 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-trumpand 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

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-trumpos-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 added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit fc648a2Sep 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant

@os-trump
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
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

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.

FileWhat forces itEvidence
scripts/cross-package-test-inputs.mjsNot a gate — see belowmeasured turbo hash
turbo.jsoncheck:cross-package-test-inputs (Layer B)reverted alone: exit 1
.github/workflows/ci.ymlcheck:ci-filter-parity (Layer C)reverted alone: exit 1
scripts/check-ci-filter-parity.mjsthat gate's own --self-test pinreverted 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-trumpand 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

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-trumpos-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 added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit fc648a2Sep 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant

@os-trump
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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.

FileWhat forces itEvidence
scripts/cross-package-test-inputs.mjsNot a gate — see belowmeasured turbo hash
turbo.jsoncheck:cross-package-test-inputs (Layer B)reverted alone: exit 1
.github/workflows/ci.ymlcheck:ci-filter-parity (Layer C)reverted alone: exit 1
scripts/check-ci-filter-parity.mjsthat gate's own --self-test pinreverted 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-trumpand 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

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-trumpos-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 added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit fc648a2Sep 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant

@os-trump
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
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

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.

FileWhat forces itEvidence
scripts/cross-package-test-inputs.mjsNot a gate — see belowmeasured turbo hash
turbo.jsoncheck:cross-package-test-inputs (Layer B)reverted alone: exit 1
.github/workflows/ci.ymlcheck:ci-filter-parity (Layer C)reverted alone: exit 1
scripts/check-ci-filter-parity.mjsthat gate's own --self-test pinreverted 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-trumpand 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

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-trumpos-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 added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit fc648a2Sep 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant

@os-trump
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
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

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.

FileWhat forces itEvidence
scripts/cross-package-test-inputs.mjsNot a gate — see belowmeasured turbo hash
turbo.jsoncheck:cross-package-test-inputs (Layer B)reverted alone: exit 1
.github/workflows/ci.ymlcheck:ci-filter-parity (Layer C)reverted alone: exit 1
scripts/check-ci-filter-parity.mjsthat gate's own --self-test pinreverted 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-trumpand 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

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-trumpos-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 added this pull request to the merge queueSep 3, 2026
Merged via the queue into main with commit fc648a2Sep 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant

@os-trump