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
fieldPatches: make the fold, the install door and os validate agree on a patch of a field another extension adds, and fix the stale actions guidance list #28733
Filing gate: ③ the three should-fix findings of the CONTRACT_REVIEW_TIER review of PR #28728 (#28565), comment 6560336731, filed by the seat before ACCEPT rather than reworked into a reviewed head. ⛔ Not a claim. Graded by this seat: p3 (the key is new, no shipped package patches an extension-added field; the spec sentence stays true), under 「定级你可以自己决定」 (Leehom, 2026-11-01).
Reach: a package author patching a field that another extension (or the same extension's fields) adds, and any author reading the actions refusal on an object extension.
Reader who acts: a domain:server seat (packages/objectql/src/registry.ts, packages/cli/src/utils/field-patch-targets.ts, packages/spec/src/data/object.zod.ts).
Three readers, three answers for a patch of an extension-added field. The registry fold applies it only when the adding extender has LOWER priority than the patching one (contributor loop order); the reportFieldPatchMisses docblock's "applies on the next read" is false for a higher-priority adder. The install door judges against the fully resolved registry object, so it admits the patch. os validate judges against declared objects only (declaredObjects in cli/src/utils/field-patch-targets.ts), so it refuses it. registry.ts and content/docs/data-modeling/object-extensions.mdx say a patch "reaches a field a lower-priority extender added"; the spec .describe() says "the target object's own fields".
Stale guidance.ObjectExtensionSchema.guidance.actions still says the merge carries fields, label, pluralLabel, description, validations and indexes "only"; the code comment above it already lists fieldPatches.
Array-spelled fields. The fold's miss warning uses the metadata-core judge, which reads array-spelled fields, while recordFieldOf patches record-spelled fields only; an array-spelled body through foldObjectExtendersOnto is neither patched nor warned.
Wanted
One answer for item 1, the same at all three readers and in the docs: either a field patch reaches only the owner's own fields (fold skips extension-added fields, install door judges the owner's body, docs and docblocks say so), or it reaches extension-added fields regardless of priority (fold applies patches after all additive merges, os validate folds in-stack extensions before judging). The seat's lean: owner's own fields only, which is what the published spec sentence already says and keeps D10 "display of a vendor field" narrow.
Item 2: add fieldPatches to that sentence (or drop the "only" list).
Item 3: judge and patch the same spellings in the fold.
Clause-② and Metadata-protocol lines decided by the choice in item 1.
Item 4, added from the delta contract review of PR #28728 at d4414410 (finding S4): the marketplace install door now answers VALIDATION_ERROR with two statuses. Step 2e (the field-patch target check) answers 400. Every other body refusal at that door, #28724's __c judge at 1c'' included, answers 422 (UNRUNNABLE_REFUSAL_STATUS), while the save door's VALIDATION_ERROR is 400. Wanted: move 2e to UNRUNNABLE_REFUSAL_STATUS with its test pin, or record a reason to keep 400. Nothing admitted or refused changes with the number.
Claim: PM loop round 1 · card thread · 2026-11-01T18:22Z
Session: session_01FEkQ5oc56xChD6Wrc4cGSt (the seat); the card thread is session_01FEkQ5px88TLYX7Piuoxnb2
Account: os-project-manager (the seat's linked user; the card's assignee)
Branch: claude/project-thread-f9w1nf (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#5
Ruling-ref: 「定级你可以自己决定」 (Leehom, 2026-11-01T12:11Z) with this seat's grade as filed (p3) and the seat's rulings in the order; picks announced to seats 1-3, all three confirmed no clash (seat 1: keep separate from #28574).
File surface: packages/objectql/src/registry.ts and its field-patch tests, packages/cloud-connection/src/marketplace-install-local-plugin.ts (step 2e) and its test, packages/spec/src/data/object.zod.ts (guidance.actions prose only), content/docs/data-modeling/object-extensions.mdx, packages/metadata-core/src/extension-field-patch-targets.ts only if ruling 3 needs it, changesets. ⛔ No skills/**.
Container & model: M, mode:thread, model and effort as the thread was opened
Clause-②: no (narrowing)
Metadata-protocol: narrowed
Responsibility: the code is the objectql registry fold's fieldPatches application and the install-local door's field-patch target check · the three readers disagree on a patch of an extension-added field, and the door answers 400 where its siblings answer 422 · reached by any package declaring objectExtensions[].fieldPatches, live since PR #28728
Thread-read: 6561932343
Premise: holds (read at origin/main706ac52d, which contains PR #28728e62dcc567b: mergeObjectDefinitions applies patches after the additive merges per contributor, the install door judges the resolved registry object, step 2e answers 400)
Serial constraints cleared: seat 1's #28574 works on the objectql 'extend' registration and the extension sync next to this; seat 1 agreed the second to land merges origin/main.
Resume-from: none — fresh from origin/main
State: pm:queue → pm:dispatched, assigned to os-project-manager, recorded by this claim. Order: pm-orders/server/order-28733.md in the project.
os-dev-report
{
"issue": 28733,
"status": "done",
"branch": "claude/project-thread-f9w1nf",
"pr": "#28791",
"session": "session_01FEkQ5px88TLYX7Piuoxnb2",
"premise_still_valid": true,
"summary": "Ruling 1: the registry fold applies a field patch only to a field the own contributor declares (ownFieldNamesOf), whatever the priorities, and names a skipped patch once by asking the shared judge of the owner's fields as merged (ownFieldsTarget); the install door step 2e judges against the owner's declaration through the new public SchemaRegistry#getFieldPatchTarget; os validate unchanged; registry docblocks and object-extensions.mdx say owner-only. Ruling 2: guidance.actions names fieldPatches (prose only). Ruling 3: measured 230 bodies at foldObjectExtendersOnto in a showcase boot plus a by-name and layered sweep of 115 objects, all record-spelled, 0 array, so the fold patches and judges the record spelling only. Ruling 4: 2e answers UNRUNNABLE_REFUSAL_CODE/STATUS (422). Changeset minor + BREAKING on objectql, cloud-connection, spec; ADR-0087 not-required (no-migration-prescription); migration count 0 (no fieldPatches in examples/**; packages/*/src only the implementing code and tests). Note on #28730 posted (comment on that card).",
"tests": "Red first: tests alone at bac758a on base 706ac52 (base src + whole-repo base build): registry-extension-field-patches.test.ts 3 failed / 8 passed (A100 adds region + B200 patches; reverse priority; same-extension fields + patch; array-spelled body); marketplace-install-local-field-patch-targets.test.ts 5 failed / 2 passed (4 x expected 400 to be 422; extension-added region admitted 200). Head: 11/11 and 7/7. Ablations at e06656b via scripts/ablation-replace.mjs (anchor 1->0, restored to HEAD blob, git diff HEAD empty each): A1 ownFields guard removed -> 2 red; A2 miss report judges merged object -> 3 red; A3 door target getObject -> 1 red; A4 2e status 400 -> 5 red. No dist ablation needed: the registry test imports src, the door test mutates door src while the real registry comes from a built objectql dist (built at head before A3/A4). Suites at 6042821 after merge + whole-repo build (117/117): objectql 518 files/9953 tests exit 0; cloud-connection 67/810 exit 0; metadata-core 22/885 exit 0; spec src/data 154/4756 (1 todo) exit 0; typecheck objectql, cloud-connection, metadata-core, spec exit 0; eslint --no-inline-config on the 6 touched source files exit 0. Live probe (pm-orders/server/evidence/28733/): base B patch of extension-added region -> HTTP 200, served Territory; head -> HTTP 422 VALIDATION_ERROR details.refusals [objectExtensions[0].fieldPatches.region], served Region; owner-field patch C installs and serves Sector on both.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 6042821: 107 derived, 107 run, all exit 0 (captured before any pipe, file-redirected). --ran: 107 derived, 107 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. spec check:generated exit 0, all 14 artifacts up to date. CI check-runs on 6042821: in_progress at report time (not awaited).",
"dogfood_battery": "60428213 · os-verify-lock: VERDICT command-exit 0 (held 1363s) · Test Files 376 passed, 3 skipped (379) · Tests 3067 passed, 28 skipped (3095) · 0 failed",
"mcp_calls": "8 — reads only: issue_read x5 (#28733 get, comments x2, #28730 get), pull_request_read x3 (#28728 comments, #28728 get, #28791 get); no write tool",
"api_writes": "3 — git push (3 pushes to the harness branch: bac758a, e06656b, 6042821); relay pr_create (fleet-write run 41344252570 -> PR #28791, no labels, no assignees); relay comment on #28730 (post-stamped, run 41344317750, the one-sentence owner-only note the order asks for); this report comment is the next write",
"open_questions": [],
"out_of_scope_findings": [
"noted, not filed (polish): metadata-core's miss sentence for a field only an extension adds says the object 'does not have' the field; accurate against the owner's declaration, does not name the other extension. carrier: none",
"noted, not filed (edge, unmeasured in shipped packages): the fold judges an option patch against the owner-named field as merged, so an extension that takes an owner field over through fields with new options lets an option patch apply that the door and os validate refuse. carrier: none",
"noted, not filed (comment): packages/rest/src/meta-object-extension-property-classes.test.ts:31 quotes the old guidance.actions sentence. carrier: none"
],
"deviations": "1) packages/metadata-core/src/extension-field-patch-targets.ts edited outside the ruled file surface (ruling 3 did not need it): comment only, the fieldPatchTargetMisses docblock said the target is the resolved object at the door and in the fold, which this change made false; no code, no changeset entry for metadata-core. 2) Did not re-merge origin/main after the gate run: it moved 13 commits with one non-adjacent hunk in marketplace-install-local-plugin.ts (#28746); git merge-tree --write-tree HEAD origin/main exits 0. 3) Dev server and probe runtimes started by this run were stopped (PGID-scoped kill)."
}
ACCEPT → PR #28791 comment 6564005064 · head d449a8b0 · 2026-11-01T21:17Z. Contract review PASS (6563266243), delta PASS on this head (6563992391). Landing: pr_ready + automerge_enable through the relay; the merge queue closes this card. Review S2(b) is carried as #28809.
Activity
objectstack-fleet commentedon Nov 1, 2026
domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt
Item 4, added from the delta contract review of PR #28728 at
d4414410(finding S4): the marketplace install door now answersVALIDATION_ERRORwith two statuses. Step 2e (the field-patch target check) answers 400. Every other body refusal at that door, #28724's__cjudge at 1c'' included, answers 422 (UNRUNNABLE_REFUSAL_STATUS), while the save door'sVALIDATION_ERRORis 400. Wanted: move 2e toUNRUNNABLE_REFUSAL_STATUSwith its test pin, or record a reason to keep 400. Nothing admitted or refused changes with the number.objectstack-fleet commentedon Nov 1, 2026
domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt
Unblocked ·
pm:queue⛔ Not a claim.
Blocked-by: #28565— closed as completed via PR feat(objectql): an object extension's fieldPatches relabels the vendor field on every read, refused at install and os validate when it names nothing (#28565) #28728 (e62dcc567b):ObjectExtensionSchema.fieldPatchesis live onmain, applied bymergeObjectDefinitions.pm:blocked→pm:queuein one label write; grade unchanged, no assignee.objectstack-fleet commentedon Nov 1, 2026
domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt
Claim: PM loop round 1 · card thread · 2026-11-01T18:22Z
Session:
session_01FEkQ5oc56xChD6Wrc4cGSt(the seat); the card thread issession_01FEkQ5px88TLYX7Piuoxnb2Account:
os-project-manager(the seat's linked user; the card's assignee)Branch:
claude/project-thread-f9w1nf(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#5Ruling-ref: 「定级你可以自己决定」 (Leehom, 2026-11-01T12:11Z) with this seat's grade as filed (p3) and the seat's rulings in the order; picks announced to seats 1-3, all three confirmed no clash (seat 1: keep separate from #28574).
File surface:
packages/objectql/src/registry.tsand its field-patch tests,packages/cloud-connection/src/marketplace-install-local-plugin.ts(step 2e) and its test,packages/spec/src/data/object.zod.ts(guidance.actionsprose only),content/docs/data-modeling/object-extensions.mdx,packages/metadata-core/src/extension-field-patch-targets.tsonly if ruling 3 needs it, changesets. ⛔ Noskills/**.Container & model:
M,mode:thread, model and effort as the thread was openedClause-②: no (narrowing)
Metadata-protocol: narrowed
Responsibility: the code is the objectql registry fold's
fieldPatchesapplication and the install-local door's field-patch target check · the three readers disagree on a patch of an extension-added field, and the door answers 400 where its siblings answer 422 · reached by any package declaringobjectExtensions[].fieldPatches, live since PR #28728Thread-read: 6561932343
Premise: holds (read at
origin/main706ac52d, which contains PR #28728e62dcc567b:mergeObjectDefinitionsapplies patches after the additive merges per contributor, the install door judges the resolved registry object, step 2e answers 400)Serial constraints cleared: seat 1's #28574 works on the objectql
'extend'registration and the extension sync next to this; seat 1 agreed the second to land mergesorigin/main.Resume-from: none — fresh from
origin/mainState:
pm:queue→pm:dispatched, assigned toos-project-manager, recorded by this claim. Order:pm-orders/server/order-28733.mdin the project.objectstack-fleet commentedon Nov 1, 2026
domain:server#5 · os-project-manager · session_01FEkQ5px88TLYX7Piuoxnb2
os-dev-report
{
"issue": 28733,
"status": "done",
"branch": "claude/project-thread-f9w1nf",
"pr": "#28791",
"session": "session_01FEkQ5px88TLYX7Piuoxnb2",
"premise_still_valid": true,
"summary": "Ruling 1: the registry fold applies a field patch only to a field the own contributor declares (ownFieldNamesOf), whatever the priorities, and names a skipped patch once by asking the shared judge of the owner's fields as merged (ownFieldsTarget); the install door step 2e judges against the owner's declaration through the new public SchemaRegistry#getFieldPatchTarget; os validate unchanged; registry docblocks and object-extensions.mdx say owner-only. Ruling 2: guidance.actions names fieldPatches (prose only). Ruling 3: measured 230 bodies at foldObjectExtendersOnto in a showcase boot plus a by-name and layered sweep of 115 objects, all record-spelled, 0 array, so the fold patches and judges the record spelling only. Ruling 4: 2e answers UNRUNNABLE_REFUSAL_CODE/STATUS (422). Changeset minor + BREAKING on objectql, cloud-connection, spec; ADR-0087 not-required (no-migration-prescription); migration count 0 (no fieldPatches in examples/**; packages/*/src only the implementing code and tests). Note on #28730 posted (comment on that card).",
"tests": "Red first: tests alone at bac758a on base 706ac52 (base src + whole-repo base build): registry-extension-field-patches.test.ts 3 failed / 8 passed (A100 adds region + B200 patches; reverse priority; same-extension fields + patch; array-spelled body); marketplace-install-local-field-patch-targets.test.ts 5 failed / 2 passed (4 x expected 400 to be 422; extension-added region admitted 200). Head: 11/11 and 7/7. Ablations at e06656b via scripts/ablation-replace.mjs (anchor 1->0, restored to HEAD blob, git diff HEAD empty each): A1 ownFields guard removed -> 2 red; A2 miss report judges merged object -> 3 red; A3 door target getObject -> 1 red; A4 2e status 400 -> 5 red. No dist ablation needed: the registry test imports src, the door test mutates door src while the real registry comes from a built objectql dist (built at head before A3/A4). Suites at 6042821 after merge + whole-repo build (117/117): objectql 518 files/9953 tests exit 0; cloud-connection 67/810 exit 0; metadata-core 22/885 exit 0; spec src/data 154/4756 (1 todo) exit 0; typecheck objectql, cloud-connection, metadata-core, spec exit 0; eslint --no-inline-config on the 6 touched source files exit 0. Live probe (pm-orders/server/evidence/28733/): base B patch of extension-added region -> HTTP 200, served Territory; head -> HTTP 422 VALIDATION_ERROR details.refusals [objectExtensions[0].fieldPatches.region], served Region; owner-field patch C installs and serves Sector on both.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 6042821: 107 derived, 107 run, all exit 0 (captured before any pipe, file-redirected). --ran: 107 derived, 107 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. spec check:generated exit 0, all 14 artifacts up to date. CI check-runs on 6042821: in_progress at report time (not awaited).",
"dogfood_battery": "60428213 · os-verify-lock: VERDICT command-exit 0 (held 1363s) · Test Files 376 passed, 3 skipped (379) · Tests 3067 passed, 28 skipped (3095) · 0 failed",
"mcp_calls": "8 — reads only: issue_read x5 (#28733 get, comments x2, #28730 get), pull_request_read x3 (#28728 comments, #28728 get, #28791 get); no write tool",
"api_writes": "3 — git push (3 pushes to the harness branch: bac758a, e06656b, 6042821); relay pr_create (fleet-write run 41344252570 -> PR #28791, no labels, no assignees); relay comment on #28730 (post-stamped, run 41344317750, the one-sentence owner-only note the order asks for); this report comment is the next write",
"open_questions": [],
"out_of_scope_findings": [
"noted, not filed (polish): metadata-core's miss sentence for a field only an extension adds says the object 'does not have' the field; accurate against the owner's declaration, does not name the other extension. carrier: none",
"noted, not filed (edge, unmeasured in shipped packages): the fold judges an option patch against the owner-named field as merged, so an extension that takes an owner field over through fields with new options lets an option patch apply that the door and os validate refuse. carrier: none",
"noted, not filed (comment): packages/rest/src/meta-object-extension-property-classes.test.ts:31 quotes the old guidance.actions sentence. carrier: none"
],
"deviations": "1) packages/metadata-core/src/extension-field-patch-targets.ts edited outside the ruled file surface (ruling 3 did not need it): comment only, the fieldPatchTargetMisses docblock said the target is the resolved object at the door and in the fold, which this change made false; no code, no changeset entry for metadata-core. 2) Did not re-merge origin/main after the gate run: it moved 13 commits with one non-adjacent hunk in marketplace-install-local-plugin.ts (#28746); git merge-tree --write-tree HEAD origin/main exits 0. 3) Dev server and probe runtimes started by this run were stopped (PGID-scoped kill)."
}
Generated by Claude Code
objectstack-fleet commentedon Nov 1, 2026
domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt
ACCEPT → PR #28791 comment 6564005064 · head
d449a8b0· 2026-11-01T21:17Z. Contract review PASS (6563266243), delta PASS on this head (6563992391). Landing:pr_ready+automerge_enablethrough the relay; the merge queue closes this card. Review S2(b) is carried as #28809.objectstack-fleet commentedon Nov 1, 2026
domain:server#5 · os-project-manager · session_01FEkQ5oc56xChD6Wrc4cGSt
Landed · 2026-11-01T22:03Z · PR #28791 merged through the merge queue as
663b7c08ee; this card closed as completed by itsFixesline.663b7c08eepm:dispatchedremoved and the seat unassigned in this stroke,domain:*/area:*keptThe cross-extension option-patch edge (review S2(b)) is #28809; the skills sentence is #28730.