Skip to content

Commit 9b0de7d

Browse files
docs(tsconfig,tests): prose naming the retired check:type-source-resolution reads in the past tense (#20996)
Fixes #18955 Clause-②: no `skip-changeset`: measured, not asserted. Nothing this diff touches is published (see Verification). Comments, plus one sentence of one test failure message. Prose that names the retired `check:type-source-resolution` gate in the present tense ("refuses", "requires", "is the gate", "reports", "states", "is declared in its registry") now says the gate did those things until it was retired on 2026-09-18 (#18373). Where a tsconfig `paths` rule's reason pointed at the gate, the comment now says plainly that no gate checks the rule. Dated measurements and records of why something was written are left exactly as they were. The one executable change is that sentence: the `expect()` failure message in `packages/cli/src/commands/child-env-source-loader.pin.test.ts`, which the claim's file surface admitted in comment 5922590244. No other executable line changes, and no compiler option changes: every edited tsconfig parses to a config identical to the base, 6 of the 7 edited `.ts`/`.js` files print to an identical comment-stripped AST, and the seventh differs only in two string-literal operands of that one message. ## What replaced the gate: nothing that checks these rules The retirement ruling (#18373, comment 5725045904, item 3) names what still covers the *risk*, verbatim: "turbo's `^build` ordering for CI; the content stamp (#16529, batch #151 item 1) for the linked-sibling case; editor staleness on exception packages is the state ~half of the programs were already in." None of those reads or requires a tsconfig `paths` rule. I checked this myself: across `scripts/**`, no script reads `compilerOptions.paths`. The only readers of `compilerOptions` are `check-type-check-coverage.mjs` (which reads `include` / `files` / `typeRoots` / `rootDir`), test fixtures in `check-dev-prereqs.mjs`, and scripts that write their own configs. So each rewritten sentence is either past tense ("refused ... until it was retired") or a true present-tense statement ("no gate checks this rule now"). No sentence names a guard that does not exist. The `paths` rules themselves are unchanged and still do what their comments say, which is to make `tsc` grade against source rather than the last build. ## The rule applied, per line The card's own criterion, verbatim: 「**现在时的断言**(「这道门禁拒绝 X」)现在为假,该修;**历史记录**(「当年因为 X 才这么写」)不是漂移,⛔ 不该动。这两类在同一个注释块里往往挨着,需要逐行判,⛔ 不能整批替换。」 How I applied it: - **History, left unchanged:** a clause inside a frame that dates it or declares itself a record. Examples of such frames: a sha, a date, "measured before this file was written", "this paragraph is the record of why". Narrative present tense inside such a frame is kept as written. - **Present-tense claim, repaired:** a clause outside any such frame that states what the gate does, requires or refuses. Also repaired: a clause that points the reader at the gate, its file, its registry or its header as a live authority. That includes the verbless `(pnpm check:type-source-resolution)` pointers, which present a command that no longer exists as the check. The repair changes tense and adds the retirement. It never deletes the history. ## Measurement The count is wrap-flattened, not single-line. Each tracked file was read whole, and a mention was matched across a line break plus a comment marker between any two segments of the name. Readings are at `origin/main` `05be35259`: | class | mentions | files | |---|---|---| | `packages/**/tsconfig*.json` | 27 | 18 | | `examples/*/tsconfig.json` | 3 | 3 | | test docblocks + `packages/cli/bin/run-dev.js` | 8 | 7 | | `scripts/**` | 19 | 6 | | `docs/**` | 3 | 2 | | `packages/*/CHANGELOG.md` (out of surface) | 5 | 5 | | **total** | **65** | **41** | - Wrapped mentions: **0**. So the single-line `git grep` (64 lines / 41 files; one census line carries two mentions) agrees with the flattened count. - The card's filing count was 65 / 40. The extra file is one more carrier that landed after filing; the mention total is unchanged. - I also searched for other spellings (`type-source-resolution` without the `check` prefix, and `type source resolution` in any case): no hits outside the two spellings above. A control for the repair: before vs after, a single-line scan for the gate name followed by a present-tense verb (`refuses|requires|reports|reads|states|is the gate|reds`) reads **19** lines at `05be35259` and **0** at HEAD. ## Every site, with its verdict Line numbers are at `05be35259`. "→" gives the new wording in short. ### Rewritten: 35 named sites | site | was | now | |---|---|---| | `examples/app-crm/tsconfig.json:28` | "`pnpm check:type-source-resolution` is the gate; it wants the `paths` rule" | "was the gate, and it wanted ... until it was retired on 2026-09-18 (#18373); no gate checks this rule now" | | `examples/app-multi-package/tsconfig.json:41` | same | same | | `examples/app-showcase/tsconfig.json:28` | same | same | | `packages/cli/tsconfig.test.json:136` | "refuses. That gate's registry is shrink-only ... `paths` is" | "refused until it was retired ...; registry was shrink-only ... `paths` was ... No gate checks this rule now." | | `packages/client/tsconfig.json:15` | "refuses exactly that, and its header states why the dangerous case is a typecheck that PASSES" | "refused exactly that, the dangerous case being a typecheck that PASSES against a stale `dist`, until it was retired ...; no gate checks this rule now" | | `packages/client/tsconfig.json:46` | "reports as a NEW dist-resolved type import" | "the since-retired ... reported as" | | `packages/core/tsconfig.json:20` | "refuses exactly that" | "refused exactly that until it was retired ...; no gate checks this rule now" | | `packages/core/tsconfig.test.json:52` | "refuses" | "refused until it was retired ..." | | `packages/mcp/tsconfig.test.json:92` | "the exposure is declared in `scripts/check-type-source-resolution.mjs`'s shrink-only registry ... stays visible. That file's #12511 doc-block has the numbers." | "was declared ... stayed visible until that gate and its registry were retired ...; the doc-block, which had the numbers, is readable at `03b7b8187^`" | | `packages/platform-objects/tsconfig.test.json:83` | same shape | same shape | | `packages/plugins/organizations/tsconfig.json:19` | "refuses (its header states why ...)" | "refused ... until it was retired ...; no gate checks this rule now" | | `packages/plugins/plugin-approvals/tsconfig.json:18` | "(`pnpm check:type-source-resolution` — same fix ...)" | "(asked for by `check:type-source-resolution`, retired on 2026-09-18 — #18373 — and the same fix ...)" | | `packages/plugins/plugin-approvals/tsconfig.json:28` | "(`pnpm check:type-source-resolution`)" | "(reported by the since-retired `check:type-source-resolution`)" | | `packages/plugins/plugin-audit/tsconfig.json:19` | as approvals `:18` | as approvals `:18` | | `packages/plugins/plugin-audit/tsconfig.json:29`, `:35`, `:45` | "(`pnpm check:type-source-resolution`)" | "(reported by the since-retired ...)" | | `packages/plugins/plugin-auth/tsconfig.json:24` | "refuses (its header states why ...)" | "refused ... until it was retired ...; no gate checks this rule now" | | `packages/plugins/plugin-auth/tsconfig.json:40` | "which `check:type-source-resolution` refuses" | "which the since-retired ... refused" | | `packages/plugins/plugin-security/tsconfig.json:22` | "refuses exactly that; its header states why ..." | "refused exactly that ... until it was retired ...; no gate checks this rule now" | | `packages/plugins/plugin-security/tsconfig.test.json:57` | "`check:type-source-resolution`'s header states why ..." | "the dangerous case is the typecheck that PASSES, as the header of ... argued until that gate was retired ..." | | `packages/plugins/plugin-security/tsconfig.test.json:65` | "are declared instead, in ...'s registry" | "were declared instead ... until that gate and its registry were retired (readable at `03b7b8187^`)" | | `packages/qa/dogfood/tsconfig.json:25` | "refuses" | "refused until it was retired ...; no gate checks this rule now" | | `packages/qa/dogfood/tsconfig.json:44` | "reads specifiers textually ... so it counts that one" | "The since-retired ... read ... so it counted that one" | | `packages/rest/tsconfig.json:25` | as client `:15` | as client `:15` | | `packages/triggers/trigger-schedule/tsconfig.json:28` | "(`pnpm check:type-source-resolution`)" | "(asked for by ..., retired on 2026-09-18 — #18373; no gate checks this rule now)" | | `packages/verify/tsconfig.json:19` | "refuses (its registry is shrink-only; widening it is not the fix)" | "refused (its registry was shrink-only; widening it was not the fix) until it was retired ...; no gate checks this rule now" | | `packages/cli/bin/run-dev.js:248` | "(`check:type-source-resolution` requires them)" | "required them until it was retired on 2026-09-18, #18373" | | `packages/cli/test/run-dev-cwd-tsconfig-redirect.e2e.test.ts:29` | same | same | | `packages/cli/src/commands/child-env-source-loader.pin.test.ts:34` | "those are mandated by ... The two gates cover ... is covered by neither" | "those were mandated by ... (retired on 2026-09-18 — #18373) ... covered ... was covered by neither" | | `packages/cli/src/commands/child-env-source-loader.pin.test.ts:288` (the `expect()` failure message; surface amended in comment 5922590244) | "Neither check:type-source-resolution (types axis) nor check:test-source-alias (vitest axis) sees this; they were both green while it was broken." | "Neither check:type-source-resolution (types axis, retired 2026-09-18) nor check:test-source-alias (vitest axis) saw this; they were both green while it was broken." The assertion is unchanged. | | `packages/cli/test/published-subpath-hook-body.pin.test.ts:81` | "which `check:type-source-resolution` refuses" | "refused until it was retired ..." | | `packages/qa/dogfood/test/date-bucket-parity-turso.test.ts:61` | "each is enforced by its own gate: ... (`check:test-source-alias`) and ... (`check:type-source-resolution`)" | the alias is "enforced by `check:test-source-alias`"; the `paths` rule is one "`check:type-source-resolution` enforced until it was retired ... no gate enforces that one now" | | `packages/runtime/src/discovery-realtime-channel.pin.test.ts:42` | "three of this repo's own ratchets refuse that ...: ... reds ...; its registry is SHRINK-ONLY ..." | "when this was written three ... refused ...; ... redded ...; its registry was ...", plus "That gate, its registry and its `paths` mandate were retired ...; this paragraph records why the stand-in was chosen." | | `packages/services/service-automation/src/builtin/notify-zero-delivery-visibility.integration.test.ts:45` | "is outside ... registry, and ... states that widening it is not the fix ... Its own remedy ... is" | "was outside ... stated ... was ... was", plus "That gate and its registry were retired ...; this bullet records why the arm below was built." | ### Rewritten: sentences in the same comment blocks that point at the gate without naming it - `packages/triggers/trigger-schedule/tsconfig.json:17-18`: "the precondition the gate's failure text names" → "named". - `packages/triggers/trigger-schedule/tsconfig.json:34-38`: "NOT an entry in that gate's registry. Widening it is maintainer-only ... its docblock says ... `paths` is the self-serve route" → past tense, plus "The registry, that row included, went with the gate." I confirmed that row existed at `03b7b8187^` (`'@objectstack/trigger-schedule'` entry naming `@objectstack/types`). - `packages/triggers/trigger-record-change/tsconfig.test.json:31-34`: "The remediation it actually asks for ... is a separate card ... this file does not pre-empt it" → past tense, plus "no gate asks for that remediation now". - `packages/services/service-automation/src/builtin/notify-zero-delivery-visibility.integration.test.ts:180-182`: "that package is outside this package's shrink-only type-source registry" → "was outside ..., which has since been retired with its gate". ### Left unchanged: 30 named sites | site | why | |---|---| | `packages/qa/dogfood/tsconfig.json:56` | "this time caught by `check:type-source-resolution`" records which gate caught the hazard at the time. History. | | `packages/triggers/trigger-record-change/tsconfig.test.json:24` (with `:26-29`) | Sits inside the bullet "both measured before this file was written". A dated measurement; its narrative present tense stays. | | `packages/verify/tsconfig.test.json:30` | "measured under a trap-restored mutation at 1d67130", and the next sentence already records the retirement. | | `scripts/check-ratchet-remedy-authority.mjs:662` | A record of a measured-and-rejected widening ("turned ... CORRECT remedy into a reported violation"). | | `scripts/check-ratchet-remedy-authority.mjs:912` | Already past tense: the retirement PR recorded the retirement here. | | `scripts/check-type-check-coverage.mjs:538`, `:5616` | Already past tense: the retirement PR recorded the retirement here. | | `scripts/check-type-check-coverage.mjs:936` | "MEASURED as a red `main`". The paragraph closes "this paragraph is the record of why". | | `scripts/check-type-check-coverage.mjs:991` | "SINCE MEASURED ... at e47d5ef". | | `scripts/check-type-check-coverage.mjs:1107` | Re-measured 2026-09-04, and the paragraph says "this record is history". | | `scripts/check-type-check-coverage.mjs:4435` | Dated analysis "as they stand at e47d5ef" of a sentence since withdrawn. | | `scripts/check-type-check-coverage.mjs:4466` | Records the retirement. | | `scripts/check-type-check-coverage.mjs:6399` | Executable, and correct as code: a self-test `absent` needle asserting the retired name stays OUT of a message. | | `scripts/check-undeclared-dep-imports.mjs:43`, `scripts/typecheck-configs.mjs:19`, `:210`, `scripts/workspace-enumerator.mjs:66` | Already past tense: the retirement PR repaired these. | | `scripts/pm/dispatch-gates.mjs:7327`, `:7432`, `:7433`, `:7444`, `:7893` | Recorded measurements in docblocks (pair counts, watch-hint reach). | | `docs/audits/2026-09-self-test-shape-census.md:341` (2 mentions) | A probe-result row pinned to the census's tree; the retirement PR deliberately left it. | | `docs/audits/gate-census-2026-09.md:216` | The verdict already reads `retire · maintainer ruling 2026-09-18 on #18373`. | | `packages/cli/CHANGELOG.md:10411`, `packages/drivers/driver-mongodb/CHANGELOG.md:595`, `packages/services/service-automation/CHANGELOG.md:3494`, `packages/services/service-knowledge/CHANGELOG.md:766`, `packages/services/service-storage/CHANGELOG.md:659` | Release-owned and outside this card's surface. They are also correct records of what those releases did. | Tally: 35 rewritten + 30 unchanged = 65. ## The one executable string, rewritten in the patch round `packages/cli/src/commands/child-env-source-loader.pin.test.ts:288` (lines 289-290 after this PR's docblock edit) is the same defect class as this card. Its `expect()` failure message said the retired gate "sees" what it cannot. The claim's file surface was amended to admit exactly that message (comment 5922590244), and the message now reads "(types axis, retired 2026-09-18) ... saw this". The sentence spans two adjacent string-literal operands of the one message; both operands changed and nothing else did. `Fixes #18955` now holds for every site. ## Verification (final commit `850ae40280`; the full gate set ran at `2e3315f7b0` and again at `850ae40280`) **The diff is comment-only apart from that one message sentence, checked mechanically:** - 20 / 20 edited `tsconfig*.json` files parse with TypeScript's own `parseConfigFileTextToJson` to a config `JSON.stringify`-identical to `05be35259`. Negative control: an unclosed block comment does set the parse error. - 6 / 7 edited `.ts` / `.js` files print to an identical AST under `createPrinter({ removeComments: true })` at base and HEAD, with zero parse diagnostics. Controls: a one-literal code change is detected as different, and a comment-only change prints equal. - The seventh, `child-env-source-loader.pin.test.ts`, has an identical code skeleton at base and HEAD once string literals are blanked and comments removed, with 87 literals on both sides. Exactly 2 literals differ, and both are operands of the second argument of one `expect()` call. Controls: an edit to `toEqual([])`, and an edit to the `it()` title literal, are each refused by the same check. - ⚠️ My first try at this proof used the context-free token scanner. It reported a false DIFF on `run-dev.js`, because without the parser it lost template context and scanned docblock text as code. That instrument was wrong for this file, so I replaced it with the parser-based one above. - Every changed line in the diff starts with `//` or `*`, except the two message-literal lines named above. **Gates.** The set was derived in this worktree with `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` (no paths; the change set comes from the merge base). It derived 67 commands. Every one was run at `2e3315f7b0`, with exit codes captured before any pipe: - **58 exit 0.** Among them: `pnpm check:nul-bytes` (9602 files, no raw control bytes), `pnpm check:type-check-coverage` ("OK — 76/80 workspace packages type-checked"), `pnpm check:test-source-alias`, `pnpm check:published-files`, `pnpm check:cross-package-test-inputs`, `pnpm check:cli-test-child-env`, `pnpm check:issue-citations` and `node scripts/check-issue-citations.mjs`. - The issue-citations check reported "no issue citations added ... (0 file(s) read)". That reading is correct: its declared surfaces are the release pages and non-test `packages/**/src/**/*.ts(x)`, and none of the 27 paths falls in them. - The one number this PR cites, #18373, resolves as an issue, not a PR (REST read). - **9 exit 3 = PREREQUISITE NOT MET, NOT MEASURED, declared to CI.** These are `check:skill-examples`, `check:dts-closure`, `check:dual-build-cjs-loads`, `check:i18n`, `check:i18n-coverage`, `check:i18n-walk-parity`, `check:lean-entry-closure`, `check:sourcemap-no-sources-content` and `check:type-check-debt`. Each one reads build output, and this worktree has no build. The proof above shows that no build input changed, so their verdict cannot depend on this diff. - Reconciliation, `dispatch-gates --ran`: "67 derived famil(ies) accounted for — 58 run, 9 NOT-MEASURED (9 DERIVED from a recorded exit 3)". - Patch round, at `850ae40280`: - The pin file itself ran under the verify lock, scoped with `pnpm --filter @objectstack/cli exec vitest run --project unit --maxWorkers=2 src/commands/child-env-source-loader.pin.test.ts`: 1 file, 4 tests passed, `VERDICT command-exit 0`. - `dispatch-gates --commands` re-derived the same 67 commands. All 67 were re-run there: 58 exit 0 (including `check:cli-test-child-env` and `check:nul-bytes`) and the same 9 exit 3. The `--ran` reconciliation reads the same line as above. - The derivation printed a STALE TREE note: `origin/main` moved one commit (`7fa67dada3`, two `scripts/pm/fleet-write` files), none of which overlaps this diff's 27 paths. - `eslint --no-inline-config` on the edited file: 0 errors, 0 warnings. **Lint, narrowed to the changed files with proof.** I ran `eslint --no-inline-config --format json` on all 27 changed paths. - ESLint's own verdict: 20 paths (every `tsconfig*.json`) are outside its population ("File ignored because no matching configuration was supplied"). The 7 `.ts` / `.js` files are linted with 0 errors and 0 warnings. - `eslint.config.mjs` (`:326-328`) never enables type-aware linting, so this diff cannot move the verdict on any untouched file. **Package `test` / `typecheck`: NOT MEASURED locally, declared to CI.** These are the affected packages' own suites. The comment-only proof above shows that the compiled programs and the tests' code are unchanged, so no test or typecheck verdict can move. **Control-byte self-scan** (`grep -naP` for C0 control characters and DEL) over the 27 files: 0 lines. Control: a planted `\x01` is found. **`skip-changeset`, measured.** - Every touched publishable package declares `files: ["dist","README.md","CHANGELOG.md"]`, so no `tsconfig*.json` is shipped. - The test files are excluded from every build: cli's `tsconfig.build.json` excludes `src/**/*.test.ts`, and tsup bundles from `src/index.ts` for `runtime` and `service-automation`. - `packages/cli/bin/run-dev.js` is in neither `files[]` nor the `bin` field. `npm pack --dry-run --json` of `packages/cli` lists `bin/run.js` (positive control: the `bin` field) and not `bin/run-dev.js`. - `examples/*` and `packages/qa/dogfood` are `private: true`. ## Acceptance notes (noted, not filed) - `packages/runtime/src/discovery-realtime-channel.pin.test.ts`: the stand-in for `InMemoryRealtimeAdapter` was chosen because of the retired gate. With the gate gone, that reason no longer refuses the import. Whether to switch to the real class is not judged here. Carrier: none. - `packages/services/service-automation/src/builtin/notify-zero-delivery-visibility.integration.test.ts`: likewise, the `driver-sqlite-wasm` route was ruled out by the retired registry. Carrier: none. - `packages/triggers/trigger-record-change/tsconfig.test.json:8-12` still says "The type-check-debt gate offers two remedies ... and presents them as interchangeable". The exclusion route was withdrawn later (`scripts/check-type-check-coverage.mjs`, the "exclusion route came OUT" block). That is not a mention of this gate, so it was left alone. Carrier: none. --- _Generated by [Claude Code](https://claude.ai/code/session_01JAhu8u8QfBvRjVZDox7CP9)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent e161ad3 commit 9b0de7d

27 files changed

Lines changed: 137 additions & 101 deletions

File tree

‎examples/app-crm/tsconfig.json‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@
2525
// BUILD ARTIFACT — so `tsc --noEmit` would be checking against whatever was
2626
// last built rather than against the source in this checkout, and a stale
2727
// `dist` typechecks green over an engine contract that has since moved.
28-
// `pnpm check:type-source-resolution` is the gate; it wants the `paths`
29-
// rule, not a registry entry.
28+
// `check:type-source-resolution` was the gate, and it wanted the `paths`
29+
// rule, not a registry entry, until it was retired on 2026-09-18 (#18373);
30+
// no gate checks this rule now.
3031
"paths": {
3132
"@objectstack/formula": ["../../packages/formula/src/index.ts"]
3233
}

‎examples/app-multi-package/tsconfig.json‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@
3838
// direction is SILENT: a `dist` merely BEHIND the source type-checks GREEN
3939
// against old declarations. This app is the fixture for a brand-new spec
4040
// surface (ADR-0130 D4's `packages[]`), which makes that exactly the
41-
// reading it must not be able to give. `pnpm check:type-source-resolution`
42-
// is the gate; it wants the `paths` rule, not a registry entry.
41+
// reading it must not be able to give. `check:type-source-resolution` was
42+
// the gate, and it wanted the `paths` rule, not a registry entry, until it
43+
// was retired on 2026-09-18 (#18373); no gate checks this rule now.
4344
//
4445
// Two keys, and the star follows a separator: a tsconfig `paths` key
4546
// without a star is an EXACT match, and the `@objectstack/spec*` spelling

‎examples/app-showcase/tsconfig.json‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@
2525
// BUILD ARTIFACT — so `tsc --noEmit` would be checking against whatever was
2626
// last built rather than against the source in this checkout, and a stale
2727
// `dist` typechecks green over an engine contract that has since moved.
28-
// `pnpm check:type-source-resolution` is the gate; it wants the `paths`
29-
// rule, not a registry entry.
28+
// `check:type-source-resolution` was the gate, and it wanted the `paths`
29+
// rule, not a registry entry, until it was retired on 2026-09-18 (#18373);
30+
// no gate checks this rule now.
3031
//
3132
// Same rule, same reason, for the email plugin: `test/email-template-locale.test.ts`
3233
// resolves this app's declared email templates through plugin-email's real

‎packages/cli/bin/run-dev.js‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,8 +245,9 @@ const CLI_PACKAGE_JSON = fileURLToPath(new URL('../package.json', import.meta.ur
245245
* `compilerOptions.paths` to EVERY specifier it resolves — including this
246246
* CLI's own. Ten in-tree directories carry such a rule, written for tsc so a
247247
* `typecheck` grades against a producer's source rather than its last build
248-
* (`check:type-source-resolution` requires them), and #11094 named the runtime
249-
* half "a latent runtime redirect for any tsx-honouring tool". Run this shim
248+
* (`check:type-source-resolution` required them until it was retired on
249+
* 2026-09-18, #18373), and #11094 named the runtime half "a latent runtime
250+
* redirect for any tsx-honouring tool". Run this shim
250251
* from one of them and the CLI's imports are re-routed:
251252
*
252253
* cd examples/app-multi-package

‎packages/cli/src/commands/child-env-source-loader.pin.test.ts‎

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@
3030
* likely to be re-litigated: `plugin-email` already ships the explicit
3131
* `./email-plugin.js` extension and fails identically to `formula`'s
3232
* extensionless `./registry`. Adding extensions to the redirected packages
33-
* cannot fix this, and neither can removing the `paths` blocks — those are
34-
* mandated by `pnpm check:type-source-resolution`, which was green throughout.
35-
* So was `pnpm check:test-source-alias`. The two gates cover the **types** axis
36-
* and the **vitest** axis; the axis that broke — a CLI child's **runtime**
37-
* module resolution — is covered by neither, which is why the defect lived on
38-
* `main` while every gate reported success. The general third-axis guard is
33+
* cannot fix this, and neither could removing the `paths` blocks — those were
34+
* mandated by `pnpm check:type-source-resolution` (retired on 2026-09-18 —
35+
* #18373), which was green throughout. So was
36+
* `pnpm check:test-source-alias`. The two gates covered the **types** axis and
37+
* the **vitest** axis; the axis that broke — a CLI child's **runtime** module
38+
* resolution — was covered by neither, which is why the defect lived on `main`
39+
* while every gate reported success. The general third-axis guard is
3940
* separate scope and tracked separately; this pin is the narrow half that
4041
* belongs to the fix.
4142
*
@@ -285,8 +286,8 @@ describe('no CLI command puts a child process under oclif\'s TypeScript source l
285286
+ 'packages to their .ts source there — so the child resolves a CommonJS package to '
286287
+ 'TypeScript and Node\'s CJS resolver then fails on that file\'s sibling imports '
287288
+ '(`Cannot find module \'./registry\'`), killing `os dev` before the server starts. '
288-
+ 'Neither check:type-source-resolution (types axis) nor check:test-source-alias '
289-
+ '(vitest axis) sees this; they were both green while it was broken. Pass the child '
289+
+ 'Neither check:type-source-resolution (types axis, retired 2026-09-18) nor check:test-source-alias '
290+
+ '(vitest axis) saw this; they were both green while it was broken. Pass the child '
290291
+ '`process.env` unmodified, or a NODE_ENV that is not '
291292
+ `${[...SOURCE_LOADER_ACTIVATING].map((v) => `'${v}'`).join(' or ')}`
292293
+ ' — and if a child genuinely needs dev semantics, let the child command set them '

‎packages/cli/test/published-subpath-hook-body.pin.test.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,9 @@
7878
* ⛔ The fixture is a STRING written into the consumer directory, not a `.ts`
7979
* file under `test/`. A file there is compiled by this package's own
8080
* `tsconfig.test.json`, where the same import resolves through the workspace —
81-
* i.e. to a build artifact, which `check:type-source-resolution` refuses — so
82-
* checking it in would answer a different question under the same name.
81+
* i.e. to a build artifact, which `check:type-source-resolution` refused until
82+
* it was retired on 2026-09-18 (#18373) — so checking it in would answer a
83+
* different question under the same name.
8384
*
8485
* ## What this file deliberately does NOT do
8586
*

‎packages/cli/test/run-dev-cwd-tsconfig-redirect.e2e.test.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@
2626
* the repo root it answers that package's dist target. Ten in-tree
2727
* directories carry such a rule, written so `tsc --noEmit` grades against a
2828
* producer's SOURCE rather than its last build
29-
* (`check:type-source-resolution` requires them), and #11094 named the
30-
* runtime half "a latent runtime redirect for any tsx-honouring tool".
29+
* (`check:type-source-resolution` required them until it was retired on
30+
* 2026-09-18, #18373), and #11094 named the runtime half "a latent runtime
31+
* redirect for any tsx-honouring tool".
3132
*
3233
* ⛔ CORRECTED. The card read the failure as the source subpath's export set
3334
* DIFFERING from `dist`. It does not. The spec package's `data` source index

‎packages/cli/tsconfig.test.json‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,10 @@
133133
// each package's `exports` map to `dist/index.d.ts` — A BUILD ARTIFACT — so
134134
// this suite's type verdict about the readers the reader program is about to
135135
// CHANGE would be a verdict about the last `pnpm build` instead, which is
136-
// exactly what `check:type-source-resolution` refuses. That gate's registry
137-
// is shrink-only and widening it is not the fix; `paths` is, for a dep
138-
// exposed through an EXISTING program, which `tsconfig.test.json` is.
136+
// exactly what `check:type-source-resolution` refused until it was retired
137+
// on 2026-09-18 (#18373). That gate's registry was shrink-only and widening
138+
// it was not the fix; `paths` was, for a dep exposed through an EXISTING
139+
// program, which `tsconfig.test.json` is. No gate checks this rule now.
139140
//
140141
// ⛔ No star and no directory target. A starred rule matches by PREFIX and
141142
// would swallow subpath imports, resolving them THROUGH a file

‎packages/client/tsconfig.json‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@
1212
// through each dependency's `exports` map — `dist/index.d.ts`, A BUILD
1313
// ARTIFACT — so the verdict would be about the last `pnpm build` rather
1414
// than about the producer's source in the checkout.
15-
// `check:type-source-resolution` refuses exactly that, and its header
16-
// states why the dangerous case is a typecheck that PASSES.
15+
// `check:type-source-resolution` refused exactly that — the dangerous case
16+
// being a typecheck that PASSES against a stale `dist` — until it was
17+
// retired on 2026-09-18 (#18373); no gate checks this rule now.
1718
//
1819
// ONE rule per package, not two: both publish a single entry point (their
1920
// `exports` maps carry only `"."` besides, for metadata-core, a `./testing`
@@ -43,8 +44,8 @@
4344
// That suite's claim is "the SDK keeps the session the SERVER just handed
4445
// it", so its verdict has to be about the server's SOURCE; through
4546
// `exports` it would be about the last `pnpm build` of two other packages,
46-
// which `check:type-source-resolution` reports as a NEW dist-resolved type
47-
// import.
47+
// which the since-retired `check:type-source-resolution` reported as a NEW
48+
// dist-resolved type import.
4849
//
4950
// `@objectstack/platform-objects` is the one entry here spelled as a
5051
// SUBPATH: that package publishes eleven of them and this suite imports one

‎packages/core/tsconfig.json‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
// the workspace link to `dist/*.d.ts` — a build artifact — so a stale dist
1919
// would make this package's type verdict a function of build state rather
2020
// than of the source in the checkout (`check:type-source-resolution`
21-
// refuses exactly that). Anchored to the bare specifier only: nothing here
21+
// refused exactly that until it was retired on 2026-09-18, #18373; no gate
22+
// checks this rule now). Anchored to the bare specifier only: nothing here
2223
// imports an `@objectstack/types/*` subpath, and a `paths` target matching
2324
// nothing on disk would silently fall back to node resolution.
2425
"paths": {

0 commit comments

Comments
 (0)