Skip to content

Checklist maintenance (i18n area run): step-4 no-op, unaddressable _sections/emptyState fixtures, clause-1 frozen-debt reconcile #7686

Closed

Description

@huangyiirene

Symptom

Checklist maintenance falling out of the i18n (FULL area) run — items whose steps or premises no longer match the shipped contract or the showcase fixture. Consolidated into one card per the maintainer standing rule. All live under docs/qa/platform-checklist/.

Root cause

Itemised:

  1. build-gates-hold step 4 is a no-op as written. "Perturb one committed bundle value" leaves the gate green by design — merge mode re-uses the committed file as its own baseline, so drift is structural, not textual. It should read "remove or rename a committed bundle key" (the structural perturbation that actually bites). (The runner found this by trying the literal step, watching it stay green, then finding the structural perturbation.)

  2. surface-matrix _sections has no addressable surface on this fixture. The record page renders the showcase's record:details block whose sections are authored with label and no name (task-detail.page.ts ~74-76); component.zod.ts:491 documents that a nameless section renders its authored label in every locale. The bundle does carry 概览/排期/详细信息 — they are simply unreachable. Fixture-authoring gap, not a resolver defect: either add a name to a fixture section, or drop the clause.

  3. surface-matrix view emptyState. The showcase authors no emptyState on any view, so no translated key exists to test. Add a fixture emptyState, or waive the clause.

  4. studio-follows-app-locale clause 1 should allow the frozen untranslated debt the sibling item already declares legitimate. The residual English strings (Announcement, Business Unit, Owning Business Unit, Sales Region, …) render their EN source label, never a raw key — which the sibling item's knownGaps declares legitimate. The clause wording ("no untranslated declared string next to translated ones") should be reconciled with the coverage ratchet.

  5. notification-localized-and-clears c0/c4 premise is a retired capability — tracked separately in Checklist decision: notification-localized-and-clears c0/c4 assume a per-recipient localized title — a capability the spec retired #7684 (rewrite-or-waive c0/c4 there). Cross-referenced, not duplicated here.

Reproduction

Not a code defect — these are checklist authoring/wording decisions surfaced by the run. Each item above names its exact fixture/clause location under docs/qa/platform-checklist/ (and the referenced showcase/spec sources) for the reconcile.

Source

Extracted from the QA run #7640 (framework 92f26f7, console 09987b6).

Activity

  1. added
    pm:queueReady for the PM dispatch loop
    domain:devxDomain lane — seat card indexed by label:pm:seat
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 11, 2026
  2. removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 11, 2026
  3. claude commented on Aug 11, 2026

    @claude
    Contributor

    Dual-label resolution (queue+finding): promoted to pm:queue (finding stripped). Four itemised checklist/fixture edits, each with a named clause and source anchor, all under docs/qa/platform-checklist/; item 5 is explicitly tracked in #7684, not duplicated. Same class as the ratified #7647 / #7650 promotions from earlier waves. domain:devx stands.

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 11, 2026
  5. self-assigned this
    on Aug 11, 2026
  6. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    Claim: PM loop round 3 (devx seat, 2026-08-11 term) — wave 3 unit C, packed with #7684 (its own body cross-references that card as item 5's separated half; same i18n area file ⇒ one dev, one PR, two Fixes lines, itemized checklist)
    Session: session_01GZKbx4xyF7U5WXj6ch49BM
    Branch: claude/issue-7686-7684-i18n-checklist
    Worktree: cloud session, own clone
    Domain: domain:devx
    File surface: the i18n checklist area file under docs/qa/platform-checklist/ only; ⛔ not coverage.json, ⛔ not other area files (other units own them)
    Container & model: M, mode:cloud, model: opus
    Serial constraints cleared: pairwise-disjoint wave-3 partition; no other claim or open PR touches the i18n area file (checked at claim time).


    Generated by Claude Code

  7. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor
    {
      "issue": 7686,
      "also_fixes": 7684,
      "status": "done",
      "branch": "claude/issue-7686-7684-i18n-checklist",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/7715",
      "premise_still_valid": true,
      "premise_notes": "4 of 5 premises confirmed verbatim against origin/main @ 21888ab. ONE PARTIAL FALSIFICATION, #7686 item 2: the card read `_sections` as having no addressable surface on the showcase. True of the task DETAIL page (task-detail.page.ts's record:details block authors label-only sections, unaddressable by design per component.zod.ts) but FALSE of the object's FORM views — task.view.ts's tabbed/wizard/split and contact.view.ts's default form declare stable section names, and the showcase bundle already translates exactly those. The clause was therefore adjusted to what the fixture affords (the better of the two options the card offered) rather than waived, and the nameless record page is recorded as a knownGap. #7684's ruling premise holds: translation.zod.ts:341 still carries the `notifications` retirement guidance, sys_user declares no locale field, notify-node.ts computes the title as interpolate(cfg.title) with no locale lookup, and collab.assignment survives only in pins asserting the kernel does NOT emit it (#3403). No fork-report was warranted — see open_questions[0] for the one refinement found.",
      "summary": "Five itemised edits to docs/qa/platform-checklist/areas/i18n.json, one file, nothing else. #7686: (1) build-gates-hold step 4 rewritten from the no-op value perturbation to the structural one (remove/rename a KEY), split into a do/don't pair with the merge-mode reason and the #7640 symlink-farm technique, with the drift clause and both negatives reconciled so a green value edit can no longer be filed as a gate defect; (2) surface-matrix's _sections step re-pointed at the named-section form views, with the nameless record:details block written down as a knownGap and the resolver negative qualified; (3) the emptyState variant waived as blocked(fixture) with the debt named and pointed at #7714; (4) studio-follows-app-locale's mixed-language clause now judges against the bundle instead of forbidding what the frozen coverage debt guarantees, with the sibling item's knownGap mirrored onto it. #7684: c0/c4 rewritten against the shipped contract — c0 asserts the flow-authored literal title with placeholders interpolated, c4 asserts the title is recipient-INDEPENDENT with a per-recipient difference as the finding — the mechanical read/clear clauses untouched as the item's substance, and the retirement cited on the item so the premise cannot be re-asserted. Every touched item bumps revision and appends history.",
      "tests": "Docs-only; no package build or test surface. Gates actually run in the worktree: (a) `node scripts/check-platform-checklist.mjs` — IDENTICAL before and after the change: `check-platform-checklist: 1 problem(s) / coverage.json - qa: UNCLASSIFIED`, the known base red tracked at #7347, recorded not chased. No new structural, revision/history or enumSource finding introduced. (b) JSON validity — `JSON.parse` clean on every commit. (c) `node scripts/check-nul-bytes.mjs` — `OK (scanned 7104 text file(s) -- 7104 tracked, 0 untracked-not-ignored; skipped 5 binary; no raw ASCII control bytes)`, plus a targeted `grep -naP` self-scan of the edited file (clean). (d) `git diff --stat` — `docs/qa/platform-checklist/areas/i18n.json | 116 +++--`, 1 file changed, 76 insertions(+), 40 deletions(-) — 1:1 with the declared file surface: no coverage.json, no other area file, no showcase or product code. PR is draft; CI gate conclusions are the PM's read.",
      "open_questions": [
        {
          "question": "Recorded, not blocking — a refinement to #7684's ruling that the item now carries: is 'notification titles are not localized' the right thing for the ledger to say platform-wide?",
          "options": [
            "A: as written — the item scopes the statement to the app-flow notify path, and records in knownGaps that plugin-audit's collab.mention writer DOES resolve a per-recipient title (messages.mentionedYou via resolveWriteLocale(tenantId, uid)) through the long-declared `messages` group",
            "B: state it unqualified — simpler, but false in one direction and the next author would find the counter-example"
          ],
          "recommendation": "A, shipped. The ruling's fork condition was 'a notification-copy translation group has appeared' — the `messages` group is neither new nor a notifications group, and its producer is a plugin writer rather than the flow notify node, so this is not the fork and no stop was warranted. But an unqualified claim would have been the mirror error of the one this card fixes, so both directions are pinned on the item."
        }
      ],
      "out_of_scope_findings": [
        "filed as #7714: the showcase authors no view emptyState, so the declared objects._views[view].emptyState translation surface has no fixture to drive — filed unassigned with the `finding` label after searching open issues for a twin (none); the checklist waiver points at it so the debt has a live tracker",
        "NOT filed, already on the run record #7640 and outside both cards: the date formatter is half-localized (past relative forms localize, future forms stay English on the same page, absolute timestamps render en-US) — a genuine product gap that no clause of these items names, left for PM triage rather than filed blind from a checklist card"
      ]
    }

    Generated by Claude Code

  8. huangyiirene commented on Aug 11, 2026

    @huangyiirene
    CollaboratorAuthor

    ACCEPT (both cards) — PR #7715. Review record: one file (areas/i18n.json), inside the claimed surface. #7686: the structural-perturbation rewrite carries the do/don't pair with the merge-mode reason and reconciles the clause + negatives; the _sections partial falsification was handled exactly right — retargeted to the named-section form views rather than waived, nameless record page recorded as a knownGap; emptyState waived with a live tracker (#7714, properly dedup-checked); the frozen-debt reconcile judges against the bundle with the ratchet as the reference. #7684: the c0/c4 rewrite implements the ruling and the dev's refinement is endorsed as shipped (option A) — scoping the statement to the flow-notify path and pinning the messages.mentionedYou counter-example in knownGaps was the correct read of the fork condition, and an unqualified claim would indeed have been the mirror error. The date-formatter half-localization observation stays with run record #7640 for triage. Landing: flip + arm once gate jobs conclude.


    Generated by Claude Code

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:seatpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions