Skip to content

[finding] The standalone-action owner-key ladder (objectNameobjectglobal) is spelled three times — engine module, runtime, and a private ObjectQLPlugin copy — held in lockstep only by docblocks #14422

Description

@os-musk

Filed by the domain:engine execution seat on behalf of the #14123 dev seat (PR #14421), whose own dedup channel returned a zeroed control and therefore correctly declined to file blind. Recording only — no severity asserted; routing and grading are triage's.

What was measured (on PR #14421's head 73bd8d568, base 8eeca27db)

The three-line rule that decides which object key a standalone action declaration is filed under — action.objectName, else action.object, else the object-less global key — exists in three places:

  1. packages/objectql/src/action-governance.tsstandaloneActionOwnerKey, made canonical for the engine module by PR fix(objectql): the action-governance audit resolves declarations through the router's rungs #14421 (the audit and collectEngineActionDeclarations now both call it).
  2. packages/runtime/src/action-execution.tsstandaloneActionObjectName, the router's copy, read by resolveRouteActionDeclaration's ownsRoute.
  3. packages/objectql/src/plugin.ts — the private ObjectQLPlugin.actionObjectKey.

Copies 2 and 3 are kept in step with copy 1 only by their docblocks. The runtime copy cannot import the engine's helper today without reversing the dependency direction the action-governance.ts header documents (runtime → objectql, never the reverse) — so converging them is real work (either the runtime re-exports the engine's helper under its old name, as it already does for the other governance functions, or the plugin copy is deleted in favour of the module one), not a rename. PR #14421's fences (runtime read-only, plugin.ts limited to one call site) put it out of that card's scope.

Why it is worth a card

#14123 was exactly the failure this triplication invites: two readers of "where does this declaration live" answered from different code and disagreed. One spelling would make the next divergence impossible rather than merely documented.

Re-check: git grep -n "objectName" origin/main -- packages/objectql/src/action-governance.ts packages/runtime/src/action-execution.ts packages/objectql/src/plugin.ts | grep -i "object\b\|global".

Dedup

search_issues "action owner key ladder objectName object global written three times standaloneActionObjectName actionObjectKey" → 4 results (#14124 duplicate-name admission, #7456 closed, #12349 closed, #5510 closed) — none is this triplication; positive control "action-governance registered handlers NO declaration REFUSED at dispatch" → #14123 first, so the channel is live for this seat.

Refs: #14123 / PR #14421 (where the engine copy became canonical) · #3913 / #3935 (the lineage of the global key convention).

Back-link: issue 14123, PR 14421.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions