diff --git a/.gitignore b/.gitignore
index 6f31e0b5..7f80c614 100644
--- a/.gitignore
+++ b/.gitignore
@@ -65,3 +65,6 @@ cli/.stryker-tmp/
cli/reports/
prototypes/model-studio/out
.worktrees/
+
+# Misc
+.omc/
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7bf1b961..7292e78a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
+### Docs
+- Screenshot gallery regenerated 2026-09-21 (post-rebase onto `main`): Mock
+ Dashboard + new Workflow Run/Triage/Verify shots, quality floors, R/Q badges;
+ live CLI scan refresh; capture script covers `05-workflow/`
+
### Fixed
- Workflow L→R smoke FAIL/PARTIAL (slice 77, on
`slice/77-workflow-smoke-fix-target-flow`): Run “Review findings” CTA treats
diff --git a/README.md b/README.md
index 93e767c5..55117caa 100644
--- a/README.md
+++ b/README.md
@@ -189,7 +189,7 @@ remembered in `sessionStorage`.
> **Visual identity v2:** cream paper, tan primary CTA, and AA-readable ink tokens
> (Fraunces display headings) — shipped via [PR #96](https://github.com/neomatrix369/tripwire/pull/96).
-> Screenshots in [docs/screenshots/](docs/screenshots/README.md) regenerated 2026-08-20.
+> Screenshots in [docs/screenshots/](docs/screenshots/README.md) regenerated 2026-09-21.
After installing the CLI, you can also validate target discovery locally without
accounts or a scan:
@@ -209,7 +209,7 @@ stack (same names as the badges above):
| Scan | Adapters run in an isolated sandbox; CLI prints scanner inventory, coverage ledger, and `[evidence]` honesty rows (slices 63/65/66); optional `tripwire judge` panel (slice 67) | Modal (+ Docker), Cisco / Snyk / Tessl / DepShield / Cargo Audit / Ossprey | [modal-setup](docs/user-guide/modal-setup.md) · [env-vars](docs/user-guide/env-vars.md) |
| Store | Findings and scan_run rows land for the dashboard | Supabase / Postgres | [supabase-setup](docs/user-guide/supabase-setup.md) |
| Route (optional) | Every item through SIE; escalate only when signaled | Superlinked SIE → Alibaba Cloud Model Studio via `tripwire route` / auto-route | [sie-setup](docs/user-guide/sie-setup.md) · [model-studio-setup](docs/user-guide/model-studio-setup.md) |
-| Review | Heatmap, drawers, pathway strips, Escalated / SIE-only filters; Run→Report chrome on **Workflow** tab (slices 75–76 on `main` #163/#165; slice 77 smoke/target-flow on branch) | Dashboard (Live or Mock) | [reading-router-results](docs/user-guide/reading-router-results.md) · [screenshots](docs/screenshots/README.md) |
+| Review | Heatmap, drawers, pathway strips, Escalated / SIE-only filters; Run→Report chrome on **Workflow** tab (slices 75–77 on `main` #163/#165/#169) | Dashboard (Live or Mock) | [reading-router-results](docs/user-guide/reading-router-results.md) · [screenshots](docs/screenshots/README.md) |
Mock skips Discover→Scan→Store and still shows Review (plus router fixtures).
Without SIE keys, Route warns and skips; scanner results still store. Sample CLIs
@@ -245,10 +245,10 @@ How to read strips and filters after Route:
Dashboard — Mock overview
-
-
+
+
- Router — Escalated (Mock)
+ Workflow — Run (Mock)
|
@@ -265,7 +265,7 @@ How to read strips and filters after Route:
-> Full gallery (SIE-only, severity filters, list view) → [docs/screenshots/](docs/screenshots/README.md)
+> Full gallery (Escalated / SIE-only, Workflow Triage/Verify, severity filters, list view) → [docs/screenshots/](docs/screenshots/README.md)
## Find the right guide
@@ -280,7 +280,7 @@ How to read strips and filters after Route:
| Preview Mock UI or dry-discover locally | [Optional local validation](QUICKSTART.md#validate-locally-optional) |
| Enable SIE / Model Studio routing | [SIE setup](docs/user-guide/sie-setup.md) · [Model Studio setup](docs/user-guide/model-studio-setup.md) · [`tripwire route`](docs/user-guide/setup-commands.md#tiered-router-optional) |
| Interpret pathway strips / Escalated / SIE-only | [Reading router results](docs/user-guide/reading-router-results.md) |
-| Browse CLI / dashboard screenshots | [Screenshot gallery](docs/screenshots/README.md) |
+| Browse CLI / dashboard / Workflow screenshots | [Screenshot gallery](docs/screenshots/README.md) |
| Smoke-test SIE or Model Studio alone | [SIE sample CLI](prototypes/sie-studio/README.md) · [Model Studio sample CLI](prototypes/model-studio/README.md) |
| Understand results and system shape | [Capability status](docs/STATUS.md) · [Architecture](docs/ARCHITECTURE.md) · [ADRs](docs/adr/README.md) |
| Contribute or maintain | [Contributing](CONTRIBUTING.md) · [command catalog](docs/user-guide/setup-commands.md) |
diff --git a/docs/README.md b/docs/README.md
index 339b90ea..d8ee48be 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -43,7 +43,7 @@ Start here: [QUICKSTART](../QUICKSTART.md) · Repo entry: [README](../README.md)
| [STATUS.md](./STATUS.md) | Evidence-labelled capability claims |
| [ARCHITECTURE.md](./ARCHITECTURE.md) | Services inventory, C4, operator journey + dependency diagrams, key flows |
| [adr/README.md](./adr/README.md) | Formal architecture decision records |
-| [screenshots/](./screenshots/README.md) | CLI + dashboard gallery |
+| [screenshots/](./screenshots/README.md) | CLI + dashboard + Workflow gallery |
| [agent-hooks/README.md](../agent-hooks/README.md) | Claude Code hooks + `/tw-*` skills |
| [SECURITY.md](../SECURITY.md) | Vulnerability reporting |
diff --git a/docs/screenshots/01-cli/01-cli-help-dry-discover.png b/docs/screenshots/01-cli/01-cli-help-dry-discover.png
index 01bd428e..5686b601 100644
Binary files a/docs/screenshots/01-cli/01-cli-help-dry-discover.png and b/docs/screenshots/01-cli/01-cli-help-dry-discover.png differ
diff --git a/docs/screenshots/01-cli/02-cli-real-scan-modal-sandbox.png b/docs/screenshots/01-cli/02-cli-real-scan-modal-sandbox.png
index 789f647e..848659c0 100644
Binary files a/docs/screenshots/01-cli/02-cli-real-scan-modal-sandbox.png and b/docs/screenshots/01-cli/02-cli-real-scan-modal-sandbox.png differ
diff --git a/docs/screenshots/02-dashboard/02-dashboard-overview-grid.png b/docs/screenshots/02-dashboard/02-dashboard-overview-grid.png
index 3748063f..1d98e496 100644
Binary files a/docs/screenshots/02-dashboard/02-dashboard-overview-grid.png and b/docs/screenshots/02-dashboard/02-dashboard-overview-grid.png differ
diff --git a/docs/screenshots/02-dashboard/03-filter-red.png b/docs/screenshots/02-dashboard/03-filter-red.png
index 4a8b08c2..8751b75d 100644
Binary files a/docs/screenshots/02-dashboard/03-filter-red.png and b/docs/screenshots/02-dashboard/03-filter-red.png differ
diff --git a/docs/screenshots/02-dashboard/05-filter-amber.png b/docs/screenshots/02-dashboard/05-filter-amber.png
index c8894699..a600fb21 100644
Binary files a/docs/screenshots/02-dashboard/05-filter-amber.png and b/docs/screenshots/02-dashboard/05-filter-amber.png differ
diff --git a/docs/screenshots/02-dashboard/07-filter-green.png b/docs/screenshots/02-dashboard/07-filter-green.png
index d9cd5a08..65a12f58 100644
Binary files a/docs/screenshots/02-dashboard/07-filter-green.png and b/docs/screenshots/02-dashboard/07-filter-green.png differ
diff --git a/docs/screenshots/02-dashboard/09-mcp-servers-all.png b/docs/screenshots/02-dashboard/09-mcp-servers-all.png
index a15cdb6e..f5ae0c92 100644
Binary files a/docs/screenshots/02-dashboard/09-mcp-servers-all.png and b/docs/screenshots/02-dashboard/09-mcp-servers-all.png differ
diff --git a/docs/screenshots/02-dashboard/13-list-view-all-items.png b/docs/screenshots/02-dashboard/13-list-view-all-items.png
index 97882e7a..fd52f7f1 100644
Binary files a/docs/screenshots/02-dashboard/13-list-view-all-items.png and b/docs/screenshots/02-dashboard/13-list-view-all-items.png differ
diff --git a/docs/screenshots/02-dashboard/14-filter-escalated.png b/docs/screenshots/02-dashboard/14-filter-escalated.png
index 07c5d587..ce276cad 100644
Binary files a/docs/screenshots/02-dashboard/14-filter-escalated.png and b/docs/screenshots/02-dashboard/14-filter-escalated.png differ
diff --git a/docs/screenshots/02-dashboard/15-filter-sie-only.png b/docs/screenshots/02-dashboard/15-filter-sie-only.png
index 9b763e67..023b710e 100644
Binary files a/docs/screenshots/02-dashboard/15-filter-sie-only.png and b/docs/screenshots/02-dashboard/15-filter-sie-only.png differ
diff --git a/docs/screenshots/02-dashboard/16-pathway-escalated-grid.png b/docs/screenshots/02-dashboard/16-pathway-escalated-grid.png
index 53d39665..d6f336d2 100644
Binary files a/docs/screenshots/02-dashboard/16-pathway-escalated-grid.png and b/docs/screenshots/02-dashboard/16-pathway-escalated-grid.png differ
diff --git a/docs/screenshots/02-dashboard/17-pathway-sie-only-grid.png b/docs/screenshots/02-dashboard/17-pathway-sie-only-grid.png
index 9b763e67..023b710e 100644
Binary files a/docs/screenshots/02-dashboard/17-pathway-sie-only-grid.png and b/docs/screenshots/02-dashboard/17-pathway-sie-only-grid.png differ
diff --git a/docs/screenshots/03-skills/04-red-skill-detail-vuln-prompt-injection.png b/docs/screenshots/03-skills/04-red-skill-detail-vuln-prompt-injection.png
index 8f20e0f6..b1c32c4d 100644
Binary files a/docs/screenshots/03-skills/04-red-skill-detail-vuln-prompt-injection.png and b/docs/screenshots/03-skills/04-red-skill-detail-vuln-prompt-injection.png differ
diff --git a/docs/screenshots/03-skills/06-amber-skill-detail-disagreement-domain-check.png b/docs/screenshots/03-skills/06-amber-skill-detail-disagreement-domain-check.png
index 3cc31210..3a68473a 100644
Binary files a/docs/screenshots/03-skills/06-amber-skill-detail-disagreement-domain-check.png and b/docs/screenshots/03-skills/06-amber-skill-detail-disagreement-domain-check.png differ
diff --git a/docs/screenshots/03-skills/08-green-skill-detail-safe-csv-cleaner.png b/docs/screenshots/03-skills/08-green-skill-detail-safe-csv-cleaner.png
index 79120be2..cc9b08bb 100644
Binary files a/docs/screenshots/03-skills/08-green-skill-detail-safe-csv-cleaner.png and b/docs/screenshots/03-skills/08-green-skill-detail-safe-csv-cleaner.png differ
diff --git a/docs/screenshots/04-mcp-servers/10-red-mcp-detail-vuln-command-injection.png b/docs/screenshots/04-mcp-servers/10-red-mcp-detail-vuln-command-injection.png
index 6d0d2bd0..60bba193 100644
Binary files a/docs/screenshots/04-mcp-servers/10-red-mcp-detail-vuln-command-injection.png and b/docs/screenshots/04-mcp-servers/10-red-mcp-detail-vuln-command-injection.png differ
diff --git a/docs/screenshots/04-mcp-servers/11-amber-mcp-detail-vuln-unauthenticated-http.png b/docs/screenshots/04-mcp-servers/11-amber-mcp-detail-vuln-unauthenticated-http.png
index 925a42d1..0f4a7cdc 100644
Binary files a/docs/screenshots/04-mcp-servers/11-amber-mcp-detail-vuln-unauthenticated-http.png and b/docs/screenshots/04-mcp-servers/11-amber-mcp-detail-vuln-unauthenticated-http.png differ
diff --git a/docs/screenshots/04-mcp-servers/12-green-mcp-detail-safe-time-server.png b/docs/screenshots/04-mcp-servers/12-green-mcp-detail-safe-time-server.png
index 47abae34..067d8db1 100644
Binary files a/docs/screenshots/04-mcp-servers/12-green-mcp-detail-safe-time-server.png and b/docs/screenshots/04-mcp-servers/12-green-mcp-detail-safe-time-server.png differ
diff --git a/docs/screenshots/05-workflow/18-workflow-run.png b/docs/screenshots/05-workflow/18-workflow-run.png
new file mode 100644
index 00000000..83ca2dc1
Binary files /dev/null and b/docs/screenshots/05-workflow/18-workflow-run.png differ
diff --git a/docs/screenshots/05-workflow/19-workflow-triage.png b/docs/screenshots/05-workflow/19-workflow-triage.png
new file mode 100644
index 00000000..0170fb07
Binary files /dev/null and b/docs/screenshots/05-workflow/19-workflow-triage.png differ
diff --git a/docs/screenshots/05-workflow/20-workflow-verify.png b/docs/screenshots/05-workflow/20-workflow-verify.png
new file mode 100644
index 00000000..6f0d756e
Binary files /dev/null and b/docs/screenshots/05-workflow/20-workflow-verify.png differ
diff --git a/docs/screenshots/README.md b/docs/screenshots/README.md
index 06d3284d..6210fe6d 100644
--- a/docs/screenshots/README.md
+++ b/docs/screenshots/README.md
@@ -2,17 +2,18 @@
Product UI and CLI captures, grouped by surface. Paths are relative to this folder.
-**Dashboard, skill, and MCP shots use Mock (demo data)** so Red / Amber / Green
-and Escalated / SIE-only examples stay stable. **CLI shots are live terminal
-captures** from the current CLI.
+**Dashboard, skill, MCP, and Workflow shots use Mock (demo data)** so Red /
+Amber / Green, Escalated / SIE-only, and Run→Report examples stay stable.
+**CLI shots are live terminal captures** from the current CLI.
**Try the UI without cloning:** [hosted dashboard](https://neomatrix369.github.io/demos/tripwire-dashboard/) (Mock on GitHub Pages) · [demo walkthrough video](https://youtu.be/omGOw9ruN3Y).
Skill cards show compact **`R`** (risk density) and **`Q`** (Tessl quality)
badges; card colour is worst-of finding status — **colour ≠ density**.
-> **Note (2026-08-20):** Gallery PNGs regenerated for slice-43 paper/tan visual
-> identity v2 (and slice-42 metric badges). Re-run the commands below after further
+> **Note (2026-09-21):** Gallery PNGs regenerated after rebase onto `main`
+> (Workflow Run/Triage/Verify steps, quality floors, R/Q badges, pathway strips).
+> CLI shots include `judge` / `setup-agent-hooks` / `status`. Re-run after further
> chrome changes.
Regenerate frontend shots with:
@@ -42,7 +43,9 @@ Help output (including `route`) and discovery / live scan feedback.
## 2. Dashboard
Heatmap grid, severity filters, tiered-router filters, type views, and list
-layout (Mock demo). Card colour is worst-of actionable finding severity; chips
+layout (Mock demo). Default skill view uses **Quality ≥ 80**; Red/Amber skill
+drill-downs and severity filters that need low-Q fixtures switch to
+**Quality < 80**. Card colour is worst-of actionable finding severity; chips
show finding counts. Compare with the live [hosted dashboard](https://neomatrix369.github.io/demos/tripwire-dashboard/) or the [YouTube walkthrough](https://youtu.be/omGOw9ruN3Y).
### Overview grid
@@ -126,3 +129,22 @@ Drill-down detail for MCP server findings by heatmap severity.
### Green — safe time server

+
+---
+
+## 5. Workflow
+
+Run → Triage → Investigate → Fix → Verify → Report chrome (Mock). Stepper shows
+configured default model aliases; panels show scanner / judge / verify state.
+
+### Run
+
+
+
+### Triage
+
+
+
+### Verify
+
+
diff --git a/docs/user-guide/reading-router-results.md b/docs/user-guide/reading-router-results.md
index 550709ff..9e57fe60 100644
--- a/docs/user-guide/reading-router-results.md
+++ b/docs/user-guide/reading-router-results.md
@@ -96,7 +96,8 @@ Same `severity` column, different meaning by `category`:
1. Mock dashboard already includes `tiered_router` fixtures — open
[http://127.0.0.1:8765/Tripwire.dc.html](http://127.0.0.1:8765/Tripwire.dc.html)
with `node scripts/serve-dashboard.mjs` and toggle **Escalated** / **SIE-only**.
-2. Gallery shots: [screenshots README](../screenshots/README.md) (router section).
+2. Gallery shots: [screenshots README](../screenshots/README.md)
+ (dashboard router filters + Workflow Run/Triage/Verify).
3. Live conflict / timeout fixtures (needs Supabase `.env`):
```bash
diff --git a/scripts/capture-screenshots.mjs b/scripts/capture-screenshots.mjs
index 9b865477..3b1cc357 100644
--- a/scripts/capture-screenshots.mjs
+++ b/scripts/capture-screenshots.mjs
@@ -132,17 +132,38 @@ async function shot(page, relPath) {
async function resetFilters(page) {
await clickButtonByText(page, "All items");
await clickButtonByText(page, "Total items");
+ // Product default: Quality ≥ 80 (skills below the floor stay hidden).
+ await clickButtonByText(page, "Quality ≥ 80");
await clickButtonByText(page, "Grid");
await sleep(300);
}
+async function setQualityFloor(page, which) {
+ if (which === "high") {
+ await clickButtonByText(page, "Quality ≥ 80");
+ } else if (which === "low") {
+ await clickButtonByText(page, "Quality < 80");
+ } else if (which === "unscored") {
+ await clickButtonByText(page, "No quality score");
+ } else {
+ throw new Error(`Unknown quality floor: ${which}`);
+ }
+ await sleep(400);
+}
+
async function main() {
console.log(`Opening ${baseUrl}`);
const browser = await puppeteer.launch({
executablePath: chrome,
- headless: true,
+ headless: "new",
defaultViewport: { width: 1600, height: 900, deviceScaleFactor: 2 },
- args: ["--no-sandbox", "--disable-gpu"],
+ args: [
+ "--no-sandbox",
+ "--disable-gpu",
+ "--disable-dev-shm-usage",
+ `--user-data-dir=/tmp/tw-chrome-gallery-${Date.now()}`,
+ ],
+ timeout: 60000,
});
try {
@@ -168,12 +189,17 @@ async function main() {
await shot(page, "02-dashboard/02-dashboard-overview-grid.png");
await clickButtonByText(page, "Red");
+ // Red Mock skills sit under Quality < 80 (Tessl Q); MCPs ignore the quality tab.
+ await setQualityFloor(page, "low");
await shot(page, "02-dashboard/03-filter-red.png");
await clickButtonByText(page, "Total items");
+ await setQualityFloor(page, "high");
await clickButtonByText(page, "Amber");
+ await setQualityFloor(page, "low");
await shot(page, "02-dashboard/05-filter-amber.png");
await clickButtonByText(page, "Total items");
+ await setQualityFloor(page, "high");
await clickButtonByText(page, "Green");
await shot(page, "02-dashboard/07-filter-green.png");
@@ -209,7 +235,9 @@ async function main() {
await resetFilters(page);
await clickButtonByText(page, "Skills");
await sleep(700);
- console.log("Skills visible:", (await listVisibleItemNames(page)).join(", "));
+ // Red / amber gallery fixtures have Tessl Q < 80.
+ await setQualityFloor(page, "low");
+ console.log("Skills (Q<80) visible:", (await listVisibleItemNames(page)).join(", "));
await clickItemByName(page, "vuln-prompt-injection-notes");
await shot(page, "03-skills/04-red-skill-detail-vuln-prompt-injection.png");
await closeDetail(page);
@@ -221,6 +249,8 @@ async function main() {
);
await closeDetail(page);
+ await setQualityFloor(page, "high");
+ console.log("Skills (Q≥80) visible:", (await listVisibleItemNames(page)).join(", "));
await clickItemByName(page, "safe-csv-cleaner");
await shot(page, "03-skills/08-green-skill-detail-safe-csv-cleaner.png");
await closeDetail(page);
@@ -248,7 +278,18 @@ async function main() {
await shot(page, "04-mcp-servers/12-green-mcp-detail-safe-time-server.png");
await closeDetail(page);
- console.log("Done — replaced all dashboard/skill/MCP screenshots.");
+ // 05 — Workflow (Run → Report chrome from main)
+ await clickButtonByText(page, "Workflow");
+ await sleep(800);
+ await shot(page, "05-workflow/18-workflow-run.png");
+ await clickButtonByText(page, "Triage");
+ await sleep(600);
+ await shot(page, "05-workflow/19-workflow-triage.png");
+ await clickButtonByText(page, "Verify");
+ await sleep(600);
+ await shot(page, "05-workflow/20-workflow-verify.png");
+
+ console.log("Done — replaced all dashboard/skill/MCP/workflow screenshots.");
} finally {
await browser.close();
}
|