Skip to content

metadata: DatabaseLoader is locale-blind for a bundled type, so saving one locale of an email template overwrites another locale's row in the same (package, name) slot #32422

Closed

Description

@objectstack-fleet

domain:server#7 · os-justin · session_01QSeKYm8sWjp2Pk76warN7w

Child of the ADR-0150 epic #31527. This defect was measured by the #31699 dev in round 4 of PR #32214 (report 6795944262, out-of-scope finding, class a). It already exists on main; #32214 does not introduce it.

Where. In packages/metadata/src/loaders/database-loader.ts, baseFilter has no bundle_member, so save and the single-package registerRollback target the first row of the name's (package, name) slot, whatever its locale.

What happens. Measured probe: a save of fr-FR into a slot that holds en-US overwrote the en-US row. The rows went from [[A,null,en-US,1],[A,fr-FR,fr-FR,2]] to [[A,null,fr-FR,3],[A,fr-FR,fr-FR,2]]. The same happens on main through the name's first row. email_template is the only bundled type today.

Do:

  1. Measure on main once feat(objectql)!: email template names held per namespace, a send resolves its template from its package, and ?package= reads an email template exactly (ADR-0150 child B, webhook family 1/3) #32214 lands:
    • a save of each locale of a two-locale bundle;
    • a rollback of each locale.
  2. Make save / registerRollback target the member's row: (package, name, bundle_member), with the canonical member stored as NULL (overlayMemberValue).
  3. Pin that each locale saves and rolls back alone and that the other locale is untouched. Ablate once.

Serial: after #32214, which fixes the read half (loadMany / loadManyKeyed keep every member) under the epic ruling on that PR.
Clause-②: the claimer declares it.
Business reason: editing one language of an email template silently destroys another language's customization.

Dedupe (DatabaseLoader bundle_member locale overwrite, email_template save loses locale): none found.

Activity

  1. added
    bugSomething isn't working
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iterate
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Nov 11, 2026
  2. objectstack-fleet commented on Nov 11, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: finding promoted → domain:server · p1 · pm:blocked · 2026-11-11T12:56Z

    Blocked-by: #32214

    ⛔ Not a claim.


    Generated by Claude Code

  3. added
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    priority:p1High: required for production / M2
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 11, 2026
  4. objectstack-fleet commented on Nov 11, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#1 · os-justin · session_01QSeKYm8sWjp2Pk76warN7w

    Epic note · 2026-11-11T14:52Z. This card's fix is pulled into PR #32214 (#31699) by epic ruling 6799056319. The boot priming pass on that head reaches the locale-blind save on every eager boot, so the save is made member-aware there, and the PR carries Fixes #32422. ⛔ Do not claim this card separately.

  5. objectstack-fleet commented on Nov 11, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#1 · os-justin · session_01QSeKYm8sWjp2Pk76warN7w

    Claim: epic seat, pulled into PR #32214 by epic ruling 6799056319
    Session: session_01QSeKYm8sWjp2Pk76warN7w
    Account: os-justin
    Branch: claude/project-thread-3giljf
    Worktree: objectstack-issue-31699
    Domain: domain:server
    Seat: epic:#31527#1
    File surface: packages/metadata/src/loaders/database-loader.ts (save, slottedSaveTarget) and its tests, inside PR #32214 (#31699 PR 1 of 3). Stop on breach; explain in the report.
    Container & model: M, mode:subagent, model: opus, effort: high
    Clause-②: yes (narrowing)
    Metadata-protocol: narrowed
    Responsibility: n/a — ADR-0150 child, carried by #31699's PR
    Thread-read: 6799089061
    Premise: holds (a save of fr-FR into a slot that holds en-US overwrote the en-US row at f9f589da, measured in the round-6 before-state of report 6801182598; seat reading 2026-11-11T16:30Z)
    Serial constraints cleared: #32214's own round 6 carries the fix; Fixes #32422 sits in that PR's body

    Dispatched 2026-11-11T16:30Z.

  6. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 11, 2026
  7. objectstack-fleet commented on Nov 11, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#1 · os-bill · session_01Utp6CYGYEUhpi29FpjLmxT

    Takeover · #32422 · 2026-11-11T21:11Z (execution-duties.md 认领节, four parts)

    ① Release: claim 6801374615 · session_01QSeKYm8sWjp2Pk76warN7w (os-justin). Order: the maintainer, in his project thread, 2026-11-11, verbatim 「前任 justin 没token了,他的工作你都接手」. Seat take-over of epic:#31527#1 is on #31527.

    ② Assignee: os-justin → os-bill, in this same write.

    ③
    Claim: epic seat take-over, PR #32214 round 7 resume (epic ruling 6801410166)
    Session: session_01Utp6CZu9RRx2o8sFUUpEPU
    Account: os-bill
    Branch: claude/project-thread-t7jkiz (pushes to claude/project-thread-3giljf first so PR #32214 keeps its history; if refused, a draft PR from this branch supersedes #32214)
    Worktree: objectstack-issue-31699
    Domain: domain:server
    Seat: epic:#31527#1
    File surface: packages/metadata/src/loaders/database-loader.ts (save, slottedSaveTarget) and its tests, inside PR #32214 (#31699 PR 1 of 3). Stop on breach; explain in the report.
    Container & model: M, mode:thread, model: opus, effort: xhigh
    Clause-②: yes (narrowing)
    Metadata-protocol: narrowed
    Responsibility: n/a — ADR-0150 child, carried by #31699's PR
    Thread-read: 6801374615
    Premise: holds (ruling 6801410166 on PR #32214 at cfb8f300; round 7 is unverified)
    Serial constraints cleared: #32327 (#32183), #32407 and #32408 wait for this PR; no live claim names these files
    Resume-from: claude/project-thread-3giljf@74a7e4cb6a

    ④ Hand-over: the last pushed sha on claude/project-thread-3giljf is 74a7e4cb6a (round 7 commit 0f93f8f133 answering ruling 6801410166, then a main merge). No round-7 report and no gate run exist for it; the new dev verifies it against the ruling's four pins, ablates once, and reports.


    Generated by Claude Code

  8. added
    pm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-set
    on Nov 12, 2026
  9. objectstack-fleet commented on Nov 12, 2026

    @objectstack-fleet
    ContributorAuthor

    epic:#31527#1 · os-bill · session_01Utp6CYGYEUhpi29FpjLmxT

    Closed by PR #32214 (merged 2026-11-12 03:12:44Z, f56354c2cd) through its Fixes line. This removes the pm:dispatched and pm:blocking state labels. Carried on: R7-C (stale stored body beats a fresh file after an edit), plus the follow-ups N9 / R8-A → #32488 and #32517, and the bundle-member keying in migrate → #32489. All are #31527 sub-issues, now in flight with the epic seats.

  10. removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    pm:blockingDerived cache from the Blocked-by reverse index: open card with open dependents — never hand-set
    on Nov 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratebugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p1High: required for production / M2

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions