docs(i18n): restate the orphan-key table from the emitter, sibling packages included - #19839
Draft
objectstack-fleet[bot] wants to merge 1 commit into
Draft
objectstack-fleet[bot] wants to merge 1 commit into
objectstack-fleet[bot] wants to merge 1 commit into
Conversation
…ckages included
The "Must name" table under Orphan Keys and Option Keys still stated the
pre-fix rule: `objects.{object}` resolved only against "an object this stack
defines", which is false on the per-package pass, where a sibling package of
the same artifact is resolution context. Rewrite the table as one unit from
`validate-translation-references.ts`: define "declared" once (this stack or a
sibling package), add the rungs the emitter judges and the table omitted
(`_tabs`, `_validations`, `flows.*`, contributed-into apps, objectExtensions
targets), and extend the per-package sentence in validating-metadata.mdx to
the collections that resolve the same way.
Claude-Session: https://claude.ai/code/session_01VDtqoecgES7ScQYGbFVDRv
Co-authored-by: Claude <noreply@anthropic.com>
This was referenced Sep 23, 2026
Contributor
Author
Contract reviewServed-tier: ① Derived judgmentsAll against
② Semver levelDocs-only ③ Boundary flags
Implemented-by: VERDICT: PASS Isolated at-tier reviewer, adopted by the Generated by Claude Code |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #19626
Clause-②: no
What changed
The orphan-key table under Orphan Keys and Option Keys in
content/docs/protocol/kernel/i18n-standard.mdxis rewritten as one unit, row by row from the emitter oftranslation-target-unknownonorigin/main(1cacfe4a). It no longer uses the old rule.objects.{object}said "an object this stack defines, or a platform object". On the per-package pass, an object that a sibling package of the same artifact declares also resolves, and its subtree is judged against that sibling's declaration. The row now says so. It also names rung 2b, which was missing: an object anobjectExtensions[]entry extends but no package of the artifact declares is skipped whole._views,_sections,_actions,apps.*,dashboards.*,globalActions) now inherit that meaning instead of each implying "this stack". A short rule also covers what happens when the package and a sibling declare the same name: the package's own record is used to judge options, params, widgets and header actions, and flow screens._tabs,_validations,flows.{flow},.screens.{node}and.fields.{field}. The contributed-into app level (navigationContributions) is also added._views(the key the registry assigns,defaultfor an unnamed default list),_sections(all three anchors),fields(extension-merged fields and system columns), andglobalActions(a bound action gets a redirect, not a match).content/docs/deployment/validating-metadata.mdx: the per-package sentence ("so a sibling package's object still resolves") now also names the collections a translation key resolves the same way, and links to the table.The emitter covers more than the card listed. The card named six understated rungs.
artifactProvidedRecordsis also called forflowsandpages, andpagesfeeds_tabsandrecord:details_sections. So a sibling's flow, filter-preset tab or page section resolves too. Where the emitter and the card disagree, the table follows the emitter.Code sites each row is backed by
All in
packages/lint/src/validate-translation-references.tsat1cacfe4a:artifactProvidedRecords:919 (readspackages[].manifest.COLLECTION); calls forobjects:1019,views:1081,pages:1114,actions:1152,apps:1211,dashboards:1282,flows:1331ownDeclarationincollectObjectRecord:950,collectActionRecord:1137,collectDashboardRecord:1261,collectFlowRecord:1306objects.{object}isPlatformProvidedObjectNameskip,universe.extendedskip (rung 2b), otherwise orphan;objectExtensionsByTarget:834 reads stack andpackages[].fields.{field}IMPLICIT_FIELDS:284 (SYSTEM_FIELDS+_id/name/space); extension fold :1042-1070; check :1423.options.{key}checkOptionKeys:1778 (warning,translation-option-key-unknown)._views.{view}collectViewRecord:421,defaultListViewKey:574,namedViewKeys:612 (composer-derived keys)._sections.{section}fieldGroups[].keyincollectObjectRecord;addSectionsforformViews, the defaultformand the view record incollectViewRecord;record:detailsproperties.sectionsincollectPageRecord:1093._tabs.{tab}collectPageTabs:525 (interfaceConfig.source, elsepage.object;userFilters.tabs[].name); check :1484._validations.{rule}collectValidationRuleNames:238 (conditional branches), extension fold; check :1513._actions.{action}/.params.{param}collectActionRecord(owner =objectName/object);checkActionParams:1834globalActions.{action}actionOwnersapps.{app}/.navigation.{id}collectAppRecord(declared + sibling),contributedNavItemsByApp:738 (stackmanifest+packages[]),contributedOnlyAppspass; check :1599-1652dashboards.*collectDashboardRecord; check :1653-1695flows.*collectFlowRecord(walkFlowNodes,type: 'screen',config.fields[].name, object-form diagnosis); check :1696-1760The sibling behaviour for each rung is pinned in
validate-translation-references.test.ts, in the two describe blocks for objects a sibling package of the artifact declares (from :1253) and for collection rungs a sibling package declares (from :1463).Scope and changeset
Docs only:
content/docs/**, which is not a governed surface and publishes no package. No.changesetfile is needed; by thefiles[]criterion this isskip-changesetterritory, and the label is left to the PM seat.skills/objectstack-i18n/SKILL.mdis deliberately not touched, per the triage ruling.Verification
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsat headc61ae6d4: 40 commands. All 40 ran with exit 0. Four of them (check:doc-formula-expressions,check:doc-security-posture,check:skill-examples,check:docs-transcript-drift) first exited 3 (PREREQUISITE NOT MET, nothing measured). I built their named prerequisites (the lint, formula and client-react closures, plus spec) and re-ran them: all exit 0.--ranreconciliation: "40 derived, 40 run, 0 NOT-MEASURED, 0 UNRUN", which it calls a derived zero because every line recorded an exit code.check-doc-anchors: 368 internal #fragment link(s) across 410 source file(s) all resolve to a real heading(this covers the two new links);check-nul-bytes: OK;check-doc-frontmatterOK.Build Docsjob (the Next.js docs build), the type-check lanes and the other families listed outside the derived set.Acceptance notes
validate-translation-references.ts:122-123) still says rungs 3 and 4 "warn on the object key only", but both go throughorphan()atTRANSLATION_TARGET_UNKNOWN_SEVERITY = 'error'. This is comment drift inside the code, not a defect under class a, b or c, and it was not changed here (docs-only scope). No carrier.collectViewRecordalso registers a view record's rootnameas a_viewskey. The table describes the composer's keys (map key, ordefault) as the canonical spelling and does not list this edge.Generated by Claude Code