frontier-scout 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- frontier_scout-0.2.0/LICENSE +21 -0
- frontier_scout-0.2.0/PKG-INFO +353 -0
- frontier_scout-0.2.0/README.md +314 -0
- frontier_scout-0.2.0/frontier_scout/__init__.py +3 -0
- frontier_scout-0.2.0/frontier_scout/__main__.py +6 -0
- frontier_scout-0.2.0/frontier_scout/cli.py +447 -0
- frontier_scout-0.2.0/frontier_scout/dep_trial.py +135 -0
- frontier_scout-0.2.0/frontier_scout/dependencies.py +315 -0
- frontier_scout-0.2.0/frontier_scout/dossier.py +232 -0
- frontier_scout-0.2.0/frontier_scout/evaluate.py +153 -0
- frontier_scout-0.2.0/frontier_scout/guard.py +69 -0
- frontier_scout-0.2.0/frontier_scout/lab.py +16 -0
- frontier_scout-0.2.0/frontier_scout/mcp_audit.py +90 -0
- frontier_scout-0.2.0/frontier_scout/packs.py +329 -0
- frontier_scout-0.2.0/frontier_scout/platform/__init__.py +2 -0
- frontier_scout-0.2.0/frontier_scout/platform/authz/__init__.py +2 -0
- frontier_scout-0.2.0/frontier_scout/platform/authz/engine.py +54 -0
- frontier_scout-0.2.0/frontier_scout/platform/context/__init__.py +2 -0
- frontier_scout-0.2.0/frontier_scout/platform/context/compiler.py +66 -0
- frontier_scout-0.2.0/frontier_scout/platform/context/prompt_registry.py +33 -0
- frontier_scout-0.2.0/frontier_scout/platform/core/__init__.py +2 -0
- frontier_scout-0.2.0/frontier_scout/platform/core/budgets.py +38 -0
- frontier_scout-0.2.0/frontier_scout/platform/core/config.py +23 -0
- frontier_scout-0.2.0/frontier_scout/platform/core/errors.py +14 -0
- frontier_scout-0.2.0/frontier_scout/platform/core/ids.py +20 -0
- frontier_scout-0.2.0/frontier_scout/platform/core/types.py +45 -0
- frontier_scout-0.2.0/frontier_scout/platform/evals/__init__.py +2 -0
- frontier_scout-0.2.0/frontier_scout/platform/evals/harness.py +38 -0
- frontier_scout-0.2.0/frontier_scout/platform/gateway/__init__.py +2 -0
- frontier_scout-0.2.0/frontier_scout/platform/gateway/model_gateway.py +58 -0
- frontier_scout-0.2.0/frontier_scout/platform/incident_change_scout/__init__.py +2 -0
- frontier_scout-0.2.0/frontier_scout/platform/incident_change_scout/cli_eval.py +22 -0
- frontier_scout-0.2.0/frontier_scout/platform/incident_change_scout/workflow.py +200 -0
- frontier_scout-0.2.0/frontier_scout/platform/memory/__init__.py +2 -0
- frontier_scout-0.2.0/frontier_scout/platform/memory/store.py +134 -0
- frontier_scout-0.2.0/frontier_scout/platform/observability/__init__.py +2 -0
- frontier_scout-0.2.0/frontier_scout/platform/observability/audit.py +36 -0
- frontier_scout-0.2.0/frontier_scout/platform/observability/tracing.py +43 -0
- frontier_scout-0.2.0/frontier_scout/platform/orchestration/__init__.py +2 -0
- frontier_scout-0.2.0/frontier_scout/platform/orchestration/runtime.py +76 -0
- frontier_scout-0.2.0/frontier_scout/platform/retrieval/__init__.py +2 -0
- frontier_scout-0.2.0/frontier_scout/platform/retrieval/hybrid.py +56 -0
- frontier_scout-0.2.0/frontier_scout/platform/tools/__init__.py +2 -0
- frontier_scout-0.2.0/frontier_scout/platform/tools/registry.py +45 -0
- frontier_scout-0.2.0/frontier_scout/policy.py +186 -0
- frontier_scout-0.2.0/frontier_scout/profile.py +323 -0
- frontier_scout-0.2.0/frontier_scout/report.py +489 -0
- frontier_scout-0.2.0/frontier_scout/scout.py +178 -0
- frontier_scout-0.2.0/frontier_scout/store.py +969 -0
- frontier_scout-0.2.0/frontier_scout/trials.py +154 -0
- frontier_scout-0.2.0/frontier_scout.egg-info/PKG-INFO +353 -0
- frontier_scout-0.2.0/frontier_scout.egg-info/SOURCES.txt +84 -0
- frontier_scout-0.2.0/frontier_scout.egg-info/dependency_links.txt +1 -0
- frontier_scout-0.2.0/frontier_scout.egg-info/entry_points.txt +2 -0
- frontier_scout-0.2.0/frontier_scout.egg-info/requires.txt +20 -0
- frontier_scout-0.2.0/frontier_scout.egg-info/top_level.txt +3 -0
- frontier_scout-0.2.0/outputs/__init__.py +12 -0
- frontier_scout-0.2.0/outputs/_text.py +64 -0
- frontier_scout-0.2.0/pyproject.toml +83 -0
- frontier_scout-0.2.0/scripts/__init__.py +2 -0
- frontier_scout-0.2.0/scripts/cost_tracker.py +110 -0
- frontier_scout-0.2.0/scripts/demo.py +31 -0
- frontier_scout-0.2.0/scripts/judge.py +283 -0
- frontier_scout-0.2.0/scripts/lab_runner.py +1312 -0
- frontier_scout-0.2.0/scripts/llm_client.py +118 -0
- frontier_scout-0.2.0/scripts/prompts.py +360 -0
- frontier_scout-0.2.0/scripts/quality_logger.py +49 -0
- frontier_scout-0.2.0/scripts/render_html_readme_banner.py +90 -0
- frontier_scout-0.2.0/scripts/render_readme_banner.py +696 -0
- frontier_scout-0.2.0/scripts/scout.py +955 -0
- frontier_scout-0.2.0/scripts/tools.py +403 -0
- frontier_scout-0.2.0/scripts/validators.py +269 -0
- frontier_scout-0.2.0/setup.cfg +4 -0
- frontier_scout-0.2.0/tests/test_guard.py +54 -0
- frontier_scout-0.2.0/tests/test_incident_change_scout.py +18 -0
- frontier_scout-0.2.0/tests/test_lab.py +567 -0
- frontier_scout-0.2.0/tests/test_mcp_audit.py +31 -0
- frontier_scout-0.2.0/tests/test_packs_dependencies.py +192 -0
- frontier_scout-0.2.0/tests/test_platform_authz.py +36 -0
- frontier_scout-0.2.0/tests/test_platform_context_gateway.py +52 -0
- frontier_scout-0.2.0/tests/test_platform_orchestration_tools.py +44 -0
- frontier_scout-0.2.0/tests/test_platform_retrieval.py +27 -0
- frontier_scout-0.2.0/tests/test_policy.py +79 -0
- frontier_scout-0.2.0/tests/test_profile_dossier.py +94 -0
- frontier_scout-0.2.0/tests/test_trials.py +73 -0
- frontier_scout-0.2.0/tests/test_validators.py +289 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Frontier Scout contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: frontier-scout
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: A local AI adoption radar for tools, MCP servers, agent frameworks, and model drops.
|
|
5
|
+
Author: Ajay Surya
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/ajaysurya1221/frontier-scout
|
|
8
|
+
Project-URL: Repository, https://github.com/ajaysurya1221/frontier-scout
|
|
9
|
+
Project-URL: Issues, https://github.com/ajaysurya1221/frontier-scout/issues
|
|
10
|
+
Keywords: ai,agents,mcp,developer-tools,tech-radar,cli
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Environment :: Console
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
16
|
+
Requires-Python: >=3.11
|
|
17
|
+
Description-Content-Type: text/markdown
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
Requires-Dist: anthropic>=0.45.0
|
|
20
|
+
Requires-Dist: feedparser>=6.0.11
|
|
21
|
+
Requires-Dist: requests>=2.32.0
|
|
22
|
+
Requires-Dist: beautifulsoup4>=4.12.0
|
|
23
|
+
Requires-Dist: pydantic>=2.0
|
|
24
|
+
Requires-Dist: huggingface_hub>=0.24.0
|
|
25
|
+
Requires-Dist: transformers>=4.40.0
|
|
26
|
+
Requires-Dist: packaging>=24.0
|
|
27
|
+
Requires-Dist: tomli-w>=1.0.0
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: bandit>=1.7.10; extra == "dev"
|
|
30
|
+
Requires-Dist: build>=1.2.0; extra == "dev"
|
|
31
|
+
Requires-Dist: coverage>=7.6.0; extra == "dev"
|
|
32
|
+
Requires-Dist: detect-secrets>=1.5.0; extra == "dev"
|
|
33
|
+
Requires-Dist: mypy>=1.10.0; extra == "dev"
|
|
34
|
+
Requires-Dist: pip-audit>=2.7.0; extra == "dev"
|
|
35
|
+
Requires-Dist: pillow>=10.0.0; extra == "dev"
|
|
36
|
+
Requires-Dist: pytest>=8.0.0; extra == "dev"
|
|
37
|
+
Requires-Dist: ruff>=0.6.0; extra == "dev"
|
|
38
|
+
Dynamic: license-file
|
|
39
|
+
|
|
40
|
+
# Frontier Scout
|
|
41
|
+
|
|
42
|
+
> Local-first try-before-trust for AI tools, agents, MCP servers, models, and risky engineering changes.
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+

|
|
46
|
+

|
|
47
|
+

|
|
48
|
+
|
|
49
|
+

|
|
50
|
+
|
|
51
|
+
[Killer Workflow](#killer-workflow) · [Demo](#60-second-demo) · [What You Get](#what-you-get) · [Questions](#questions-people-ask) · [Architecture](#architecture) · [Safety](#safety-model) · [Quickstart](#quickstart) · [Roadmap](ROADMAP.md) · [Security](SECURITY.md)
|
|
52
|
+
|
|
53
|
+
Frontier Scout answers the question technical teams now hit every week:
|
|
54
|
+
|
|
55
|
+
> Should this AI tool, agent, MCP server, model, or engineering change get any
|
|
56
|
+
> access to our code, shell, browser, network, or credentials?
|
|
57
|
+
|
|
58
|
+
It has three compatible surfaces:
|
|
59
|
+
|
|
60
|
+
- **Tool Test Lab / Adoption Firewall**: one-link `evaluate`, `trial`, and
|
|
61
|
+
`guard` workflows that record permission manifests and try-before-trust
|
|
62
|
+
receipts before a tool touches a real project.
|
|
63
|
+
- **AI Tool Radar**: a local adoption radar that turns public AI-tool signals
|
|
64
|
+
into ADOPT / TRIAL / ASSESS / HOLD verdicts with source evidence.
|
|
65
|
+
- **Incident Change Scout**: a graph-aware engineering workflow that turns an
|
|
66
|
+
incident ticket into cited context, a bounded remediation plan, approval
|
|
67
|
+
interrupts, trace/audit logs, and an eval result.
|
|
68
|
+
|
|
69
|
+
The posture is deliberately boring in the good way: CLI first, SQLite/local
|
|
70
|
+
files by default, static reports, no hosted telemetry, no hidden auto-installs,
|
|
71
|
+
and explicit approval before risky actions.
|
|
72
|
+
|
|
73
|
+
## Killer workflow
|
|
74
|
+
|
|
75
|
+
Someone drops a GitHub repo, MCP server, plugin, model, or agent framework in a
|
|
76
|
+
newsletter or team chat. Frontier Scout turns that link into a local adoption
|
|
77
|
+
decision instead of a vibes-based "looks safe" answer:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
frontier-scout init --repo .
|
|
81
|
+
frontier-scout evaluate <tool-url>
|
|
82
|
+
frontier-scout trial <tool-or-url> --dry-run
|
|
83
|
+
frontier-scout guard --repo .
|
|
84
|
+
frontier-scout report
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
That flow compares the tool to lightweight local repo signals, classifies the
|
|
88
|
+
permission surface, runs safe probes when the runtime is supported, stores a
|
|
89
|
+
local receipt, and tells CI whether risky adoption evidence is missing.
|
|
90
|
+
|
|
91
|
+
## 60-second demo
|
|
92
|
+
|
|
93
|
+
No API key. No Slack workspace. No cloud setup. Start with the engineering
|
|
94
|
+
workflow:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
git clone https://github.com/ajaysurya1221/frontier-scout
|
|
98
|
+
cd frontier-scout
|
|
99
|
+
python3 -m venv .venv && source .venv/bin/activate
|
|
100
|
+
pip install -e ".[dev]"
|
|
101
|
+
make demo
|
|
102
|
+
open .scratch/incident-demo/answer.md
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Incident demo writes:
|
|
106
|
+
|
|
107
|
+
- `.scratch/incident-demo/answer.md` — cited remediation answer.
|
|
108
|
+
- `.scratch/incident-demo/trace.jsonl` — local OpenTelemetry-shaped spans.
|
|
109
|
+
- `.scratch/incident-demo/audit.jsonl` — Cloudflare-style audit records.
|
|
110
|
+
- `.scratch/incident-demo/eval.json` — golden eval score.
|
|
111
|
+
|
|
112
|
+
Then run the AI tool radar demo:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
frontier-scout demo
|
|
116
|
+
open demo/briefing.html
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Radar demo writes:
|
|
120
|
+
|
|
121
|
+
- [`demo/briefing.html`](demo/briefing.html) — static executive radar.
|
|
122
|
+
- [`demo/briefing.md`](demo/briefing.md) — Markdown version for issues/docs.
|
|
123
|
+
- [`demo/verdicts.json`](demo/verdicts.json) — structured verdict payload.
|
|
124
|
+
- [`demo/cost-breakdown.md`](demo/cost-breakdown.md) — expected live-run spend shape.
|
|
125
|
+
- [`demo/judge-trace.md`](demo/judge-trace.md) — what the judge layer protects against.
|
|
126
|
+
|
|
127
|
+
## What you get
|
|
128
|
+
|
|
129
|
+
- **Incident Change Scout** for provenance-first incident analysis, graph-aware retrieval, bounded remediation planning, approval interrupts, and local evals.
|
|
130
|
+
- **AI ecosystem scouting** across GitHub releases, trending repos, MCP/skills sources, RSS, HN, Hugging Face, and a small arXiv slice.
|
|
131
|
+
- **Living Scout Packs** for AI devtools, MCP, agent frameworks, local AI, RAG/memory, workflow builders, and inference gateways. Seeds are only bootstraps; candidates can be promoted, demoted, or retired as evidence changes.
|
|
132
|
+
- **Dependency intelligence** for repo-relevant security, hardening, and breaking releases. It explains why an upgrade matters here and emits a trial recipe instead of editing your lockfiles.
|
|
133
|
+
- **ADOPT / TRIAL / ASSESS / HOLD verdicts** with risk, stack fit, readiness, adoption cost, provenance, and next action.
|
|
134
|
+
- **Adoption Firewall** commands for try-before-trust evaluation: local evidence ledger, permission manifests, sandbox trial receipts, and CI-friendly guard checks.
|
|
135
|
+
- **Optional Opus judge pass** that vetoes patch-release noise, incident-as-tool mistakes, unsupported claims, and weak ADOPT calls.
|
|
136
|
+
- **Repo-aware stack detection** from common manifests and agent config files.
|
|
137
|
+
- **Polyglot lab runner** for Python, Node, and Hugging Face packages with hermetic subprocess execution.
|
|
138
|
+
- **Local history** in SQLite so future CLI/MCP/plugin surfaces can compare what changed over time.
|
|
139
|
+
|
|
140
|
+
## Why not just use newsletters or GitHub Trending?
|
|
141
|
+
|
|
142
|
+
| Option | What it gives you | What is missing |
|
|
143
|
+
|---|---|---|
|
|
144
|
+
| Newsletters | Good awareness | Not repo-aware, not source-verifiable, rarely actionable. |
|
|
145
|
+
| GitHub Trending | Popularity signal | No risk/fit/adoption-cost judgment. |
|
|
146
|
+
| Manual research | Highest nuance | Slow, inconsistent, easy to skip when busy. |
|
|
147
|
+
| Frontier Scout | Source-backed verdicts and lab next steps | Requires your API key for live scans. |
|
|
148
|
+
|
|
149
|
+
## Questions people ask
|
|
150
|
+
|
|
151
|
+
**Why not just ask ChatGPT or Claude if a repo is safe?**
|
|
152
|
+
You can for a one-off opinion. Frontier Scout is for repeatable team decisions:
|
|
153
|
+
same policy, local evidence, stored receipts, history, and CI guardrails.
|
|
154
|
+
|
|
155
|
+
**Does it know my repos?**
|
|
156
|
+
It reads lightweight stack signals locally, such as manifests, CI files, Docker
|
|
157
|
+
files, and agent/MCP config. It should not upload your source code just to
|
|
158
|
+
personalize recommendations.
|
|
159
|
+
|
|
160
|
+
**How can one workflow assess Python, Rust, MCP servers, plugins, or concepts?**
|
|
161
|
+
It does not pretend they are the same. One command routes targets differently:
|
|
162
|
+
supported packages can get sandbox probes, MCP servers get capability audits,
|
|
163
|
+
models get metadata/runtime checks, and concepts or unsupported runtimes get
|
|
164
|
+
honest report-only assessment.
|
|
165
|
+
|
|
166
|
+
**Is this like E2B?**
|
|
167
|
+
E2B is a sandbox provider. Frontier Scout is the adoption decision layer: it can
|
|
168
|
+
decide what deserves a sandbox, run the right probes, and turn the evidence into
|
|
169
|
+
a verdict. Local/Docker/E2B-style sandbox backends belong in the v0.2 toolbench
|
|
170
|
+
roadmap.
|
|
171
|
+
|
|
172
|
+
**Can it prove a tool is safe?**
|
|
173
|
+
No. It reduces blast radius and records evidence. Unknown code is still unknown
|
|
174
|
+
code; the product helps you choose the smallest safe next step.
|
|
175
|
+
|
|
176
|
+
**Will it leak secrets?**
|
|
177
|
+
Trials use temporary workspaces, stripped subprocess environments, timeouts,
|
|
178
|
+
output caps, secret-pattern checks, and explicit approval gates for risky
|
|
179
|
+
actions.
|
|
180
|
+
|
|
181
|
+
## Architecture
|
|
182
|
+
|
|
183
|
+
```mermaid
|
|
184
|
+
flowchart LR
|
|
185
|
+
Ticket["Incident ticket"] --> DCG["Typed DCG runtime"]
|
|
186
|
+
Corpus["Seed corpus"] --> Memory["Memory + graph"]
|
|
187
|
+
Memory --> Authz["ReBAC check"]
|
|
188
|
+
Authz --> Retrieval["Hybrid retrieval"]
|
|
189
|
+
Retrieval --> Context["Context compiler"]
|
|
190
|
+
Context --> Gateway["Model gateway"]
|
|
191
|
+
Gateway --> DCG
|
|
192
|
+
DCG --> Approval["Approval interrupt"]
|
|
193
|
+
DCG --> Audit["Trace + audit + eval"]
|
|
194
|
+
Sources["Public sources"] --> Scout["Scout funnel"]
|
|
195
|
+
Scout --> Score["Sonnet score pass"]
|
|
196
|
+
Score --> Verdict["Sonnet verdict pass"]
|
|
197
|
+
Verdict --> Judge["Optional Opus judge"]
|
|
198
|
+
Judge --> Validators["Deterministic validators"]
|
|
199
|
+
Validators --> SQLite["Local SQLite"]
|
|
200
|
+
SQLite --> CLI["CLI"]
|
|
201
|
+
SQLite --> Report["Static report"]
|
|
202
|
+
SQLite --> MCP["Future MCP/plugin surface"]
|
|
203
|
+
CLI --> Lab["Hermetic lab"]
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
The current engine lives in [`scripts/`](scripts/). The installable CLI lives
|
|
207
|
+
in [`frontier_scout/`](frontier_scout/). `scripts/` remains importable so the
|
|
208
|
+
existing Scout and lab logic can be packaged without a risky rewrite.
|
|
209
|
+
|
|
210
|
+
## Quickstart
|
|
211
|
+
|
|
212
|
+
Install from a checkout:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
python3 -m venv .venv
|
|
216
|
+
source .venv/bin/activate
|
|
217
|
+
pip install -e ".[dev]"
|
|
218
|
+
frontier-scout --help
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Initialize local state and detect stack signals:
|
|
222
|
+
|
|
223
|
+
```bash
|
|
224
|
+
frontier-scout init --repo .
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
Run a free seeded scan:
|
|
228
|
+
|
|
229
|
+
```bash
|
|
230
|
+
frontier-scout scan --dry-run --repo .
|
|
231
|
+
frontier-scout report --input demo/verdicts.json --output demo/briefing.html
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Run a live scan:
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
export ANTHROPIC_API_KEY=...
|
|
238
|
+
frontier-scout scan --repo .
|
|
239
|
+
frontier-scout report
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Try-before-trust a single tool before granting it project permissions:
|
|
243
|
+
|
|
244
|
+
```bash
|
|
245
|
+
frontier-scout evaluate https://github.com/modelcontextprotocol/servers
|
|
246
|
+
frontier-scout trial browser-use/browser-use --url https://github.com/browser-use/browser-use --dry-run
|
|
247
|
+
frontier-scout guard --repo .
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
`evaluate` records source-backed local evidence and a permission manifest.
|
|
251
|
+
`trial --dry-run` writes an adoption receipt without installing anything.
|
|
252
|
+
`guard` checks the local evidence ledger for risky tools that still need a
|
|
253
|
+
stored trial receipt.
|
|
254
|
+
|
|
255
|
+
Inspect living packs and repo-relevant dependency upgrades:
|
|
256
|
+
|
|
257
|
+
```bash
|
|
258
|
+
frontier-scout packs list
|
|
259
|
+
frontier-scout packs show mcp
|
|
260
|
+
frontier-scout profile --repo . --dependencies
|
|
261
|
+
frontier-scout deps scan --repo .
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
`packs` shows the living radar seeds and candidates. `deps scan` looks for
|
|
265
|
+
meaningful security, hardening, and breaking upgrades that deserve a safe trial,
|
|
266
|
+
without modifying manifests or lockfiles.
|
|
267
|
+
|
|
268
|
+
After the first PyPI publish, the expected package install paths are:
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
pipx install frontier-scout
|
|
272
|
+
uvx frontier-scout demo
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Until then, the checkout install above is the supported path. An
|
|
276
|
+
`npx frontier-scout` wrapper is intentionally a later distribution layer, not
|
|
277
|
+
the core implementation.
|
|
278
|
+
|
|
279
|
+
## Safety model
|
|
280
|
+
|
|
281
|
+
Frontier Scout handles untrusted public content and can optionally execute
|
|
282
|
+
untrusted packages in the lab, so the safety rails are load-bearing:
|
|
283
|
+
|
|
284
|
+
- Source text is treated as untrusted data, not instructions.
|
|
285
|
+
- Tool names are checked against the source pool to reduce hallucinated verdicts.
|
|
286
|
+
- Source URLs must pass a domain allowlist.
|
|
287
|
+
- Incident and breach headlines are blocked from becoming tool recommendations.
|
|
288
|
+
- ADOPT requires enough readiness evidence or gets demoted.
|
|
289
|
+
- Adoption Firewall fails closed on unknown MCP/tool capability surfaces.
|
|
290
|
+
- `guard` never modifies the repo; it only reads local evidence and policy.
|
|
291
|
+
- Lab subprocesses receive a stripped environment, wall-clock timeout, size caps, and generated-script secret scanning.
|
|
292
|
+
|
|
293
|
+
See [SECURITY.md](SECURITY.md) for the threat model.
|
|
294
|
+
|
|
295
|
+
## Cost
|
|
296
|
+
|
|
297
|
+
The offline demo is free. A normal live weekly scan is designed to stay cheap:
|
|
298
|
+
|
|
299
|
+
| Component | Typical cost |
|
|
300
|
+
|---|---:|
|
|
301
|
+
| Sonnet score pass | ~$0.15 |
|
|
302
|
+
| Sonnet verdict pass | ~$0.04 |
|
|
303
|
+
| Optional Opus judge | ~$0.12 |
|
|
304
|
+
| **Weekly scan** | **~$0.30** |
|
|
305
|
+
|
|
306
|
+
Set `JUDGE_ENABLED=false` to skip the Opus judge when you want the cheapest
|
|
307
|
+
possible run.
|
|
308
|
+
|
|
309
|
+
## Development
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
make setup
|
|
313
|
+
make demo
|
|
314
|
+
make test
|
|
315
|
+
make eval
|
|
316
|
+
make audit
|
|
317
|
+
python -m compileall scripts outputs tests frontier_scout
|
|
318
|
+
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m pytest -q
|
|
319
|
+
frontier-scout demo
|
|
320
|
+
frontier-scout scan --dry-run
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
CI runs compile checks, non-live tests, and a tracked-file secret scan.
|
|
324
|
+
|
|
325
|
+
## Release
|
|
326
|
+
|
|
327
|
+
For tagged releases:
|
|
328
|
+
|
|
329
|
+
1. Bump `project.version` in `pyproject.toml`.
|
|
330
|
+
2. Update the matching section in `CHANGELOG.md`.
|
|
331
|
+
3. Merge to `main`.
|
|
332
|
+
4. Push annotated tag `vX.Y.Z`.
|
|
333
|
+
|
|
334
|
+
Tag pushes trigger `.github/workflows/release.yml`, which builds distributions,
|
|
335
|
+
publishes to PyPI via trusted publishing, and creates a GitHub Release from
|
|
336
|
+
the matching changelog section.
|
|
337
|
+
|
|
338
|
+
## Roadmap
|
|
339
|
+
|
|
340
|
+
See [ROADMAP.md](ROADMAP.md). The short version:
|
|
341
|
+
|
|
342
|
+
- **v0.2** — current release: local radar, Adoption Firewall, Incident Change Scout, Living Scout Packs, dependency intelligence, SQLite, CI, Docker demo, and public docs.
|
|
343
|
+
- **v0.3** — MCP/plugin surfaces, stronger sandbox/toolbench backends, and optional output integrations on top of the same local evidence store.
|
|
344
|
+
|
|
345
|
+
## Contributing
|
|
346
|
+
|
|
347
|
+
Read [CONTRIBUTING.md](CONTRIBUTING.md). The fastest useful PRs improve the
|
|
348
|
+
CLI/report path, validator coverage, source quality, or lab isolation.
|
|
349
|
+
Please also read the [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
350
|
+
|
|
351
|
+
## License
|
|
352
|
+
|
|
353
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
# Frontier Scout
|
|
2
|
+
|
|
3
|
+
> Local-first try-before-trust for AI tools, agents, MCP servers, models, and risky engineering changes.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+

|
|
8
|
+

|
|
9
|
+
|
|
10
|
+

|
|
11
|
+
|
|
12
|
+
[Killer Workflow](#killer-workflow) · [Demo](#60-second-demo) · [What You Get](#what-you-get) · [Questions](#questions-people-ask) · [Architecture](#architecture) · [Safety](#safety-model) · [Quickstart](#quickstart) · [Roadmap](ROADMAP.md) · [Security](SECURITY.md)
|
|
13
|
+
|
|
14
|
+
Frontier Scout answers the question technical teams now hit every week:
|
|
15
|
+
|
|
16
|
+
> Should this AI tool, agent, MCP server, model, or engineering change get any
|
|
17
|
+
> access to our code, shell, browser, network, or credentials?
|
|
18
|
+
|
|
19
|
+
It has three compatible surfaces:
|
|
20
|
+
|
|
21
|
+
- **Tool Test Lab / Adoption Firewall**: one-link `evaluate`, `trial`, and
|
|
22
|
+
`guard` workflows that record permission manifests and try-before-trust
|
|
23
|
+
receipts before a tool touches a real project.
|
|
24
|
+
- **AI Tool Radar**: a local adoption radar that turns public AI-tool signals
|
|
25
|
+
into ADOPT / TRIAL / ASSESS / HOLD verdicts with source evidence.
|
|
26
|
+
- **Incident Change Scout**: a graph-aware engineering workflow that turns an
|
|
27
|
+
incident ticket into cited context, a bounded remediation plan, approval
|
|
28
|
+
interrupts, trace/audit logs, and an eval result.
|
|
29
|
+
|
|
30
|
+
The posture is deliberately boring in the good way: CLI first, SQLite/local
|
|
31
|
+
files by default, static reports, no hosted telemetry, no hidden auto-installs,
|
|
32
|
+
and explicit approval before risky actions.
|
|
33
|
+
|
|
34
|
+
## Killer workflow
|
|
35
|
+
|
|
36
|
+
Someone drops a GitHub repo, MCP server, plugin, model, or agent framework in a
|
|
37
|
+
newsletter or team chat. Frontier Scout turns that link into a local adoption
|
|
38
|
+
decision instead of a vibes-based "looks safe" answer:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
frontier-scout init --repo .
|
|
42
|
+
frontier-scout evaluate <tool-url>
|
|
43
|
+
frontier-scout trial <tool-or-url> --dry-run
|
|
44
|
+
frontier-scout guard --repo .
|
|
45
|
+
frontier-scout report
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
That flow compares the tool to lightweight local repo signals, classifies the
|
|
49
|
+
permission surface, runs safe probes when the runtime is supported, stores a
|
|
50
|
+
local receipt, and tells CI whether risky adoption evidence is missing.
|
|
51
|
+
|
|
52
|
+
## 60-second demo
|
|
53
|
+
|
|
54
|
+
No API key. No Slack workspace. No cloud setup. Start with the engineering
|
|
55
|
+
workflow:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
git clone https://github.com/ajaysurya1221/frontier-scout
|
|
59
|
+
cd frontier-scout
|
|
60
|
+
python3 -m venv .venv && source .venv/bin/activate
|
|
61
|
+
pip install -e ".[dev]"
|
|
62
|
+
make demo
|
|
63
|
+
open .scratch/incident-demo/answer.md
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Incident demo writes:
|
|
67
|
+
|
|
68
|
+
- `.scratch/incident-demo/answer.md` — cited remediation answer.
|
|
69
|
+
- `.scratch/incident-demo/trace.jsonl` — local OpenTelemetry-shaped spans.
|
|
70
|
+
- `.scratch/incident-demo/audit.jsonl` — Cloudflare-style audit records.
|
|
71
|
+
- `.scratch/incident-demo/eval.json` — golden eval score.
|
|
72
|
+
|
|
73
|
+
Then run the AI tool radar demo:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
frontier-scout demo
|
|
77
|
+
open demo/briefing.html
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Radar demo writes:
|
|
81
|
+
|
|
82
|
+
- [`demo/briefing.html`](demo/briefing.html) — static executive radar.
|
|
83
|
+
- [`demo/briefing.md`](demo/briefing.md) — Markdown version for issues/docs.
|
|
84
|
+
- [`demo/verdicts.json`](demo/verdicts.json) — structured verdict payload.
|
|
85
|
+
- [`demo/cost-breakdown.md`](demo/cost-breakdown.md) — expected live-run spend shape.
|
|
86
|
+
- [`demo/judge-trace.md`](demo/judge-trace.md) — what the judge layer protects against.
|
|
87
|
+
|
|
88
|
+
## What you get
|
|
89
|
+
|
|
90
|
+
- **Incident Change Scout** for provenance-first incident analysis, graph-aware retrieval, bounded remediation planning, approval interrupts, and local evals.
|
|
91
|
+
- **AI ecosystem scouting** across GitHub releases, trending repos, MCP/skills sources, RSS, HN, Hugging Face, and a small arXiv slice.
|
|
92
|
+
- **Living Scout Packs** for AI devtools, MCP, agent frameworks, local AI, RAG/memory, workflow builders, and inference gateways. Seeds are only bootstraps; candidates can be promoted, demoted, or retired as evidence changes.
|
|
93
|
+
- **Dependency intelligence** for repo-relevant security, hardening, and breaking releases. It explains why an upgrade matters here and emits a trial recipe instead of editing your lockfiles.
|
|
94
|
+
- **ADOPT / TRIAL / ASSESS / HOLD verdicts** with risk, stack fit, readiness, adoption cost, provenance, and next action.
|
|
95
|
+
- **Adoption Firewall** commands for try-before-trust evaluation: local evidence ledger, permission manifests, sandbox trial receipts, and CI-friendly guard checks.
|
|
96
|
+
- **Optional Opus judge pass** that vetoes patch-release noise, incident-as-tool mistakes, unsupported claims, and weak ADOPT calls.
|
|
97
|
+
- **Repo-aware stack detection** from common manifests and agent config files.
|
|
98
|
+
- **Polyglot lab runner** for Python, Node, and Hugging Face packages with hermetic subprocess execution.
|
|
99
|
+
- **Local history** in SQLite so future CLI/MCP/plugin surfaces can compare what changed over time.
|
|
100
|
+
|
|
101
|
+
## Why not just use newsletters or GitHub Trending?
|
|
102
|
+
|
|
103
|
+
| Option | What it gives you | What is missing |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| Newsletters | Good awareness | Not repo-aware, not source-verifiable, rarely actionable. |
|
|
106
|
+
| GitHub Trending | Popularity signal | No risk/fit/adoption-cost judgment. |
|
|
107
|
+
| Manual research | Highest nuance | Slow, inconsistent, easy to skip when busy. |
|
|
108
|
+
| Frontier Scout | Source-backed verdicts and lab next steps | Requires your API key for live scans. |
|
|
109
|
+
|
|
110
|
+
## Questions people ask
|
|
111
|
+
|
|
112
|
+
**Why not just ask ChatGPT or Claude if a repo is safe?**
|
|
113
|
+
You can for a one-off opinion. Frontier Scout is for repeatable team decisions:
|
|
114
|
+
same policy, local evidence, stored receipts, history, and CI guardrails.
|
|
115
|
+
|
|
116
|
+
**Does it know my repos?**
|
|
117
|
+
It reads lightweight stack signals locally, such as manifests, CI files, Docker
|
|
118
|
+
files, and agent/MCP config. It should not upload your source code just to
|
|
119
|
+
personalize recommendations.
|
|
120
|
+
|
|
121
|
+
**How can one workflow assess Python, Rust, MCP servers, plugins, or concepts?**
|
|
122
|
+
It does not pretend they are the same. One command routes targets differently:
|
|
123
|
+
supported packages can get sandbox probes, MCP servers get capability audits,
|
|
124
|
+
models get metadata/runtime checks, and concepts or unsupported runtimes get
|
|
125
|
+
honest report-only assessment.
|
|
126
|
+
|
|
127
|
+
**Is this like E2B?**
|
|
128
|
+
E2B is a sandbox provider. Frontier Scout is the adoption decision layer: it can
|
|
129
|
+
decide what deserves a sandbox, run the right probes, and turn the evidence into
|
|
130
|
+
a verdict. Local/Docker/E2B-style sandbox backends belong in the v0.2 toolbench
|
|
131
|
+
roadmap.
|
|
132
|
+
|
|
133
|
+
**Can it prove a tool is safe?**
|
|
134
|
+
No. It reduces blast radius and records evidence. Unknown code is still unknown
|
|
135
|
+
code; the product helps you choose the smallest safe next step.
|
|
136
|
+
|
|
137
|
+
**Will it leak secrets?**
|
|
138
|
+
Trials use temporary workspaces, stripped subprocess environments, timeouts,
|
|
139
|
+
output caps, secret-pattern checks, and explicit approval gates for risky
|
|
140
|
+
actions.
|
|
141
|
+
|
|
142
|
+
## Architecture
|
|
143
|
+
|
|
144
|
+
```mermaid
|
|
145
|
+
flowchart LR
|
|
146
|
+
Ticket["Incident ticket"] --> DCG["Typed DCG runtime"]
|
|
147
|
+
Corpus["Seed corpus"] --> Memory["Memory + graph"]
|
|
148
|
+
Memory --> Authz["ReBAC check"]
|
|
149
|
+
Authz --> Retrieval["Hybrid retrieval"]
|
|
150
|
+
Retrieval --> Context["Context compiler"]
|
|
151
|
+
Context --> Gateway["Model gateway"]
|
|
152
|
+
Gateway --> DCG
|
|
153
|
+
DCG --> Approval["Approval interrupt"]
|
|
154
|
+
DCG --> Audit["Trace + audit + eval"]
|
|
155
|
+
Sources["Public sources"] --> Scout["Scout funnel"]
|
|
156
|
+
Scout --> Score["Sonnet score pass"]
|
|
157
|
+
Score --> Verdict["Sonnet verdict pass"]
|
|
158
|
+
Verdict --> Judge["Optional Opus judge"]
|
|
159
|
+
Judge --> Validators["Deterministic validators"]
|
|
160
|
+
Validators --> SQLite["Local SQLite"]
|
|
161
|
+
SQLite --> CLI["CLI"]
|
|
162
|
+
SQLite --> Report["Static report"]
|
|
163
|
+
SQLite --> MCP["Future MCP/plugin surface"]
|
|
164
|
+
CLI --> Lab["Hermetic lab"]
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
The current engine lives in [`scripts/`](scripts/). The installable CLI lives
|
|
168
|
+
in [`frontier_scout/`](frontier_scout/). `scripts/` remains importable so the
|
|
169
|
+
existing Scout and lab logic can be packaged without a risky rewrite.
|
|
170
|
+
|
|
171
|
+
## Quickstart
|
|
172
|
+
|
|
173
|
+
Install from a checkout:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
python3 -m venv .venv
|
|
177
|
+
source .venv/bin/activate
|
|
178
|
+
pip install -e ".[dev]"
|
|
179
|
+
frontier-scout --help
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Initialize local state and detect stack signals:
|
|
183
|
+
|
|
184
|
+
```bash
|
|
185
|
+
frontier-scout init --repo .
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
Run a free seeded scan:
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
frontier-scout scan --dry-run --repo .
|
|
192
|
+
frontier-scout report --input demo/verdicts.json --output demo/briefing.html
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Run a live scan:
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
export ANTHROPIC_API_KEY=...
|
|
199
|
+
frontier-scout scan --repo .
|
|
200
|
+
frontier-scout report
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Try-before-trust a single tool before granting it project permissions:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
frontier-scout evaluate https://github.com/modelcontextprotocol/servers
|
|
207
|
+
frontier-scout trial browser-use/browser-use --url https://github.com/browser-use/browser-use --dry-run
|
|
208
|
+
frontier-scout guard --repo .
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
`evaluate` records source-backed local evidence and a permission manifest.
|
|
212
|
+
`trial --dry-run` writes an adoption receipt without installing anything.
|
|
213
|
+
`guard` checks the local evidence ledger for risky tools that still need a
|
|
214
|
+
stored trial receipt.
|
|
215
|
+
|
|
216
|
+
Inspect living packs and repo-relevant dependency upgrades:
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
frontier-scout packs list
|
|
220
|
+
frontier-scout packs show mcp
|
|
221
|
+
frontier-scout profile --repo . --dependencies
|
|
222
|
+
frontier-scout deps scan --repo .
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
`packs` shows the living radar seeds and candidates. `deps scan` looks for
|
|
226
|
+
meaningful security, hardening, and breaking upgrades that deserve a safe trial,
|
|
227
|
+
without modifying manifests or lockfiles.
|
|
228
|
+
|
|
229
|
+
After the first PyPI publish, the expected package install paths are:
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
pipx install frontier-scout
|
|
233
|
+
uvx frontier-scout demo
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Until then, the checkout install above is the supported path. An
|
|
237
|
+
`npx frontier-scout` wrapper is intentionally a later distribution layer, not
|
|
238
|
+
the core implementation.
|
|
239
|
+
|
|
240
|
+
## Safety model
|
|
241
|
+
|
|
242
|
+
Frontier Scout handles untrusted public content and can optionally execute
|
|
243
|
+
untrusted packages in the lab, so the safety rails are load-bearing:
|
|
244
|
+
|
|
245
|
+
- Source text is treated as untrusted data, not instructions.
|
|
246
|
+
- Tool names are checked against the source pool to reduce hallucinated verdicts.
|
|
247
|
+
- Source URLs must pass a domain allowlist.
|
|
248
|
+
- Incident and breach headlines are blocked from becoming tool recommendations.
|
|
249
|
+
- ADOPT requires enough readiness evidence or gets demoted.
|
|
250
|
+
- Adoption Firewall fails closed on unknown MCP/tool capability surfaces.
|
|
251
|
+
- `guard` never modifies the repo; it only reads local evidence and policy.
|
|
252
|
+
- Lab subprocesses receive a stripped environment, wall-clock timeout, size caps, and generated-script secret scanning.
|
|
253
|
+
|
|
254
|
+
See [SECURITY.md](SECURITY.md) for the threat model.
|
|
255
|
+
|
|
256
|
+
## Cost
|
|
257
|
+
|
|
258
|
+
The offline demo is free. A normal live weekly scan is designed to stay cheap:
|
|
259
|
+
|
|
260
|
+
| Component | Typical cost |
|
|
261
|
+
|---|---:|
|
|
262
|
+
| Sonnet score pass | ~$0.15 |
|
|
263
|
+
| Sonnet verdict pass | ~$0.04 |
|
|
264
|
+
| Optional Opus judge | ~$0.12 |
|
|
265
|
+
| **Weekly scan** | **~$0.30** |
|
|
266
|
+
|
|
267
|
+
Set `JUDGE_ENABLED=false` to skip the Opus judge when you want the cheapest
|
|
268
|
+
possible run.
|
|
269
|
+
|
|
270
|
+
## Development
|
|
271
|
+
|
|
272
|
+
```bash
|
|
273
|
+
make setup
|
|
274
|
+
make demo
|
|
275
|
+
make test
|
|
276
|
+
make eval
|
|
277
|
+
make audit
|
|
278
|
+
python -m compileall scripts outputs tests frontier_scout
|
|
279
|
+
PYTEST_DISABLE_PLUGIN_AUTOLOAD=1 python -m pytest -q
|
|
280
|
+
frontier-scout demo
|
|
281
|
+
frontier-scout scan --dry-run
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
CI runs compile checks, non-live tests, and a tracked-file secret scan.
|
|
285
|
+
|
|
286
|
+
## Release
|
|
287
|
+
|
|
288
|
+
For tagged releases:
|
|
289
|
+
|
|
290
|
+
1. Bump `project.version` in `pyproject.toml`.
|
|
291
|
+
2. Update the matching section in `CHANGELOG.md`.
|
|
292
|
+
3. Merge to `main`.
|
|
293
|
+
4. Push annotated tag `vX.Y.Z`.
|
|
294
|
+
|
|
295
|
+
Tag pushes trigger `.github/workflows/release.yml`, which builds distributions,
|
|
296
|
+
publishes to PyPI via trusted publishing, and creates a GitHub Release from
|
|
297
|
+
the matching changelog section.
|
|
298
|
+
|
|
299
|
+
## Roadmap
|
|
300
|
+
|
|
301
|
+
See [ROADMAP.md](ROADMAP.md). The short version:
|
|
302
|
+
|
|
303
|
+
- **v0.2** — current release: local radar, Adoption Firewall, Incident Change Scout, Living Scout Packs, dependency intelligence, SQLite, CI, Docker demo, and public docs.
|
|
304
|
+
- **v0.3** — MCP/plugin surfaces, stronger sandbox/toolbench backends, and optional output integrations on top of the same local evidence store.
|
|
305
|
+
|
|
306
|
+
## Contributing
|
|
307
|
+
|
|
308
|
+
Read [CONTRIBUTING.md](CONTRIBUTING.md). The fastest useful PRs improve the
|
|
309
|
+
CLI/report path, validator coverage, source quality, or lab isolation.
|
|
310
|
+
Please also read the [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
311
|
+
|
|
312
|
+
## License
|
|
313
|
+
|
|
314
|
+
[MIT](LICENSE)
|