Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
ed54df9
docs(spec-101): US1 tasks and 2026-10-20 plan re-validation delta
Dumbris Oct 20, 2026
a396515
feat(security): Spec 101 US1 shared contract (state types, reasons, s…
Dumbris Oct 20, 2026
2f1e473
feat(security): Spec 101 US1 persist TPA bundle anti-downgrade state …
Dumbris Oct 20, 2026
3297497
docs(config): clarify tpa_operator_baseline seeds the operator watermark
Dumbris Oct 20, 2026
aa6ffe4
feat(security): Spec 101 US1 telemetry for the active TPA bundle
Dumbris Oct 20, 2026
28f9d3c
feat(security): Spec 101 US1 descriptor-based time-bounded candidate …
Dumbris Oct 20, 2026
18e47af
feat(security): Spec 101 US1 signed bundle sidecar package and tpa-db…
Dumbris Oct 20, 2026
abc8e08
feat(security): Spec 101 US1 config trust-root validation, hot-reload…
Dumbris Oct 20, 2026
34de75b
merge: spec101-w1-bundlesig (Spec 101 US1 wave 1)
Dumbris Oct 20, 2026
c7ec79b
merge: spec101-w1-open (Spec 101 US1 wave 1)
Dumbris Oct 20, 2026
ea399ba
merge: spec101-w1-storage (Spec 101 US1 wave 1)
Dumbris Oct 20, 2026
8b75f25
merge: spec101-w1-config (Spec 101 US1 wave 1)
Dumbris Oct 20, 2026
0385ccb
merge: spec101-w1-telemetry (Spec 101 US1 wave 1)
Dumbris Oct 20, 2026
741f7ec
feat(security): Spec 101 US1 pure candidate pipeline and anti-downgra…
Dumbris Oct 20, 2026
5cf8616
feat(security): Spec 101 US1 serialized bundle runtime, LKG store, ro…
Dumbris Oct 20, 2026
34be6d1
feat(security): Spec 101 US1 Web UI bundle status panel and degraded …
Dumbris Oct 20, 2026
58b2e55
feat(security): Spec 101 US1 operator documentation for signed TPA bu…
Dumbris Oct 20, 2026
14616c4
feat(security): Spec 101 US1 bundle REST routes and security bundle CLI
Dumbris Oct 20, 2026
af3176f
feat(security): Spec 101 US1 harden rollback pin, LKG recovery and st…
Dumbris Oct 20, 2026
3231fe7
merge: spec101-w2 core pipeline (Spec 101 US1 wave 2)
Dumbris Oct 20, 2026
280aea5
merge: Spec 101 US1 Web UI bundle status panel and degraded banner (S…
Dumbris Oct 20, 2026
da74c55
merge: Spec 101 US1 operator documentation for signed TPA bundles (Sp…
Dumbris Oct 20, 2026
481fdec
merge: Spec 101 US1 bundle REST routes and security bundle CLI (Spec …
Dumbris Oct 20, 2026
d760005
feat(security): Spec 101 US1 server wiring: bundle runtime, degraded …
Dumbris Oct 20, 2026
5d1c2c6
merge: Spec 101 US1 server wiring, admission gate and bundle telemetr…
Dumbris Oct 20, 2026
f0fdbcd
fix(security): Spec 101 US1 review findings
Dumbris Oct 20, 2026
7313118
merge: Spec 101 US1 review findings (round 1)
Dumbris Oct 20, 2026
721abd3
fix(security): tpa-db reads candidates bounded and replaces the sidec…
Dumbris Oct 20, 2026
105ccee
docs(spec-101): CLAUDE.md recent change and tasks.md progress for US1
Dumbris Oct 20, 2026
41e11ae
fix(security): Spec 101 US1 cross-review round 1 (LKG reads, parent f…
Dumbris Oct 20, 2026
bc8ca47
docs(roadmap): tpa-db-format in review as #1701
Dumbris Oct 20, 2026
d793e90
fix(security): tpa-db opens no-follow non-blocking and sets the sidec…
Dumbris Oct 20, 2026
55489c7
fix(webui): Spec 101 US1 surface the signature bundle status on Revie…
Dumbris Oct 20, 2026
39113f8
fix(security): Spec 101 US1 anchor LKG files to a non-symlinked direc…
Dumbris Oct 20, 2026
480fa89
merge: Spec 101 US1 surface the signature bundle status on Review and…
Dumbris Oct 20, 2026
44ea72c
merge: Spec 101 US1 anchor LKG files to a non-symlinked directory
Dumbris Oct 20, 2026
860d5ce
fix(security): tpa-db verify reports sidecar_too_large for an oversiz…
Dumbris Oct 20, 2026
abc35d8
test(tpa-db): skip the POSIX key-mode assertion on Windows
Dumbris Oct 20, 2026
14e175d
fix(webui): Review keeps the signature bundle status fresh; authority…
Dumbris Oct 20, 2026
b9ee5c2
fix(ci): keep Spec 101 sidecar fixtures byte-exact on Windows checkout
Dumbris Oct 20, 2026
86eccfc
fix(webui): tamper label covers key-id mismatch as well as a bad sign…
Dumbris Oct 20, 2026
046ff03
docs(spec-101): tick US1 review and PR tasks
Dumbris Oct 20, 2026
5d99de4
fix(security): confine rollback paths to the bundle directory; mtime …
Dumbris Oct 20, 2026
3c25ac1
Merge remote-tracking branch 'origin/main' into claude/101-tpa-db-for…
Dumbris Oct 20, 2026
dea4618
fix(security): rollback confinement accepts a bundle directory at the…
Dumbris Oct 20, 2026
2000c3c
docs(roadmap): tpa-db-format done (#1701)
Dumbris Oct 20, 2026
172dcf4
test(scanner): ENOTDIR-vs-absent candidate test is POSIX-only
Dumbris Oct 20, 2026
fa7d5e1
Merge remote-tracking branch 'origin/main' into claude/101-tpa-db-for…
Dumbris Oct 20, 2026
560a97a
docs(roadmap): regenerate ROADMAP.md after merging main
Dumbris Oct 20, 2026
eafe3f8
Merge remote-tracking branch 'origin/main' into claude/101-tpa-db-for…
Dumbris Oct 20, 2026
74074b2
docs(roadmap): regenerate ROADMAP.md after merging main
Dumbris Oct 20, 2026
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
5 changes: 5 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -43,3 +43,8 @@ internal/profile/testdata/contract/*.json text eol=lf
internal/httpapi/testdata/sc006_activity_recordsets.json text eol=lf
cmd/mcpproxy/testdata/cli108/* text eol=lf
internal/server/testdata/profiles_v3/*.json text eol=lf

# Spec 101 sidecar conformance fixtures are byte-exact (signatures cover exact
# bytes, the 4096/4097-byte ceilings are measured on the file, and one fixture
# deliberately ends in CRLF). Never convert line endings on checkout.
internal/security/bundlesig/testdata/* -text
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@ tail -f ~/Library/Logs/mcpproxy/main.log # main log (macOS; Linux: ~/.mcpproxy/
- **Windows installer**: [docs/github-actions-windows-wix-research.md](docs/github-actions-windows-wix-research.md). **Prerelease** (`next` branch + `v*-rc.*` tags, opt-in, off stable channels): [docs/prerelease-builds.md](docs/prerelease-builds.md).

## Recent Changes
- 101-tpa-db US1 (tpa-db-format): Go 1.26, Vue 3 Web UI — external TPA bundles are signed artifacts: `<bundle>.sig` four-key Ed25519 sidecar (`internal/security/bundlesig`, pure, contract `specs/101-tpa-db/contracts/sidecar-format.md`), verify-before-parse source-neutral `Candidate` pipeline (`scanner/tpa_candidate.go`, FR-008 order, ceilings 8 MiB / 2000 rules / 4 KiB / 5 s via `candidate_open_{unix,windows}.go` no-follow descriptor opens), per-authority (publisher/operator) epoch-scoped watermark + ratchet + pin/deny-list in BBolt `tpa_bundle_state` (one tx with the history row) and content-addressed LKG files `<datadir>/tpa-lkg/`, full-digest rollback, `coverageOK` + async scan-mode admission degrade on the four FR-007/009a/009b conditions. Config: `require_signed_bundle` (default off), `tpa_active_root`, `tpa_operator_signers`, `tpa_operator_baseline`, `tpa_operator_epoch`. Surfaces: `GET/POST /api/v1/security/bundle{,/history,/rollback,/unpin,/reload}`, `mcpproxy security bundle …`, `cmd/tpa-db keygen|sign|verify`, telemetry schema 15 bundle keys. Publisher key set ships EMPTY. Docs: `docs/features/tpa-bundle-signing.md`. **No new dependencies.**
- 118-auto-rescan-on-change: Go 1.26, small Web UI change — after a tool definition changes (or a tool is added after the baseline) in `manual`/`scan` trust mode the in-process TPA scan of its current definition is recorded as hold evidence (`held_reason: awaiting_review` + `held_verdict: clean` for a clean verdict; findings/coverage as before) and a debounced informational server rescan (`scan_informational.go`, fed by `Runtime.AddToolDefinitionsChangedObserver`) brings the review scan line back to "current". Switch: `security.auto_rescan_on_change` (default on, env `MCPPROXY_AUTO_RESCAN_ON_CHANGE`) AND `auto_baseline_scan`. RT-02 untouched: a clean verdict never approves a change. Docs: `docs/features/security-quarantine.md` "Automatic informational baseline scan". **No new dependencies.**
- quarantine-approval-pilot: Go 1.26, tests + CI only — independent policy model `internal/qapilot` (no production imports), deterministic scenario inventory S01–S26 + 896-cell dispatch table + REST authz table + counting-upstream dispatch check, check ledger (`QAPILOT_REPORT_DIR`) gated by `go run ./cmd/qapilot report`, versioned mutation set `tests/qapilot/mutations.json` run by `qapilot mutate` in disposable worktrees; workflow `.github/workflows/quarantine-pilot.yml` (3 PR checks + scheduled rapid exploration). Docs: `docs/development/quarantine-approval-pilot.md`. **No new dependencies.**
- 117-review-bound-approvals PR-3 (#1565): Go 1.26, backend-only — every upstream `tools/list` carries a `managed.InventoryCapture{Seq, Epoch, Client}` (process-global sequence stamped by the flight leader; `ListToolsCaptured`/`ListToolsFreshCaptured`; `Client.Retire`/`CaptureIsCurrent`; the manager retires replaced/removed clients; `Manager.DiscoverToolsReportCaptured` gives the sweep one capture per server). The runtime admits each inventory under the server's approval lock (`admitInventoryHeld`, per-server `applied`/`definitions` in `toolApprovalServerLock`): an older, retired or reconnected capture writes nothing (records, index, last-good snapshot + its capture, StateView); a lenient empty result is an observation fence; the approval reindex/sweep fallback re-apply the snapshot only while its capture is current, else re-list/skip. Docs: `docs/features/security-quarantine.md` "Tool lists are applied in the order they were captured". **No new dependencies.**
Expand Down
68 changes: 36 additions & 32 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,9 @@ graph LR
classDef in_review fill:#9a6700,stroke:#5c3d00,color:#ffffff;
classDef todo fill:#6e7781,stroke:#3d4248,color:#ffffff;
class sandbox_isolation,scanner_v2,analytics_dashboard,scanner_simplification,schema_deferred,agent_scope_hardening,upstream_resilience,mcp_credential_lifecycle,config_commit_consistency,review_bound_approvals,quarantine_approval_pilot done;
class ux_audit,action_log_transparency,token_bench,telemetry_identity,telemetry_v7_churn,profiles_v3 in_progress;
class ux_audit,action_log_transparency,tpa_db,token_bench,telemetry_identity,telemetry_v7_churn,profiles_v3 in_progress;
class pending_call_outcome in_review;
class tpa_db,remote_access_tunnel,auto_routing_mode,tool_graph todo;
class remote_access_tunnel,auto_routing_mode,tool_graph todo;
```

**Independent epics** (16) — no cross-epic prerequisites; each stands alone:
Expand Down Expand Up @@ -220,6 +220,36 @@ graph LR

</details>

<details>
<summary>🔵 tpa-db: versioned TPA signature database for the offline scanner — In progress · P1</summary>

> Vision pillar 'feel protected': the deterministic detect engine (Spec 076/077) ships with built-in checks but no updatable knowledge of in-the-wild Tool Poisoning Attacks. Build a versioned, offline-first signature/pattern database (known TPA campaigns, malicious phrase corpora, IoC hashes) that the engine consumes — bundled with the binary, refreshable out-of-band, community-contributable, and guarded by the existing scan-eval recall/FP CI gate. SPEC STAGE: specs/101-tpa-db MERGED as PR #1028 on 2026-08-27 (kept in this note, not in pr:, because pr: is implementation evidence and a docs(specs) merge is not that); 2026-10-20: US1 (tpa-db-format: signed four-key Ed25519 sidecar, verify-before-parse loader, per-authority anti-downgrade state, full-digest rollback, coverage degrade) shipped as #1701; US2 corpus in a sibling session; US3 refresh waits on Spec 087.

Spec: [101-tpa-db](./specs/101-tpa-db/)

```mermaid
graph LR
tpa_db_format["Signature DB format + loader (versioned, sign…"]
tpa_db_corpus["Seed corpus: catalog known public TPA campaig…"]
tpa_db_refresh["Out-of-band refresh (offline-friendly: manual…"]

tpa_db_format --> tpa_db_corpus
tpa_db_format --> tpa_db_refresh

classDef done fill:#1f7a1f,stroke:#0d3d0d,color:#ffffff;
classDef todo fill:#6e7781,stroke:#3d4248,color:#ffffff;
class tpa_db_format done;
class tpa_db_corpus,tpa_db_refresh todo;
```

| Task | Status | Refs |
| --- | --- | --- |
| Signature DB format + loader (versioned, signed, bundled default) | 🟢 Done | #1701 |
| Seed corpus: catalog known public TPA campaigns/patterns into the DB | ⚪ Todo | — |
| Out-of-band refresh (offline-friendly: manual file drop + optional fetch), eval-gated | ⚪ Todo | — |

</details>

<details>
<summary>🔵 Token-efficiency benchmark: measured savings, published results — In progress · P1</summary>

Expand Down Expand Up @@ -445,34 +475,6 @@ PR: #1536

</details>

<details>
<summary>⚪ tpa-db: versioned TPA signature database for the offline scanner — Todo · P1</summary>

> Vision pillar 'feel protected': the deterministic detect engine (Spec 076/077) ships with built-in checks but no updatable knowledge of in-the-wild Tool Poisoning Attacks. Build a versioned, offline-first signature/pattern database (known TPA campaigns, malicious phrase corpora, IoC hashes) that the engine consumes — bundled with the binary, refreshable out-of-band, community-contributable, and guarded by the existing scan-eval recall/FP CI gate. SPEC STAGE: specs/101-tpa-db MERGED as PR #1028 on 2026-08-27 (kept in this note, not in pr:, because pr: is implementation evidence and a docs(specs) merge is not that); no implementation has started, so the epic and every child task stay todo (the pr: link is the spec, not the build).

Spec: [101-tpa-db](./specs/101-tpa-db/)

```mermaid
graph LR
tpa_db_format["Signature DB format + loader (versioned, sign…"]
tpa_db_corpus["Seed corpus: catalog known public TPA campaig…"]
tpa_db_refresh["Out-of-band refresh (offline-friendly: manual…"]

tpa_db_format --> tpa_db_corpus
tpa_db_format --> tpa_db_refresh

classDef todo fill:#6e7781,stroke:#3d4248,color:#ffffff;
class tpa_db_format,tpa_db_corpus,tpa_db_refresh todo;
```

| Task | Status | Refs |
| --- | --- | --- |
| Signature DB format + loader (versioned, signed, bundled default) | ⚪ Todo | — |
| Seed corpus: catalog known public TPA campaigns/patterns into the DB | ⚪ Todo | — |
| Out-of-band refresh (offline-friendly: manual file drop + optional fetch), eval-gated | ⚪ Todo | — |

</details>

<details>
<summary>⚪ Auto routing mode: budget-fitted tool surface per session (spec 104) — Todo · P1</summary>

Expand Down Expand Up @@ -1006,6 +1008,7 @@ graph LR
| Web UI + macOS app UX audit | In progress | P0 | — | | |
| Release qualification gate (auto-QA matrix blocks the tag) | In progress | P0 | 4/4 (100%) | [081-release-qa-gate](./specs/081-release-qa-gate/) | |
| Action log / transparency — info at a glance | In progress | P1 | — | | |
| tpa-db: versioned TPA signature database for the offline scanner | In progress | P1 | 30/30 (100%) | [101-tpa-db](./specs/101-tpa-db/) | |
| Token-efficiency benchmark: measured savings, published results | In progress | P1 | 62/64 (97%) | [103-token-bench](./specs/103-token-bench/) | |
| Telemetry identity & data quality (machine_id + CI-filter hardening) | In progress | P1 | — | | |
| Telemetry v7: honest funnel + churn instrumentation | In progress | P1 | — | [080-telemetry-v7-churn](./specs/080-telemetry-v7-churn/) | |
Expand All @@ -1015,7 +1018,6 @@ graph LR
| Planning/docs truth automation | In progress | P2 | — | | |
| Discovery-quality eval harness (Spec 065 second half) | In progress | P3 | — | [065-evaluation-foundation](./specs/065-evaluation-foundation/) | |
| Spec 114 typed pending-call outcome + call correlation for long-running stdio tool calls | In review | P2 | — | | #1536 |
| tpa-db: versioned TPA signature database for the offline scanner | Todo | P1 | — | [101-tpa-db](./specs/101-tpa-db/) | |
| Auto routing mode: budget-fitted tool surface per session (spec 104) | Todo | P1 | — | [104-auto-routing-mode](./specs/104-auto-routing-mode/) | |
| Windows native tray app `MCP-43` | Todo | P2 | — | | |
| Remote access tunnel (feature-flagged MVP, spec 089) | Todo | P2 | — | [089-remote-access-tunnel](./specs/089-remote-access-tunnel/) | |
Expand Down Expand Up @@ -1156,7 +1158,7 @@ Legend: `shipped` ≥95% checked · `in-flight` 1–94% · `drafted` 0% · `—`
| [098-tools-preflight](./specs/098-tools-preflight/) | `in-flight` | 28/33 (85%) |
| [099-describe-check-mode](./specs/099-describe-check-mode/) | `in-flight` | 9/10 (90%) |
| [100-prompt-rugpull-baseline](./specs/100-prompt-rugpull-baseline/) | — | — |
| [101-tpa-db](./specs/101-tpa-db/) | — | — |
| [101-tpa-db](./specs/101-tpa-db/) | `shipped` | 30/30 (100%) |
| [102-schema-deferred](./specs/102-schema-deferred/) | `shipped` | 89/89 (100%) |
| [103-token-bench](./specs/103-token-bench/) | `shipped` | 62/64 (97%) |
| [104-auto-routing-mode](./specs/104-auto-routing-mode/) | — | — |
Expand All @@ -1172,3 +1174,5 @@ Legend: `shipped` ≥95% checked · `in-flight` 1–94% · `drafted` 0% · `—`
| [115-mcp-credential-lifecycle](./specs/115-mcp-credential-lifecycle/) | `shipped` | 86/87 (99%) |
| [116-config-commit-consistency](./specs/116-config-commit-consistency/) | `in-flight` | 81/124 (65%) |
| [117-review-bound-approvals](./specs/117-review-bound-approvals/) | `in-flight` | 46/50 (92%) |
| [118-auto-rescan-on-change](./specs/118-auto-rescan-on-change/) | — | — |
| [118-pin-visibility-boundary](./specs/118-pin-visibility-boundary/) | — | — |
Loading
Loading