Skip to content

Migrate record-update-link onto the record-mutation lifecycle driver#58

Merged
HynLcc merged 1 commit into
mainfrom
migrate-record-update-link-lifecycle
Jun 19, 2026
Merged

Migrate record-update-link onto the record-mutation lifecycle driver#58
HynLcc merged 1 commit into
mainfrom
migrate-record-update-link-lifecycle

Conversation

@HynLcc

@HynLcc HynLcc commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

What

Migrate the record-update-link runner kind (1 case:
record-update/1k-link-cells-bulk-update) onto the existing
record-mutation-lifecycle.ts driver, reusing it (5th member after
record-update / record-create / record-reorder / selection-clear).

record-update-link already had the family's exact execute shape — prepare → seedReady → trace-wrapped bulk update → folded post-op verify,
restore-or-delete cleanup, phases [prepare, <metric>, seedReady] — identical
to record-update. The legacy file just hand-rolled that protocol.

It is the first member whose fixture spans two tables (a host + linked
foreign pair). The driver already treats TFixture opaquely, so this needed
no driver code change — only relaxing the scope note's "single seeded
table" assumption. assertSeedReady stays defined (seed and execute both
assert the seed link permutation), so both modes route through one shared spec.

Mapping:

  • runMeasuredOperation resolves foreign ids (unmeasured setup) → trace-wrapped
    updateRecords + routing assertion + sample/full-scan verify, bundled into
    one primary measurement.
  • cleanup re-resolves foreignIdByTitle (cleanup is unmeasured) to restore
    the seed permutation, or drops both tables if restore fails.
  • buildResult already matched the driver arg shape; the spec delegates to it
    unchanged (dropping the unused windowId, no record window).

Verification (local, execute, v1+v2)

  • pnpm check green.
  • baseline A vs B (record-update-link): 2/2 pass, zero new diff masks.
  • G1 baseline vs candidate: 10/10 pass — record-update-link plus
    record-update / record-create / record-reorder / selection-clear regression
    (shared driver scope-note touched).
  • negative: perturbing phases[0].name, details.operation,
    routing.routeMatched, fullScan.scannedRecords, seed.ready.expectedTitle
    each fails the diff; a masked metric-value change still passes.
  • candidate artifacts: all 10 result=pass; record-update-link
    routeMatched=true, actualXTeableV2 matches engine,
    fullScan.scannedRecords == rowCount (1000), updatedRecords == 1000,
    bulkUpdate1kLinkCellsMs (2793ms v1 / 531ms v2) far below max 90000.

Protected surface

No changes to cases/**, registry.ts, framework/types.ts config interfaces,
framework/artifacts.ts, scripts/diff-artifacts.mjs, or ../teable-ee. Tracker
updated to 19/35 runner kinds · 23/55 cases.

🤖 Generated with Claude Code

record-update-link already had the record-mutation family's exact execute
shape — prepare -> seedReady -> trace-wrapped bulk update -> folded post-op
verify, restore-or-delete cleanup, phases [prepare, <metric>, seedReady] —
identical to record-update. It now rides record-mutation-lifecycle instead of
hand-rolling that protocol.

It is the first member whose fixture spans more than one table (a host +
linked foreign pair). The driver already treats the fixture opaquely, so this
required no driver code change — only relaxing the scope note's
"single seeded table" assumption. assertSeedReady stays defined (seed and
execute both assert the seed link permutation), so seed and execute route
through one shared spec, like record-update/create.

Mapping details:
- runMeasuredOperation resolves foreign ids (unmeasured), then runs the
  trace-wrapped updateRecords + routing assertion + sample/full-scan verify,
  bundled into one primary measurement.
- cleanup re-resolves foreignIdByTitle (cleanup is unmeasured) to restore the
  seed permutation, or drops both tables if restore fails.
- buildResult already matched the driver arg shape; the spec delegates to it
  unchanged (dropping the unused windowId).

Verification (local, execute, v1+v2):
- pnpm check green.
- baseline A vs B (record-update-link): 2/2 pass, zero new diff masks.
- G1 baseline vs candidate: 10/10 pass — record-update-link + record-update/
  record-create/record-reorder/selection-clear regression (shared driver
  scope-note touched).
- negative: phases[0].name / details.operation / routing.routeMatched /
  fullScan.scannedRecords / seed.ready.expectedTitle perturbations fail; masked
  metric value still passes.
- candidate artifacts: all 10 result=pass; record-update-link routeMatched=true,
  actualXTeableV2 matches engine, fullScan.scannedRecords==rowCount(1000),
  updatedRecords==1000, bulkUpdate1kLinkCellsMs far below max.

Tracker: 19/35 runner kinds, 23/55 cases.

Co-Authored-By: Claude <noreply@anthropic.com>
@HynLcc HynLcc merged commit 8744d39 into main Jun 19, 2026
6 checks passed
@HynLcc HynLcc deleted the migrate-record-update-link-lifecycle branch June 19, 2026 15:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant