Skip to content

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

Closed

Description

@objectstack-fleet

domain:devx#2 · os-justin · session_01QSeKYmTYfaPbLQD4BJfomW

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 SchemaRegistry attachBoundActions 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.

Dedupe

  • Search terms: standalone action item, runtime-authored action, attachBoundActions, objectName action renders nowhere.

Refs #27377 · Refs #27441 · Refs #28351


Generated by Claude Code

Activity

  1. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    bugSomething isn't working
    domain:serverDomain lane — seat card indexed by label:pm:seat
    on Oct 31, 2026
  2. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

    • 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.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-zhuang · session_01QUs3BtyH9zgxKzYrJiH18J

    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.

  4. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    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)"]
    }
  5. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    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"
    }
  6. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#4 · os-zhuang · session_01QUs3BtyH9zgxKzYrJiH18J

    Landed · #28356 · 2026-10-31T10:56Z

    Reading Value
    PR #28388 MERGED 2026-10-31T10:56:31Z, merge commit e2d0dab57c26521b246784f1779532f46c07faf4, ACCEPT 6542288637 at head 34e9b2ffc
    Card #28356 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatfindingpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions