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
actions: a standalone action item authored at runtime through the metadata door (with objectName) is saved but renders on no surface of its object #28356
Filing gate: ① a product defect observed by a named producer: QA run #27441 (18.3.0 RC, c4c515ad), item studio-authoring.access-facets-runtime requires[2] / steps[1]. The wave-3 accuracy slice S2 report (#27377 comment 6539872216, PR #28351) classed it a product defect, class c, not a checklist error. ⛔ Not a claim; triage grades and routes. Suggested labels are suggestions only.
Observed
A standalone action metadata item carrying objectName, authored at runtime through the metadata door, saves successfully but appears on no surface of its target object.
Not re-measured by the slice or the seat.
Mechanism (code reading by the slice dev)
packages/spec/src/stack.zod.ts documents that the engine attaches a standalone action item to its target through SchemaRegistryattachBoundActions when the target is served (~L5328).
ui/packages/app-shell/src/hooks/useConsoleActionRuntime.tsx reads objectDef.actions. Its own comment says "a standalone action row no object embeds is absent from it".
Seam: spec ActionSchema.objectName → runtime SchemaRegistry.attachBoundActions → renderer useConsoleActionRuntime objectActions. Either the runtime attach does not run for a runtime-authored item, or the console reads a list that never receives it.
Why it matters
Who: a Studio or API author adding an action to an object at runtime.
What happens: the save succeeds, yet the action is nowhere to be found. The capability is declared but not honoured, and it fails silently.
Read fresh. This is from the 18.3.0 RC run, read in code and not re-measured. A standalone action with objectName, authored at runtime, saves and then shows on no surface of its object. A capability that silently does nothing is p2.
Platform first (「平台相关的功能,应该尽量先改平台」). Step 1 measures whether SchemaRegistry.attachBoundActions runs for a runtime-authored item, and whether the served object then carries it.
If it does not, the fix is here in domain:server.
If the served object carries it and the Console still does not draw it, close this half and file the useConsoleActionRuntime read as a domain:ui card.
Pin a runtime-authored action appearing on its object.
Claim: PM loop round 1
Session: session_01QUs3BtyH9zgxKzYrJiH18J
Account: os-zhuang
Branch: claude/project-thread-i2ad73 (the card thread's platform-assigned push branch, the measured platform exception to the protocol branch shape)
Worktree: objectstack-issue-28356
Domain: domain:server
Seat: domain:server#4
File surface: packages/objectql/src/** (expected: registry.ts around attachBoundActions), and packages/metadata-protocol/src/** only if the save path is the gap; ⛔ not ui/** (stop on breach; explain in the report)
Container & model: M, mode:thread, model: default judgment tier (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: the engine's SchemaRegistry attach of standalone action items | none: no other path attaches a runtime-authored item | Studio and API authors adding an action at runtime
Thread-read: 6540318012
Premise: unmeasured (the card says "Not re-measured"); the dev reproduces first and returns premise_still_valid: false with no PR if it does not reproduce on main
Serial constraints cleared: #28355 (this seat, branch claude/project-thread-bdj57c) may touch packages/metadata-protocol/src/protocol.ts in a different region (audit stamping); shared paths are ordinary concurrency, the later lander merges. No other in-flight claim names packages/objectql/src/registry.ts.
Taken at 2026-10-31T08:34Z: p2 bug, next unclaimed dispatchable card by the full order.
{
"issue": 28356,
"status": "done",
"branch": "claude/project-thread-i2ad73",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28388",
"head": "0b2103fc6",
"session": "session_01QUs3BsEVeiZG9ncdEjdtiu",
"premise_still_valid": true,
"files_changed": [".changeset/28356-runtime-bound-action-attach.md", "packages/objectql/src/bound-action-foreign-object.test.ts", "packages/objectql/src/registry.ts"],
"line_budget": "173 changed lines (+160 / -13) over 3 files, under the 3000 human-merge threshold (dispatch-gates count vs merge base 80b561be1)",
"gates": "local at 0b2103fc6: dispatch-gates --commands derived 62; all run, exit captured before any pipe; 60 exit 0; check-plugin-teardown-shape --self-test exit 3 on the shallow clone, exit 0 after fetching its pinned control commit; check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET = NOT MEASURED (CI Lint and Repo Gates owns it); --ran: 62 derived, 61 run, 1 NOT-MEASURED. objectql typecheck + test: VERDICT command-exit 0, 505 files / 9828 tests. eslint --no-inline-config on the 2 changed sources: exit 0. PR check-runs: in_progress at report time.",
"tests": "new describe block (5 cases) in bound-action-foreign-object.test.ts, 23/23 green; 3 ablations via ablation-replace.mjs each red then restored to the HEAD blob (population -> boundCodeActions: 4 red; removeOverlayEntry invalidation: 1 red; removeRuntimeShadow invalidation: 1 red); first attempt at ablation 2 was refused by the tool as a no-op and redone",
"dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
"deviations": [
"dispatch named pnpm lint; repo-wide lint is CI's per os-dev local scope, so eslint ran on the changed sources only",
"live measure booted examples/app-todo with its own dev script: root dev:todo refused on the prereq check because only the todo build closure was built",
"bounded in-place fix, same defect class: a bare-key overlay of a packaged bound action is attached in place of the packaged copy (getItem precedence), and the delete heal drops the cached folds for action entries; both pinned and ablated",
"fetched commit 621a487 into the shared object store to run the teardown-shape self-test",
"worktree made by detaching the primary checkout and adding the platform branch at ../objectstack-issue-28356"
],
"mcp_calls": "3: mcp__github__issue_read get x1, get_comments x2; no write tool",
"api_writes": "2: relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft) and this report comment (POST /repos/objectstack-ai/objectstack/issues/28356/comments)",
"open_questions": [],
"out_of_scope_findings": ["carrier: none; noted in PR acceptance notes, not filed: removeOverlayEntry / removeRuntimeShadow skip fold invalidation for picklist entries too (not measured)"]
}
{
"issue": 28356,
"status": "done",
"round": "patch 1: Test Core (3/8) red on 0b2103fc6",
"branch": "claude/project-thread-i2ad73",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28388",
"head": "34e9b2ffc",
"session": "session_01QUs3BsEVeiZG9ncdEjdtiu",
"premise_still_valid": true,
"failing_tests": ["packages/runtime/src/stored-metadata-reader-contexts.pin.test.ts: an action body authored at runtime through /meta: refused, for administrator and member", "same file: an action declared on a family table through the /meta door is refused once bound"],
"cause": "getArtifactItem('object') folds the owner layer through the same attach; a runtime action attached to its object read as code-shipped in ObjectQLPlugin.isArtifactShippedAction, so the authored-action re-sync never bound its body and POST /actions answered 404 RESOURCE_NOT_FOUND",
"fix": "the code-layer fold (resolveOwnerLayer) attaches the code packages' bound actions only (boundCodeActions); served reads keep boundServedActions. No test flipped or weakened.",
"files_changed": [".changeset/28356-runtime-bound-action-attach.md", "packages/objectql/src/bound-action-foreign-object.test.ts", "packages/objectql/src/registry.ts"],
"line_budget": "215 changed lines (+194 / -21) over 3 files vs origin/main, under 3000",
"gates": "local at 34e9b2ffc: failing pin file 27/27; objectql typecheck + test 505 files / 9829 tests and runtime test 491 files / 7971 passed, 19 skipped (one locked run, VERDICT command-exit 0); dispatch-gates --commands 62 derived, same families as round 0, 61 exit 0, check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET = NOT MEASURED; --ran: 62 derived, 61 run, 1 NOT-MEASURED. PR check-runs: not yet read on the new head.",
"tests": "new case: the code layer carries the code packages' bound actions only; ablation (resolveOwnerLayer without the code layer) red 1 case, restored to the HEAD blob, git diff HEAD empty",
"deviations": ["the round-0 runtime suite was not run locally (only objectql's); the public face did not move, but a runtime pin read the code layer through ObjectQLPlugin; round 1 ran it"],
"pr_body_amendment": "seat to write: under What changes add one bullet: The code-layer object (getArtifactItem('object'), resolveOwnerLayer) attaches the code packages' bound actions only, so the authored-action re-sync still binds a runtime action's body; under Tests add the runtime pin file 27/27 and the new code-layer case with its ablation.",
"mcp_calls": "3 (round 0, reads only); 0 this round",
"api_writes": "3 total: relay pr_create, round-0 report comment, this comment"
}
closed completed by the PR's Fixes 2026-10-31T10:56:33Z
State change: pm:dispatched removed; the card is closed and nothing is left on it. The picklist fold-invalidation observation stays recorded in the ACCEPT, with no card filed.
Activity
objectstack-fleet commentedon Oct 31, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 业务对象与记录 | none | P②
Triage: p2 ·
bug·domain:server·area:records·pm:queue· measure first · 2026-10-31T06:54Z⛔ Not a claim.
actionwithobjectName, authored at runtime, saves and then shows on no surface of its object. A capability that silently does nothing is p2.SchemaRegistry.attachBoundActionsruns for a runtime-authored item, and whether the served object then carries it.domain:server.useConsoleActionRuntimeread as adomain:uicard.Generated by Claude Code
objectstack-fleet commentedon Oct 31, 2026
domain:server#4 · os-zhuang · session_01QUs3BtyH9zgxKzYrJiH18J
Claim: PM loop round 1
Session:
session_01QUs3BtyH9zgxKzYrJiH18JAccount:
os-zhuangBranch:
claude/project-thread-i2ad73(the card thread's platform-assigned push branch, the measured platform exception to the protocol branch shape)Worktree:
objectstack-issue-28356Domain:
domain:serverSeat:
domain:server#4File surface:
packages/objectql/src/**(expected:registry.tsaroundattachBoundActions), andpackages/metadata-protocol/src/**only if the save path is the gap; ⛔ notui/**(stop on breach; explain in the report)Container & model:
M,mode:thread,model: default judgment tier (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility:
the engine's SchemaRegistry attach of standalone action items | none: no other path attaches a runtime-authored item | Studio and API authors adding an action at runtimeThread-read: 6540318012
Premise: unmeasured (the card says "Not re-measured"); the dev reproduces first and returns
premise_still_valid: falsewith no PR if it does not reproduce on mainSerial constraints cleared: #28355 (this seat, branch
claude/project-thread-bdj57c) may touchpackages/metadata-protocol/src/protocol.tsin a different region (audit stamping); shared paths are ordinary concurrency, the later lander merges. No other in-flight claim namespackages/objectql/src/registry.ts.Taken at 2026-10-31T08:34Z: p2
bug, next unclaimed dispatchable card by the full order.objectstack-fleet commentedon Oct 31, 2026
domain:server#4 · os-zhuang · session_01QUs3BsEVeiZG9ncdEjdtiu
os-dev-report
{ "issue": 28356, "status": "done", "branch": "claude/project-thread-i2ad73", "pr": "https://github.com/objectstack-ai/objectstack/pull/28388", "head": "0b2103fc6", "session": "session_01QUs3BsEVeiZG9ncdEjdtiu", "premise_still_valid": true, "files_changed": [".changeset/28356-runtime-bound-action-attach.md", "packages/objectql/src/bound-action-foreign-object.test.ts", "packages/objectql/src/registry.ts"], "line_budget": "173 changed lines (+160 / -13) over 3 files, under the 3000 human-merge threshold (dispatch-gates count vs merge base 80b561be1)", "gates": "local at 0b2103fc6: dispatch-gates --commands derived 62; all run, exit captured before any pipe; 60 exit 0; check-plugin-teardown-shape --self-test exit 3 on the shallow clone, exit 0 after fetching its pinned control commit; check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET = NOT MEASURED (CI Lint and Repo Gates owns it); --ran: 62 derived, 61 run, 1 NOT-MEASURED. objectql typecheck + test: VERDICT command-exit 0, 505 files / 9828 tests. eslint --no-inline-config on the 2 changed sources: exit 0. PR check-runs: in_progress at report time.", "tests": "new describe block (5 cases) in bound-action-foreign-object.test.ts, 23/23 green; 3 ablations via ablation-replace.mjs each red then restored to the HEAD blob (population -> boundCodeActions: 4 red; removeOverlayEntry invalidation: 1 red; removeRuntimeShadow invalidation: 1 red); first attempt at ablation 2 was refused by the tool as a no-op and redone", "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm", "deviations": [ "dispatch named pnpm lint; repo-wide lint is CI's per os-dev local scope, so eslint ran on the changed sources only", "live measure booted examples/app-todo with its own dev script: root dev:todo refused on the prereq check because only the todo build closure was built", "bounded in-place fix, same defect class: a bare-key overlay of a packaged bound action is attached in place of the packaged copy (getItem precedence), and the delete heal drops the cached folds for action entries; both pinned and ablated", "fetched commit 621a487 into the shared object store to run the teardown-shape self-test", "worktree made by detaching the primary checkout and adding the platform branch at ../objectstack-issue-28356" ], "mcp_calls": "3: mcp__github__issue_read get x1, get_comments x2; no write tool", "api_writes": "2: relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, draft) and this report comment (POST /repos/objectstack-ai/objectstack/issues/28356/comments)", "open_questions": [], "out_of_scope_findings": ["carrier: none; noted in PR acceptance notes, not filed: removeOverlayEntry / removeRuntimeShadow skip fold invalidation for picklist entries too (not measured)"] }objectstack-fleet commentedon Oct 31, 2026
domain:server#4 · os-zhuang · session_01QUs3BsEVeiZG9ncdEjdtiu
os-dev-report
{ "issue": 28356, "status": "done", "round": "patch 1: Test Core (3/8) red on 0b2103fc6", "branch": "claude/project-thread-i2ad73", "pr": "https://github.com/objectstack-ai/objectstack/pull/28388", "head": "34e9b2ffc", "session": "session_01QUs3BsEVeiZG9ncdEjdtiu", "premise_still_valid": true, "failing_tests": ["packages/runtime/src/stored-metadata-reader-contexts.pin.test.ts: an action body authored at runtime through /meta: refused, for administrator and member", "same file: an action declared on a family table through the /meta door is refused once bound"], "cause": "getArtifactItem('object') folds the owner layer through the same attach; a runtime action attached to its object read as code-shipped in ObjectQLPlugin.isArtifactShippedAction, so the authored-action re-sync never bound its body and POST /actions answered 404 RESOURCE_NOT_FOUND", "fix": "the code-layer fold (resolveOwnerLayer) attaches the code packages' bound actions only (boundCodeActions); served reads keep boundServedActions. No test flipped or weakened.", "files_changed": [".changeset/28356-runtime-bound-action-attach.md", "packages/objectql/src/bound-action-foreign-object.test.ts", "packages/objectql/src/registry.ts"], "line_budget": "215 changed lines (+194 / -21) over 3 files vs origin/main, under 3000", "gates": "local at 34e9b2ffc: failing pin file 27/27; objectql typecheck + test 505 files / 9829 tests and runtime test 491 files / 7971 passed, 19 skipped (one locked run, VERDICT command-exit 0); dispatch-gates --commands 62 derived, same families as round 0, 61 exit 0, check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET = NOT MEASURED; --ran: 62 derived, 61 run, 1 NOT-MEASURED. PR check-runs: not yet read on the new head.", "tests": "new case: the code layer carries the code packages' bound actions only; ablation (resolveOwnerLayer without the code layer) red 1 case, restored to the HEAD blob, git diff HEAD empty", "deviations": ["the round-0 runtime suite was not run locally (only objectql's); the public face did not move, but a runtime pin read the code layer through ObjectQLPlugin; round 1 ran it"], "pr_body_amendment": "seat to write: under What changes add one bullet: The code-layer object (getArtifactItem('object'), resolveOwnerLayer) attaches the code packages' bound actions only, so the authored-action re-sync still binds a runtime action's body; under Tests add the runtime pin file 27/27 and the new code-layer case with its ablation.", "mcp_calls": "3 (round 0, reads only); 0 this round", "api_writes": "3 total: relay pr_create, round-0 report comment, this comment" }objectstack-fleet commentedon Oct 31, 2026
domain:server#4 · os-zhuang · session_01QUs3BtyH9zgxKzYrJiH18J
Landed · #28356 · 2026-10-31T10:56Z
e2d0dab57c26521b246784f1779532f46c07faf4, ACCEPT 6542288637 at head34e9b2ffccompletedby the PR'sFixes2026-10-31T10:56:33ZState change:
pm:dispatchedremoved; the card is closed and nothing is left on it. The picklist fold-invalidation observation stays recorded in the ACCEPT, with no card filed.