Every boot of this app logs:
WARN [action-governance] registered handlers with NO declaration — these are REFUSED at
dispatch (ADR-0110 D3) and there is no opt-out; declare each one with `defineAction`, or
drop the registration if nothing should invoke it over HTTP
{"count":2,"handlers":["global:duly_catalog_apply","global:duly_catalog_sync"]}
src/actions/register-handlers.ts registers handler bodies for duly_catalog_apply and duly_catalog_sync; no defineAction metadata declares either. Under ADR-0110 D3 an undeclared handler is refused at dispatch with no opt-out, so both are dead over HTTP — the handler code exists, runs in-process if called directly, and cannot be invoked through the API surface.
Same shape as #68, one layer over: pnpm validate, pnpm typecheck, pnpm test and pnpm build all exit 0, and the only channel that reports it is the boot banner's diagnostics block.
What needs deciding
Whichever way this goes, it is a two-line change plus a test — but the two ways are opposite:
- Declare them with
defineAction (+ placement, labels, i18n bundle entries) if catalog apply/sync are meant to be callable — in which case there is a follow-on question about which surface exposes them and who may run them. - Drop the registrations if they were only ever meant to run from the in-process catalog path, in which case the handler bodies should move behind whatever actually calls them.
Worth checking test/catalog-instantiate.test.ts and test/catalog-action-placement.test.ts first: if either calls these handlers directly, that is a green test over a surface that is refused in production — the same test-side-bind false green test/dispatch-wiring.test.ts exists to avoid.
Found while booting the app to verify #68. Not touched there — out of that card's scope.
Generated by Claude Code
Every boot of this app logs:
src/actions/register-handlers.tsregisters handler bodies forduly_catalog_applyandduly_catalog_sync; nodefineActionmetadata declares either. Under ADR-0110 D3 an undeclared handler is refused at dispatch with no opt-out, so both are dead over HTTP — the handler code exists, runs in-process if called directly, and cannot be invoked through the API surface.Same shape as #68, one layer over:
pnpm validate,pnpm typecheck,pnpm testandpnpm buildall exit 0, and the only channel that reports it is the boot banner's diagnostics block.What needs deciding
Whichever way this goes, it is a two-line change plus a test — but the two ways are opposite:
defineAction(+ placement, labels, i18n bundle entries) if catalog apply/sync are meant to be callable — in which case there is a follow-on question about which surface exposes them and who may run them.Worth checking
test/catalog-instantiate.test.tsandtest/catalog-action-placement.test.tsfirst: if either calls these handlers directly, that is a green test over a surface that is refused in production — the same test-side-bind false greentest/dispatch-wiring.test.tsexists to avoid.Found while booting the app to verify #68. Not touched there — out of that card's scope.
Generated by Claude Code