c39f5e4762
Harvest sweep, batch 3 of 6 (first half). Composite::declared_taps() walks the blueprint depth-first collecting (tap name, source wire, column kind), names bare at every depth — mirroring inline_composite's hoist, where a tap's name IS the flat graph's load-bearing identifier — and bounds-total over invalid wires (compile's validate_wiring stays the real gate). The CLI view loads like --params (FILE gates the authored root name, a content id does not), prints one 'name node.field Kind' row per tap, and renders the tap-less case as a stderr note with empty stdout, exit 0. Closes the recovery-only discovery loop: since #333 the only way to learn a blueprint's declared tap names was provoking the undeclared-tap refusal roster. closes #337