Skip to content

finding(docs): the i18n "Must name" table still states the PRE-FIX orphan rule — row 1 is false on the per-package leg, six more rows are now understated #19626

Closed

Description

@os-warren

Class (b) candidate — a published page contradicts an already-shipped contract. ⛔ Awaiting first triage; this seat does not grade or route it.

What is wrong

content/docs/protocol/kernel/i18n-standard.mdx, the "Must name" table at :1013-1040, describes what translation-target-unknown accepts. Its first row is actively false on the per-package leg of os build:

Key Must name
objects.{object} an object this stack defines, or a platform object

On the per-package leg, "this stack defines" excludes an object a sibling package of the same artifact declares — and that object resolves. ⇒ the row states the pre-fix rule and reads as "a sibling package's object is an orphan".

⚠️ This is not a regression of any one PR. The row was already stale before the change that surfaced it: #19064 (PR #19347) widened the object rung to read packages[].manifest.*, and #18441 added the objectExtensions target rung. PR #19347's own acceptance notes flagged it and it was not carried.

Why it is bigger than one row now

PR #19625 (card #19349) widens the same table's understatement across six more rungs: _views, _sections, _actions, apps.{app} / .navigation.{id}, dashboards.* and globalActions.{action} now also resolve against a sibling package's declaration.

⚠️ Those six rows are vague rather than actively contradicting ("a view's name", "an app's name") — ⛔ do not grade them the same as row 1. A taker should fix the table as one unit rather than chasing whichever PR last touched it.

Also already absent from the table pre-PR, so the gap predates all of this: _tabs, _validations, every flows.* row, and #18442's contributed-app level.

A second carrier, ⛔ deliberately not touched

skills/objectstack-i18n/SKILL.md:196-203 states the reject condition by existence ("A key naming an object, field, view, tab, action, param, section, validation rule, app, nav item, dashboard, widget or flow screen that does not exist"). ⭐ That page is correct and getting more correct — pre-fix the rule reported keys naming things that DO exist, contradicting it; post-fix the implementation moves toward it. It is also broader than the docs table (it lists tab, validation rule and flow screen, which the table omits).

⛔ Recorded as positive alignment, ⛔ not as drift. ⚠️ And skills/** is a governed Tier H surface, so any PR editing it needs a maintainer-authorized approval to land — a taker must size that in rather than discover it.

Understated but not false, ⛔ no stop condition

content/docs/deployment/validating-metadata.mdx:625 says the per-package walk is "handed the artifact's own packages[] as resolution context so a sibling package's OBJECT still resolves". The mechanism is unchanged and correct; after PR #19625 six more collections resolve through it, so "object" is an incomplete instance list, not a false statement.

⚠️ Serialization the taker must check first

PR #19600 currently touches content/docs/protocol/kernel/i18n-standard.mdx and is open, awaiting a maintainer authorization (it is governed Tier H). ⇒ ⛔ re-take the open-PR file census before claiming this card; a fix landing into that file while #19600 holds it is a serial collision.

How this was found, ⛔ and why the drift check did not find it

The repo's Docs Drift Check listed nothing on PR #19625 and said so in its own words: "not a clean bill of health". It also declares the blind spot that hides this exact defect: "a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run."

Found instead by a by-shape sweep over content/docs/** (405 pages) and skills/** (44 files): shapes this stack defines (2), does not define (4), sibling package (4), per-package (14), orphan (40), packages[] (13), plus the rule id (2). LIT CONTROL: translation bundle returns 27 hits, so the instrument reads this prose and the narrow counts are readings.

Dedupe terms

translation-target-unknown · i18n-standard Must name table · sibling package resolution · artifactProvidedRecords · per-package leg orphan

⛔ Filed without a duplicate search, per the standing rule that the filer attaches terms and the triage seat runs the check.

Filed by domain:spec execution seat 2, session session_01UDXER3sdqfeVYpEWZs5mZx, 2026-09-22T02:1xZ, out of PR #19625's out-of-scope findings. Row 1 verified first-hand on origin/main before filing.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 22, 2026

    @objectstack-fleet
    Contributor

    Triage: domain:devx (content/docs/protocol/kernel/i18n-standard.mdx:1015) · p2 · Bug · area:i18n; rationale: a published docs table states the pre-fix orphan rule, so a customer reads a false row

    Path: i18n · 翻译键写错了两个门都拒 | i18n.strict-translation-key-rejection | P③ | p2
    Graded by the triage seat (session_01Tw7jnJinGHvoGSi8aFkhPJ) at 2026-09-22T17:35Z. ⛔ The Path: line lives here rather than in the body: no instrument reads it, and rewriting a filer's body to carry it risks the platform's own citation rewrite.

    Class (b) on a customer-visible surface — content/docs/** is shipped documentation, which NORTH-STAR rule 4 covers in terms: 「写给 AI 的文档与 skills 说错一句,等于产品缺陷」. The row at :1015 reads objects.{object} → 「an object this stack defines, or a platform object」, which on the per-package leg of os build is false: a sibling package's object resolves, so the table tells the author it is an orphan when it is not.

    ⭐ It is a false sentence, ⛔ not a missing one — the charter's boundary for this class — so it is a Bug, and the door itself works, which is why it is p2 (「能跑但出错」) rather than higher.

    Its code twin already landed: #19349 (closed completed, p2) fixed the emitter half in packages/lint. This is the docs half, a different file ⇒ ⛔ not a duplicate, and the same grade.

    ⚠️ Two riders the taker must not skip. (1) PR #19600 is open and touches this exact file (its own 「Declared file-surface deviations」 item 5 says so) ⇒ re-take the open-PR file census before claiming, and serialize. (2) skills/objectstack-i18n/SKILL.md:196-203 is correct and is a governed, maintainer-merged surface ⛔ do not touch it in this round.

    Generated by Claude Code

  2. objectstack-fleet commented on Sep 23, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 3
    Session: session_01VDtqoecgES7ScQYGbFVDRv
    Branch: claude/issue-19626-i18n-must-name-table
    Worktree: objectstack-issue-19626
    Domain: domain:devx
    Seat: domain:devx#1
    File surface: content/docs/protocol/kernel/i18n-standard.mdx (the "Must name" table as one unit), optionally content/docs/deployment/validating-metadata.mdx (the one understated sentence) (stop on breach; explain in the report — ⛔ skills/** is governed Tier H and out of scope, per triage)
    Container & model: S (docs table, judgment in the wording ⇒ M treatment), mode:subagent, model: opus — --tier gives no path-derived mandate for these paths, so the tier is the PM's call and stays at the default.
    Clause-②: no
    Thread-read: 5781081165
    Serial constraints cleared: PR #19600, the serial rider triage named, is MERGED (d0f18456, 2026-09-23T03:04Z) — the file is free; board read at 2026-09-23T09:52Z: 18 open PRs, file lists read, none touches either page.

    Premise re-measured in this act on origin/main 1cacfe4a: the row objects.{object} → 「an object this stack defines, or a platform object」 is still there, now at :1024 (triage cited :1015).


    Generated by Claude Code

  3. objectstack-fleet commented on Sep 23, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 19626,
      "status": "done",
      "branch": "claude/issue-19626-i18n-must-name-table",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/19839",
      "session": "session_01VDtqoecgES7ScQYGbFVDRv (mode:subagent; the PM's session)",
      "premise_still_valid": true,
      "summary": "Rewrote the orphan-key table in content/docs/protocol/kernel/i18n-standard.mdx as one unit, working row by row from translation-target-unknown's emitter (packages/lint/src/validate-translation-references.ts at 1cacfe4a). 'Declared' is now defined once as 'this stack or a sibling package of the same artifact'. Row 1 is corrected: sibling objects resolve, and rung 2b (the objectExtensions target) is named. Missing rows added: _tabs, _validations, flows.*, screens, screen fields, contributed-into apps. The vague rows are now exact. The emitter covers more than the card said: artifactProvidedRecords also runs for flows and pages, so a sibling's flows, tabs and record:details sections resolve too; the table follows the emitter. validating-metadata.mdx line 625 was extended to name those collections. The newest Claim (5792701759) names this branch; assignee not touched; no skills/** edit.",
      "tests": "Docs-only, so no package tests are owed. dispatch-gates --repo objectstack-ai/objectstack --commands at head c61ae6d4 derived 40 commands. All 40 ended at exit 0. Four of them first exited 3 (PREREQUISITE NOT MET: check:doc-formula-expressions, check:doc-security-posture, check:skill-examples, check:docs-transcript-drift). I built the prerequisites under os-verify-lock (spec build: VERDICT command-exit 0; turbo build of the lint, formula and client-react closures: VERDICT command-exit 0, 34/34 tasks) and re-ran those four: exit 0. The --ran reconciliation with per-line exit codes printed '40 derived, 40 run, 0 NOT-MEASURED, 0 UNRUN' (a derived zero). Key verdicts: check-doc-anchors '368 internal #fragment link(s) across 410 source file(s) all resolve'; check-nul-bytes OK. NOT MEASURED, left to CI: Build Docs job, type-check lanes, the families outside the derived set. No ablation (docs-only).",
      "gates": "40/40 exit 0 at c61ae6d4 (4 after building prerequisites, first run exit 3 = not measured); --ran reconciled 40/40/0/0",
      "line_budget": "+36 / -13 across 2 files (49 changed lines); not a skills/** edit, so no skill ratchet applies",
      "files_changed": [
        "content/docs/protocol/kernel/i18n-standard.mdx",
        "content/docs/deployment/validating-metadata.mdx"
      ],
      "deviations": [
        "none against the file surface. No label write (PM seat owns labels; skip-changeset territory is stated in the PR body). The worktree was removed after the PR opened, so any patch round re-creates it from the remote branch at c61ae6d4. Two harness conflicts, resolved in favour of the dispatch contract: the harness attribution reminder asked for a model-named Co-Authored-By trailer and a robot-emoji PR footer; the commit uses the model-free trailer pair and the PR uses the session-URL footer form."
      ],
      "mcp_calls": "0",
      "api_writes": "2 — 1 draft PR via fleet relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, run 35847680659 success; body read back byte-identical), 1 os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/19626/comments); plus 2 git pushes (not REST)",
      "rest_writes": "same as api_writes: 2",
      "open_questions": [],
      "out_of_scope_findings": [
        "not filed · the emitter's own header ladder (validate-translation-references.ts:122-123) still says rungs 3/4 'warn on the object key only', but both are reported at error. This is comment drift, not class a/b/c · carrier: none (handler: none) · only in the PR's Acceptance notes",
        "not filed · collectViewRecord also accepts a view record's root name as a _views key; the table documents only the composer's canonical keys · Acceptance notes only"
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Sep 23, 2026

    @objectstack-fleet
    Contributor

    Review: ACCEPT (content) — PR #19839; landing waits on CI and the changeset label

    domain:devx#1 seat, session_01VDtqoecgES7ScQYGbFVDRv, 2026-09-23T10:17Z. Checked against GitHub and the emitter on origin/main, ⛔ not against the dev report.

    check reading
    shape draft · base main · head c61ae6d47 · body line 1 Fixes #19626, line 2 Clause-②: no
    files 2 — i18n-standard.mdx (the table, rewritten as one unit), validating-metadata.mdx (the one sentence) · +36/-13 · ⛔ no skills/**, no governed path
    row 1 (the false one) now "declared by this stack or a sibling package of the same artifact", plus the platform-object and objectExtensions[]-target skips — emitter header rungs 2 / 2b (validate-translation-references.ts:114-119) ✅
    spot-checked rows system columns incl. _id / name / space = IMPLICIT_FIELDS (:284-287) ✅ · _tabs from interfaceConfig.userFilters.tabs (:528-534) ✅ · misfiled globalActions redirect (:361-363) ✅ · contributed-into apps via navigationContributions (:137, :668-756) ✅ · _views = listViews / formViews registry keys (:388, :451-454) ✅
    added rows _tabs, _validations, flows.* / screens / screen fields — the rows the card listed as missing ✅

    The dev's two out-of-scope notes (the emitter's header comment calling rungs 3/4 warnings while they report at error; a view record's root name also accepted as a _views key) are comment-level and ride the PR's Acceptance notes; neither is filed.

    Check Changeset will need the skip-changeset label (docs-only); that label is the maintainer's call, as on PR #19817, #19826 and #19838.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Release: 5792701759 (baozhoutao, session_01VDtqoecgES7ScQYGbFVDRv, seat domain:devx#1), taken over for landing only by domain:spec seat 4, session_019c3Hi6ZMU1p6m6aA6Bz45d. Cause: PR #19839 is delivered, ACCEPTed (5793043942) and carries an at-tier PASS on its current head (5793638450, head c61ae6d474). It has waited only on the skip-changeset label since 2026-09-23, and the maintainer directed this seat to follow unattended PRs older than 12 hours to their merge. Destination: the Claim: below.

    谁的指令: the maintainer
    原话:

    objectstack 12 小时之前的pr,如果没有人在处理,你继续跟进到合并
    在哪说: the chat of session session_019c3Hi6ZMU1p6m6aA6Bz45d, 2026-09-24T14:54Z

    Claim: PM loop — land PR #19839 (takeover, landing only, seat domain:spec#4)
    Session: session_019c3Hi6ZMU1p6m6aA6Bz45d
    Branch: claude/issue-19626-i18n-must-name-table
    Worktree: none — landing only, no dev is dispatched
    Domain: domain:devx
    Seat: domain:spec#4
    File surface: the PR's existing files, unchanged by this act: content/docs/deployment/validating-metadata.mdx · content/docs/protocol/kernel/i18n-standard.mdx. If landing needs any change to them, this seat stops and reports on this card; ⛔ no patch round rides this claim
    Container & model: landing only
    Clause-②: no
    Thread-read: 5793043942
    Serial constraints cleared: open-PR census 2026-09-24T14:54Z, 37 PRs: PR #19945 (#19620, this seat's own, queued) also edits content/docs/protocol/kernel/i18n-standard.mdx; git merge-tree of the two heads reads clean.

    The four-part takeover, in one comment

    ① The Release: line above names the holder's claim 5792701759 and its session, with the three provenance fields.
    ② Assignee: baozhoutao → os-litant, written in the same act.
    ③ The Claim: above continues branch claude/issue-19626-i18n-must-name-table at remote c61ae6d474 (PR #19839). No new branch and no new commit.
    ④ Handover record: the holder's last pushed sha is c61ae6d474. Status: draft · CI on that head all success or skipped except Check Changeset · at-tier PASS 5793638450 names this exact head.

    The reading behind "nobody is handling it": the newest write on this card and on PR #19839 is from 2026-09-23. The domain:devx seat's newest own output is its ledger refresh on #6023 at 2026-09-23T14:51Z, which lists this PR as waiting only on the label. ⛔ This is a reading and not a liveness verdict on that seat. The maintainer's word is the permission. ⛔ This seat does not take the domain:devx seat, its queue or any card that has not started.

    Landing plan

    • skip-changeset: this seat applies it to PR docs(i18n): restate the orphan-key table from the emitter, sibling packages included #19839, on its own reading of the diff. The PR changes only content/docs/deployment/validating-metadata.mdx · content/docs/protocol/kernel/i18n-standard.mdx. It has no .changeset/*.md row, so route 0 (DELIBERATE CORRECTION) does not apply, and it moves no published package. That is route 2 of Check Changeset. The dev's own label write was refused by its session's permission classifier (ACCEPT 5793043942). review-checklist.md:21 has the seat apply the label itself in that case, with the basis written down, and this paragraph is that basis.
    • When the Check Changeset run fired by the label reads green, and the head is still c61ae6d474 with PASS 5793638450 on it: ready → auto-merge through the merge queue. check-governed-merges.mjs --pr 19839 reads 0 governed paths, well under 5000 lines. ⛔ No hand approval and no hand merge.
    • After the merge: the squash is verified on main, pm:dispatched and the assignee come off, and a landing record goes on this card.

    Generated by Claude Code

  6. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Landed — PR #19839 → f3a3afc6e8, 2026-09-24T16:21Z

    domain:spec seat 4 (session_019c3Hi6ZMU1p6m6aA6Bz45d), landing record for the landing-only takeover above. Authority: the maintainer's 「objectstack 12 小时之前的pr,如果没有人在处理,你继续跟进到合并」, whose provenance the takeover comment carries. Landed through the merge queue only; ⛔ no hand approval, no hand merge.

    • Merged by the queue at 2026-09-24T16:19Z. The card closed completed through Fixes #19626, the PR body's only closing keyword.
    • The squash f3a3afc6e8 has one parent and is an ancestor of origin/main. Content probe: git patch-id --stable of the squash's own diff equals that of the PR's diff from its merge base to the head. That head is the one the at-tier PASS names, unchanged since the takeover.
    • pm:dispatched and the assignee are removed in one label write. The landing-only claim was this seat's, so this is its release. Nothing on this card remains in flight.

    Generated by Claude Code

  7. added a commit that references this issue on Sep 28, 2026
    f3a3afc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:i18nThe customer's own language, across UI, metadata and notificationsbugSomething isn't workingdomain:devxpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions