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 - - Dashboard Escalated filter (Mock) + + Workflow Run step (Mock) - 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 ![Green MCP detail: safe-time-server](04-mcp-servers/12-green-mcp-detail-safe-time-server.png) + +--- + +## 5. Workflow + +Run → Triage → Investigate → Fix → Verify → Report chrome (Mock). Stepper shows +configured default model aliases; panels show scanner / judge / verify state. + +### Run + +![Workflow Run step](05-workflow/18-workflow-run.png) + +### Triage + +![Workflow Triage step](05-workflow/19-workflow-triage.png) + +### Verify + +![Workflow Verify step](05-workflow/20-workflow-verify.png) 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(); }