Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -65,3 +65,6 @@ cli/.stryker-tmp/
cli/reports/
prototypes/model-studio/out
.worktrees/

# Misc
.omc/
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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
Expand Down Expand Up @@ -245,10 +245,10 @@ How to read strips and filters after Route:
<sub><b>Dashboard</b> — Mock overview</sub>
</td>
<td align="center" width="20%">
<a href="docs/screenshots/02-dashboard/14-filter-escalated.png">
<img src="docs/screenshots/02-dashboard/14-filter-escalated.png" width="100%" alt="Dashboard Escalated filter (Mock)">
<a href="docs/screenshots/05-workflow/18-workflow-run.png">
<img src="docs/screenshots/05-workflow/18-workflow-run.png" width="100%" alt="Workflow Run step (Mock)">
</a>
<sub><b>Router</b> — Escalated (Mock)</sub>
<sub><b>Workflow</b> — Run (Mock)</sub>
</td>
<td align="center" width="20%">
<a href="docs/screenshots/03-skills/04-red-skill-detail-vuln-prompt-injection.png">
Expand All @@ -265,7 +265,7 @@ How to read strips and filters after Route:
</tr>
</table>

> 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

Expand All @@ -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) |
Expand Down
2 changes: 1 addition & 1 deletion docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 |

Expand Down
Binary file modified docs/screenshots/01-cli/01-cli-help-dry-discover.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/01-cli/02-cli-real-scan-modal-sandbox.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/02-dashboard/02-dashboard-overview-grid.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/02-dashboard/03-filter-red.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/02-dashboard/05-filter-amber.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/02-dashboard/07-filter-green.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/02-dashboard/09-mcp-servers-all.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/02-dashboard/13-list-view-all-items.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/02-dashboard/14-filter-escalated.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/02-dashboard/15-filter-sie-only.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/02-dashboard/16-pathway-escalated-grid.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified docs/screenshots/02-dashboard/17-pathway-sie-only-grid.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
34 changes: 28 additions & 6 deletions docs/screenshots/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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)
3 changes: 2 additions & 1 deletion docs/user-guide/reading-router-results.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
49 changes: 45 additions & 4 deletions scripts/capture-screenshots.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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");
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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();
}
Expand Down
Loading