diff --git a/CHANGELOG.md b/CHANGELOG.md
index 90f81f00..c6f8ab99 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,14 @@ All notable changes to this project are documented here. The format follows
## [Unreleased]
+### Changed
+
+- **Status watch SVGs show the 0.13 Sub tab.** The README hero
+ (`status-watch-dark.svg` / `status-watch-light.svg`) still rendered the
+ 0.12 Always→Codex / kimi / grok presets. Tab 4 now matches CLIProxyAPI:
+ Off / Always / Fallback, `[` `]` hop rotation, sidecar + official catalog,
+ and the grok-4.6 input→output map.
+
## [0.13.2] - 2026-08-16
### Fixed
diff --git a/README.md b/README.md
index 9b536932..2f66b005 100644
--- a/README.md
+++ b/README.md
@@ -30,7 +30,7 @@
-
+
diff --git a/assets/status-watch-dark.svg b/assets/status-watch-dark.svg
index 956a738e..468c0c54 100644
--- a/assets/status-watch-dark.svg
+++ b/assets/status-watch-dark.svg
@@ -1 +1 @@
-
+
diff --git a/assets/status-watch-light.svg b/assets/status-watch-light.svg
index dadb1e03..fc219350 100644
--- a/assets/status-watch-light.svg
+++ b/assets/status-watch-light.svg
@@ -1 +1 @@
-
+
diff --git a/crates/llmtrim-cli/src/breakdown/app.rs b/crates/llmtrim-cli/src/breakdown/app.rs
index dcedae5a..4e30e0c7 100644
--- a/crates/llmtrim-cli/src/breakdown/app.rs
+++ b/crates/llmtrim-cli/src/breakdown/app.rs
@@ -3454,8 +3454,7 @@ mod tests {
#[cfg(not(feature = "intercept"))]
let tabs = [Tab::Overview, Tab::Sessions, Tab::Detail];
- // Stable Sub-tab demo state (not the machine's live routing) so the asset
- // always shows a readable Always→Codex map with mixed auth.
+ // Stable Sub-tab demo (not live routing): Fallback hops + grok-4.6 CLIProxyAPI map.
#[cfg(feature = "intercept")]
app.sub.seed_export_demo();
diff --git a/crates/llmtrim-cli/src/breakdown/sub_panel.rs b/crates/llmtrim-cli/src/breakdown/sub_panel.rs
index 728c061b..d51f3564 100644
--- a/crates/llmtrim-cli/src/breakdown/sub_panel.rs
+++ b/crates/llmtrim-cli/src/breakdown/sub_panel.rs
@@ -168,16 +168,43 @@ impl SubPanel {
}
pub fn seed_export_demo(&mut self) {
- self.selected = RoutingPreset::AlwaysCodex;
- self.applied = RoutingPreset::AlwaysCodex;
+ self.selected = RoutingPreset::Fallback;
+ self.applied = RoutingPreset::Fallback;
self.running = true;
+ self.chain = vec![
+ "anthropic".into(),
+ "codex".into(),
+ "gemini".into(),
+ "grok".into(),
+ ];
self.rows = vec![
("fable".into(), "grok-4.6".into()),
("opus".into(), "grok-4.6".into()),
("sonnet".into(), "grok-4.6".into()),
("haiku".into(), "grok-composer-2.5-fast".into()),
];
- self.status = "demo".into();
+ if self.catalog.is_empty() {
+ self.catalog = [
+ ("gpt-5.4", "openai", "codex"),
+ ("claude-opus-4-6", "anthropic", "claude"),
+ ("gemini-3-pro", "google", "gemini"),
+ ("grok-4.6", "xai", "grok"),
+ ("grok-composer-2.5-fast", "xai", "grok"),
+ ("kimi-k2.5", "moonshot", "kimi"),
+ ("gemini-claude-opus-4-6", "google", "vertex"),
+ ("qwen3-max", "alibaba", "qwen"),
+ ("gpt-4.1", "github", "copilot"),
+ ]
+ .into_iter()
+ .map(|(id, owned, family)| OfficialModel {
+ id: id.to_string(),
+ owned_by: owned.into(),
+ display_name: id.to_string(),
+ family: family.into(),
+ })
+ .collect();
+ }
+ self.status.clear();
}
fn read_applied_preset() -> RoutingPreset {