diff --git a/.changeset/cli-provenance-anchors.md b/.changeset/cli-provenance-anchors.md new file mode 100644 index 00000000000..8288fac092a --- /dev/null +++ b/.changeset/cli-provenance-anchors.md @@ -0,0 +1,14 @@ +--- +'@objectstack/cli': patch +--- + +Provenance comments in `@objectstack/cli` were re-anchored + +Comment and docblock lines under `src/` that cited tracker numbers which no +longer resolve on GitHub now cite the commit in this repository's history that +decided the matter, and say in their own words what was decided. Two strings +move with them: the `os i18n extract --source-hashes` help text now says what +the provenance companion records instead of citing a number, and the header +that flag writes into each `.source-hashes.generated.ts` cites the +commit that introduced the companion. No command, flag, exit code, error code, +type, export or runtime behaviour changes. diff --git a/packages/cli/src/commands/cloud/login.ts b/packages/cli/src/commands/cloud/login.ts index a0a994db306..e915e7a6030 100644 --- a/packages/cli/src/commands/cloud/login.ts +++ b/packages/cli/src/commands/cloud/login.ts @@ -12,7 +12,7 @@ * ## `--json` here is NDJSON — a declared exception, same as `os login` (#6730) * * Everywhere else in this CLI `--json` means "stdout is exactly one JSON - * document" (#6217). Both device-flow login commands are declared exceptions to + * document" (commit 2b641ddd4). Both device-flow login commands are declared exceptions to * that, and they are the SAME exception: one compact JSON document per line. * * ### What was broken diff --git a/packages/cli/src/commands/compile.ts b/packages/cli/src/commands/compile.ts index b1ae356ae83..11817da9648 100644 --- a/packages/cli/src/commands/compile.ts +++ b/packages/cli/src/commands/compile.ts @@ -228,7 +228,7 @@ export default class Compile extends Command { // one. See `printAuthoringAdvisories` for the measurement. printAuthoringAdvisories(ruleAdvisories); }; - // [#12125] The ADR-0087 D2 conversion notices, hoisted for the SAME reason + // [commit 79cf692b0] The ADR-0087 D2 conversion notices, hoisted for the SAME reason // and under the SAME ruling as the four lists above — one field over. The // notices were computed at step 2 (below) and reached the terminal SUCCESS // payload alone, so all nine failure exits dropped a list already in hand. diff --git a/packages/cli/src/commands/create.ts b/packages/cli/src/commands/create.ts index 1e5a7a3621c..d2c94f6a66f 100644 --- a/packages/cli/src/commands/create.ts +++ b/packages/cli/src/commands/create.ts @@ -38,7 +38,7 @@ * ObjectStack is a developer tool, so a documented developer-facing command has * to work for the developer who follows the docs. This command is documented on * four public doc pages (`deployment/cli`, `plugins/index`, the two - * `protocol/kernel` pages) and, until #14824, every one of those readers got a + * `protocol/kernel` pages) and, until commit cf6b67164, every one of those readers got a * project that CANNOT INSTALL: * * - the emitted `package.json` declared `@objectstack/spec` and @@ -81,7 +81,7 @@ * * ## The emitted package NAME follows the placement too (#15530) * - * The audience decides the name, and #14824 moved the audience without moving + * The audience decides the name, and commit cf6b67164 moved the audience without moving * the name: the standalone default kept stamping `@objectstack/plugin-` * — a scope the developer it now scaffolds for cannot publish to — onto every * project, with the emitted README telling them to install it from there. The @@ -321,9 +321,9 @@ function pluginDirName(name: string): string { * ## Why the standalone name is unscoped * * `@objectstack` is a scope the developer this command scaffolds FOR cannot - * publish to. Until #14824 that was arguably fine, because the default output + * publish to. Until commit cf6b67164 that was arguably fine, because the default output * landed inside this monorepo, where every sibling really does carry the scope. - * That ruling pointed the default at the developer's own directory and the name + * That commit pointed the default at the developer's own directory and the name * did not move with the audience — so the standalone emission stamped a scope * its owner does not own onto every project generated from it. ⚠️ Nothing in * this repository can see that: the name is never resolved from a registry diff --git a/packages/cli/src/commands/database-driver-allowlist.pin.test.ts b/packages/cli/src/commands/database-driver-allowlist.pin.test.ts index a09471ada82..c1eacc96876 100644 --- a/packages/cli/src/commands/database-driver-allowlist.pin.test.ts +++ b/packages/cli/src/commands/database-driver-allowlist.pin.test.ts @@ -36,10 +36,10 @@ * `start.ts` and once in `dev.ts`, and that duplication is exactly how the two * can drift apart from each other as well as from the resolver. * - * SCOPE (#6860 vs #6345): this pins the CANONICAL kinds — the `driverId` values + * SCOPE (#6860 vs commit e2798fab7): this pins the CANONICAL kinds — the `driverId` values * the resolver produces. The resolver also accepts aliases (`pg`, `mysql2`, * `libsql`, `mingo`, `wasm`, …) which the flag deliberately does not offer; - * converging that vocabulary is #6345's job, and this pin is written so it does + * converging that vocabulary was commit e2798fab7's job, and this pin is written so it does * not prejudge it — an alias collapses to its canonical id and is not demanded * of the flag. */ @@ -101,7 +101,7 @@ function candidateTokens(): string[] { * is supplied so it resolves normally; the catch is kept so the derivation * survives another kind growing the same "recognized but unusable" shape. * - * `err.recognized` is what keeps that catch honest (#6345). The resolver now + * `err.recognized` is what keeps that catch honest (commit e2798fab7). The resolver now * ALSO throws `UnsupportedDriverError` for a spelling nothing claims — the CLI * half of "both hosts refuse the same input", which replaced a silent fall-through * to the dev SQLite default. Reading `driverType` off that error would report the diff --git a/packages/cli/src/commands/database-driver-flag-derivation.test.ts b/packages/cli/src/commands/database-driver-flag-derivation.test.ts index d0c048f3468..4f586412f32 100644 --- a/packages/cli/src/commands/database-driver-flag-derivation.test.ts +++ b/packages/cli/src/commands/database-driver-flag-derivation.test.ts @@ -24,7 +24,7 @@ * Deriving the flag from the CONFIG-CONTRACT face (`DRIVER_ID_ALIASES` / * `resolveDriverId`) instead of the SELECTION face would offer `sqlite3`, * `better-sqlite3`, `mariadb` and `inmemory` — spellings neither boot host has - * ever accepted as a selection (#6345 fixes the selection face as the union of + * ever accepted as a selection (commit e2798fab7 fixes the selection face as the union of * what the two hosts accepted the day the ruling was written). The last case here * drives oclif's real parser to prove they are still refused at parse time. */ diff --git a/packages/cli/src/commands/doctor-organizations-message-spelling.test.ts b/packages/cli/src/commands/doctor-organizations-message-spelling.test.ts index d149d2ba256..ec0e5f84e82 100644 --- a/packages/cli/src/commands/doctor-organizations-message-spelling.test.ts +++ b/packages/cli/src/commands/doctor-organizations-message-spelling.test.ts @@ -6,9 +6,9 @@ * * ── What this closes ───────────────────────────────────────────────────── * - * PR #12463 (#12151) single-sourced every operator-facing occurrence in + * Commit 27b690272 (PR #12463) single-sourced every operator-facing occurrence in * `serve.ts` onto `Serve.ORGANIZATIONS_RUNTIME_PKG` and pinned what those - * messages render. `doctor.ts` sat outside that card's file surface and kept + * messages render. `doctor.ts` sat outside that commit's file surface and kept * its own bare `@objectstack/organizations` literal inside * `TENANCY_POSTURE_FIX_HINTS`, under no check of any kind — so a roster-key * rename left `os doctor` printing a package name that boot no longer diff --git a/packages/cli/src/commands/environments/environments.test.ts b/packages/cli/src/commands/environments/environments.test.ts index 6a0fcb6e1da..0b94a3ee5f7 100644 --- a/packages/cli/src/commands/environments/environments.test.ts +++ b/packages/cli/src/commands/environments/environments.test.ts @@ -77,7 +77,7 @@ describe('os environments commands', () => { }); /** - * Pin (#10967): every `examples` entry on EVERY CLI command source names a + * Pin (commit e4a71d418): every `examples` entry on EVERY CLI command source names a * command id THIS CLI ACTUALLY REGISTERS. * * ## The failure this exists to refuse @@ -94,7 +94,7 @@ describe('os environments commands', () => { * exactly as before while any `examples` string spelling the OLD topic * silently stops being true — not a parse error, not a type error, nothing * a build catches. A user who copy-pastes the stale line hits `Error: - * Command projects:bind not found.` (exit 2). That is the shape #10967 + * Command projects:bind not found.` (exit 2). That is the shape commit e4a71d418 * fixed under `environments/*.ts`; this pin targets the MECHANISM (an * example naming an id this CLI does not register), not the literal string * `os projects`, so it keeps working for a topic nobody has renamed yet — @@ -123,7 +123,7 @@ describe('os environments commands', () => { * ## Population: EVERY command source, via AST — not via `import` * * The property is checked against every non-test file under - * `packages/cli/src/commands/**`, not just the five #10967 touches — a + * `packages/cli/src/commands/**`, not just the five commit e4a71d418 touched — a * five-file population is exactly the set that is already correct, so it * cannot catch the defect class returning anywhere else (it did not catch * it in `register.ts`/`whoami.ts`/`logout.ts`, discovered by hand below). @@ -157,9 +157,9 @@ describe('os environments commands', () => { * `examples` USED TO say `os auth register` / `os auth whoami` / `os auth * logout`, though no `auth` topic has ever existed for them (confirmed via * `--help`: `Error: Command auth:whoami not found.`) — the same defect - * class as #10967, found by scanning the whole tree, but not #10967's to - * fix (outside its dispatched file surface). Filed as #11221 and fixed - * there, so `EXCLUDED` is now empty and all three are scanned by the main + * class commit e4a71d418 fixed, found by scanning the whole tree, but not that commit's to + * fix (outside its dispatched file surface). Fixed separately by commit e278a2970, + * so `EXCLUDED` is now empty and all three are scanned by the main * assertion like every other command source. * * The mechanism stays, because it is what made that handoff safe: a silent, @@ -167,13 +167,13 @@ describe('os environments commands', () => { * checked by this pin forever, even after the excluded condition no longer * holds. So a second `it.each` re-runs the SAME predicate over the excluded * files and asserts it still finds an unresolved entry. That is not - * hypothetical here: when #11221's fix removed the last unresolved entry, + * hypothetical here: when commit e278a2970 removed the last unresolved entry, * this assertion went red on purpose for all three files, and its message * ("remove it from EXCLUDED above") is what retired them. The pattern * (map-of-reason + filtered main assertion + a "still needs its exclusion" * retiring assertion) matches * `packages/create-objectstack/src/starter-comments-self-contained.test.ts`'s - * `EXCLUDED`, which has retired this same way before (#11022). + * `EXCLUDED`, which has retired this same way before (commit 21756b325). */ describe('#10967 pin: examples resolve to a real command id', () => { const ENVIRONMENTS_DIR = fileURLToPath(new URL('.', import.meta.url)); @@ -293,7 +293,7 @@ describe('#10967 pin: examples resolve to a real command id', () => { /** * Nothing is excluded — every command source is scanned. `register.ts` / * `whoami.ts` / `logout.ts` each carried a self-retiring entry here while - * their `os auth …` examples were #11221's to fix; that fix landed, the + * their `os auth …` examples awaited commit e278a2970's fix; that fix landed, the * retiring assertion below went red exactly as designed, and the map goes * back to empty rather than staying around as a silent exemption over three * root-level commands. The assertion stays, so the next entry added here is diff --git a/packages/cli/src/commands/explain.ts b/packages/cli/src/commands/explain.ts index 09ab4c720ef..8e4845790bd 100644 --- a/packages/cli/src/commands/explain.ts +++ b/packages/cli/src/commands/explain.ts @@ -218,7 +218,7 @@ export const SCHEMAS: Record = { { name: 'description', type: 'string', description: 'App description' }, { name: 'navigation', type: 'NavItem[]', description: 'Menu tree. Every item needs `id` (snake_case) + `label` + a discriminant `type`, plus that type\'s own target key: object -> `objectName`, dashboard -> `dashboardName`, page -> `pageName`, url -> `url`, report -> `reportName`.' }, // `theme` here described a key that is only an alias of `branding`; the - // `themes` metadata surface itself was retired at #10485 (ADR-0049) — + // `themes` metadata surface itself was retired by commit 35ad101bc (ADR-0049) — // `app.branding` is the one colour surface. `logo` and `defaultRoute` // were the same class of row: neither is an AppSchema key, and both are // now rejected by name (`logo` -> `branding`). diff --git a/packages/cli/src/commands/generate-builtin-id-column.pin.test.ts b/packages/cli/src/commands/generate-builtin-id-column.pin.test.ts index 944d02afc20..5e4175154ea 100644 --- a/packages/cli/src/commands/generate-builtin-id-column.pin.test.ts +++ b/packages/cli/src/commands/generate-builtin-id-column.pin.test.ts @@ -1,7 +1,7 @@ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. /** - * THE #15040 PIN: the `id` column both migration generators emit is the column + * THE commit 8644d1d33 PIN: the `id` column both migration generators emit is the column * `driver-sql` actually creates. * * ## The defect @@ -46,7 +46,7 @@ * * ## The audit-stamp columns: all three rows now ruled (#15521) * - * #15040 measured a THIRD disagreement in the same pass and recorded it here + * Commit 8644d1d33 measured a THIRD disagreement in the same pass and recorded it here * without correcting it. #15521 split that record into rows and has now ruled * every one of them the same way — the generator follows the driver: * diff --git a/packages/cli/src/commands/generate-declared-column-default.pin.test.ts b/packages/cli/src/commands/generate-declared-column-default.pin.test.ts index 241fdfac324..6ef7d517e38 100644 --- a/packages/cli/src/commands/generate-declared-column-default.pin.test.ts +++ b/packages/cli/src/commands/generate-declared-column-default.pin.test.ts @@ -10,7 +10,7 @@ * band into a generated table got NULL where the platform's own table supplies * the declared value. Driven on live PostgreSQL 16.13 — one object, three * schemas, one producer each, `information_schema.columns` read back per schema - * (the card's own six-column probe, re-run against `generate.ts` as #16887 and + * (the card's own six-column probe, re-run against `generate.ts` as commit 9cdffbe36 and * #17208 leave it): * * ``` @@ -49,7 +49,7 @@ * * 1. **`f_required` stays out of the repair.** A `required: true` field with no * `storage.notNull` is nullable on all three producers — which is agreement, - * not divergence, because #16887 already took both generators off `required`. + * not divergence, because commit 9cdffbe36 already took both generators off `required`. * Whether a SCAFFOLD should nonetheless preserve the author's declaration is * an open decision (#17218) and ⛔ is not settled here or by this file. * 2. **`NOW()` on a `date` / `time` column is a PostgreSQL claim**, like every diff --git a/packages/cli/src/commands/generate-field-type-vocabulary.pin.test.ts b/packages/cli/src/commands/generate-field-type-vocabulary.pin.test.ts index 983bd41b28b..087c335ac9e 100644 --- a/packages/cli/src/commands/generate-field-type-vocabulary.pin.test.ts +++ b/packages/cli/src/commands/generate-field-type-vocabulary.pin.test.ts @@ -45,14 +45,14 @@ * * ## What this pin asserts * - * BOTH DIRECTIONS, since #14657. + * BOTH DIRECTIONS, since commit 431979e67. * * FORWARD (#13871): every token the three vocabularies key on is a `FieldType` * member. * - * BACKWARD (#14657): every `FieldType` member is keyed on by all three. #13871 + * BACKWARD (commit 431979e67): every `FieldType` member is keyed on by all three. #13871 * deliberately did not assert this, because "what column type does each - * unmapped member deserve" was an open question; #14657 answered it member by + * unmapped member deserve" was an open question; commit 431979e67 answered it member by * member and this half became assertable. It matters because the gap was * SILENT: 21 real members had no entry in either map (24 in the switch), and * every one of them generated a plausible-looking wrong schema — TS `unknown`, @@ -69,13 +69,13 @@ * is the only mechanism, which is why the totality assertion lives here rather * than being left to the compiler. * - * ## The #14828 half: the VALUE, for the classes whose answer is derivable + * ## The commit 08706f0e0 half: the VALUE, for the classes whose answer is derivable * - * #13871 and #14657 both measured PRESENCE only, and said so: "a + * #13871 and commit 431979e67 both measured PRESENCE only, and said so: "a * wrong-but-present entry is a different defect (`autonumber: 'SERIAL'` against * a runtime that writes a rendered string, `formula` given a column the runtime * never creates), filed separately rather than pinned here on a guess." That - * card is #14828, and this is where its rule lands — as the triage note said it + * card landed as commit 08706f0e0, and this is where its rule lands — as the triage note said it * should, because a FOURTH hand-carried table of right answers would be the * same defect one file over. * @@ -89,7 +89,7 @@ * physical shape is. The driver is the authority for which column exists. * ⭐ [#18199] That clause used to continue "; the spec's `isMultiValueField` * is the ADR-0104 D1 VALUE contract and answers a different question - * (#14829's pin argues this in full)", and the second half stopped being + * ([commit ee370d318]'s pin argues this in full)", and the second half stopped being * true: the maintainer ruling of 2026-09-13 (decision batch #128 item 5, * option 1′) gave "multi-valued" ONE definition, #17469 derived all three * driver sites from it, and #18199 derived `generate.ts` from it too. The @@ -101,10 +101,10 @@ * * ⚰️ The FILE_REFERENCE_TYPES family used to be excluded from all of this, * deliberately: those five were in the driver's `JSON_COLUMN_TYPES` while this - * generator gave them a varchar — #14657's ADR-0104 D3 answer against a driver + * generator gave them a varchar — commit 431979e67's ADR-0104 D3 answer against a driver * that was still pre-D3, i.e. a decision about which side moves rather than a - * wrong value to correct. The ruling on #15041 decided it and #15989 landed it, - * so the exclusion below became coverage. [#17883] The width the two migration + * wrong value to correct. The ruling in ADR-0104's 2026-09-05 addendum decided it and #15989 landed it, + * so the exclusion below became coverage. [commit b06b2db5c] The width the two migration * formats emit for the family is a second question and has a pin of its own — * `generate-file-reference-width.pin.test.ts`. * @@ -150,7 +150,7 @@ const REAL_FIELD_TYPES: ReadonlySet = new Set(FieldType.options); * `const NAME: Record = {` at top level — the lookup tables. * * `VALUE` is captured rather than fixed because `FIELD_TYPE_SQL_MAP` answers - * `string | null` since #14828: `null` is the VIRTUAL answer (no column at + * `string | null` since commit 08706f0e0: `null` is the VIRTUAL answer (no column at * all), carried in the table so the two migration generators cannot disagree * about which fields materialise. The terminator each table must carry is * DERIVED from its own declared value type below, so widening one table cannot @@ -174,7 +174,7 @@ function lookupTableValueType(name: string): string { /** * The terminator every lookup table must carry — the type-level half of the - * #14657 totality rule. Required rather than tolerated: if someone deletes the + * totality rule commit 431979e67 added. Required rather than tolerated: if someone deletes the * annotation, extraction fails loudly here instead of the compiler silently * stopping to check. */ @@ -257,7 +257,7 @@ describe('generate.ts field-type vocabularies (#13871)', () => { expect(ghosts, 'the field-type switch cases on types that are not FieldType members').toEqual([]); }); - // ── The #14657 half: no real member may go unmapped ────────────────────── + // ── The commit 431979e67 half: no real member may go unmapped ──────────── // // Read this as one rule stated three times, not three rules: the authority is // `FieldType`, and each vocabulary is measured against it. A member added to @@ -313,7 +313,7 @@ describe('generate.ts field-type vocabularies (#13871)', () => { /* ──────────────────────────────────────────────────────────────────────────── - * #14828 — the VALUES, derived from the platform rather than retyped here + * Commit 08706f0e0 — the VALUES, derived from the platform rather than retyped here * ──────────────────────────────────────────────────────────────────────────── */ /** `packages/drivers/driver-sql/src` — declared for `@objectstack/cli#test` in `turbo.json`. */ @@ -325,7 +325,7 @@ const SCHEMA_DRIFT_SOURCE = fs.readFileSync(path.join(DRIVER_SQL_SRC, 'schema-dr * The body of `SqlDriver.createColumn`'s `switch (type)` — THE authority on * which physical column a field type gets. * - * Source-read rather than driven, for the reason #14829's pin already states: + * Source-read rather than driven, for the reason commit ee370d318's pin already states: * `createColumn` is `protected` and needs a knex table builder, so exercising * it would mean a live driver and a built `dist`. What has to be pinned is its * DECISION, and that is legible in the source. @@ -387,9 +387,9 @@ function sqlColumn(type: string): string | null { * The `table.x('f_type'[, …])` call one field type contributes, or `null` for * none. * - * [#17883] The argument list is part of the call and is captured with it. The + * [commit b06b2db5c] The argument list is part of the call and is captured with it. The * reader used to stop at the name, so a SIZED call — `table.string(name, 2048)`, - * which is what the file family takes since #17883 — read as no column at all, + * which is what the file family takes since commit b06b2db5c — read as no column at all, * and every assertion below would have been answering a question about absence * instead of one about the column. */ @@ -657,7 +657,7 @@ describe('#14828 — the SQL answers are the platform’s, not this file’s inv // ⚰️ This block was labelled 「recorded divergence, NOT coverage」 and asserted // that driver-sql's `JSON_COLUMN_TYPES` DID spread `FILE_REFERENCE_TYPES` // while this generator gave the family a varchar — two ADR-0104 positions, - // deliberately unresolved, with the maintainer ruling on #15041 as the thing + // deliberately unresolved, with the maintainer ruling (ADR-0104, 2026-09-05 addendum) as the thing // that would resolve it. The ruling landed: option A, the physical column // holds the actual `sys_file` id, and 「the driver is the side that moves」. // Its step 3 says this block is retired to coverage WHEN the driver lands, @@ -691,7 +691,7 @@ describe('#14828 — the SQL answers are the platform’s, not this file’s inv for (const type of FILE_REFERENCE_TYPES) { expect(sqlColumn(type)).toBe('VARCHAR(2048)'); - // [#17883] Was a bare `table.string('f_type')` — knex's varchar(255), + // [commit b06b2db5c] Was a bare `table.string('f_type')` — knex's varchar(255), // which left THIS generator's two formats disagreeing about the family // after the driver had already moved to 2048. The width agreement itself // is `generate-file-reference-width.pin.test.ts`; what stays here is the diff --git a/packages/cli/src/commands/generate-file-reference-width.pin.test.ts b/packages/cli/src/commands/generate-file-reference-width.pin.test.ts index f94e979bfef..8c0126b70a3 100644 --- a/packages/cli/src/commands/generate-file-reference-width.pin.test.ts +++ b/packages/cli/src/commands/generate-file-reference-width.pin.test.ts @@ -1,7 +1,7 @@ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. /** - * THE #17883 PIN: one `os generate migration`, one column width for the file + * THE commit b06b2db5c PIN: one `os generate migration`, one column width for the file * family — whichever `--format` the author picked. * * ## The defect @@ -26,7 +26,7 @@ * 2048 is not a width invented to settle a disagreement. It is the width * ADR-0104 ruled and the rest of the tree has already shipped: * - * - ADR-0104, recording the maintainer ruling on #15041: "The driver is the + * - ADR-0104's 2026-09-05 addendum, recording the maintainer ruling: "The driver is the * side that moves; the generator's `VARCHAR(2048)` already states the ruled * end-state and stands." * - #15989 moved `driver-sql`: `MEDIA_ID_VARCHAR_CHARS = 2048` and diff --git a/packages/cli/src/commands/generate-multiple-json-column.pin.test.ts b/packages/cli/src/commands/generate-multiple-json-column.pin.test.ts index 669d0c31cef..f9d08e8a456 100644 --- a/packages/cli/src/commands/generate-multiple-json-column.pin.test.ts +++ b/packages/cli/src/commands/generate-multiple-json-column.pin.test.ts @@ -1,7 +1,7 @@ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. /** - * THE #14829 PIN: one authored `multiple: true` field, three surfaces, ONE answer. + * THE commit ee370d318 PIN: one authored `multiple: true` field, three surfaces, ONE answer. * * ## The defect * @@ -54,7 +54,7 @@ * `field.multiple` raw, so for one release this file carried a paragraph saying * the two halves it exists to hold together had SPLIT: `os generate migration` * emitted JSONB for a `text` field flagged `multiple: true` while the driver - * emitted a varchar for it — #14829 in reverse, one notch narrower. All five + * emitted a varchar for it — the defect commit ee370d318 fixed, in reverse, one notch narrower. All five * reads in `generate.ts` now go through its own `declaredMultiValued` seam onto * the same `isMultiValueField`, so the assertions below state ONE answer again * and the arms that used to record the divergence are inverted rather than @@ -197,7 +197,7 @@ describe('#14829 — `multiple: true` is one answer across all three surfaces', // THE discriminating control. If this file could be satisfied by emitting a // JSON column for everything, the arms below would prove nothing. // - // #14828 moved the unflagged `lookup` answers — `VARCHAR(36)` / + // Commit 08706f0e0 moved the unflagged `lookup` answers — `VARCHAR(36)` / // `table.uuid` became `VARCHAR(255)` / `table.string`, the driver's own // answer for a reference column. The control is unweakened by that: what it // discriminates is scalar-vs-JSON, and both spellings are scalar. `select` @@ -412,13 +412,13 @@ describe('#14829 — `multiple: true` is one answer across all three surfaces', .toMatch(/!== 'formula'/); }); - // ── The former SCOPE FENCE for #14828 — DISCHARGED, and kept as the seam ── + // ── The former SCOPE FENCE — DISCHARGED by commit 08706f0e0, and kept as the seam ── // - // This block was written by #14829 as a fence, not an endorsement: the five - // scalar answers disagreed with what the platform stores, #14829 left them + // This block was written by commit ee370d318 as a fence, not an endorsement: the five + // scalar answers disagreed with what the platform stores, commit ee370d318 left them // byte-for-byte because they were a different card, and asserted them here so // that changing one would have to be a deliberate edit to this block rather - // than a side effect of a card about the `multiple` flag. #14828 is that card + // than a side effect of a card about the `multiple` flag. Commit 08706f0e0 landed that card // and this is that deliberate edit — the values below are now the platform's, // each read from `driver-sql`. // diff --git a/packages/cli/src/commands/generate-string-family-width.pin.test.ts b/packages/cli/src/commands/generate-string-family-width.pin.test.ts index f678a36d7f3..d3c1ea9abe7 100644 --- a/packages/cli/src/commands/generate-string-family-width.pin.test.ts +++ b/packages/cli/src/commands/generate-string-family-width.pin.test.ts @@ -17,7 +17,7 @@ * ``` * * A row the platform stores today could not be stored in a table generated for - * the same object. That is the hard-failure class of #15040's `22P02`, not the + * the same object. That is the hard-failure class of the `22P02` commit 8644d1d33 fixed, not the * cosmetic-schema-diff class of #15521. * * ## The class is nine rows wide, not one @@ -335,7 +335,7 @@ function armMembers(type: string): string[] { * * ⚠️ [#15989] `FILE_REFERENCE_TYPES` is excluded for a DIFFERENT reason from * the other two, and the difference is the point. It is no longer json-seeded — - * the maintainer ruling on #15041 took the family out of `JSON_COLUMN_TYPES` + * the maintainer ruling in ADR-0104's 2026-09-05 addendum took the family out of `JSON_COLUMN_TYPES` * altogether — but it did not join the character half either: inside the * catch-all it has its own arm, answered per DEPLOYMENT (a json column until * this deployment has moved its media columns, then a `varchar` at the width diff --git a/packages/cli/src/commands/generate.ts b/packages/cli/src/commands/generate.ts index faee49b3564..a30c51fad6f 100644 --- a/packages/cli/src/commands/generate.ts +++ b/packages/cli/src/commands/generate.ts @@ -10,7 +10,7 @@ import path from 'path'; // `@objectstack/spec/data` helpers — the enum object carries the type of the // same name, so the three vocabularies below still read // `satisfies Record` and a field type added to the spec is still a -// named compile error here instead of a silent fallback (#14657). The value +// named compile error here instead of a silent fallback (commit 431979e67). The value // half is what {@link refuseUndeclarableFieldType} reads. // #16091 — IMPORTED, not transcribed. Both are on `@objectstack/spec/data`'s // exported surface, and spec is not a driver package: the #5726 constraint the @@ -84,8 +84,8 @@ const FLOW_SCAFFOLD_REQUIRES = ['automation', 'triggers'] as const; * called: every filename comes from {@link metadataFileName}, which reads the * type's own `filePatterns` out of `DEFAULT_METADATA_TYPE_REGISTRY`. The * harness wrote `NAME.ts` for years, which matches no pattern the registry - * declares for any type; #11025 closed that for `skill` alone through a - * per-generator override, and #11071 replaced the override with the derived + * declares for any type; commit 1c3a46f87 closed that for `skill` alone through a + * per-generator override, and commit 50fb191dc replaced the override with the derived * default so a type added here cannot arrive misnamed by omission. * * A type registered here that the registry gives no TypeScript pattern is @@ -148,9 +148,9 @@ const GENERATORS: Record` below makes a missing member a named `tsc` error * (`Property 'x' is missing …`), so the next field type the spec adds cannot * arrive here in silence. Before it, 21 real members had no entry and every one @@ -853,7 +853,7 @@ const FIELD_TYPE_MAP: Record = { color: 'string', rating: 'number', vector: 'number[]', - // #14657 — the members that used to fall to `|| 'unknown'`. Grouped by the + // Commit 431979e67 — the members that used to fall to `|| 'unknown'`. Grouped by the // spec's ADR-0104 D1 value class, which is what decides each answer. // STRING_VALUE_TYPES. `secret` is a string because the ROW holds an opaque // ref, not the credential: the engine encrypts via the ICryptoProvider, @@ -908,7 +908,7 @@ const FIELD_TYPE_MAP: Record = { * `schema-drift`'s `fieldHasColumn` opens with `isMultiValueField(...)` — and * left this file behind on a raw `field.multiple` read. That gap was measurable: * a `text` field flagged `multiple: true` got JSONB from `os generate migration` - * and a varchar from the driver that actually creates the table, which is #14829 + * and a varchar from the driver that actually creates the table — the defect commit ee370d318 fixed * ("the platform and the GENERATED DDL as two lists") in reverse. * * Takes the RESOLVED type rather than reading `field.type`, for the same reason @@ -1827,7 +1827,7 @@ async function runClientGeneration(configPath: string | undefined, flags: { outp /** * The SQL column type each authored field type generates (#13871). * - * Same invariant as `FIELD_TYPE_MAP`, and since #14657 the same totality: every + * Same invariant as `FIELD_TYPE_MAP`, and since commit 431979e67 the same totality: every * key is a `FieldType` member AND every `FieldType` member has a key, enforced * by the `satisfies` below. The `|| 'TEXT'` default now covers only a `type` * string that is not a field type at all (the unvalidated authoring door). @@ -1841,9 +1841,9 @@ async function runClientGeneration(configPath: string | undefined, flags: { outp * The totality rule is unchanged: `formula` still has an ENTRY, so a field type * added to the spec still cannot arrive here in silence. * - * ## #14828 — the five pre-#14657 entries that disagreed with the platform + * ## Commit 08706f0e0 — the five entries predating commit 431979e67 that disagreed with the platform * - * #13871 removed entries naming types the platform does not have; #14657 added + * #13871 removed entries naming types the platform does not have; commit 431979e67 added * entries for real members that had none, and deliberately left every * PRE-EXISTING entry byte-for-byte alone. This is the third direction: entries * that existed, keyed on a real member, and described something the platform @@ -1893,12 +1893,12 @@ async function runClientGeneration(configPath: string | undefined, flags: { outp * other two moved would have manufactured a fresh within-file * contradiction of exactly the kind this card exists to close. * - * ## #17883 — the FILE_REFERENCE_TYPES exclusion is closed + * ## Commit b06b2db5c — the FILE_REFERENCE_TYPES exclusion is closed * * This paragraph used to hold the family (`file` / `image` / `avatar` / * `video` / `audio`) out of scope, "filed rather than mirrored": the family was * in the driver's `JSON_COLUMN_TYPES` while this table gave it `VARCHAR(2048)`, - * which was #14657's ADR-0104 D3 answer against a driver that was still pre-D3 + * which was commit 431979e67's ADR-0104 D3 answer against a driver that was still pre-D3 * — a decision about which side moves, not a wrong value to correct. * * It was decided, and it landed. ADR-0104 records the ruling: "The driver is @@ -1908,7 +1908,7 @@ async function runClientGeneration(configPath: string | undefined, flags: { outp * `table.string(name, MEDIA_ID_VARCHAR_CHARS)` at 2048. * * What that left was the same fork one level down and INSIDE this file, which - * is the defect #17883 names: the typescript format below spelled the family's + * is the defect commit b06b2db5c fixed: the typescript format below spelled the family's * column as a bare `table.string(name)` — knex's `varchar(255)`, as the * `autonumber` note above states in as many words — so ONE `os generate * migration` answered ONE field with `varchar(2048)` under `--format sql` and @@ -2013,20 +2013,20 @@ const FIELD_TYPE_SQL_MAP: Record = { phone: 'VARCHAR(255)', url: 'VARCHAR(255)', select: 'VARCHAR(255)', - // #14828 — MULTI_OPTION_TYPES seeds `driver-sql`'s `JSON_COLUMN_TYPES`, so + // Commit 08706f0e0 — MULTI_OPTION_TYPES seeds `driver-sql`'s `JSON_COLUMN_TYPES`, so // the runtime stores this in a JSON column; `json: 'JSONB'` below is the // spelling, read from this table's own entry by `fieldTypeToSql`. multiselect: 'JSONB', - // #14828 — REFERENCE_VALUE_TYPES, one width for the whole class: the stored + // Commit 08706f0e0 — REFERENCE_VALUE_TYPES, one width for the whole class: the stored // value is the TARGET's `id`, which `driver-sql` emits as // `table.string('id').primary()` = `varchar(255)`. See `user` / `tree` below. lookup: 'VARCHAR(255)', master_detail: 'VARCHAR(255)', - // #14828 — VIRTUAL. `createColumn` answers `case 'formula': return;` and its + // Commit 08706f0e0 — VIRTUAL. `createColumn` answers `case 'formula': return;` and its // own mirror `varcharColumnChars` answers `case 'formula': return null;`. // Both migration generators skip the field entirely; see `fieldTypeToSql`. formula: null, - // #14828 — the runtime issues a RENDERED string (prefix + counter + suffix) + // Commit 08706f0e0 — the runtime issues a RENDERED string (prefix + counter + suffix) // and `createColumn` gives it `table.string(name)`. `FIELD_TYPE_MAP` above // has always said `string`; `SERIAL` made this file contradict itself. autonumber: 'VARCHAR(255)', @@ -2044,11 +2044,11 @@ const FIELD_TYPE_SQL_MAP: Record = { // for the same object refuses. color: 'VARCHAR(255)', rating: numericSqlType('rating'), - // #14828 — `vector` is in STRUCTURED_JSON_TYPES, hence in the driver's + // Commit 08706f0e0 — `vector` is in STRUCTURED_JSON_TYPES, hence in the driver's // `JSON_COLUMN_TYPES`. `VECTOR` was also not portable: it needs pgvector and // does not exist on MySQL or SQLite. vector: 'JSONB', - // #14657 — the members that used to fall to `|| 'TEXT'`. Same ADR-0104 D1 + // Commit 431979e67 — the members that used to fall to `|| 'TEXT'`. Same ADR-0104 D1 // classes as `FIELD_TYPE_MAP`, resolved to this table's own SQL vocabulary. // STRING_VALUE_TYPES. `secret` holds the opaque `sys_secret` ref, not the // credential, so it is an ordinary short string column (ADR-0100). @@ -2078,7 +2078,7 @@ const FIELD_TYPE_SQL_MAP: Record = { progress: numericSqlType('progress'), summary: numericSqlType('summary'), // REFERENCE_VALUE_TYPES: the stored value is the related record's id, so the - // width belongs to the TARGET's id column, never to this field. #14828 read + // width belongs to the TARGET's id column, never to this field. Commit 08706f0e0 read // that derivation off the driver and applied it: the target's `id` column is // `table.string('id').primary()`, knex's `varchar(255)`. These two moved with // `lookup` / `master_detail` above so one class keeps one answer. @@ -2461,7 +2461,7 @@ function declaredVarchar(maxLength: unknown): VarcharAnswer { /** * The `varchar(n)` width a FILE_REFERENCE_TYPES column takes, READ from this - * file's own SQL vocabulary rather than transcribed beside it (#17883). + * file's own SQL vocabulary rather than transcribed beside it (commit b06b2db5c). * * ⛔ Never a second literal. The width is a decision this file already carries * once — {@link FIELD_TYPE_SQL_MAP}'s `VARCHAR(2048)`, which ADR-0104 calls the @@ -2754,7 +2754,7 @@ function uniqueIndexesForObject(obj: Record): MirroredUniqueIndex[] * 1. A key part with no column. `syncDeclaredIndexes` skips a declared index * whose columns are not in `physicalColumns` and warns; the generator's * equivalent of "not materialized" is a field this file emits no column - * for — a VIRTUAL `formula` (#14828). Emitting the index anyway produces + * for — a VIRTUAL `formula` (commit 08706f0e0). Emitting the index anyway produces * DDL that refuses to run at all. * 2. An EXPRESSION key part. `COALESCE(, '__global__')` is what the * driver builds through raw DDL precisely because knex's schema builder @@ -2806,7 +2806,7 @@ function partitionUniqueIndexes( * the comment "Mirrors `SqlDriver.createColumn` exactly ... including * `multiple` (a JSON column)". Three statements of one rule: a multi-value * field is a JSON column whatever its element type would have been, so the - * element type gets no vote here either (#14829). Before this, one authored + * element type gets no vote here either (commit ee370d318). Before this, one authored * `Field.lookup({ multiple: true })` produced `account?: string[]` from * `os generate types` and a scalar `VARCHAR(36)` column from this generator, in * the same run. @@ -2827,7 +2827,7 @@ function partitionUniqueIndexes( * The JSON spelling is READ from this table's own `json` entry rather than * restated, so the two cannot drift about what a JSON column is spelled here. * - * `null` means NO COLUMN — the answer for a virtual field type (#14828). It is + * `null` means NO COLUMN — the answer for a virtual field type (commit 08706f0e0). It is * the table's own entry, not a second decision here, and it composes in the * driver's order: multi-value still wins first, so a multi-value field of any * type is a JSON column and never reaches the lookup at all. @@ -2835,7 +2835,7 @@ function partitionUniqueIndexes( * ⚠️ The lookup is by OWN-PROPERTY PRESENCE, not by the value being falsy or * nullish, because `null` is a meaningful ANSWER and every other spelling * swallows it: `||` and `??` both fall through on `null` and hand a virtual - * field a TEXT column again — the exact defect #14828 closed, one operator to + * field a TEXT column again — the exact defect commit 08706f0e0 closed, one operator to * the left. (Measured: the first cut of that fix used `??` and still emitted * `"f" TEXT`.) `hasOwnProperty` rather than `in` for the second half of the same * care — `in` answers true for `toString` and every other inherited key. @@ -2946,7 +2946,7 @@ export function generateMigrationSql(config: Record): string { const fields = (obj.fields ?? {}) as Record>; lines.push(`CREATE TABLE IF NOT EXISTS "${tableName}" (`); - // #15040 — the table's OWN id, corrected to what `driver-sql` emits for it: + // Commit 8644d1d33 — the table's OWN id, corrected to what `driver-sql` emits for it: // `table.string('id').primary()`, i.e. knex's `varchar(255)` // (`SqlDriver.DEFAULT_STRING_VARCHAR_CHARS`). This is the same derivation // `lookup` / `master_detail` / `user` / `tree` above already state — a @@ -2982,7 +2982,7 @@ export function generateMigrationSql(config: Record): string { fieldDef.maxLength, keyColumns.has(fieldName), ); - // #14828 — a VIRTUAL field materialises no column. `SqlDriver.createColumn` + // Commit 08706f0e0 — a VIRTUAL field materialises no column. `SqlDriver.createColumn` // returns without emitting one and `schema-drift.ts`'s `fieldHasColumn` // answers false for it, so a column here is one the runtime never writes. if (sqlType === null) continue; @@ -3025,7 +3025,7 @@ export function generateMigrationSql(config: Record): string { // // #15521's other two rows are now RULED, option B on both: the generator // follows the driver rather than improving on it — the same principle - // #15040 applied to the `id` column a few lines above. + // commit 8644d1d33 applied to the `id` column a few lines above. // // NULLABILITY — the driver leaves both columns nullable, so the `NOT // NULL` these two lines carried is gone. It was never load-bearing: @@ -3129,7 +3129,7 @@ export function generateMigrationTs(config: Record): string { const emittedColumns = new Set(['id']); lines.push(` await db.schema.createTable('${tableName}', (table: any) => {`); - // #15040 — the driver's own line for this column, emitted verbatim: + // Commit 8644d1d33 — the driver's own line for this column, emitted verbatim: // `table.string('id').primary()`. See `generateMigrationSql` above for the // derivation and for why the `.defaultTo(db.fn.uuid())` half goes with it // (on Postgres `knex.fn.uuid()` compiles to `(gen_random_uuid())`, so the @@ -3144,7 +3144,7 @@ export function generateMigrationTs(config: Record): string { // name is kept so the emitter below reads unchanged. const required = declaredNotNull(fieldDef) ? '.notNullable()' : '.nullable()'; - // #14829 - MULTI-VALUE before the type, exactly as `SqlDriver.createColumn` + // Commit ee370d318 - MULTI-VALUE before the type, exactly as `SqlDriver.createColumn` // does it: the driver short-circuits above its own per-type switch, so a // multi-value field is a JSON column whatever its element type would have // been. Emitted here rather than as a switch arm because the switch cases @@ -3159,7 +3159,7 @@ export function generateMigrationTs(config: Record): string { continue; } - // #14828 — `string | null`, where `null` is the VIRTUAL answer. Carried + // Commit 08706f0e0 — `string | null`, where `null` is the VIRTUAL answer. Carried // through the switch rather than short-circuited above it so every field // type keeps exactly one arm in one vocabulary, which is what // `generate-field-type-vocabulary.pin.test.ts` measures. @@ -3193,7 +3193,7 @@ export function generateMigrationTs(config: Record): string { // a declared bound would size the wrong string. That is the driver's // own stated reason, not an inference from its silence. case 'select': case 'color': - // #14657 — `secret` holds the opaque `sys_secret` ref, not the + // Commit 431979e67 — `secret` holds the opaque `sys_secret` ref, not the // credential (ADR-0100); `radio` is a single option code like `select`. case 'secret': case 'radio': colMethod = `table.string('${fieldName}')`; @@ -3216,7 +3216,7 @@ export function generateMigrationTs(config: Record): string { // both generated tables, accepting it. case 'text': case 'textarea': case 'richtext': case 'html': case 'markdown': - // #14657 — `driver-sql`'s own DDL switch puts these three in the text + // Commit 431979e67 — `driver-sql`'s own DDL switch puts these three in the text // family (#11794, #11875): the declared `maxLength`, when there is one // and the column is not keyed, is enforced at the write seam rather // than by the column. @@ -3252,7 +3252,7 @@ export function generateMigrationTs(config: Record): string { break; } case 'boolean': - // #14657 — BOOLEAN_VALUE_TYPES; `driver-sql` shares one arm for the pair. + // Commit 431979e67 — BOOLEAN_VALUE_TYPES; `driver-sql` shares one arm for the pair. case 'toggle': colMethod = `table.boolean('${fieldName}')`; break; @@ -3266,7 +3266,7 @@ export function generateMigrationTs(config: Record): string { colMethod = `table.time('${fieldName}')`; break; case 'json': case 'multiselect': - // #14657 — the rest of MULTI_OPTION_TYPES, the whole + // Commit 431979e67 — the rest of MULTI_OPTION_TYPES, the whole // STRUCTURED_JSON_TYPES family answered ONCE, and `vector`. Every one // of these is a member of `driver-sql`'s `JSON_COLUMN_TYPES`, which is // seeded from these very spec classes, so a JSON column here is what @@ -3278,7 +3278,7 @@ export function generateMigrationTs(config: Record): string { case 'location': case 'address': case 'vector': colMethod = `table.jsonb('${fieldName}')`; break; - // #14828 — VIRTUAL: `SqlDriver.createColumn` answers this type with + // Commit 08706f0e0 — VIRTUAL: `SqlDriver.createColumn` answers this type with // `case 'formula': return; // Virtual — no column`, and // `schema-drift.ts`'s `fieldHasColumn` answers false for it. The // generated migration used to create a `table.text` column the runtime @@ -3289,14 +3289,14 @@ export function generateMigrationTs(config: Record): string { break; // `user` references sys_user, whose id is a text identifier (not a uuid), // so store it as a string column — consistent with the runtime sql-driver. - // #14657 — `tree` is the same REFERENCE_VALUE_TYPES class pointing at the - // object's own id. (FILE_REFERENCE_TYPES rode this arm too until #17883 + // Commit 431979e67 — `tree` is the same REFERENCE_VALUE_TYPES class pointing at the + // object's own id. (FILE_REFERENCE_TYPES rode this arm too until commit b06b2db5c // gave it its own below: its value is not another row's id, and the sql // format states a width of its own for it.) `autonumber` is a RENDERED string // (prefix + counter + suffix), which is both what `FIELD_TYPE_MAP` says // and what `driver-sql` emits — a SERIAL could not hold `INV-0001`. // - // #14828 — `lookup` / `master_detail` JOIN this arm, out of a + // Commit 08706f0e0 — `lookup` / `master_detail` JOIN this arm, out of a // `table.uuid` arm of their own. They are the other two members of // REFERENCE_VALUE_TYPES and the driver gives the whole class one // answer: `createColumn`'s `case 'lookup': case 'user':` is @@ -3313,7 +3313,7 @@ export function generateMigrationTs(config: Record): string { case 'autonumber': colMethod = `table.string('${fieldName}')`; break; - // #17883 — FILE_REFERENCE_TYPES takes an arm of its own, at the width + // Commit b06b2db5c — FILE_REFERENCE_TYPES takes an arm of its own, at the width // the sql format above already states for it. // // It used to ride the reference arm, and that arm's derivation was @@ -3342,7 +3342,7 @@ export function generateMigrationTs(config: Record): string { colMethod = `table.text('${fieldName}')`; } - // #14828 — the virtual answer: emit nothing at all for this field. + // Commit 08706f0e0 — the virtual answer: emit nothing at all for this field. if (colMethod === null) continue; // [#16294 cause 3] The same verdict the sql format above renders, in diff --git a/packages/cli/src/commands/i18n/extract.ts b/packages/cli/src/commands/i18n/extract.ts index 61d6350fba3..e8a6fbd7b69 100644 --- a/packages/cli/src/commands/i18n/extract.ts +++ b/packages/cli/src/commands/i18n/extract.ts @@ -224,7 +224,7 @@ export default class I18nExtract extends Command { }), 'source-hashes': Flags.boolean({ description: - 'Also write .source-hashes.generated.ts — the provenance companion that lets a stale fill be told from a translation (#11671). Off by default: it is a format addition, so a bundle set opts in by documenting the flag in its extract config.', + 'Also write .source-hashes.generated.ts — the provenance companion that records which source revision each generated leaf is still a copy of, so a stale fill can be told from a translation. Off by default: it is a format addition, so a bundle set opts in by documenting the flag in its extract config.', default: false, allowNo: true, }), diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index 388997adbd4..80f2d44e709 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -135,7 +135,7 @@ export const SCAFFOLD_BUILT_DEPENDENCIES = ['better-sqlite3', 'esbuild']; * the correct remedy, not pinning our own declaration back to 12. * * RE-MEASURED on the pinned 1.7.2 (#16813). The original reading was taken - * on 1.7.1 (#10326) and was behavioural: better-auth's own Kysely dialect — + * on 1.7.1 (commit 675ab574e) and was behavioural: better-auth's own Kysely dialect — * migrations, sign-up, sign-in, adapter find/update/delete — behaves * identically on better-sqlite3 13.0.3 and on 12.11.1. 1.7.2 makes that * structural instead of empirical: of the 464 files in the published @@ -975,7 +975,7 @@ function printWarning(msg: string) { * files" list). Reuses `create-objectstack`'s `created-summary.ts` (see its * header for the reachability measurement that made a hand-accumulated * list untenable for that scaffolder) instead of a second copy of the same - * renderer — the two scaffold paths already drifted once (#10499) from + * renderer — the two scaffold paths already drifted once (closed by commit 6d441e41f) from * carrying separate implementations of the same list. * * Called once, after the install attempt (success OR failure) has run its diff --git a/packages/cli/src/commands/lint.ts b/packages/cli/src/commands/lint.ts index 37bf1203bff..9a2477dbac6 100644 --- a/packages/cli/src/commands/lint.ts +++ b/packages/cli/src/commands/lint.ts @@ -253,7 +253,7 @@ function duplicateNameIssues(stack: any, pathPrefix = ''): LintIssue[] { // of the same name collide for real — and are reported, as they must be. // It is spelled as the imported constant rather than a bare `'global'` // literal so this reader cannot part from the engine's writer in silence - // the day the constant moves — the same divergence #14667 removed from the + // the day the constant moves — the same divergence commit dc7c226b9 removed from the // plugin's own copy. // // Only `objectName` is read. `object`/`entity` are rejected outright by @@ -583,7 +583,7 @@ export function lintConfig(config: any, opts: LintConfigOptions = {}): LintIssue } } - // ── Hook/action bodies that cannot be lowered to metadata (#13651) ── + // ── Hook/action bodies that cannot be lowered to metadata (commit ada3834ad) ── // `os build` catches every extraction refusal, warns, and bundles the closure // at exit 0 — so an app can stop being shippable as pure metadata with nothing // red anywhere. This rule is the "no" to that recorded array. It runs the SAME @@ -908,10 +908,10 @@ export default class Lint extends Command { printStep('Loading configuration...'); } - // [#12297] The ADR-0087 D2 conversion notices this command raises. + // [commit 9fd45a952] The ADR-0087 D2 conversion notices this command raises. // // ⛔ This is the #3782 PARITY class, NOT the "computed, then dropped" - // family (#11643 / #11391 / #11772 / #12047 / #12125). Nothing was computed + // family (#11643 / #11391 / #11772 / #12047 / commit 79cf692b0). Nothing was computed // and discarded here: `normalizeStackInput` was called with no options // object at all, so no sink existed and the notices were never PRODUCED — // in either face. `os lint` is the third of the three authoring commands @@ -927,7 +927,7 @@ export default class Lint extends Command { // // Declared above the `try` so the catch-all exit can read it, under the // maintainer's 2026-08-25 ruling (#11772/#12047, applied to this field by - // #12125): every failure exit carries the lists the run has ALREADY + // commit 79cf692b0): every failure exit carries the lists the run has ALREADY // COMPUTED, so the field means the same thing on every exit. The CALL that // fills it stays below, at the step that owns it — a throw in `loadConfig`, // above it, reports `[]` honestly. @@ -935,7 +935,7 @@ export default class Lint extends Command { // ⛔ NOT FOLDED INTO `issues`. Whether an auto-converted key should become // a `LintIssue` — or, on the sibling commands, whether `warnings` and // `conversions` should become one field — is an open question raised on - // #12125, left unsettled by the ruling there and explicitly withheld by + // the card behind commit 79cf692b0, left unsettled by its ruling and explicitly withheld by // that card's implementer. This change had no authority to settle it, so it // mirrors the shipped sibling shape rather than merging: `issues` keeps // meaning "something to fix", the notice keeps its structured @@ -1066,7 +1066,7 @@ export default class Lint extends Command { ...(hiddenPlatform > 0 ? { hiddenPlatform } : {}), ...(score ? { score: score.score, grade: score.grade } : {}), issues, - // [#12297] The notices computed at `normalizeStackInput` above. Its + // [commit 9fd45a952] The notices computed at `normalizeStackInput` above. Its // own key, unconditionally present — the same `conversions` key // `os validate --json` and `os build --json` publish, carrying the // same structured notice objects, so one consumer reads all three @@ -1167,11 +1167,11 @@ export default class Lint extends Command { } catch (error: any) { if (isExitSignal(error)) throw error; if (flags.json) { - // [#12297] Whatever the run had reached before the throw, under the + // [commit 9fd45a952] Whatever the run had reached before the throw, under the // same 2026-08-25 ruling: `[]` for a throw in `loadConfig` — the // normalize step never ran — and the notices in hand for any later one. // Wiring the producer without this exit would ship a fresh instance of - // the #12125 defect one command over, on the day it was closed. + // the defect commit 79cf692b0 fixed, one command over, on the day it was closed. await emitJson( { error: error.message, ...errorCodeFields(error), conversions: conversionNotices }, 0, diff --git a/packages/cli/src/commands/login.ts b/packages/cli/src/commands/login.ts index 9f6f9b056e6..995dbde972a 100644 --- a/packages/cli/src/commands/login.ts +++ b/packages/cli/src/commands/login.ts @@ -6,7 +6,7 @@ * ## What was broken * * Everywhere else in this CLI `--json` means "stdout is exactly one JSON - * document" (#6217). The device-flow path could not honour that and did not + * document" (commit 2b641ddd4). The device-flow path could not honour that and did not * try: it wrote the RFC 8628 device-authorization payload compact, and then, * after the token poll succeeded, the result payload 2-space indented. Measured * against a live device endpoint, stdout came out as diff --git a/packages/cli/src/commands/meta/delete-json-error-code.test.ts b/packages/cli/src/commands/meta/delete-json-error-code.test.ts index 353556956d3..c3711e40eeb 100644 --- a/packages/cli/src/commands/meta/delete-json-error-code.test.ts +++ b/packages/cli/src/commands/meta/delete-json-error-code.test.ts @@ -1,7 +1,7 @@ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. /** - * [#13347] The ADR-0112 carriers survive the whole way to a `--format json` + * [commit 098a08ffa] The ADR-0112 carriers survive the whole way to a `--format json` * failure envelope — and are ABSENT when the failure never carried them. * * ## Why this file drives the real command and the real SDK diff --git a/packages/cli/src/commands/meta/delete-reset-carriers.test.ts b/packages/cli/src/commands/meta/delete-reset-carriers.test.ts index 42b68370b00..b6f9c518f0f 100644 --- a/packages/cli/src/commands/meta/delete-reset-carriers.test.ts +++ b/packages/cli/src/commands/meta/delete-reset-carriers.test.ts @@ -2,7 +2,7 @@ /** * [#13024] `os meta delete` can pin its reset and can discard only the pending - * draft — the CLI reaches the carriers the SDK gained in #12181. + * draft — the CLI reaches the carriers the SDK gained in commit cf71d73f8. * * ## The defect * @@ -19,7 +19,7 @@ * an operator who wanted to throw away only an unpublished draft had to take * the more destructive path. * - * Until #12181 there was no argument to pass either through. With + * Until commit cf71d73f8 there was no argument to pass either through. With * `DeleteMetaItemOptions` on both `deleteItem` declarations, only the CLI * surface was missing. * @@ -390,7 +390,7 @@ describe('[#13024] the flags `os meta delete` declares', () => { it('the withheld third carrier has no flag, under either spelling', () => { const names = Object.keys(MetaDelete.flags as Record); - // #12181 shipped two of the door's three carriers on purpose; `?dropStorage` + // Commit cf71d73f8 shipped two of the door's three carriers on purpose; `?dropStorage` // is the one that ADDS destructive reach. A CLI flag for it would reverse // that ruling from the layer above. expect(names).not.toContain('dropStorage'); diff --git a/packages/cli/src/commands/meta/delete.ts b/packages/cli/src/commands/meta/delete.ts index f054f644751..b2ee33b0840 100644 --- a/packages/cli/src/commands/meta/delete.ts +++ b/packages/cli/src/commands/meta/delete.ts @@ -45,7 +45,7 @@ export const EMPTY_IF_MATCH_REFUSAL = * `os meta delete ` hands the SDK the same argument list it has * always handed it and the request stays byte-identical. * - * ⛔ `?dropStorage` is NOT here and gets no flag. #12181 shipped two of the + * ⛔ `?dropStorage` is NOT here and gets no flag. Commit cf71d73f8 shipped two of the * door's three carriers on purpose: the third ADDS destructive reach (it drops * the object's physical table), no caller was measured needing it, and the * door's repeated-parameter refusal exists because of that destructiveness. diff --git a/packages/cli/src/commands/meta/resync-skip-explanation.test.ts b/packages/cli/src/commands/meta/resync-skip-explanation.test.ts index ac3e245aebe..cec449cea65 100644 --- a/packages/cli/src/commands/meta/resync-skip-explanation.test.ts +++ b/packages/cli/src/commands/meta/resync-skip-explanation.test.ts @@ -4,7 +4,7 @@ // // The docblock half (#9130 / PR #9183) already explains, IN SOURCE, that a // stored `'admin'` (or legacy `'user'`) stamp is not always a deliberate -// Setup takeover — on any install created before #8692 the platform's own +// Setup takeover — on any install created before commit 712e185db the platform's own // seeder wrote that exact stamp, so `resynced 0 / skipped N` is a permanent, // by-design outcome there. This card is the runtime-output half: the same // explanation has to reach the operator who is staring at the terminal, @@ -20,7 +20,7 @@ // • it says the skip is expected / by design / not a failure — the whole // point of the card; // • it does NOT reintroduce "intentional override" framing for the -// admin-owned case — the docblock removed that as false (a pre-#8692 +// admin-owned case — the docblock removed that as false (before commit 712e185db the // seeder wrote the stamp, not an admin), and this line must not // contradict it. @@ -60,7 +60,7 @@ describe('resyncSkipExplanationLine — the runtime-output half of #9184', () => it('never claims the admin-owned case is a deliberate override — the framing PR #9183 removed', () => { const line = resyncSkipExplanationLine(1)!; - // The pre-#8692 case is exactly the platform's own seeder inheriting a + // The case predating commit 712e185db is exactly the platform's own seeder inheriting a // field default, not an administrator deciding anything — the docblock // in bootstrap-platform-admin.ts is explicit that stating this as // "(intentional override)" is a lie for those rows. This line must keep diff --git a/packages/cli/src/commands/meta/resync.ts b/packages/cli/src/commands/meta/resync.ts index 5e6316b70ff..498b40abafd 100644 --- a/packages/cli/src/commands/meta/resync.ts +++ b/packages/cli/src/commands/meta/resync.ts @@ -52,7 +52,7 @@ function safeGetService(kernel: any, name: string): any { * seeder docblock (`bootstrap-platform-admin.ts`) this line must not * contradict: the skip decision is unconditionally intentional (only * platform-owned rows are ever reconciled), but a stored `'admin'` stamp is - * NOT always a deliberate Setup takeover — on any install predating #8692 + * NOT always a deliberate Setup takeover — on any install predating commit 712e185db * the platform's own seeder wrote that exact stamp, so `resynced 0 / skipped * N` is a permanent, by-design outcome there rather than a sign the command * failed. `'user'` is named too: it is the legacy spelling of the same @@ -93,7 +93,7 @@ export function resyncSkipExplanationLine(resyncSkipped: number): string | null * `'admin'` — or the legacy spelling `'user'`, healed to `'admin'` by the * boot-time vocabulary normalizer (`normalizeManagedByVocab`) — is left alone * too, but is NOT always a deliberate override: on any install created before - * #8692 (2026-08-15) the platform's OWN seeded default sets carry that same + * commit 712e185db (the 2026-08-15 ruling) the platform's OWN seeded default sets carry that same * `'admin'` stamp, indistinguishable from a genuine Setup takeover, so * `resynced 0 / skipped N` is a permanent, by-design outcome on those * installs rather than a bug. diff --git a/packages/cli/src/commands/migrate/apply.ts b/packages/cli/src/commands/migrate/apply.ts index 8e3b0227980..12d27977b28 100644 --- a/packages/cli/src/commands/migrate/apply.ts +++ b/packages/cli/src/commands/migrate/apply.ts @@ -339,7 +339,7 @@ export default class MigrateApply extends Command { // ⛔ The detection mechanism is deliberately not "drop it and let the // constraint fail". On this table it would not fail: `syncDeclaredIndexes` // logs a plain UNIQUE whose CREATE fails on existing duplicates and lets - // the boot continue (#14902 / #15479), so a database holding the class + // the boot continue (commit 61821e54c / #15479), so a database holding the class // carries no such constraint to violate. The drop would simply make the // rows indistinguishable and let a sign-in resolve onto the wrong user's // account — silently. Hence a row-level pre-flight, run against the live diff --git a/packages/cli/src/commands/migrate/duplicates.ts b/packages/cli/src/commands/migrate/duplicates.ts index 277c1686801..07d74e7e74d 100644 --- a/packages/cli/src/commands/migrate/duplicates.ts +++ b/packages/cli/src/commands/migrate/duplicates.ts @@ -882,7 +882,7 @@ export default class MigrateDuplicates extends Command { * renderer, per the ruling's point 3: the report IS the deliverable, the * operator archives it, and a second renderer would be a second contract to * keep true. stdout is therefore reserved for the payload for the whole run - * (`jsonOutput: true`), so the boot's own log lines go to stderr (#6217). + * (`jsonOutput: true`), so the boot's own log lines go to stderr (commit 2b641ddd4). */ async run(): Promise { const { flags } = await this.parse(MigrateDuplicates); diff --git a/packages/cli/src/commands/migrate/files-to-references.ts b/packages/cli/src/commands/migrate/files-to-references.ts index 3b85d33c2db..553b486b0f4 100644 --- a/packages/cli/src/commands/migrate/files-to-references.ts +++ b/packages/cli/src/commands/migrate/files-to-references.ts @@ -271,7 +271,7 @@ export default class MigrateFilesToReferences extends Command { includeUnreferenced: flags['include-unreferenced'], }); - // ── The COLUMN step (#15989, the ruling on #15041 step 2) ──────────── + // ── The COLUMN step (#15989, sequencing step 2 of ADR-0104's 2026-09-05 addendum) ── // // Runs only after the backfill and its self-check reported zero blocking // rows — the ruling's own "abort otherwise", and the reason it lives diff --git a/packages/cli/src/commands/serve-audit-registration.contract.test.ts b/packages/cli/src/commands/serve-audit-registration.contract.test.ts index 3d8e4f8e874..226ad9bc78f 100644 --- a/packages/cli/src/commands/serve-audit-registration.contract.test.ts +++ b/packages/cli/src/commands/serve-audit-registration.contract.test.ts @@ -53,7 +53,7 @@ import { readFileSync } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; // The separator (#9367) is a plain `.mjs`, but it ships a hand-written `.d.mts` -// declaration alongside it (#10398), so this import is typed and needs no +// declaration alongside it (commit 0681a76b8), so this import is typed and needs no // suppression. A `@ts-expect-error` here is an UNUSED directive, and cli's tsc // program does include this file, so tsc fails the build on one. import { maskComments } from '../../../../scripts/js-comment-mask.mjs'; diff --git a/packages/cli/src/commands/serve-bound-port-publication.test.ts b/packages/cli/src/commands/serve-bound-port-publication.test.ts index cc84c714375..89f5a410fb1 100644 --- a/packages/cli/src/commands/serve-bound-port-publication.test.ts +++ b/packages/cli/src/commands/serve-bound-port-publication.test.ts @@ -250,7 +250,7 @@ function recordingProcessSend(fn: () => void): unknown[] { * * They read the source because `run()` is one ~3000-line method needing a whole * kernel to enter, so nothing in-process could observe what its three publish - * sites read. #13193 changed the shape: the publish is now one exported seam, + * sites read. Commit faff497fd changed the shape: the publish is now one exported seam, * {@link publishBoundPort}, that takes its three channels as ARGUMENTS. So * "all three publish that one number" is now driven and observed instead of * grepped — strictly stronger, because a grep passes on text that never runs, @@ -261,7 +261,7 @@ function recordingProcessSend(fn: () => void): unknown[] { * un-enterable in-process, so it stays a source pin, and it is a better one * than before: there is now exactly ONE site to get wrong instead of three. * - * ⛔ The ORDER the seam drives the three in is #13193's property, pinned in + * ⛔ The ORDER the seam drives the three in is what commit faff497fd fixed, pinned in * `test/serve-bound-port-publish-order.test.ts`. Kept separate deliberately — * these two files fail for different reasons and should keep naming them. */ @@ -415,7 +415,7 @@ describe('#13062 all THREE channels publish that one number', () => { // one leaves two lying in a place nobody thinks to look next time. expect(SERVE).not.toContain('port: Number(port)'); expect(SERVE).not.toContain('externalBaseOrigin: resolveAuthBaseUrl(port)'); - // ⛔ `const runtimeUrl = ...` is gone (#13193 folded it into the seam), so a + // ⛔ `const runtimeUrl = ...` is gone (commit faff497fd folded it into the seam), so a // negative naming it would pass for the wrong reason. The live spelling of // the same regression is the seam being handed the REQUESTED port. expect(SERVE).not.toContain('publishBoundPort(port,'); diff --git a/packages/cli/src/commands/serve-cluster-host-resolution.test.ts b/packages/cli/src/commands/serve-cluster-host-resolution.test.ts index a9d43f47ea1..b89a305bf07 100644 --- a/packages/cli/src/commands/serve-cluster-host-resolution.test.ts +++ b/packages/cli/src/commands/serve-cluster-host-resolution.test.ts @@ -49,19 +49,19 @@ * time it cost the organizations load (cloud#1013); the second * time it cost EE multi-node boot outright (#10645). * - * #10769 closed the class rather than hoisting a third time: the helper is + * Commit 3d7deb700 closed the class rather than hoisting a third time: the helper is * now a module-scope FUNCTION DECLARATION, hoisted over the entire module, so * "above the definition" is not a state this file can be in. The scan below * pins that shape — a `const`, or a declaration nested inside a function, * fails — which is strictly stronger than the ordering check it replaced. * - * 3. EVERY app-declarable optional load, by source scan (#10769). The cluster + * 3. EVERY app-declarable optional load, by source scan (commit 3d7deb700). The cluster * pair was only the instance that happened to ship. A package is treated as * app-declarable exactly when `packages/cli`'s own manifest does not declare * it — mechanically, so a newly added optional package is covered without * anyone remembering this file. Bare `import()` of such a package fails. * - * 4. The DIRECTION of the scan's own ignorance (#12162). A specifier the scan + * 4. The DIRECTION of the scan's own ignorance (commit c0f5e8f21). A specifier the scan * cannot resolve carries no package name, so it falls OUT of the judged * population rather than into it: the sweep does not report the load as * unknowable, it reports nothing at all and keeps passing over the @@ -381,7 +381,7 @@ function resolveImportedLiteral( * * The search is confined to the source ABOVE the call and takes the NEAREST * preceding binding, because a `const` only exists below itself — the same - * temporal-dead-zone fact #10769 pinned for `importFromHost`. Unconfined, the + * temporal-dead-zone fact commit 3d7deb700 pinned for `importFromHost`. Unconfined, the * match is a whole-file FIRST-HIT search for `const =`, and in a * 5000-line file that is a coin toss: `importFromHost(pkg)` inside * `loadOptionalServicePlugin`, whose `pkg` is a PARAMETER, resolved against a @@ -596,8 +596,8 @@ const APP_DECLARABLE_LOADS = LOAD_SITES.filter( * * bare `import()` — the strong excuse, "can only ever name a CLI-declared * package or a non-package": - * :431 fallbackSpecifier the host importer's own caller base (#11157) - * :754 pluginSpecifier the app's config-plugin, non-package branch (#10908) + * :431 fallbackSpecifier the host importer's own caller base (commit a4cb7817f) + * :754 pluginSpecifier the app's config-plugin, non-package branch (commit 9cc6777d3) * :1653 absolutePath ? … a path to the served artifact, never a package * :2778 appPkg loops @objectstack/setup + /account, both CLI-declared * :3346 spec.pkg Serve.CAPABILITY_PROVIDERS, all CLI-declared @@ -626,7 +626,7 @@ const UNRESOLVABLE_BARE_IMPORTS: Record = { 'spec.pkg': 'Serve.CAPABILITY_PROVIDERS entries are all CLI-declared', 'ex.pkg': 'CAPABILITY_PROVIDERS `extras` entries are all CLI-declared', // The app's own `plugins: [...]` config entries, routed through - // `Serve.importConfigPlugin` (#10908). ONE bare `import()` site remains there, + // `Serve.importConfigPlugin` (commit 9cc6777d3). ONE bare `import()` site remains there, // and it is the reason this list exists rather than a hole in it: the // specifier is not a package name at all (an absolute path, a `file://` URL, a // `node:` builtin), so nothing a package.json can declare, and every one of @@ -634,13 +634,13 @@ const UNRESOLVABLE_BARE_IMPORTS: Record = { // // It used to be TWO. The second was the UNDECLARED branch, which kept a local // `import()` because the host importer's fallback resolved from - // `@objectstack/types` rather than from this CLI. #11157 threaded the base + // `@objectstack/types` rather than from this CLI. Commit a4cb7817f threaded the base // (`fallbackImport`), which made that branch identical to the helper's own // fallback, and it was collapsed into `importFromHost`. Pinned behaviourally, // not by this comment, in `serve-config-plugin-host-resolution.test.ts` and // `serve-host-fallback-base.test.ts`. pluginSpecifier: 'the non-package branch: an absolute path, a file:// URL or a node: builtin (#10908)', - // `importFromHost`'s own `fallbackImport` (#11157) — the caller base + // `importFromHost`'s own `fallbackImport` (commit a4cb7817f) — the caller base // `createHostImporter` resolves everything the served app does NOT declare // from. It is a bare `import()` on purpose and it MUST be written in this // file: ESM resolves a bare specifier against the module containing the call, @@ -667,7 +667,7 @@ const UNRESOLVABLE_BARE_IMPORTS: Record = { * is reported here by file, line and specifier text instead of vanishing. */ const UNRESOLVABLE_HOST_LOADS: Record = { - // `Serve.importConfigPlugin`'s package branch (#10908): the same app-config + // `Serve.importConfigPlugin`'s package branch (commit 9cc6777d3): the same app-config // specifier as the bare entry above, taking the host-anchored path. It is a // runtime value from the served app's own `plugins: [...]`, so no scan can // know it — and it needs no scan, because reaching it through the host @@ -769,7 +769,7 @@ describe('os serve → cluster block source shape', () => { // ── Replaces the former "definition is ABOVE the cluster block" assertion ── // // That assertion pinned an ORDERING inside one long boot method, which is the - // shape #10769 removed: `importFromHost` is now a module-scope FUNCTION + // shape commit 3d7deb700 removed: `importFromHost` is now a module-scope FUNCTION // DECLARATION, hoisted over the entire module. The ordering it used to check // is not merely satisfied, it is unrepresentable — so the check below is the // strictly stronger one it must be read as. Ordering can only regress again if @@ -811,9 +811,9 @@ describe('os serve → cluster block source shape', () => { /** * The detection backstop, widened from the cluster pair to EVERY app-declarable - * optional load in `serve.ts` (#10769). + * optional load in `serve.ts` (commit 3d7deb700). * - * The structural half of that card makes the ordering hazard unrepresentable + * The structural half of that commit makes the ordering hazard unrepresentable * (`importFromHost` is a hoisted module-scope declaration). This sweep is what * catches the remaining way in: a load written as a bare `import()` even though * the helper was reachable. It classifies mechanically rather than from a @@ -828,7 +828,7 @@ describe('os serve → every app-declarable optional load is host-anchored', () // read as a clean bill of health. expect(LOAD_SITES.length, 'no dynamic loads found in serve.ts at all').toBeGreaterThan(25); - // ── Does a COUNTING floor still earn its place? (#12162) ──────────────── + // ── Does a COUNTING floor still earn its place? (commit c0f5e8f21) ────── // // Yes — but NOT for the job it used to be given, and it must never again be // read as the guard of last resort. @@ -890,7 +890,7 @@ describe('os serve → every app-declarable optional load is host-anchored', () '@objectstack/service-cluster', // const binding (#10645) '@objectstack/service-cluster-', // template prefix (#10645, the driver) '@objectstack/organizations', // const <- static (cloud#1013, #11614) - '@objectstack/service-i18n', // const binding (#10769) + '@objectstack/service-i18n', // const binding (commit 3d7deb700) ]) { expect(found, `the sweep no longer sees the ${pkg} load`).toContain(pkg); } diff --git a/packages/cli/src/commands/serve-config-plugin-host-resolution.test.ts b/packages/cli/src/commands/serve-config-plugin-host-resolution.test.ts index aa560740ef3..32bb4b1f980 100644 --- a/packages/cli/src/commands/serve-config-plugin-host-resolution.test.ts +++ b/packages/cli/src/commands/serve-config-plugin-host-resolution.test.ts @@ -13,14 +13,14 @@ import Serve from './serve.js'; * which Node ESM resolves against the CLI's realpath — so a plugin the APP * declares could only be served where it happened to be hoisted somewhere the * CLI could see. Green in a dev checkout, absent on a real distribution layout - * (#10908; the same mechanism as cloud#1013 and #10645). + * (until commit 9cc6777d3; the same mechanism as cloud#1013 and #10645). * * The repair moves ONLY the declared case. These tests pin every branch the * method has, including the ones that exist to keep behaviour a naive * `await importFromHost(specifier)` would have taken away — see * `Serve.importConfigPlugin` for the measurements. * - * ⚠️ #11157 collapsed the shape from three branches to two: once `importFromHost` + * ⚠️ Commit a4cb7817f collapsed the shape from three branches to two: once `importFromHost` * hands `createHostImporter` this file's own resolver (`fallbackImport`), the * helper's undeclared leg IS the local `import()` the undeclared branch used to * make, so that branch and the re-entry branch became one call. Every assertion @@ -120,7 +120,7 @@ describe('os serve → an app-declared `plugins: [...]` package resolves from th }); /** - * Triage ② on #10908: host-anchoring changes the user-facing text a missing + * Triage ②, as landed in commit 9cc6777d3: host-anchoring changes the user-facing text a missing * plugin produces — the wrapper now nests `createHostImporter`'s #4719 remedy. * That is a better diagnostic, but it is VISIBLE, so it is pinned here as a * chosen behaviour rather than left to drift. @@ -155,13 +155,13 @@ describe('os serve → the branches that must NOT move (#10908 supersedes nothin // writes `plugins: ['@objectstack/plugin-auth']` without declaring it boots // today, and this is the assertion that says it still does. // - // ⚠️ This assertion is why #11157 had to land BEFORE the branch collapse and + // ⚠️ This assertion is why commit a4cb7817f threaded the base BEFORE the branch collapse and // not after. It used to be kept true by a local `import()` here; it is now // kept true by `importFromHost` carrying this file's base. // // ⛔ IT IS NOT THE MEASUREMENT OF THAT BASE, and this comment used to claim // it was ("take the base away and this line goes red"). #11412 ablated it: - // with `fallbackImport` removed from `importFromHost` — the #11157 fix gone, + // with `fallbackImport` removed from `importFromHost` — commit a4cb7817f's fix gone, // everything else identical — this case stayed GREEN, while the spawned-child // pin of the same claim in `test/serve-host-fallback-base.e2e.test.ts` went // RED. Under vitest `@objectstack/types` is inlined and its `import()` is @@ -181,10 +181,10 @@ describe('os serve → the branches that must NOT move (#10908 supersedes nothin expect(mod.default ?? mod).toBeTruthy(); }); - // ⚠️ REPLACED, not reworded (#10944). This slot used to pin that a RELATIVE + // ⚠️ REPLACED, not reworded (commit e598b1cbc). This slot used to pin that a RELATIVE // specifier stayed anchored to serve.ts rather than being re-based under - // `@objectstack/types/dist/` — i.e. it pinned the exact branch #10944 has - // since removed. #10944 ruled that neither base is the served app's root, so + // `@objectstack/types/dist/` — i.e. it pinned the exact branch commit e598b1cbc has + // since removed. The ruling it landed: neither base is the served app's root, so // the spelling is now refused at load instead of resolved anywhere; keeping // the old assertion would have pinned a resolution that no longer runs. // The refusal, the two spellings that do work, and the full shape matrix live @@ -235,7 +235,7 @@ describe('os serve → the config-plugin load stays wired to the helper', () => // importer would still pass the behavioural tests above, so pin the wiring. // // ⚠️ This used to also require `isDeclaredByHost(pluginSpecifier, root)` in - // this method. #11157 removed that call — not the check. `importFromHost` + // this method. Commit a4cb7817f removed that call — not the check. `importFromHost` // now carries this file's resolution base, which made the local undeclared // branch identical to the helper's own fallback, so the declaration is read // exactly once, by `readHostDeclaration` inside `createHostImporter`. Asking @@ -248,7 +248,7 @@ describe('os serve → the config-plugin load stays wired to the helper', () => // The resolver is never chosen by a second, local reading of the manifest. expect(body).not.toContain('isDeclaredByHost'); // …and the entry is never handed to a bare `import()` once it names a - // package: that is the #10908 defect itself. + // package: that is the defect commit 9cc6777d3 fixed. expect(body).not.toMatch(/if \(isDeclaredByHost/); }); }); diff --git a/packages/cli/src/commands/serve-config-plugin-relative-refusal.test.ts b/packages/cli/src/commands/serve-config-plugin-relative-refusal.test.ts index 9f1fea7b07f..c704ad903d2 100644 --- a/packages/cli/src/commands/serve-config-plugin-relative-refusal.test.ts +++ b/packages/cli/src/commands/serve-config-plugin-relative-refusal.test.ts @@ -2,7 +2,7 @@ /** * A RELATIVE `plugins: [...]` entry is refused at load, naming the two - * spellings that work (#10944). + * spellings that work (commit e598b1cbc). * * ## The defect, measured before the fix * @@ -31,7 +31,7 @@ * * ## Why refusal and not app-root resolution * - * Ruled at triage on #10944. Refusing expands no accepted set — the spelling + * Ruled at triage, landed as commit e598b1cbc. Refusing expands no accepted set — the spelling * has never loaded an app's file — and converts a diagnostic about the CLI's * internals into an answer the author can act on. Resolving relative entries * against the served app's root is a capability addition with no measured pull @@ -145,7 +145,7 @@ describe('os serve → a relative `plugins: [...]` entry is refused (#10944)', ( // …and it does not claim an import was attempted, because none was. expect(message).not.toContain('Failed to import plugin'); // Option A stays a maintainer decision; the message must not pre-announce - // it (triage on #10944 is explicit about this). + // it (the triage ruling behind commit e598b1cbc is explicit about this). expect(message).not.toMatch(/coming soon|will be supported|in a future release/i); }); diff --git a/packages/cli/src/commands/serve-email-config-parity.contract.test.ts b/packages/cli/src/commands/serve-email-config-parity.contract.test.ts index 00e21d122aa..9e477b7e4f1 100644 --- a/packages/cli/src/commands/serve-email-config-parity.contract.test.ts +++ b/packages/cli/src/commands/serve-email-config-parity.contract.test.ts @@ -45,7 +45,7 @@ import { EmailServiceConfigSchema } from '@objectstack/spec/system'; import type { EmailServiceConfig } from '@objectstack/spec/system'; import { resolveEmailCapabilityArg } from './serve.js'; // The repo's one comment/code separator (#9367). This file used to scan RAW -// source with no separator at all (#10514): a docblock or a `// TODO: also +// source with no separator at all (until commit 5359a9b4c): a docblock or a `// TODO: also // read cfgEmail.foo` line was indistinguishable from a real dot access. Typed // by the hand-written `scripts/js-comment-mask.d.mts` next to it (this // package's `tsconfig.json` includes `src`), so this import needs no @@ -60,7 +60,7 @@ const SERVE_SOURCE = readFileSync( /** * `serve.ts` with every comment span blanked (offsets preserved, bytes * replaced with spaces) — see `keysReadFromConfigEmail` below for why the - * scan reads this instead of `SERVE_SOURCE` directly (#10514). + * scan reads this instead of `SERVE_SOURCE` directly (since commit 5359a9b4c). */ const MASKED_SERVE_SOURCE = maskComments(SERVE_SOURCE); @@ -76,7 +76,7 @@ const MASKED_SERVE_SOURCE = maskComments(SERVE_SOURCE); * approximation. Should that ever stop being true, this comment is the place * the next reader learns the scan has to change with it. * - * Takes `source` explicitly (default the real file's masked text, #10514) + * Takes `source` explicitly (default the real file's masked text, since commit 5359a9b4c) * rather than closing over `SERVE_SOURCE`/`MASKED_SERVE_SOURCE` directly, so * the vacuity-proof tests below can drive the exact same regex over a raw vs. * a masked variant of a shape and show the two disagree. @@ -151,12 +151,12 @@ describe('EmailServiceConfigSchema ↔ resolveEmailCapabilityArg', () => { }); /** - * Vacuity proof (#10514): both directions the raw scan was one ordinary + * Vacuity proof (commit 5359a9b4c): both directions the raw scan was one ordinary * comment away from getting wrong, reproduced on synthetic sources shaped * like the real resolver so the two legs (raw vs. masked) can be compared * without waiting for `serve.ts` to actually regress. Each `it` shows the RAW * leg producing the wrong verdict — the verdict this file's scan would have - * produced before #10514 — and the MASKED leg producing the right one. + * produced before commit 5359a9b4c — and the MASKED leg producing the right one. */ describe('the key scan ignores prose that looks like a cfgEmail read (#10514)', () => { it('does not let a comment fabricate an undeclared key ("declares every key" direction)', () => { @@ -168,11 +168,11 @@ describe('the key scan ignores prose that looks like a cfgEmail read (#10514)', '}', ].join('\n'); - // Pre-#10514 (raw): the comment's `cfgEmail.bogusKey` is indistinguishable + // Before commit 5359a9b4c (raw): the comment's `cfgEmail.bogusKey` is indistinguishable // from a real dot access — this is what would have made "declares every // config.email key the resolver reads" go RED over a comment alone. expect(keysReadFromConfigEmail(synthetic)).toEqual(['bogusKey', 'provider']); - // Post-#10514 (masked): the comment is blanked, so only the real read + // Since commit 5359a9b4c (masked): the comment is blanked, so only the real read // survives. expect(keysReadFromConfigEmail(maskComments(synthetic))).toEqual(['provider']); }); @@ -186,11 +186,11 @@ describe('the key scan ignores prose that looks like a cfgEmail read (#10514)', '}', ].join('\n'); - // Pre-#10514 (raw): the comment alone counts as a "read" of `persist` — + // Before commit 5359a9b4c (raw): the comment alone counts as a "read" of `persist` — // silently restoring the exact `DECLARED_BUT_UNREAD` exemption this // file's docblock (above) says was deleted for good after #5447/#5470. expect(keysReadFromConfigEmail(synthetic)).toContain('persist'); - // Post-#10514 (masked): the comment does not count, so a schema key with + // Since commit 5359a9b4c (masked): the comment does not count, so a schema key with // no real reader still reads as unread here. expect(keysReadFromConfigEmail(maskComments(synthetic))).not.toContain('persist'); }); diff --git a/packages/cli/src/commands/serve-host-fallback-base.test.ts b/packages/cli/src/commands/serve-host-fallback-base.test.ts index 3ec3d883489..0150e1a44e0 100644 --- a/packages/cli/src/commands/serve-host-fallback-base.test.ts +++ b/packages/cli/src/commands/serve-host-fallback-base.test.ts @@ -1,15 +1,15 @@ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. /** - * `serve` hands `createHostImporter` its OWN resolution base (#11157) — the - * half of that card an in-process test can honestly measure. + * `serve` hands `createHostImporter` its OWN resolution base (commit a4cb7817f) — the + * half of that fix an in-process test can honestly measure. * * ── The defect ─────────────────────────────────────────────────────────── * * `createHostImporter`'s UNDECLARED leg falls back to "the importing package's * own resolution", and which package that is depends on where the `import()` is * physically WRITTEN: Node ESM resolves a bare specifier against the module - * containing the call. #10943 made it an explicit parameter, + * containing the call. Commit 46d34ab7c made it an explicit parameter, * `options.fallbackImport`. `@objectstack/verify` and the `packages/qa/dogfood` * probe pass theirs; `serve`'s `importFromHost` did not, so its fallback * resolved from `@objectstack/types` — which under a pnpm-isolated layout sees @@ -91,7 +91,7 @@ describe('os serve → the undeclared diagnostic takes the caller-supplied-base // #11185's text: the app being served, never the process CWD. expect(err.message).toContain(`host app: ${root}`); expect(err.message).not.toContain(`host app: ${process.cwd()}`); - // #11157: the other branch of the same message. `serve` supplies its base + // Commit a4cb7817f: the other branch of the same message. `serve` supplies its base // now, so the note that exists to report the gap must not be printed. expect(err.message).not.toContain('the caller did not pass `fallbackImport`'); // The #4719 remedy the helper owns is unchanged — this card moved a base, @@ -125,7 +125,7 @@ describe('os serve → the base is wired at the single importer construction', ( }); it('the config-plugin path no longer re-implements the declaration read', () => { - // Collapsed in #11157: the undeclared branch's local `import()` and the + // Collapsed in commit a4cb7817f: the undeclared branch's local `import()` and the // re-entry branch became the same call once the base was threaded, so the // declaration is read once, by `readHostDeclaration` inside the helper. const helper = SERVE_SOURCE.slice(SERVE_SOURCE.indexOf('static async importConfigPlugin')); diff --git a/packages/cli/src/commands/serve-i18n-load-diagnostic.test.ts b/packages/cli/src/commands/serve-i18n-load-diagnostic.test.ts index 73607e3216e..e513b08280e 100644 --- a/packages/cli/src/commands/serve-i18n-load-diagnostic.test.ts +++ b/packages/cli/src/commands/serve-i18n-load-diagnostic.test.ts @@ -145,7 +145,7 @@ function installShapedPackage( * A REAL failure of each kind, straight out of `createHostImporter`. * * The `undeclared` leg supplies a rejecting `fallbackImport` on purpose. That - * fallback is a caller-supplied seam by contract (#10943), so injecting one + * fallback is a caller-supplied seam by contract (commit 46d34ab7c), so injecting one * makes the case hermetic: without it the branch would depend on whether * `@objectstack/service-i18n` happens to be reachable from whatever package * this test file runs inside, and a workspace that hoisted it would turn this diff --git a/packages/cli/src/commands/serve-multi-node-cap-advisory.pin.test.ts b/packages/cli/src/commands/serve-multi-node-cap-advisory.pin.test.ts index dd9bdf3c5ff..6809baabde0 100644 --- a/packages/cli/src/commands/serve-multi-node-cap-advisory.pin.test.ts +++ b/packages/cli/src/commands/serve-multi-node-cap-advisory.pin.test.ts @@ -35,12 +35,12 @@ import { readFileSync } from 'node:fs'; import { dirname, join, resolve } from 'node:path'; import { fileURLToPath } from 'node:url'; // The repo's one comment/code separator (#9367). The four shape assertions -// below used to match against RAW `SERVE_SOURCE` (#10514): a trailing comment +// below used to match against RAW `SERVE_SOURCE` (until commit 5359a9b4c): a trailing comment // describing the old call shape (e.g. quoting a reverted // `checkMultiNodeAllowed(replicas)`) was indistinguishable from the real call. // `interfaceFields()` further down does its own narrower, brace-matched strip // over an `export interface` body and is deliberately left alone — out of -// scope for #10514, noted there so a future re-derivation doesn't read it as +// scope for commit 5359a9b4c, noted there so a future re-derivation doesn't read it as // the same defect. import { maskComments } from '../../../../scripts/js-comment-mask.mjs'; @@ -54,7 +54,7 @@ const SERVE_SOURCE = readFileSync(resolve(HERE, 'serve.ts'), 'utf8'); /** * `SERVE_SOURCE` with every comment span blanked (offsets preserved) — what - * the four shape assertions below actually match against (#10514), so a + * the four shape assertions below actually match against (commit 5359a9b4c), so a * comment naming `checkMultiNodeAllowed(…)` cannot satisfy — or hide behind — * any of them. `interfaceFields()` still reads raw `SERVE_SOURCE`; see the * import comment above for why that is out of scope here. @@ -185,11 +185,11 @@ describe('os serve ↔ multi-node gate', () => { }); /** - * Vacuity proof (#10514): a synthetic regression shaped exactly like the + * Vacuity proof (commit 5359a9b4c): a synthetic regression shaped exactly like the * issue's own repro — the zero-arg call reintroduced, with a trailing comment * quoting the OLD argued call, the way a careless revert reads. Both legs are * shown so the RAW leg's wrong verdict — what this pin's assertions would - * have produced before #10514 — is visible next to the MASKED leg's correct + * have produced before commit 5359a9b4c — is visible next to the MASKED leg's correct * one, not just asserted. */ describe('the shape assertions ignore a comment that quotes the old call (#10514)', () => { @@ -199,7 +199,7 @@ describe('the shape assertions ignore a comment that quotes the old call (#10514 '// checkMultiNodeAllowed(Number(process.env.OS_CLUSTER_REPLICAS)) used to be called here', ].join('\n'); - // Pre-#10514 (raw): the negative assertion correctly catches the bad + // Before commit 5359a9b4c (raw): the negative assertion correctly catches the bad // shape… expect(regressed).toMatch(/checkMultiNodeAllowed\(\s*\)/); // …but the positive assertion is ALSO satisfied — by the comment alone — @@ -208,7 +208,7 @@ describe('the shape assertions ignore a comment that quotes the old call (#10514 // catch. expect(regressed).toMatch(/checkMultiNodeAllowed\(\s*[^)\s]/); - // Post-#10514 (masked): the comment is blanked, so the positive assertion + // Since commit 5359a9b4c (masked): the comment is blanked, so the positive assertion // correctly fails to find an argued call — the regression is no longer // hidden. expect(maskComments(regressed)).not.toMatch(/checkMultiNodeAllowed\(\s*[^)\s]/); diff --git a/packages/cli/src/commands/serve-organizations-message-spelling.test.ts b/packages/cli/src/commands/serve-organizations-message-spelling.test.ts index 02669648449..d98957d73eb 100644 --- a/packages/cli/src/commands/serve-organizations-message-spelling.test.ts +++ b/packages/cli/src/commands/serve-organizations-message-spelling.test.ts @@ -2,7 +2,7 @@ /** * The operator-facing prose that names the multi-org runtime spells it from the - * ONE declaration, and these pins read what it RENDERS (#12151). + * ONE declaration, and these pins read what it RENDERS (commit 27b690272). * * ── What this closes ───────────────────────────────────────────────────── * @@ -77,7 +77,7 @@ * * ⛔ The pins were NOT relaxed or deleted to accommodate the reword: they still * compare the whole rendered line, whitespace included, against text built from - * `Serve.ORGANIZATIONS_RUNTIME_PKG`, and the #12151 CONTROL block below still + * `Serve.ORGANIZATIONS_RUNTIME_PKG`, and the CONTROL block commit 27b690272 added below still * proves they can say no. Only the expected PROSE moved, in the same diff as * the prose itself, which is the shape this file is for — a wording change that * does not redden a pin here would mean the pin had stopped reading. @@ -179,7 +179,7 @@ describe('serve — the multi-org runtime name an operator READS comes from the // DRIVEN on both shapes this one kind covers, that text was wrong twice: // for a genuinely broken install it repeats, word for word, the three // remedies `unresolvableMessage` already prints in the `cause:` line four - // lines below; and for #15045's location sub-case — narrowed by #17046 but + // lines below; and for the location sub-case commit 288fe9c34 reworded — narrowed by #17046 but // NOT removed, since pnpm's `file:` virtual-store copy and every git / // tarball declaration still reach it — the same `cause:` says outright // that re-running `pnpm install`, un-pruning and rebuilding change diff --git a/packages/cli/src/commands/serve.ts b/packages/cli/src/commands/serve.ts index 5ed005c90b6..015071d4532 100644 --- a/packages/cli/src/commands/serve.ts +++ b/packages/cli/src/commands/serve.ts @@ -49,7 +49,7 @@ import { missingProviderMessage } from '../utils/capability-preflight.js'; // only (no plugin class): the capability loop loads `EmailServicePlugin` itself // with a bare `import()`, resolved against THIS CLI's own realpath — its // bundled copy always wins, never the host app's. Contrast `importConfigPlugin` -// below, which IS host-anchored: an app-declared package wins there (#10909). +// below, which IS host-anchored: an app-declared package wins there (per commit 5a90c56d1). import { isEmailTransportProvider, emailProviderRequiresApiKey, unsupportedProviderFix } from '@objectstack/plugin-email'; // The SMS provider vocabulary, read from the package that materialises the // transports, for the same reason and by the same rule as the mail one above @@ -58,7 +58,7 @@ import { isEmailTransportProvider, emailProviderRequiresApiKey, unsupportedProvi // be the second literal #5094 was filed for. Values only (no plugin class): the // capability loop dynamic-imports `SmsServicePlugin` itself the same way — a // bare `import()` resolved against this CLI's own realpath, so its bundled -// copy wins, never the host's (#10909). +// copy wins, never the host's (measured in commit 5a90c56d1). import { isSmsTransportProvider, SMS_TRANSPORT_PROVIDERS } from '@objectstack/service-sms'; import { createHash } from 'node:crypto'; import { resolveObjectStackHome } from '@objectstack/runtime'; @@ -871,7 +871,7 @@ export function runtimeStateFileName(environmentId: string, servedAppRoot: strin * * Each leg keeps its OWN `try` — a boot must not die because a supervision file * could not be written or because an IPC channel had already closed, and one - * leg failing must not cost the other two. Only the ORDER changed (#13193). + * leg failing must not cost the other two. Only the ORDER changed (commit faff497fd). */ export function runtimeBoundPortChannels(printBanner: () => void): BoundPortChannels { return { @@ -1042,7 +1042,7 @@ function servedAppRootOrCwd(): string { * After: hostRoot is the served app, `declared` is false, and the load goes to * `createHostImporter`'s fallback — which is a bare `import()` written in THIS * file, because `importFromHost` now hands the helper its own resolution base - * (`fallbackImport`, #11157; it used to resolve from `@objectstack/types` + * (`fallbackImport`, commit a4cb7817f; it used to resolve from `@objectstack/types` * instead). Node ESM walks `node_modules` UPWARD from there, so the common * shape survives: in a hoisted monorepo whose ROOT * manifest declares the package while the served `apps/foo/package.json` does @@ -1117,12 +1117,12 @@ function anchorServedApp(configArg: string): { configPath: string; configExists: * know where that line is. A function declaration at module scope is hoisted over * the ENTIRE module, so "above the definition" is no longer a state this file can * be in — every line of `serve.ts`, in any order, reaches the same host-anchored - * importer (#10769). + * importer (commit 3d7deb700). * * `serve-cluster-host-resolution.test.ts` is the detection backstop: it scans * this file for every app-declarable optional load and fails on a bare one. * - * ── What the UNDECLARED leg resolves from, and why it is stated here (#11157) ─ + * ── What the UNDECLARED leg resolves from, and why it is stated here (commit a4cb7817f) ─ * * `createHostImporter` has two legs. The DECLARED one resolves out of the served * app's own `node_modules`, anchored by `hostRoot`. The UNDECLARED one falls back @@ -1140,7 +1140,7 @@ function anchorServedApp(configArg: string): { configPath: string; configExists: * chalk OK MISS * @objectstack/spec OK OK ← types' one dep * - * #10943 made the base an explicit parameter for exactly that reason, and its + * Commit 46d34ab7c made the base an explicit parameter for exactly that reason, and its * other two callers (`@objectstack/verify`'s `bootStack`, the `packages/qa/ * dogfood` enterprise probe) pass theirs. This file was the one that did not, so * its undeclared leg resolved from a package it has nothing to do with. That was @@ -1162,7 +1162,7 @@ function anchorServedApp(configArg: string): { configPath: string; configExists: * `objectstack.config.ts` from, which is the app's own root and NOT necessarily * the process CWD (#11185). The default is what makes this helper correct from * every line of the file without an author having to know a root exists: the - * same reason #10769 made it a hoisted declaration rather than a binding. + * same reason commit 3d7deb700 made it a hoisted declaration rather than a binding. */ function importFromHost(specifier: string, hostRoot: string = servedAppRootOrCwd()): Promise { // Memoised per root so one boot shares a single host `require`, exactly as the @@ -1170,7 +1170,7 @@ function importFromHost(specifier: string, hostRoot: string = servedAppRootOrCwd let importer = hostImporters.get(hostRoot); if (!importer) { importer = createHostImporter(hostRoot, { - // THIS module's own resolver, written HERE (#10943/#11157) — see the + // THIS module's own resolver, written HERE (commits 46d34ab7c and a4cb7817f) — see the // "what the undeclared leg resolves from" note above for why it has to be // a function in the calling module and not a URL string. fallbackImport: (fallbackSpecifier) => import(/* webpackIgnore: true */ fallbackSpecifier), @@ -1444,7 +1444,7 @@ export default class Serve extends Command { /** * Load one `plugins: [...]` entry of the served app's own config that is - * written as a STRING (#10908). + * written as a STRING (commit 9cc6777d3). * * This is the most app-owned specifier in the whole file — it is supplied by * the app being served, and `plugins: [...]` is THE documented way to extend a @@ -1456,7 +1456,7 @@ export default class Serve extends Command { * distribution layout. Same mechanism as cloud#1013 and #10645, but on the * surface users are explicitly told to use. * - * ── Why this WAS three branches, and why it is now two (#10908 → #11157) ──── + * ── Why this WAS three branches, and why it is now two (commits 9cc6777d3 → a4cb7817f) ─ * * The three-branch shape existed because handing every specifier to * `importFromHost` was MEASURED not to be a superset of a bare `import()` — @@ -1468,7 +1468,7 @@ export default class Serve extends Command { * module CONTAINING the call — so `'./local-plugin.js'` would resolve * against `@objectstack/types/dist/` instead of this file's directory. * STILL TRUE, and still why the non-package branch below stays here - * rather than being folded into the helper. (#10944 has since RULED on + * rather than being folded into the helper. (Commit e598b1cbc has since landed a RULING on * the relative spelling itself: it is refused above, before any base is * chosen. The remaining non-package spellings — an absolute path, a * `file://` URL, a `node:` builtin — mean the same module from every @@ -1487,7 +1487,7 @@ export default class Serve extends Command { * — booted, and would have stopped booting. So this method asked the * declaration itself and kept a local `import()` for the undeclared leg. * - * ⇒ NO LONGER TRUE. #10943 made the base a parameter and #11157 made + * ⇒ NO LONGER TRUE. Commit 46d34ab7c made the base a parameter and commit a4cb7817f made * `importFromHost` pass it, so the helper's undeclared leg now runs THIS * file's own `import()` — the identical call this method used to make * inline. The workaround's reason is gone, so the workaround is gone with @@ -1518,7 +1518,7 @@ export default class Serve extends Command { * moves where one resolves FROM. The #4719 declaration gate is untouched, and * no undeclared package gains a way in that it did not already have. * - * ── The relative branch is REFUSED, not resolved (#10944) ────────────────── + * ── The relative branch is REFUSED, not resolved (commit e598b1cbc) ──────── * * A relative entry is the one spelling that can never mean what its author * meant. It is resolved against THIS file's directory — the installed CLI's @@ -1531,7 +1531,7 @@ export default class Serve extends Command { * serves the app WITHOUT the plugin — so the deployment looks healthy and is * quietly missing the extension it declared. * - * Ruled at triage on #10944: refuse it, naming the two spellings that work. + * Ruled at triage, landed as commit e598b1cbc: refuse it, naming the two spellings that work. * That expands no accepted set — the spelling has never loaded an app's file * — and turns a diagnostic about the CLI's internals into an answer the * author can act on. Resolving relative entries against the SERVED APP's root @@ -1563,7 +1563,7 @@ export default class Serve extends Command { } catch (importError: any) { // The wrapper lives with the load it describes, so the composed // user-facing string is testable rather than assembled at the call site - // (triage on #10908 requires this text be CHOSEN, not drift). + // (the triage commit 9cc6777d3 landed requires this text be CHOSEN, not drift). throw new Error(`Failed to import plugin '${pluginSpecifier}': ${importError.message}`); } } @@ -2054,7 +2054,7 @@ export default class Serve extends Command { // `[StandaloneStack] no compiled artifact …` line is one). That is why the // redirection is on the STREAM: `LoggerConfig` has a level but no // destination knob, so there is nothing else to point at stderr. Same route - // `--json` takes for the same reason (#6217, `utils/json-stdout.ts`). + // `--json` takes for the same reason (commit 2b641ddd4, `utils/json-stdout.ts`). // // The MCP transport is the one writer that must still reach the real // stdout, and it holds its own channel to it (`packages/mcp`, @@ -3273,7 +3273,7 @@ export default class Serve extends Command { // two copies whose comment already said they were the same. const configHasMetadata = stackDeclaresMetadata(config); - // ── Decide the dev-only artifact door BEFORE the wrap (#14397) ──── + // ── Decide the dev-only artifact door BEFORE the wrap (commit 957f7bb45) ── // On a HOST config `os dev` composes TWO writers over ONE stack: the // `new AppPlugin(config)` wrap below, over the config MODULE, and the // dev-only HMR `MetadataPlugin` further down, over the compiled twin @@ -3463,7 +3463,7 @@ export default class Serve extends Command { // Host-anchored: `packages/cli` does NOT declare @objectstack/service-i18n, // so a bare import here resolves against the CLI's own realpath and can // only ever find the package by workspace hoisting — the same defect - // class that cost cloud#1013 and #10645 (#10769). An app that does not + // class that cost cloud#1013 and #10645 (commit 3d7deb700). An app that does not // declare it still falls back to the CLI's resolution, so the quiet-skip // path below is unchanged. // @@ -4294,7 +4294,7 @@ export default class Serve extends Command { if (typeof plugin === 'string') { // Host-anchored, NOT a bare `import()`: this specifier comes from // the served app's own config, so what the app DECLARES about it is - // the contract (#10908). The helper carries the failure wrapper too. + // the contract (commit 9cc6777d3). The helper carries the failure wrapper too. const imported = await Serve.importConfigPlugin(plugin, hostRoot); pluginToLoad = imported.default || imported; } @@ -5222,7 +5222,7 @@ export default class Serve extends Command { // #8978 — the Config:/Artifact: row must name what actually booted, // never `relativeConfig` unconditionally (see resolveBannerConfigRow). // - // ⭐ A THUNK, not a call (#13193). The banner is one of the three + // ⭐ A THUNK, not a call (commit faff497fd). The banner is one of the three // bound-port channels, and {@link publishBoundPort} owns the order the // three fire in — the state file has to be on disk before anything // announces the address that names it. Nothing INSIDE this literal @@ -5329,7 +5329,7 @@ export default class Serve extends Command { // parent learns the real port without polling. // • the ready banner, whose `API:` row names the same address. // - // ⭐ That list is in ORDER, and the order is the whole point (#13193): + // ⭐ That list is in ORDER, and the order is the whole point (commit faff497fd): // the file is written BEFORE either channel announces the address that // sends a consumer to it. {@link publishBoundPort} carries the race the // old order lost, and the reason the repair is not reader-side polling. @@ -5873,7 +5873,7 @@ export function formatI18nLoadDiagnostic(pkg: string, err: unknown): string { * · a genuinely broken install already gets those three remedies, word * for word, from `unresolvableMessage` in the `cause:` line printed * four lines below — so the bullet was a second copy to drift; - * · the #15045 sub-case — a location install this finder cannot tie to + * · the sub-case commit 288fe9c34 reworded — a location install this finder cannot tie to * the declaration — prints a `cause:` that says outright "This is NOT * an install problem … re-running `pnpm install`, un-pruning a deploy * and rebuilding a dist all change nothing here", so the two halves of diff --git a/packages/cli/src/commands/validate-json-strict-exit.e2e.test.ts b/packages/cli/src/commands/validate-json-strict-exit.e2e.test.ts index 4f7ea829f89..715fc6e4781 100644 --- a/packages/cli/src/commands/validate-json-strict-exit.e2e.test.ts +++ b/packages/cli/src/commands/validate-json-strict-exit.e2e.test.ts @@ -1,7 +1,7 @@ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. /** - * #11174 — `os validate --strict` reaches the SAME exit status with `--json` as + * Commit ab23c67ab — `os validate --strict` reaches the SAME exit status with `--json` as * without it, over the real CLI process. * * ## The defect this pins shut @@ -18,7 +18,7 @@ * Actions step — and inert. A pipeline gating on the exit status of the exact * documented invocation read 0 and concluded the stack was clean. * - * This is the second half of a pair. The first (#10953) made the four structural + * This is the second half of a pair. The first (commit be7262e72) made the four structural * advisories *reachable* in the payload, so a pipeline could at least gate on * `warnings.length` itself; it did not touch the exit code, and a pipeline * trusting the exit status still could not. @@ -305,7 +305,7 @@ describe('#11174 — --strict reaches the same exit status on both faces', () => const text = await runCli(['validate', '--strict'], conversionsDir); const json = await runCli(['validate', '--json', '--strict'], conversionsDir); - // Floor, then parity — the #11174 contract this file exists for. + // Floor, then parity — the contract commit ab23c67ab set, which this file exists for. expect(text.code, `text --strict must fail on a retiring conversion:\n${text.stdout}\n${text.stderr}`).toBe(1); expect(json.code, `json --strict:\n${json.stdout}\n${json.stderr}`).toBe(text.code); expect(text.stdout).toContain('Strict mode: warnings treated as errors'); diff --git a/packages/cli/src/commands/validate.ts b/packages/cli/src/commands/validate.ts index 0d4bbdf6fcc..325956c31b8 100644 --- a/packages/cli/src/commands/validate.ts +++ b/packages/cli/src/commands/validate.ts @@ -184,7 +184,7 @@ export default class Validate extends Command { // [#20113] APPENDED for the same reason, one member later again. ...jsxGateNotices, ]; - // [#12125] The ADR-0087 D2 conversion notices, hoisted for the SAME reason + // [commit 79cf692b0] The ADR-0087 D2 conversion notices, hoisted for the SAME reason // and under the SAME ruling as the five lists above — one field over. The // notices were computed at step 2 (below) and reached the terminal SUCCESS // payload alone, so all five failure exits dropped a list already in hand. @@ -332,8 +332,8 @@ export default class Validate extends Command { // called the strongest instance: the hoist exists so the finding // SURVIVES a schema error, and this payload discarded it anyway. warnings: warningsSoFar(), - // [#12125] Filled by `normalizeStackInput` two statements above this - // exit — the tightest instance of this card, and the one it measured. + // [commit 79cf692b0] Filled by `normalizeStackInput` two statements above this + // exit — the tightest instance of that defect, and the one the commit measured. conversions: conversionNotices, duration: timer.elapsed(), }); @@ -479,7 +479,7 @@ export default class Validate extends Command { // the pre-parse `unknownKeyWarnings` — computed long before this // gate — and keeps the member ORDER identical to every other exit. warnings: warningsSoFar(), - // [#12125] Computed at step 2, above this gate. + // [commit 79cf692b0] Computed at step 2, above this gate. conversions: conversionNotices, duration: timer.elapsed(), }); @@ -643,7 +643,7 @@ export default class Validate extends Command { // `warnings` beside the two lists computed before this gate. The // two classes being separate is the whole point of the split. warnings: warningsSoFar(), - // [#12125] Computed at step 2, above this gate. + // [commit 79cf692b0] Computed at step 2, above this gate. conversions: conversionNotices, duration: timer.elapsed(), }); @@ -681,7 +681,7 @@ export default class Validate extends Command { // capability hints, and the pre-parse key findings were all in // hand and none of them reached the payload. warnings: warningsSoFar(), - // [#12125] Computed at step 2, above this gate. + // [commit 79cf692b0] Computed at step 2, above this gate. conversions: conversionNotices, duration: timer.elapsed(), }); @@ -810,9 +810,9 @@ export default class Validate extends Command { // `manifest.engines.protocol` in #13860, and the published key // name lagged one release behind it. A key spelled `specVersion*` // invites the inference that `manifest.specVersion` is writable; - // `ManifestSchema` is not `.strict()` and drops unknown keys with - // nothing said (#14192), so acting on that inference produces a - // manifest that looks fine and whose line never took effect. The + // `ManifestSchema` was not `.strict()` and dropped unknown keys with + // nothing said until commit 4d0d9445a, so acting on that inference produced a + // manifest that looked fine and whose line never took effect. The // rename is one stroke, no alias, no dual-key window; its value // shape is unchanged. protocolVersionGap: protocolGap, @@ -912,7 +912,7 @@ export default class Validate extends Command { // is a FILE, say, which makes `readdirSync` raise ENOTDIR) carries // the three lists already in hand. warnings: warningsSoFar(), - // [#12125] Same reading, one field over: `[]` for a throw at load — + // [commit 79cf692b0] Same reading, one field over: `[]` for a throw at load — // step 2 had not run — and the notices in hand for any later throw. conversions: conversionNotices, duration: timer.elapsed(), diff --git a/packages/cli/src/hook-body.ts b/packages/cli/src/hook-body.ts index 6e15a0190e2..a46759a8537 100644 --- a/packages/cli/src/hook-body.ts +++ b/packages/cli/src/hook-body.ts @@ -14,7 +14,7 @@ * metadata-only" — and to RUN the lowered `source` through the real QuickJS * runner in a test — needs this exact function, not a lookalike: a local * reimplementation passes its own tests while diverging from the rule the - * build actually applies, which is the failure mode #13651 was filed about. + * build actually applies, which is the failure mode behind commit ada3834ad. * * Until 17.3.0 the extractor was reachable as a deep `dist/utils/` import, and * one out-of-repo consumer (hotcrm's hook-body fidelity harness) reached it diff --git a/packages/cli/src/lint/hook-body-lowering.test.ts b/packages/cli/src/lint/hook-body-lowering.test.ts index c9b8ee737b4..f9e2fd6addf 100644 --- a/packages/cli/src/lint/hook-body-lowering.test.ts +++ b/packages/cli/src/lint/hook-body-lowering.test.ts @@ -1,13 +1,13 @@ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. /** - * #13651 — the silent downgrade becomes a lint verdict. + * Commit ada3834ad — the silent downgrade becomes a lint verdict. * * The pins here are about the DISTINCTION, not just the noise: an accidental * scope leak must be an `error` (so a gate can fail on it) while the structural * refusal must stay a `warning` (so the legitimate fallback-to-bundling path is * not punished). A test that only asserted "something was reported" would pass - * on the change this card explicitly forbids — deleting the catch. + * on the change the card behind that commit explicitly forbids — deleting the catch. */ import { describe, it, expect } from 'vitest'; @@ -131,7 +131,7 @@ describe('checkHookBodyLowering', () => { }); it('leaves the module-scope remedy exactly as it was', () => { - // The reverse leg: the #13651 sentence must not have been rewritten for + // The reverse leg: the sentence commit ada3834ad wrote must not have been rewritten for // every author by a branch added for one new sub-case. const [issue] = checkHookBodyLowering({ hooks: [freeIdentifierHook] }); expect(issue.message).toContain('Inline the value(s) into the handler, or reach them through `ctx`.'); @@ -194,7 +194,7 @@ describe('checkHookBodyLowering', () => { }); it('keeps the two instrument kinds distinct from each other, not just from the verdict arms', () => { - // `unknown` is deliberately not folded into `unparseable` (#13651): a + // `unknown` is deliberately not folded into `unparseable` (commit ada3834ad): a // broken instrument and a limited instrument are different events. const [unparseable] = checkHookBodyLowering({ hooks: [{ ...unparseableHook }] }); const [unknown] = checkHookBodyLowering({ hooks: [{ ...explodingHook }] }); diff --git a/packages/cli/src/lint/hook-body-lowering.ts b/packages/cli/src/lint/hook-body-lowering.ts index f3d99023103..6dd73b36ce3 100644 --- a/packages/cli/src/lint/hook-body-lowering.ts +++ b/packages/cli/src/lint/hook-body-lowering.ts @@ -2,7 +2,7 @@ /** * `os lint` rule: a registered handler that cannot be lowered to a - * metadata-only body (#13651). + * metadata-only body (commit ada3834ad). * * ## The defect this closes * @@ -189,7 +189,7 @@ function judge(fn: AnyFn, originLabel: string, path: string): HookBodyLintIssue // fell short — the event says nothing about what the author chose, so it // must not borrow the bundled-fallback prose below ("the body uses // something the sandbox cannot provide"), which asserts a verdict about - // the handler. Kept distinct on purpose (#13651): an instrument failure + // the handler. Kept distinct on purpose (commit ada3834ad): an instrument failure // must not read as a verdict about the author. const [rule, instrument] = kind === 'unparseable' diff --git a/packages/cli/src/utils/artifact-packages.ts b/packages/cli/src/utils/artifact-packages.ts index 08998d058b3..0868281ced8 100644 --- a/packages/cli/src/utils/artifact-packages.ts +++ b/packages/cli/src/utils/artifact-packages.ts @@ -146,7 +146,7 @@ export function artifactPackages(parsed: Record): Array<{ * that is safe here for one reason only: nothing parses it. `runAuthoringRules` * reads fields off this object and never hands it to a schema. ⛔ Do not start * parsing it against `ManifestSchema`, and do not reach for a widened schema to - * make that possible: `ManifestSchema` is `strictObject` since #14192, so it + * make that possible: `ManifestSchema` is `strictObject` since commit 4d0d9445a, so it * would REFUSE, by name, every collection key this superset deliberately puts * under `manifest` — and re-opening it to stop the refusal would re-open the * real manifest surface with it. diff --git a/packages/cli/src/utils/auth-config.test.ts b/packages/cli/src/utils/auth-config.test.ts index 45e49feb46c..08017b38a35 100644 --- a/packages/cli/src/utils/auth-config.test.ts +++ b/packages/cli/src/utils/auth-config.test.ts @@ -61,7 +61,7 @@ import { getCredentialsPath, readAuthConfig } from './auth-config.js'; * package's build renames and relocates nothing). Its output was checked * against the built `Config` while writing this pin: same ids. The same * reasoning, and the same derivation, is documented at length in - * `src/commands/environments/environments.test.ts`'s `#10967` pin — which + * `src/commands/environments/environments.test.ts`'s pin from commit e4a71d418 — which * covers `static override examples` arrays via AST and structurally cannot * see a thrown-error string, which is why this class needed its own pin * rather than an extension of that one. The derivation is duplicated rather diff --git a/packages/cli/src/utils/database-driver-flag.ts b/packages/cli/src/utils/database-driver-flag.ts index 2f6e14d61b0..2707dbf818f 100644 --- a/packages/cli/src/utils/database-driver-flag.ts +++ b/packages/cli/src/utils/database-driver-flag.ts @@ -8,15 +8,15 @@ * * `os start` and `os dev` each declared the flag with a hand-written literal * array — `options: ['sqlite', 'sqlite-wasm', 'turso', …]` — and each repeated - * the same ids a second time inside the flag's `description:` prose. #6345 had + * the same ids a second time inside the flag's `description:` prose. Commit e2798fab7 had * just collapsed the platform's driver vocabulary into ONE table in * `@objectstack/spec`, so those four literals were a second, third, fourth and - * fifth statement of it living one package away. That is the shape #6535 closed + * fifth statement of it living one package away. That is the shape commit a92b1793c closed * for `IMPORT_JOB_MAX_ROWS`, moved to another package. * * This is NOT a drift FIX: `commands/database-driver-allowlist.pin.test.ts` * (#6860) already asserts the flag agrees with what `resolveStorageDefinition` - * resolves, and it caught a real regression the day #6345 landed. Nothing an + * resolves, and it caught a real regression the day commit e2798fab7 landed. Nothing an * operator can reach today is wrong. The point is narrower and structural — with * one definition, there is no second copy left to drift, so the pin guards an * agreement that can no longer be broken by editing one file and not the other. diff --git a/packages/cli/src/utils/driver-vocabulary-parity.test.ts b/packages/cli/src/utils/driver-vocabulary-parity.test.ts index 013872dcc43..ad201504ac9 100644 --- a/packages/cli/src/utils/driver-vocabulary-parity.test.ts +++ b/packages/cli/src/utils/driver-vocabulary-parity.test.ts @@ -1,12 +1,12 @@ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. /** - * THE pin #6345 exists for: both boot hosts answer the SAME question about the + * THE pin of commit e2798fab7: both boot hosts answer the SAME question about the * SAME `OS_DATABASE_DRIVER` value the same way. * * ## Why this file, and why here * - * The fork survived three separate cards (#3276, #5820, #6265) that each fixed + * The fork survived three separate changes (#3276, #5820, commit cfb549db8) that each fixed * one spelling on one side. Every one of them was pinned — by a test that drove * exactly one host. `packages/cli/src/utils/storage-driver.test.ts` proved the * CLI accepted `pg`; `packages/runtime/src/standalone-stack*.test.ts` proved the @@ -56,7 +56,7 @@ const URL_FOR: Readonly> = { turso: 'libsql://my-db.turso.io', }; -/** Spellings NEITHER host accepted before #6345, and which must stay refused. */ +/** Spellings NEITHER host accepted before commit e2798fab7, and which must stay refused. */ const CONTRACT_ONLY_SPELLINGS = ['sqlite3', 'better-sqlite3', 'mariadb', 'inmemory'] as const; type Verdict = { accepted: true; driverId: string } | { accepted: false }; @@ -134,7 +134,7 @@ describe('driver vocabulary parity: `os start` and `os migrate` answer alike (#6 ); // The other half of "the same answer": a spelling one host refuses, the other - // must refuse too. Before #6345 the CLI silently booted SQLite in dev for + // must refuse too. Before commit e2798fab7 the CLI silently booted SQLite in dev for // these while `os migrate` named them in a refusal. it.each([...CONTRACT_ONLY_SPELLINGS, 'nonsense', 'com.vendor.snowflake'])( 'both hosts REFUSE `%s`, in dev AND in prod', @@ -150,7 +150,7 @@ describe('driver vocabulary parity: `os start` and `os migrate` answer alike (#6 ); // The card's own reproduction, kept verbatim as a named case: it is the line a - // reader of #6345 will look for, and a table row does not read as one. + // reader of commit e2798fab7 will look for, and a table row does not read as one. it('the card repro: OS_DATABASE_DRIVER=pg is accepted by BOTH (was: start yes, migrate no)', () => { const url = 'postgres://u:p@localhost:5432/db'; expect(cliVerdict('pg', url)).toEqual({ accepted: true, driverId: 'postgres' }); @@ -214,7 +214,7 @@ describe('fork 2: no local default + no URL is refused on BOTH sides — all 8 c 'cell A — `os start` refuses `%s` with no URL instead of guessing one', (kind) => { expect(() => resolveStorageDefinition(kind, { isDev: false })).toThrow(UnsupportedDriverError); - // Dev is not an escape hatch: the pre-#6345 dev path was the one that + // Dev is not an escape hatch: the dev path before commit e2798fab7 was the one that // silently produced a definition. expect(() => resolveStorageDefinition(kind, { isDev: true })).toThrow(UnsupportedDriverError); }, diff --git a/packages/cli/src/utils/extract-hook-body.ts b/packages/cli/src/utils/extract-hook-body.ts index 073ea1c7ead..8a59d7c6984 100644 --- a/packages/cli/src/utils/extract-hook-body.ts +++ b/packages/cli/src/utils/extract-hook-body.ts @@ -35,7 +35,7 @@ * until #10678, which is the whole defect that card names. * `--strict-body` the same recorded warnings become a hard failure (exit 1) * with a per-callable diagnostic, and nothing is bundled. - * `os lint` (#13651) reads the REFUSAL KIND, not the exit code, and + * `os lint` (commit ada3834ad) reads the REFUSAL KIND, not the exit code, and * gives the two classes different verdicts: an accidental * scope leak (`free-identifiers`) is a lint `error`, so a * gate can fail on it; a structural one (`forbidden-token`) @@ -54,7 +54,7 @@ * `body.capabilities` automatically. * * ⛔ RETIRED — the `// @capabilities api.read api.write` hook-body directive was - * removed in @objectstack/cli 17.1 (#10917, ADR-0049 enforce-or-remove). It was + * removed in @objectstack/cli 17.1 (commit 7940de5e0, ADR-0049 enforce-or-remove). It was * read off `String(fn)`, and `loadConfig` runs every config through * `bundle-require` -> esbuild, which strips `//` line comments before the * handler is ever a runtime function. Measured on all four ordinary authoring @@ -92,7 +92,7 @@ import { detectFreeIdentifiers } from './detect-free-identifiers.js'; /** - * WHY a refusal carries a machine-readable kind (#13651). + * WHY a refusal carries a machine-readable kind (commit ada3834ad). * * Every refusal below already KNOWS which rule refused — the rule is what * produced the sentence. Until this type existed, that knowledge was flattened @@ -150,7 +150,7 @@ export class HookBodyExtractionError extends Error { * * Same discipline as `kind` above, one level finer: the refusing rule already * knows which half of the free list it is looking at, and a consumer that has - * to re-derive it from the message prose is back where #13651 started. The + * to re-derive it from the message prose is back where it was before commit ada3834ad. The * two halves have OPPOSITE remedies — a module-scope name is inlined into the * handler, a host-only global cannot be inlined at all — so a consumer that * prints one remedy for both prints a wrong one half the time. diff --git a/packages/cli/src/utils/file-column-move.ts b/packages/cli/src/utils/file-column-move.ts index e72baf66946..455518d1515 100644 --- a/packages/cli/src/utils/file-column-move.ts +++ b/packages/cli/src/utils/file-column-move.ts @@ -2,7 +2,7 @@ /** * [#15989] The ADR-0104 file-family COLUMN step, as a further step of - * `os migrate files-to-references --apply` — the ruling on #15041, step 2. + * `os migrate files-to-references --apply` — sequencing step 2 of ADR-0104's 2026-09-05 addendum. * * The backfill converts the VALUES; this converts the COLUMNS and the encoding * of what they hold, and then records `sys_migration.columns_moved_at` so the diff --git a/packages/cli/src/utils/format.error-code-fields.test.ts b/packages/cli/src/utils/format.error-code-fields.test.ts index 188f7af865c..036b5dacd38 100644 --- a/packages/cli/src/utils/format.error-code-fields.test.ts +++ b/packages/cli/src/utils/format.error-code-fields.test.ts @@ -1,7 +1,7 @@ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. /** - * [#13347] `errorCodeFields` — the ADR-0112 carriers a `--format json` failure + * [commit 098a08ffa] `errorCodeFields` — the ADR-0112 carriers a `--format json` failure * envelope adds beside its `error` sentence, and the arm that adds NOTHING. * * ## What is being pinned, and why it is pinned on BYTES diff --git a/packages/cli/src/utils/format.server-ready-app-logins.test.ts b/packages/cli/src/utils/format.server-ready-app-logins.test.ts index 3ce2b5cce2d..5825d82954f 100644 --- a/packages/cli/src/utils/format.server-ready-app-logins.test.ts +++ b/packages/cli/src/utils/format.server-ready-app-logins.test.ts @@ -6,7 +6,7 @@ * * ## The half `packages/cli` could not write for itself * - * #17081 closed the platform's own half: the `🔑 Dev admin` line now says what + * Commit f721ef0ff closed the platform's own half: the `🔑 Dev admin` line now says what * that account will and will not see. What it could not do is name an account * that DOES see something, because the platform does not know an application's * audiences — measured downstream, four of five personas rendered their group @@ -31,7 +31,7 @@ * account. An entry naming an unseeded account must read as the app's * claim, not as a platform credential that broke. * - * The exact sentences are pinned for the same reason #17081's are: the + * The exact sentences are pinned for the same reason commit f721ef0ff's are: the * deliverable here is words on a terminal, so the wording is the only thing * that can regress. */ diff --git a/packages/cli/src/utils/format.server-ready-dev-admin-audience.test.ts b/packages/cli/src/utils/format.server-ready-dev-admin-audience.test.ts index b892f934c0e..bcf8605ab36 100644 --- a/packages/cli/src/utils/format.server-ready-dev-admin-audience.test.ts +++ b/packages/cli/src/utils/format.server-ready-dev-admin-audience.test.ts @@ -8,7 +8,7 @@ import { SysUserDetailPage } from '@objectstack/platform-objects/pages'; import { printServerReady, type ServerReadyOptions } from './format.js'; /** - * #17081 — the `🔑 Dev admin` line must say what that account SEES. + * Commit f721ef0ff — the `🔑 Dev admin` line must say what that account SEES. * * ## The defect this pins shut * @@ -78,7 +78,7 @@ const SEEDED = { email: 'admin@objectos.ai', password: 'admin123' }; * The credential block, verbatim, as a real render emits it under NO_COLOR. * * ⛔ Do not regenerate this from `format.ts`. The first three entries are - * byte-identical to what shipped before #17081 — the change APPENDS, it does + * byte-identical to what shipped before commit f721ef0ff — the change APPENDS, it does * not restate — and that identity is asserted separately below. */ const DEV_ADMIN_BLOCK = [ diff --git a/packages/cli/src/utils/format.ts b/packages/cli/src/utils/format.ts index 8143c65513c..c03c3f3a8f8 100644 --- a/packages/cli/src/utils/format.ts +++ b/packages/cli/src/utils/format.ts @@ -68,7 +68,7 @@ export interface EmitJsonOptions { * `test/login-json-ndjson.e2e.test.ts`. * * Everywhere else `--json` still means exactly one JSON document on stdout - * (#6217), so the remaining compact call sites are still only preserving + * (commit 2b641ddd4), so the remaining compact call sites are still only preserving * historical formatting and unifying them stays worth doing on its own. * New code should use the default. */ @@ -164,7 +164,7 @@ export function isReportedError(error: unknown): boolean { } /** - * [#13347] The ADR-0112 carriers a `--format json` failure envelope adds + * [commit 098a08ffa] The ADR-0112 carriers a `--format json` failure envelope adds * beside its `error` sentence — `{ code, httpStatus }`, and only the ones the * thrown error actually carries. * @@ -298,7 +298,7 @@ export function errorCodeFields(error: unknown): ErrorCodeFields { export async function emitText(text: string, exitCode: CliExitCode = 0): Promise { // `writeStdoutDirect`, not `process.stdout.write`: a `--json` command that // boots a kernel reserves stdout so the kernel's INFO stream goes to stderr - // (#6217), and the payload is the one thing that must still reach the real + // (commit 2b641ddd4), and the payload is the one thing that must still reach the real // stdout. Outside a reservation this is `process.stdout.write` verbatim. await writeStdoutDirect(text + '\n'); if (exitCode !== 0) process.exitCode = exitCode; @@ -539,7 +539,7 @@ export function formatZodErrors(error: ZodError) { /** * Every field here is rendered by {@link printMetadataStats}. * - * #11172 — `translations: number` used to sit in this interface, collected by + * Until commit 05181e8cc, `translations: number` sat in this interface, collected by * {@link collectMetadataStats} (`count(config.translations)`) on every * `os validate` / `os info` / `os compile` run and then read by nothing: the * printer had no `translations` fragment at any value, so a stack with 40 @@ -550,7 +550,7 @@ export function formatZodErrors(error: ZodError) { * The invariant that replaces it: this struct carries no metric the summary * does not print. It is enforced from both ends — TypeScript requires * `collectMetadataStats` to populate every field declared here, and the - * `[#11172]` pin in `print-metadata-stats-zero-row.test.ts` requires every + * pin commit 05181e8cc added to `print-metadata-stats-zero-row.test.ts` requires every * collected field to reach the rendered output. A metric that is declared but * never rendered cannot satisfy both. */ @@ -778,7 +778,7 @@ export interface ServerReadyOptions { * When present, the banner surfaces them so backend debugging never has to * guess the login. Absent when nothing was seeded. * - * [#17081] The banner also says what this account SEES, because it is the + * [commit f721ef0ff] The banner also says what this account SEES, because it is the * only credential a first-run operator is given and it holds no app-declared * capability — in an app that gates navigation on `requiredPermissions` it is * the account that renders an empty menu. See the render site in @@ -793,7 +793,7 @@ export interface ServerReadyOptions { * a first-run operator is handed, and it holds every platform capability and * no app-declared one — so in an application that gates navigation on * `requiredPermissions` it is by construction the account that renders an - * empty menu (#17081). Which of an application's audiences shows something is + * empty menu (disclosed since commit f721ef0ff). Which of an application's audiences shows something is * a fact only the application has, and this is the channel it hands it over * through. * @@ -1088,7 +1088,7 @@ export function printServerReady(opts: ServerReadyOptions) { chalk.bold.green(`${opts.seededAdmin.email} / ${opts.seededAdmin.password}`), ); console.error(chalk.dim(' seeded on empty DB · dev only — do not use in production')); - // [#17081] Say what this account SEES. It is the only credential a + // [commit f721ef0ff] Say what this account SEES. It is the only credential a // first-run operator is handed, and the banner used to stop at the line // above — which asserts a login and says nothing about its audience. The // account's standing is `admin_full_access` @@ -1129,8 +1129,8 @@ export function printServerReady(opts: ServerReadyOptions) { console.error(chalk.dim(' an app that gates navigation on requiredPermissions may show it an empty menu; grant')); console.error(chalk.dim(' it a permission set under Setup → Users, or sign in as an account your app seeds')); } - // [#17556] What the APPLICATION says about signing in — suggestion 1 of - // #17081, the half `packages/cli` structurally could not write for itself. + // [#17556 — commit 24d622b94] What the APPLICATION says about signing in — suggestion 1 of + // its parent card, the half `packages/cli` structurally could not write for itself. // // The block above describes the account the PLATFORM seeded; it is complete // about that account and silent about every other, because the platform does @@ -1428,16 +1428,16 @@ export function printMetadataStats(stats: MetadataStats) { /** * The item(s) to force-print when EVERY item in the section is `0`. * - * #10504 — a section whose every item is `0` used to vanish from the + * Before commit ff5733e03, a section whose every item is `0` vanished from the * summary entirely, and that reads as "this summary does not report on * this section" rather than "this project has none of it" — exactly the * same output for a newcomer's freshly scaffolded project (intentionally - * zero apps) and for a summary that simply never covers UI. That card + * zero apps) and for a summary that simply never covers UI. That commit * measured the drop only through `UI:` and triage ruled narrowly on that * row, so the mechanism landed opt-in and `Data:`/`Logic:`/`Security:` * kept dropping. * - * #10952 measured the same drop on the other three rows, against the real + * Commit 0d4bd93e7 measured the same drop on the other three rows, against the real * CLI (`bin/run-dev.js validate`, `NO_COLOR=1`): on a stack with one * object, two fields and nothing else the entire summary was * @@ -1446,7 +1446,7 @@ export function printMetadataStats(stats: MetadataStats) { * * with no `Logic:` and no `Security:` line present at all; on a stack that * also declares no objects it was the single line `UI: 0 Apps`. Both - * exited `0`. Triage generalised #10504's principle — a summary section is + * exited `0`. Triage generalised commit ff5733e03's principle — a summary section is * NEVER silently dropped; every section prints its zero state — so this is * no longer opt-in. The field is REQUIRED and typed non-empty, and that * typing is the enforcement: a section added to this array later cannot @@ -1461,12 +1461,12 @@ export function printMetadataStats(stats: MetadataStats) { /** * How this section's surviving items become the printed line. * - * Omitted by every section that renders the shipped #10504 shape — + * Omitted by every section that renders the shape commit ff5733e03 shipped — * ` ` with the count in white and the item name dim, joined * by two spaces (`Data: 1 Objects 2 Fields`). `Runtime:` is the one row * that has never rendered that way and still does not: it prints * `2 plugins, 1 devPlugins`, comma-joined and fully dim, with lowercase - * item names. That difference is pre-existing shipped output and #11172 + * item names. That difference is pre-existing shipped output and commit 05181e8cc * deliberately did NOT change it — the ruling was about the row's * PRESENCE at zero, not its typography, and rewriting a user-visible row's * look while fixing its zero state would be an unruled widening. @@ -1500,7 +1500,7 @@ export function printMetadataStats(stats: MetadataStats) { ['Reports', stats.reports], ['Actions', stats.actions], ], - // The shipped shape (#10504): `UI: 0 Apps`. Unchanged. + // The shape commit ff5733e03 shipped: `UI: 0 Apps`. Unchanged. zeroFallback: ['Apps'], }, { @@ -1533,17 +1533,17 @@ export function printMetadataStats(stats: MetadataStats) { zeroFallback: ['Positions', 'Permissions'], }, { - // #11172 — `Runtime:` used to be rendered OUTSIDE this loop, as a + // Until commit 05181e8cc, `Runtime:` was rendered OUTSIDE this loop, as a // standalone `if (stats.plugins > 0 || stats.devPlugins > 0)` after the // loop closed, so a stack with no plugins and no devPlugins printed no // `Runtime:` line at all. Same "reads as never asked, not as zero" defect - // #10504 and #10952 removed from the sections, and measured the same way + // commits ff5733e03 and 0d4bd93e7 removed from the sections, and measured the same way // (`bin/run-dev.js validate`, `NO_COLOR=1`, a stack declaring nothing). // The maintainer ruled it in (2026-08-23): `Runtime:` renders // unconditionally, joining the no-silent-drop invariant. // // Folded into the array rather than fixed in place. Being outside the - // loop was not incidental to the defect — it is why #10952's mechanism + // loop was not incidental to the defect — it is why commit 0d4bd93e7's mechanism // could not reach this row, and a hand-rolled zero case beside the loop // would have been a SECOND copy of the invariant, un-enforced by the // `zeroFallback` typing that stops the next row from being added without @@ -1563,14 +1563,14 @@ export function printMetadataStats(stats: MetadataStats) { }, ]; - /** The shipped #10504 section shape — see `render` on the type above. */ + /** The section shape commit ff5733e03 shipped — see `render` on the type above. */ const countFragments = (shown: Array<[string, number]>) => shown.map(([k, v]) => `${chalk.white(v)} ${chalk.dim(k)}`).join(' '); for (const section of sections) { let shown = section.items.filter(([, v]) => v > 0); if (shown.length === 0) { - // Never drop the row (#10504, #10952, #11172) — the row is what says + // Never drop the row (commits ff5733e03, 0d4bd93e7, 05181e8cc) — the row is what says // "this project has none of this"; its absence says nothing at all. shown = section.zeroFallback .map((key) => section.items.find(([itemKey]) => itemKey === key)) @@ -1690,7 +1690,7 @@ export const AUTHORING_ADVISORY_PRINT_LIMIT = 50; * notice is not merely incomplete — it is indistinguishable from complete, so * an author who reads it and sees their file is clean has read a list that * stopped early. That is the same shape as the dropped summary rows above - * (#10504, #10952): output that cannot distinguish "none" from "not shown". + * (until commits ff5733e03, 0d4bd93e7): output that cannot distinguish "none" from "not shown". * * So the cap stays and the honesty line is added: over the limit, the exact * remainder is named; at or under it, no such line appears. The pointer is diff --git a/packages/cli/src/utils/hook-body-refusal-kind.test.ts b/packages/cli/src/utils/hook-body-refusal-kind.test.ts index e2d37543e96..a65c388b98a 100644 --- a/packages/cli/src/utils/hook-body-refusal-kind.test.ts +++ b/packages/cli/src/utils/hook-body-refusal-kind.test.ts @@ -1,7 +1,7 @@ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. /** - * #13651 — the refusal carries its classification, and the messages did not move. + * Commit ada3834ad — the refusal carries its classification, and the messages did not move. * * Two halves, and the second matters as much as the first: `os build`'s * warn-and-bundle line, `--strict-body`'s per-callable diagnostic and diff --git a/packages/cli/src/utils/i18n-extract.ts b/packages/cli/src/utils/i18n-extract.ts index 6b5f62ef568..a37f3fbf83b 100644 --- a/packages/cli/src/utils/i18n-extract.ts +++ b/packages/cli/src/utils/i18n-extract.ts @@ -30,8 +30,8 @@ * whose translations live in a bundle under the key this walk emits, and an * inline locale map — `{ en: 'Members', 'zh-CN': '成员' }` — which the author * writes out in place and the renderer picks from (`pickLocalized` / - * `resolveI18nLabel`). Rulings #5728, #10926 and #14412 make the map the ONE - * localisation route for the props that have no bundle key at all + * `resolveI18nLabel`). Rulings #5728 and #14412, and the ruling commit d173125fb landed, + * make the map the ONE localisation route for the props that have no bundle key at all * (`element:text`'s `content` among them), so a page localised that way is * fully localised. * @@ -246,7 +246,7 @@ export interface ExtractOptions extends ExpectedEntryOptions { * The `.source-hashes.generated.ts` tables already committed beside * the bundles, keyed by locale. * - * This is the mechanism's ONLY memory (#11671 / #12069 Option A): a leaf that + * This is the mechanism's ONLY memory (commit 09b4f4e4e, ruling #12069 Option A): a leaf that * is a byte copy of a source revision keeps its record across runs, which is * what makes the drift detectable after the source moves. Passing nothing * makes the run behave like a first extract — every record is re-derived from @@ -1089,16 +1089,16 @@ export function authorWarnedTranslationGroups(): ReadonlySet { /** * Write `pages..components..` for every component - * `translatePage` addresses — and only those (#13109). + * `translatePage` addresses — and only those (commit 8b236c826). * * BOTH halves of that sentence are imported from `@objectstack/spec`, so * neither can drift. The KEY list is {@link PAGE_COMPONENT_COPY_KEYS}; the * WALK — which components carry those keys — is `walkAddressedPageComponents`, - * the same traversal `translatePage` itself runs (#13218, completing the key + * the same traversal `translatePage` itself runs (commit c45d8e6b4, completing the key * list's precedent). The walk owns the roots (`regions[].components[]` AND * `slots.`), the descent (`properties.children` AND a panel's * `properties.items[].children`, depth-capped, cycle-guarded) and the ruled - * collision arbitration (#12961: root level wins outright; among nested + * collision arbitration (commit 901355c3b: root level wins outright; among nested * components, document-order first sighting) — this function used to * hand-mirror all five and now owns none of them. What it still owns: * @@ -1430,7 +1430,7 @@ export function collectExpectedEntries( // addressed by page name above, and emitting it here too would offer one // string under two keys. A NESTED `page:header` is a different component — // `translatePage`'s page-name route stops at region level, so a nested one - // is reachable by the id route ONLY and must be offered here (#13109). + // is reachable by the id route ONLY and must be offered here (commit 8b236c826). emitPageComponentCopy(out, page, name); } @@ -2291,7 +2291,7 @@ export function renderSourceHashModule( lines.push(' *'); lines.push(" * Each entry is the digest of the SOURCE REVISION that this locale's leaf at"); lines.push(' * that path is still a byte copy of — provenance for the generated half of the'); - lines.push(' * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B).'); + lines.push(' * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B).'); lines.push(' *'); lines.push(' * An entry exists only while the leaf IS such a copy. Re-translate the leaf in'); lines.push(' * `.objects.generated.ts` and the next extract drops its entry by'); diff --git a/packages/cli/src/utils/json-stdout.test.ts b/packages/cli/src/utils/json-stdout.test.ts index bc923872e20..5d21bf15012 100644 --- a/packages/cli/src/utils/json-stdout.test.ts +++ b/packages/cli/src/utils/json-stdout.test.ts @@ -1,7 +1,7 @@ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. /** - * The stdout reservation `--json` is built on (#6217), at the unit level. + * The stdout reservation `--json` is built on (commit 2b641ddd4), at the unit level. * * `packages/cli/test/json-stdout-purity.e2e.test.ts` pins the contract this * serves — every `--json` command in the `bootSchemaStack` family emitting one diff --git a/packages/cli/src/utils/json-stdout.ts b/packages/cli/src/utils/json-stdout.ts index 2a18f72acb1..506c03c99f9 100644 --- a/packages/cli/src/utils/json-stdout.ts +++ b/packages/cli/src/utils/json-stdout.ts @@ -1,7 +1,7 @@ // Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. /** - * stdout reservation — `--json` payloads (#6217) and `os serve`'s protocol + * stdout reservation — `--json` payloads (commit 2b641ddd4) and `os serve`'s protocol * channel (#7915). * * ## The invariant @@ -39,7 +39,7 @@ * * ## Why this shape * - * Three routes were on the table (issue #6217): + * Three routes were on the table (commit 2b641ddd4 took route 1): * * 1. redirect the kernel's output to **stderr** for the duration of a `--json` * run — this module; diff --git a/packages/cli/src/utils/lower-callables.test.ts b/packages/cli/src/utils/lower-callables.test.ts index 98aa25bca1c..539bb11a6ad 100644 --- a/packages/cli/src/utils/lower-callables.test.ts +++ b/packages/cli/src/utils/lower-callables.test.ts @@ -149,7 +149,7 @@ describe('lowerCallables — declared `functions` entries (#4396)', () => { // `lowerCallables` has lowered the array branch the whole time. Its member // lives inline in `stack.zod.ts` rather than in `FlowFunctionEntrySchema` // (an array entry names itself, so it is a different record, not the same -// schema in a list), which is why widening one did not widen the other. #6238 +// schema in a list), which is why widening one did not widen the other. Commit c8d6f6e08 // widened it; the parametrisation below now covers the array form too. describe('lowerCallables → the spec parses what it emits (#4976, #6238)', () => { const base = { @@ -179,7 +179,7 @@ describe('lowerCallables → the spec parses what it emits (#4976, #6238)', () = scoreLead: () => ({ score: 1 }), syncBilling: { handler: () => ({ ok: true }), effect: 'writes' }, }], - // ── the array form (#6238) ── + // ── the array form (commit c8d6f6e08) ── ['an array entry with a bare handler', 'array', [{ name: 'scoreLead', handler: () => ({ score: 1 }) }]], ['an array entry declaring a writer', 'array', [{ name: 'syncBilling', handler: () => ({ ok: true }), effect: 'writes' }]], ['an array entry declaring the pure default', 'array', [{ name: 'scoreLead', handler: () => ({ score: 1 }), effect: 'pure' }]], @@ -270,7 +270,7 @@ describe('lowerCallables → the spec parses what it emits (#4976, #6238)', () = // pass had gone out of its way to keep. // 2. A MALFORMED entry was destroyed rather than reported. The headless husk // `{ effect: 'writes' }` (what a plain `JSON.stringify(stack)` leaves -// where a declaration was, #6293) left the lowering as `functions: {}` and +// where a declaration was, as commit c39a911ae found) left the lowering as `functions: {}` and // the stack then parsed GREEN — the build writing an artifact missing the // function instead of refusing. describe('lowerCallables — unrecognised `functions` entries reach the parse (#7318)', () => { diff --git a/packages/cli/src/utils/lower-callables.ts b/packages/cli/src/utils/lower-callables.ts index e8e8fe1e665..ddb8874ff1b 100644 --- a/packages/cli/src/utils/lower-callables.ts +++ b/packages/cli/src/utils/lower-callables.ts @@ -28,7 +28,7 @@ import { extractHookBody, HookBodyExtractionError, type HookBodyRefusalKind } fr * * `origin` and `reason` are unchanged — `os build`'s warn-and-bundle line, * `--strict-body`'s diagnostic and the `--json` payload all read them. - * `kind` (#13651) is the classification the refusing rule already had and used + * `kind` (commit ada3834ad) is the classification the refusing rule already had and used * to throw away at the catch below; `freeIdentifiers` is the list * `detectFreeIdentifiers` had already computed. Both are ADDITIVE: nothing here * changes which callables are bundled, or the exit code. @@ -281,7 +281,7 @@ export function lowerCallables(input: Record): LoweringResult { // carefully kept. // // MALFORMED — the headless husk `{ effect: 'writes' }` that a plain - // `JSON.stringify(stack)` leaves where a declaration was (#6293). + // `JSON.stringify(stack)` leaves where a declaration was (as commit c39a911ae found). // Deleting it here erased the evidence BEFORE the parse: the artifact // came out `functions: {}` and validated green, so the build shipped // an app missing the function instead of refusing. Handed on, it diff --git a/packages/cli/src/utils/metadata-file-name.ts b/packages/cli/src/utils/metadata-file-name.ts index 14766d198f4..14f2a992bbd 100644 --- a/packages/cli/src/utils/metadata-file-name.ts +++ b/packages/cli/src/utils/metadata-file-name.ts @@ -37,7 +37,7 @@ export function metadataFileInfix(type: string): string | null { * globbing that type's `filePatterns`. A scaffold whose name matches none of * those patterns is never primed, and nothing anywhere reports it: it still * type-checks, still passes `os validate` and still publishes — the - * silent-strip shape ADR-0063's retirement of `os g agent` closed (#10359). + * silent-strip shape ADR-0063's retirement of `os g agent` closed (commit 15b63e85a). * * ### That mechanism has a precondition, and this tree never meets it (#12075) * @@ -91,10 +91,10 @@ export function metadataFileInfix(type: string): string | null { * The harness used to write `NAME.ts` for every type, and that name matches * no pattern the registry declares for ANY type. Measured rather than * assumed: across the seven generators, `NAME.ts` matched zero `filePatterns` - * entries and `NAME.TYPE.ts` matched exactly one, every time. #11025 closed + * entries and `NAME.TYPE.ts` matched exactly one, every time. Commit 1c3a46f87 closed * it for `skill` alone through a per-generator filename override and fenced * the repo-wide route as a decision of its own. This is that decision - * (#11071), and it retires the override rather than growing it to six copies. + * (commit 50fb191dc), and it retires the override rather than growing it to six copies. * * ## Why it reads the pattern instead of interpolating the type name * diff --git a/packages/cli/src/utils/response-envelope.test.ts b/packages/cli/src/utils/response-envelope.test.ts index 1e871a32115..b1a3c877853 100644 --- a/packages/cli/src/utils/response-envelope.test.ts +++ b/packages/cli/src/utils/response-envelope.test.ts @@ -89,7 +89,7 @@ describe('readEnvelopeFrom', () => { }); /** - * `readErrorMessage` — the PRINTABLE-message reader (#10763). + * `readErrorMessage` — the PRINTABLE-message reader (added by commit c2b97c2a1). * * Two dialects are covered because the control plane really does emit two: the * declared envelope, and the flat `error: ''` its `fail()` helper diff --git a/packages/cli/src/utils/schema-migrate.ts b/packages/cli/src/utils/schema-migrate.ts index 88f1ad99445..f9f82111df2 100644 --- a/packages/cli/src/utils/schema-migrate.ts +++ b/packages/cli/src/utils/schema-migrate.ts @@ -192,7 +192,7 @@ export async function bootSchemaStack( * `true` when this run's stdout belongs to a machine-readable payload * (`--json`) — the boot then sends everything the kernel and its plugins * write to **stderr** so `JSON.parse(stdout)` succeeds on the whole - * stream, with no heuristic extraction (#6217). + * stream, with no heuristic extraction (commit 2b641ddd4). * * REQUIRED, and required on purpose. Every command in this family declares * a `--json` flag, and each of them re-introduced the same defect @@ -294,7 +294,7 @@ export async function bootSchemaStack( // Taken BEFORE the first line the boot can print. `createStandaloneStack` // announces a missing compiled artifact on `console.log` before any plugin // is constructed, so a reservation installed one statement later already - // arrives too late to keep stdout a single JSON document (#6217). + // arrives too late to keep stdout a single JSON document (commit 2b641ddd4). const releaseStdout = opts.jsonOutput ? reserveStdoutForJson() : () => { /* stdout is the caller's */ }; const { createStandaloneStack, Runtime } = await import('@objectstack/runtime'); @@ -458,7 +458,7 @@ export async function bootSchemaStack( // Only now — `kernel.shutdown()` is itself two INFO lines ("Graceful // shutdown started" / "complete"), and under `--json` those printed // BELOW the payload, which is half of what made stdout unparseable - // (#6217). Released after the kernel is down, when nothing is left to + // (before commit 2b641ddd4). Released after the kernel is down, when nothing is left to // write; a failed boot never reaches here on purpose. releaseStdout(); }, diff --git a/packages/cli/src/utils/spec-release-changes.test.ts b/packages/cli/src/utils/spec-release-changes.test.ts index a0a78402992..10c94a2a0fb 100644 --- a/packages/cli/src/utils/spec-release-changes.test.ts +++ b/packages/cli/src/utils/spec-release-changes.test.ts @@ -42,7 +42,7 @@ describe('readSpecReleaseChanges (ADR-0087 D4 per-release section)', () => { }); it('⛔ reports NOTHING, never zeros, for a manifest with no release section', () => { - // This is the pre-#17080 artifact, and the whole defect it fixes: a + // This is the artifact from before commit 8b4890343, and the whole defect it fixes: a // consumer that reads `added: 0` from a release which moved 225 exports // concludes the upgrade is safe. Absence must stay distinguishable from a // measured empty delta. diff --git a/packages/cli/src/utils/storage-driver.test.ts b/packages/cli/src/utils/storage-driver.test.ts index e903ecf97a6..36b7c19ee3f 100644 --- a/packages/cli/src/utils/storage-driver.test.ts +++ b/packages/cli/src/utils/storage-driver.test.ts @@ -25,7 +25,7 @@ import { TURSO_DRIVER_INSTALL_COMMAND, UnsupportedDriverError, } from './storage-driver.js'; -// #6268: the OTHER host's bindings, imported under their own names so the +// Commit 68f5eccb1: the OTHER host's bindings, imported under their own names so the // identity assertions below compare two real module paths rather than one alias // of the same import. `@objectstack/runtime` resolves to the BUILT package here, // exactly as it does for `storage-driver.ts` itself — which is what makes the @@ -121,7 +121,7 @@ describe('resolveStorageDefinition (#3826 — a definition, not a driver)', () = expect(r!.trackName).toBe('MongoDBDriver'); }); - // VERDICT FLIPPED by #6345 fork 2 (maintainer ruling, 2026-08-09). This pin + // VERDICT FLIPPED by commit e2798fab7's fork 2 (maintainer ruling, 2026-08-09). This pin // used to assert `config: { url: 'mongodb://localhost:27017/objectstack' }` for // a mongodb selection with no URL — a DSN the CLI invented, naming a host the // operator never did. It is the same defect as postgres's `url: undefined` @@ -183,10 +183,10 @@ describe('resolveStorageDefinition (#3826 — a definition, not a driver)', () = expect(resolveStorageDefinition('', { isDev: false })).toBeNull(); }); - // VERDICT FLIPPED by #6345 fork 1. `'nonsense'` used to share the `''` answer — + // VERDICT FLIPPED by commit e2798fab7's fork 1. `'nonsense'` used to share the `''` answer — // null in prod, and in DEV the trailing SQLite default, i.e. // `os dev --database-driver sqlite3` silently booted SQLite while `os migrate` - // refused the same value by name (#6344 killed the silent fallback on that + // refused the same value by name (commit cfb549db8 killed the silent fallback on that // side only). The two are not the same input: `''` means "nobody chose", while // a non-empty value can only have come from an operator naming a driver, since // URL inference yields a canonical id or `''`. So the two answers separate. @@ -488,7 +488,7 @@ describe('#7314 — the shared libSQL config builder against the real TursoDrive }); }); -// #6268 — the loader has ONE owner (`@objectstack/runtime`), and this file's +// Commit 68f5eccb1 — the loader has ONE owner (`@objectstack/runtime`), and this file's // exports are that owner's declarations rather than hand-aligned copies. // // The property under test is CLASS IDENTITY, not wording. `serve.ts:1136` decides @@ -564,7 +564,7 @@ describe('#6268 — one loader, one class identity across cli and runtime', () = // The one thing the convergence deliberately did NOT move: the dynamic // import's specifier, whose RESOLUTION ROOT is the module that evaluates it. // `@objectstack/driver-turso` is an optional PEER of `@objectstack/cli` and, - // since #12943, of `@objectstack/runtime` too — an optional peer names the + // since commit 090f2302e, of `@objectstack/runtime` too — an optional peer names the // relationship and installs nothing, so the package still sits in whichever // tree the operator installed it into. Had the CLI taken the runtime's default // thunk, an operator who ran the exact install command this error prints would @@ -575,7 +575,7 @@ describe('#6268 — one loader, one class identity across cli and runtime', () = // runtime half USED to be pinned from the other side by // `standalone-stack.libsql.test.ts`, where a `libsql://` boot with no injected // thunk took the missing-package arm because nothing linked the package under - // the runtime. #12943's optional peer makes pnpm link it there too, so that + // the runtime. Commit 090f2302e's optional peer makes pnpm link it there too, so that // case now STAGES the absence rather than relying on the layout to supply it. // The pair still asserts that the two roots are distinct; what neither can // assert any more is that one of them is empty. diff --git a/packages/cli/src/utils/storage-driver.ts b/packages/cli/src/utils/storage-driver.ts index 0fd6d0cdc28..a736d01bde5 100644 --- a/packages/cli/src/utils/storage-driver.ts +++ b/packages/cli/src/utils/storage-driver.ts @@ -49,13 +49,13 @@ * back to SQLite, which is the #3276 lesson kept intact: a silent step-down onto * a *different* engine writes an operator's data into the wrong database. * - * ## #6268 — the loader itself lives in the runtime now + * ## Commit 68f5eccb1 — the loader itself lives in the runtime now * * That loader used to be written out twice: here, and in * `packages/runtime/src/turso-driver-factory.ts` (#5820, for `os migrate` / * `createStandaloneStack`). The two were kept equal BY HAND — one decision, two * implementations, which is the #3741 → #3758 shape that goes wrong three months - * later. It had already started: #6345 moved this half onto `@objectstack/spec`'s + * later. It had already started: commit e2798fab7 moved this half onto `@objectstack/spec`'s * shared driver vocabulary and left the runtime half on a private * `Set(['turso', 'libsql'])`. * @@ -88,7 +88,7 @@ import { /** * The libSQL/Turso loader's single-sourced surface, re-exported so this module - * stays the CLI's one door to storage-driver concerns (#6268). These are the + * stays the CLI's one door to storage-driver concerns (commit 68f5eccb1). These are the * runtime's declarations, not copies of them — in particular * {@link MissingDriverPackageError} is ONE class across both packages. */ @@ -124,7 +124,7 @@ const MISSING_URL_EXAMPLES: Readonly>> = /** * The refusal for "you named a driver whose database lives somewhere I cannot - * guess, and then did not tell me where" (#6345 fork 2). + * guess, and then did not tell me where" (commit e2798fab7's fork 2). * * Generalized from the wording `turso` has carried since #5602, because that * wording was already right for every one of these kinds — the maintainer's @@ -152,7 +152,7 @@ function missingUrlMessage(kind: BuiltinDriverId): string { /** * Thrown by {@link resolveStorageDefinition} for a driver selection that cannot - * become a datasource definition. Two cases since #6345: + * become a datasource definition. Two cases since commit e2798fab7: * * - a spelling no builtin claims (`--database-driver sqlite3`), which used to * fall through to the dev SQLite default while `os migrate` refused the same @@ -193,7 +193,7 @@ export class UnsupportedDriverError extends Error { * * That consumer is real: `commands/database-driver-allowlist.pin.test.ts` * (#6860) derives the canonical kinds by using {@link resolveStorageDefinition} - * as its oracle and reading `driverType` out of this error. When #6345 taught + * as its oracle and reading `driverType` out of this error. When commit e2798fab7 taught * the resolver to refuse unknown spellings too, that oracle started reporting * every stray string literal in this file (`safe`, `on-disconnect`, `factory`) * as a driver kind. This flag is what keeps the two answers apart. @@ -203,7 +203,7 @@ export class UnsupportedDriverError extends Error { super(message); this.name = 'UnsupportedDriverError'; this.driverType = driverType; - // Defaults to `true` so the pre-#6345 call sites (turso with no URL) keep + // Defaults to `true` so the call sites predating commit e2798fab7 (turso with no URL) keep // their meaning without restating it. this.recognized = opts.recognized ?? true; } @@ -323,21 +323,21 @@ export function resolveStorageDefinition( // kinds. Never in production, never destructive. const autoMigrate = isDev ? ({ autoMigrate: 'safe' } as const) : {}; - // ONE vocabulary since #6345 (`@objectstack/spec`'s driver table). The arms + // ONE vocabulary since commit e2798fab7 (`@objectstack/spec`'s driver table). The arms // below therefore branch on the CANONICAL id and never on a spelling: the // hand-written `driverType === 'pg' || driverType === 'postgresql'` chains // were half of the fork this card closes — the standalone stack's enum had // its own answer, and 10 of 21 spellings disagreed. const kind = resolveDatabaseDriverId(driverType); - // An EXPLICIT selection nothing claims is refused, loudly (#6345 fork 1). + // An EXPLICIT selection nothing claims is refused, loudly (commit e2798fab7's fork 1). // // `driverType` is `explicit || inferDriverTypeFromUrl(url)`, and the inferring // half only ever yields a canonical id or `''` — so a non-empty value that // resolves to nothing can only have come from an operator naming a driver. // It used to fall through to the trailing dev default, i.e. `os dev // --database-driver sqlite3` silently booted SQLite while `os migrate` refused - // the same value by name. #6344 killed that silent fallback on the standalone + // the same value by name. Commit cfb549db8 killed that silent fallback on the standalone // side; this is its mirror, and it is what makes the two hosts answer the same // question the same way for EVERY input rather than only for the legal ones. if (driverType && !kind) { @@ -354,7 +354,7 @@ export function resolveStorageDefinition( ); } - // Fork 2 (#6345): a kind with NO local default, selected with no URL. Every + // Fork 2 (commit e2798fab7): a kind with NO local default, selected with no URL. Every // such selection used to be answered by a guess, differently on each side: // postgres/mysql got `config.url === undefined` and the `pg`/`mysql2` client // then connected to ITS own localhost; mongodb got an invented @@ -491,7 +491,7 @@ export function resolveStorageDefinition( * Load the OPTIONAL libSQL/Turso driver package and wrap it as the host driver * factory `DefaultDatasourcePlugin` accepts (#5602). * - * A thin delegation to the runtime's single owner since #6268 — the loading, the + * A thin delegation to the runtime's single owner since commit 68f5eccb1 — the loading, the * error class, the install command, the missing-package wording and the handle * shape all live in `@objectstack/runtime`'s `turso-driver-factory.ts`. What this * wrapper supplies is the two things that are genuinely the CLI's, and would be a @@ -511,7 +511,7 @@ export function resolveStorageDefinition( * written here, in the package that peer-declares it, and is typed rather * than `as any` for the same reason. * 2. **{@link UnsupportedDriverError} for a url-less turso config.** CLI-only - * semantics by the #6268 ruling — `serve.ts` re-throws it as a fatal boot + * semantics by the ruling commit 68f5eccb1 landed — `serve.ts` re-throws it as a fatal boot * error. Only the error TYPE is chosen here; the message comes from the * runtime, so the wording is not duplicated. */ diff --git a/packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts b/packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts index d6ade64f6d1..0bb919d67d3 100644 --- a/packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts +++ b/packages/platform-objects/src/apps/translations/es-ES.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts b/packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts index 3e846e94cee..2429910c839 100644 --- a/packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts +++ b/packages/platform-objects/src/apps/translations/ja-JP.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/platform-objects/src/apps/translations/zh-CN.source-hashes.generated.ts b/packages/platform-objects/src/apps/translations/zh-CN.source-hashes.generated.ts index 76ba4293863..695dd4d6a19 100644 --- a/packages/platform-objects/src/apps/translations/zh-CN.source-hashes.generated.ts +++ b/packages/platform-objects/src/apps/translations/zh-CN.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-approvals/src/translations/es-ES.source-hashes.generated.ts b/packages/plugins/plugin-approvals/src/translations/es-ES.source-hashes.generated.ts index f48e8b04945..0a38786c290 100644 --- a/packages/plugins/plugin-approvals/src/translations/es-ES.source-hashes.generated.ts +++ b/packages/plugins/plugin-approvals/src/translations/es-ES.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-approvals/src/translations/ja-JP.source-hashes.generated.ts b/packages/plugins/plugin-approvals/src/translations/ja-JP.source-hashes.generated.ts index 9e9a64105b0..f86320839ee 100644 --- a/packages/plugins/plugin-approvals/src/translations/ja-JP.source-hashes.generated.ts +++ b/packages/plugins/plugin-approvals/src/translations/ja-JP.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-approvals/src/translations/zh-CN.source-hashes.generated.ts b/packages/plugins/plugin-approvals/src/translations/zh-CN.source-hashes.generated.ts index 08320d78c50..71eb4f598b7 100644 --- a/packages/plugins/plugin-approvals/src/translations/zh-CN.source-hashes.generated.ts +++ b/packages/plugins/plugin-approvals/src/translations/zh-CN.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-audit/src/translations/es-ES.source-hashes.generated.ts b/packages/plugins/plugin-audit/src/translations/es-ES.source-hashes.generated.ts index e8114c4355e..b376dba557c 100644 --- a/packages/plugins/plugin-audit/src/translations/es-ES.source-hashes.generated.ts +++ b/packages/plugins/plugin-audit/src/translations/es-ES.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-audit/src/translations/ja-JP.source-hashes.generated.ts b/packages/plugins/plugin-audit/src/translations/ja-JP.source-hashes.generated.ts index 0ee7f8d206b..4a76f44b1fa 100644 --- a/packages/plugins/plugin-audit/src/translations/ja-JP.source-hashes.generated.ts +++ b/packages/plugins/plugin-audit/src/translations/ja-JP.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-audit/src/translations/zh-CN.source-hashes.generated.ts b/packages/plugins/plugin-audit/src/translations/zh-CN.source-hashes.generated.ts index c99e66bb2b2..44820d22e50 100644 --- a/packages/plugins/plugin-audit/src/translations/zh-CN.source-hashes.generated.ts +++ b/packages/plugins/plugin-audit/src/translations/zh-CN.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-security/src/translations/es-ES.source-hashes.generated.ts b/packages/plugins/plugin-security/src/translations/es-ES.source-hashes.generated.ts index ea72549b538..72ef853efc5 100644 --- a/packages/plugins/plugin-security/src/translations/es-ES.source-hashes.generated.ts +++ b/packages/plugins/plugin-security/src/translations/es-ES.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-security/src/translations/ja-JP.source-hashes.generated.ts b/packages/plugins/plugin-security/src/translations/ja-JP.source-hashes.generated.ts index fdc3773b416..90f90e13778 100644 --- a/packages/plugins/plugin-security/src/translations/ja-JP.source-hashes.generated.ts +++ b/packages/plugins/plugin-security/src/translations/ja-JP.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-security/src/translations/zh-CN.source-hashes.generated.ts b/packages/plugins/plugin-security/src/translations/zh-CN.source-hashes.generated.ts index 1151b17de31..ebf9cdfa4d0 100644 --- a/packages/plugins/plugin-security/src/translations/zh-CN.source-hashes.generated.ts +++ b/packages/plugins/plugin-security/src/translations/zh-CN.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-sharing/src/translations/es-ES.source-hashes.generated.ts b/packages/plugins/plugin-sharing/src/translations/es-ES.source-hashes.generated.ts index c606d9bc74f..a80949316dc 100644 --- a/packages/plugins/plugin-sharing/src/translations/es-ES.source-hashes.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/es-ES.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-sharing/src/translations/ja-JP.source-hashes.generated.ts b/packages/plugins/plugin-sharing/src/translations/ja-JP.source-hashes.generated.ts index 517826c13df..118fde11e6f 100644 --- a/packages/plugins/plugin-sharing/src/translations/ja-JP.source-hashes.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/ja-JP.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-sharing/src/translations/zh-CN.source-hashes.generated.ts b/packages/plugins/plugin-sharing/src/translations/zh-CN.source-hashes.generated.ts index f74e0d3d8a1..3bbae136cb9 100644 --- a/packages/plugins/plugin-sharing/src/translations/zh-CN.source-hashes.generated.ts +++ b/packages/plugins/plugin-sharing/src/translations/zh-CN.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-webhooks/src/translations/es-ES.source-hashes.generated.ts b/packages/plugins/plugin-webhooks/src/translations/es-ES.source-hashes.generated.ts index 01e3ea36587..efd80ab1d6c 100644 --- a/packages/plugins/plugin-webhooks/src/translations/es-ES.source-hashes.generated.ts +++ b/packages/plugins/plugin-webhooks/src/translations/es-ES.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-webhooks/src/translations/ja-JP.source-hashes.generated.ts b/packages/plugins/plugin-webhooks/src/translations/ja-JP.source-hashes.generated.ts index cfcaea9de7e..f56a5b3283a 100644 --- a/packages/plugins/plugin-webhooks/src/translations/ja-JP.source-hashes.generated.ts +++ b/packages/plugins/plugin-webhooks/src/translations/ja-JP.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/plugins/plugin-webhooks/src/translations/zh-CN.source-hashes.generated.ts b/packages/plugins/plugin-webhooks/src/translations/zh-CN.source-hashes.generated.ts index 3d2de3c7fe9..891b8e8757c 100644 --- a/packages/plugins/plugin-webhooks/src/translations/zh-CN.source-hashes.generated.ts +++ b/packages/plugins/plugin-webhooks/src/translations/zh-CN.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/services/service-messaging/src/translations/es-ES.source-hashes.generated.ts b/packages/services/service-messaging/src/translations/es-ES.source-hashes.generated.ts index d418c2f7faf..e02df8f4d8d 100644 --- a/packages/services/service-messaging/src/translations/es-ES.source-hashes.generated.ts +++ b/packages/services/service-messaging/src/translations/es-ES.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/services/service-messaging/src/translations/ja-JP.source-hashes.generated.ts b/packages/services/service-messaging/src/translations/ja-JP.source-hashes.generated.ts index 9dea67fbc6e..0c113bd9475 100644 --- a/packages/services/service-messaging/src/translations/ja-JP.source-hashes.generated.ts +++ b/packages/services/service-messaging/src/translations/ja-JP.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/services/service-messaging/src/translations/zh-CN.source-hashes.generated.ts b/packages/services/service-messaging/src/translations/zh-CN.source-hashes.generated.ts index 32e25116645..ec4a0219ed3 100644 --- a/packages/services/service-messaging/src/translations/zh-CN.source-hashes.generated.ts +++ b/packages/services/service-messaging/src/translations/zh-CN.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/services/service-realtime/src/translations/es-ES.source-hashes.generated.ts b/packages/services/service-realtime/src/translations/es-ES.source-hashes.generated.ts index 0dc56d6d456..39043ac403b 100644 --- a/packages/services/service-realtime/src/translations/es-ES.source-hashes.generated.ts +++ b/packages/services/service-realtime/src/translations/es-ES.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/services/service-realtime/src/translations/ja-JP.source-hashes.generated.ts b/packages/services/service-realtime/src/translations/ja-JP.source-hashes.generated.ts index 5118a655731..6284eba4643 100644 --- a/packages/services/service-realtime/src/translations/ja-JP.source-hashes.generated.ts +++ b/packages/services/service-realtime/src/translations/ja-JP.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/services/service-realtime/src/translations/zh-CN.source-hashes.generated.ts b/packages/services/service-realtime/src/translations/zh-CN.source-hashes.generated.ts index 50d030178a4..72de869fd12 100644 --- a/packages/services/service-realtime/src/translations/zh-CN.source-hashes.generated.ts +++ b/packages/services/service-realtime/src/translations/zh-CN.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/services/service-storage/src/translations/es-ES.source-hashes.generated.ts b/packages/services/service-storage/src/translations/es-ES.source-hashes.generated.ts index 5039467236a..54dae9af111 100644 --- a/packages/services/service-storage/src/translations/es-ES.source-hashes.generated.ts +++ b/packages/services/service-storage/src/translations/es-ES.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/services/service-storage/src/translations/ja-JP.source-hashes.generated.ts b/packages/services/service-storage/src/translations/ja-JP.source-hashes.generated.ts index f9869fcfb8e..c282561f024 100644 --- a/packages/services/service-storage/src/translations/ja-JP.source-hashes.generated.ts +++ b/packages/services/service-storage/src/translations/ja-JP.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/packages/services/service-storage/src/translations/zh-CN.source-hashes.generated.ts b/packages/services/service-storage/src/translations/zh-CN.source-hashes.generated.ts index 1a90cae2c0e..ffa6a6cc17a 100644 --- a/packages/services/service-storage/src/translations/zh-CN.source-hashes.generated.ts +++ b/packages/services/service-storage/src/translations/zh-CN.source-hashes.generated.ts @@ -5,7 +5,7 @@ * * Each entry is the digest of the SOURCE REVISION that this locale's leaf at * that path is still a byte copy of — provenance for the generated half of the - * bundles (#11671, maintainer ruling #12069 Option A, extending #8765 Option B). + * bundles (commit 09b4f4e4e, maintainer ruling #12069 Option A, extending #8765 Option B). * * An entry exists only while the leaf IS such a copy. Re-translate the leaf in * `.objects.generated.ts` and the next extract drops its entry by diff --git a/scripts/doc-authoring-prose-id.baseline.json b/scripts/doc-authoring-prose-id.baseline.json index fad4260e0bd..416fb72f8df 100644 --- a/scripts/doc-authoring-prose-id.baseline.json +++ b/scripts/doc-authoring-prose-id.baseline.json @@ -14,9 +14,6 @@ "#5397": 1, "#5673": 1 }, - "packages/cli/src/commands/i18n/extract.ts": { - "#11671": 1 - }, "packages/cli/src/commands/meta/resync.ts": { "#2705": 1, "#8692": 1 @@ -50,7 +47,6 @@ "#3366": 1 }, "packages/cli/src/utils/i18n-extract.ts": { - "#11671": 1, "#12069": 1, "#8765": 1 },