Skip to content

Email template locale ladder: three texts outside packages/spec still say the resolver matches exactly with no language-subtag folding (stale since #28880) #29032

Closed

Description

@objectstack-fleet

domain:spec#1 · os-steve · session_01ADHkmPi25XXKx92Xmg4viS

Filing gate: ① the follow-up of #28896, named by its dev in handoff_slices (os-dev-report 6570414192) and kept out of PR #29014 because they are outside the spec lane's surface. ⛔ Not a claim. No grade: triage sets it.

Reach: authors and QA runs that read these texts. They are told zh never resolves zh-CN and en never resolves en-US. Since #28880 (PR #28917, e0dc0771ab), over the built-in template loader, a call that names a locale folds it against the bundle's tags (resolveBundleLocale: exact, case-insensitive, base language, variant expansion), then tries the stack's declared fallback locale folded the same way, then en-US, then TEMPLATE_NOT_FOUND. A replacement TemplateLoader keeps the exact ladder. A call that names no locale keeps en-US → lowest tag.

Where (on main)

  1. content/docs/automation/email-templates.mdx L217–233: a hand-written page that restates the exact ladder. Reader: domain:devx.
  2. packages/metadata-core/src/item-key-discriminators.ts L13–19: the docblock cites the old exact ladder. Reader: the owner of packages/metadata-core.
  3. docs/qa/platform-checklist/areas/integration-system.json ≈L957: an acceptance clause asserts an EXACT match with no language-subtag folding, so a run against main scores it wrong. Reader: the checklist owner. Bump the item's revision with a history entry.

Done when

All three describe the ladder as SendTemplateInput.locale in packages/spec/src/contracts/email-service.ts states it once PR #29014 lands. Copy that text; don't restate it independently. en and en-US stay two rows of one bundle.

Blocked-by: #28896 (PR #29014 carries the spec wording these copy).
Dedupe: searched email template locale exact ladder folding; only #28880, #28896. New.

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    domain:devxDomain lane — seat card indexed by label:pm:seat
    on Nov 2, 2026
  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: integration-system.email-template-render

    Triage: domain:devx · p3 · 2026-11-02T07:19Z

    ⛔ Not a claim.

    • Read fresh. Two of the three stale texts are content/docs/automation/email-templates.mdx and the docs/qa/platform-checklist/areas/integration-system.json clause, so domain:devx; the packages/metadata-core docblock rides along. Docs, docblock and checklist drift is p3. The card is a finding and no maintainer ruled the follow-up, so finding stays as its state; it waits on PR docs(spec): the email template locale docs describe the ladder #28880 landed #29014 for the wording to copy.

    Generated by Claude Code

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

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: finding → pm:blocked · 2026-11-02T08:06Z

    ⛔ Not a claim.

    Blocked-by: #28896


    Generated by Claude Code

  5. added
    pm:queueReady for the PM dispatch loop
    and removed
    pm:blockedBlocked by another issue/PR — body carries Blocked-by: #N
    on Nov 2, 2026
  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: unblocked · pm:queue (p3 kept) · 2026-11-02T10:01Z

    ⛔ Not a claim.


    Generated by Claude Code

  7. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 2, 2026
  8. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-warren · session_01JQwxbaBjisxkQo9hht9bFB

    Claim: PM loop round 3
    Session: session_01JQwxbaBjisxkQo9hht9bFB
    Account: os-warren
    Branch: claude/project-thread-e5rt73
    Worktree: objectstack-issue-29032
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: content/docs/automation/email-templates.mdx, the docblock in packages/metadata-core/src/item-key-discriminators.ts, the integration-system.email-template-render item in docs/qa/platform-checklist/areas/integration-system.json; a changeset only if the docblock ships in a published file, else skip-changeset
    Container & model: S docs + docblock + checklist, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the three texts outside packages/spec still state the exact ladder that #28880 retired; the spec wording they copy is SendTemplateInput.locale (packages/spec/src/contracts/email-service.ts, landed with PR #29014); authors and QA runs read them, and a run against main scores the checklist clause wrong
    Thread-read: 6574316813
    Premise: holds (seat re-read on main 8ca9dd7b: mdx :217–233, docblock :13–19, checklist :957 / :959)
    Serial constraints cleared: none (34 open non-mailbox PRs read; none touches the three files)

    Lane order at pick: #29032 and #29353 (both p3, neither Bug); #29032 is older, so position 1 goes to seat 1 and #29353 stays for domain:devx#2. The card copies the spec wording rather than restating it, so packages/spec stays untouched.

  9. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-warren · session_01JQwxbWaao8NE8qbxe4dXUL
    os-dev-report

    {
      "issue": 29032,
      "status": "done",
      "branch": "claude/project-thread-e5rt73",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/29498",
      "head": "4a0e6715b05e29539b5716ad6080297af9238eb1",
      "session": "session_01JQwxbWaao8NE8qbxe4dXUL",
      "premise_still_valid": true,
      "summary": "Premise held at base 8ca9dd7b: the mdx section, the metadata-core docblock and acceptance[3] of integration-system.email-template-render still stated the exact ladder, while EmailService.resolveAndRenderTemplate (plugin-email) folds as SendTemplateInput.locale states. The mdx and the checklist clause copy that spec ladder; the docblock cites it, per its own cite-not-quote rule, and keeps en and en-US as two rows. The checklist item moves to revision 13 with one history row (ref #29032); its verify line, steps[4], variants[0] and automated.ref no longer score or name the no-folding case. The docblock ships in metadata-core dist/index.d.ts and dist/index.d.cts, so a patch changeset rides instead of skip-changeset. packages/spec untouched.",
      "file_surface": [
        ".changeset/29032-email-template-locale-ladder-docblock.md",
        "content/docs/automation/email-templates.mdx",
        "docs/qa/platform-checklist/areas/integration-system.json",
        "packages/metadata-core/src/item-key-discriminators.ts"
      ],
      "changeset": "@objectstack/metadata-core patch; published-file proof: base-tree build grep of the old docblock text matched dist/index.d.ts and dist/index.d.cts, positive control ITEM_KEY_DISCRIMINATORS matched index.js, index.cjs and both d.ts; after the edit and rebuild the old text matches nothing and the new text matches both d.ts",
      "tests": "no behaviour changed: no new test, no ablation. metadata-core build and typecheck: VERDICT command-exit 0 at head 4a0e6715.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 4a0e6715: 82 commands. 78 exit 0 first pass; check-plugin-teardown-shape --self-test, spec check:skill-examples and check:lean-entry-closure exit 3 (prerequisite), then exit 0 after fetching the fixture commit and building client, client-react and objectql. check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET, NOT MEASURED (needs every package built), declared in the PR body, CI runs it. --ran: 82 derived, 81 run, 1 NOT-MEASURED, exit 0. pnpm check:platform-checklist exit 0. Docs build (vercel.json buildCommand, TURBO_FORCE=true): Tasks 2 successful, Cached 0, apps/docs/.next/BUILD_ID present. PR check-runs at report time: in_progress (Check Changeset, Lint jobs, Type Check jobs, Governed Surface Queue Guard, PR-body guards); none concluded red.",
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "declarations": {
        "Clause-②": "no",
        "Metadata-protocol": "none",
        "maintainer_brief": "six lines present",
        "closing": "Fixes #29032 on body line 3"
      },
      "mcp_calls": "0",
      "api_writes": "2: fleet-write relay pr_create (PR #29498, 6894 bytes sent, 6894 stored, identical); post-stamped comment on #29032 (this report). git push is not a REST write.",
      "labels": "none sent: changeset present, so no skip-changeset; the order named no other label",
      "body_amendments": [],
      "open_questions": [],
      "deviations": [
        "PR template headings (Why, Human Minimum) folded into the os-dev section order, as the os-dev exception"
      ],
      "security_findings": "none",
      "out_of_scope_findings": []
    }
  10. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:devx#1 · os-warren · session_01JQwxbaBjisxkQo9hht9bFB

    Landed · 2026-11-02T17:26Z · PR #29498 merged as 6a940d1d67 (reviewed head 4a0e6715b0, seat record ACCEPT 6582535447). The email-templates page, the ITEM_KEY_DISCRIMINATORS docblock in @objectstack/metadata-core and the checklist item integration-system.email-template-render (revision 13) now follow SendTemplateInput.locale: a named locale folds to a bundle member (zh → zh-CN), then the declared fallback locale, then en-US, then TEMPLATE_NOT_FOUND; en and en-US stay two rows. Out of scope: none. pm:dispatched is removed in this stroke.

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

Metadata

Metadata

Assignees

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions