feat(canopy-cli): catch up to ADR-007 — add household / income / asset / interview / determine subcommands

Context

ADR-007 mandates "every API operation must be available through the CLI" with a Decision section that enumerates the expected surface (lines 41-71 of adrs/adr-007-cli-api-ui-parity.adoc). tools/canopy-cli/src/main.rs:31-83 exposes 8 commands today: login, token, completion, person, rules, application, eligibility, security.

Missing per ADR-007's own Decision section:

  • household (create / get / add-member)
  • add-income / add-asset / add-expense / add-address (or person subcommands for these)
  • waive-interview / complete-interview
  • snap evaluate / tanf evaluate / medicaid evaluate / caps evaluate / wic evaluate
  • enrollment (list / get)
  • renewal (list / get)
  • notice (list / get / download)
  • appeal (file / list / get)
  • report (generate / list)

Roughly 60% of the mandated CLI surface is absent despite the underlying APIs existing (162 utoipa-decorated handlers across services).

The 11 services published OpenAPI specs in MR !208 (merged) / !209 (merged) — the CLI catch-up has its specs to mirror against.

Acceptance criteria

  • CLI subcommands above implemented as thin reqwest wrappers (no direct DB access per ADR-007)
  • Each subcommand bears a #[derive(clap::Parser)] arg struct with required / optional flags matching the API
  • canopy-cli integration tests cover at least the happy-path call for each new command (mirror existing tools/canopy-cli/tests/cli_test.rs shape)
  • CHANGELOG entry under Added
  • CLI reference doc at docs/modules/ROOT/pages/cli.adoc updated

Why filed now

Multi-agent plan-vs-code audit (2026-05-05) flagged ADR-007 as the single largest "ADR drift" gap. Without this, the ADR is partially-aspirational.