grudge-cli 0.1.1__tar.gz → 0.1.3__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.
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/PKG-INFO +48 -4
- grudge_cli-0.1.1/grudge_cli.egg-info/PKG-INFO → grudge_cli-0.1.3/README.md +132 -109
- grudge_cli-0.1.1/README.md → grudge_cli-0.1.3/grudge_cli.egg-info/PKG-INFO +138 -73
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/pyproject.toml +1 -1
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/LICENSE +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/examples/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/examples/leaky_agent/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/examples/leaky_agent/agent.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/examples/leaky_agent/agent_fixed.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/examples/leaky_agent/tools.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/__main__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/_stubs.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/admission/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/admission/court.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/admission/verdict.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/_common.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/admit.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/capture.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/compile.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/demo.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/main.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/run.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/scars.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/cli/shrink.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/config.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/demo/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/demo/events.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/demo/orchestrator.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/demo/server.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/errors.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/fuzzer/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/fuzzer/fingerprint_guard.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/fuzzer/mutators.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/gate/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/gate/report.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/gate/runner.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/gate/selector.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/gate/wilson.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/guard/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/guard/compile.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/guard/import_session.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/integrations/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/integrations/github_comment.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/integrations/pytest_plugin.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/llm/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/llm/cache.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/llm/client.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/locator/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/locator/fork.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/locator/point_of_no_return.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/call_shape.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/compiler.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/dsl.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/fallback_rules.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/ordering.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/outcome.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/prompts/synthesize.md +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/synthesizer.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/predicates/taint_flow.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/adapters/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/adapters/langgraph.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/adapters/mcp_proxy.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/adapters/raw_sdk.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/recorder.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/recorder/redact.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/registry/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/registry/db.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/registry/fingerprint.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/registry/flakiness.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/registry/retirement.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/replay/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/replay/cassette_player.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/replay/sandbox.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/replay/scripted_llm.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/schema/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/schema/cassette.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/schema/predicate.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/schema/scar.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/schema/trace.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/shrinker/__init__.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/shrinker/cassette_builder.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/shrinker/ddmin.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/shrinker/oracle.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge/shrinker/reducers.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge_cli.egg-info/SOURCES.txt +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge_cli.egg-info/dependency_links.txt +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge_cli.egg-info/entry_points.txt +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge_cli.egg-info/requires.txt +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/grudge_cli.egg-info/top_level.txt +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/setup.cfg +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_admission_court.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_cassette_builder.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_cassette_player.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_cassette_schema.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_cli.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_config.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_ddmin.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_demo_flow.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_docs_check.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_errors.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_gate_report.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_gate_runner.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_guard_compile.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_guard_conformance.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_import_session.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_leaky_agents.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_leaky_tools.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_phase12.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_predicate_compiler.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_predicate_schema.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_predicate_synthesizer.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_predicates_dsl.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_recorder.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_redact.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_reducers.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_replay_sandbox.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_sample_scar.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_scar_schema.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_shrinker_oracle.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_stretch_stubs.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_trace_hypothesis.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_trace_schema.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_viewer_static.py +0 -0
- {grudge_cli-0.1.1 → grudge_cli-0.1.3}/tests/test_wilson.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.2
|
|
2
2
|
Name: grudge-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: Deterministic regression scars for agent mistakes.
|
|
5
5
|
Author: Grudge contributors
|
|
6
6
|
License: MIT
|
|
@@ -29,14 +29,21 @@ Agent failures are often buried in long, provider-dependent transcripts that are
|
|
|
29
29
|
|
|
30
30
|
## 30-second quickstart
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
32
|
+
Install the local Guard in a repository, then verify it:
|
|
33
|
+
|
|
34
|
+
```powershell
|
|
35
|
+
npx grudge-cli@latest setup
|
|
36
|
+
npx grudge-cli@latest doctor
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
For the complete Python offline demo, use Python 3.14.0 or another interpreter
|
|
40
|
+
supported by `pyproject.toml`, then run:
|
|
34
41
|
|
|
35
42
|
```bash
|
|
36
43
|
pip install -e . && grudge demo
|
|
37
44
|
```
|
|
38
45
|
|
|
39
|
-
The
|
|
46
|
+
The demo opens the local viewer and plays the five-beat story: capture the
|
|
40
47
|
vulnerable run, shrink its world, synthesize a predicate, prove red-on-bad and
|
|
41
48
|
green-on-fixed admission, then reintroduce the bug and block it. The demo is
|
|
42
49
|
offline and deterministic: it uses checked-in fake tools, scripted policies,
|
|
@@ -45,6 +52,42 @@ the public network. For a headless smoke run, use
|
|
|
45
52
|
`python -m grudge demo --no-browser --fast --json`. For the two-session
|
|
46
53
|
Claude-style hook proof, use `python -m grudge demo --guard --json`.
|
|
47
54
|
|
|
55
|
+
## Published packages
|
|
56
|
+
|
|
57
|
+
Grudge CLI `0.1.1` is published in both public package registries. Release
|
|
58
|
+
`0.1.2` is prepared locally but has not been published yet:
|
|
59
|
+
|
|
60
|
+
- **npm:** [`grudge-cli`](https://www.npmjs.com/package/grudge-cli)
|
|
61
|
+
- **PyPI:** [`grudge-cli`](https://pypi.org/project/grudge-cli/)
|
|
62
|
+
|
|
63
|
+
Install the Python CLI with:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
python -m pip install grudge-cli
|
|
67
|
+
grudge --help
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Both packages install a command named `grudge`. The Python package exposes the
|
|
71
|
+
full engine (`capture`, `compile`, `shrink`, `admit`, `run`, and `demo`); the npm
|
|
72
|
+
package exposes the local Node Guard (`setup`, `doctor`, `hook`, `propose`,
|
|
73
|
+
`scars`, `stats`, `report`, and `statusline`).
|
|
74
|
+
|
|
75
|
+
Install the Node.js setup wizard with:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npx grudge-cli@latest setup
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The setup wizard detects supported agent tools, lets you select agents with
|
|
82
|
+
arrow keys and Space, and asks whether to configure the current repository,
|
|
83
|
+
personal settings, or all projects.
|
|
84
|
+
|
|
85
|
+
When PowerShell strips DSL quotes, pass the rule on stdin instead:
|
|
86
|
+
|
|
87
|
+
```powershell
|
|
88
|
+
'never call shell where command ~ "GRUDGE_TEST"' | grudge propose --rule-stdin --why "harmless test rule" --preventive
|
|
89
|
+
```
|
|
90
|
+
|
|
48
91
|
### Install the local guard
|
|
49
92
|
|
|
50
93
|
These commands exercise the checkout's Node package from the repository root;
|
|
@@ -316,5 +359,6 @@ docker run --rm grudge:latest
|
|
|
316
359
|
- [Documentation index](docs/INDEX.md) — every documentation file and owner phase.
|
|
317
360
|
- [Roadmap](docs/roadmap.md) — every deferred stub and its design notes.
|
|
318
361
|
- [Demo guide](docs/demo-guide.md) — presenter, server, JSON, and shell operation.
|
|
362
|
+
- [Walkthrough test](TEST.md) — scratch-directory Guard walkthrough and release checks.
|
|
319
363
|
- [Pitch artifacts](pitch/one_liner.md) — one-liner, 90-second script, and slides.
|
|
320
364
|
- [Progress tracker](Progress.md) — canonical phase status.
|
|
@@ -1,24 +1,3 @@
|
|
|
1
|
-
Metadata-Version: 2.2
|
|
2
|
-
Name: grudge-cli
|
|
3
|
-
Version: 0.1.1
|
|
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
1
|
# Grudge
|
|
23
2
|
|
|
24
3
|
**Agents repeat mistakes. Grudge makes each one happen exactly once.**
|
|
@@ -27,49 +6,92 @@ Requires-Dist: mypy==1.18.2; extra == "dev"
|
|
|
27
6
|
|
|
28
7
|
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
8
|
|
|
30
|
-
## 30-second quickstart
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
`
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
9
|
+
## 30-second quickstart
|
|
10
|
+
|
|
11
|
+
Install the local Guard in a repository, then verify it:
|
|
12
|
+
|
|
13
|
+
```powershell
|
|
14
|
+
npx grudge-cli@latest setup
|
|
15
|
+
npx grudge-cli@latest doctor
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
For the complete Python offline demo, use Python 3.14.0 or another interpreter
|
|
19
|
+
supported by `pyproject.toml`, then run:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pip install -e . && grudge demo
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The demo opens the local viewer and plays the five-beat story: capture the
|
|
26
|
+
vulnerable run, shrink its world, synthesize a predicate, prove red-on-bad and
|
|
27
|
+
green-on-fixed admission, then reintroduce the bug and block it. The demo is
|
|
28
|
+
offline and deterministic: it uses checked-in fake tools, scripted policies,
|
|
29
|
+
the checked-in Scar, and the fallback predicate; it does not call a provider or
|
|
30
|
+
the public network. For a headless smoke run, use
|
|
31
|
+
`python -m grudge demo --no-browser --fast --json`. For the two-session
|
|
32
|
+
Claude-style hook proof, use `python -m grudge demo --guard --json`.
|
|
33
|
+
|
|
34
|
+
## Published packages
|
|
35
|
+
|
|
36
|
+
Grudge CLI `0.1.1` is published in both public package registries. Release
|
|
37
|
+
`0.1.2` is prepared locally but has not been published yet:
|
|
38
|
+
|
|
39
|
+
- **npm:** [`grudge-cli`](https://www.npmjs.com/package/grudge-cli)
|
|
40
|
+
- **PyPI:** [`grudge-cli`](https://pypi.org/project/grudge-cli/)
|
|
41
|
+
|
|
42
|
+
Install the Python CLI with:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
python -m pip install grudge-cli
|
|
46
|
+
grudge --help
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Both packages install a command named `grudge`. The Python package exposes the
|
|
50
|
+
full engine (`capture`, `compile`, `shrink`, `admit`, `run`, and `demo`); the npm
|
|
51
|
+
package exposes the local Node Guard (`setup`, `doctor`, `hook`, `propose`,
|
|
52
|
+
`scars`, `stats`, `report`, and `statusline`).
|
|
53
|
+
|
|
54
|
+
Install the Node.js setup wizard with:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
npx grudge-cli@latest setup
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
The setup wizard detects supported agent tools, lets you select agents with
|
|
61
|
+
arrow keys and Space, and asks whether to configure the current repository,
|
|
62
|
+
personal settings, or all projects.
|
|
63
|
+
|
|
64
|
+
When PowerShell strips DSL quotes, pass the rule on stdin instead:
|
|
65
|
+
|
|
66
|
+
```powershell
|
|
67
|
+
'never call shell where command ~ "GRUDGE_TEST"' | grudge propose --rule-stdin --why "harmless test rule" --preventive
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Install the local guard
|
|
71
|
+
|
|
72
|
+
These commands exercise the checkout's Node package from the repository root;
|
|
73
|
+
they do not resolve a package from the npm registry:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npm --prefix packages/grudge run build
|
|
77
|
+
npm --prefix packages/grudge run setup:repo
|
|
78
|
+
npm --prefix packages/grudge run doctor:repo
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
If `grudge` has been published, run the interactive registry setup with
|
|
82
|
+
`npx grudge-cli setup`. Use the arrow keys to move, Space to select agents, and
|
|
83
|
+
Enter to confirm the agent and scope choices. When working from `packages/grudge`, use `node dist/grudge.mjs`
|
|
84
|
+
and add `--cwd ../..` when the hooks should target the repository root. The
|
|
85
|
+
short package-directory commands are `npm run setup:repo` and
|
|
86
|
+
`npm run doctor:repo`. Do not combine `cd packages/grudge` with the
|
|
87
|
+
root-relative path `packages/grudge/dist/grudge.mjs`, or it resolves to
|
|
88
|
+
`packages/grudge/packages/grudge/dist/grudge.mjs`.
|
|
67
89
|
|
|
68
90
|
Claude Code is the verified **Guard** tier. Codex, Gemini CLI, GitHub Copilot,
|
|
69
91
|
OpenCode, and Windsurf are **Advisory** integrations; Cursor is unverified and
|
|
70
92
|
the installer writes no Cursor files. See [the integration matrix](docs/integrations.md).
|
|
71
|
-
Use `node packages/grudge/dist/grudge.mjs setup --dry-run` to inspect a plan and
|
|
72
|
-
`node packages/grudge/dist/grudge.mjs uninstall` to remove Grudge-managed files.
|
|
93
|
+
Use `node packages/grudge/dist/grudge.mjs setup --dry-run` to inspect a plan and
|
|
94
|
+
`node packages/grudge/dist/grudge.mjs uninstall` to remove Grudge-managed files.
|
|
73
95
|
|
|
74
96
|
## What the shrink shows
|
|
75
97
|
|
|
@@ -258,63 +280,64 @@ python scripts/generate_trace.py --steps 40 --output artifacts/phase12/trace.jso
|
|
|
258
280
|
It does not time shrinking or aggregate measurements automatically; benchmark
|
|
259
281
|
rows must be captured from a clean run and recorded with their environment.
|
|
260
282
|
|
|
261
|
-
## Checks and reproducibility
|
|
262
|
-
|
|
263
|
-
The default supported runtime is Python 3.14.0, recorded in `.python-version`.
|
|
264
|
-
The package supports Python 3.11 through 3.14, and the lockfile is
|
|
265
|
-
`requirements.lock`. The project Makefile keeps dependencies in a local virtual
|
|
266
|
-
environment:
|
|
283
|
+
## Checks and reproducibility
|
|
284
|
+
|
|
285
|
+
The default supported runtime is Python 3.14.0, recorded in `.python-version`.
|
|
286
|
+
The package supports Python 3.11 through 3.14, and the lockfile is
|
|
287
|
+
`requirements.lock`. The project Makefile keeps dependencies in a local virtual
|
|
288
|
+
environment:
|
|
267
289
|
|
|
268
290
|
```bash
|
|
269
291
|
make install
|
|
270
|
-
make test
|
|
271
|
-
make lint
|
|
272
|
-
make typecheck
|
|
273
|
-
make docs-check
|
|
274
|
-
make all
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
### Clean Linux commands
|
|
278
|
-
|
|
279
|
-
From a fresh checkout, the shortest reproducible workflow is:
|
|
280
|
-
|
|
281
|
-
```bash
|
|
282
|
-
git clone https://github.com/harshithKumar12/Grudge.git
|
|
283
|
-
cd Grudge
|
|
284
|
-
# Debian/Ubuntu only, if Python reports that ensurepip is unavailable:
|
|
285
|
-
# sudo apt-get install python3.14-venv
|
|
286
|
-
python3.14 --version
|
|
287
|
-
make PYTHON=python3.14 install
|
|
288
|
-
make test
|
|
289
|
-
make demo
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
The host prerequisites are Python 3.14 with its `venv` module and GNU Make.
|
|
293
|
-
Node.js 18+ is optional for the JavaScript package tests; the Python tests and
|
|
294
|
-
demo do not require Node.js.
|
|
295
|
-
|
|
296
|
-
`make test` runs the Python suite and the Node package suite when Node.js 18+
|
|
297
|
-
is installed; it remains usable on a Python-only machine. The headless proof
|
|
298
|
-
is useful in CI:
|
|
299
|
-
|
|
300
|
-
```bash
|
|
301
|
-
.venv/bin/python -m grudge demo --guard --json
|
|
302
|
-
```
|
|
303
|
-
|
|
304
|
-
The offline path needs no API keys or real personal data. Copy `.env.example`
|
|
305
|
-
only when experimenting with the optional provider boundary; never commit a
|
|
306
|
-
key. Docker remains an optional reproducibility path:
|
|
307
|
-
|
|
308
|
-
```bash
|
|
309
|
-
docker build -t grudge:latest .
|
|
310
|
-
docker run --rm grudge:latest
|
|
311
|
-
```
|
|
292
|
+
make test
|
|
293
|
+
make lint
|
|
294
|
+
make typecheck
|
|
295
|
+
make docs-check
|
|
296
|
+
make all
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Clean Linux commands
|
|
300
|
+
|
|
301
|
+
From a fresh checkout, the shortest reproducible workflow is:
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
git clone https://github.com/harshithKumar12/Grudge.git
|
|
305
|
+
cd Grudge
|
|
306
|
+
# Debian/Ubuntu only, if Python reports that ensurepip is unavailable:
|
|
307
|
+
# sudo apt-get install python3.14-venv
|
|
308
|
+
python3.14 --version
|
|
309
|
+
make PYTHON=python3.14 install
|
|
310
|
+
make test
|
|
311
|
+
make demo
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
The host prerequisites are Python 3.14 with its `venv` module and GNU Make.
|
|
315
|
+
Node.js 18+ is optional for the JavaScript package tests; the Python tests and
|
|
316
|
+
demo do not require Node.js.
|
|
317
|
+
|
|
318
|
+
`make test` runs the Python suite and the Node package suite when Node.js 18+
|
|
319
|
+
is installed; it remains usable on a Python-only machine. The headless proof
|
|
320
|
+
is useful in CI:
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
.venv/bin/python -m grudge demo --guard --json
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
The offline path needs no API keys or real personal data. Copy `.env.example`
|
|
327
|
+
only when experimenting with the optional provider boundary; never commit a
|
|
328
|
+
key. Docker remains an optional reproducibility path:
|
|
329
|
+
|
|
330
|
+
```bash
|
|
331
|
+
docker build -t grudge:latest .
|
|
332
|
+
docker run --rm grudge:latest
|
|
333
|
+
```
|
|
312
334
|
|
|
313
335
|
## Repository guide
|
|
314
336
|
|
|
315
337
|
- [Architecture](docs/architecture.md) — contracts and pipeline boundaries.
|
|
316
338
|
- [Documentation index](docs/INDEX.md) — every documentation file and owner phase.
|
|
317
339
|
- [Roadmap](docs/roadmap.md) — every deferred stub and its design notes.
|
|
318
|
-
- [Demo guide](docs/demo-guide.md) — presenter, server, JSON, and shell operation.
|
|
340
|
+
- [Demo guide](docs/demo-guide.md) — presenter, server, JSON, and shell operation.
|
|
341
|
+
- [Walkthrough test](TEST.md) — scratch-directory Guard walkthrough and release checks.
|
|
319
342
|
- [Pitch artifacts](pitch/one_liner.md) — one-liner, 90-second script, and slides.
|
|
320
343
|
- [Progress tracker](Progress.md) — canonical phase status.
|
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
Metadata-Version: 2.2
|
|
2
|
+
Name: grudge-cli
|
|
3
|
+
Version: 0.1.3
|
|
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
|
+
|
|
1
22
|
# Grudge
|
|
2
23
|
|
|
3
24
|
**Agents repeat mistakes. Grudge makes each one happen exactly once.**
|
|
@@ -8,47 +29,90 @@ Agent failures are often buried in long, provider-dependent transcripts that are
|
|
|
8
29
|
|
|
9
30
|
## 30-second quickstart
|
|
10
31
|
|
|
11
|
-
|
|
12
|
-
|
|
32
|
+
Install the local Guard in a repository, then verify it:
|
|
33
|
+
|
|
34
|
+
```powershell
|
|
35
|
+
npx grudge-cli@latest setup
|
|
36
|
+
npx grudge-cli@latest doctor
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
For the complete Python offline demo, use Python 3.14.0 or another interpreter
|
|
40
|
+
supported by `pyproject.toml`, then run:
|
|
13
41
|
|
|
14
42
|
```bash
|
|
15
43
|
pip install -e . && grudge demo
|
|
16
44
|
```
|
|
17
45
|
|
|
18
|
-
The
|
|
46
|
+
The demo opens the local viewer and plays the five-beat story: capture the
|
|
19
47
|
vulnerable run, shrink its world, synthesize a predicate, prove red-on-bad and
|
|
20
48
|
green-on-fixed admission, then reintroduce the bug and block it. The demo is
|
|
21
49
|
offline and deterministic: it uses checked-in fake tools, scripted policies,
|
|
22
50
|
the checked-in Scar, and the fallback predicate; it does not call a provider or
|
|
23
|
-
the public network. For a headless smoke run, use
|
|
24
|
-
`python -m grudge demo --no-browser --fast --json`. For the two-session
|
|
25
|
-
Claude-style hook proof, use `python -m grudge demo --guard --json`.
|
|
51
|
+
the public network. For a headless smoke run, use
|
|
52
|
+
`python -m grudge demo --no-browser --fast --json`. For the two-session
|
|
53
|
+
Claude-style hook proof, use `python -m grudge demo --guard --json`.
|
|
54
|
+
|
|
55
|
+
## Published packages
|
|
56
|
+
|
|
57
|
+
Grudge CLI `0.1.1` is published in both public package registries. Release
|
|
58
|
+
`0.1.2` is prepared locally but has not been published yet:
|
|
59
|
+
|
|
60
|
+
- **npm:** [`grudge-cli`](https://www.npmjs.com/package/grudge-cli)
|
|
61
|
+
- **PyPI:** [`grudge-cli`](https://pypi.org/project/grudge-cli/)
|
|
62
|
+
|
|
63
|
+
Install the Python CLI with:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
python -m pip install grudge-cli
|
|
67
|
+
grudge --help
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Both packages install a command named `grudge`. The Python package exposes the
|
|
71
|
+
full engine (`capture`, `compile`, `shrink`, `admit`, `run`, and `demo`); the npm
|
|
72
|
+
package exposes the local Node Guard (`setup`, `doctor`, `hook`, `propose`,
|
|
73
|
+
`scars`, `stats`, `report`, and `statusline`).
|
|
74
|
+
|
|
75
|
+
Install the Node.js setup wizard with:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
npx grudge-cli@latest setup
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The setup wizard detects supported agent tools, lets you select agents with
|
|
82
|
+
arrow keys and Space, and asks whether to configure the current repository,
|
|
83
|
+
personal settings, or all projects.
|
|
84
|
+
|
|
85
|
+
When PowerShell strips DSL quotes, pass the rule on stdin instead:
|
|
86
|
+
|
|
87
|
+
```powershell
|
|
88
|
+
'never call shell where command ~ "GRUDGE_TEST"' | grudge propose --rule-stdin --why "harmless test rule" --preventive
|
|
89
|
+
```
|
|
26
90
|
|
|
27
91
|
### Install the local guard
|
|
28
92
|
|
|
29
|
-
These commands exercise the checkout's Node package from the repository root;
|
|
30
|
-
they do not resolve a package from the npm registry:
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
npm --prefix packages/grudge run build
|
|
34
|
-
npm --prefix packages/grudge run setup:repo
|
|
35
|
-
npm --prefix packages/grudge run doctor:repo
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
If `grudge` has been published, run the interactive registry setup with
|
|
39
|
-
`npx grudge-cli setup`. Use the arrow keys to move, Space to select agents, and
|
|
40
|
-
Enter to confirm the agent and scope choices. When working from `packages/grudge`, use `node dist/grudge.mjs`
|
|
41
|
-
and add `--cwd ../..` when the hooks should target the repository root. The
|
|
42
|
-
short package-directory commands are `npm run setup:repo` and
|
|
43
|
-
`npm run doctor:repo`. Do not combine `cd packages/grudge` with the
|
|
44
|
-
root-relative path `packages/grudge/dist/grudge.mjs`, or it resolves to
|
|
45
|
-
`packages/grudge/packages/grudge/dist/grudge.mjs`.
|
|
93
|
+
These commands exercise the checkout's Node package from the repository root;
|
|
94
|
+
they do not resolve a package from the npm registry:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
npm --prefix packages/grudge run build
|
|
98
|
+
npm --prefix packages/grudge run setup:repo
|
|
99
|
+
npm --prefix packages/grudge run doctor:repo
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
If `grudge` has been published, run the interactive registry setup with
|
|
103
|
+
`npx grudge-cli setup`. Use the arrow keys to move, Space to select agents, and
|
|
104
|
+
Enter to confirm the agent and scope choices. When working from `packages/grudge`, use `node dist/grudge.mjs`
|
|
105
|
+
and add `--cwd ../..` when the hooks should target the repository root. The
|
|
106
|
+
short package-directory commands are `npm run setup:repo` and
|
|
107
|
+
`npm run doctor:repo`. Do not combine `cd packages/grudge` with the
|
|
108
|
+
root-relative path `packages/grudge/dist/grudge.mjs`, or it resolves to
|
|
109
|
+
`packages/grudge/packages/grudge/dist/grudge.mjs`.
|
|
46
110
|
|
|
47
111
|
Claude Code is the verified **Guard** tier. Codex, Gemini CLI, GitHub Copilot,
|
|
48
112
|
OpenCode, and Windsurf are **Advisory** integrations; Cursor is unverified and
|
|
49
113
|
the installer writes no Cursor files. See [the integration matrix](docs/integrations.md).
|
|
50
|
-
Use `node packages/grudge/dist/grudge.mjs setup --dry-run` to inspect a plan and
|
|
51
|
-
`node packages/grudge/dist/grudge.mjs uninstall` to remove Grudge-managed files.
|
|
114
|
+
Use `node packages/grudge/dist/grudge.mjs setup --dry-run` to inspect a plan and
|
|
115
|
+
`node packages/grudge/dist/grudge.mjs uninstall` to remove Grudge-managed files.
|
|
52
116
|
|
|
53
117
|
## What the shrink shows
|
|
54
118
|
|
|
@@ -237,57 +301,57 @@ python scripts/generate_trace.py --steps 40 --output artifacts/phase12/trace.jso
|
|
|
237
301
|
It does not time shrinking or aggregate measurements automatically; benchmark
|
|
238
302
|
rows must be captured from a clean run and recorded with their environment.
|
|
239
303
|
|
|
240
|
-
## Checks and reproducibility
|
|
241
|
-
|
|
242
|
-
The default supported runtime is Python 3.14.0, recorded in `.python-version`.
|
|
243
|
-
The package supports Python 3.11 through 3.14, and the lockfile is
|
|
244
|
-
`requirements.lock`. The project Makefile keeps dependencies in a local virtual
|
|
245
|
-
environment:
|
|
304
|
+
## Checks and reproducibility
|
|
305
|
+
|
|
306
|
+
The default supported runtime is Python 3.14.0, recorded in `.python-version`.
|
|
307
|
+
The package supports Python 3.11 through 3.14, and the lockfile is
|
|
308
|
+
`requirements.lock`. The project Makefile keeps dependencies in a local virtual
|
|
309
|
+
environment:
|
|
246
310
|
|
|
247
311
|
```bash
|
|
248
312
|
make install
|
|
249
|
-
make test
|
|
250
|
-
make lint
|
|
251
|
-
make typecheck
|
|
252
|
-
make docs-check
|
|
253
|
-
make all
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
### Clean Linux commands
|
|
257
|
-
|
|
258
|
-
From a fresh checkout, the shortest reproducible workflow is:
|
|
259
|
-
|
|
260
|
-
```bash
|
|
261
|
-
git clone https://github.com/harshithKumar12/Grudge.git
|
|
262
|
-
cd Grudge
|
|
263
|
-
# Debian/Ubuntu only, if Python reports that ensurepip is unavailable:
|
|
264
|
-
# sudo apt-get install python3.14-venv
|
|
265
|
-
python3.14 --version
|
|
266
|
-
make PYTHON=python3.14 install
|
|
267
|
-
make test
|
|
268
|
-
make demo
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
The host prerequisites are Python 3.14 with its `venv` module and GNU Make.
|
|
272
|
-
Node.js 18+ is optional for the JavaScript package tests; the Python tests and
|
|
273
|
-
demo do not require Node.js.
|
|
274
|
-
|
|
275
|
-
`make test` runs the Python suite and the Node package suite when Node.js 18+
|
|
276
|
-
is installed; it remains usable on a Python-only machine. The headless proof
|
|
277
|
-
is useful in CI:
|
|
278
|
-
|
|
279
|
-
```bash
|
|
280
|
-
.venv/bin/python -m grudge demo --guard --json
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
The offline path needs no API keys or real personal data. Copy `.env.example`
|
|
284
|
-
only when experimenting with the optional provider boundary; never commit a
|
|
285
|
-
key. Docker remains an optional reproducibility path:
|
|
286
|
-
|
|
287
|
-
```bash
|
|
288
|
-
docker build -t grudge:latest .
|
|
289
|
-
docker run --rm grudge:latest
|
|
290
|
-
```
|
|
313
|
+
make test
|
|
314
|
+
make lint
|
|
315
|
+
make typecheck
|
|
316
|
+
make docs-check
|
|
317
|
+
make all
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
### Clean Linux commands
|
|
321
|
+
|
|
322
|
+
From a fresh checkout, the shortest reproducible workflow is:
|
|
323
|
+
|
|
324
|
+
```bash
|
|
325
|
+
git clone https://github.com/harshithKumar12/Grudge.git
|
|
326
|
+
cd Grudge
|
|
327
|
+
# Debian/Ubuntu only, if Python reports that ensurepip is unavailable:
|
|
328
|
+
# sudo apt-get install python3.14-venv
|
|
329
|
+
python3.14 --version
|
|
330
|
+
make PYTHON=python3.14 install
|
|
331
|
+
make test
|
|
332
|
+
make demo
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
The host prerequisites are Python 3.14 with its `venv` module and GNU Make.
|
|
336
|
+
Node.js 18+ is optional for the JavaScript package tests; the Python tests and
|
|
337
|
+
demo do not require Node.js.
|
|
338
|
+
|
|
339
|
+
`make test` runs the Python suite and the Node package suite when Node.js 18+
|
|
340
|
+
is installed; it remains usable on a Python-only machine. The headless proof
|
|
341
|
+
is useful in CI:
|
|
342
|
+
|
|
343
|
+
```bash
|
|
344
|
+
.venv/bin/python -m grudge demo --guard --json
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
The offline path needs no API keys or real personal data. Copy `.env.example`
|
|
348
|
+
only when experimenting with the optional provider boundary; never commit a
|
|
349
|
+
key. Docker remains an optional reproducibility path:
|
|
350
|
+
|
|
351
|
+
```bash
|
|
352
|
+
docker build -t grudge:latest .
|
|
353
|
+
docker run --rm grudge:latest
|
|
354
|
+
```
|
|
291
355
|
|
|
292
356
|
## Repository guide
|
|
293
357
|
|
|
@@ -295,5 +359,6 @@ docker run --rm grudge:latest
|
|
|
295
359
|
- [Documentation index](docs/INDEX.md) — every documentation file and owner phase.
|
|
296
360
|
- [Roadmap](docs/roadmap.md) — every deferred stub and its design notes.
|
|
297
361
|
- [Demo guide](docs/demo-guide.md) — presenter, server, JSON, and shell operation.
|
|
362
|
+
- [Walkthrough test](TEST.md) — scratch-directory Guard walkthrough and release checks.
|
|
298
363
|
- [Pitch artifacts](pitch/one_liner.md) — one-liner, 90-second script, and slides.
|
|
299
364
|
- [Progress tracker](Progress.md) — canonical phase status.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|