Display-friendly summary of each step’s outcome. Returned by run
so the caller can render however it wants (plain stdout, TUI body
scrollback, future JSON output for scripting).
Result of one orchestrator step. Distinct from Result because
“already done / idempotent skip” is a first-class outcome, not an
error — the report needs to tell the user “you already claimed this
last week” in the same place it’d tell them “just claimed”.
Per-tier outcome captured while step_claim walks the cascade.
Surfaces in SetupReport::render as one row per attempted tier so
the user can see exactly why the cascade stopped where it did — a
single “claim failed: Lite: 暂无开放” line hid the Max / Pro tier
rejections users wanted to see.
Describes how the auto-detected vision_preprocessor_provider was
(or was not) updated by step_models_and_register. Surfaces in
SetupReport::render so the user can see what happened to that
config knob across the /codingplan flow.
Entry point. Mutates config in place (providers + default_provider);
the caller is responsible for persisting it to disk after a successful
run. This keeps the core free of I/O concerns — tests can call run
against a Config::default() without touching the filesystem.