Skip to content

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests - #13908

Merged
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget
Aug 31, 2026
Merged

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests#13908
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget

Conversation

@zhuangjianguo

@zhuangjianguozhuangjianguo commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Fixes#13688

The defect

Temporal Conformance (live PG + MySQL) reddens unrelated PRs — it surfaced on
#13685, whose entire diff is packages/plugins/plugin-auth/** + a changeset + one
docs page, touching no driver, no SQL, no schema-sync path.

The two it(...) blocks in
sql-driver-13056-orphan-shadow-column-cleanup.test.ts that read the live MySQL
catalog each drive 2-3 full new SqlDriver(...) -> initObjects(...) ->
disconnect() cycles against the live container, with no explicit timeout, so they
inherited vitest's 5000ms default. Both observed failures are timeouts, not
assertion failures
, and the service-container logs show no MySQL error — the DDL
that ran succeeded. This is not "raise a timeout to make a slow test pass": the
5000ms was never a chosen budget for 2-3 live connect/DDL/disconnect cycles plus
several information_schema reads — it's what a test gets by default when nobody
sets one. Four sibling files in this same package already carry explicit per-test
budgets (60_000 / 120_000 / 40_000 / 60_000); this file shipped with #13056's
fix without one.

The cost of this defect is not local — it reddens other people's PRs on a
package they never touched, so every timeout here is a repo-wide throughput tax
(ejected merge-queue attempts, wasted CI minutes), not a local annoyance. See #13767,
the automated queue-flake anchor for this exact file, ejected twice in 24h.

The fix

Both it(...) blocks get an explicit 60_000 budget — in line with 3 of the 4
sibling budgets in this package — with a one-line comment naming why (N live
round trips against MySQL), so the next reader does not delete it as noise.

git diff on packages/drivers/driver-sql/src/*.ts excluding this one test file is
empty — no production code, no assertion, and no control changed.

A2.1 — the acceptance control (actual cost against live MySQL)

NOT MEASURED. No live MySQL/PG container is reachable in this environment (the
Docker daemon is not running here — docker info fails with no such file or directory on the socket; no OS_TEST_MYSQL_URL/OS_TEST_POSTGRES_URL set; no
mysql/service listening on 3306/5432). Leaning on the structural argument instead:
timeout (not an assertion failure), no MySQL error in the logs, and four sibling
files in the same package already carrying comparable budgets for a comparable
number of live round trips.

A2.2 — sweep for the same shape elsewhere

Confirmed: only these two it(...) blocks in this file lacked a budget (both
now fixed). A package-wide sweep for the same shape (any it(...) nested in a
declareDialectCell(...) callback, still on vitest's inherited 5000ms default) found
9 more files, 37 more it(...) blocks with the identical gap. Per the dispatch
order's STOP condition 3 ("a package-wide re-budget is a different, larger
decision"), the fix here stays scoped to this one file; the sweep result is filed
as #13902 for a deliberate decision rather than folded into this PR.

A2.3 — no global testTimeout

Confirmed by reading packages/drivers/driver-sql/vitest.config.ts: no
testTimeout key anywhere in the test block. The two it(...) blocks really were
falling through to vitest's own default, not a repo-set global.

A2.4 — anchors re-located by quoted source

The card cites sql-driver-13056-orphan-shadow-column-cleanup.test.ts:499. Re-found
both it(...) blocks by their quoted titles rather than trusting the line number: the
first ("drops the orphaned generated column, and keeps the one still carrying a
constraint") is still at line 499 — no drift. The second ("converges — a second
detect finds neither the index nor an orphan column") is at line 555.

Tests

  • pnpm --filter @objectstack/driver-sql typecheck — PASS (exit 0), via
    scripts/pm/os-verify-lock.sh.
  • pnpm --filter @objectstack/driver-sql exec vitest run --maxWorkers=2 — PASS:
    147 passed | 9 skipped test files (156), 2252 passed | 132 skipped tests (2384).
    The target file alone (--reporter=verbose, single-file run): 12 passed | 1
    skipped — the whole live-MySQL describe block collapses to ONE named-skip
    test ("is provisioned — set OS_TEST_MYSQL_URL to run this cell"), so the two
    edited it(...) blocks did not individually execute here. All non-live cells
    run against embedded SQLite and execute fully. The MySQL/PG cells this PR
    touches cannot run here — no live MySQL/PG container in this environment
    (see A2.1), so declareDialectCell reports them as a named SKIP rather than a
    silent pass (see the file's own header comment on OS_TEST_MYSQL_URL /
    OS_EXPECT_LIVE_DIALECT_MATRIX). They will run for real in the Temporal Conformance (live PG + MySQL) CI job this PR exists to stop reddening.
  • Local gate family (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack,
    re-derived at HEAD fcc9ce8034 after git fetch origin main): 26 relevant
    families
    (22 path-matched + 4 more from the "edits a test file" convention
    trigger) — 23 PASS, 3 NOT MEASURED:
    • check:dual-build-cjs-loads, check:type-check-debt — need the FULL
      workspace built (pnpm build / turbo run build across all 78 packages),
      which is CI's own "Build Core" / debt-ledger scope, not warranted locally
      for a one-file test-only diff (driver-sql's own dependency closure was
      built and its tsc --noEmit passes clean).
    • check:test-completeness — by its own design, exits PREREQUISITE NOT MET
      without a saved turbo run test log; CI tees that log and passes it, this
      branch is unreachable there.
      None of the 23 that ran flagged anything in this diff. The dispatch-gates
      derivation itself carried a STALE-TREE warning (its own defining scripts had
      moved on origin/main by the time of the final re-run, in a repo with several
      other agents landing PRs concurrently) — re-running after git fetch origin main reproduced the identical 22-family path-matched list, so nothing was
      missed by the staleness.

No ablation

No ablation is meaningful here — there is no behaviour to neuter. The change is a
test-timing budget, not logic; there is nothing for a mutation to disprove that a
rebuild-and-rerun would show.

Changeset

skip-changeset — this PR's entire diff is one test file (a timeout budget +
explanatory comments); it publishes nothing from any package.


Generated by Claude Code

…13688)
Both it() blocks in sql-driver-13056-orphan-shadow-column-cleanup.test.ts
drive 2-3 full new SqlDriver() -> initObjects() -> disconnect() cycles
against the live MySQL cell with no explicit timeout, so they inherited
vitest's 5000ms default. Both observed CI failures were timeouts (no
MySQL error in the logs), and four sibling files in this package already
carry explicit per-test budgets. Give both an explicit 60_000 budget,
in line with 3 of the 4 siblings, with a one-line comment naming why.
No production code, assertion, or control changed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3jdziLbAPGeceVNmSox5L
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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.

Coarse fallback — 0 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 0c143ececbd5aa92c6edbf1d84bbf82668b585c9packageMentionDocs.

@zhuangjianguozhuangjianguo added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed size/s tests labels Aug 31, 2026 — with Claude
@zhuangjianguo
zhuangjianguo marked this pull request as ready for review August 31, 2026 17:03
@zhuangjianguo
zhuangjianguo added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit e4dc299Aug 31, 2026
46 checks passed
@zhuangjianguo
zhuangjianguo deleted the claude/issue-13688-orphan-shadow-test-budget branch August 31, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@zhuangjianguo@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests by zhuangjianguo · Pull Request #13908 · objectstack-ai/objectstack · GitHub
Skip to content

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests - #13908

Merged
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget
Aug 31, 2026
Merged

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests#13908
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget

Conversation

@zhuangjianguo

@zhuangjianguozhuangjianguo commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Fixes#13688

The defect

Temporal Conformance (live PG + MySQL) reddens unrelated PRs — it surfaced on
#13685, whose entire diff is packages/plugins/plugin-auth/** + a changeset + one
docs page, touching no driver, no SQL, no schema-sync path.

The two it(...) blocks in
sql-driver-13056-orphan-shadow-column-cleanup.test.ts that read the live MySQL
catalog each drive 2-3 full new SqlDriver(...) -> initObjects(...) ->
disconnect() cycles against the live container, with no explicit timeout, so they
inherited vitest's 5000ms default. Both observed failures are timeouts, not
assertion failures
, and the service-container logs show no MySQL error — the DDL
that ran succeeded. This is not "raise a timeout to make a slow test pass": the
5000ms was never a chosen budget for 2-3 live connect/DDL/disconnect cycles plus
several information_schema reads — it's what a test gets by default when nobody
sets one. Four sibling files in this same package already carry explicit per-test
budgets (60_000 / 120_000 / 40_000 / 60_000); this file shipped with #13056's
fix without one.

The cost of this defect is not local — it reddens other people's PRs on a
package they never touched, so every timeout here is a repo-wide throughput tax
(ejected merge-queue attempts, wasted CI minutes), not a local annoyance. See #13767,
the automated queue-flake anchor for this exact file, ejected twice in 24h.

The fix

Both it(...) blocks get an explicit 60_000 budget — in line with 3 of the 4
sibling budgets in this package — with a one-line comment naming why (N live
round trips against MySQL), so the next reader does not delete it as noise.

git diff on packages/drivers/driver-sql/src/*.ts excluding this one test file is
empty — no production code, no assertion, and no control changed.

A2.1 — the acceptance control (actual cost against live MySQL)

NOT MEASURED. No live MySQL/PG container is reachable in this environment (the
Docker daemon is not running here — docker info fails with no such file or directory on the socket; no OS_TEST_MYSQL_URL/OS_TEST_POSTGRES_URL set; no
mysql/service listening on 3306/5432). Leaning on the structural argument instead:
timeout (not an assertion failure), no MySQL error in the logs, and four sibling
files in the same package already carrying comparable budgets for a comparable
number of live round trips.

A2.2 — sweep for the same shape elsewhere

Confirmed: only these two it(...) blocks in this file lacked a budget (both
now fixed). A package-wide sweep for the same shape (any it(...) nested in a
declareDialectCell(...) callback, still on vitest's inherited 5000ms default) found
9 more files, 37 more it(...) blocks with the identical gap. Per the dispatch
order's STOP condition 3 ("a package-wide re-budget is a different, larger
decision"), the fix here stays scoped to this one file; the sweep result is filed
as #13902 for a deliberate decision rather than folded into this PR.

A2.3 — no global testTimeout

Confirmed by reading packages/drivers/driver-sql/vitest.config.ts: no
testTimeout key anywhere in the test block. The two it(...) blocks really were
falling through to vitest's own default, not a repo-set global.

A2.4 — anchors re-located by quoted source

The card cites sql-driver-13056-orphan-shadow-column-cleanup.test.ts:499. Re-found
both it(...) blocks by their quoted titles rather than trusting the line number: the
first ("drops the orphaned generated column, and keeps the one still carrying a
constraint") is still at line 499 — no drift. The second ("converges — a second
detect finds neither the index nor an orphan column") is at line 555.

Tests

  • pnpm --filter @objectstack/driver-sql typecheck — PASS (exit 0), via
    scripts/pm/os-verify-lock.sh.
  • pnpm --filter @objectstack/driver-sql exec vitest run --maxWorkers=2 — PASS:
    147 passed | 9 skipped test files (156), 2252 passed | 132 skipped tests (2384).
    The target file alone (--reporter=verbose, single-file run): 12 passed | 1
    skipped — the whole live-MySQL describe block collapses to ONE named-skip
    test ("is provisioned — set OS_TEST_MYSQL_URL to run this cell"), so the two
    edited it(...) blocks did not individually execute here. All non-live cells
    run against embedded SQLite and execute fully. The MySQL/PG cells this PR
    touches cannot run here — no live MySQL/PG container in this environment
    (see A2.1), so declareDialectCell reports them as a named SKIP rather than a
    silent pass (see the file's own header comment on OS_TEST_MYSQL_URL /
    OS_EXPECT_LIVE_DIALECT_MATRIX). They will run for real in the Temporal Conformance (live PG + MySQL) CI job this PR exists to stop reddening.
  • Local gate family (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack,
    re-derived at HEAD fcc9ce8034 after git fetch origin main): 26 relevant
    families
    (22 path-matched + 4 more from the "edits a test file" convention
    trigger) — 23 PASS, 3 NOT MEASURED:
    • check:dual-build-cjs-loads, check:type-check-debt — need the FULL
      workspace built (pnpm build / turbo run build across all 78 packages),
      which is CI's own "Build Core" / debt-ledger scope, not warranted locally
      for a one-file test-only diff (driver-sql's own dependency closure was
      built and its tsc --noEmit passes clean).
    • check:test-completeness — by its own design, exits PREREQUISITE NOT MET
      without a saved turbo run test log; CI tees that log and passes it, this
      branch is unreachable there.
      None of the 23 that ran flagged anything in this diff. The dispatch-gates
      derivation itself carried a STALE-TREE warning (its own defining scripts had
      moved on origin/main by the time of the final re-run, in a repo with several
      other agents landing PRs concurrently) — re-running after git fetch origin main reproduced the identical 22-family path-matched list, so nothing was
      missed by the staleness.

No ablation

No ablation is meaningful here — there is no behaviour to neuter. The change is a
test-timing budget, not logic; there is nothing for a mutation to disprove that a
rebuild-and-rerun would show.

Changeset

skip-changeset — this PR's entire diff is one test file (a timeout budget +
explanatory comments); it publishes nothing from any package.


Generated by Claude Code

…13688)
Both it() blocks in sql-driver-13056-orphan-shadow-column-cleanup.test.ts
drive 2-3 full new SqlDriver() -> initObjects() -> disconnect() cycles
against the live MySQL cell with no explicit timeout, so they inherited
vitest's 5000ms default. Both observed CI failures were timeouts (no
MySQL error in the logs), and four sibling files in this package already
carry explicit per-test budgets. Give both an explicit 60_000 budget,
in line with 3 of the 4 siblings, with a one-line comment naming why.
No production code, assertion, or control changed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3jdziLbAPGeceVNmSox5L
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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.

Coarse fallback — 0 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 0c143ececbd5aa92c6edbf1d84bbf82668b585c9packageMentionDocs.

@zhuangjianguozhuangjianguo added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed size/s tests labels Aug 31, 2026 — with Claude
@zhuangjianguo
zhuangjianguo marked this pull request as ready for review August 31, 2026 17:03
@zhuangjianguo
zhuangjianguo added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit e4dc299Aug 31, 2026
46 checks passed
@zhuangjianguo
zhuangjianguo deleted the claude/issue-13688-orphan-shadow-test-budget branch August 31, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@zhuangjianguo@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests by zhuangjianguo · Pull Request #13908 · objectstack-ai/objectstack · GitHub
Skip to content

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests - #13908

Merged
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget
Aug 31, 2026
Merged

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests#13908
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget

Conversation

@zhuangjianguo

@zhuangjianguozhuangjianguo commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Fixes#13688

The defect

Temporal Conformance (live PG + MySQL) reddens unrelated PRs — it surfaced on
#13685, whose entire diff is packages/plugins/plugin-auth/** + a changeset + one
docs page, touching no driver, no SQL, no schema-sync path.

The two it(...) blocks in
sql-driver-13056-orphan-shadow-column-cleanup.test.ts that read the live MySQL
catalog each drive 2-3 full new SqlDriver(...) -> initObjects(...) ->
disconnect() cycles against the live container, with no explicit timeout, so they
inherited vitest's 5000ms default. Both observed failures are timeouts, not
assertion failures
, and the service-container logs show no MySQL error — the DDL
that ran succeeded. This is not "raise a timeout to make a slow test pass": the
5000ms was never a chosen budget for 2-3 live connect/DDL/disconnect cycles plus
several information_schema reads — it's what a test gets by default when nobody
sets one. Four sibling files in this same package already carry explicit per-test
budgets (60_000 / 120_000 / 40_000 / 60_000); this file shipped with #13056's
fix without one.

The cost of this defect is not local — it reddens other people's PRs on a
package they never touched, so every timeout here is a repo-wide throughput tax
(ejected merge-queue attempts, wasted CI minutes), not a local annoyance. See #13767,
the automated queue-flake anchor for this exact file, ejected twice in 24h.

The fix

Both it(...) blocks get an explicit 60_000 budget — in line with 3 of the 4
sibling budgets in this package — with a one-line comment naming why (N live
round trips against MySQL), so the next reader does not delete it as noise.

git diff on packages/drivers/driver-sql/src/*.ts excluding this one test file is
empty — no production code, no assertion, and no control changed.

A2.1 — the acceptance control (actual cost against live MySQL)

NOT MEASURED. No live MySQL/PG container is reachable in this environment (the
Docker daemon is not running here — docker info fails with no such file or directory on the socket; no OS_TEST_MYSQL_URL/OS_TEST_POSTGRES_URL set; no
mysql/service listening on 3306/5432). Leaning on the structural argument instead:
timeout (not an assertion failure), no MySQL error in the logs, and four sibling
files in the same package already carrying comparable budgets for a comparable
number of live round trips.

A2.2 — sweep for the same shape elsewhere

Confirmed: only these two it(...) blocks in this file lacked a budget (both
now fixed). A package-wide sweep for the same shape (any it(...) nested in a
declareDialectCell(...) callback, still on vitest's inherited 5000ms default) found
9 more files, 37 more it(...) blocks with the identical gap. Per the dispatch
order's STOP condition 3 ("a package-wide re-budget is a different, larger
decision"), the fix here stays scoped to this one file; the sweep result is filed
as #13902 for a deliberate decision rather than folded into this PR.

A2.3 — no global testTimeout

Confirmed by reading packages/drivers/driver-sql/vitest.config.ts: no
testTimeout key anywhere in the test block. The two it(...) blocks really were
falling through to vitest's own default, not a repo-set global.

A2.4 — anchors re-located by quoted source

The card cites sql-driver-13056-orphan-shadow-column-cleanup.test.ts:499. Re-found
both it(...) blocks by their quoted titles rather than trusting the line number: the
first ("drops the orphaned generated column, and keeps the one still carrying a
constraint") is still at line 499 — no drift. The second ("converges — a second
detect finds neither the index nor an orphan column") is at line 555.

Tests

  • pnpm --filter @objectstack/driver-sql typecheck — PASS (exit 0), via
    scripts/pm/os-verify-lock.sh.
  • pnpm --filter @objectstack/driver-sql exec vitest run --maxWorkers=2 — PASS:
    147 passed | 9 skipped test files (156), 2252 passed | 132 skipped tests (2384).
    The target file alone (--reporter=verbose, single-file run): 12 passed | 1
    skipped — the whole live-MySQL describe block collapses to ONE named-skip
    test ("is provisioned — set OS_TEST_MYSQL_URL to run this cell"), so the two
    edited it(...) blocks did not individually execute here. All non-live cells
    run against embedded SQLite and execute fully. The MySQL/PG cells this PR
    touches cannot run here — no live MySQL/PG container in this environment
    (see A2.1), so declareDialectCell reports them as a named SKIP rather than a
    silent pass (see the file's own header comment on OS_TEST_MYSQL_URL /
    OS_EXPECT_LIVE_DIALECT_MATRIX). They will run for real in the Temporal Conformance (live PG + MySQL) CI job this PR exists to stop reddening.
  • Local gate family (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack,
    re-derived at HEAD fcc9ce8034 after git fetch origin main): 26 relevant
    families
    (22 path-matched + 4 more from the "edits a test file" convention
    trigger) — 23 PASS, 3 NOT MEASURED:
    • check:dual-build-cjs-loads, check:type-check-debt — need the FULL
      workspace built (pnpm build / turbo run build across all 78 packages),
      which is CI's own "Build Core" / debt-ledger scope, not warranted locally
      for a one-file test-only diff (driver-sql's own dependency closure was
      built and its tsc --noEmit passes clean).
    • check:test-completeness — by its own design, exits PREREQUISITE NOT MET
      without a saved turbo run test log; CI tees that log and passes it, this
      branch is unreachable there.
      None of the 23 that ran flagged anything in this diff. The dispatch-gates
      derivation itself carried a STALE-TREE warning (its own defining scripts had
      moved on origin/main by the time of the final re-run, in a repo with several
      other agents landing PRs concurrently) — re-running after git fetch origin main reproduced the identical 22-family path-matched list, so nothing was
      missed by the staleness.

No ablation

No ablation is meaningful here — there is no behaviour to neuter. The change is a
test-timing budget, not logic; there is nothing for a mutation to disprove that a
rebuild-and-rerun would show.

Changeset

skip-changeset — this PR's entire diff is one test file (a timeout budget +
explanatory comments); it publishes nothing from any package.


Generated by Claude Code

…13688)
Both it() blocks in sql-driver-13056-orphan-shadow-column-cleanup.test.ts
drive 2-3 full new SqlDriver() -> initObjects() -> disconnect() cycles
against the live MySQL cell with no explicit timeout, so they inherited
vitest's 5000ms default. Both observed CI failures were timeouts (no
MySQL error in the logs), and four sibling files in this package already
carry explicit per-test budgets. Give both an explicit 60_000 budget,
in line with 3 of the 4 siblings, with a one-line comment naming why.
No production code, assertion, or control changed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3jdziLbAPGeceVNmSox5L
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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.

Coarse fallback — 0 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 0c143ececbd5aa92c6edbf1d84bbf82668b585c9packageMentionDocs.

@zhuangjianguozhuangjianguo added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed size/s tests labels Aug 31, 2026 — with Claude
@zhuangjianguo
zhuangjianguo marked this pull request as ready for review August 31, 2026 17:03
@zhuangjianguo
zhuangjianguo added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit e4dc299Aug 31, 2026
46 checks passed
@zhuangjianguo
zhuangjianguo deleted the claude/issue-13688-orphan-shadow-test-budget branch August 31, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@zhuangjianguo@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests by zhuangjianguo · Pull Request #13908 · objectstack-ai/objectstack · GitHub
Skip to content

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests - #13908

Merged
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget
Aug 31, 2026
Merged

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests#13908
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget

Conversation

@zhuangjianguo

@zhuangjianguozhuangjianguo commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Fixes#13688

The defect

Temporal Conformance (live PG + MySQL) reddens unrelated PRs — it surfaced on
#13685, whose entire diff is packages/plugins/plugin-auth/** + a changeset + one
docs page, touching no driver, no SQL, no schema-sync path.

The two it(...) blocks in
sql-driver-13056-orphan-shadow-column-cleanup.test.ts that read the live MySQL
catalog each drive 2-3 full new SqlDriver(...) -> initObjects(...) ->
disconnect() cycles against the live container, with no explicit timeout, so they
inherited vitest's 5000ms default. Both observed failures are timeouts, not
assertion failures
, and the service-container logs show no MySQL error — the DDL
that ran succeeded. This is not "raise a timeout to make a slow test pass": the
5000ms was never a chosen budget for 2-3 live connect/DDL/disconnect cycles plus
several information_schema reads — it's what a test gets by default when nobody
sets one. Four sibling files in this same package already carry explicit per-test
budgets (60_000 / 120_000 / 40_000 / 60_000); this file shipped with #13056's
fix without one.

The cost of this defect is not local — it reddens other people's PRs on a
package they never touched, so every timeout here is a repo-wide throughput tax
(ejected merge-queue attempts, wasted CI minutes), not a local annoyance. See #13767,
the automated queue-flake anchor for this exact file, ejected twice in 24h.

The fix

Both it(...) blocks get an explicit 60_000 budget — in line with 3 of the 4
sibling budgets in this package — with a one-line comment naming why (N live
round trips against MySQL), so the next reader does not delete it as noise.

git diff on packages/drivers/driver-sql/src/*.ts excluding this one test file is
empty — no production code, no assertion, and no control changed.

A2.1 — the acceptance control (actual cost against live MySQL)

NOT MEASURED. No live MySQL/PG container is reachable in this environment (the
Docker daemon is not running here — docker info fails with no such file or directory on the socket; no OS_TEST_MYSQL_URL/OS_TEST_POSTGRES_URL set; no
mysql/service listening on 3306/5432). Leaning on the structural argument instead:
timeout (not an assertion failure), no MySQL error in the logs, and four sibling
files in the same package already carrying comparable budgets for a comparable
number of live round trips.

A2.2 — sweep for the same shape elsewhere

Confirmed: only these two it(...) blocks in this file lacked a budget (both
now fixed). A package-wide sweep for the same shape (any it(...) nested in a
declareDialectCell(...) callback, still on vitest's inherited 5000ms default) found
9 more files, 37 more it(...) blocks with the identical gap. Per the dispatch
order's STOP condition 3 ("a package-wide re-budget is a different, larger
decision"), the fix here stays scoped to this one file; the sweep result is filed
as #13902 for a deliberate decision rather than folded into this PR.

A2.3 — no global testTimeout

Confirmed by reading packages/drivers/driver-sql/vitest.config.ts: no
testTimeout key anywhere in the test block. The two it(...) blocks really were
falling through to vitest's own default, not a repo-set global.

A2.4 — anchors re-located by quoted source

The card cites sql-driver-13056-orphan-shadow-column-cleanup.test.ts:499. Re-found
both it(...) blocks by their quoted titles rather than trusting the line number: the
first ("drops the orphaned generated column, and keeps the one still carrying a
constraint") is still at line 499 — no drift. The second ("converges — a second
detect finds neither the index nor an orphan column") is at line 555.

Tests

  • pnpm --filter @objectstack/driver-sql typecheck — PASS (exit 0), via
    scripts/pm/os-verify-lock.sh.
  • pnpm --filter @objectstack/driver-sql exec vitest run --maxWorkers=2 — PASS:
    147 passed | 9 skipped test files (156), 2252 passed | 132 skipped tests (2384).
    The target file alone (--reporter=verbose, single-file run): 12 passed | 1
    skipped — the whole live-MySQL describe block collapses to ONE named-skip
    test ("is provisioned — set OS_TEST_MYSQL_URL to run this cell"), so the two
    edited it(...) blocks did not individually execute here. All non-live cells
    run against embedded SQLite and execute fully. The MySQL/PG cells this PR
    touches cannot run here — no live MySQL/PG container in this environment
    (see A2.1), so declareDialectCell reports them as a named SKIP rather than a
    silent pass (see the file's own header comment on OS_TEST_MYSQL_URL /
    OS_EXPECT_LIVE_DIALECT_MATRIX). They will run for real in the Temporal Conformance (live PG + MySQL) CI job this PR exists to stop reddening.
  • Local gate family (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack,
    re-derived at HEAD fcc9ce8034 after git fetch origin main): 26 relevant
    families
    (22 path-matched + 4 more from the "edits a test file" convention
    trigger) — 23 PASS, 3 NOT MEASURED:
    • check:dual-build-cjs-loads, check:type-check-debt — need the FULL
      workspace built (pnpm build / turbo run build across all 78 packages),
      which is CI's own "Build Core" / debt-ledger scope, not warranted locally
      for a one-file test-only diff (driver-sql's own dependency closure was
      built and its tsc --noEmit passes clean).
    • check:test-completeness — by its own design, exits PREREQUISITE NOT MET
      without a saved turbo run test log; CI tees that log and passes it, this
      branch is unreachable there.
      None of the 23 that ran flagged anything in this diff. The dispatch-gates
      derivation itself carried a STALE-TREE warning (its own defining scripts had
      moved on origin/main by the time of the final re-run, in a repo with several
      other agents landing PRs concurrently) — re-running after git fetch origin main reproduced the identical 22-family path-matched list, so nothing was
      missed by the staleness.

No ablation

No ablation is meaningful here — there is no behaviour to neuter. The change is a
test-timing budget, not logic; there is nothing for a mutation to disprove that a
rebuild-and-rerun would show.

Changeset

skip-changeset — this PR's entire diff is one test file (a timeout budget +
explanatory comments); it publishes nothing from any package.


Generated by Claude Code

…13688)
Both it() blocks in sql-driver-13056-orphan-shadow-column-cleanup.test.ts
drive 2-3 full new SqlDriver() -> initObjects() -> disconnect() cycles
against the live MySQL cell with no explicit timeout, so they inherited
vitest's 5000ms default. Both observed CI failures were timeouts (no
MySQL error in the logs), and four sibling files in this package already
carry explicit per-test budgets. Give both an explicit 60_000 budget,
in line with 3 of the 4 siblings, with a one-line comment naming why.
No production code, assertion, or control changed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3jdziLbAPGeceVNmSox5L
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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.

Coarse fallback — 0 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 0c143ececbd5aa92c6edbf1d84bbf82668b585c9packageMentionDocs.

@zhuangjianguozhuangjianguo added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed size/s tests labels Aug 31, 2026 — with Claude
@zhuangjianguo
zhuangjianguo marked this pull request as ready for review August 31, 2026 17:03
@zhuangjianguo
zhuangjianguo added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit e4dc299Aug 31, 2026
46 checks passed
@zhuangjianguo
zhuangjianguo deleted the claude/issue-13688-orphan-shadow-test-budget branch August 31, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@zhuangjianguo@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests by zhuangjianguo · Pull Request #13908 · objectstack-ai/objectstack · GitHub
Skip to content

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests - #13908

Merged
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget
Aug 31, 2026
Merged

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests#13908
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget

Conversation

@zhuangjianguo

@zhuangjianguozhuangjianguo commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Fixes#13688

The defect

Temporal Conformance (live PG + MySQL) reddens unrelated PRs — it surfaced on
#13685, whose entire diff is packages/plugins/plugin-auth/** + a changeset + one
docs page, touching no driver, no SQL, no schema-sync path.

The two it(...) blocks in
sql-driver-13056-orphan-shadow-column-cleanup.test.ts that read the live MySQL
catalog each drive 2-3 full new SqlDriver(...) -> initObjects(...) ->
disconnect() cycles against the live container, with no explicit timeout, so they
inherited vitest's 5000ms default. Both observed failures are timeouts, not
assertion failures
, and the service-container logs show no MySQL error — the DDL
that ran succeeded. This is not "raise a timeout to make a slow test pass": the
5000ms was never a chosen budget for 2-3 live connect/DDL/disconnect cycles plus
several information_schema reads — it's what a test gets by default when nobody
sets one. Four sibling files in this same package already carry explicit per-test
budgets (60_000 / 120_000 / 40_000 / 60_000); this file shipped with #13056's
fix without one.

The cost of this defect is not local — it reddens other people's PRs on a
package they never touched, so every timeout here is a repo-wide throughput tax
(ejected merge-queue attempts, wasted CI minutes), not a local annoyance. See #13767,
the automated queue-flake anchor for this exact file, ejected twice in 24h.

The fix

Both it(...) blocks get an explicit 60_000 budget — in line with 3 of the 4
sibling budgets in this package — with a one-line comment naming why (N live
round trips against MySQL), so the next reader does not delete it as noise.

git diff on packages/drivers/driver-sql/src/*.ts excluding this one test file is
empty — no production code, no assertion, and no control changed.

A2.1 — the acceptance control (actual cost against live MySQL)

NOT MEASURED. No live MySQL/PG container is reachable in this environment (the
Docker daemon is not running here — docker info fails with no such file or directory on the socket; no OS_TEST_MYSQL_URL/OS_TEST_POSTGRES_URL set; no
mysql/service listening on 3306/5432). Leaning on the structural argument instead:
timeout (not an assertion failure), no MySQL error in the logs, and four sibling
files in the same package already carrying comparable budgets for a comparable
number of live round trips.

A2.2 — sweep for the same shape elsewhere

Confirmed: only these two it(...) blocks in this file lacked a budget (both
now fixed). A package-wide sweep for the same shape (any it(...) nested in a
declareDialectCell(...) callback, still on vitest's inherited 5000ms default) found
9 more files, 37 more it(...) blocks with the identical gap. Per the dispatch
order's STOP condition 3 ("a package-wide re-budget is a different, larger
decision"), the fix here stays scoped to this one file; the sweep result is filed
as #13902 for a deliberate decision rather than folded into this PR.

A2.3 — no global testTimeout

Confirmed by reading packages/drivers/driver-sql/vitest.config.ts: no
testTimeout key anywhere in the test block. The two it(...) blocks really were
falling through to vitest's own default, not a repo-set global.

A2.4 — anchors re-located by quoted source

The card cites sql-driver-13056-orphan-shadow-column-cleanup.test.ts:499. Re-found
both it(...) blocks by their quoted titles rather than trusting the line number: the
first ("drops the orphaned generated column, and keeps the one still carrying a
constraint") is still at line 499 — no drift. The second ("converges — a second
detect finds neither the index nor an orphan column") is at line 555.

Tests

  • pnpm --filter @objectstack/driver-sql typecheck — PASS (exit 0), via
    scripts/pm/os-verify-lock.sh.
  • pnpm --filter @objectstack/driver-sql exec vitest run --maxWorkers=2 — PASS:
    147 passed | 9 skipped test files (156), 2252 passed | 132 skipped tests (2384).
    The target file alone (--reporter=verbose, single-file run): 12 passed | 1
    skipped — the whole live-MySQL describe block collapses to ONE named-skip
    test ("is provisioned — set OS_TEST_MYSQL_URL to run this cell"), so the two
    edited it(...) blocks did not individually execute here. All non-live cells
    run against embedded SQLite and execute fully. The MySQL/PG cells this PR
    touches cannot run here — no live MySQL/PG container in this environment
    (see A2.1), so declareDialectCell reports them as a named SKIP rather than a
    silent pass (see the file's own header comment on OS_TEST_MYSQL_URL /
    OS_EXPECT_LIVE_DIALECT_MATRIX). They will run for real in the Temporal Conformance (live PG + MySQL) CI job this PR exists to stop reddening.
  • Local gate family (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack,
    re-derived at HEAD fcc9ce8034 after git fetch origin main): 26 relevant
    families
    (22 path-matched + 4 more from the "edits a test file" convention
    trigger) — 23 PASS, 3 NOT MEASURED:
    • check:dual-build-cjs-loads, check:type-check-debt — need the FULL
      workspace built (pnpm build / turbo run build across all 78 packages),
      which is CI's own "Build Core" / debt-ledger scope, not warranted locally
      for a one-file test-only diff (driver-sql's own dependency closure was
      built and its tsc --noEmit passes clean).
    • check:test-completeness — by its own design, exits PREREQUISITE NOT MET
      without a saved turbo run test log; CI tees that log and passes it, this
      branch is unreachable there.
      None of the 23 that ran flagged anything in this diff. The dispatch-gates
      derivation itself carried a STALE-TREE warning (its own defining scripts had
      moved on origin/main by the time of the final re-run, in a repo with several
      other agents landing PRs concurrently) — re-running after git fetch origin main reproduced the identical 22-family path-matched list, so nothing was
      missed by the staleness.

No ablation

No ablation is meaningful here — there is no behaviour to neuter. The change is a
test-timing budget, not logic; there is nothing for a mutation to disprove that a
rebuild-and-rerun would show.

Changeset

skip-changeset — this PR's entire diff is one test file (a timeout budget +
explanatory comments); it publishes nothing from any package.


Generated by Claude Code

…13688)
Both it() blocks in sql-driver-13056-orphan-shadow-column-cleanup.test.ts
drive 2-3 full new SqlDriver() -> initObjects() -> disconnect() cycles
against the live MySQL cell with no explicit timeout, so they inherited
vitest's 5000ms default. Both observed CI failures were timeouts (no
MySQL error in the logs), and four sibling files in this package already
carry explicit per-test budgets. Give both an explicit 60_000 budget,
in line with 3 of the 4 siblings, with a one-line comment naming why.
No production code, assertion, or control changed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3jdziLbAPGeceVNmSox5L
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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.

Coarse fallback — 0 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 0c143ececbd5aa92c6edbf1d84bbf82668b585c9packageMentionDocs.

@zhuangjianguozhuangjianguo added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed size/s tests labels Aug 31, 2026 — with Claude
@zhuangjianguo
zhuangjianguo marked this pull request as ready for review August 31, 2026 17:03
@zhuangjianguo
zhuangjianguo added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit e4dc299Aug 31, 2026
46 checks passed
@zhuangjianguo
zhuangjianguo deleted the claude/issue-13688-orphan-shadow-test-budget branch August 31, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@zhuangjianguo@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests by zhuangjianguo · Pull Request #13908 · objectstack-ai/objectstack · GitHub
Skip to content

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests - #13908

Merged
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget
Aug 31, 2026
Merged

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests#13908
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget

Conversation

@zhuangjianguo

@zhuangjianguozhuangjianguo commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Fixes#13688

The defect

Temporal Conformance (live PG + MySQL) reddens unrelated PRs — it surfaced on
#13685, whose entire diff is packages/plugins/plugin-auth/** + a changeset + one
docs page, touching no driver, no SQL, no schema-sync path.

The two it(...) blocks in
sql-driver-13056-orphan-shadow-column-cleanup.test.ts that read the live MySQL
catalog each drive 2-3 full new SqlDriver(...) -> initObjects(...) ->
disconnect() cycles against the live container, with no explicit timeout, so they
inherited vitest's 5000ms default. Both observed failures are timeouts, not
assertion failures
, and the service-container logs show no MySQL error — the DDL
that ran succeeded. This is not "raise a timeout to make a slow test pass": the
5000ms was never a chosen budget for 2-3 live connect/DDL/disconnect cycles plus
several information_schema reads — it's what a test gets by default when nobody
sets one. Four sibling files in this same package already carry explicit per-test
budgets (60_000 / 120_000 / 40_000 / 60_000); this file shipped with #13056's
fix without one.

The cost of this defect is not local — it reddens other people's PRs on a
package they never touched, so every timeout here is a repo-wide throughput tax
(ejected merge-queue attempts, wasted CI minutes), not a local annoyance. See #13767,
the automated queue-flake anchor for this exact file, ejected twice in 24h.

The fix

Both it(...) blocks get an explicit 60_000 budget — in line with 3 of the 4
sibling budgets in this package — with a one-line comment naming why (N live
round trips against MySQL), so the next reader does not delete it as noise.

git diff on packages/drivers/driver-sql/src/*.ts excluding this one test file is
empty — no production code, no assertion, and no control changed.

A2.1 — the acceptance control (actual cost against live MySQL)

NOT MEASURED. No live MySQL/PG container is reachable in this environment (the
Docker daemon is not running here — docker info fails with no such file or directory on the socket; no OS_TEST_MYSQL_URL/OS_TEST_POSTGRES_URL set; no
mysql/service listening on 3306/5432). Leaning on the structural argument instead:
timeout (not an assertion failure), no MySQL error in the logs, and four sibling
files in the same package already carrying comparable budgets for a comparable
number of live round trips.

A2.2 — sweep for the same shape elsewhere

Confirmed: only these two it(...) blocks in this file lacked a budget (both
now fixed). A package-wide sweep for the same shape (any it(...) nested in a
declareDialectCell(...) callback, still on vitest's inherited 5000ms default) found
9 more files, 37 more it(...) blocks with the identical gap. Per the dispatch
order's STOP condition 3 ("a package-wide re-budget is a different, larger
decision"), the fix here stays scoped to this one file; the sweep result is filed
as #13902 for a deliberate decision rather than folded into this PR.

A2.3 — no global testTimeout

Confirmed by reading packages/drivers/driver-sql/vitest.config.ts: no
testTimeout key anywhere in the test block. The two it(...) blocks really were
falling through to vitest's own default, not a repo-set global.

A2.4 — anchors re-located by quoted source

The card cites sql-driver-13056-orphan-shadow-column-cleanup.test.ts:499. Re-found
both it(...) blocks by their quoted titles rather than trusting the line number: the
first ("drops the orphaned generated column, and keeps the one still carrying a
constraint") is still at line 499 — no drift. The second ("converges — a second
detect finds neither the index nor an orphan column") is at line 555.

Tests

  • pnpm --filter @objectstack/driver-sql typecheck — PASS (exit 0), via
    scripts/pm/os-verify-lock.sh.
  • pnpm --filter @objectstack/driver-sql exec vitest run --maxWorkers=2 — PASS:
    147 passed | 9 skipped test files (156), 2252 passed | 132 skipped tests (2384).
    The target file alone (--reporter=verbose, single-file run): 12 passed | 1
    skipped — the whole live-MySQL describe block collapses to ONE named-skip
    test ("is provisioned — set OS_TEST_MYSQL_URL to run this cell"), so the two
    edited it(...) blocks did not individually execute here. All non-live cells
    run against embedded SQLite and execute fully. The MySQL/PG cells this PR
    touches cannot run here — no live MySQL/PG container in this environment
    (see A2.1), so declareDialectCell reports them as a named SKIP rather than a
    silent pass (see the file's own header comment on OS_TEST_MYSQL_URL /
    OS_EXPECT_LIVE_DIALECT_MATRIX). They will run for real in the Temporal Conformance (live PG + MySQL) CI job this PR exists to stop reddening.
  • Local gate family (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack,
    re-derived at HEAD fcc9ce8034 after git fetch origin main): 26 relevant
    families
    (22 path-matched + 4 more from the "edits a test file" convention
    trigger) — 23 PASS, 3 NOT MEASURED:
    • check:dual-build-cjs-loads, check:type-check-debt — need the FULL
      workspace built (pnpm build / turbo run build across all 78 packages),
      which is CI's own "Build Core" / debt-ledger scope, not warranted locally
      for a one-file test-only diff (driver-sql's own dependency closure was
      built and its tsc --noEmit passes clean).
    • check:test-completeness — by its own design, exits PREREQUISITE NOT MET
      without a saved turbo run test log; CI tees that log and passes it, this
      branch is unreachable there.
      None of the 23 that ran flagged anything in this diff. The dispatch-gates
      derivation itself carried a STALE-TREE warning (its own defining scripts had
      moved on origin/main by the time of the final re-run, in a repo with several
      other agents landing PRs concurrently) — re-running after git fetch origin main reproduced the identical 22-family path-matched list, so nothing was
      missed by the staleness.

No ablation

No ablation is meaningful here — there is no behaviour to neuter. The change is a
test-timing budget, not logic; there is nothing for a mutation to disprove that a
rebuild-and-rerun would show.

Changeset

skip-changeset — this PR's entire diff is one test file (a timeout budget +
explanatory comments); it publishes nothing from any package.


Generated by Claude Code

…13688)
Both it() blocks in sql-driver-13056-orphan-shadow-column-cleanup.test.ts
drive 2-3 full new SqlDriver() -> initObjects() -> disconnect() cycles
against the live MySQL cell with no explicit timeout, so they inherited
vitest's 5000ms default. Both observed CI failures were timeouts (no
MySQL error in the logs), and four sibling files in this package already
carry explicit per-test budgets. Give both an explicit 60_000 budget,
in line with 3 of the 4 siblings, with a one-line comment naming why.
No production code, assertion, or control changed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3jdziLbAPGeceVNmSox5L
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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.

Coarse fallback — 0 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 0c143ececbd5aa92c6edbf1d84bbf82668b585c9packageMentionDocs.

@zhuangjianguozhuangjianguo added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed size/s tests labels Aug 31, 2026 — with Claude
@zhuangjianguo
zhuangjianguo marked this pull request as ready for review August 31, 2026 17:03
@zhuangjianguo
zhuangjianguo added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit e4dc299Aug 31, 2026
46 checks passed
@zhuangjianguo
zhuangjianguo deleted the claude/issue-13688-orphan-shadow-test-budget branch August 31, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@zhuangjianguo@claude
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests by zhuangjianguo · Pull Request #13908 · objectstack-ai/objectstack · GitHub
Skip to content

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests - #13908

Merged
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget
Aug 31, 2026
Merged

test(driver-sql): budget the #13056 live-MySQL orphan-shadow tests#13908
zhuangjianguo merged 1 commit into
mainfrom
claude/issue-13688-orphan-shadow-test-budget

Conversation

@zhuangjianguo

@zhuangjianguozhuangjianguo commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

Fixes#13688

The defect

Temporal Conformance (live PG + MySQL) reddens unrelated PRs — it surfaced on
#13685, whose entire diff is packages/plugins/plugin-auth/** + a changeset + one
docs page, touching no driver, no SQL, no schema-sync path.

The two it(...) blocks in
sql-driver-13056-orphan-shadow-column-cleanup.test.ts that read the live MySQL
catalog each drive 2-3 full new SqlDriver(...) -> initObjects(...) ->
disconnect() cycles against the live container, with no explicit timeout, so they
inherited vitest's 5000ms default. Both observed failures are timeouts, not
assertion failures
, and the service-container logs show no MySQL error — the DDL
that ran succeeded. This is not "raise a timeout to make a slow test pass": the
5000ms was never a chosen budget for 2-3 live connect/DDL/disconnect cycles plus
several information_schema reads — it's what a test gets by default when nobody
sets one. Four sibling files in this same package already carry explicit per-test
budgets (60_000 / 120_000 / 40_000 / 60_000); this file shipped with #13056's
fix without one.

The cost of this defect is not local — it reddens other people's PRs on a
package they never touched, so every timeout here is a repo-wide throughput tax
(ejected merge-queue attempts, wasted CI minutes), not a local annoyance. See #13767,
the automated queue-flake anchor for this exact file, ejected twice in 24h.

The fix

Both it(...) blocks get an explicit 60_000 budget — in line with 3 of the 4
sibling budgets in this package — with a one-line comment naming why (N live
round trips against MySQL), so the next reader does not delete it as noise.

git diff on packages/drivers/driver-sql/src/*.ts excluding this one test file is
empty — no production code, no assertion, and no control changed.

A2.1 — the acceptance control (actual cost against live MySQL)

NOT MEASURED. No live MySQL/PG container is reachable in this environment (the
Docker daemon is not running here — docker info fails with no such file or directory on the socket; no OS_TEST_MYSQL_URL/OS_TEST_POSTGRES_URL set; no
mysql/service listening on 3306/5432). Leaning on the structural argument instead:
timeout (not an assertion failure), no MySQL error in the logs, and four sibling
files in the same package already carrying comparable budgets for a comparable
number of live round trips.

A2.2 — sweep for the same shape elsewhere

Confirmed: only these two it(...) blocks in this file lacked a budget (both
now fixed). A package-wide sweep for the same shape (any it(...) nested in a
declareDialectCell(...) callback, still on vitest's inherited 5000ms default) found
9 more files, 37 more it(...) blocks with the identical gap. Per the dispatch
order's STOP condition 3 ("a package-wide re-budget is a different, larger
decision"), the fix here stays scoped to this one file; the sweep result is filed
as #13902 for a deliberate decision rather than folded into this PR.

A2.3 — no global testTimeout

Confirmed by reading packages/drivers/driver-sql/vitest.config.ts: no
testTimeout key anywhere in the test block. The two it(...) blocks really were
falling through to vitest's own default, not a repo-set global.

A2.4 — anchors re-located by quoted source

The card cites sql-driver-13056-orphan-shadow-column-cleanup.test.ts:499. Re-found
both it(...) blocks by their quoted titles rather than trusting the line number: the
first ("drops the orphaned generated column, and keeps the one still carrying a
constraint") is still at line 499 — no drift. The second ("converges — a second
detect finds neither the index nor an orphan column") is at line 555.

Tests

  • pnpm --filter @objectstack/driver-sql typecheck — PASS (exit 0), via
    scripts/pm/os-verify-lock.sh.
  • pnpm --filter @objectstack/driver-sql exec vitest run --maxWorkers=2 — PASS:
    147 passed | 9 skipped test files (156), 2252 passed | 132 skipped tests (2384).
    The target file alone (--reporter=verbose, single-file run): 12 passed | 1
    skipped — the whole live-MySQL describe block collapses to ONE named-skip
    test ("is provisioned — set OS_TEST_MYSQL_URL to run this cell"), so the two
    edited it(...) blocks did not individually execute here. All non-live cells
    run against embedded SQLite and execute fully. The MySQL/PG cells this PR
    touches cannot run here — no live MySQL/PG container in this environment
    (see A2.1), so declareDialectCell reports them as a named SKIP rather than a
    silent pass (see the file's own header comment on OS_TEST_MYSQL_URL /
    OS_EXPECT_LIVE_DIALECT_MATRIX). They will run for real in the Temporal Conformance (live PG + MySQL) CI job this PR exists to stop reddening.
  • Local gate family (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack,
    re-derived at HEAD fcc9ce8034 after git fetch origin main): 26 relevant
    families
    (22 path-matched + 4 more from the "edits a test file" convention
    trigger) — 23 PASS, 3 NOT MEASURED:
    • check:dual-build-cjs-loads, check:type-check-debt — need the FULL
      workspace built (pnpm build / turbo run build across all 78 packages),
      which is CI's own "Build Core" / debt-ledger scope, not warranted locally
      for a one-file test-only diff (driver-sql's own dependency closure was
      built and its tsc --noEmit passes clean).
    • check:test-completeness — by its own design, exits PREREQUISITE NOT MET
      without a saved turbo run test log; CI tees that log and passes it, this
      branch is unreachable there.
      None of the 23 that ran flagged anything in this diff. The dispatch-gates
      derivation itself carried a STALE-TREE warning (its own defining scripts had
      moved on origin/main by the time of the final re-run, in a repo with several
      other agents landing PRs concurrently) — re-running after git fetch origin main reproduced the identical 22-family path-matched list, so nothing was
      missed by the staleness.

No ablation

No ablation is meaningful here — there is no behaviour to neuter. The change is a
test-timing budget, not logic; there is nothing for a mutation to disprove that a
rebuild-and-rerun would show.

Changeset

skip-changeset — this PR's entire diff is one test file (a timeout budget +
explanatory comments); it publishes nothing from any package.


Generated by Claude Code

…13688)
Both it() blocks in sql-driver-13056-orphan-shadow-column-cleanup.test.ts
drive 2-3 full new SqlDriver() -> initObjects() -> disconnect() cycles
against the live MySQL cell with no explicit timeout, so they inherited
vitest's 5000ms default. Both observed CI failures were timeouts (no
MySQL error in the logs), and four sibling files in this package already
carry explicit per-test budgets. Give both an explicit 60_000 budget,
in line with 3 of the 4 siblings, with a one-line comment naming why.
No production code, assertion, or control changed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01F3jdziLbAPGeceVNmSox5L
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs.

What this run could not see
  • 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.

Coarse fallback — 0 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 0c143ececbd5aa92c6edbf1d84bbf82668b585c9packageMentionDocs.

@zhuangjianguozhuangjianguo added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed size/s tests labels Aug 31, 2026 — with Claude
@zhuangjianguo
zhuangjianguo marked this pull request as ready for review August 31, 2026 17:03
@zhuangjianguo
zhuangjianguo added this pull request to the merge queueAug 31, 2026
Merged via the queue into main with commit e4dc299Aug 31, 2026
46 checks passed
@zhuangjianguo
zhuangjianguo deleted the claude/issue-13688-orphan-shadow-test-budget branch August 31, 2026 17:27
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@zhuangjianguo@claude