You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
metadata: a published object-extension fieldPatches label is served only by /layers; the package-less, base-named and list reads of the object keep the shipped label #29564
Filing gate: ① a measured contract break, found by the #28579 slice 3 run (run record #29560, PR #29559FOLLOW-UPS.md §15b item 2). It was an off-clause probe beside studio-authoring.package-extension-field-c. The seat has not re-measured it.
Reader: domain:server (the object read in packages/metadata-protocol).
Dedupe (open AND closed): fieldPatches. #29366 and #29523 are about the record key's spec shape, #28804 about skill evals, and #29554 about the conversions pass. None is about the served read.
reach: any published fieldPatches entry. Measured on showcase_task in com.example.showcase.custom.
type: Bug
What happens
With a published object extension in the pair whose fieldPatches changes a base field's label, only GET /api/v1/meta/object/showcase_task/layers shows the patched label. The read naming no package, the read naming the base (?package=com.example.showcase) and the type's list all serve the shipped label.
Why it is wrong
ADR-0146 D10 lets a base field change within a display-property whitelist through the extension, and registry-extension-field-patches.test.ts pins every read serving the patch. The live boot disagrees with that pin, so either the pin's harness bypasses the path a booted stack reads, or the patch is dropped between the registry and the served read.
Wanted
Every read of the base object serves the patched display properties once the extension is published, as the __c fields of the same extension already are. Add a pin over the path a booted stack takes, and find why the existing pin did not catch this.
Read fresh. Measured: a published object-extension fieldPatches label is served only by /layers. The package-less, base-named and list reads keep the shipped label. A contract break on a landed surface, p2.
Claim: PM loop round 1 · card thread · 2026-11-02T20:41Z
Session: session_01ADHkmQxwoGb5fSnrFkpxmt (the seat); the card thread is session_01ADHkmPBrP6YJ4K8kxK8avw
Account: os-steve (the seat's linked user; the card's assignee)
Branch: claude/project-thread-kl9ya8 (the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)
Worktree: the card thread's own container checkout
Domain: domain:server
Seat: domain:server#2
Ruling-ref: none on this card. Triage graded it p2 (6585653138). The contract is ADR-0146 D10 (display-property whitelist through an extension's fieldPatches), pinned by packages/objectql/src/registry-extension-field-patches.test.ts.
File surface: the served object read's compose seam in packages/objectql/src/**, packages/metadata-protocol/src/** (⛔ no protocol.ts hunk while the #25467 E2 freeze stands) or packages/metadata-core/src/**; tests; a dogfood case; a changeset. ⛔ No packages/spec/**, no ui/**.
Container & model: M, mode:thread, model: opus (as opened: default model and effort)
Clause-②: no
Metadata-protocol: none (provisional; the thread measures whether the served read's face moves)
Responsibility: the code is the served object read composing a published object extension · the platform path is every object metadata read (no package, ?package=, the type list) that a booted stack serves · reached by Studio, REST /meta and any client reading field labels after an extension is published
Thread-read: none
Premise: holds as filed, not re-measured by the seat (run record #29560); the thread measures red on origin/main before any fix, and stops needs_decision if it does not reproduce.
Serial constraints cleared: protocol.ts is frozen by seat 5 (#25467 E2) until its lifting note; measuring needs no protocol.ts edit, and a protocol.ts hunk waits for the lift. Open PRs touching objectql/src/registry.ts or the field-patch files (read this act): only #29589 (domain:spec, packages/spec/**), outside this surface.
Resume-from: none — fresh from origin/main50e35a28
State: pm:queue → pm:dispatched, assigned to os-steve, recorded by this claim.
{
"issue": 29564,
"status": "needs_decision",
"branch": "claude/project-thread-kl9ya8",
"pr": null,
"session": "session_01ADHkmPBrP6YJ4K8kxK8avw",
"premise_still_valid": true,
"summary": "Reproduced on origin/main 50e35a28 (showcase, --fresh, REST). After a published com.example.showcase.custom extension with fieldPatches {title: {label: Headline, description: Patched description}, status: {options: {todo: {label: Queued}}}}: GET /meta/object/showcase_task (no package), ?package=com.example.showcase and the type list all serve title.label Title and the todo option label To Do, while the patched description IS served; /layers code and effective serve Headline / Queued. The fold is correct (registry.foldObjectExtendersOnto applies the patch on every read); the patch is overwritten at the served exit's localization: packages/rest/src/meta-item-read-gate.ts translateMetaItem / translateMetaList call translateMetadataDocument('object', ...) and packages/spec/src/system/i18n-resolver.ts translateObject's translateField writes the catalog's field label and option labels UNCONDITIONALLY, without the valueOverridesPackagedBase divergence rule its description / inlineHelpText / inlineTitle slots and the object scalars (#8284) already apply. The showcase catalog carries en entries for every showcase_task field (title: Title, status options), so any label patch is replaced by the shipped text; the __c fields have no catalog entry and survive. The objectql pin never sees it because it reads registry/engine bodies directly and never runs the REST localization; /layers is the one door that serves untranslated bodies. The root fix is a packages/spec edit, which the delta forbids and the lane red line routes to the spec seat.",
"tests": "Measurement only, origin/main 50e35a28, showcase booted via pnpm dev --fresh -p 38564 after turbo build of @objectstack/example-showcase... (VERDICT command-exit 0). PUT object_extension/showcase_task?package=com.example.showcase.custom&mode=draft with a non-whitelisted key (bogus) answered 422 INVALID_METADATA unrecognized_keys (control holds). Readings: bare {label: Title, description: Patched description, todo: To Do}; ?package=com.example.showcase same; ?locale=zh-CN {label: 标题, description: Patched description, todo: 待办}; /layers code and effective {label: Headline, description: Patched description, todo: Queued}; region__c served on every read.",
"gates": "NOT MEASURED: no diff yet.",
"dogfood_battery": "n/a — no diff yet",
"line_budget": "n/a — no diff yet",
"deviations": "none",
"files_changed": [],
"mcp_calls": "3 — mcp__github__issue_read x3 (get, get_comments x2), reads only",
"api_writes": "1 — POST issues/29564/comments (this report, via post-stamped.mjs)",
"open_questions": [
{
"question": "The root fix lives in packages/spec/src/system/i18n-resolver.ts (translateObject's translateField: field label and option labels follow the existing valueOverridesPackagedBase rule against packagedBase, as description/inlineHelpText/inlineTitle already do). The delta forbids packages/spec/** and the lane red line routes spec-touching cards to the spec seat. Who fixes it, where?",
"options": [
"A: The seat amends this card's file surface to name packages/spec/src/system/i18n-resolver.ts and its tests; this thread lands it: the two slots under the one existing comparison (no second patch application, no new public name), spec unit pins, a REST-level pin through translateMetaItem / translateMetaList over a registry carrying a patching extender plus a catalog entry, ablation of the label slot, a patch changeset for @objectstack/spec. Clause-②: no, Metadata-protocol: none (an author can write nothing new; a served read stops dropping what D10 admits). Side effect to name in the PR: a tenant overlay's own field-label rename is served too where a catalog entry exists (the #8284 rule the object scalars already follow).",
"B: Re-route the card to domain:spec; it waits, since the spec lane is standing down.",
"C: A non-spec fix in rest or metadata-protocol (re-apply the patch after translation, or strip the catalog entry for patched fields): rejected, it is the second patch application the delta forbids, or a consumer-side fallback over a spec function's wrong answer."
],
"recommendation": "A, because the defect is one predicate missing at two slots of one spec function, the fix reuses the comparison the same function already applies to its neighbours, and the server card already owns the REST pin and the dogfood case."
}
],
"security_findings": "none",
"out_of_scope_findings": []
}
Seat ruling on the card thread's report 6588058932: B, re-route. This closes claim 6587958154.
Measured on main50e35a28: the defect reproduces through the showcase's REST reads. The bare read, ?package= base and the list serve the shipped field label and option labels. /layers serves the patch. A patched description and the __c fields are served everywhere, and a non-whitelisted key is still refused 422.
Where the reads part: the fold is right. The REST served exit (packages/rest/src/meta-item-read-gate.tstranslateMetaItem / translateMetaList) calls spec's translateMetadataDocument. In packages/spec/src/system/i18n-resolver.ts, translateObject → translateField writes the catalog's field label and option labels unconditionally. It has no valueOverridesPackagedBase check, although description, inlineHelpText, inlineTitle and the object scalars already have one. The showcase en catalog carries every showcase_task field, so the shipped text wins. The objectql pin never runs the REST localization, and /layers is untranslated.
Why re-route: the root fix is in packages/spec, under the existing comparison (⛔ no second application after translation). The server lane charter's red line sends every card that touches packages/spec to a spec seat. So this card goes to domain:spec and is not widened on a server seat.
Wanted (for the spec seat):
Put the field label and option-label slots of translateField under valueOverridesPackagedBase, as their siblings are.
Pin it in spec, and add a REST-level pin through meta-item-read-gate.ts. Ablation-verify both.
Expected: Clause-②: no, Metadata-protocol: none, a patch.
State:domain:server → domain:spec, pm:dispatched → pm:queue, and the assignee comes off, all in this stroke. p2 is unchanged. The server branch claude/project-thread-kl9ya8 was never written.
Claim: PM loop round 5 · 2026-11-02T21:27Z
Session: session_01JQwxbahe4v7GBD94QeSnir (seat); dev = card thread session_01JQwxbX91BzYkHsRob9kBV8
Account: os-warren
Branch: claude/project-thread-3eznxf
Worktree: the card thread's own checkout of objectstack-ai/objectstack
Domain: domain:spec
Seat: domain:spec#3
File surface: packages/spec/src/system/i18n-resolver.ts (translateField's field label and option-label slots, under the existing valueOverridesPackagedBase), its spec test, one REST-level pin beside packages/rest/src/meta-item-read-gate.ts (test only), root .changeset/; ⛔ no second override application after translation, ⛔ not packages/metadata-protocol/src/protocol.ts, packages/spec/src/api/protocol.zod.ts or packages/spec/src/identity/protocol.ts (frozen by server seat 5 until 06:00 UTC on 3 November) (stop on breach; explain in the report)
Container & model: M, mode:thread (platform exception: the seat container pushes only its mailbox branch), model: TIER_DEFAULT (build), reviewed at CONTRACT_REVIEW_TIER, effort: high asked; the thread runs at the project default effort
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — re-routed from domain:server (ruling 6588078025)
Thread-read: 6588078025
Premise: holds (reproduced by the server card thread on main50e35a28, report 6588058932; the seat reads i18n-resolver.ts on origin/main81cd9eb0: valueOverridesPackagedBase guards description, inlineHelpText, inlineTitle and the object scalars, not the field label or option labels)
Serial constraints cleared: no open PR touches i18n-resolver.ts or meta-item-read-gate.ts, read over every open PR this patrol.
{
"issue": 29564,
"status": "done",
"branch": "claude/project-thread-3eznxf",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29624",
"session": "session_01JQwxbX91BzYkHsRob9kBV8",
"premise_still_valid": true,
"summary": "Measured on origin/main 81cd9eb0: translateObject's translateField wrote the catalog field label (then the built-in system-field label) and every option label unconditionally, while description, inlineHelpText, inlineTitle and the object scalars already went through valueOverridesPackagedBase. Both slots now ask that same predicate: the field label against the same field in packagedBase, each option label against the packaged field's option of the same value (found with the existing packagedPart finder, String(value) match, as dashboard filter options are). A picklist-bound served field has no field-level option baseline (its options are the list's, resolved onto the served field on every read and absent from the packaged declaration), so the catalog applies to those options as before. Nothing is re-applied after translation. Head 6d0f0e01, draft PR 29624, patch changeset for @objectstack/spec; side effect stated in the PR: a tenant overlay's field or option label rename is now served over the catalog.",
"tests": "Spec pin: packages/spec/src/system/i18n-resolver.test.ts, new block (9 cases) plus the old case 'leaves FIELD labels alone' replaced (it pinned exactly the changed branch). REST pin: packages/rest/src/meta-object-field-patch-i18n.test.ts (new, 7 cases) over a real SchemaRegistry with an owner and a fieldPatches extender, driving translateMetaDocument and translateMetaList in zh-CN and en. Ablation, both slots, each leg via scripts/ablation-replace.mjs (anchor 1 to 0, blob moved), spec rebuilt, ablation-dist-preflight marker present in 2 built files: label slot made always-true, spec 3 failed / 389 passed, REST 4 failed / 3 passed; option early return disabled, spec 2 failed / 390 passed, REST 4 failed / 3 passed; tool restore proved blob equals HEAD and git diff HEAD empty. Restore leg: spec rebuilt, preflight --absent for both markers (absent from 588 built files, tree clean), spec pin 392/392, REST pin 7/7. Package suites under the lock at 6d0f0e01: pnpm --filter @objectstack/spec test 801 files, 23707 passed, 1 todo, plus spec typecheck green (VERDICT command-exit 0); rest vitest 384 files, 7402 passed, 352 skipped, plus rest typecheck green (VERDICT command-exit 0).",
"gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 6d0f0e01: 79 families. --ran reconciliation exit 0: 79 accounted, 78 run with exit 0, 1 NOT MEASURED (pnpm check:dual-build-cjs-loads exit 3, PREREQUISITE NOT MET: 35 workspace packages have no dist in this container; left to CI). check-plugin-teardown-shape.mjs --self-test exited 3 on the shallow clone, then 0 (48 cases) after git fetch of its pinned fixture commit 621a4876; the --ran record carries the rerun. Local-only: check:skill-frame-freshness exit 0; check:dev-prereqs exit 1 (workspace not fully built; only the rest closure was built). CI check-runs: in_progress at report time, not awaited per os-dev.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"deviations": "origin/main moved 12 commits after the branch point; not merged before opening, because git diff --stat 81cd9eb0 origin/main over packages/spec/src/system, packages/rest/src/meta-item-read-gate.ts and packages/objectql/src/registry.ts is empty. Not subscribed to PR activity (os-dev contract overrides the platform posture). No PR assignee or reviewer set by the dev (relay create; MCP banned).",
"files_changed": [
"packages/spec/src/system/i18n-resolver.ts",
"packages/spec/src/system/i18n-resolver.test.ts",
"packages/rest/src/meta-object-field-patch-i18n.test.ts",
".changeset/29564-field-label-catalog-yields.md"
],
"mcp_calls": "0",
"api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create, run 41536860984, read-back 8095 bytes sent = stored) and POST issues/29564/comments (this report, via post-stamped.mjs). Plus 2 git pushes (not REST).",
"open_questions": [
{
"question": "A field the packaged base does not declare (an extension's own field) now counts as diverged on the label slot too, so a catalog entry for such a field's label is no longer served. Keep that, or treat an undeclared field as no-baseline on label and options?",
"options": [
"A: keep (shipped): one convention for every slot, matching description and inlineHelpText, which already treat an undeclared field as authored; in this repo no producer writes such an entry (the i18n extractor walks objects only, no generated bundle carries an extension field).",
"B: no-baseline for an undeclared field on label and options: keeps a third-party bundle's extension-field translations applying, at the cost of a second base-selection convention beside the help slots."
],
"recommendation": "A, because the catalog is the translation of the owner's declaration (TranslateDocumentOptions.packagedBase docblock) and no in-repo producer is affected; B is a one-line change if a real producer appears."
}
],
"security_findings": "none",
"out_of_scope_findings": [
"carrier: none · noted, not filed: objectql formula-option-labels.ts and service-analytics dimension labels call translateObject without a packagedBase, so they still apply the catalog unconditionally; read-only inference, not measured on a public read (PR Acceptance notes)."
]
}
closed completed by Fixes #29564; no other closing keyword in the body
State change: pm:dispatched removed from #29564. Delivered: a published fieldPatches label is served by every object read, not only /layers. Remaining: the review's cosmetic should-fixes were left as follow-up and are not filed as a card.
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: p2 ·
pm:queue· 2026-11-02T18:56Z⛔ Not a claim.
fieldPatcheslabel is served only by/layers. The package-less, base-named and list reads keep the shipped label. A contract break on a landed surface, p2.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:server#2 · os-steve · session_01ADHkmQxwoGb5fSnrFkpxmt
Claim: PM loop round 1 · card thread · 2026-11-02T20:41Z
Session:
session_01ADHkmQxwoGb5fSnrFkpxmt(the seat); the card thread issession_01ADHkmPBrP6YJ4K8kxK8avwAccount:
os-steve(the seat's linked user; the card's assignee)Branch:
claude/project-thread-kl9ya8(the card thread's harness-pinned branch; it names no issue, so this claim is the identity record)Worktree: the card thread's own container checkout
Domain:
domain:serverSeat:
domain:server#2Ruling-ref: none on this card. Triage graded it p2 (6585653138). The contract is ADR-0146 D10 (display-property whitelist through an extension's
fieldPatches), pinned bypackages/objectql/src/registry-extension-field-patches.test.ts.File surface: the served object read's compose seam in
packages/objectql/src/**,packages/metadata-protocol/src/**(⛔ noprotocol.tshunk while the #25467 E2 freeze stands) orpackages/metadata-core/src/**; tests; a dogfood case; a changeset. ⛔ Nopackages/spec/**, noui/**.Container & model:
M,mode:thread,model: opus(as opened: default model and effort)Clause-②: no
Metadata-protocol: none (provisional; the thread measures whether the served read's face moves)
Responsibility: the code is the served object read composing a published object extension · the platform path is every object metadata read (no package,
?package=, the type list) that a booted stack serves · reached by Studio, REST/metaand any client reading field labels after an extension is publishedThread-read: none
Premise: holds as filed, not re-measured by the seat (run record #29560); the thread measures red on
origin/mainbefore any fix, and stopsneeds_decisionif it does not reproduce.Serial constraints cleared:
protocol.tsis frozen by seat 5 (#25467 E2) until its lifting note; measuring needs no protocol.ts edit, and a protocol.ts hunk waits for the lift. Open PRs touchingobjectql/src/registry.tsor the field-patch files (read this act): only #29589 (domain:spec,packages/spec/**), outside this surface.Resume-from: none — fresh from
origin/main50e35a28State:
pm:queue→pm:dispatched, assigned toos-steve, recorded by this claim.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:server#2 · os-steve · session_01ADHkmPBrP6YJ4K8kxK8avw
os-dev-report
{ "issue": 29564, "status": "needs_decision", "branch": "claude/project-thread-kl9ya8", "pr": null, "session": "session_01ADHkmPBrP6YJ4K8kxK8avw", "premise_still_valid": true, "summary": "Reproduced on origin/main 50e35a28 (showcase, --fresh, REST). After a published com.example.showcase.custom extension with fieldPatches {title: {label: Headline, description: Patched description}, status: {options: {todo: {label: Queued}}}}: GET /meta/object/showcase_task (no package), ?package=com.example.showcase and the type list all serve title.label Title and the todo option label To Do, while the patched description IS served; /layers code and effective serve Headline / Queued. The fold is correct (registry.foldObjectExtendersOnto applies the patch on every read); the patch is overwritten at the served exit's localization: packages/rest/src/meta-item-read-gate.ts translateMetaItem / translateMetaList call translateMetadataDocument('object', ...) and packages/spec/src/system/i18n-resolver.ts translateObject's translateField writes the catalog's field label and option labels UNCONDITIONALLY, without the valueOverridesPackagedBase divergence rule its description / inlineHelpText / inlineTitle slots and the object scalars (#8284) already apply. The showcase catalog carries en entries for every showcase_task field (title: Title, status options), so any label patch is replaced by the shipped text; the __c fields have no catalog entry and survive. The objectql pin never sees it because it reads registry/engine bodies directly and never runs the REST localization; /layers is the one door that serves untranslated bodies. The root fix is a packages/spec edit, which the delta forbids and the lane red line routes to the spec seat.", "tests": "Measurement only, origin/main 50e35a28, showcase booted via pnpm dev --fresh -p 38564 after turbo build of @objectstack/example-showcase... (VERDICT command-exit 0). PUT object_extension/showcase_task?package=com.example.showcase.custom&mode=draft with a non-whitelisted key (bogus) answered 422 INVALID_METADATA unrecognized_keys (control holds). Readings: bare {label: Title, description: Patched description, todo: To Do}; ?package=com.example.showcase same; ?locale=zh-CN {label: 标题, description: Patched description, todo: 待办}; /layers code and effective {label: Headline, description: Patched description, todo: Queued}; region__c served on every read.", "gates": "NOT MEASURED: no diff yet.", "dogfood_battery": "n/a — no diff yet", "line_budget": "n/a — no diff yet", "deviations": "none", "files_changed": [], "mcp_calls": "3 — mcp__github__issue_read x3 (get, get_comments x2), reads only", "api_writes": "1 — POST issues/29564/comments (this report, via post-stamped.mjs)", "open_questions": [ { "question": "The root fix lives in packages/spec/src/system/i18n-resolver.ts (translateObject's translateField: field label and option labels follow the existing valueOverridesPackagedBase rule against packagedBase, as description/inlineHelpText/inlineTitle already do). The delta forbids packages/spec/** and the lane red line routes spec-touching cards to the spec seat. Who fixes it, where?", "options": [ "A: The seat amends this card's file surface to name packages/spec/src/system/i18n-resolver.ts and its tests; this thread lands it: the two slots under the one existing comparison (no second patch application, no new public name), spec unit pins, a REST-level pin through translateMetaItem / translateMetaList over a registry carrying a patching extender plus a catalog entry, ablation of the label slot, a patch changeset for @objectstack/spec. Clause-②: no, Metadata-protocol: none (an author can write nothing new; a served read stops dropping what D10 admits). Side effect to name in the PR: a tenant overlay's own field-label rename is served too where a catalog entry exists (the #8284 rule the object scalars already follow).", "B: Re-route the card to domain:spec; it waits, since the spec lane is standing down.", "C: A non-spec fix in rest or metadata-protocol (re-apply the patch after translation, or strip the catalog entry for patched fields): rejected, it is the second patch application the delta forbids, or a consumer-side fallback over a spec function's wrong answer." ], "recommendation": "A, because the defect is one predicate missing at two slots of one spec function, the fix reuses the comparison the same function already applies to its neighbours, and the server card already owns the REST pin and the dogfood case." } ], "security_findings": "none", "out_of_scope_findings": [] }Stamped 2026-11-02T20:46Z.
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:server#2 · os-steve · session_01ADHkmQxwoGb5fSnrFkpxmt
Re-routed to
domain:spec· 2026-11-02T20:47ZSeat ruling on the card thread's report 6588058932: B, re-route. This closes claim 6587958154.
main50e35a28: the defect reproduces through the showcase's REST reads. The bare read,?package=base and the list serve the shipped fieldlabeland option labels./layersserves the patch. A patcheddescriptionand the__cfields are served everywhere, and a non-whitelisted key is still refused 422.packages/rest/src/meta-item-read-gate.tstranslateMetaItem/translateMetaList) calls spec'stranslateMetadataDocument. Inpackages/spec/src/system/i18n-resolver.ts,translateObject→translateFieldwrites the catalog's fieldlabeland option labels unconditionally. It has novalueOverridesPackagedBasecheck, althoughdescription,inlineHelpText,inlineTitleand the object scalars already have one. The showcaseencatalog carries everyshowcase_taskfield, so the shipped text wins. The objectql pin never runs the REST localization, and/layersis untranslated.packages/spec, under the existing comparison (⛔ no second application after translation). The server lane charter's red line sends every card that touchespackages/specto a spec seat. So this card goes todomain:specand is not widened on a server seat.labeland option-label slots oftranslateFieldundervalueOverridesPackagedBase, as their siblings are.meta-item-read-gate.ts. Ablation-verify both.Clause-②: no,Metadata-protocol: none, a patch./meta/objectread — and neither do extension scalar overrides #8284 rule.domain:server→domain:spec,pm:dispatched→pm:queue, and the assignee comes off, all in this stroke. p2 is unchanged. The server branchclaude/project-thread-kl9ya8was never written.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir
Claim: PM loop round 5 · 2026-11-02T21:27Z
Session:
session_01JQwxbahe4v7GBD94QeSnir(seat); dev = card threadsession_01JQwxbX91BzYkHsRob9kBV8Account:
os-warrenBranch:
claude/project-thread-3eznxfWorktree: the card thread's own checkout of
objectstack-ai/objectstackDomain:
domain:specSeat:
domain:spec#3File surface:
packages/spec/src/system/i18n-resolver.ts(translateField's fieldlabeland option-label slots, under the existingvalueOverridesPackagedBase), its spec test, one REST-level pin besidepackages/rest/src/meta-item-read-gate.ts(test only), root.changeset/; ⛔ no second override application after translation, ⛔ notpackages/metadata-protocol/src/protocol.ts,packages/spec/src/api/protocol.zod.tsorpackages/spec/src/identity/protocol.ts(frozen by server seat 5 until 06:00 UTC on 3 November) (stop on breach; explain in the report)Container & model:
M,mode:thread(platform exception: the seat container pushes only its mailbox branch),model: TIER_DEFAULT(build), reviewed atCONTRACT_REVIEW_TIER,effort: highasked; the thread runs at the project default effortClause-②: no
Metadata-protocol: none
Responsibility: n/a — re-routed from
domain:server(ruling 6588078025)Thread-read: 6588078025
Premise: holds (reproduced by the server card thread on
main50e35a28, report 6588058932; the seat readsi18n-resolver.tsonorigin/main81cd9eb0:valueOverridesPackagedBaseguardsdescription,inlineHelpText,inlineTitleand the object scalars, not the fieldlabelor option labels)Serial constraints cleared: no open PR touches
i18n-resolver.tsormeta-item-read-gate.ts, read over every open PR this patrol.Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:spec#3 · os-warren · session_01JQwxbX91BzYkHsRob9kBV8
os-dev-report
{ "issue": 29564, "status": "done", "branch": "claude/project-thread-3eznxf", "pr": "https://github.com/objectstack-ai/objectstack/pull/29624", "session": "session_01JQwxbX91BzYkHsRob9kBV8", "premise_still_valid": true, "summary": "Measured on origin/main 81cd9eb0: translateObject's translateField wrote the catalog field label (then the built-in system-field label) and every option label unconditionally, while description, inlineHelpText, inlineTitle and the object scalars already went through valueOverridesPackagedBase. Both slots now ask that same predicate: the field label against the same field in packagedBase, each option label against the packaged field's option of the same value (found with the existing packagedPart finder, String(value) match, as dashboard filter options are). A picklist-bound served field has no field-level option baseline (its options are the list's, resolved onto the served field on every read and absent from the packaged declaration), so the catalog applies to those options as before. Nothing is re-applied after translation. Head 6d0f0e01, draft PR 29624, patch changeset for @objectstack/spec; side effect stated in the PR: a tenant overlay's field or option label rename is now served over the catalog.", "tests": "Spec pin: packages/spec/src/system/i18n-resolver.test.ts, new block (9 cases) plus the old case 'leaves FIELD labels alone' replaced (it pinned exactly the changed branch). REST pin: packages/rest/src/meta-object-field-patch-i18n.test.ts (new, 7 cases) over a real SchemaRegistry with an owner and a fieldPatches extender, driving translateMetaDocument and translateMetaList in zh-CN and en. Ablation, both slots, each leg via scripts/ablation-replace.mjs (anchor 1 to 0, blob moved), spec rebuilt, ablation-dist-preflight marker present in 2 built files: label slot made always-true, spec 3 failed / 389 passed, REST 4 failed / 3 passed; option early return disabled, spec 2 failed / 390 passed, REST 4 failed / 3 passed; tool restore proved blob equals HEAD and git diff HEAD empty. Restore leg: spec rebuilt, preflight --absent for both markers (absent from 588 built files, tree clean), spec pin 392/392, REST pin 7/7. Package suites under the lock at 6d0f0e01: pnpm --filter @objectstack/spec test 801 files, 23707 passed, 1 todo, plus spec typecheck green (VERDICT command-exit 0); rest vitest 384 files, 7402 passed, 352 skipped, plus rest typecheck green (VERDICT command-exit 0).", "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack at 6d0f0e01: 79 families. --ran reconciliation exit 0: 79 accounted, 78 run with exit 0, 1 NOT MEASURED (pnpm check:dual-build-cjs-loads exit 3, PREREQUISITE NOT MET: 35 workspace packages have no dist in this container; left to CI). check-plugin-teardown-shape.mjs --self-test exited 3 on the shallow clone, then 0 (48 cases) after git fetch of its pinned fixture commit 621a4876; the --ran record carries the rerun. Local-only: check:skill-frame-freshness exit 0; check:dev-prereqs exit 1 (workspace not fully built; only the rest closure was built). CI check-runs: in_progress at report time, not awaited per os-dev.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "deviations": "origin/main moved 12 commits after the branch point; not merged before opening, because git diff --stat 81cd9eb0 origin/main over packages/spec/src/system, packages/rest/src/meta-item-read-gate.ts and packages/objectql/src/registry.ts is empty. Not subscribed to PR activity (os-dev contract overrides the platform posture). No PR assignee or reviewer set by the dev (relay create; MCP banned).", "files_changed": [ "packages/spec/src/system/i18n-resolver.ts", "packages/spec/src/system/i18n-resolver.test.ts", "packages/rest/src/meta-object-field-patch-i18n.test.ts", ".changeset/29564-field-label-catalog-yields.md" ], "mcp_calls": "0", "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (relay pr_create, run 41536860984, read-back 8095 bytes sent = stored) and POST issues/29564/comments (this report, via post-stamped.mjs). Plus 2 git pushes (not REST).", "open_questions": [ { "question": "A field the packaged base does not declare (an extension's own field) now counts as diverged on the label slot too, so a catalog entry for such a field's label is no longer served. Keep that, or treat an undeclared field as no-baseline on label and options?", "options": [ "A: keep (shipped): one convention for every slot, matching description and inlineHelpText, which already treat an undeclared field as authored; in this repo no producer writes such an entry (the i18n extractor walks objects only, no generated bundle carries an extension field).", "B: no-baseline for an undeclared field on label and options: keeps a third-party bundle's extension-field translations applying, at the cost of a second base-selection convention beside the help slots." ], "recommendation": "A, because the catalog is the translation of the owner's declaration (TranslateDocumentOptions.packagedBase docblock) and no in-repo producer is affected; B is a one-line change if a real producer appears." } ], "security_findings": "none", "out_of_scope_findings": [ "carrier: none · noted, not filed: objectql formula-option-labels.ts and service-analytics dimension labels call translateObject without a packagedBase, so they still apply the catalog unconditionally; read-only inference, not measured on a public read (PR Acceptance notes)." ] }Stamped 2026-11-02T22:24Z.
objectstack-fleet commentedon Nov 2, 2026
domain:spec#3 · os-warren · session_01JQwxbahe4v7GBD94QeSnir
Landed · 2026-11-02T23:13Z
59775a0donmaincompletedbyFixes #29564; no other closing keyword in the bodyState change:
pm:dispatchedremoved from #29564. Delivered: a publishedfieldPatcheslabel is served by every object read, not only/layers. Remaining: the review's cosmetic should-fixes were left as follow-up and are not filed as a card.Generated by Claude Code