TUI: Ctrl+J (or /jobs) opens a jobs pane listing the current session's board —
alias, agent, state, objective, files read — populated on load and kept live via
JobUpdated events; Enter drills into a subtask's child session. Snapshot test added.
Engine: optional orchestration reminders (off by default) injected as synthetic,
non-persisted turn-start blocks and, after a file tool runs, an after-file-tool
block on the following turn. Processor reports file-tool usage via StepOutcome.
This completes M4.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- modelsdev.rs: ModelCatalog parses models.dev api.json → ModelInfo keyed by
(provider, model); 24h file cache at ~/.cache/ai-harness/models.json with a
baked assets/models-snapshot.json fallback so cost/limits work offline.
load_cached_or_baked (no network) + refresh/refresh_default_cache (background).
- App: loads the catalog at init (cached-or-baked, never blocks), warms the cache
in a background task, and passes the session model's pricing into RunConfig.cost
so session cost accrues for real.
- TUI: AppState tracks session_cost/session_tokens from Session events; status bar
shows "<tokens> · $<cost>". Snapshots updated.
- 7 modelsdev tests (parse, defaults, unknown-model, baked snapshot, cache TTL,
cached-vs-baked load).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>