• feat(#17): CLI Bifrost-bind trigger (slice 3a of the INV-008 lockstep)

    vh released this 2026-06-18 00:45:48 -07:00 | 203 commits to main since this release

    Slice 3a of issue #17 — the CLI surface of the bind trigger (TUI + web follow,
    INV-008 lockstep). ratatoskr can now self-drive a bound session from the CLI:

    • New flags: --bifrost-plane {memory,affect} (dev shortcut -> endpoint_for_plane
      over --bifrost-host / RATATOSKR_PROVIDER_VISIBLE_HOST) and --bifrost-url (the
      direct HTTPS/prod endpoint, bypassing the plane shortcut). Mutually exclusive;
      a binding is a session-CREATE concern (forbidden with --session).
    • Consumer key resolved from RATATOSKR_BIFROST_CONSUMER_KEY only (the privileged
      handshake identity — never a CLI flag, distinct from the canary WORLDTREE_API_KEY).
    • _amain threads bifrost + consumer_key into create_session and routes the bind
      failures: BifrostConsumerKeyMissing -> exit 22; BifrostHandshakeFailed -> exit
      23 with the 401-scoping hint ("use the consumer key, not WORLDTREE_API_KEY")
      keyed on bifrost_error == bifrost.auth_rejected.
    • Bound-state indicator on success: ". bifrost: status=bound plane=... endpoint=..."
      — shows WHICH identity/endpoint bound, not a bare boolean.

    Also fixes a pre-existing test-isolation bug: test_no_textual_import did a live
    importlib.reload(ratatoskr.cli) that mutated the shared module in place, breaking
    class identity (isinstance / pytest.raises) for every test after it. The real
    check is the static source grep; the reload was vestigial and is removed.

    9 new CLI bind tests; full suite 462 green; ruff clean (no new mypy errors).

    Downloads