Internal refactor per docs/MCP-SERVER-SPEC.md §4; CLI output and exit codes
unchanged (wrappers reproduce them from the envelopes):
- echo_ops: capture_op/resolve_op/link_op — duplicate gate and offline queueing
are data (action: duplicate-gate + candidates; queued: true); the --json
stdout-swallow hack is deleted (helper chatter -> stderr inside the cores);
capture_op takes body_text= directly (the MCP path, no temp file).
- echo_recall.recall_op — one structured result backs prose and --json.
- echo_triage.list_op/route_op, echo_reflect.apply_op,
echo_session.session_end_op — call capture_op internally, count gate outcomes
from envelopes.
- echo.scope_show_op/scope_set_op/load_op (+ shared _load_gather), and
echo_doctor.run_op (checks as data).
New eval/test_ops_api.py asserts the contract for every core: envelope shape
AND stdout purity (a stray print would corrupt an MCP response stream). All six
suites green. The 2.2 server build now starts directly at the app layer.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>