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. Both asymmetries are deliberate residues of PR #14421, declared there, not defects it introduced.
(a) Third source: meta.loadMany('action') vs meta.load / loadDiagnosed by name
runActionGovernanceInventory builds its metadata-service source with loadStandaloneActions = meta.loadMany('action') (bulk); resolveRouteActionDeclaration's third rung resolves meta.loadDiagnosed('action', name) / meta.load('action', name) — by name. A plane that serves a name to load but does not enumerate it in loadMany (the measured shape is an env-scoped kernel where enumeration and by-name reads answer from different scopes) can still make the audit and the router disagree about whether that declaration exists. PR #14421 closed the registry rung (the card's measured case); this one is unmeasured — nobody has produced a fixture where loadMany omits a name load serves.
(b) unboundDeclarations (ADR-0078 half) reads two sources; undeclaredHandlers (ADR-0110 D3 half) now reads three
The undeclared-handler finding is filtered through the registry rung by name (PR #14421). The other D5 finding — declared script actions with NO handler — is still computed from the collected declaration set only (object-embedded + loadMany), so a registry-only declared script action with no handler is invisible to it. PR #14421 kept that warning byte-identical on purpose (its population was pinned by the dispatch); folding the registry into the declaration set would have changed it, which is a separate decision.
Suggested direction (not a decision)
Either give the audit the router's by-name third rung too (injected like the registry rung) and enumerate the registry for the ADR-0078 half — making both halves of the D5 bijection read the same three sources — or state the narrower invariant PR #14421 already wrote ("the inventory reports a handler as undeclared only when EVERY source the router resolves through answered nothing for it") as the ceiling and leave (b) documented. Measure (a) with a fixture before choosing.
Re-check: git grep -n "loadStandaloneActions\|lookupRegistryAction\|unboundDeclarations" origin/main -- packages/objectql/src/action-governance.ts packages/objectql/src/plugin.ts.
Dedup
search_issues "action governance audit loadMany versus load by name env-scoped kernel unboundDeclarations declared script actions NO handler registry-only invisible asymmetry" → 6 results (#14123 the parent, #14382, #14124, #13866, #3935 closed, #12540 closed) — none names either residue; the parent card ranking first is the firing control.
Refs: #14123 / PR #14421 (the fix that leaves these two residues, both declared in its report) · #14422 (sibling finding: the owner-key ladder spelled three times) · #3863 (errorClass / D5 vocabulary).
Back-link: issue 14123, PR 14421.
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. Both asymmetries are deliberate residues of PR #14421, declared there, not defects it introduced.(a) Third source:
meta.loadMany('action')vsmeta.load/loadDiagnosedby namerunActionGovernanceInventorybuilds its metadata-service source withloadStandaloneActions=meta.loadMany('action')(bulk);resolveRouteActionDeclaration's third rung resolvesmeta.loadDiagnosed('action', name)/meta.load('action', name)— by name. A plane that serves a name toloadbut does not enumerate it inloadMany(the measured shape is an env-scoped kernel where enumeration and by-name reads answer from different scopes) can still make the audit and the router disagree about whether that declaration exists. PR #14421 closed the registry rung (the card's measured case); this one is unmeasured — nobody has produced a fixture whereloadManyomits a nameloadserves.(b)
unboundDeclarations(ADR-0078 half) reads two sources;undeclaredHandlers(ADR-0110 D3 half) now reads threeThe undeclared-handler finding is filtered through the registry rung by name (PR #14421). The other D5 finding —
declared script actions with NO handler— is still computed from the collected declaration set only (object-embedded +loadMany), so a registry-only declaredscriptaction with no handler is invisible to it. PR #14421 kept that warning byte-identical on purpose (its population was pinned by the dispatch); folding the registry into the declaration set would have changed it, which is a separate decision.Suggested direction (not a decision)
Either give the audit the router's by-name third rung too (injected like the registry rung) and enumerate the registry for the ADR-0078 half — making both halves of the D5 bijection read the same three sources — or state the narrower invariant PR #14421 already wrote ("the inventory reports a handler as undeclared only when EVERY source the router resolves through answered nothing for it") as the ceiling and leave (b) documented. Measure (a) with a fixture before choosing.
Re-check:
git grep -n "loadStandaloneActions\|lookupRegistryAction\|unboundDeclarations" origin/main -- packages/objectql/src/action-governance.ts packages/objectql/src/plugin.ts.Dedup
search_issues"action governance audit loadMany versus load by name env-scoped kernel unboundDeclarations declared script actions NO handler registry-only invisible asymmetry" → 6 results (#14123 the parent, #14382, #14124, #13866, #3935 closed, #12540 closed) — none names either residue; the parent card ranking first is the firing control.Refs: #14123 / PR #14421 (the fix that leaves these two residues, both declared in its report) · #14422 (sibling finding: the owner-key ladder spelled three times) · #3863 (
errorClass/ D5 vocabulary).Back-link: issue 14123, PR 14421.