• fix(#20): heid-bug-hunt fixups — CLI open-world container-type hardening (slice-5)

    vh released this 2026-07-19 11:29:10 -07:00 | 51 commits to main since this release

    Panel (Gróa + Hulda + Regin, source-verified by Heid): adapter/route-map/
    ConnectFailed-at-call-sites sound against the declared invariants; 4 real
    robustness findings, all in the CLI open-world presenter/probe paths — the
    container-type layer BELOW the null/element holes the code-review already fixed.

    Fixed (findings 1-3):

    • _format_whoami (cli.py): a non-iterable scopes/allowed_roles scalar
      ({"scopes": 123}) made x or [] yield 123 → for s in 123 TypeError. New
      _display_seq helper degrades any non-list (scalar / bare string / null / absent)
      to empty; applied to both scopes and allowed_roles.
    • _characters_probe (cli.py): same class on the model catalog items ({"items": 123}) — now guards models is a Mapping and items is a list before iterating.
    • _characters_probe: the top-level open-world reads created / state are now
      isinstance(_, Mapping)-guarded before any .get — a non-mapping SDK passthrough
      (created=[...]) aborts cleanly (exit 20) / renders pad=None instead of an
      AttributeError.

    Accepted (finding 4, documented in contract § slice-5 notes): the --characters
    probe leaks its transient character on a mid-lifecycle failure. PRE-EXISTING (the
    retired probe had the identical linear no-finally structure — cutover did not
    worsen it), TTL-bounded, one-shot diagnostic; a try/finally would swallow a
    happy-path delete-failure (delete is both teardown and a tested step). Gróa + Heid
    concur accept is defensible.

    Dismissed (finding 5): Hulda flagged sessions.py dropping get_me/etc. as a
    caller-contract break — it is the intended DEC-3 no-backwards-compat migration (all
    in-repo callers rewired same-diff); Heid labels it intended-surface-change.

    Added CLI tests for the three hardened paths (scalar scopes/roles; scalar items +
    non-mapping state; non-mapping create abort). Suite 488 green; ruff clean; live
    smoke re-run clean (identical happy-path output). Patch bump 0.21.17 → 0.21.18.

    Downloads