You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Landing site — stated explicitly because this issue spans four files. The user-visible half lands in packages/rest/src/rest-server.ts and the leading home for the shared predicate is @objectstack/types (the body's own first candidate, and the one all four consumers already depend on). Both are in the domain:cli lane per the lane table (packages/rest, types). Verified on origin/main@2598216:
— MySQL's ER_DUP_ENTRY: Duplicate entry '…' for key '…' matches neither substring, so it never reaches the 409 branch.
⚠️Routing caveat, flagged rather than hidden. If the maintainer or the claiming dev prefers the route #5841 used — a named predicate under packages/metadata/errors, registered by name in scripts/check-durability-degradation-log-level.mjs — the shared-predicate half would land in domain:engine-core instead. The label follows the dominant landing site (the REST 409 mapping is the defect users hit, and it is unambiguously in this lane). If the route changes at implementation time, raise it as a mislabel rather than re-labelling in place — domain:* has a single producer.
Release board (target:v17). Criterion ②: UNIQUE_VIOLATION is a registered code in the public error-code ledger (packages/spec/src/api/error-code-ledger.zod.ts:117), and on MySQL deployments every unique-constraint conflict returns 500 INTERNAL_ERROR instead. A client cannot tell "this value already exists" from a server fault. The hole is invisible on SQLite and Postgres because their messages happen to hit the substrings, which is precisely why it survived. Boarding it; veto welcome.
Scope boundary — the queued item is the shared predicate + the MySQL 409 mapping. The body's second half (a structured export carrying the conflicting column name) is a new contract surface, not a bug fix, and is deliberately not in this scope. That is also what #5495's autonumber retry branch is waiting on; a cross-link is going onto #5495 rather than expanding this issue, so the two stay one-thing-one-entry.
Dedup. No other open issue or PR in the three repos owns unique-violation discrimination; #5495 (pm:queue, domain:engine-core, target:v17) references it only as a dependency. #5841 is the landed precedent for collapsing a dialect word-list into one named predicate — same shape, different predicate.
Claim: PM loop round 2 (domain:cli seat, 2026-08-08 shift)
Session: session_017uFVNMmTxLpmfQYiuKM1Yx
Branch: claude/issue-6250-unique-violation-predicate
Worktree: objectstack-issue-6250
Domain: domain:cli
File surface: packages/types/src/** (the shared predicate's landing site) + packages/rest/src/rest-server.ts + packages/rest/src/import-runner.ts + their tests + one .changeset/*.md. ⛔ EXPLICITLY EXCLUDED — other lanes' consumers: packages/services/service-messaging/** (domain:services) and packages/drivers/driver-sql/** (domain:drivers). See the scope ruling below. (Stop on breach; explain in the report.)
Serial constraints cleared: no dev in flight in this lane; no other issue in this batch touches packages/types or packages/rest; no open PR touches rest-server.ts or import-runner.ts. Container sizing: M, mode:subagent shared container.
Scope ruling — this card ships the user-visible half and stays in one lane. The full convergence named in the body spans four packages across three domains (types/rest here, service-messaging in domain:services, driver-sql in domain:drivers), which would make it a cross-domain single PR — the exception path, requiring a triage-seat designation this card does not carry. It does not need to be one PR: the defect a user hits today is MySQL unique violations returning 500 INTERNAL_ERROR instead of the contract's 409 UNIQUE_VIOLATION, and that is fixed entirely within this lane by introducing the named shared predicate and routing the REST mapping through it. Migrating the two out-of-lane consumers onto the same predicate is a follow-up filed per lane once the predicate exists — that is sequencing, which is the PM's call, and it keeps each seat editing its own packages.
Out of scope, and deliberately so: the structured conflict-column export the body raises. That is a new contract surface, the body itself says it should not be decided by a bug-fix card, and the 409 mapping does not need it. #5495's autonumber-retry branch does need it — so if this seat's fix makes that shape newly cheap, say so in the report and it becomes its own card rather than a rider.
Activity
claude commentedon Aug 7, 2026
Triage:
pm:queue+domain:cli+target:v17.Landing site — stated explicitly because this issue spans four files. The user-visible half lands in
packages/rest/src/rest-server.tsand the leading home for the shared predicate is@objectstack/types(the body's own first candidate, and the one all four consumers already depend on). Both are in thedomain:clilane per the lane table (packages/rest,types). Verified onorigin/main@2598216:— MySQL's
ER_DUP_ENTRY: Duplicate entry '…' for key '…'matches neither substring, so it never reaches the 409 branch.packages/metadata/errors, registered by name inscripts/check-durability-degradation-log-level.mjs— the shared-predicate half would land indomain:engine-coreinstead. The label follows the dominant landing site (the REST 409 mapping is the defect users hit, and it is unambiguously in this lane). If the route changes at implementation time, raise it as a mislabel rather than re-labelling in place —domain:*has a single producer.Release board (
target:v17). Criterion ②:UNIQUE_VIOLATIONis a registered code in the public error-code ledger (packages/spec/src/api/error-code-ledger.zod.ts:117), and on MySQL deployments every unique-constraint conflict returns500 INTERNAL_ERRORinstead. A client cannot tell "this value already exists" from a server fault. The hole is invisible on SQLite and Postgres because their messages happen to hit the substrings, which is precisely why it survived. Boarding it; veto welcome.Scope boundary — the queued item is the shared predicate + the MySQL 409 mapping. The body's second half (a structured export carrying the conflicting column name) is a new contract surface, not a bug fix, and is deliberately not in this scope. That is also what #5495's autonumber retry branch is waiting on; a cross-link is going onto #5495 rather than expanding this issue, so the two stay one-thing-one-entry.
Dedup. No other open issue or PR in the three repos owns unique-violation discrimination; #5495 (
pm:queue,domain:engine-core,target:v17) references it only as a dependency. #5841 is the landed precedent for collapsing a dialect word-list into one named predicate — same shape, different predicate.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
os-project-manager commentedon Aug 8, 2026
Claim: PM loop round 2 (domain:cli seat, 2026-08-08 shift)
Session:
session_017uFVNMmTxLpmfQYiuKM1YxBranch:
claude/issue-6250-unique-violation-predicateWorktree:
objectstack-issue-6250Domain:
domain:cliFile surface:
packages/types/src/**(the shared predicate's landing site) +packages/rest/src/rest-server.ts+packages/rest/src/import-runner.ts+ their tests + one.changeset/*.md. ⛔ EXPLICITLY EXCLUDED — other lanes' consumers:packages/services/service-messaging/**(domain:services) andpackages/drivers/driver-sql/**(domain:drivers). See the scope ruling below. (Stop on breach; explain in the report.)Serial constraints cleared: no dev in flight in this lane; no other issue in this batch touches
packages/typesorpackages/rest; no open PR touchesrest-server.tsorimport-runner.ts. Container sizing: M,mode:subagentshared container.Scope ruling — this card ships the user-visible half and stays in one lane. The full convergence named in the body spans four packages across three domains (
types/resthere,service-messagingindomain:services,driver-sqlindomain:drivers), which would make it a cross-domain single PR — the exception path, requiring a triage-seat designation this card does not carry. It does not need to be one PR: the defect a user hits today is MySQL unique violations returning 500INTERNAL_ERRORinstead of the contract's 409UNIQUE_VIOLATION, and that is fixed entirely within this lane by introducing the named shared predicate and routing the REST mapping through it. Migrating the two out-of-lane consumers onto the same predicate is a follow-up filed per lane once the predicate exists — that is sequencing, which is the PM's call, and it keeps each seat editing its own packages.Out of scope, and deliberately so: the structured conflict-column export the body raises. That is a new contract surface, the body itself says it should not be decided by a bug-fix card, and the 409 mapping does not need it. #5495's autonumber-retry branch does need it — so if this seat's fix makes that shape newly cheap, say so in the report and it becomes its own card rather than a rider.
Generated by Claude Code
fix(types): teach the internal-leak predicate MySQL's three error tem…