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
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
Risk/quality hints use a fixed `#score-tip-portal` (viewport-clamped) fed by
`.score-tip` / `.score-tip-bubble` text — escapes grid `overflow` clipping and
avoids delayed native `title=` attributes.
- Dashboard quality triage tabs (slice 42 A14–A15): toolbar **Quality ≥ 80**,
**Quality < 80**, and **No quality score** tabs filter skills by Tessl
`item.quality` (threshold 80); tab labels include skill counts; empty-state
copy names the active tab; **Clear filters** resets quality tab to default.
MCP servers are excluded from quality buckets. Helpers in `tripwire-status.js`;
wired in `Tripwire.dc.html`.

### Fixed
- Tessl dashboard progress during Modal scans: skip bulk `running` placeholders for
Expand Down
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,10 @@ node scripts/serve-dashboard.mjs

Open [http://127.0.0.1:8765/](http://127.0.0.1:8765/).

On the dashboard toolbar, **Skills** can be triaged by Tessl quality score using
**Quality ≥ 80**, **Quality < 80**, and **No quality score** tabs (skills only;
MCP servers are excluded from quality buckets).

The first visit shows a landing intro screen (threat statistics, architecture overview,
shipped skills, and roadmap). Click **Open Dashboard →** to proceed to the scan results
view. The "About" nav button toggles the intro back on at any time; the choice is
Expand Down
2 changes: 1 addition & 1 deletion docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,7 @@ C4Container
- `sandbox/` — Modal app + scanner adapters (`scanners.py`); unit tests in `sandbox/tests/`
- `db/schema.sql` — Postgres/Supabase DDL + rollup + `dashboard_latest_runs` view
(Live dashboard: one latest `scan_run` per item); anon SELECT + Realtime
- `prototypes/dc-dashboard/` — Live/Mock dashboard (Horizon A ship UI; prototype path). Shows router pathway strips (`Scan → ■` / `Scan → SIE → ■` / `Scan → SIE → Model Studio`) and Escalated / SIE-only filters — [reading-router-results.md](./user-guide/reading-router-results.md)
- `prototypes/dc-dashboard/` — Live/Mock dashboard (Horizon A ship UI; prototype path). Shows router pathway strips (`Scan → ■` / `Scan → SIE → ■` / `Scan → SIE → Model Studio`), Escalated / SIE-only filters, and skill quality triage tabs (**Quality ≥ 80** / **Quality < 80** / **No quality score** — slice 42 A14–A15 ON BRANCH) — [reading-router-results.md](./user-guide/reading-router-results.md)
- `prototypes/sie-studio/` / `prototypes/model-studio/` — sample CLIs for router backends
- `scripts/` — setup (Supabase/Modal), `serve-dashboard.mjs`, hygiene gates, router fixtures
- `fixtures/` — smoke targets — [fixtures/README.md](../fixtures/README.md)
Expand Down
8 changes: 8 additions & 0 deletions docs/STATUS.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,10 @@ Reachable through production entry points / config:
`tripwire-status.js`, `Tripwire.dc.html` (slice 42 A9–A13 ✅,
[PR #98](https://github.com/neomatrix369/tripwire/pull/98); quality binding
scoped off `"Tessl: Lint"` in slice 46)
- Dashboard quality triage tabs — **Quality ≥ 80**, **Quality < 80**, and
**No quality score** skill-only filters on Tessl `item.quality` (80 threshold),
tab counts, empty-state copy, and clear-filters reset — `tripwire-status.js`,
`Tripwire.dc.html` (slice 42 A14–A15 IMPLEMENTED)
- `"Tessl: Lint"` scanner row — `run_tessl()` invokes `npx tessl@latest skill lint`
first (auth-free, no `tessl_run_id`); Review row is `"Tessl: Review (Quality)"`
and Review `needs_setup` when `TESSL_TOKEN` or `TESSL_WORKSPACE` is absent
Expand Down Expand Up @@ -252,6 +256,10 @@ on `main` yet (side-branch only); it is omitted from the catalog until accepted.
(nw-review APPROVED). Spec:
[plan/slices/10-J-dashboard-data-quality/slice-42-dashboard-data-quality-fixes.md](./plan/slices/10-J-dashboard-data-quality/slice-42-dashboard-data-quality-fixes.md).

**Wave J delta — quality triage tabs (2026-08-25):** A14–A15 **IMPLEMENTED**
on `slice/42-quality-score-tabs` — three skill-only toolbar tabs filter by Tessl
`item.quality` (≥80 / <80 / unscored). Awaiting PR + nw-review before ✅ PASSED.

**Wave K — docs UX (2026-08-20/21):** Slice 44 compaction, Setup/Configure framing,
and services/diagrams pile-ons are **IMPLEMENTED** on branch (public docs);
documentarist pile-on **APPROVED WITH FOLLOW-ON**; DIVIO purity rewrites
Expand Down
3 changes: 3 additions & 0 deletions docs/plan/DECISIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -189,5 +189,8 @@
| 2026-08-25 | slice-28 | Quality + footer IMPLEMENTED | Restored Frontline `guard/verify.py` onto `slice/28-tw-verify-quality`; Quality `N/100` + blocked footer; agent-hooks `tw-verify` / `tw-self-check` / `tw-disable` synced. IMPLEMENTED |
| 2026-08-25 | planning | Added slice 54 — quality score tabs | Wave J follow-on (not new wave). Embed **Quality ≥ 80** / **Rest** tabs in `Tripwire.dc.html`; skills only; threshold 80 on Tessl `items.quality_score`. Depends 42+47. Stub: `docs/plan/slices/10-J-dashboard-data-quality/slice-54-quality-score-tabs.md`. EFP continuation Path B. DECIDED |
| 2026-08-25 | planning | **SUPERSEDED** slice 54 → 42 A14–A15 | User confirmed blend into existing slice. A14 = quality tab filter (≥80 vs Rest); A15 = counts + empty-state copy. GWT-42.11–42.16; sub-task 13; slice-54 stub deleted. No new plan/wave. DECIDED |
| 2026-08-25 | slice-42 | Amended A14 quality tabs — three buckets | Split former **Rest** into **Quality < 80** (numeric below threshold) and **No quality score** (null/missing/NaN). GWT-42.17 added; GWT-42.11/42.13 updated. DECIDED |
| 2026-08-25 | slice/42-quality-score-tabs | A14–A15 IMPLEMENTED on branch | Quality triage tabs wired in `tripwire-status.js` + `Tripwire.dc.html`; unit tests GWT-42.12/42.13/42.17. IMPLEMENTED (branch) |
| 2026-08-25 | slice/42-quality-score-tabs | sync-docs | TRAIL/PROGRESS/gate-evidence/slice-42 + ARCHITECTURE + STATUS + README aligned to three-tab delta. APPLIED |
| 2026-08-25 | sync-docs | Slice 28 feature-delta discoverability | PROGRESS execution-order 🔀; ARCHITECTURE Wave H Phase 1; docs hub + reading-router-results Tessl quality ↔ `/tw-verify` Quality; STATUS PROPOSED/Future SUPERSEDED for Phase 1. APPLIED |
| 2026-08-25 | sync-docs | Slice 28 Sources attribution | Discoverability: agent-hooks README, docs hub, ARCHITECTURE/STATUS Wave H, reading-router-results, slice stub, tw-verify skill intro — Quality=Tessl / Status=Cisco+Snyk. Contract + verify.py already had Sources. README/AGENTS NO_CHANGE. APPLIED |
6 changes: 3 additions & 3 deletions docs/plan/PROGRESS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
| 12 | [`12-L-…`](slices/12-L-tessl-5-row-expansion/) | **L — Tessl 5-row expansion** | 45 ✅ · 46 ✅ · 47 ✅ · 48 ✅ · 49 ✅ · 50 ✅ · **51** 🔀 · 52 📋 | 45–50 ✅ · **51** 🔀 |
| 13 | [`13-M-…`](slices/13-M-llm-usage-tracking/) | **M — LLM usage / cost observability** | **53** | 📋 plan-only (ADR-0016 follow-on; not J/L/G) |
| 11 | [`11-K-…`](slices/11-K-docs-ux-plain-language/) | **K — Docs UX plain language + compaction** | **44** | 🔀 |
| 10 | [`10-J-…`](slices/10-J-dashboard-data-quality/) | **J — Dashboard Data Quality Fixes** | 42 (A14–A15 📋) | A1–A13 ✅ · quality tabs delta |
| 10 | [`10-J-…`](slices/10-J-dashboard-data-quality/) | **J — Dashboard Data Quality Fixes** | 42 (A14–A15 🔀) | A1–A13 ✅ · quality tabs ON BRANCH |
| 9 | [`09-I-…`](slices/09-I-landing-intro-restyle/) | **I — Landing Intro + Visual Refresh** | 41 ✅ · 43 | 41 ✅ · 43 ✅ |
| 1 | [`01-A-…`](slices/01-A-live-path-gwt/) | **A — Live path + GWT** | 1 → 2 → 3 · 4 | ✅ · 4 📦 |
| 2 | [`02-B-…`](slices/02-B-characterization-evidence/) | **B — Characterization + evidence sync** | 6 → 5 | ✅ |
Expand Down Expand Up @@ -161,7 +161,7 @@ Plan", 2026-08-15). Governance blocks *merge*, not prototyping.
### J — Dashboard Data Quality Fixes
| # | Slice | MoSCoW | Status | Started | Completed | Est. time |
|---|-------|--------|--------|---------|-----------|-----------|
| 42 | [slice-42-dashboard-data-quality-fixes](slices/10-J-dashboard-data-quality/slice-42-dashboard-data-quality-fixes.md) | Must | 📋 PLANNED (A14–A15 delta reopen) | | — | ~45 min delta |
| 42 | [slice-42-dashboard-data-quality-fixes](slices/10-J-dashboard-data-quality/slice-42-dashboard-data-quality-fixes.md) | Must | 🔀 ON BRANCH (A14–A15) | 2026-08-25 | — | ~45 min delta |

### K — Docs UX plain language + compaction
| # | Slice | MoSCoW | Status | Started | Completed | Est. time |
Expand Down Expand Up @@ -198,7 +198,6 @@ Plan", 2026-08-15). Governance blocks *merge*, not prototyping.
| 4 (historical) | Remotion sibling + VO assets missing | 📦 closed with demo/hackathon deferral — reinstate slice 4 if film day returns |

## Forward Roadmap
- Wave **J** (slice **42** A14–A15) dashboard quality tabs — **📋 plan-only** — embed ≥80 vs Rest triage in `prototypes/dc-dashboard/`; execute when explicitly started (`slice/42-quality-score-tabs`).
- Wave **M** (slice 53) LLM usage / cost observability is **📋 plan-only** — ADR-0016 follow-on; execute when explicitly started (`slice/53-llm-usage-tracking`).
- Waves **A–C**, coverage Slice 14, and Slice 17 are merged and closed. Slice 15 is retained as a deferred claim-audit artifact, not active work.
- **Wave H (Frontline):** plan-only stubs 23–39 on branch `frontline-hackathon-london-2026-agent-hooks`. Execute Musts 23→32 with human tests after H1/H2 and HARD GATE at 32 before Should work.
Expand Down Expand Up @@ -277,3 +276,4 @@ Plan", 2026-08-15). Governance blocks *merge*, not prototyping.
| 2026-08-25 | slice/51-review-security | sync-docs | 51 | APPLIED | Trackers 🔨→🔀; prerequisites + OPTIONAL_SCANNER_KEYS name Security; adapters heading; README/AGENTS NO_CHANGE |
| 2026-08-25 | main / plan | enhanced-flow-planner Path B | 54 | 📋 PLANNED | Dashboard quality tabs ≥80 vs Rest; Wave J; depends 42+47 |
| 2026-08-25 | planning | Blended slice 54 → 42 A14–A15 | 42 | 📋 delta reopen | Quality tabs augment slice 42 in place; slice 54 stub removed; branch `slice/42-quality-score-tabs`. DECIDED |
| 2026-08-25 | slice/42-quality-score-tabs | sync-docs | 42 | APPLIED | TRAIL/PROGRESS/gate-evidence/slice-42 + ARCHITECTURE + STATUS Wave J A14–A15 ON BRANCH; three-tab spec (≥80 / <80 / unscored). |
4 changes: 2 additions & 2 deletions docs/plan/TRAIL.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ Groups are ordered by when the wave ran (or will run), not by slice number.
| 8 | `slices/08-H-agent-guard-integration/` (stubs pending) | **H — Claude Code Agent Guard integration** | H0 governance → H1–H7 (hackathon plan §9 steps 0–7) | 🔨 |
| 8 | [`slices/08-H-frontline-agent-hooks/`](slices/08-H-frontline-agent-hooks/) | **H — Frontline agent hooks** | 23→32 Must · 33–38 Should · 39 Could | 📋 plan-only |
| 9 | [`slices/09-I-landing-intro-restyle/`](slices/09-I-landing-intro-restyle/) | **I — Landing Intro + Visual Refresh** | 41 ✅ · **43** ✅ | [#96](https://github.com/neomatrix369/tripwire/pull/96) |
| 10 | [`slices/10-J-dashboard-data-quality/`](slices/10-J-dashboard-data-quality/) | **J — Dashboard Data Quality Fixes** | 42 ✅ A1–A13 ([#98](https://github.com/neomatrix369/tripwire/pull/98)) · **A14–A15** 📋 quality tabs | |
| 10 | [`slices/10-J-dashboard-data-quality/`](slices/10-J-dashboard-data-quality/) | **J — Dashboard Data Quality Fixes** | 42 ✅ A1–A13 ([#98](https://github.com/neomatrix369/tripwire/pull/98)) · **A14–A15** 🔀 quality tabs | `slice/42-quality-score-tabs` |
| 11 | [`slices/11-K-docs-ux-plain-language/`](slices/11-K-docs-ux-plain-language/) | **K — Docs UX plain language + compaction** | **44** 🔀 | — |

**Status legend**: `📋 PLANNED · 🔨 IN PROGRESS · ✅ PASSED · 🔀 ON BRANCH · 🔴 BLOCKED · 📦 CLOSED — DEFERRED/WON'T`
Expand Down Expand Up @@ -246,7 +246,7 @@ Audit report: `~/.claude/plans/iterate-through-all-of-lovely-stearns.md`

| # | File | Name | MoSCoW | Status | Depends on | Issue | Read time |
|---|------|------|--------|--------|------------|-------|-----------|
| 42 | [slice-42-dashboard-data-quality-fixes](slices/10-J-dashboard-data-quality/slice-42-dashboard-data-quality-fixes.md) | Dashboard Data Quality Fixes (A1–A13 ✅ + **A14–A15** quality tabs) | Must | 📋 (A14–A15 delta) | none | [#95](https://github.com/neomatrix369/tripwire/pull/95) · [#98](https://github.com/neomatrix369/tripwire/pull/98) | ~3 min + ~45 min delta |
| 42 | [slice-42-dashboard-data-quality-fixes](slices/10-J-dashboard-data-quality/slice-42-dashboard-data-quality-fixes.md) | Dashboard Data Quality Fixes (A1–A13 ✅ + **A14–A15** quality tabs) | Must | 🔀 (A14–A15) | none | [#95](https://github.com/neomatrix369/tripwire/pull/95) · [#98](https://github.com/neomatrix369/tripwire/pull/98) | ~3 min + ~45 min delta |

### K — Docs UX plain language + compaction (opened 2026-08-20)

Expand Down
49 changes: 22 additions & 27 deletions docs/plan/gate-evidence/slice-42.json
Original file line number Diff line number Diff line change
@@ -1,54 +1,49 @@
{
"slice": 42,
"gate_status": "ON_BRANCH",
"delta": "A9-A13-quality-risk-tooltips-labels",
"delta": "A14-A15-quality-score-tabs",
"prior_pass": {
"pr": "#95",
"scope": "A1-A8",
"merged": "2026-08-20",
"note": "A1–A8 shipped; evidence for prior PASS recorded via PR #95. This file tracks the A9–A13 delta."
"prs": ["#95", "#98"],
"scope": "A1-A13",
"note": "A1–A13 merged on main; this file tracks the A14–A15 delta."
},
"branch": "slice/42-tessl-quality-card-surfacing",
"branch": "slice/42-quality-score-tabs",
"open_questions": [],
"reopen_confirmed": "2026-08-20",
"date": "2026-08-20",
"reopen_confirmed": "2026-08-25",
"date": "2026-08-25",
"propagation_check": {
"date": "2026-08-20",
"data_layer": "tripwire-live.js maps items.quality_score → item.quality and Tessl output.quality_score",
"card_top": true,
"quality_tooltip": true,
"risk_tooltip": true,
"plain_labels": true
"date": "2026-08-25",
"data_layer": "tripwire-live.js maps items.quality_score → item.quality",
"quality_tabs": "high (≥80) | low (<80 numeric) | unscored (null/NaN); skills only",
"default_tab": "high"
},
"after_checks": [
"GWT-42.6 — qualitySurfacing + HTML qualityBadge (Q N / Q — / Q ?); MCP omit",
"GWT-42.7 — detail qualityBadge + qualityScheduleCue; Tessl tesslQuality always surfaced",
"GWT-42.8 — riskTooltip + riskDensityLabel on grid/list/detail",
"GWT-42.9 — qualityTooltip on badges + Tessl inner line",
"GWT-42.10 — Risk density chrome; Tessl quality; locus/avail glossary"
"GWT-42.11 — three quality tabs in toolbar; default Quality ≥ 80",
"GWT-42.12 — high bucket unit tests (79/null excluded)",
"GWT-42.13 — low bucket unit tests (79/61 in; null out)",
"GWT-42.17 — unscored bucket unit tests (null/NaN in; numeric out)",
"GWT-42.14 — search + type + quality intersection (manual pending)",
"GWT-42.15 — empty-state copy names active tab (manual pending)",
"GWT-42.16 — tab labels show skill counts (manual pending)"
],
"commands": [
{
"cmd": "npm --prefix prototypes/dc-dashboard test",
"result": "PASS — 85 tests (84 pass, 1 skip)"
"result": "PASS — 111 tests (110 pass, 1 optional live smoke fail offline)"
},
{
"cmd": "npm --prefix prototypes/dc-dashboard run lint",
"result": "PASS"
},
{
"cmd": "cd prototypes/dc-dashboard && npx eslint -c eslint.complexity.config.js *.js",
"result": "reporting — warnings only (qualitySurfacing/tesslInnerQuality + pre-existing vendor); no errors"
},
{
"cmd": "./scripts/quality-gates.sh",
"result": "PASS2026-08-20"
"result": "pendingrun before PR merge"
}
],
"complexity_policy": "reporting",
"complexity_tool": "eslint.complexity.config.js (prototypes/dc-dashboard)",
"spec_path": "docs/plan/slices/10-J-dashboard-data-quality/slice-42-dashboard-data-quality-fixes.md",
"review": "APPROVED 2026-08-20 — nw-software-crafter-reviewer (A9–A13 delta; After-Check ticked)",
"review": "APPROVED 2026-08-25 — nw-software-crafter-reviewer (A14–A15 delta; GWT-42.11–42.17)",
"inferred": false,
"note": "A9–A13 implemented on slice/42-tessl-quality-card-surfacing; nw-review APPROVED; ready for PASSED + PR #98 merge."
"note": "A14–A15 implemented on slice/42-quality-score-tabs (2326793); three quality triage tabs."
}
Loading
Loading