Repository navigation
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
Description
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".
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.
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. 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
objectstack-fleet commentedon Sep 22, 2026
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 rowPath: i18n · 翻译键写错了两个门都拒 | i18n.strict-translation-key-rejection | P③ | p2Graded by the triage seat (
session_01Tw7jnJinGHvoGSi8aFkhPJ) at 2026-09-22T17:35Z. ⛔ ThePath: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:1015readsobjects.{object}→ 「an object this stack defines, or a platform object」, which on the per-package leg ofos buildis 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 inpackages/lint. This is the docs half, a different file ⇒ ⛔ not a duplicate, and the same grade.skills/objectstack-i18n/SKILL.md:196-203is correct and is a governed, maintainer-merged surface ⛔ do not touch it in this round.Generated by Claude Code
objectstack-fleet commentedon Sep 23, 2026
Claim: PM loop round 3
Session:
session_01VDtqoecgES7ScQYGbFVDRvBranch:
claude/issue-19626-i18n-must-name-tableWorktree:
objectstack-issue-19626Domain:
domain:devxSeat:
domain:devx#1File surface:
content/docs/protocol/kernel/i18n-standard.mdx(the "Must name" table as one unit), optionallycontent/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—--tiergives 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/main1cacfe4a: the rowobjects.{object}→ 「an object this stack defines, or a platform object」 is still there, now at:1024(triage cited:1015).Generated by Claude Code
objectstack-fleet commentedon Sep 23, 2026
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
objectstack-fleet commentedon Sep 23, 2026
Review: ACCEPT (content) — PR #19839; landing waits on CI and the changeset label
domain:devx#1seat,session_01VDtqoecgES7ScQYGbFVDRv, 2026-09-23T10:17Z. Checked against GitHub and the emitter onorigin/main, ⛔ not against the dev report.main· headc61ae6d47· body line 1Fixes #19626, line 2Clause-②: noi18n-standard.mdx(the table, rewritten as one unit),validating-metadata.mdx(the one sentence) · +36/-13 · ⛔ noskills/**, no governed pathobjectExtensions[]-target skips — emitter header rungs 2 / 2b (validate-translation-references.ts:114-119) ✅_id/name/space=IMPLICIT_FIELDS(:284-287) ✅ ·_tabsfrominterfaceConfig.userFilters.tabs(:528-534) ✅ · misfiledglobalActionsredirect (:361-363) ✅ · contributed-into apps vianavigationContributions(:137,:668-756) ✅ ·_views=listViews/formViewsregistry keys (:388,:451-454) ✅_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
_viewskey) are comment-level and ride the PR's Acceptance notes; neither is filed.Check Changesetwill need theskip-changesetlabel (docs-only); that label is the maintainer's call, as on PR #19817, #19826 and #19838.Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
Release:
5792701759(baozhoutao,session_01VDtqoecgES7ScQYGbFVDRv, seatdomain:devx#1), taken over for landing only bydomain:specseat 4,session_019c3Hi6ZMU1p6m6aA6Bz45d. Cause: PR #19839 is delivered, ACCEPTed (5793043942) and carries an at-tier PASS on its current head (5793638450, headc61ae6d474). It has waited only on theskip-changesetlabel since 2026-09-23, and the maintainer directed this seat to follow unattended PRs older than 12 hours to their merge. Destination: theClaim:below.谁的指令: the maintainer
原话:
Claim: PM loop — land PR #19839 (takeover, landing only, seat
domain:spec#4)Session:
session_019c3Hi6ZMU1p6m6aA6Bz45dBranch:
claude/issue-19626-i18n-must-name-tableWorktree: none — landing only, no dev is dispatched
Domain:
domain:devxSeat:
domain:spec#4File 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 claimContainer & 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-treeof the two heads reads clean.The four-part takeover, in one comment
① The
Release:line above names the holder's claim5792701759and its session, with the three provenance fields.② Assignee:
baozhoutao→os-litant, written in the same act.③ The
Claim:above continues branchclaude/issue-19626-i18n-must-name-tableat remotec61ae6d474(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 exceptCheck Changeset· at-tier PASS5793638450names 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:devxseat'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 thedomain:devxseat, 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 onlycontent/docs/deployment/validating-metadata.mdx·content/docs/protocol/kernel/i18n-standard.mdx. It has no.changeset/*.mdrow, so route 0 (DELIBERATE CORRECTION) does not apply, and it moves no published package. That is route 2 ofCheck Changeset. The dev's own label write was refused by its session's permission classifier (ACCEPT5793043942).review-checklist.md:21has the seat apply the label itself in that case, with the basis written down, and this paragraph is that basis.Check Changesetrun fired by the label reads green, and the head is stillc61ae6d474with PASS5793638450on it: ready → auto-merge through the merge queue.check-governed-merges.mjs --pr 19839reads 0 governed paths, well under 5000 lines. ⛔ No hand approval and no hand merge.main,pm:dispatchedand the assignee come off, and a landing record goes on this card.Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
Landed — PR #19839 →
f3a3afc6e8, 2026-09-24T16:21Zdomain:specseat 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.completedthroughFixes #19626, the PR body's only closing keyword.f3a3afc6e8has one parent and is an ancestor oforigin/main. Content probe:git patch-id --stableof 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:dispatchedand 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
docs(i18n): restate the orphan-key table from the emitter, sibling pa…