Repository navigation
Commit cf684c9
docs(dogfood): re-anchor the dead tracker citations in packages/qa/dogfood's files outside src to the commits and ADR that decided them (#20898)
Part of #20594
Clause-②: no
## What changed
This is stage 15 of the `domain:cli` lane's dead-citation sweep:
**`packages/qa/dogfood`'s dead citations in files outside `src/**`**,
the largest package left after stage 14 (claim `5914651671`). The
package has no `src/` at all, so the surface is its `test/**`,
`README.md`, `tsconfig.json` and `vitest.config.ts`.
Every comment site on that surface whose tracker number answers 404 now
cites the object that decided what the line describes, in ruling C+D's
form C (comment `5749154545` on #19123): the ADR clause when one records
the ruling, otherwise the commit in this repository's history. Stages 1
to 14 of this card are the precedents; the latest is PR #20883.
- **94 sites on 93 lines in 27 files**, covering **24 numbers**, now
cite **24 distinct commits and one ADR clause** (ADR-0029 D9.2a).
- The 27 files are `vitest.config.ts` and 26 under `test/**`: 21 test
files, 4 helper modules and 1 fixture.
- **Comments only.** 93 lines out and 93 in, and every file keeps its
line count. A token guard (below) shows zero non-comment tokens changed.
- **String literals, `describe` / `it` titles and messages are
untouched.** They belong to #20752 (form D, fold `5911936313`); 28 such
sites stay on this file list, listed in the acceptance notes.
- **No tracker number is added.** The live numbers that share a changed
line stay as they were: #4757, #6915, #7987, #8074, #8284, #8408, #9719,
#11373 and #17978 all answer 200.
- **Sites left without a deciding commit: none.** Every one of the 24
numbers has one.
- Where an earlier stage anchored a number and the line here describes
the same decision, the same anchor is reused: 16 of the 24 numbers. The
other 8 anchors are new (marked below).
- A trailing box rule (`── … ─────`) is shortened by the characters its
heading gained, never below one dash. Three of the five section headers
keep their width; `admin-route-nonadmin-refusal:339` grows by 2
characters and `two-doors-permission:81`, which already ended in one
dash, by 11.
## Census
**Instrument.** The card's gate does not read these files: its declared
surface is `packages/**/src/**`, and `surfaceFor` answers null for all
27 touched paths (the control `packages/cli/src/commands/init.ts`
answers `package-docblocks`). So the census is taken by hand, with the
gate's own grammar, as stage 14 took it:
- **Files:** every tracked file of `packages/qa/dogfood` outside
`src/**`, with `CHANGELOG.md` (claim) and `package.json` (not on the
claim's list) left out. That is 178 files.
- **Extraction:** `extractCitations` from
`scripts/check-issue-citations.mjs`, with its comment-prose projection
for code and JSONC files and the whole file for `README.md`. The
whole-file extraction minus the comment projection gives the string
sites.
- **Numbers kept:** only those naming this repository
(`namesThisRepository`).
- **Probe:** each distinct number, `GET
/repos/objectstack-ai/objectstack/issues/N`; 404 means dead.
| | tree | probe window (UTC) | numbers | answer 200 | answer 404 | dead
comment sites | comment sites | dead string sites |
|---|---|---|---|---|---|---|---|---|
| before | base `4edb61449b` | 2026-09-30 15:46:43 to 15:49:29 | 386 |
359 | 27 | **94** (24 numbers, 27 files) | 1,145 | 28 (13 files) |
| after | head `57ffb83b00` | 2026-09-30 15:59:37 to 16:02:15 | 375 |
359 | 16 | **0** | 1,051 | 28 (13 files) |
- The before count matches stage 14's census at `660a9b247`: 94 comment
sites and 28 string sites in 13 files.
- No number present in both probes changed its answer. The 11 numbers
that left the census were only on the rewritten lines.
- Comment sites fell by exactly 94, the rewritten sites. String sites
did not move.
- `README.md` cites #2018 and #1994, and `package.json`'s description
cites #2018, #1994 and #2004. All answer 200.
## Per-number anchors
Each anchor was checked by blame on the site, and in the anchor's own
message or diff. "Reused" names an earlier stage that gave the number
the same anchor.
| number | sites | anchor | what it decided | |
|---|---|---|---|---|
| `#6293` | 9 | `c39a911ae` | the build stand-in:
`build-shaped-artifact.ts` runs the real lowering, and no published
surface grows (its subject names the card) | reused (cli `src`) |
| `#6483` | 15 | `ee58392e1` | the ADR-0005 rollback of `permission`
(and eight more types) to `allowOrgOverride: false`;
`allowRuntimeCreate` stays open | reused (spec, plugin-security,
runtime) |
| `#8460` | 4 | ADR-0029 D9.2a | the ruling itself, 2026-08-13, option A
"tenant wins"; implemented in `01a7337fc`, which amends the ADR | reused
(spec stage 6) |
| `#8676` | 9 | `d6e80b28b` | flags `sys_account.password` and
`previous_password_hashes` `internal` | reused (plugin-auth) |
| `#8711` | 3 | `2ce1eb41b` | half (2): the ruled narrowing of the
matrix's completeness claim to routes (its message records the
maintainer ruling) | **new** |
| `#8711` | 1 | `60ade586e` | half (1): the two `active` rows with no
`covers`, and why (`matrix.ts:393`) | **new** |
| `#8811` | 1 | `d6e793507` | adds the `grant-validity-window` matrix
row (its subject names the card) | **new** |
| `#8839` | 7 | `c25b2d52a` | comment moderation stops being dead behind
the delete floor; ruling of 2026-08-15, reading 1 | reused
(plugin-security) |
| `#8919` | 1 | `b5378550e` | gates `/meta` publish and rollback on
`manage_metadata`, with the enumeration pin | reused (rest, runtime,
cloud-connection) |
| `#9797` | 7 | `1258dcaee` | the PR itself: the opt-in whole-operation
dispatch that restores the unscoped multi-delete refusal | **new** |
| `#9934` | 2 | `79c46da90` | the producer-side `userMessage` marking,
including the QuickJS side-channel | reused (types, rest, client,
runtime, plugin-hono-server, spec) |
| `#10243` | 1 | `266436a7f` | the toggle ruling: `POST
/automation/:name/toggle` joins the `manage_metadata` write set
(`automation-toggle-tenant-scope:4`) | reused (runtime,
service-automation) |
| `#10243` | 1 | `02b41232d` | the measured cross-organization toggle
leak ADR-0126 §7.2 retires (`packaged-activation-ledger-reach:291`) |
reused (runtime, service-automation) |
| `#10943` | 1 | `46d34ab7c` | `fallbackImport` becomes a
caller-supplied parameter | reused (types, cli, verify) |
| `#10996` | 1 | `02b41232d` | the PR itself, the first landing of this
file as a measurement | **new** |
| `#11477` | 7 | `6dd3e6968` | `/admin/remove-user` authorizes before
the break-glass guard (its message records "Ruled option A on" the card)
| reused (plugin-auth, verify) |
| `#11530` | 1 | `033a34c7c` | the PR itself: retires the
`set_user_role` console action | **new** |
| `#11686` | 1 | `7131f12bf` | the PR itself: `hasPlatformAdminStanding`
as the one authority | **new** |
| `#12176` | 3 | `7986d973f` | stage 3 of the ruled retirement:
un-mounts the compound arities, `PUT /meta/:type/:section/:name` among
them. The ruling's `D3` ordinal is kept beside it | reused (rest,
client, runtime, spec) |
| `#12194` | 1 | `311433f6b` | declares the metadata item-name grammar |
reused (rest, client, runtime, spec) |
| `#13214` | 4 | `cc837dbfe` | the ruled ownership gate at `GET
/ui/view/:object/:type`; its diff writes these census lines and its
message the 2026-08-30 ruling | reused (rest) |
| `#16589` | 4 | `555a89cbd` | `driver-memory` refuses a tenant-scoped
call; its diff names the card at every seam | reused (trigger-schedule)
|
| `#16659` | 6 | `ecdfc9411` | a time-triggered flow declares its acting
organization; its diff adds these pins and the fixture. The `F2` ordinal
is kept, as the trigger-schedule stage kept it | reused
(trigger-schedule, service-automation, spec, lint) |
| `#16687` | 1 | `779710213` | the PR itself; its squash carries the
contract-review patch round the line describes | **new** |
| `#17853` | 1 | `08f5f0e5a` | a vitest filter that selects nothing says
so (the same sentence stage 14 rewrote in cli's config) | reused (qa,
cli) |
| `#19306` | 2 | `f9e16d856` | a packaged permission set's DELETE stops
reporting a deletion; its diff adds both pins | **new** |
**ADR and ruling records.** A grep of `docs/adr` and
`scripts/adr-anchors` for the 24 numbers finds three: #8460, #6483 and
#10243. ADR-0029 D9.2a is the ruling for #8460 (it carries the number in
its heading), so it is cited. The #6483 hits (ADR-0086, ADR-0094,
ADR-0126 and two adr-anchors entries) and the #10243 hits (ADR-0126,
ADR-0131) mention those landings as history; none records the ruling
itself, so those two stay on the commit every earlier stage anchored
them to. The control number `7329` finds 1 file in the same tree.
**Anchor checks:**
- **Each sha is unambiguous:** `git rev-parse --disambiguate` gives
count 1 for each of the 24.
- **Each is a plain commit** with one parent.
- **Each is on the base:** `merge-base --is-ancestor` against
`4edb61449b` exits 0 for all 24.
- **The history is complete:** the checkout is not shallow. Control leg:
`255588bd36`, the parent of the oldest anchor `ee58392e1` (2026-08-09),
exits 0. Negative control: the base as an ancestor of `ee58392e1` exits
1.
## Verification
All at head `57ffb83b00`. Heavy runs went through
`scripts/pm/os-verify-lock.sh` with
`OS_VERIFY_LOCK_SLOT=issue-20594-dogfood`.
- **Build (dependency closure):** `pnpm exec turbo run build
--filter='@objectstack/dogfood^...' --concurrency=2` → 63 successful, 63
total (32 cached), lock verdict exit 0.
- **Every touched test file ran, by name.** Dogfood has two vitest
projects (`shared-showcase` and `isolated`) and no tier split, so one
run named all 21 touched test files plus the unit tests of the two
touched helpers no touched test imports
(`authz-probe-blind-spot.test.ts`, the census module's only importer,
and `enterprise-organizations.test.ts`): `pnpm --filter
@objectstack/dogfood exec vitest run --maxWorkers=2 FILES` → **Test
Files 23 passed (23), Tests 317 passed (317)**, lock verdict
command-exit 0. `vitest.config.ts` is loaded by that run.
- **Typecheck:** `pnpm --filter @objectstack/dogfood typecheck` (`tsc
--noEmit`) → lock verdict command-exit 0. `--listFilesOnly` shows 26 of
the 27 touched files in the program; the 27th is `vitest.config.ts`.
- **Token guard** (TypeScript leaf tokens via `getChildren`, JSDoc nodes
skipped), base `4edb61449b` against head, 27 files, 52,502 base tokens:
**0 files differ**. Controls, in memory only: a comment inserted into
each file, 0 of 27 differ; a statement appended, 27 of 27; one character
flipped inside each file's first `StringLiteral`, 27 of 27.
- **Control bytes:** a scan of the 27 files finds 0 (positive control, a
scratch file holding U+0001: 1). `pnpm check:nul-bytes` exits 0.
- **Derived gates and lint:** listed under "Gates".
## Gates
All at head `57ffb83b00`, exit codes captured before any pipe.
- **Derivation:** `node scripts/pm/dispatch-gates.mjs --repo
objectstack-ai/objectstack --commands`, no paths, derives **53
commands** for this change set (27 paths against merge base
`4edb61449b`). Re-derived after two fetches of `origin/main` (to
`00a92e18da`, then `33b6e8bece`): the same 53, and none of the upstream
commits touches a derivation input or a file here.
- **All 53 exit 0.** One needed a second run for a reason outside the
diff: `pnpm check:dual-build-cjs-loads` first exited 3 (`PREREQUISITE
NOT MET`, no `dist/` for 8 packages outside dogfood's build closure);
after `pnpm exec turbo run build --filter='./packages/*'
--filter='./packages/*/*' --concurrency=2` (71 of 71, all cached) it
exits 0.
- **Reconciliation:** `dispatch-gates --ran` over the recorded `COMMAND
:: exit CODE` list → "53 derived, 53 run, 0 NOT-MEASURED, 0 UNRUN", exit
0.
- **`pnpm lint`** (repo-wide `eslint . --no-inline-config`, the family
the derivation does not name) → exit 0, 2026-09-30T16:13:49Z to
16:18:00Z.
- `node scripts/check-issue-citations.mjs` (diff mode, in the 53) reads
0 files, because none of these paths is on its declared surface; the
hand census above is the measurement for this surface.
- A local `git merge-tree --write-tree` of this head against
`origin/main` `33b6e8bece` is clean.
**The 53 derived commands:**
- `node scripts/check-ci-filter-parity.mjs`
- `node scripts/check-closing-keyword-parity.mjs`
- `node scripts/check-closing-keyword-parity.mjs --self-test`
- `node scripts/check-comment-mask-adoption.mjs`
- `node scripts/check-comment-mask-adoption.mjs --self-test`
- `node scripts/check-comment-mask-corpus.mjs`
- `node scripts/check-issue-citations.mjs`
- `node scripts/check-keyed-text-bounds.mjs`
- `node scripts/check-keyed-text-bounds.mjs --self-test`
- `node scripts/check-platform-object-tenancy-census.mjs`
- `node scripts/check-platform-object-tenancy-census.mjs --self-test`
- `node scripts/check-plugin-teardown-shape.mjs`
- `node scripts/check-plugin-teardown-shape.mjs --self-test`
- `node scripts/check-registry-log-declared.mjs`
- `node scripts/check-registry-log-declared.mjs --self-test`
- `node scripts/check-rest-log-spy-declared.mjs`
- `node scripts/check-rest-log-spy-declared.mjs --self-test`
- `node scripts/check-system-context-census.mjs`
- `node scripts/check-system-context-census.mjs --self-test`
- `node scripts/check-undeclared-dep-imports.mjs`
- `node scripts/check-undeclared-dep-imports.mjs --self-test`
- `node scripts/docs-audit/check-affected-docs.mjs`
- `node scripts/docs-audit/check-drift-comment.mjs`
- `pnpm --filter @objectstack/spec run check:empty-state`
- `pnpm --filter @objectstack/spec run check:liveness`
- `pnpm --filter @objectstack/spec run check:strictness-ledger`
- `pnpm --filter @objectstack/spec run check:variant-docs`
- `pnpm check:cross-package-test-inputs`
- `pnpm check:dispatcher-error-vocabulary`
- `pnpm check:doc-authoring`
- `pnpm check:driver-memory-census`
- `pnpm check:dts-closure`
- `pnpm check:dual-build-cjs-loads`
- `pnpm check:engine-double-contract`
- `pnpm check:gitlink-declared`
- `pnpm check:issue-citations`
- `pnpm check:lean-entry-closure`
- `pnpm check:logger-receiver-detach`
- `pnpm check:nul-bytes`
- `pnpm check:objectql-double-limit`
- `pnpm check:org-identifier`
- `pnpm check:page-declaration-shape`
- `pnpm check:published-files`
- `pnpm check:query-options-erasure`
- `pnpm check:refd-timer-probe`
- `pnpm check:slot-lookup`
- `pnpm check:sourcemap-no-sources-content`
- `pnpm check:test-source-alias`
- `pnpm check:tier-file-adoption`
- `pnpm check:type-check-coverage`
- `pnpm check:type-check-debt`
- `pnpm check:watch-hint-literal`
- `pnpm check:where-matcher`
## Acceptance notes
- **Changeset:** none. `@objectstack/dogfood` is `private: true`, so
nothing here publishes; the PR carries `skip-changeset`.
- **28 dead string sites stay on this file list** (16 numbers in 13
files: #6293, #6483, #8676, #8710, #8711, #8811, #9934, #10243, #11477,
#11530, #11686, #11757, #12176, #13260, #16589, #16659). They are
`describe` / `it` titles and string values such as the matrix rows'
`note:` text. They belong to #20752 (form D).
- **What remains on this card after this stage** (stage 14's census at
`660a9b247`, report `5914100460`): 17 comment sites in the other lane
packages outside `src/**` (`plugin-hono-server` 4; `plugin-dev`,
`client` and `qa/vitest-filter-preflight` 2 each; `cloud-connection`,
`mcp`, `qa/downstream-contract`, `rest`, `runtime`, `types` and `verify`
1 each), the five `cli` sites with no deciding commit, and the 55
off-list sites stage 14 listed. None of them is touched here.
- **No open PR touches `packages/qa/dogfood`** (all 10 open PRs' file
lists read at 2026-09-30T15:56:00Z). The in-flight branch for #20862
adds one new file there,
`automation-authoring-doors-durable.dogfood.test.ts`, which is not among
these 27.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01VvcEokUG1tvVxkceYfR5XB)_
Co-authored-by: Claude <noreply@anthropic.com>1 parent 8fec76a commit cf684c9
27 files changed
Lines changed: 93 additions & 93 deletions
File tree
- packages/qa/dogfood
- test
- fixtures
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | 3 | | |
4 | | - | |
| 4 | + | |
5 | 5 | | |
6 | 6 | | |
7 | | - | |
| 7 | + | |
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
| |||
88 | 88 | | |
89 | 89 | | |
90 | 90 | | |
91 | | - | |
| 91 | + | |
92 | 92 | | |
93 | | - | |
| 93 | + | |
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
| |||
277 | 277 | | |
278 | 278 | | |
279 | 279 | | |
280 | | - | |
| 280 | + | |
281 | 281 | | |
282 | 282 | | |
283 | 283 | | |
| |||
334 | 334 | | |
335 | 335 | | |
336 | 336 | | |
337 | | - | |
| 337 | + | |
338 | 338 | | |
339 | 339 | | |
340 | 340 | | |
341 | | - | |
| 341 | + | |
342 | 342 | | |
343 | 343 | | |
344 | 344 | | |
| |||
361 | 361 | | |
362 | 362 | | |
363 | 363 | | |
364 | | - | |
| 364 | + | |
365 | 365 | | |
366 | 366 | | |
367 | 367 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | | - | |
| 33 | + | |
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
| |||
59 | 59 | | |
60 | 60 | | |
61 | 61 | | |
62 | | - | |
| 62 | + | |
63 | 63 | | |
64 | 64 | | |
65 | 65 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
76 | 76 | | |
77 | 77 | | |
78 | 78 | | |
79 | | - | |
| 79 | + | |
80 | 80 | | |
81 | 81 | | |
82 | 82 | | |
| |||
88 | 88 | | |
89 | 89 | | |
90 | 90 | | |
91 | | - | |
| 91 | + | |
92 | 92 | | |
93 | 93 | | |
94 | 94 | | |
| |||
336 | 336 | | |
337 | 337 | | |
338 | 338 | | |
339 | | - | |
| 339 | + | |
340 | 340 | | |
341 | 341 | | |
342 | 342 | | |
| |||
345 | 345 | | |
346 | 346 | | |
347 | 347 | | |
348 | | - | |
| 348 | + | |
349 | 349 | | |
350 | 350 | | |
351 | 351 | | |
| |||
634 | 634 | | |
635 | 635 | | |
636 | 636 | | |
637 | | - | |
| 637 | + | |
638 | 638 | | |
639 | 639 | | |
640 | 640 | | |
| |||
653 | 653 | | |
654 | 654 | | |
655 | 655 | | |
656 | | - | |
| 656 | + | |
657 | 657 | | |
658 | 658 | | |
659 | 659 | | |
| |||
720 | 720 | | |
721 | 721 | | |
722 | 722 | | |
723 | | - | |
| 723 | + | |
724 | 724 | | |
725 | 725 | | |
726 | 726 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
| 12 | + | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
| 23 | + | |
24 | 24 | | |
25 | 25 | | |
26 | 26 | | |
| |||
35 | 35 | | |
36 | 36 | | |
37 | 37 | | |
38 | | - | |
| 38 | + | |
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
| |||
163 | 163 | | |
164 | 164 | | |
165 | 165 | | |
166 | | - | |
| 166 | + | |
167 | 167 | | |
168 | 168 | | |
169 | 169 | | |
| |||
193 | 193 | | |
194 | 194 | | |
195 | 195 | | |
196 | | - | |
| 196 | + | |
197 | 197 | | |
198 | 198 | | |
199 | 199 | | |
| |||
259 | 259 | | |
260 | 260 | | |
261 | 261 | | |
262 | | - | |
| 262 | + | |
263 | 263 | | |
264 | 264 | | |
265 | 265 | | |
| |||
352 | 352 | | |
353 | 353 | | |
354 | 354 | | |
355 | | - | |
| 355 | + | |
356 | 356 | | |
357 | 357 | | |
358 | 358 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
93 | 93 | | |
94 | 94 | | |
95 | 95 | | |
96 | | - | |
| 96 | + | |
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
| |||
390 | 390 | | |
391 | 391 | | |
392 | 392 | | |
393 | | - | |
| 393 | + | |
394 | 394 | | |
395 | 395 | | |
396 | 396 | | |
397 | 397 | | |
398 | | - | |
| 398 | + | |
399 | 399 | | |
400 | 400 | | |
401 | 401 | | |
| |||
408 | 408 | | |
409 | 409 | | |
410 | 410 | | |
411 | | - | |
| 411 | + | |
412 | 412 | | |
413 | 413 | | |
414 | 414 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
| 6 | + | |
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
431 | 431 | | |
432 | 432 | | |
433 | 433 | | |
434 | | - | |
| 434 | + | |
435 | 435 | | |
436 | | - | |
| 436 | + | |
437 | 437 | | |
438 | 438 | | |
439 | 439 | | |
| |||
445 | 445 | | |
446 | 446 | | |
447 | 447 | | |
448 | | - | |
| 448 | + | |
449 | 449 | | |
450 | | - | |
| 450 | + | |
451 | 451 | | |
452 | 452 | | |
453 | 453 | | |
| |||
0 commit comments