Skip to content

docs(qa): reconcile the i18n checklist items with the shipped contract (#7686, #7684) - #7715

Merged
huangyiirene merged 2 commits into
mainfrom
claude/issue-7686-7684-i18n-checklist
Aug 11, 2026
Merged

huangyiirene merged 2 commits into
mainfrom
claude/issue-7686-7684-i18n-checklist

Conversation

@huangyiirene

@huangyiirene huangyiirene commented Aug 11, 2026 •

Copy link
Copy Markdown
Collaborator

Fixes #7686
Fixes #7684

Five itemised edits to docs/qa/platform-checklist/areas/i18n.json, all falling out of the i18n area run #7640. Docs-only, one file, no code and no coverage.json change.

Per-card checklist

#7686 — items 1–4 (item 5 is #7684 below, not double-edited)

落点 before after
build-gates-hold step 4 "perturb one committed bundle value … capture the red verdict" split into a do/don't pair: remove or rename a KEY (the structural perturbation), plus an explicit ⛔ against perturbing a value, with the reason (merge mode makes the committed file its own baseline) and the #7640 /tmp symlink-farm technique that drives it red-then-green without touching a repo file
build-gates-hold acceptance c2 "a perturbed bundle turns the gate red" "a bundle with a removed or renamed KEY turns the gate red … a VALUE edit is NOT a valid probe of this clause"
build-gates-hold negatives "a green run after the deliberate bundle perturbation is a FAIL of the gate itself" qualified to the structural perturbation, plus a second negative: a green run after a value edit is not a finding and must never be filed as one
surface-matrix _sections step "detail-page section labels (_sections group)" reads them off a named-section surface — task.view.ts's tabbed/wizard/split form views and contact.view.ts's default form, whose section names the bundle already translates — and records why the task detail page cannot serve
surface-matrix _sections gap not recorded fixtures.knownGaps entry: the record:details block on task-detail.page.ts authors label-only sections, and component.zod.ts documents that a nameless section renders its authored label in every locale; the resolver negative gains the matching qualifier so English there can no longer be filed as a resolver defect
surface-matrix emptyState step "open a view/slice with zero rows and capture emptyState.title/message" ⚠️ marked not afforded by the stock fixture → record blocked(fixture), with an explicit ⛔ against manufacturing coverage from the console's built-in zero-row placeholder
surface-matrix emptyState gap not recorded fixtures.knownGaps waiver naming the missing fixture and its debt, pointed at the tracking issue #7714
surface-matrix variants view empty states (…) · detail section labels (…) both annotated with what they now mean (blocked(fixture) · via a named-section form view)
studio-follows-app-locale clause 1 "no untranslated declared string sitting next to translated ones" judged against the bundle: a translated key rendering English is the FAIL, an untranslated key rendering its EN source label is the frozen debt and ticks, a raw dotted key is the unconditional FAIL — reconciled with the ratchet and with the sibling item that already declares that debt legitimate
studio-follows-app-locale fixtures / negative no knownGaps; unqualified negative knownGaps mirrors the sibling's (451 untranslated declared labels held flat by check-i18n-coverage.mjs + i18n-coverage-baseline.json; #7640's Announcement / Business Unit / … are inside it), and the negative carries the same qualifier

#7684 — c0/c4 rewritten per the PM ruling

落点 before after
item title "zh-CN notification is localized, deep-links localized, and mark-as-read clears" "…mark-as-read is server-authoritative, the deep-link target is localized — and the title is the flow-authored literal string, because notification copy has no translation group"
acceptance c0 "the bell entry's title renders in the recipient locale (zh-CN)" the title is the flow-authored literal string with its {record.*} placeholders interpolated; an English title on a Chinese session is the PASS, an unsubstituted placeholder is the FAIL — interpolation, not translation, is what the clause tests
acceptance c4 "localization is per-recipient, not session-global: the same event notifies the en control user in en" the title is recipient-INDEPENDENT; a per-recipient difference is the finding, because per-recipient localization of app-flow notification copy is a spec-retired capability
acceptance c2/c3 live-server POST /notifications/read + survives-reload re-read untouched — they remain the item's substance
retirement citation absent recorded on the item (fixtures.knownGaps + source): translation.zod.ts:341 guidance verbatim, sys_user has no locale, notify-node.ts interpolates cfg.title with no locale lookup, #3403 moved assignment notifications to app-authored flows (pinned by audit-writers.test.ts)
steps "set the recipient user's locale to zh-CN"; "trigger a collab.assignment notification" the unperformable per-user-locale step is replaced by the session-locale procedure (localStorage['objectui-locale'] takes language-only zh; zh-CN is rejected and silently boots en — #7640); the trigger names the showcase flow's task.assigned notify node, with ⛔ not collab.assignment
negatives route-seam 404/405 only plus: filing a bug over the English bell title is the misread this item forecloses, and authoring a notifications key to "fix" it is a FAIL of the fix

Every touched item bumps revision and appends a history entry per the README lifecycle rule (build-gates-hold 1→2; surface-matrix 2→3; studio-follows-app-locale 2→3; notification-localized-and-clears 2→3).

Premise verification (before editing, against origin/main @ 21888ab)

  • Checklist decision: notification-localized-and-clears c0/c4 assume a per-recipient localized title — a capability the spec retired #7684's ruling premise holds. packages/spec/src/system/translation.zod.ts:341 still carries the notifications retirement guidance verbatim, and no notification-copy translation group has appeared. sys_user declares no locale field. notify-node.ts computes the title as interpolate(cfg.title …) with no locale consulted. collab.assignment survives only in regression pins asserting the kernel does not emit it.
  • One refinement, recorded rather than glossed: plugin-audit's collab.mention writer does resolve a per-recipient title (messages.mentionedYou via resolveWriteLocale(tenantId, uid)). That is a different producer resolving the long-declared messages group — not a notifications group and not the app-flow path this item drives — so it is not the fork condition the ruling named, and no fork-report was warranted. It is written into knownGaps so the next author overshoots in neither direction.
  • Checklist maintenance (i18n area run): step-4 no-op, unaddressable _sections/emptyState fixtures, clause-1 frozen-debt reconcile #7686 item 2's premise is partly false, and the item is better for it. The card read _sections as having "no addressable surface on this fixture". True of the task detail page; false of the object's form views — task.view.ts (tabbed/wizard/split) and contact.view.ts declare stable section names, and the showcase bundle already translates exactly those (概览/排期/详细信息, 联系方式/工作信息/状态/备注). So the clause is adjusted to what the fixture affords rather than waived, and the nameless record page is documented as the gap.
  • Items 1, 3 and 4 verified as stated: merge mode confirmed by the gate's own regenerate hint and by AGENTS.md's Documentation Guardrails row; a grep for emptyState across examples/app-showcase/src returns nothing; the showcase's frozen debt is the 451-label entry in scripts/i18n-coverage-baseline.json.

Gates

Docs-only, releases nothing → no changeset; skip-changeset applied.

Out-of-scope finding filed


Generated by Claude Code

claude added 2 commits August 11, 2026 11:51
#7686, #7684)

Five itemised edits to docs/qa/platform-checklist/areas/i18n.json, all falling
out of the i18n area run #7640. No other file is touched.

build-gates-hold (rev 2) — step 4 was a no-op: perturbing a bundle VALUE is
green by design under merge mode, where the committed file is its own baseline.
Reworded to the structural perturbation (remove/rename a KEY) that actually
bites, with the symlink-farm technique that drives it without touching a repo
file; the drift clause and both negatives now say a green value edit is not a
gate defect.

surface-matrix (rev 3) — the _sections step pointed at the task detail page,
whose record:details block authors label-only sections that render their EN
label in every locale by design. The variant is addressable after all: it now
reads off the named-section form views (task.view.ts tabbed/wizard/split,
contact.view.ts), whose section names the bundle already translates, and the
nameless record page is written down as a knownGap plus a qualifier on the
resolver negative. The emptyState variant is waived as blocked(fixture) — no
showcase view authors one — with the debt recorded rather than faked.

studio-follows-app-locale (rev 3) — the mixed-language clause forbade what the
frozen coverage debt guarantees, contradicting the sibling item that already
declares that debt legitimate. It now judges against the bundle: translated
keys render translated, untranslated keys render their EN source label, a raw
dotted key is the unconditional FAIL.

notification-localized-and-clears (rev 3) — c0/c4 assumed a per-recipient
localized notification title, a capability the spec retired
(translation.zod.ts:341; sys_user has no locale; #3403). c0 now asserts the
flow-authored literal title with placeholders interpolated, c4 asserts the
title is recipient-independent, and the retirement is cited on the item so the
premise is not re-asserted. The mechanical read/clear clauses are untouched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015hRud1GLYg5io28iSJmQGh
A waiver is a debt marker and needs a live reference; the fixture gap was
filed unassigned as #7714 after the first commit was written.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015hRud1GLYg5io28iSJmQGh
@vercel

vercel Bot commented Aug 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 11, 2026 11:53am

Request Review

@huangyiirene huangyiirene added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 11, 2026 — with Claude
@huangyiirene
huangyiirene marked this pull request as ready for review August 11, 2026 12:10
@huangyiirene
huangyiirene added this pull request to the merge queue Aug 11, 2026
Merged via the queue into main with commit 612d4e2 Aug 11, 2026
25 checks passed
@huangyiirene
huangyiirene deleted the claude/issue-7686-7684-i18n-checklist branch August 11, 2026 12:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants