Skip to content

refactor(driver-sql): move introspectSchema's body out of sql-driver.ts into sql-driver-introspection.ts (#25521 cut 4) - #25698

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-25521-sql-driver-cut-4
Oct 24, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-25521-sql-driver-cut-4

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Part of #25521
Clause-②: no
Metadata-protocol: none
Ruling-ref: 6270097840
Ruling-ref: 6348891160

Cut 4 of the sql-driver.ts split (#24586 ruling A, recorded in 6270097840). The claim is 6386825345. The body of the public SqlDriver#introspectSchema moves unedited into cut 1's module, packages/drivers/driver-sql/src/sql-driver-introspection.ts, and reaches the class through cut 1's host, IntrospectionHost. The method keeps its name, signature and position. listPhysicalColumns, the other member of the class's Schema Introspection section, stays in the class (see "Why only introspectSchema").

It is move-only, and the card stays open for the later cuts. Branch claude/issue-25521-sql-driver-cut-4, cut from origin/main at 6021b5e83 (cut 3 merged as 645ede5e1 before it).

Net line count (the seat's rule from ACCEPT 6385306916). sql-driver.ts goes from 21,678 lines at base to 21,595 at head: -83. sql-driver-introspection.ts goes from 665 to 800 lines.

Serial with the file's in-flight PRs. At claim the PM read no open PR touching sql-driver.ts. Re-measured at my start (15 open PRs) and again just before this PR was opened (12 open), each PR's file list read in full. No PR touches packages/drivers/driver-sql/**, packages/drivers/driver-turso/** or packages/drivers/driver-sqlite-wasm/**, except the Version Packages PR #25640, which touches only those packages' CHANGELOG.md and package.json (its 183 files read page by page, twice). origin/main moved two commits past the base meanwhile (#25603, #25684, now 1fbd9de05). Neither touches the three driver packages or a gate script this diff derives, so main is not merged in.

Seam table (fresh, at 6021b5e83)

sql-driver.ts is 21,678 lines. 30-day lines are git blame --line-porcelain lines whose committer time is on or after 2026-09-24T15:56:03Z, 30 days before the base commit. The clone's history floor is 2026-09-15, and scripts/pm/git-history.mjs count proves 69 commits on the file in that window. In all, 3,815 lines (17.6%) are from the last 30 days. The class SqlDriver spans lines 5499-21603 with 347 members: 251 methods (49 public), 32 statics. No public method has an inferred return type; the one inferred public member is the getter supports, in the class head. Sections are the class's own banner comments, cut by contiguous line range. "Public" counts public methods, plus public accessors where there are any:

Lines Section Lines 30-day lines Members (public)
1-5498 Module preamble: imports, types, top-level helpers (202 statements) 5,498 1,420 -
5499-7090 Class head: fields, statics, constructor, capability getters (supports) 1,592 290 88 (1 + 2 accessors)
7091-7522 Lifecycle 432 155 15 (3)
7523-10201 CRUD (IDataDriver core) 2,679 691 45 (7)
10202-10813 Bulk and batch operations 612 140 9 (6)
10814-10910 Raw execution (cut 2's three stubs and the runtimeCreatedIndexes field) 97 28 4 (1)
10911-11003 Transactions (cut 3's six stubs and releaseTransaction) 93 46 7 (5)
11004-11535 Aggregation 532 61 5 (1)
11536-11823 Distinct 288 20 3 (1)
11824-11939 Window functions 116 4 1 (1)
11940-12038 Query plan analysis 99 1 2 (2)
12039-15793 Schema sync (syncSchema / init) 3,755 256 62 (14 + 3 accessors)
15794-15929 Schema introspection (this cut moves introspectSchema, 15825-15928) 136 65 2 (2)
15930-21603 Internal helpers, including cut 1's five introspection stubs 5,674 638 104 (5)
21604-21678 After the class: UniqueConstraintMember, singleColumnUniqueColumns 75 0 -

Of the 65 Schema introspection lines from the last 30 days, 27 are listPhysicalColumns with its docblock and the banner (15794-15824), and 38 are introspectSchema (15825-15928). At head the section is 52 lines (15795-15846).

The limits per area are cut 1's (PR #25614), re-read on this tree:

  • getBuilder builders. Aggregation, Distinct, Window functions, Query plan analysis, CRUD and Bulk build through getBuilder, so a cut of any of them must first carry the new module into check:tenant-chokepoint's SCAN_FILES, or rule 1 goes silently narrower. None of them is cut here.
  • Protected statics. The hash-shadow family and the row-size explainers (Internal helpers) read protected statics, so those bodies stay.
  • this.FIELD.delete/insert/update(. releaseTransaction has one, and Schema sync has three. Those bodies stay. introspectSchema has none: it calls .get(, .set( and .push( on local maps and arrays only.
  • The net-line rule (ACCEPT 6385306916). An area moves only when sql-driver.ts's net line count drops.
  • insertOnlyUpsertColumns stays in sql-driver.ts, because drivers(sql): upsert's empty-merge-set fallback is merge-ALL, which re-admits every insert-only column — currently unreachable, but it is the wrong shape for "nothing to merge" #8740's restart line names that symbol in that file. This cut does not touch it.

Proposed cut 5: introspectIndexes (Schema sync, 15097-15249, 153 lines, 0 from the last 30 days), into the same sql-driver-introspection.ts. It is protected, with an annotated return type (a promise of PhysicalIndex[]). It reads no static and does not build through getBuilder, and it has no this.FIELD.delete/insert/update( site. Its body reads knex, isMysql, isPostgres and isSqlite, which IntrospectionHost already lists, plus resolveHashShadowKeys, which would go as a late-bound closure. That method reads the hash-shadow statics, so it stays in the class. TursoDriver overrides introspectIndexes and calls super on its local arm. Priced against the net-line rule: the stub needs one closure and four getters (13 lines) in place of a body of 96 lines, plus one name in the import, so the file drops by about 82 lines. Its docblock cites ADR-0048 and stays on the class, so the anchored decision-letter count should not move. The next candidate after it is the SQLite rebuild pair applyDriftOpInPlace and rebuildSqliteTablePatched (14858-15048, 0 from 30 days; 6 and 10 host members). Every other cold area left builds through getBuilder.

Why introspectSchema, and why cut 1's module

  • The area. A1 holds on re-measure, with one change: only introspectSchema moves. It is public, its return type is annotated (a promise of IntrospectedSchema), it reads no static and no getBuilder, and it has no this.FIELD.delete/insert/update( site. Its 104 lines include 38 from the last 30 days.
  • Cut 1's module, not a new one. introspectSchema is the public whole-schema read that cut 1's five catalog helpers serve, and that module's header already says so. Its body calls four of those helpers. Four of the five fields and getters it reads (knex, isMysql, isPostgres, isSqlite) are already IntrospectionHost members. A new module would declare a second host typing the same four members, and card ask 2 asks for one named host per shared surface, not a second copy. One name joins the existing import line in sql-driver.ts. A new module would add an import block and its comment, which counts against the net-line rule.

Why only introspectSchema

The seat's ACCEPT on cut 3 keeps a body in the class when it is shorter than its host literal. listPhysicalColumns is that case. Its body is 6 lines, and it reads knex, physicalTableByObject and physicalSchemaByObject. A stub would need three getters: 10 lines in place of 6, plus one more name in the import. So sql-driver.ts would grow by 5 lines. Moving it with introspectSchema would still leave the area net-negative (-78 instead of -83). But that member alone would make the file longer, so it stays. This is open question 1 in the report.

Overrides and spies, measured before the move

  • TursoDriver overrides introspectSchema (its 'refused' door row) and calls super.introspectSchema() on its local arm. The class method is still there and hands the body its host. TursoDriver also overrides introspectColumns (one parameter, calls super). The moved body reaches introspectColumns through a late-bound closure, so that override is still the one it calls. TursoDriver's door table lists dialectName as 'inherited'.
  • SqliteWasmDriver overrides the getter isSqlite. The host reads it through a getter that reads the driver, so the override is the one the body sees.
  • sql-driver-12732-varchar-emitter-parity-wiring.test.ts spies on introspectColumns on the instance, and the closure reaches that spy. service-datasource tests spy on introspectSchema itself, which is still the class method.
  • A scratch probe against the built dist gave 14 readings, identical at base and at head. It covered the plain SQLite answer (tables, columns, keys, foreign keys, dialect, introspectedAt), instance spies on all four helpers (2 calls each), a spy on introspectColumns that answers its own columns, a subclass override of introspectColumns with one parameter, a subclass override of the dialectName getter, a subclass introspectSchema that calls super, and a helper that rejects, which rejects the whole read. The probe is not committed.

The shape (#23050 shape B, as cuts 1-3 apply it)

  • The class keeps introspectSchema with its name, signature and position. Its body is now one host literal plus introspectSchema.call(host), marked [#25521 cut 4]. It drops async and returns the moved function's promise. The method has no docblock, at base or at head.
  • IntrospectionHost gains five members, each typed as the class member (an indexed access on SqlDriver): dialectName (read-only, a getter) and introspectColumns, introspectForeignKeys, introspectPrimaryKeys and introspectUniqueConstraints (late-bound closures). Cut 1's five member lines are unchanged. The moved function types its this as the Pick of the host over exactly the nine members its body reads. The generator measures those reads from the AST and asserts them, and the stub annotates its literal as the ThisParameterType of the moved function. There is no cast, and no member becomes public.
  • Module-level declarations. The body reads IntrospectedSchema and IntrospectedTable, which sql-driver.ts already exports, and postgresTableNameCollisionError, which only this body reads. That function stays in sql-driver.ts and gains a leading export. This is cut 2's shape, accepted there as option A: it moves only method bodies and keeps every path citation true. The value import is read only inside the function body, so the module cycle is evaluation-safe, as in cut 1. index.ts re-exports nothing new.
  • The move was produced by a script from the source text, not retyped. It took the method's parameter list, return type and body lines, re-indented two columns, except the 16 lines that continue one of the body's three multi-line SQL template literals. Those keep their bytes, because there the indentation is statement text (cut 1's rule).
  • Cut 1's module header gains prose describing this cut. The import comment in sql-driver.ts is re-worded to name introspectSchema. Both are comment-only.

The published .d.ts does not change

Under the series bar (ruling 6348891160, letter A), measured on base 6021b5e83 and on head f73c54587. Both were built against the same dependency tree. At base: turbo run build --filter=@objectstack/driver-turso... --filter=@objectstack/driver-sqlite-wasm..., 9/9 tasks, 0 cached, with the base sql-driver.ts and module restored into the worktree after the cut commit. At head: pnpm --filter @objectstack/driver-sql build.

  • This package emits dist/index.d.ts and dist/index.d.mts (there is no .d.cts). The two are identical to each other at both ends.
  • Raw sha256 of both files, base and head, all four the same: 93da45168e82136b7613944525e47402d5dc6f9f8daa9efa4bdceeaa11b52a89 (cuts 1-3's hash, unchanged). The raw diff is 0 lines.
  • Normalised with the ruling's one-liner verbatim (double-quoted unions): base = head = 93da45168e82136b7613944525e47402d5dc6f9f8daa9efa4bdceeaa11b52a89. The file has 0 double-quoted unions, so that normaliser rewrites nothing.
  • Normalised with the same one-liner, with each double quote in the regex swapped for a single quote (21 lines of the file carry a single-quoted union): base = head = 118e992ad8aad590044eb31509dca65e6b321e3410ce846e1e5f5dd34b956e95. The raw diff is 0 lines, so the proof rests on raw identity and neither normaliser is relied on.
  • Positive control on a copy of the head dist/index.d.ts, in the same block: line 5899, introspectSchema(): Promise...;, made protected. That gives raw and double-quote-normalised 402f862acf50c10714bd3aef080c5b397a15b9ef1712180ee86cf30a25e6709c, and single-quote-normalised e12430bcae9b43a1e4e9ff7914e5c12a534cc1765bc3c32a642a11977e4812ae. Each differs from the real hash.
  • Export tables: the ESM and CJS bundles each export the same 56 names at base and head, loaded at runtime (import() and require of the built bundles). The sorted list hashes to d61a9dd3a02661602b1bb2dbe18152ac43986148f36b2746f40c0884bd8ffdec on all four.
  • The head build carries the move: dist/index.mjs and dist/index.js each contain 15 host .call( sites (14 at base, plus this one).

No changeset: skip-changeset, per ruling 6348891160 item 4.

Proof of move-only

  • Body, by AST token (recursive getChildren leaves). The moved function's parameters (less the added this), return type and body have the same token sequence as the base method, and async matches. 567 tokens compared, 0 differ.
  • Lines: 104 lines compared, from the method's name to its closing brace. 87 are the base line with two leading spaces removed. 16 are byte-identical template-literal continuation lines. The first line is byte-identical once the added this parameter is removed.
  • Negative control: in a copy of the module, 'sqlite_%' becomes 'sqlite%' inside the SQLite arm's template literal. The check then reports 1 token and 1 line different, and it exits PROOF FAILED, exit 1.
  • Class side: 347 members at base and head. The 346 members that did not move are byte-identical to base, leading trivia included. The stub keeps its signature byte-identical, less async.
  • Top level of sql-driver.ts: 202 non-class statements at base and head. 200 are byte-identical, in order. postgresTableNameCollisionError is identical except for a leading export. The import from ./sql-driver-introspection.js gains exactly one specifier, introspectSchema, and its leading comment is re-worded.
  • The module: cut 1's five functions are byte-identical, leading trivia included. IntrospectionHost keeps all five of its member lines and gains the five above. The imports gain the type imports IntrospectedSchema and IntrospectedTable and the value import postgresTableNameCollisionError, and lose nothing. The module has no other statement.
  • Size: +165 / -113 over 2 files, far under the 3,000-line manual-merge line.

Readers of sql-driver.ts by path, checked against the moved text

None needed an edit. Each was read against the moved region (15825-15928) and run at both ends where it is a gate or test:

  • ADR anchors. scripts/adr-anchors/packages__drivers__driver-sql__src__sql-driver.ts.json carries ADR-0053 (formatOutput, presentReadValue) and ADR-0120 D4. Neither paragraph describes the moved body, so per card ask 3 no entry is owed. The moved body cites no ADR, and only issue numbers. listPhysicalColumns's docblock cites ADR-0131 D7, and it stays. check:adr-anchors: 85 anchored files at base and head. Decision-letter citations on the anchored surface: 1,847 at base and 1,847 at head.
  • Symbol anchors. docs/qa/platform-checklist/areas/integration-system.json names sql-driver.ts#introspectSchema as a source of one item. The method declaration is still in sql-driver.ts, so the anchor resolves. Its parenthetical, "SQLite branch reads sqlite_master", now describes a body one module over (see the acceptance notes). check:adr-symbol-anchors: 2,384 anchors resolve at both ends.
  • check:tenant-chokepoint. Rule 1 reads getBuilder bindings, and the moved text has none: 24 bindings across 3 files at both ends. Rule 2 visits every raw-family call in SCAN_FILES whose text says IS NULL against a tenant column. The moved body holds three such calls, all catalog listings (information_schema.tables, sqlite_master). None says IS NULL or names a tenant column. So rule 2's verdict is unchanged, but its inspected population in sql-driver.ts drops from 76 literal raw fragments to 73 (see the acceptance notes).
  • Logger receivers. The moved text reads no logger. check:logger-receiver-detach: 0 detaches at both ends.
  • Other source scans, none of whose patterns occurs in the moved text: logger-receiver-detach.test.ts ③, sql-driver-compile-refusal-seam.test.ts (no INVALID_FILTER builder; postgresTableNameCollisionError builds a RESOURCE_CONFLICT error and did not move), the five packages/cli generate-*.pin.test.ts files, check-keyed-text-bounds, check-object-def-param-keys.
  • Path lists and comment citations that name the file (turbo.json, scripts/cross-package-test-inputs.mjs, scripts/pm/check-half-states.mjs, scripts/check-changeset-no-major.mjs, packages/spec/liveness/*.json evidence). None reads the moved body. ADR-0015 lists sql-driver.ts (introspectSchema, …) among its files. That is still true of the method, and no docs/adr/** edit is made here.
  • check:driver-conformance at base and head: 55 covered, 0 in the DEBT ledger, 0 exempt, both times.

Verification

  • tsc --noEmit (driver-sql) exit 0. eslint --no-inline-config over packages/drivers/driver-sql/src (265 files, the new module included): 0 errors, 0 warnings.
  • packages/drivers/driver-sql suite: base 3,999 tests (3,787 passed, 0 failed, 212 skipped; 247 files), head the same. Compared per test name and status from vitest's JSON reporter: no test lost, none changed status, none added.
  • packages/drivers/driver-turso suite, against the rebuilt dist at each end: base 2,526 tests (2,492 passed, 0 failed, 34 skipped; 95 files), head the same. Per test name and status there is no difference (2,513 distinct names; 13 names repeat).
  • packages/drivers/driver-sqlite-wasm suite, against the rebuilt dist: base 704 tests (704 passed; 39 files), head the same, with no difference per test name.
  • dispatch-gates --commands on this diff, at head f73c54587: 55 derived commands, each run with its exit code. --ran reconciles 55 derived, 54 run, 1 NOT MEASURED, 0 unrun. The NOT MEASURED one is check:dual-build-cjs-loads (exit 3, PREREQUISITE NOT MET: it needs every package's dist), which CI runs. check:lean-entry-closure ran after objectql was built.
  • No reverse verification or ablation: the diff changes no tested behaviour.

Acceptance notes

  • check:tenant-chokepoint rule 2 reads 3 fewer raw fragments. SCAN_FILES names sql-driver.ts and not the seam modules, so rule 2 (no IS NULL arm on a tenant column) no longer visits the three catalog-listing knex.raw( calls that moved. None of the three is an arm on a tenant column today. A future edit that added one in the module would not be caught by rule 2. Cut 1 already moved 16 catalog raw fragments into this module the same way. Widening SCAN_FILES is a gate edit, and it is the open precondition the series carries for the getBuilder areas. It is not made here.
  • The platform-checklist source line (integration-system.json, "sql-driver.ts#introspectSchema (introspectSchema; SQLite branch reads sqlite_master …)") still resolves to the method, which still answers the same way. The SQLite branch it describes now lives in sql-driver-introspection.ts. The file is outside this claim's file surface, and a checklist item edit takes a history revision. So it is left as is and raised in the report as open question 2.
  • TursoDriver's introspectSchema override still calls super.introspectSchema(). That now returns the moved function's promise instead of an async method's promise. A caller awaits the same settlement.
  • Lines that continue a SQL template literal keep their base indentation inside the module, so they sit two columns deeper than the code around them. This is cut 1's rule: there the whitespace is statement text.

Generated by Claude Code

…ts into sql-driver-introspection.ts (#25521 cut 4)

Move-only. The body of SqlDriver#introspectSchema moves unedited into cut 1's
module and reaches the class through cut 1's IntrospectionHost, which gains
the five members the body reads that it did not list yet (dialectName as a
getter; introspectColumns, introspectForeignKeys, introspectPrimaryKeys and
introspectUniqueConstraints as late-bound closures). The method keeps its
name, signature and position. postgresTableNameCollisionError, read only by
this body, stays in sql-driver.ts and gains a leading export.
listPhysicalColumns stays in the class: its body is shorter than the host
literal a stub would need. sql-driver.ts goes from 21,678 to 21,595 lines.

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/driver-sql, touching 15 documentable anchor(s).

⛔ 3 release-owned page(s) name something this change touched. These are read-only:

  • content/docs/releases/v17/17-2.mdx (via introspectForeignKeys (symbol, a field of interface IntrospectionHost), introspectPrimaryKeys (symbol, a field of interface IntrospectionHost), introspectSchema (symbol, a method of class SqlDriver; a top-level function), introspectUniqueConstraints (symbol, a field of interface IntrospectionHost), introspectForeignKeys (literal, a string literal in introspectForeignKeys; a string literal in introspectSchema), introspectPrimaryKeys (literal, a string literal in introspectPrimaryKeys; a string literal in introspectSchema), introspectUniqueConstraints (literal, a string literal in introspectSchema; a string literal in introspectUniqueConstraints))
  • content/docs/releases/v18/18-0.mdx (via introspectSchema (symbol, a method of class SqlDriver; a top-level function))
  • content/docs/releases/v18/18-1.mdx (via introspectSchema (symbol, a method of class SqlDriver; a top-level function))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • the SDK route bridge reached 54 of 206 client-bound route-ledger rows — the other 152 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 152: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 97 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 13 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json b77bb37eb2c738c40093acb04f19fa8fc2dd605a → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 28b8198efaf7b8e62e40272e9b24088568ed083d — the merge of head f73c5458702810c5183e002ef92de7dd718362f2 into base b77bb37eb2c738c40093acb04f19fa8fc2dd605a, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 28b8198efaf7b8e62e40272e9b24088568ed083d && git checkout 28b8198efaf7b8e62e40272e9b24088568ed083d
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin b77bb37eb2c738c40093acb04f19fa8fc2dd605a f73c5458702810c5183e002ef92de7dd718362f2 && git checkout -B drift-repro b77bb37eb2c738c40093acb04f19fa8fc2dd605a && git merge --no-ff f73c5458702810c5183e002ef92de7dd718362f2

node scripts/docs-audit/affected-docs.mjs --json b77bb37eb2c738c40093acb04f19fa8fc2dd605a

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs b77bb37eb2c738c40093acb04f19fa8fc2dd605a → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT · domain:server seat 2 · sunhaolin · session_01JVTd3PprStGa26aez5omLB · 2026-10-24T17:41Z · head f73c545870 · claim 6386825345 · report 6387421024

  • Shape: draft, base main, author objectstack-fleet[bot], assignee sunhaolin, Part of #25521, no closing keyword, Clause-②: no, Metadata-protocol: none, skip-changeset (ruling 6348891160). 2 files in packages/drivers/driver-sql/src/; not governed; 278 changed lines.
  • Move-only, re-measured by the seat: introspectSchema's body at base (sql-driver.ts:15825, merge base 6021b5e837) against the module (sql-driver-introspection.ts:697): whitespace-insensitive comparison, identical (4,224 characters each). It joins cut 1's IntrospectionHost (five members added) rather than a second host.
  • Net-line rule (ACCEPT 6385306916): sql-driver.ts 21,678 → 21,595 (−83), measured by the seat on both trees. Holds.
  • Open question 1, option A accepted: listPhysicalColumns stays in the class; its 6-line body is shorter than its stub would be, the rule this series prices by.
  • Open question 2, option A accepted: the platform-checklist source anchor sql-driver.ts#introspectSchema still names the door, which did not move, and its claim stays true. No checklist edit in a move-only cut.
  • Noted, not owed here: check:tenant-chokepoint's SCAN_FILES does not list the seam modules (already the series card's carried precondition); its verdict is unchanged.
  • CI on head f73c545870 at this read: 19 success, 10 skipped, 12 in progress, 0 red. The seat lands when they conclude green.
  • Writes: mcp_calls 0; relay pr_create and the report comment.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 24, 2026 18:15
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 24, 2026
Merged via the queue into main with commit b179084 Oct 24, 2026
47 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-25521-sql-driver-cut-4 branch October 24, 2026 18:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants