Skip to content

build(deps): bump @antelopejs/tooling-configs to 0.5.1 - #156

Merged
Upd4ting merged 1 commit into
mainfrom
build/tooling-configs-0.5.1
Nov 10, 2026
Merged

Upd4ting merged 1 commit into
mainfrom
build/tooling-configs-0.5.1

Conversation

@Upd4ting

@Upd4ting Upd4ting commented Nov 10, 2026 •

Copy link
Copy Markdown
Member

Why

The goal is to put dms-database on @antelopejs/tooling-configs 0.5.1 and have it pass cleanly, not only carry the new version number (ANT-1850, parent ANT-1840).

0.5.1 adds antelopejs/no-read-then-insert (tooling-configs#287). It reported 6 seed functions that count a table and then insert into it if the table is empty. Two replicas that both start on an empty table both insert, and one of them fails on the duplicate _id. Every seeded row already has a stable _id, so each of those inserts now upserts with { conflict: "update" }. The count guard stays, so a seed still writes once and rows edited during a verify run survive a restart. A racing replica writes the same rows. seedVault also writes 3 more tables after its guarded read, and those inserts upsert too, since they race the same way.

0.5.1 also relaxes no-inherited-key-lookup (#291). This repo has no directive or config entry for that rule, so there is no suppression to remove.

Changes

  • package.json and pnpm-lock.yaml move @antelopejs/tooling-configs to ^0.5.1 (resolved 0.5.1).
  • pnpm run sync rewrote the guardrail table in AGENTS.md. It adds the new rule's row, and the three skipLibCheck and typecheck rows are now enforced by antelopejs-sync --check.
  • The seed inserts upsert in playground/src/shop-schema.ts and in .agents/skills/verify-dms-database/playground/src/{shop-schema,browse-fixtures,metrics-schema,bridge-schema,vault-schema}.ts. Lint also reported the same files under .claude/skills/..., which is a symlink to .agents/skills/....

No change touches src/, frontend-vue/ or the published files. Nothing touches auth, roles, tenancy, stored schema or the interface-dms contract.

Proof

Before: origin/main with only the version bumped

pnpm run sync:check:

> antelopejs-sync --check

Drift: AGENTS.md; run antelopejs-sync
 ELIFECYCLE  Command failed with exit code 1.

pnpm run checks (failing steps; Node's MODULE_TYPELESS warning lines removed):

[lint]

> @antelopejs/dms-database@0.4.3 lint <repo>
> oxlint && pnpm --dir frontend-vue lint && node scripts/check-sources.mts && antelopejs-check-interface-ranges && node node_modules/@antelopejs/dms/frontend-vue/scripts/check-api-error-presentation.mjs frontend-vue/app

.agents/skills/verify-dms-database/playground/src/browse-fixtures.ts:19:9: error antelopejs(no-read-then-insert): `accounts` is read and then inserted into. Two replicas that start on an empty table both read nothing and both insert, so one writes a duplicate row or fails on the key. Key the row by a stable id, wrap the insert in try/catch, read the row back in the catch, and rethrow only when it is still missing, or upsert with `insert(row, { conflict: "update" })`.
.claude/skills/verify-dms-database/playground/src/browse-fixtures.ts:19:9: error antelopejs(no-read-then-insert): `accounts` is read and then inserted into. Two replicas that start on an empty table both read nothing and both insert, so one writes a duplicate row or fails on the key. Key the row by a stable id, wrap the insert in try/catch, read the row back in the catch, and rethrow only when it is still missing, or upsert with `insert(row, { conflict: "update" })`.
.claude/skills/verify-dms-database/playground/src/metrics-schema.ts:39:9: error antelopejs(no-read-then-insert): `readings` is read and then inserted into. Two replicas that start on an empty table both read nothing and both insert, so one writes a duplicate row or fails on the key. Key the row by a stable id, wrap the insert in try/catch, read the row back in the catch, and rethrow only when it is still missing, or upsert with `insert(row, { conflict: "update" })`.
.agents/skills/verify-dms-database/playground/src/metrics-schema.ts:39:9: error antelopejs(no-read-then-insert): `readings` is read and then inserted into. Two replicas that start on an empty table both read nothing and both insert, so one writes a duplicate row or fails on the key. Key the row by a stable id, wrap the insert in try/catch, read the row back in the catch, and rethrow only when it is still missing, or upsert with `insert(row, { conflict: "update" })`.
.agents/skills/verify-dms-database/playground/src/bridge-schema.ts:105:9: error antelopejs(no-read-then-insert): `members` is read and then inserted into. Two replicas that start on an empty table both read nothing and both insert, so one writes a duplicate row or fails on the key. Key the row by a stable id, wrap the insert in try/catch, read the row back in the catch, and rethrow only when it is still missing, or upsert with `insert(row, { conflict: "update" })`.
.claude/skills/verify-dms-database/playground/src/bridge-schema.ts:105:9: error antelopejs(no-read-then-insert): `members` is read and then inserted into. Two replicas that start on an empty table both read nothing and both insert, so one writes a duplicate row or fails on the key. Key the row by a stable id, wrap the insert in try/catch, read the row back in the catch, and rethrow only when it is still missing, or upsert with `insert(row, { conflict: "update" })`.
.claude/skills/verify-dms-database/playground/src/vault-schema.ts:84:9: error antelopejs(no-read-then-insert): `notes` is read and then inserted into. Two replicas that start on an empty table both read nothing and both insert, so one writes a duplicate row or fails on the key. Key the row by a stable id, wrap the insert in try/catch, read the row back in the catch, and rethrow only when it is still missing, or upsert with `insert(row, { conflict: "update" })`.
.agents/skills/verify-dms-database/playground/src/shop-schema.ts:159:9: error antelopejs(no-read-then-insert): `target` is read and then inserted into. Two replicas that start on an empty table both read nothing and both insert, so one writes a duplicate row or fails on the key. Key the row by a stable id, wrap the insert in try/catch, read the row back in the catch, and rethrow only when it is still missing, or upsert with `insert(row, { conflict: "update" })`.
.claude/skills/verify-dms-database/playground/src/shop-schema.ts:159:9: error antelopejs(no-read-then-insert): `target` is read and then inserted into. Two replicas that start on an empty table both read nothing and both insert, so one writes a duplicate row or fails on the key. Key the row by a stable id, wrap the insert in try/catch, read the row back in the catch, and rethrow only when it is still missing, or upsert with `insert(row, { conflict: "update" })`.
.agents/skills/verify-dms-database/playground/src/vault-schema.ts:84:9: error antelopejs(no-read-then-insert): `notes` is read and then inserted into. Two replicas that start on an empty table both read nothing and both insert, so one writes a duplicate row or fails on the key. Key the row by a stable id, wrap the insert in try/catch, read the row back in the catch, and rethrow only when it is still missing, or upsert with `insert(row, { conflict: "update" })`.
playground/src/shop-schema.ts:159:9: error antelopejs(no-read-then-insert): `target` is read and then inserted into. Two replicas that start on an empty table both read nothing and both insert, so one writes a duplicate row or fails on the key. Key the row by a stable id, wrap the insert in try/catch, read the row back in the catch, and rethrow only when it is still missing, or upsert with `insert(row, { conflict: "update" })`.
 ELIFECYCLE  Command failed with exit code 1.

[sync:check]

> @antelopejs/dms-database@0.4.3 sync:check <repo>
> antelopejs-sync --check

Drift: AGENTS.md; run antelopejs-sync
 ELIFECYCLE  Command failed with exit code 1.
Checks: 10 passed, 2 failed.
 ELIFECYCLE  Command failed with exit code 1.
exit 1

After: this branch

pnpm run sync:check:

> antelopejs-sync --check

Guardrails are in sync.

pnpm run checks:

> antelopejs-checks

Checks: 12 passed, 0 failed.

Playground (pnpm --dir playground install --ignore-workspace --frozen-lockfile && pnpm --dir playground build): exits 0.

Verify layer

dms-control plan --base origin/main gives run: ["smoke", "package"]. Both journeys PASS. dms-control verdict --pr 156 at head 5db7c30 gives Verify: PASS+NOTES. The notes are the skill's standing "Not driven" list, plus the two-replica race, which needs a second backend the run does not start. The smoke journey's health response shows the upserting seeds wrote each row once: metrics.readings 1250, shop.products 6, vault.accounts 2.

dms-control doors gives One-way-door: contract, publish, and both name package.json. Only a devDependency moved there. The package journey shows the tarball still holds every path the manifest names.

flowchart LR
  A[backend start] --> B{"table.count() > 0"}
  B -- yes --> C[skip]
  B -- no --> D["insert(rows, { conflict: 'update' })"]
  D --> E[same rows whichever replica wins]
Loading

Seed inserts in the playground and the verify playground now upsert by their stable _id, which satisfies antelopejs/no-read-then-insert: two replicas that both find an empty table write the same rows instead of failing on the key.
@Upd4ting
Upd4ting merged commit cf3b1b4 into main Nov 10, 2026
11 checks passed
@Upd4ting
Upd4ting deleted the build/tooling-configs-0.5.1 branch November 10, 2026 17:48
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