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

docs(qa): reconcile the i18n checklist items with the shipped contract (#7686, #7684)#7715
huangyiirene merged 2 commits into
mainfrom
claude/issue-7686-7684-i18n-checklist

Conversation

@huangyiirene

@huangyiirenehuangyiirene 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)

落点beforeafter
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 gapnot recordedfixtures.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-matrixemptyState 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-matrixemptyState gapnot recordedfixtures.knownGaps waiver naming the missing fixture and its debt, pointed at the tracking issue #7714
surface-matrix variantsview 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 / negativeno knownGaps; unqualified negativeknownGaps 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

落点beforeafter
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/c3live-server POST /notifications/read + survives-reload re-readuntouched — they remain the item's substance
retirement citationabsentrecorded 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-onlyzh; zh-CN is rejected and silently boots en — #7640); the trigger names the showcase flow's task.assigned notify node, with ⛔ not collab.assignment
negativesroute-seam 404/405 onlyplus: 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 viewstask.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

#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

vercelBot commented Aug 11, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 11, 2026 11:53am

Request Review

@huangyiirenehuangyiirene 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 queueAug 11, 2026
Merged via the queue into main with commit 612d4e2Aug 11, 2026
25 checks passed
@huangyiirene
huangyiirene deleted the claude/issue-7686-7684-i18n-checklist branch August 11, 2026 12:24
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/mskip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants

@huangyiirene@claude