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
[finding] The standalone-action owner-key ladder (objectName → object → global) is spelled three times — engine module, runtime, and a private ObjectQLPlugin copy — held in lockstep only by docblocks #14422
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:
packages/runtime/src/action-execution.ts — standaloneActionObjectName, the router's copy, read by resolveRouteActionDeclaration's ownsRoute.
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.
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).
Filed by the
domain:engineexecution 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, base8eeca27db)The three-line rule that decides which object key a standalone
actiondeclaration is filed under —action.objectName, elseaction.object, else the object-lessglobalkey — exists in three places:packages/objectql/src/action-governance.ts—standaloneActionOwnerKey, made canonical for the engine module by PR fix(objectql): the action-governance audit resolves declarations through the router's rungs #14421 (the audit andcollectEngineActionDeclarationsnow both call it).packages/runtime/src/action-execution.ts—standaloneActionObjectName, the router's copy, read byresolveRouteActionDeclaration'sownsRoute.packages/objectql/src/plugin.ts— the privateObjectQLPlugin.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.tsheader 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.tslimited 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
globalkey convention).Back-link: issue 14123, PR 14421.