Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 11 additions & 2 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2284,7 +2284,7 @@ jobs:
# commands and the gate reds (3/2) — which is exactly what it did here.
# Both existing collectors in this file carry self-tests ONLY, for the
# same reason. Keep the sweep out of the collector block.
- name: ADR symbol-anchor gate self-tests
- name: Symbol-anchor gate self-tests
run: |
failed=""
run_self_test() {
Expand All @@ -2299,16 +2299,25 @@ jobs:
}
run_self_test node scripts/symbol-anchors.mjs --self-test
run_self_test node scripts/check-adr-symbol-anchors.mjs --self-test
run_self_test node scripts/check-scripts-symbol-anchors.mjs --self-test
if [ -n "$failed" ]; then
echo ""
echo "ADR symbol-anchor self-tests — the following FAILED:"
echo "Symbol-anchor self-tests — the following FAILED:"
printf "%s" "$failed"
exit 1
fi

- name: ADR symbol anchors resolve (no line numbers survive)
run: node scripts/check-adr-symbol-anchors.mjs

# The SECOND corpus (#15765), and it is a `defineCorpus` registration over
# `scripts/**` comment prose — ⛔ not a second resolver. Its own sweep is a
# separate step for the same `check-step-collectors` reason stated above:
# a production sweep inside the collector block re-invokes the stub the
# harness plants and the count comes out 4/3.
- name: scripts/** symbol anchors resolve (no line citations on tracked targets survive)
run: node scripts/check-scripts-symbol-anchors.mjs

# NOTE: the standing platform test checklist (docs/qa/platform-checklist/)
# is validated by `pnpm check:platform-checklist`, but by MAINTAINER
# DECISION it is NOT wired into CI — it runs on a periodic manual cadence
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
"check:adr-anchors": "node scripts/check-adr-anchors.mjs --self-test && node scripts/check-adr-anchors.mjs",
"check:adr-links": "node scripts/check-adr-links.mjs --self-test && node scripts/check-adr-links.mjs",
"check:adr-symbol-anchors": "node scripts/symbol-anchors.mjs --self-test && node scripts/check-adr-symbol-anchors.mjs --self-test && node scripts/check-adr-symbol-anchors.mjs",
"check:scripts-symbol-anchors": "node scripts/symbol-anchors.mjs --self-test && node scripts/check-scripts-symbol-anchors.mjs --self-test && node scripts/check-scripts-symbol-anchors.mjs",
"check:platform-checklist": "node scripts/checklist-select.mjs --self-test && node scripts/check-platform-checklist.mjs",
"check:org-identifier": "node scripts/check-org-identifier.mjs --self-test && node scripts/check-org-identifier.mjs",
"check:runner-env-posture": "node scripts/check-runner-env-posture.mjs --self-test && node scripts/check-runner-env-posture.mjs",
Expand Down
6 changes: 3 additions & 3 deletions scripts/audits/14423-databaseloader-cost-probe.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license.
//
// #14423 step 1 (census) — empirical confirmation that `DatabaseLoader.loadManyKeyed()`
// costs NOTHING extra over `loadMany()` (same query, same cache — `readTypeRows()`,
// `packages/metadata/src/loaders/database-loader.ts:936`), while a `listNames()` +
// per-name `load()` read costs a SEPARATE query (`list()`, `:1062`) plus one query
// costs NOTHING extra over `loadMany()` (same query, same cache —
// `packages/metadata/src/loaders/database-loader.ts#readTypeRows`, `#list`), while
// a `listNames()` + per-name `load()` read costs a SEPARATE query plus one query
// PER NAME (`load()`'s `_findOne`, via `baseFilter(type,name)`) — a real N+1 against
// `loadMany`'s single query. MEASUREMENT ONLY — ships nothing.

Expand Down
2 changes: 1 addition & 1 deletion scripts/audits/14423-unbound-declarations-before-count.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
* (`runActionGovernanceInventory`, `collectEngineActionDeclarations`,
* `reconcileActionRegistrations` — all exported from its public entry) and
* drives it exactly as `ObjectQLPlugin.runGovernanceInventory`
* (`packages/objectql/src/plugin.ts:2475`) does, over a controlled standalone
* (`packages/objectql/src/plugin.ts#runGovernanceInventory`) does, over a controlled standalone
* source that isolates the ONE population the identity fix can move:
* standalone `action` declarations whose BODY carries no `name` (the C2/C6
* shape) and are otherwise `type: 'script'` with no `body` and no bound
Expand Down
15 changes: 10 additions & 5 deletions scripts/check-agent-test-spelling.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -80,11 +80,16 @@
* printing. FIVE of the six are forms a naive bare-`--` selector would have RED,
* and every one of them is correct as written:
*
* .github/workflows/ci.yml:1122 pnpm turbo run test --filter=@objectstack/dogfood -- --shard=N/3
* .github/workflows/lint.yml:2443 pnpm dev -- --fresh (quoted in this gate's own wiring comment)
* AGENTS.md:126 pnpm dev -- --fresh -p <random>
* AGENTS.md:133 pnpm dev:crm -- --fresh -p 38421
* AGENTS.md:388 pnpm dev -- --fresh -p <random>
* ⚠️ The rows name the FILE, never a line in it. The line each sat on when this
* was measured is kept beside it as data, because that is a dated reading and
* not a pointer -- and a pointer written `file:NNN` rots silently, which is the
* whole finding of #15765. `--list` re-derives the live position on every run.
*
* `.github/workflows/ci.yml` (was line 1122) pnpm turbo run test --filter=@objectstack/dogfood -- --shard=N/3
* `.github/workflows/lint.yml` (was line 2443) pnpm dev -- --fresh (quoted in this gate's own wiring comment)
* `AGENTS.md` (was line 126) pnpm dev -- --fresh -p <random>
* `AGENTS.md` (was line 133) pnpm dev:crm -- --fresh -p 38421
* `AGENTS.md` (was line 388) pnpm dev -- --fresh -p <random>
*
* The sixth is prose inside `scripts/check-examples-live-imports.mjs`, cleared
* because its command word is a `check:` script.
Expand Down
12 changes: 8 additions & 4 deletions scripts/check-doc-anchors.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,14 @@
// 200 internal fragment links across `content/**`, of which 4 pointed at
// headings that do not exist:
//
// content/docs/automation/flows.mdx:240 #notify
// content/docs/concepts/metadata-lifecycle.mdx:77 #overlay-whitelist
// content/docs/permissions/authentication.mdx:75 /docs/deployment/cli#os-login--json-is-ndjson--the-one-exception
// content/docs/protocol/kernel/http-protocol.mdx:764 /docs/api/client-sdk#clientdata--crud-operations
// The FRAGMENT is the durable identifier of each row, so the file is named as a
// file-level anchor and the line it sat on at measurement time is data beside
// it — a dated reading, not a pointer (#15765).
//
// `content/docs/automation/flows.mdx` (was line 240) #notify
// `content/docs/concepts/metadata-lifecycle.mdx` (was line 77) #overlay-whitelist
// `content/docs/permissions/authentication.mdx` (was line 75) /docs/deployment/cli#os-login--json-is-ndjson--the-one-exception
// `content/docs/protocol/kernel/http-protocol.mdx` (was line 764) /docs/api/client-sdk#clientdata--crud-operations
//
// Three of the four are the exact shape the card predicted — an anchor written
// from the heading a reader SEES, one dash off from the heading the slugger
Expand Down
3 changes: 2 additions & 1 deletion scripts/check-init-service-contract.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -788,7 +788,8 @@ function selfTest() {
}
`;

// 13. #4772 VERBATIM, pre-fix (`f2eb85007^`, packages/plugins/plugin-auth/src/auth-plugin.ts:346):
// 13. #4772 VERBATIM, pre-fix — `packages/plugins/plugin-auth/src/auth-plugin.ts`
// as it stood at `f2eb85007^` (line 346 there, a dated reading, not a pointer):
// init() resolves the workspace-provided `cache` through `getServiceAsync`,
// via an optional call on a cast `ctx`, inside a best-effort try/catch, and
// the plugin's declarations cover `data`/`manifest`/objectql — never `cache`.
Expand Down
11 changes: 7 additions & 4 deletions scripts/check-org-identifier.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -203,10 +203,13 @@
// ... of them wrong today ............................................ 0
// the same literal in the SCANNED (non-test) population ............... 0
//
// packages/spec/src/data/hook.test.ts:619 #3290 absence pin
// packages/plugins/plugin-audit/src/audit-writers.test.ts:1666 absence pin
// packages/plugins/plugin-audit/src/comment-access-hooks.test.ts:529 #9691
// packages/services/service-storage/src/attachment-access-hooks.test.ts:750
// (the file, never a line in it — the recipe above re-derives the position on
// every run, and a `file:NNN` pointer written here would rot silently, #15765)
//
// `packages/spec/src/data/hook.test.ts` #3290 absence pin
// `packages/plugins/plugin-audit/src/audit-writers.test.ts` absence pin
// `packages/plugins/plugin-audit/src/comment-access-hooks.test.ts` #9691
// `packages/services/service-storage/src/attachment-access-hooks.test.ts`
//
// (The recipe reports 5 matches across those 4 files: `hook.test.ts` carries a
// second one whose `tenantId` sits inside a COMMENT in the literal's body.)
Expand Down
4 changes: 2 additions & 2 deletions scripts/check-overlay-whitelist-table.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -162,9 +162,9 @@
* ## Scope: this table only, deliberately
*
* Sibling pages state the same facts correctly in PROSE, not in a machine-shaped
* type→flag table: `content/docs/permissions/authorization.mdx:236`
* type→flag table: `content/docs/permissions/authorization.mdx`
* ("`permission` declares `allowOrgOverride: false`"),
* `content/docs/automation/jobs.mdx:42` (a job-vs-flow comparison table whose
* `content/docs/automation/jobs.mdx` (a job-vs-flow comparison table whose
* flag mention sits inside an English cell), `content/docs/ai/agents.mdx`,
* `content/docs/permissions/capabilities.mdx`,
* `content/docs/references/system/email-template.mdx`.
Expand Down
3 changes: 2 additions & 1 deletion scripts/check-platform-checklist.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,8 @@
// `use`. A recipe nobody opts into is dead text a runner may still replay.
// Both directions together are what the trap vocabulary beside them has
// always had — used implies documented, documented implies used.
// - every SYMBOL ANCHOR (`path/to/file.ts#symbolName`) resolves: the cited
// - every SYMBOL ANCHOR (`<dir>/<file>.ts#<symbol>`, the spelling
// `scripts/symbol-anchors.mjs#ANCHOR_GRAMMAR` defines) resolves: the cited
// file is in the tree and the cited symbol is still in it, comments masked
// — a symbol surviving only in a docblock is ABSENT. A shrink-never floor
// per family file keeps the population from being emptied one deleted
Expand Down
7 changes: 5 additions & 2 deletions scripts/check-published-list-mirrors.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,11 @@ const REPO_ROOT = resolve(HERE, '..');
*
* A row is located STRUCTURALLY -- by its heading and the fence inside that
* heading's section -- never by line number. Line numbers are the first thing
* to rot here: this card was filed against `AGENTS.md:96-106` and the block sat
* at `:92-104` by the time it was implemented, three days later.
* to rot here: this card was filed against lines 96-106 of `AGENTS.md` and the
* block sat at 92-104 by the time it was implemented, three days later. ⚠️ Those
* four numbers are the EVIDENCE and every digit is kept; what is not kept is the
* `file:NNN` spelling, because a dated rot record written in anchor form reads
* as a live pointer to the next person (#15765).
*/
export const MIRRORS = [
{
Expand Down
2 changes: 1 addition & 1 deletion scripts/check-published-readme-links.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -468,7 +468,7 @@ export function resolveDocsPage(contentRoot, pathname) {
* `file` is the repo-root-relative posix path of the document, so the base is
* its own directory -- the same base GitHub uses to resolve a relative href in
* a rendered blob. Fragment and query are stripped before resolving
* (`../a.md#L10` targets `../a.md`) and the path is percent-decoded, because
* (`../<sibling>.md#L10` targets `../<sibling>.md`) and the path is percent-decoded, because
* `%20` in an href is a space in a filename.
*
* Four outcomes rather than two. `escapes` is separated from `missing` because
Expand Down
Loading
Loading