Skip to content

[finding] Two residual audit ↔ router asymmetries after #14123: the audit's third source is loadMany while the router's is load by name, and unboundDeclarations still reads two sources where the undeclared-handler half now reads three #14423

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

Activity

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions