Skip to content

docs: re-anchor the last dead tracker citations in eleven lane packages' files outside src to the commits that decided them - #20923

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-20594-lane-outside-src
Sep 30, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-20594-lane-outside-src

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #20594
Clause-②: no

What changed

This is stage 16 of the domain:cli lane's dead-citation sweep: the 17 comment sites left in eleven lane packages' files outside src/** (claim 5917064266; the list on stage 15's landing 5916232164). The file surface is the one stage 14 set: README.md, tsconfig*.json, vitest.config.*, tsup.config.* and test/**.

Every comment site on that surface whose tracker number answers 404 now cites the commit that decided what the line describes, in ruling C+D's form C (comment 5749154545 on #19123). Stages 1 to 15 of this card are the precedents; the latest are PR #20883 and PR #20898.

Census

Instrument. The card's gate does not read these files (its declared surface is packages/**/src/**), so the census is taken by hand with the gate's own grammar, as stages 14 and 15 took it:

  • Files: every tracked file of the eleven packages outside src/**, with CHANGELOG.md left out: 81 files. Each is classed ON stage 14's file list (48 files) or OFF it (33: package.json, LICENSE, ledgers, objectstack.config.ts and the like). Only ON-list comment sites are this stage's.
  • Extraction: extractCitations from scripts/check-issue-citations.mjs, with its comment-prose projection for code and JSONC files and the whole file for *.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, on-list comment sites dead comment sites, off-list dead string sites
before base cb4c31dd52 2026-09-30 18:18:37 to 18:19:15 94 80 14 17 (9 numbers, 14 files) 212 2 11
after head 1e3782200f 2026-09-30 18:23:26 to 18:24:03 88 80 8 0 195 2 11

Per package, dead on-list comment sites, before to after:

package before after
packages/plugins/plugin-hono-server 4 0
packages/plugins/plugin-dev 2 0
packages/client 2 0
packages/qa/vitest-filter-preflight 2 0
packages/cloud-connection 1 0
packages/mcp 1 0
packages/qa/downstream-contract 1 0
packages/rest 1 0
packages/runtime 1 0
packages/types 1 0
packages/verify 1 0
total 17 0

Per-number anchors

Each anchor was checked by blame on the site and in the anchor's own message or diff. "Reused" names earlier stages that gave the number the same anchor.

number sites anchor what it decided
#13176 4: plugin-hono-server and plugin-dev tsconfig.test.json (:3 and :61 / :56) a68c61267 plugin-security's test layer enters tsc under a sibling tsconfig.test.json at zero residue, with no test-typecheck-debt.json; its diff writes the number into that config's header and into the TEST_DEBT graduation reused (plugin-security)
#11332 1: plugin-hono-server tsconfig.typecheck.json:12 dce5cd4f0 retires the manifest's capabilities / configuration / extensions containers as retiredKey() tombstones (ADR-0049); its changeset names the number reused (spec)
#10724 1: the same line be21955ba retires the nine dead contributes members as retiredKey() tombstones (ADR-0049); its subject names the number reused (spec)
#12181 2: client tsconfig.json:8, vitest.config.ts:33 cf71d73f8 meta.deleteItem's reset carriers; this same commit wrote both blocks (the paths rules and the alias for the real-door test), and its changeset names the number reused (client, cli)
#17853 5: vitest-filter-preflight's two test headers, rest / runtime / types vitest.config.ts 08f5f0e5a a vitest filter that selects no test file says so; its message names the card it lands. The sentence in the three configs is the one stage 14 and stage 15 rewrote in cli's and dogfood's reused (qa, cli, dogfood)
#16917 1: cloud-connection vitest.config.ts:64 7ce3154e6 the comment-only repair of this file, which wrote the "paraphrased rather than quoted" sentence; its message names the card it lands new
#8651 1: mcp vitest.config.ts:18 8c65046e4 pins mcp's three engine doubles to metadata-core's dispatch predicates, adds that devDependency and creates this config for the alias; its message names the card it lands new
#10485 1: downstream-contract test/contract.test.ts:46 35ad101bc retires ThemeSchema and the themes carrier key (ADR-0049, kept beside it); its subject names the number, and it wrote this line reused (spec, qa, cli)
#15145 1: verify tsconfig.test.json:1 45a72b0cc wires verify's test layer into typecheck through this file; its diff writes the number into this line and into the coverage-ledger graduation new

ADR and ruling records. A grep of docs/adr and scripts/adr-anchors for the 9 numbers finds one hit: ADR-0088 names #10724 in a correction note (history, not the ruling), so that number stays on the commit every earlier stage anchored it to. The sentence it sits in already names ADR-0049. 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 9.
  • Each is a plain commit with one parent.
  • Each is on the base: merge-base --is-ancestor against cb4c31dd52 exits 0 for all 9.
  • The history is complete: the checkout is not shallow. Control leg: 01218124ae, the parent of the oldest anchor 8c65046e4 (2026-08-16), exits 0. Negative control: the base as an ancestor of 8c65046e4 exits 1.

Verification

All at head 1e3782200f. Heavy runs went through scripts/pm/os-verify-lock.sh with OS_VERIFY_LOCK_SLOT=issue-20594-outside.

  • Build (whole workspace): pnpm exec turbo run build --filter='./packages/*' --filter='./packages/*/*' --concurrency=2 → 71 successful, 71 total (9 cached), lock verdict command-exit 0.
  • Typecheck, ten packages (cloud-connection declares no typecheck script): pnpm --workspace-concurrency=2 --filter plugin-hono-server, plugin-dev, client, vitest-filter-preflight, mcp, downstream-contract, rest, runtime, types, verify run typecheck → 10 of 10 Done, 0 error TS, lock verdict command-exit 0. That reads every touched JSONC config (plugin-hono-server's runs tsconfig.typecheck.json by name; the tsconfig.test.json files are read by check:test-typecheck, all at their recorded ledgers). --listFilesOnly holds all 3 touched test files in their packages' programs.
  • Tests, by name (one lock call, verdict command-exit 0). Each touched test file ran, and each touched vitest.config.ts was loaded by a run of its own package:
    • vitest-filter-preflight: test/config-wiring-sweep.test.ts, test/filter-preflight.test.ts → 2 files, 97 tests passed.
    • downstream-contract: test/contract.test.ts → 1 file, 13 tests passed.
    • client: src/meta-delete-item-carriers.test.ts (the suite the edited alias block serves) → 20 passed.
    • cloud-connection: src/canonical-expression-envelopes.test.ts (the suite the alias exists for) → 16 passed.
    • mcp: src/mcp-stdio-tools.test.ts (the engine doubles the edited block describes) → 12 passed.
    • rest, runtime, types (--project local): src/rest-exec-ctx-memo.test.ts 4 passed, src/app-plugin.ordering.test.ts 3 passed, src/email-verified.test.ts 2 passed.
  • Token guard, base cb4c31dd52 against head, 14 files, 5,764 base tokens: 0 files differ. TypeScript files are compared as leaf tokens (getChildren, JSDoc nodes skipped), JSONC files as the scanner's non-trivia token stream plus their parsed value (0 of 5 values differ). Controls, in memory only: a comment inserted into each file, 0 of 14 differ; a statement appended, 14 of 14; one character flipped inside each file's first string token, 14 of 14 (9 StringLiteral, 5 JSON strings).
  • Control bytes: a scan of the 14 files finds 0 (positive control, a scratch file holding U+0001: 1). pnpm check:nul-bytes exits 0.
  • Nothing publishes. npm pack --dry-run in each of the 9 public packages packs only dist/**, README.md, CHANGELOG.md, LICENSE and package.json: 0 of the 11 touched files in those packages is packed. After the build, the first 48 characters of each of the 16 added comment lines occur in 0 files of any package's dist/; control: a src docblock phrase an earlier stage wrote ("Maintainer-seat ruling, landed by commit cf71d73") occurs in packages/client/dist/index.d.ts. The other two packages are private.

Gates

All at head 1e3782200f, exit codes captured before any pipe.

  • Derivation: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, no paths, derives 52 commands (14 paths against merge base cb4c31dd52). Re-derived after fetching origin/main to 4d0b9cd542: the same 52, and none of the 4 upstream commits touches a derivation input or a file here.
  • All 52 exit 0, each on its first run.
  • Reconciliation: dispatch-gates --ran over the recorded COMMAND :: exit CODE list → "52 derived, 52 run, 0 NOT-MEASURED, 0 UNRUN", exit 0.
  • Roster gates the derivation marks as keeping a roster under packages/: pnpm check:authz-resolver, pnpm check:error-code-casing and pnpm check:filter-alias-parity → exit 0 each.
  • pnpm lint (repo-wide eslint . --no-inline-config, the family the derivation does not name) → exit 0, 2026-09-30T18:26:35Z to 18:30:31Z.
  • node scripts/check-issue-citations.mjs (diff mode, in the 52) 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 4d0b9cd542 is clean.

The 52 derived commands: stage 15's list with pnpm --filter @objectstack/spec run check:skill-examples and node scripts/check-tenant-audit-census.mjs (with its --self-test) in, and check:empty-state, check:liveness, check:strictness-ledger and check:variant-docs (spec) out:

  • node scripts/check-ci-filter-parity.mjs
  • node scripts/check-closing-keyword-parity.mjs and --self-test
  • node scripts/check-comment-mask-adoption.mjs and --self-test
  • node scripts/check-comment-mask-corpus.mjs
  • node scripts/check-issue-citations.mjs
  • node scripts/check-keyed-text-bounds.mjs and --self-test
  • node scripts/check-platform-object-tenancy-census.mjs and --self-test
  • node scripts/check-plugin-teardown-shape.mjs and --self-test
  • node scripts/check-registry-log-declared.mjs and --self-test
  • node scripts/check-rest-log-spy-declared.mjs and --self-test
  • node scripts/check-system-context-census.mjs and --self-test
  • node scripts/check-tenant-audit-census.mjs and --self-test
  • node scripts/check-undeclared-dep-imports.mjs and --self-test
  • node scripts/docs-audit/check-affected-docs.mjs
  • node scripts/docs-audit/check-drift-comment.mjs
  • pnpm --filter @objectstack/spec run check:skill-examples
  • pnpm check:cross-package-test-inputs, check:dispatcher-error-vocabulary, check:doc-authoring, check:driver-memory-census, check:dts-closure, check:dual-build-cjs-loads, check:engine-double-contract, check:gitlink-declared, check:issue-citations, check:lean-entry-closure, check:logger-receiver-detach, check:nul-bytes, check:objectql-double-limit, check:org-identifier, check:page-declaration-shape, check:published-files, check:query-options-erasure, check:refd-timer-probe, check:slot-lookup, check:sourcemap-no-sources-content, check:test-source-alias, check:tier-file-adoption, check:type-check-coverage, check:type-check-debt, check:watch-hint-literal, check:where-matcher

Acceptance notes


Generated by Claude Code

…packages' files outside src to the commits that decided them

Stage 16 of the domain:cli lane's dead-citation sweep: 17 comment sites on
16 lines in 14 config and test files (tsconfig*.json, vitest.config.ts,
test/**) across plugin-hono-server, plugin-dev, client,
qa/vitest-filter-preflight, cloud-connection, mcp, qa/downstream-contract,
rest, runtime, types and verify. Each dead number now cites the commit that
decided it, in ruling C+D's form C; comments only, every file keeps its
line count.

Claude-Session: https://claude.ai/code/session_01VvcEokUG1tvVxkceYfR5XB
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 8 changed file(s) yielded no anchor (packages/client/tsconfig.json, packages/client/vitest.config.ts, packages/cloud-connection/vitest.config.ts, …), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 7 changed package(s)).

What this run could not see
  • 8 changed file(s) yielded no anchor (packages/client/tsconfig.json, packages/client/vitest.config.ts, packages/cloud-connection/vitest.config.ts, …) — pages documenting those are invisible to this run
  • 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.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 48 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 4d0b9cd542c973f8914236db23efdde9adc76e4c → packageMentionDocs.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review September 30, 2026 19:32
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Sep 30, 2026
Merged via the queue into main with commit aaad682 Sep 30, 2026
40 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-20594-lane-outside-src branch September 30, 2026 19:55
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Oct 7, 2026
… stage 14's list to the commits that decided them (objectstack-ai#20947)

Part of objectstack-ai#20594
Clause-②: no

## What changed

This is stage 17 of the `domain:cli` lane's dead-citation sweep: **the
comment sites in lane files outside stage 14's file list** (claim
`5918748154`; the list on stage 16's landing `5918606717` and stage 14's
report `5914100460`). The claim names six files:

- `packages/cli/bin/run.js` and `packages/cli/bin/run-dev.js`;
- `packages/cli/scripts/check-app-nav-i18n.mjs`;
- `packages/cli/vitest-tiers.ts` and
`packages/cli/vitest-tiers.fixtures.ts`;
- `packages/plugins/plugin-hono-server/objectstack.config.ts`.

Every comment site in those files whose tracker number answers 404 now
cites the commit that decided what the line describes, in ruling C+D's
form C (comment `5749154545` on objectstack-ai#19123), except one site with no
deciding commit. Stages 1 to 16 of this card are the precedents; the
latest are PR objectstack-ai#20883, PR objectstack-ai#20898 and PR objectstack-ai#20923.

- **27 sites on 27 lines in 6 files**, covering **8 numbers**, now cite
**8 distinct commits**. 6 of the 8 anchors are reused from earlier
stages for the same decision; 2 are new (marked below).
- **Comments only.** 27 lines out and 27 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 objectstack-ai#20752 (fold `5911936313`). That includes
the 14 dead numbers inside strings in `check-app-nav-i18n.mjs`.
- **No tracker number is added.** The live numbers that share a changed
line stay as they were: objectstack-ai#14554, objectstack-ai#15564 and objectstack-ai#16746 all answer 200.
- **One site is kept without a deciding commit:** `bin/run.js:225`
(objectstack-ai#14874). See "Kept" below.
- **A `patch` changeset for `@objectstack/cli`**, because `bin/run.js`
is packed (see "Publish check").

## Census

**Instrument.** The card's gate does not read these files (its declared
surface is `packages/**/src/**`), so the census is taken by hand with
the gate's own grammar, as stages 14 to 16 took it:

- **Files:** every tracked file of the 19 lane packages outside
`src/**`, with `CHANGELOG.md` left out: 538 files. Each is classed as
one of the claim's six files, as ON stage 14's file list (`README.md`,
`tsconfig*.json`, `vitest.config.*`, `tsup.config.*`, `test/**`), or as
neither.
- **Extraction:** `extractCitations` from
`scripts/check-issue-citations.mjs`, with its comment-prose projection
for code and JSON files and the whole file for prose files. 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 | 200 | 404 | dead comment
sites, the six files | dead comment sites, whole lane surface | dead
string sites, whole lane surface |
|---|---|---|---|---|---|---|---|---|
| before | base `aaad682dbc` | 2026-09-30 20:09:40 to 20:15:09 | 852 |
798 | 54 | **28** (9 numbers) | 33 | 97 |
| after | head `89264b0c1e` | 2026-09-30 20:23:18 to 20:28:44 | 848 |
798 | 50 | **1** | 6 | 97 |

- The before count matches stage 14's per-file counts for comments:
`bin/` 10, `check-app-nav-i18n.mjs` 13 (plus 14 string sites, 27 in
all), `vitest-tiers*.ts` 3, `objectstack.config.ts` 2.
- No number present in both probes changed its answer. The 4 numbers
that left the census (objectstack-ai#10724, objectstack-ai#11332, objectstack-ai#12964, objectstack-ai#14715) were only on the
rewritten lines.
- Comment sites across the whole surface fell by exactly 27 (2,452 to
2,425). The string count did not move.

**Per file, dead comment sites, before to after:**

| file | before | after |
|---|---|---|
| `packages/cli/bin/run-dev.js` | 6 | 0 |
| `packages/cli/bin/run.js` | 4 | 1 |
| `packages/cli/scripts/check-app-nav-i18n.mjs` | 13 | 0 |
| `packages/cli/vitest-tiers.ts` | 2 | 0 |
| `packages/cli/vitest-tiers.fixtures.ts` | 1 | 0 |
| `packages/plugins/plugin-hono-server/objectstack.config.ts` | 2 | 0 |
| **total** | **28** | **1** |

**What the lane surface outside `src/**` still holds after this stage:**
6 dead comment sites, all without a deciding commit (`bin/run.js:225`
and the five stage 14 kept), and 97 dead string sites (objectstack-ai#20752's form D).

## Per-number anchors

Each anchor was checked by blame on the site and in the anchor's own
message or diff. "Reused" names the earlier stage that gave the number
the same anchor.

| number | sites | anchor | what it decided | |
|---|---|---|---|---|
| `objectstack-ai#12964` | 3: `run-dev.js:71`, `:152`, `:466` | `e6fd1caf7` |
`bin/run-dev.js` collects oclif's module-load warnings and names the
missing build output instead of "command not found"; its changeset names
the number, and it wrote `:152` and `:466` itself | reused (stage 14,
cli tests) |
| `objectstack-ai#14715` | 2: `run-dev.js:362`, `:400` | `accb9231c` | the squash of
that number's PR (its subject names it): the never-read reader's case
keeps its product assertions, "the child exits on its own, with code 2"
| reused (stage 14) |
| `objectstack-ai#14858` | 4: `run-dev.js:377`; `run.js:163`, `:168`, `:220` |
`0c5e97368` | a closed stderr read end exits 2 instead of dying of an
uncaught EPIPE; its subject names the number, and it added the
`run-dev.js` listener and docblock that `:377` heads | reused (stage 14,
cli tests) |
| `objectstack-ai#17891` | 9 in `check-app-nav-i18n.mjs` (`:112`, `:221`, `:237`,
`:261`, `:289`, `:302`, `:502`, `:552`, `:706`) | `ca9d9d361` | widens
`check:app-nav-i18n` from one app to the declared platform-app
population (the Account shell in the roster, one build probe per shell,
per-app counts in the pass line); its message names the card it lands |
**new** |
| `objectstack-ai#17759` | 4 in `check-app-nav-i18n.mjs` (`:148`, `:238`, `:259`,
`:537`) | `c744c0af3` | translates the Account app's contributed
`nav_connect_agent` in all four locales, one namespace per app; its
message names the card it lands | **new** |
| `objectstack-ai#13504` | 3: `vitest-tiers.ts:5`, `:67`;
`vitest-tiers.fixtures.ts:194` | `44813ba57` | the tier half of that
card: the named `unit` / `integration` tiers and the behavioural
predicate that replaced the text-match census | reused (stage 14,
`vitest.config.ts`) |
| `objectstack-ai#11332` | 1: `objectstack.config.ts:19` | `dce5cd4f0` | retires the
manifest's `capabilities` / `configuration` / `extensions` containers
(ADR-0049); it wrote this comment | reused (stage 16) |
| `objectstack-ai#10724` | 1: `objectstack.config.ts:26` | `be21955ba` | retires the
nine dead `contributes` members (ADR-0049); its subject names the
number, and it wrote this comment | reused (stage 16) |


**ADR and ruling records.** A grep of `docs/adr` and
`scripts/adr-anchors` for the 8 numbers (and objectstack-ai#14874) finds one hit:
ADR-0088 names objectstack-ai#10724 in a correction note (history, not the ruling), so
that number stays on the commit stage 16 anchored it to. The sentence it
sits in already names ADR-0049. 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 8.
- **Each is a plain commit** with one parent.
- **Each is on the base:** `merge-base --is-ancestor` against
`aaad682dbc` exits 0 for all 8.
- **The history is complete:** the checkout is not shallow, and an exit
0 from `--is-ancestor` proves itself. Negative control: the base as an
ancestor of the oldest anchor `be21955ba` (2026-08-25) exits 1.

## Kept: no deciding commit found

`bin/run.js:225` keeps objectstack-ai#14874 ("npm packs a `bin` target regardless" of
`files`). The history search this stage ran:
- `git log --grep` for the number finds only this card's re-anchoring
commits.
- `git log -S` finds the earliest mention in `95d5cbb316`, which cites
objectstack-ai#14874 as the measurement ("objectstack-ai#14874 measured the other half of the same
lesson"). It does not decide it.
- `5023630b1` records the same measurement in its changeset, but neither
its message nor its diff names the number. Stage 14 named it as a
candidate, and the ACCEPT `5914299201` ruled that a commit which only
restates or applies a decision is not the anchor.

The five `cli` sites stage 14 kept (objectstack-ai#10149, objectstack-ai#11048, objectstack-ai#14874 ×2 in
`test/published-entry-stderr-error-listener.test.ts` and 1 in
`test/published-subpath-hook-body.pin.test.ts`) were searched again the
same way. For objectstack-ai#10149, `cc21aad8ed` is "Part of" it and leaves the
decision to the maintainer, and `d18bc32770` applies its reasoning. For
objectstack-ai#11048, `568de194ec` files it unassigned as an open support decision. So
no deciding commit was found, and they stay as they are.

## Verification

All at head `89264b0c1e`. Heavy runs went through
`scripts/pm/os-verify-lock.sh` with
`OS_VERIFY_LOCK_SLOT=issue-20594-offlist`.

- **Build (whole workspace):** `pnpm exec turbo run build
--filter='./packages/*' --filter='./packages/*/*' --concurrency=2` → 71
successful, 71 total (7 cached), lock verdict command-exit 0.
- **Typecheck:** `pnpm --workspace-concurrency=2 --filter
@objectstack/cli --filter @objectstack/plugin-hono-server run typecheck`
→ both `Done`, 0 `error TS`, lock verdict command-exit 0.
`check:test-typecheck` holds both ledgers where they were: cli 3 files /
28 errors / 6 pinned signatures, plugin-hono-server 0. `--listFilesOnly`
shows cli's `tsconfig.test.json` program holds `vitest-tiers.ts` and
`vitest-tiers.fixtures.ts`, and plugin-hono-server's
`tsconfig.typecheck.json` holds `objectstack.config.ts`.
- **cli `unit` tier:** `pnpm --filter @objectstack/cli exec vitest run
--project unit --maxWorkers=2` → 239 files, 3391 tests passed, lock
verdict command-exit 0. It holds `test/vitest-tiers-partition.test.ts`,
which imports both `vitest-tiers*.ts` files, and every run loads
`vitest.config.ts`, which imports `vitest-tiers.ts`.
- **cli `integration` tier**, run locally because the diff touches
`bin/` (the spawn entries): `--project integration --maxWorkers=2` → 67
files, 572 passed and 1 skipped (a data-conditional `skipIf` in
`test/migrate-meta-default-range.test.ts`), lock verdict command-exit 0.
It holds `test/published-entry-stderr-error-listener.test.ts`, which
spawns `bin/run.js`.
- **Nightly-tier files that spawn the two entries**, by name under
`OS_TEST_TIERS=nightly`: `test/run-dev-unbuilt-workspace.e2e.test.ts`,
`test/published-entry-stderr-nonblocking.e2e.test.ts` and
`test/run-dev-stderr-nonblocking.e2e.test.ts` → 3 files, 21 tests
passed, lock verdict command-exit 0.
- **The script, the way CI calls it:** `pnpm check:app-nav-i18n`
(`--self-test`, then the real run; `lint.yml` runs this) → exit 0. The
self-test passes, and the pass line reads `OK (11 contributor(s), 4
locale(s), 2 app(s) — setup: 55 merged nav id(s), account: 12 merged nav
id(s) — every id labelled in every locale)`.
- **The entries, smoke:** `node packages/cli/bin/run.js --help` exit 0
(66 lines); `node packages/cli/bin/run-dev.js --help` exit 0 (66 lines);
`node packages/cli/bin/run.js --version` exit 0; `node
packages/cli/bin/run.js no-such-command-xyz` exit 2 with oclif's
`command … not found`.
- **Token guard**, base `aaad682dbc` against head, 6 files, 6,224 base
tokens: **0 files differ**. Leaf tokens come from the TypeScript parser
(`getChildren`, JSDoc nodes skipped; `.js` / `.mjs` parsed as JS).
Controls, in memory only: a comment inserted into each file, 0 of 6
differ; a statement appended, 6 of 6; one character flipped inside each
file's first `StringLiteral`, 6 of 6. The comment control's first form
put its comment above the shebang in the three `#!` files and moved
tokens in 3 of 6. It was corrected to insert below the shebang before it
was used as a reading.
- **Control bytes:** a scan of the 6 files and the changeset finds 0
(positive control, a scratch file holding U+0001: 1). `pnpm
check:nul-bytes` exits 0.
- **Publish check:** `npm pack --dry-run` in `packages/cli` packs
`bin/run.js` (a `bin` target, packed regardless of `files`) beside
`dist/**`, `README.md`, `CHANGELOG.md`, `LICENSE` and `package.json`. It
packs none of `bin/run-dev.js`, `scripts/` or `vitest-tiers*.ts`, so the
`patch` changeset covers `bin/run.js` alone. `plugin-hono-server` packs
no `objectstack.config.ts`, and its `src/` never imports that file.
After the build, the first 48 characters of each of the 27 added comment
lines occur in 0 files of any package's `dist/`. Control: the `src`
docblock phrase `document" (commit 2b641dd). Both device-flow` occurs
in 1 file of `packages/cli/dist`. (plugin-hono-server's bundler keeps no
comments, so its `dist` gives no reading either way: its own control
phrase occurs in 0 files.)

## Gates

All at head `89264b0c1e`, exit codes captured before any pipe.

- **Derivation:** `node scripts/pm/dispatch-gates.mjs --repo
objectstack-ai/objectstack --commands`, no paths, derives **57
commands** (7 paths against merge base `aaad682db`). Re-derived after
fetching `origin/main` to `31c39964fc`: the same 57. None of the 5
upstream commits touches a derivation input or a file here.
- **All 57 exit 0**, each on its first run.
- **Reconciliation:** `dispatch-gates --ran` over the recorded `COMMAND
:: exit CODE` list → "57 derived, 57 run, 0 NOT-MEASURED, 0 UNRUN", exit
0.
- **Roster gates the derivation marks as keeping a roster under a
touched directory:** `node scripts/check-changeset-fixed.mjs`, `pnpm
check:authz-resolver`, `pnpm check:error-code-casing`, `pnpm
check:filter-alias-parity` and `node scripts/release-pending-publish.mjs
--self-test` → exit 0 each.
- **`pnpm lint`** (repo-wide `eslint . --no-inline-config`, the family
the derivation does not name) → exit 0, 2026-09-30T21:33:42Z to
21:36:25Z.
- `node scripts/check-issue-citations.mjs` (diff mode, in the 57) reads
0 files, because none of these paths is on its declared surface. The
hand census above is the measurement for this surface.
- The changeset gates in the 57: `check-empty-changeset` ("1 declaring
changeset(s) added"), `check-changeset-no-major` ("no `major` bump"),
`check-adr-0087-registration` ("no declared-breaking changeset").
- A local `git merge-tree --write-tree` of this head against
`origin/main` `3fbf3ca617` is clean.

**The 57 derived commands:** stage 16's 52, minus `pnpm --filter
@objectstack/spec run check:skill-examples`, `pnpm
check:dispatcher-error-vocabulary`, `pnpm check:engine-double-contract`,
`pnpm check:objectql-double-limit`, `pnpm check:query-options-erasure`,
`pnpm check:type-check-coverage`, `pnpm check:type-check-debt` and `pnpm
check:where-matcher`, plus the changeset family
(`check-adr-0087-registration`, `check-changeset-no-major`,
`check-empty-changeset`, each with its `--self-test`; `pnpm
check:changeset-gate-self-tests`, `pnpm check:objectui-changeset`, `pnpm
check:pm-changeset-deadline-census`), `pnpm check:i18n`, `pnpm
check:i18n-coverage`, `pnpm check:i18n-walk-parity` and `node
scripts/pm/release-rehearsal-clone.mjs --self-test`.

## Acceptance notes

- **Not this card's: dead numbers in strings.** `check-app-nav-i18n.mjs`
holds 14 (objectstack-ai#17891 ×13, objectstack-ai#17759 ×1: the self-test's `expect` titles and
messages, and the `--self-test` pass line, which prints `(objectstack-ai#17891)` at
runtime). The lane surface holds 97 dead string sites in all. They
belong to objectstack-ai#20752's form D (fold `5911936313`).
- **What this card has left:** the 6 comment sites without a deciding
commit, listed above.

---
_Generated by [Claude
Code](https://claude.ai/code/session_01VvcEokUG1tvVxkceYfR5XB)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants