grudge-cli 0.1.0__py3-none-any.whl
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.
- examples/__init__.py +1 -0
- examples/leaky_agent/__init__.py +1 -0
- examples/leaky_agent/agent.py +250 -0
- examples/leaky_agent/agent_fixed.py +183 -0
- examples/leaky_agent/tools.py +153 -0
- grudge/__init__.py +5 -0
- grudge/__main__.py +6 -0
- grudge/_stubs.py +8 -0
- grudge/admission/__init__.py +6 -0
- grudge/admission/court.py +239 -0
- grudge/admission/verdict.py +26 -0
- grudge/cli/__init__.py +1 -0
- grudge/cli/_common.py +126 -0
- grudge/cli/admit.py +93 -0
- grudge/cli/capture.py +39 -0
- grudge/cli/compile.py +37 -0
- grudge/cli/demo.py +136 -0
- grudge/cli/main.py +54 -0
- grudge/cli/run.py +60 -0
- grudge/cli/scars.py +91 -0
- grudge/cli/shrink.py +108 -0
- grudge/config.py +35 -0
- grudge/demo/__init__.py +1 -0
- grudge/demo/events.py +228 -0
- grudge/demo/orchestrator.py +326 -0
- grudge/demo/server.py +222 -0
- grudge/errors.py +25 -0
- grudge/fuzzer/__init__.py +1 -0
- grudge/fuzzer/fingerprint_guard.py +10 -0
- grudge/fuzzer/mutators.py +10 -0
- grudge/gate/__init__.py +5 -0
- grudge/gate/report.py +125 -0
- grudge/gate/runner.py +323 -0
- grudge/gate/selector.py +10 -0
- grudge/gate/wilson.py +36 -0
- grudge/guard/__init__.py +5 -0
- grudge/guard/compile.py +251 -0
- grudge/guard/import_session.py +106 -0
- grudge/integrations/__init__.py +1 -0
- grudge/integrations/github_comment.py +10 -0
- grudge/integrations/pytest_plugin.py +10 -0
- grudge/llm/__init__.py +6 -0
- grudge/llm/cache.py +92 -0
- grudge/llm/client.py +82 -0
- grudge/locator/__init__.py +1 -0
- grudge/locator/fork.py +10 -0
- grudge/locator/point_of_no_return.py +10 -0
- grudge/predicates/__init__.py +25 -0
- grudge/predicates/call_shape.py +116 -0
- grudge/predicates/compiler.py +116 -0
- grudge/predicates/dsl.py +295 -0
- grudge/predicates/fallback_rules.py +10 -0
- grudge/predicates/ordering.py +33 -0
- grudge/predicates/outcome.py +14 -0
- grudge/predicates/prompts/synthesize.md +15 -0
- grudge/predicates/synthesizer.py +127 -0
- grudge/predicates/taint_flow.py +84 -0
- grudge/recorder/__init__.py +5 -0
- grudge/recorder/adapters/__init__.py +1 -0
- grudge/recorder/adapters/langgraph.py +8 -0
- grudge/recorder/adapters/mcp_proxy.py +8 -0
- grudge/recorder/adapters/raw_sdk.py +159 -0
- grudge/recorder/recorder.py +374 -0
- grudge/recorder/redact.py +105 -0
- grudge/registry/__init__.py +1 -0
- grudge/registry/db.py +10 -0
- grudge/registry/fingerprint.py +10 -0
- grudge/registry/flakiness.py +10 -0
- grudge/registry/retirement.py +10 -0
- grudge/replay/__init__.py +19 -0
- grudge/replay/cassette_player.py +159 -0
- grudge/replay/sandbox.py +340 -0
- grudge/replay/scripted_llm.py +382 -0
- grudge/schema/__init__.py +45 -0
- grudge/schema/cassette.py +206 -0
- grudge/schema/predicate.py +263 -0
- grudge/schema/scar.py +113 -0
- grudge/schema/trace.py +243 -0
- grudge/shrinker/__init__.py +12 -0
- grudge/shrinker/cassette_builder.py +328 -0
- grudge/shrinker/ddmin.py +243 -0
- grudge/shrinker/oracle.py +230 -0
- grudge/shrinker/reducers.py +331 -0
- grudge_cli-0.1.0.dist-info/LICENSE +21 -0
- grudge_cli-0.1.0.dist-info/METADATA +313 -0
- grudge_cli-0.1.0.dist-info/RECORD +89 -0
- grudge_cli-0.1.0.dist-info/WHEEL +5 -0
- grudge_cli-0.1.0.dist-info/entry_points.txt +2 -0
- grudge_cli-0.1.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
|
+
Name: grudge-cli
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Deterministic regression scars for agent mistakes.
|
|
5
|
+
Author: Grudge contributors
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: <3.15,>=3.11
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: pydantic==2.12.5
|
|
11
|
+
Requires-Dist: typer==0.15.1
|
|
12
|
+
Requires-Dist: click==8.1.8
|
|
13
|
+
Requires-Dist: rich==13.9.4
|
|
14
|
+
Requires-Dist: httpx==0.28.1
|
|
15
|
+
Provides-Extra: dev
|
|
16
|
+
Requires-Dist: pytest==8.3.4; extra == "dev"
|
|
17
|
+
Requires-Dist: pytest-cov==6.0.0; extra == "dev"
|
|
18
|
+
Requires-Dist: hypothesis==6.123.10; extra == "dev"
|
|
19
|
+
Requires-Dist: ruff==0.14.14; extra == "dev"
|
|
20
|
+
Requires-Dist: mypy==1.18.2; extra == "dev"
|
|
21
|
+
|
|
22
|
+
# Grudge
|
|
23
|
+
|
|
24
|
+
**Agents repeat mistakes. Grudge makes each one happen exactly once.**
|
|
25
|
+
|
|
26
|
+
## The problem
|
|
27
|
+
|
|
28
|
+
Agent failures are often buried in long, provider-dependent transcripts that are difficult to reproduce. A copied transcript can show what happened, but it cannot show whether the live policy would make the same decision when the world changes. Grudge turns one failure into a small, reviewable regression Scar that can run offline and block the same behavior from returning.
|
|
29
|
+
|
|
30
|
+
## 30-second quickstart
|
|
31
|
+
|
|
32
|
+
Use Python 3.14.0 or another interpreter supported by `pyproject.toml`, then run
|
|
33
|
+
the complete offline demo from the repository root:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pip install -e . && grudge demo
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The command opens the local viewer and plays the five-beat story: capture the
|
|
40
|
+
vulnerable run, shrink its world, synthesize a predicate, prove red-on-bad and
|
|
41
|
+
green-on-fixed admission, then reintroduce the bug and block it. The demo is
|
|
42
|
+
offline and deterministic: it uses checked-in fake tools, scripted policies,
|
|
43
|
+
the checked-in Scar, and the fallback predicate; it does not call a provider or
|
|
44
|
+
the public network. For a headless smoke run, use
|
|
45
|
+
`python -m grudge demo --no-browser --fast --json`. For the two-session
|
|
46
|
+
Claude-style hook proof, use `python -m grudge demo --guard --json`.
|
|
47
|
+
|
|
48
|
+
### Install the local guard
|
|
49
|
+
|
|
50
|
+
These commands exercise the checkout's Node package from the repository root;
|
|
51
|
+
they do not resolve a package from the npm registry:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
npm --prefix packages/grudge run build
|
|
55
|
+
npm --prefix packages/grudge run setup:repo
|
|
56
|
+
npm --prefix packages/grudge run doctor:repo
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
If `grudge` has been published, the equivalent registry workflow is
|
|
60
|
+
`npx grudge-cli ...`. When working from `packages/grudge`, use `node dist/grudge.mjs`
|
|
61
|
+
and add `--cwd ../..` when the hooks should target the repository root. The
|
|
62
|
+
short package-directory commands are `npm run setup:repo` and
|
|
63
|
+
`npm run doctor:repo`. Do not combine `cd packages/grudge` with the
|
|
64
|
+
root-relative path `packages/grudge/dist/grudge.mjs`, or it resolves to
|
|
65
|
+
`packages/grudge/packages/grudge/dist/grudge.mjs`.
|
|
66
|
+
|
|
67
|
+
Claude Code is the verified **Guard** tier. Codex, Gemini CLI, GitHub Copilot,
|
|
68
|
+
OpenCode, and Windsurf are **Advisory** integrations; Cursor is unverified and
|
|
69
|
+
the installer writes no Cursor files. See [the integration matrix](docs/integrations.md).
|
|
70
|
+
Use `node packages/grudge/dist/grudge.mjs setup --dry-run` to inspect a plan and
|
|
71
|
+
`node packages/grudge/dist/grudge.mjs uninstall` to remove Grudge-managed files.
|
|
72
|
+
|
|
73
|
+
## What the shrink shows
|
|
74
|
+
|
|
75
|
+
The headline visual is the shrink: many captured tool responses become the
|
|
76
|
+
small causal world that still reproduces the failure. The repository includes
|
|
77
|
+
a static visual reference for the story; the live viewer animates the same
|
|
78
|
+
transition from the retained `shrink.*` events.
|
|
79
|
+
|
|
80
|
+

|
|
81
|
+
|
|
82
|
+
## Architecture
|
|
83
|
+
|
|
84
|
+
The engine is CLI-first. The recorder emits a typed trace, replay freezes only
|
|
85
|
+
the external world while the policy stays live, the shrinker reduces the
|
|
86
|
+
cassette, deterministic predicate code checks behavior, admission proves that
|
|
87
|
+
the rule discriminates, and the gate turns repeated clean runs into a CI
|
|
88
|
+
decision. The local demo server adds an event stream consumed by the static
|
|
89
|
+
viewer; the viewer never owns pipeline state or verdict logic.
|
|
90
|
+
|
|
91
|
+

|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
agent run → trace → cassette + live policy → minimal cassette
|
|
95
|
+
↓
|
|
96
|
+
predicate → admission proof → statistical gate
|
|
97
|
+
↓
|
|
98
|
+
demo events → local SSE server → static viewer
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
The full contracts and boundaries are in
|
|
102
|
+
[`docs/architecture.md`](docs/architecture.md).
|
|
103
|
+
|
|
104
|
+
## How a failure becomes a Scar
|
|
105
|
+
|
|
106
|
+
Each Scar contains three reviewable artifacts:
|
|
107
|
+
|
|
108
|
+
1. **Cassette — the frozen world.** An ordered set of task/tool-response
|
|
109
|
+
entries. Replay serves only cassette responses, with strict matching and
|
|
110
|
+
single-use entries, while the policy computes its next action from the
|
|
111
|
+
resulting messages. This keeps replay hermetic without replaying a
|
|
112
|
+
transcript verbatim. See [`docs/cassette-format.md`](docs/cassette-format.md)
|
|
113
|
+
and [`docs/why-not-replay.md`](docs/why-not-replay.md).
|
|
114
|
+
2. **Predicate — the never-again rule.** A small readable DSL expresses call
|
|
115
|
+
shape, ordering, and MVP-lite taint flow. The parser/compiler returns exact
|
|
116
|
+
trace evidence and a deterministic `PredicateResult`; optional model
|
|
117
|
+
synthesis can draft text, but deterministic code decides. See
|
|
118
|
+
[`docs/predicate-dsl.md`](docs/predicate-dsl.md).
|
|
119
|
+
3. **Verdict — proof and gate evidence.** Admission requires witnessed red
|
|
120
|
+
bad-agent runs, clean successful fixed-agent runs, nonempty benign controls,
|
|
121
|
+
and fail-closed replay/checker behavior. The statistical gate repeats an
|
|
122
|
+
admitted Scar and passes only when its Wilson lower bound reaches the
|
|
123
|
+
threshold. Offline repetitions demonstrate repeatability, not independent
|
|
124
|
+
statistical samples. See [`docs/statistics.md`](docs/statistics.md) and
|
|
125
|
+
[`docs/architecture.md`](docs/architecture.md#admission-rules).
|
|
126
|
+
|
|
127
|
+
## CLI reference
|
|
128
|
+
|
|
129
|
+
Run `grudge --help` or append `--help` to any command. Every implemented
|
|
130
|
+
command accepts `--json` for one machine-readable document on stdout and
|
|
131
|
+
`--debug` for a traceback on stderr. Expected input/engine failures use exit
|
|
132
|
+
code `2`; a gate passes with `0` and is blocked with `1`.
|
|
133
|
+
|
|
134
|
+
### Capture
|
|
135
|
+
|
|
136
|
+
```text
|
|
137
|
+
grudge capture AGENT_MODULE --out PATH [--json] [--debug]
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
Calls the module's `run_agent` or `run` entry point and writes canonical JSONL
|
|
141
|
+
trace output.
|
|
142
|
+
|
|
143
|
+
### Shrink
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
grudge shrink TRACE --failure RULE --out PATH
|
|
147
|
+
[--agent AGENT_MODULE] [--json] [--debug]
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Reduces a trace-derived cassette while retaining the supplied DSL rule.
|
|
151
|
+
`--failure demo` selects the checked-in hand-verified demo rule;
|
|
152
|
+
`--agent` defaults to `examples.leaky_agent.agent`.
|
|
153
|
+
|
|
154
|
+
### Admit
|
|
155
|
+
|
|
156
|
+
```text
|
|
157
|
+
grudge admit CASSETTE --bad AGENT_MODULE --good AGENT_MODULE --out PATH
|
|
158
|
+
[--id TEXT] [--predicate RULE|demo] [--controls PATH] [--runs INT]
|
|
159
|
+
[--json] [--debug]
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
Builds a candidate Scar and admits it only after repeated red/green proof and
|
|
163
|
+
benign controls. `--controls` defaults to
|
|
164
|
+
`examples/leaky_agent/controls`; `--runs` defaults to `3`; `--predicate demo`
|
|
165
|
+
uses the fallback rule.
|
|
166
|
+
|
|
167
|
+
### Run the gate
|
|
168
|
+
|
|
169
|
+
```text
|
|
170
|
+
grudge run --scars PATH --agent AGENT_MODULE
|
|
171
|
+
[--runs INT] [--threshold FLOAT] [--json] [--debug]
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Runs one Scar file or every `*.scar.json` in a directory. Defaults come from
|
|
175
|
+
`grudge.config` (`20` runs and threshold `0.80`). The report labels the normal
|
|
176
|
+
path `offline/deterministic`.
|
|
177
|
+
|
|
178
|
+
### Demo and viewer
|
|
179
|
+
|
|
180
|
+
```text
|
|
181
|
+
grudge demo [--live] [--guard] [--port INT] [--no-browser] [--runs INT] [--fast]
|
|
182
|
+
[--json] [--debug]
|
|
183
|
+
grudge viewer [--json] [--debug]
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
`demo` defaults to the local viewer server on port `8765`; `--no-browser`
|
|
187
|
+
prints the URL instead. `--fast` removes presenter pacing. `--live` is a
|
|
188
|
+
reserved future provider mode and currently reports an error. `viewer` remains
|
|
189
|
+
an explicit roadmap stub; the supported viewer path is `grudge demo`.
|
|
190
|
+
`grudge demo --guard --json` runs the offline two-session proof: it captures a
|
|
191
|
+
real Claude-style hook payload, proposes and accepts the rule, then blocks the
|
|
192
|
+
same data-flow attempt at PreToolUse. The proof uses no network or model call.
|
|
193
|
+
|
|
194
|
+
### Browse Scars
|
|
195
|
+
|
|
196
|
+
```text
|
|
197
|
+
grudge scars list [--scars PATH] [--json] [--debug]
|
|
198
|
+
grudge scars show SCAR [--scars PATH] [--json] [--debug]
|
|
199
|
+
grudge scars retire SCAR [--json] [--debug]
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
`list` and `show` are implemented. `retire` is reserved for the future
|
|
203
|
+
registry and returns an explicit roadmap error.
|
|
204
|
+
|
|
205
|
+
For a shell pipeline and JSON/error examples, see
|
|
206
|
+
[`docs/demo-guide.md`](docs/demo-guide.md).
|
|
207
|
+
|
|
208
|
+
## Status
|
|
209
|
+
|
|
210
|
+
| Area | MVP status | STRETCH status |
|
|
211
|
+
|---|---|---|
|
|
212
|
+
| Typed trace, cassette, predicate, and Scar schemas | Implemented and persisted | — |
|
|
213
|
+
| Recording and redaction | Recorder, decorator, raw SDK boundary, and configurable redaction implemented | MCP and LangGraph adapters are stubs |
|
|
214
|
+
| Replay and shrinking | Hermetic cassette replay, ddmin, content reducers, and deterministic history implemented | Fault locator is a stub |
|
|
215
|
+
| Predicates | Call shape, ordering, and MVP-lite taint flow implemented; outcome AST parses | Outcome checker is a stub |
|
|
216
|
+
| Admission and statistics | Red/green proof, controls, Wilson gate, Rich/Markdown reports implemented | Changed-Scar selector is a stub |
|
|
217
|
+
| CLI and demo | Capture, shrink, admit, run, demo, Guard proof, and Scar list/show implemented | `viewer` and `scars retire` commands are explicit stubs |
|
|
218
|
+
| Static viewer | CDN-free event-driven dashboard with replay, pause, reconnect, and evidence panels implemented | Full Scar browser/registry integration remains a stub/minimal boundary |
|
|
219
|
+
| Ecosystem integrations | Local/offline path needs no external service | SQLite registry, fuzzer, locator, pytest/GitHub integrations, and workflow are deferred |
|
|
220
|
+
|
|
221
|
+
### Guard tiers and token budgets
|
|
222
|
+
|
|
223
|
+
| Tier | Agents | Meaning |
|
|
224
|
+
|---|---|---|
|
|
225
|
+
| **Guard** | Claude Code (verified) | Hooks enforce expressible scars before a tool runs. |
|
|
226
|
+
| **Advisory** | Agents that read instruction files | The model receives the rule; compliance is not guaranteed. |
|
|
227
|
+
| **CI only** | Other agents | Check scars afterward with `grudge run` in CI. |
|
|
228
|
+
|
|
229
|
+
Injected output is bounded: SessionStart 1,200 characters and 8 scars, block
|
|
230
|
+
reason 400 characters, prompt nudge 200 characters, and the managed block 1,000
|
|
231
|
+
characters across at most 12 lines. Token savings are always labeled **est.**
|
|
232
|
+
|
|
233
|
+
The complete stub/design register is [`docs/roadmap.md`](docs/roadmap.md).
|
|
234
|
+
|
|
235
|
+
## Benchmark status
|
|
236
|
+
|
|
237
|
+
The row below is a measured offline CLI run on WSL Ubuntu-D with Python 3.11.17
|
|
238
|
+
using the checked-in vulnerable agent and the command path documented in
|
|
239
|
+
`docs/demo-guide.md`. Wall time includes capture and shrink; cassette bytes are
|
|
240
|
+
the pretty-printed JSON artifact written by `grudge shrink --json`. Repeat on a
|
|
241
|
+
different machine before comparing timings; do not infer measurements from the
|
|
242
|
+
demo narration.
|
|
243
|
+
|
|
244
|
+
| Workload | Original steps | Minimal steps / entries | Oracle calls | Wall time | Cassette bytes |
|
|
245
|
+
|---|---:|---:|---:|---:|---:|
|
|
246
|
+
| Demo leak (offline, deterministic; WSL Ubuntu-D / Python 3.11.17) | 71 | 23 | 1,254 | 46.357 s | 3,756 |
|
|
247
|
+
|
|
248
|
+
The implementation already reports shrink statistics (`original_entries`,
|
|
249
|
+
`minimal_entries`, `oracle_calls`, and byte sizes) in `grudge shrink --json`,
|
|
250
|
+
which is the source for the measured row above. The deterministic input helper
|
|
251
|
+
can generate a configurable trace for stress tests and future benchmark runs:
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
python scripts/generate_trace.py --steps 40 --output artifacts/phase12/trace.jsonl
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
It does not time shrinking or aggregate measurements automatically; benchmark
|
|
258
|
+
rows must be captured from a clean run and recorded with their environment.
|
|
259
|
+
|
|
260
|
+
## Checks and reproducibility
|
|
261
|
+
|
|
262
|
+
The default supported runtime is Python 3.14.0, recorded in `.python-version`.
|
|
263
|
+
The package supports Python 3.11 through 3.14, and the lockfile is
|
|
264
|
+
`requirements.lock`. The project Makefile keeps dependencies in a local virtual
|
|
265
|
+
environment:
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
make install
|
|
269
|
+
make test
|
|
270
|
+
make lint
|
|
271
|
+
make typecheck
|
|
272
|
+
make docs-check
|
|
273
|
+
make all
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Clean Linux commands
|
|
277
|
+
|
|
278
|
+
From a fresh checkout, the shortest reproducible workflow is:
|
|
279
|
+
|
|
280
|
+
```bash
|
|
281
|
+
git clone https://github.com/harshithKumar12/Grudge.git
|
|
282
|
+
cd Grudge
|
|
283
|
+
python3.14 --version
|
|
284
|
+
make install
|
|
285
|
+
make test
|
|
286
|
+
make demo
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
`make test` runs the Python suite and the Node package suite when Node.js 18+
|
|
290
|
+
is installed; it remains usable on a Python-only machine. The headless proof
|
|
291
|
+
is useful in CI:
|
|
292
|
+
|
|
293
|
+
```bash
|
|
294
|
+
.venv/bin/python -m grudge demo --guard --json
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
The offline path needs no API keys or real personal data. Copy `.env.example`
|
|
298
|
+
only when experimenting with the optional provider boundary; never commit a
|
|
299
|
+
key. Docker remains an optional reproducibility path:
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
docker build -t grudge:latest .
|
|
303
|
+
docker run --rm grudge:latest
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
## Repository guide
|
|
307
|
+
|
|
308
|
+
- [Architecture](docs/architecture.md) — contracts and pipeline boundaries.
|
|
309
|
+
- [Documentation index](docs/INDEX.md) — every documentation file and owner phase.
|
|
310
|
+
- [Roadmap](docs/roadmap.md) — every deferred stub and its design notes.
|
|
311
|
+
- [Demo guide](docs/demo-guide.md) — presenter, server, JSON, and shell operation.
|
|
312
|
+
- [Pitch artifacts](pitch/one_liner.md) — one-liner, 90-second script, and slides.
|
|
313
|
+
- [Progress tracker](Progress.md) — canonical phase status.
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
examples/__init__.py,sha256=y3ZyNPnH5079AUd2gkblD8nPjA1v91OsmF4KKcmbzPE,50
|
|
2
|
+
examples/leaky_agent/__init__.py,sha256=jROXWyGB-2mc7tHKRaTl96GfUVbkhThUSXm69SxhtSk,53
|
|
3
|
+
examples/leaky_agent/agent.py,sha256=b_eN2Tw_trULwlgLmEQ8JLpl4F2_7bZ6iqeM-K3cAek,7187
|
|
4
|
+
examples/leaky_agent/agent_fixed.py,sha256=0akuo3k9nHWbKDz9vrHRmnwtP36aGepk_LWnQBkNfXg,5825
|
|
5
|
+
examples/leaky_agent/tools.py,sha256=Gwmv7BOULTet_jmedxkbdQ2qJTnnCl4zv1mn5NiEPq0,4339
|
|
6
|
+
grudge/__init__.py,sha256=r9NRj77kzfKubffKcRPzDpb9H_CrWU90NkhxEYydlsM,171
|
|
7
|
+
grudge/__main__.py,sha256=P7chV9OPEGWd9mm5iHAn4vpf_NUyFv7q7jwbngpQC5Q,142
|
|
8
|
+
grudge/_stubs.py,sha256=VWYk-mMA7D5s7JEjQbCrhLMDny74acJoKIGdW4xa4vs,245
|
|
9
|
+
grudge/config.py,sha256=3KL4oaUPEqob9QntM4WWyCiVKmZ6ChGXtvycQKuUmDM,953
|
|
10
|
+
grudge/errors.py,sha256=RCfWDivrVuf04kD-z61o97NSp61mg3AgguzV-VsgP7s,684
|
|
11
|
+
grudge/admission/__init__.py,sha256=W7szys5EqsdtLukln8mh7xkS0ejnGaFZGtryiHNPEW0,211
|
|
12
|
+
grudge/admission/court.py,sha256=wmnZUGUcoAFAcUZNnKf8DaijxaQKoCZnaBQkNMDWGfk,9232
|
|
13
|
+
grudge/admission/verdict.py,sha256=uRSGE4jLEKLKmsDLtQvKOKRqNOqD_Trp_VS3SXHJJGY,890
|
|
14
|
+
grudge/cli/__init__.py,sha256=rzhrO8BkIfbk6Z1LpSHLx95oBt2yUqXDfOp1pqnPQYg,59
|
|
15
|
+
grudge/cli/_common.py,sha256=5LgwKzqYUPmV_bMtY1E0h4z6HFzpaxjmHMU1kbvFThM,3625
|
|
16
|
+
grudge/cli/admit.py,sha256=7F1DLXkArGDc899Z3fHpieMS8ZHxjxddAKEnsr9aaJc,3633
|
|
17
|
+
grudge/cli/capture.py,sha256=IMMrXrwqIQ1KHmicCmrQyHj4rnKdgX70MUXvoWbouQ8,1306
|
|
18
|
+
grudge/cli/compile.py,sha256=F2yupfq_oACNqcQFuCkua5DZ1qAo1Tik6c4CalRllgY,1248
|
|
19
|
+
grudge/cli/demo.py,sha256=9Qt_eJ69vtE0uhM52rvSmLpNTjHwcMBIsd4B91DaoTc,5251
|
|
20
|
+
grudge/cli/main.py,sha256=FMVx3RzaMrhilG1DHtO1y-p8misXppb0bm7Df2VXF40,1498
|
|
21
|
+
grudge/cli/run.py,sha256=V2Ic-HkARYMXagROUUFgvStFU2Z4SxVBaxW1FsFf5FU,2438
|
|
22
|
+
grudge/cli/scars.py,sha256=a4PTh70BWMf1s6MGdMprehnZK04FHSgahnwRpbMrZ1g,2977
|
|
23
|
+
grudge/cli/shrink.py,sha256=PE02X5D4N7Yy5H8jBGKxtSNi9Lq42Akqygt38D_RQIs,4168
|
|
24
|
+
grudge/demo/__init__.py,sha256=KcFKdjoQ47nOnrRwkK4JoosqGSHxKsQYKArmi0lpVjg,81
|
|
25
|
+
grudge/demo/events.py,sha256=_Ll2rGk1mLs5FLETywoYjgXURjnmKHh5KVLemAQ9_4k,6174
|
|
26
|
+
grudge/demo/orchestrator.py,sha256=VmcAMwanKS9OyHsUxIytFLBTh6U0cepdQHH25p_pHYs,10997
|
|
27
|
+
grudge/demo/server.py,sha256=MHXV_zD76ZKata4uLPcHHy-PfyoaGJDtO5unnCHE5Xw,7157
|
|
28
|
+
grudge/fuzzer/__init__.py,sha256=z93QBrpZeDz2eThx4LFs67_7H-7ZfcD_mvTNZM5IsxU,72
|
|
29
|
+
grudge/fuzzer/fingerprint_guard.py,sha256=XBfF5mnWeNhaW3tAFfgvdtpaAEwZnii-WeEY4qrSkPk,292
|
|
30
|
+
grudge/fuzzer/mutators.py,sha256=TmvaxwKH8CBNs9cS4YBykU2VLoLiDBX2k54Usc98has,269
|
|
31
|
+
grudge/gate/__init__.py,sha256=7ecFl4JVM0ogFpttDXjz9sr0XdSuHR7xPQGvRxTyjM8,224
|
|
32
|
+
grudge/gate/report.py,sha256=WkrVzSgdr4M_0QP32_JDzL2DWThdWZzR64z_hfEppPQ,4054
|
|
33
|
+
grudge/gate/runner.py,sha256=C0vdLf0AsKnbKHy8MoTGr8vJqy57gsjMuQ0Gg6wrH7E,11017
|
|
34
|
+
grudge/gate/selector.py,sha256=Am0YDig6h2UsHcE2tnFLIDT7wWyXuZoH7mkioOz9pRI,270
|
|
35
|
+
grudge/gate/wilson.py,sha256=qq1QZZy9ZJeknNTr4uqmL9cUNUbvgnArZiTgXlTFoCQ,1367
|
|
36
|
+
grudge/guard/__init__.py,sha256=f1VjurKx1nQR4RZ5vww6TMVujA4wbC6fyjC-QBSCzDY,166
|
|
37
|
+
grudge/guard/compile.py,sha256=fFriMww9TiTZWEju66UPayrL0h4k3JGwSznIHLWmsgo,8510
|
|
38
|
+
grudge/guard/import_session.py,sha256=hSA5ebgdAGxry1ilkXUJtnbwz2HHkbXFx83s63x4CsA,3624
|
|
39
|
+
grudge/integrations/__init__.py,sha256=R5EA1PC5WJSxT2CLllgCqiYXxzkQb4vbmM2K3AJW4Ho,78
|
|
40
|
+
grudge/integrations/github_comment.py,sha256=dC8Dfn3VOBsaY-xWecCuJDUygpM2fa6LBM60zHQusdg,296
|
|
41
|
+
grudge/integrations/pytest_plugin.py,sha256=AExTzevZjEzGiVYTTJSZ_jigGRDCYgFfBxtMk36iV0s,300
|
|
42
|
+
grudge/llm/__init__.py,sha256=gcSzWmO9G_-y_7DPAd7oXjDLZFILr93KXJi5sOs4xKA,278
|
|
43
|
+
grudge/llm/cache.py,sha256=h2KqyDTqAcWG_H2xgboov2ax_jhbPmg1j1EOapPUYpY,2948
|
|
44
|
+
grudge/llm/client.py,sha256=sBzQgCqx12zncmW4mQg8e3nXvlSyIkxbJyhrdE2u3WU,2574
|
|
45
|
+
grudge/locator/__init__.py,sha256=onrVr3SqLaZsur_oKPS1J4inx_vJqnvJ9fHZmfOcC1Y,70
|
|
46
|
+
grudge/locator/fork.py,sha256=1dGUFPpETxwY0tz2t-Gvr0CQCyUvjchS1nTfBKqIDuw,273
|
|
47
|
+
grudge/locator/point_of_no_return.py,sha256=cnwqRZMmEqSmmwhfHyACPg944L9keINkI-noHagaGU8,301
|
|
48
|
+
grudge/predicates/__init__.py,sha256=QGJKWVjm4RzasO2AcB6AhMd7rr-Oq69Jtweh1FH2vRM,563
|
|
49
|
+
grudge/predicates/call_shape.py,sha256=cb3-54KNedVcs0XCCIsSSiB0wartjO0MbV-c2S3oXyo,4492
|
|
50
|
+
grudge/predicates/compiler.py,sha256=elq0akBp8gql8XTy7Go0o4dMfHT5Pq6mUzUUQU7YgJY,4660
|
|
51
|
+
grudge/predicates/dsl.py,sha256=RPvnO4gbPMwnO62vWuzmVI9cLYjdXf8Ee9VskJp24tI,10936
|
|
52
|
+
grudge/predicates/fallback_rules.py,sha256=OKo1c4JroMm0AvyOXrEcQ4qYttHReGNo4C_dM1YDqHw,304
|
|
53
|
+
grudge/predicates/ordering.py,sha256=jly92G8uAF-uH0m3lsrn5-5DYbigRmyUEWqqJb1Bnlw,1124
|
|
54
|
+
grudge/predicates/outcome.py,sha256=IJ0MjXKJLvdZrptZ2pvgnv93DwashSiJI_bGy9MHTtc,457
|
|
55
|
+
grudge/predicates/synthesizer.py,sha256=RcF0YBrBTHFTg0bjdgNbaskruAU7OntCXAPTho4_p94,4125
|
|
56
|
+
grudge/predicates/taint_flow.py,sha256=0b6blvkuQZwzJ8QCdNzX_LCFelcQd0-UHdi80KvS4n4,3268
|
|
57
|
+
grudge/predicates/prompts/synthesize.md,sha256=bkij44FFoNzoZN1SjMmcadJOkvRo3nZhHx2yl_e1aIc,720
|
|
58
|
+
grudge/recorder/__init__.py,sha256=hSoTluxQLEnlX6PBx_6vpZKoN66WlJUM4wXdMkzl4PU,219
|
|
59
|
+
grudge/recorder/recorder.py,sha256=KUTHIQh2TKP0wrY2VQg-O6-KLbjbfnzTVEniqaFk62I,11102
|
|
60
|
+
grudge/recorder/redact.py,sha256=tpCLhtQTGGXw_CRj4qM2BvyQCHmOkuJHkWNISmFIMHI,3427
|
|
61
|
+
grudge/recorder/adapters/__init__.py,sha256=NTU1_q0uOSgnWOAIZtPtH_1qPUlDfR0czkTnRBXrvDo,73
|
|
62
|
+
grudge/recorder/adapters/langgraph.py,sha256=1cQm1qhZmuqF2izYCmJzYoS2a-guL4uvC2dN0O7jihA,286
|
|
63
|
+
grudge/recorder/adapters/mcp_proxy.py,sha256=LPVVBNSuGOhswjO1uyMUnsdu07wGu7_SpOgJsQvUDLU,280
|
|
64
|
+
grudge/recorder/adapters/raw_sdk.py,sha256=pgw2H-7xe1ip2nM6xTt-q3BdMwPPWfi2Xm8nDxA0o_s,5794
|
|
65
|
+
grudge/registry/__init__.py,sha256=28Y63VJyIBCyGMVuH_VMKOg8eMQIgvLJ4zhtL75oHms,72
|
|
66
|
+
grudge/registry/db.py,sha256=W_JxDUVB7ZLEES5GiDuQgOwiv5au7J5vB63ayElm-yg,274
|
|
67
|
+
grudge/registry/fingerprint.py,sha256=QhLw4YOMGqGrobh7R3dR5j2W4OPjFmP4pG1SoGnrGnI,271
|
|
68
|
+
grudge/registry/flakiness.py,sha256=3t1Pwj799c_gKKnT1GBlfdtQIE5V-syqLc3hKDUHrIM,269
|
|
69
|
+
grudge/registry/retirement.py,sha256=1eoy7EjLckTYYrYuWoM0MooGZYXaL_0QEUKUZc6m-Lg,256
|
|
70
|
+
grudge/replay/__init__.py,sha256=1v85GbfpkOE0F9kawUW-bc3il11mgzd3YwBVIYHwjEA,436
|
|
71
|
+
grudge/replay/cassette_player.py,sha256=pQqWrhqAI70Y0eGzaw_jqcRP8SpRal4mkRdjLp8fq7Y,5099
|
|
72
|
+
grudge/replay/sandbox.py,sha256=7Ozi_fTg7K3m-N7e8s4CSNdFxJgBmw_SiolUIqmkcaI,11006
|
|
73
|
+
grudge/replay/scripted_llm.py,sha256=x-lFwUnAE4QrmAagf0ca5RKNOZtmHFgvRRVucPBfEjA,14268
|
|
74
|
+
grudge/schema/__init__.py,sha256=lJLto8D4ULFx2DpkTerxasTtN2DUKvpMb_Hwg1rG4lM,861
|
|
75
|
+
grudge/schema/cassette.py,sha256=bw5oPdEjvzf5y9PM1oh7XDnvjgGUOKsG3rLWw2R0ojc,6134
|
|
76
|
+
grudge/schema/predicate.py,sha256=-2B2frxW8aLu8t0Yj4dp0SPVcB7l_xPj3zU6MQ5I3V4,8160
|
|
77
|
+
grudge/schema/scar.py,sha256=cOLf8maNYq0uUzcDvcCouYw_Emrou7kVnSwsvVhlwww,3366
|
|
78
|
+
grudge/schema/trace.py,sha256=2kVtHBg4TRuqA7u5XiXfQWOjO1Q1pddBDLw8bbHH5YE,7564
|
|
79
|
+
grudge/shrinker/__init__.py,sha256=SPnkYfcg54J2uN8F9XNgjwDhRBKQYMLPnBlyvIdwt1o,357
|
|
80
|
+
grudge/shrinker/cassette_builder.py,sha256=IxtBv6OD7BX-YMxtRT4307zvq0irVNXdpFg9H-cqc5k,10758
|
|
81
|
+
grudge/shrinker/ddmin.py,sha256=zmavqUtQUGm9htFdHP9DvgJCflUmk7qBzHKItu8VFG4,8096
|
|
82
|
+
grudge/shrinker/oracle.py,sha256=e8BGdAQ-ZzPJeboX0LB2-VwUnt8xAm8d47yHocbjk5Q,7998
|
|
83
|
+
grudge/shrinker/reducers.py,sha256=aEpCLyt1xuxYZ3jBvke249Jw4Ee6aUNSOLJRXKwm8UI,10624
|
|
84
|
+
grudge_cli-0.1.0.dist-info/LICENSE,sha256=lMp3mgdk9hcuOKRr-LIbJAqNw2gnD5qRrNLYCBLZq_M,1076
|
|
85
|
+
grudge_cli-0.1.0.dist-info/METADATA,sha256=QmgPsSmrnL1534Y5tVy4WZOynKFQmC3dL5vwhyM0z70,13160
|
|
86
|
+
grudge_cli-0.1.0.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
|
87
|
+
grudge_cli-0.1.0.dist-info/entry_points.txt,sha256=XNXJi9gNi5thXFIjfUBatbll9XnL-icXrsMBrw0vGr8,47
|
|
88
|
+
grudge_cli-0.1.0.dist-info/top_level.txt,sha256=q_Oh4VbtjZnc3lRBVp3lylGmibnmlE_1rmZxDfA3UT4,16
|
|
89
|
+
grudge_cli-0.1.0.dist-info/RECORD,,
|