simplicio-cli 0.2.12__tar.gz → 0.4.1__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.
Files changed (36) hide show
  1. {simplicio_cli-0.2.12/simplicio_cli.egg-info → simplicio_cli-0.4.1}/PKG-INFO +300 -26
  2. simplicio_cli-0.4.1/README.md +663 -0
  3. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/pyproject.toml +6 -1
  4. simplicio_cli-0.4.1/simplicio/adaptive.py +60 -0
  5. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio/bench.py +32 -7
  6. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio/init.py +5 -4
  7. simplicio_cli-0.4.1/simplicio/mapper.py +207 -0
  8. simplicio_cli-0.4.1/simplicio/observability.py +32 -0
  9. simplicio_cli-0.4.1/simplicio/pipeline.py +100 -0
  10. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio/precedent.py +19 -0
  11. simplicio_cli-0.4.1/simplicio/prompt.py +56 -0
  12. simplicio_cli-0.4.1/simplicio/providers.py +142 -0
  13. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio/templates/simplicio_prompt.md +2 -0
  14. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio/templates/userpromptsubmit-hook.sh +8 -0
  15. simplicio_cli-0.4.1/simplicio/utils/__init__.py +8 -0
  16. simplicio_cli-0.4.1/simplicio/utils/cache.py +84 -0
  17. simplicio_cli-0.4.1/simplicio/utils/http_client.py +72 -0
  18. simplicio_cli-0.4.1/simplicio/utils/serialization.py +45 -0
  19. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1/simplicio_cli.egg-info}/PKG-INFO +300 -26
  20. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio_cli.egg-info/SOURCES.txt +7 -0
  21. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio_cli.egg-info/requires.txt +5 -0
  22. simplicio_cli-0.2.12/README.md +0 -394
  23. simplicio_cli-0.2.12/simplicio/pipeline.py +0 -28
  24. simplicio_cli-0.2.12/simplicio/prompt.py +0 -25
  25. simplicio_cli-0.2.12/simplicio/providers.py +0 -63
  26. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/LICENSE +0 -0
  27. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/setup.cfg +0 -0
  28. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio/__init__.py +0 -0
  29. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio/cache.py +0 -0
  30. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio/cli.py +0 -0
  31. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio/detect.py +0 -0
  32. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio/skill_router.py +0 -0
  33. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio/templates/SKILL.md +0 -0
  34. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio_cli.egg-info/dependency_links.txt +0 -0
  35. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio_cli.egg-info/entry_points.txt +0 -0
  36. {simplicio_cli-0.2.12 → simplicio_cli-0.4.1}/simplicio_cli.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simplicio-cli
3
- Version: 0.2.12
3
+ Version: 0.4.1
4
4
  Summary: Portable task-to-code pipeline that works with any LLM. Turn a one-line task into a verified code change — diff + test + verify loop. +55 pts on a 156-check benchmark, 21% faster, ~same tokens.
5
5
  Author-email: Wesley Simplicio <wesleybob4@gmail.com>
6
6
  License: MIT
@@ -31,6 +31,11 @@ Requires-Dist: sentence-transformers>=2.2
31
31
  Requires-Dist: numpy>=1.23
32
32
  Requires-Dist: anthropic>=0.30
33
33
  Requires-Dist: openai>=1.30
34
+ Requires-Dist: simplicio-mapper>=0.6.0
35
+ Requires-Dist: simplicio-prompt>=1.9.0
36
+ Requires-Dist: httpx>=0.27
37
+ Requires-Dist: orjson>=3.10
38
+ Requires-Dist: diskcache>=5.6
34
39
  Provides-Extra: bench
35
40
  Requires-Dist: fpdf2>=2.7; extra == "bench"
36
41
  Dynamic: license-file
@@ -46,7 +51,9 @@ Dynamic: license-file
46
51
  [![simplicio-cli pipeline hero: one-line task to verified code change](https://raw.githubusercontent.com/wesleysimplicio/simplicio-cli/master/output/imagegen/simplicio-cli-readme-hero-web.png)](output/imagegen/simplicio-cli-readme-hero.png)
47
52
 
48
53
  > *"hide the Delete button for non-admins"* → diff + test + applied + verified.
49
- > Works with **OpenRouter, OpenAI, Anthropic, GLM, DeepSeek, Ollama** one env var.
54
+ > **Zero API key inside Claude Code** (auto-installs, uses your subscription) or
55
+ > bring your own key for any provider: OpenRouter, OpenAI, Anthropic, GLM,
56
+ > DeepSeek, Ollama.
50
57
 
51
58
  ```bash
52
59
  pip install simplicio-cli
@@ -56,10 +63,125 @@ pip install simplicio-cli
56
63
 
57
64
  ## Why it works — the numbers
58
65
 
66
+ Two complementary benchmarks measure different things. Read them in order.
67
+
68
+ ### 1. Execution benchmark — real project, real tasks, real test suite (the "does it work" answer)
69
+
70
+ **This is not regex pattern-matching. This is not a synthetic toy harness in
71
+ isolation.** Run against [`wesleysimplicio/sistema-sindico`](https://github.com/wesleysimplicio/sistema-sindico)
72
+ — a real condominium-management system in pure PHP 8, public on GitHub, with a
73
+ real PHPUnit suite (`vendor/bin/phpunit --configuration phpunit.xml.dist`).
74
+
75
+ For each task the model is asked for a **real engineering change** — add a new
76
+ method to an existing production class (permission helper, env parser,
77
+ rate-limit key builder, repository SQL builder, route introspection, etc.).
78
+ The generated file replaces the original in a working copy of the real repo;
79
+ a **hidden PHPUnit test** (never shown to the model, asserting BOTH true and
80
+ false states of the required behaviour) is dropped into
81
+ `tests/unit/Core/Hidden/`; the **entire production suite runs** (every
82
+ pre-existing test of the real codebase plus the hidden one). **Pass =
83
+ `phpunit` exit code 0** — the same green/red signal the project's CI would use
84
+ to merge a PR. The model's change must be *correct* (the new test passes) AND
85
+ must *not break existing behaviour* (every prior test still passes).
86
+
87
+ All sides emit the complete file (identical output shape); the only variable
88
+ is the wrapping prompt.
89
+
90
+ 4 tasks · **9 models** (3 small · 3 mid · 3 frontier) · 2 sides = **36 runs per side**, scored by `vendor/bin/phpunit` exit code on 2026-05-28. Both sides emit the complete file; the only variable is whether the goal is wrapped in the simplicio contract:
91
+
92
+ | Tier | Model | Without simplicio | With simplicio | Gain |
93
+ |---|---|---|---|---|
94
+ | small | **Llama 3.2 1B** (`meta-llama/Llama-3.2-1B-Instruct`) | 0% | 0% | 0 pts |
95
+ | small | **Gemma 3n e4B** (`google/gemma-3n-E4B-it`) | 0% | 0% | 0 pts |
96
+ | small | **Gemma 3 4B** (`google/gemma-3-4b-it`) | 0% | **75%** | **+75 pts** |
97
+ | mid | **Qwen 2.5 7B** (`qwen/qwen-2.5-7b-instruct`) | 0% | **25%** | **+25 pts** |
98
+ | mid | **Llama 3.1 8B** (`meta-llama/Llama-3.1-8B-Instruct`) | 50% | **100%** | **+50 pts** |
99
+ | mid | **Gemma 3 12B** (`google/gemma-3-12b-it`) | 50% | **75%** | **+25 pts** |
100
+ | frontier | **Gemini 3.5 Flash** (`google/gemini-3.5-flash`) | 75% | **100%** | **+25 pts** |
101
+ | frontier | **Claude Opus 4.7** (`anthropic/claude-opus-4.7`) | 50% | **100%** | **+50 pts** |
102
+ | frontier | **GPT-5.5** (`openai/gpt-5.5`) | 75% | **100%** | **+25 pts** |
103
+ | **Headline (9 models · 4 tasks · 36 runs/side)** | | **33%** | **64%** | **+31 pts** |
104
+
105
+ > Every model with baseline capability to emit valid PHP gains **+25 to +75
106
+ > points** when the task is wrapped in the simplicio contract. The **two
107
+ > sub-2B/4B-MoE models score 0% on both sides** — they can't produce a
108
+ > parseable PHP file regardless of prompt — so the contract has nothing to
109
+ > amplify. Honest scope: simplicio multiplies capable models, it does not
110
+ > create capability in tiny ones. Three frontier models hit **100%** with the
111
+ > contract.
112
+
113
+ Full report: [`bench/results_exec_sindico.md`](bench/results_exec_sindico.md) ·
114
+ [`bench/results_exec_sindico.pdf`](bench/results_exec_sindico.pdf). Reproduce:
115
+ clone `sistema-sindico` (public), `composer install`, then
116
+ `BENCH_BASE_URL=… BENCH_API_KEY=… BENCH_MODELS=…
117
+ python3 bench/run_exec_sindico.py`. Hidden tests live under
118
+ `bench/sindico_hidden/`; harness in `bench/run_exec_sindico.py`.
119
+
120
+ ### 2. Contract-adherence benchmark — structural checks across many models
121
+
122
+ The tables below measure something **narrower and complementary**: did the
123
+ model produce **the right shape of actionable output** (target-file mention +
124
+ DIFF block + TEST block + contract-state keywords) on a raw one-line prompt
125
+ vs. the simplicio contract. Scoring is via **deterministic regex** on the
126
+ output — it's not a proof that the code compiles or passes runtime tests.
127
+ That's what the execution benchmark above is for. The two answer different
128
+ questions: this one measures *contract adherence at scale across many models*;
129
+ the execution one measures *runtime correctness on a real codebase*.
130
+
59
131
  Same model. Same task. Only the prompt changes. **Measured, reproducible, deterministic.**
60
- **Fourteen models tested across three runs** — five sub-4B tiny models, six
61
- frontier 2026 models, and three mid-tier 7B–12B open models. Every one gained
62
- at least **+14 points** when wrapped in simplicio's 6-layer contract.
132
+ **Seventeen models tested across four runs** — three local Ollama models on an
133
+ M1 MacBook (8 GB), five sub-4B tiny models, six frontier 2026 models, and three
134
+ mid-tier 7B–12B open models. Every one gained at least **+14 points** when
135
+ wrapped in simplicio's 6-layer contract.
136
+
137
+ #### Hugging Face — Qwen2.5-Coder, re-run on 2026-05-27 (latest mapper, 10 cases/side, 156 checks)
138
+
139
+ First batch of the smaller→larger re-benchmark against the latest
140
+ `simplicio-mapper` artifacts. The 1.5B runs on CPU via `transformers`
141
+ (Hugging Face Inference Providers does not serve it); the 3B and 7B run
142
+ through the HF router (`https://router.huggingface.co/v1`).
143
+
144
+ | Model | Without simplicio | With simplicio | Gain |
145
+ |---|---|---|---|
146
+ | **Qwen 2.5 Coder 7B** (`Qwen/Qwen2.5-Coder-7B-Instruct`) | 38% | **96%** | **+58 pts** |
147
+ | **Qwen 2.5 Coder 3B** (`Qwen/Qwen2.5-Coder-3B-Instruct`) | 34% | **94%** | **+60 pts** |
148
+ | **Qwen 2.5 Coder 1.5B** (`Qwen/Qwen2.5-Coder-1.5B-Instruct`, local CPU) | 30% | **92%** | **+62 pts** |
149
+ | **HF avg (3 models · 10 cases · 156 checks)** | **34%** | **94%** | **+60 pts (+172%)** |
150
+
151
+ > Monotonic from smaller to larger: pass-rate with simplicio climbs **92% →
152
+ > 94% → 96%** as the model grows, while the raw-prompt baseline stays at
153
+ > **30–38%**. The 1.5B model gains the most (**+62 pts**) — the contract does
154
+ > the heaviest lifting where the model is weakest. Reproduce:
155
+ > `BENCH_BASE_URL=https://router.huggingface.co/v1 BENCH_API_KEY=<hf-token>
156
+ > BENCH_MODELS="local:Qwen/Qwen2.5-Coder-1.5B-Instruct,Qwen/Qwen2.5-Coder-3B-Instruct,Qwen/Qwen2.5-Coder-7B-Instruct"
157
+ > python3 bench/run_offline.py`.
158
+
159
+ Side-by-side delta vs the previously published numbers (same regex methodology,
160
+ all 17 README models re-measured):
161
+ [`bench/results_comparison.md`](bench/results_comparison.md) ·
162
+ [`bench/results_comparison.pdf`](bench/results_comparison.pdf). Headline on the
163
+ 14 models with clean data: **with simplicio averaged 86% → 88% (+2 pts); without
164
+ simplicio 36% → 36% (+1 pt)** — the new run reproduces the published numbers
165
+ within noise. Three frontier models (Claude Opus 4.7, Qwen 3.7 Max, DeepSeek V4
166
+ Pro) show `n/a` for the new column: their OpenRouter calls hit account-level
167
+ HTTP 402 / provider failures on >50% of requests this round, so the sample is
168
+ too small to publish; their old numbers still stand.
169
+
170
+ #### Local offline — qwen2.5-coder on Ollama, M1 8 GB, run on 2026-05-27 (30 runs/side, 156 checks)
171
+
172
+ | Model | Without simplicio | With simplicio | Gain |
173
+ |---|---|---|---|
174
+ | **Qwen 2.5 Coder 7B** (`qwen2.5-coder:7b`) | 36% | **92%** | **+56 pts** |
175
+ | **Qwen 2.5 Coder 3B** (`qwen2.5-coder:3b`) | 34% | **82%** | **+48 pts** |
176
+ | **Qwen 2.5 Coder 1.5B** (`qwen2.5-coder:1.5b`) | 32% | **88%** | **+56 pts** |
177
+ | **Local avg (3 models · 10 cases · 156 checks)** | **34%** | **87%** | **+53 pts (+156%)** |
178
+
179
+ > **Zero API key, zero network.** Bench ran fully offline against
180
+ > `http://localhost:11434/v1` (Ollama's OpenAI-compatible endpoint). A
181
+ > 1.5B-param model running on a 4-year-old laptop reaches **88%** pass-rate
182
+ > with simplicio's contract — same hardware, same model, raw prompt = 32%.
183
+ > Reproduce: `BENCH_BASE_URL=http://localhost:11434/v1 BENCH_API_KEY=ollama
184
+ > BENCH_MODELS="qwen2.5-coder:7b" python3 bench/run_offline.py`.
63
185
 
64
186
  #### Tiny models — sub-4B, run on 2026-05-26 (50 runs/side, 260 checks)
65
187
 
@@ -98,11 +220,12 @@ at least **+14 points** when wrapped in simplicio's 6-layer contract.
98
220
  | **Qwen 2.5 7B** (`qwen/qwen-2.5-7b-instruct`) | 34% | **88%** | **+54 pts** |
99
221
  | **Mid-tier avg (3 models · 10 cases · 156 checks)** | **35%** | **90%** | **+55 pts (+156%)** |
100
222
 
101
- > **Across all 14 models tested across three runs**, the average gain is **+51
223
+ > **Across all 17 models tested across four runs**, the average gain is **+51
102
224
  > points**. Smallest: **+14 pts** (Llama 3.2 1B — the contract still moves a
103
- > 1B-param model). Largest: **+62 pts** (GPT-5.5). The contract helps tiny
104
- > sub-4B models, frontier reasoning models, and mid-tier 7B–12B alike — five
105
- > of the six frontier models hit **100% pass-rate**.
225
+ > 1B-param model). Largest: **+62 pts** (GPT-5.5). The contract helps local
226
+ > Ollama models on a 4-year-old laptop, tiny sub-4B models, frontier reasoning
227
+ > models, and mid-tier 7B–12B alike — five of the six frontier models hit
228
+ > **100% pass-rate**.
106
229
 
107
230
  ### Output-quality signals (rate across all 60 frontier runs)
108
231
 
@@ -149,6 +272,26 @@ test JUDGE contract written as testable states
149
272
  verify PROOF ran it — did it actually pass? loop-fix up to 3x
150
273
  ```
151
274
 
275
+ ### Rich mapper integration
276
+
277
+ When `simplicio-mapper` has generated `.simplicio/project-map.json` and
278
+ `.simplicio/precedent-index.json`, `simplicio-cli` consumes them directly:
279
+
280
+ - exact target file metadata, roles, imports and exports
281
+ - entry points, test files, modules, entities and architecture signals
282
+ - recent changes and changed-file context
283
+ - precedent snippets ranked from `precedent-index.json`
284
+
285
+ If those artifacts are missing, the CLI falls back to the older target-file
286
+ inspection path, so existing projects keep working.
287
+
288
+ ### Adaptive retry and observability
289
+
290
+ The retry loop now validates generated output before applying/testing it,
291
+ classifies failures, and sends targeted retry feedback. Bench and pipeline runs
292
+ can append lightweight JSONL records to `.simplicio/runs.jsonl` with prompt
293
+ variant, model/provider, estimated tokens, target, mode and failure class.
294
+
152
295
  **The idea in one line: don't ask the model to guess — hand it the path.**
153
296
  Each layer terminates one decision the model would otherwise hallucinate.
154
297
  Relevant > complete — inject the *right* context, never *all* of it.
@@ -158,12 +301,109 @@ Relevant > complete — inject the *right* context, never *all* of it.
158
301
  ## Install
159
302
 
160
303
  ```bash
161
- pip install simplicio-cli # from PyPI
304
+ pip install simplicio-cli # from PyPI (pulls simplicio-mapper + simplicio-prompt)
162
305
  # or
163
306
  pip install -e . # from this repo
164
307
  ```
165
308
 
166
- ### Auto-activation in Claude Code (often zero-step)
309
+ The install ships **three Simplicio packages** that play distinct roles:
310
+
311
+ - **`simplicio-cli`** (this repo) — the 6-layer task contract + verify loop.
312
+ The default wrapper for one-shot code edits. *Headline: +31 pts vs raw
313
+ baseline on real PHPUnit (see Section 1).*
314
+ - **`simplicio-mapper`** — emits `.simplicio/project-map.json` and
315
+ `precedent-index.json` so the CLI can target the right file/precedent
316
+ without guessing.
317
+ - **`simplicio-prompt`** (≥1.7.0) — the Tuple-Space + Yool agent runtime
318
+ kernel (`kernel.subagent_runtime.SubagentRuntime`) for orchestrated work:
319
+ real parallel subagent fan-out on any OpenAI-compatible provider, with
320
+ bounded lane concurrency, a receipt cache, jittered backoff and a
321
+ circuit breaker. *On one-shot code tasks it's net-neutral and not the
322
+ right tool (use simplicio-cli for those); on orchestrated multi-step /
323
+ fan-out work it's the engine.* Our chosen fan-out default for this
324
+ project is **N=200** subagents — the level where harder tasks start to
325
+ recover from per-call noise (partial Qwen2.5-Coder-3B data:
326
+ `env_get_int` at N=64 → 0 PHPUnit passes of 64; at higher N some tasks
327
+ flip to passing). The fan-out benchmark
328
+ (`bench/run_fanout.py`) measures both real PHPUnit pass-rate and a
329
+ structural regex check on every subagent and surfaces the gap; full
330
+ ongoing numbers in [`bench/results_fanout.md`](bench/results_fanout.md) ·
331
+ [`bench/results_fanout.pdf`](bench/results_fanout.pdf).
332
+
333
+ Each is independently published on PyPI; ship them as a set so the CLI's
334
+ mapper-rich precedent ranking, contract-shaped prompts, and (when called
335
+ for) real subagent fan-out all work out of the box without extra setup.
336
+
337
+ ---
338
+
339
+ ## How you use it — pick your path
340
+
341
+ simplicio-cli has **three distinct entry points**. Same engine, three front doors — pick the one that matches what you already pay for:
342
+
343
+ | You have | Path | LLM call goes through | Need API key? |
344
+ |---|---|---|---|
345
+ | **Claude Code** (Pro / Max / Team / API) | Skill + hook auto-installed in `~/.claude/` | Claude Code itself, using your logged-in session | **No** |
346
+ | **Claude Code OAuth or Codex CLI / ChatGPT Plus** | `simplicio task` with `SIMPLICIO_MODEL=claude-cli/<m>` or `codex-cli/<m>` | Shell-out to `claude -p` / `codex exec` (subprocess uses your existing login) | **No** |
347
+ | **API key** for any provider (Anthropic, OpenAI, OpenRouter, GLM, DeepSeek, Ollama…) | `simplicio task` standalone CLI | The provider SDK directly | **Yes** — set `SIMPLICIO_API_KEY` |
348
+
349
+ **Most users land on Path 1.** `pip install simplicio-cli` puts the binary on PATH; the first invocation auto-installs the skill + hook in `~/.claude/` (idempotent, opt-out via `SIMPLICIO_SKIP_AUTO_INIT=1`). From that moment, every code-edit prompt you type **inside Claude Code** is silently routed through simplicio's 6-layer contract — no extra config, no key, no cost beyond your existing Claude subscription.
350
+
351
+ **Path 2 — subscription shell-out (zero key).** If you have a Claude Pro/Max session (`claude login`) or a ChatGPT Plus + Codex CLI session (`codex login`) and want to drive simplicio from CI, scripts, or any context **outside** Claude Code, set `SIMPLICIO_MODEL=claude-cli/<model>` or `codex-cli/<model>`. simplicio spawns the CLI as a subprocess; the call rides your existing OAuth session — no API key required. A recursion guard (`SIMPLICIO_HOOK_GUARD=1`) is injected so the inner CLI does not re-fire simplicio's own hook.
352
+
353
+ **Path 3 is for environments without any logged-in CLI** — a remote server, a build runner, a notebook, a different LLM provider. You bring an API key (Anthropic, OpenRouter, OpenAI, GLM, DeepSeek, Ollama…), simplicio calls the provider directly.
354
+
355
+ ### Path 1 example — inside Claude Code
356
+
357
+ After `pip install simplicio-cli && simplicio smoke` (which triggers auto-bootstrap), just type your task in Claude Code:
358
+
359
+ ```
360
+ hide the Delete button for non-admins in src/app/screen/screen.component.html
361
+ ```
362
+
363
+ Claude Code sees the skill (semantic match) and the hook hint (`[SIMPLICIO_PROMPT_HINT]` on stderr — deterministic classifier). It runs simplicio's 6-layer contract under the hood. You see the diff + tests + verification — same as before, just dramatically more accurate.
364
+
365
+ ### Path 2 example — subscription shell-out, zero key
366
+
367
+ You already pay for Claude Pro/Max or ChatGPT Plus + Codex CLI. simplicio
368
+ piggybacks on that login — no extra bill, no key to manage.
369
+
370
+ ```bash
371
+ # Option A — Claude Code subscription (run `claude login` once)
372
+ export SIMPLICIO_MODEL=claude-cli/sonnet # or claude-cli/opus, claude-cli/default
373
+ unset SIMPLICIO_API_KEY # explicitly: no key needed
374
+
375
+ simplicio task "hide Delete button for non-admins" --stack angular \
376
+ --target src/app/screen/screen.component.html
377
+
378
+ # Option B — Codex CLI subscription (run `codex login` once)
379
+ export SIMPLICIO_MODEL=codex-cli/gpt-5 # or codex-cli/default
380
+ simplicio task "..." --stack angular --target ...
381
+ ```
382
+
383
+ How it works: simplicio shells out to `claude -p "<prompt>"` (or `codex exec "<prompt>"`) as a subprocess, captures stdout, runs the test loop. The inner CLI authenticates via your existing OAuth session in `~/.claude/` or `~/.codex/`. simplicio sets `SIMPLICIO_HOOK_GUARD=1` in the subprocess env so the inner Claude Code session does **not** re-fire simplicio's own UserPromptSubmit hook (no infinite recursion).
384
+
385
+ ### Path 3 example — standalone with API key
386
+
387
+ ```bash
388
+ export SIMPLICIO_API_KEY=sk-or-v1-… # OpenRouter key
389
+ export SIMPLICIO_MODEL=anthropic/claude-opus-4
390
+ export SIMPLICIO_BASE_URL=https://openrouter.ai/api/v1
391
+
392
+ simplicio index --stack angular # one-time, builds embedding cache
393
+ simplicio task "hide Delete button for non-admins" \
394
+ --stack angular \
395
+ --target src/app/screen/screen.component.html \
396
+ --criteria "- no admin perm: button absent from DOM
397
+ - with admin perm: button present" \
398
+ --constraints "- don't touch save flow
399
+ - build passes"
400
+ ```
401
+
402
+ Provider-agnostic — see [Configure](#configure--any-llm-nothing-hardcoded) for the full matrix.
403
+
404
+ ---
405
+
406
+ ### Path 1 deep-dive — auto-activation in Claude Code
167
407
 
168
408
  `pip install` puts `simplicio` on your PATH. To make Claude Code
169
409
  **automatically** route code-edit tasks through simplicio, a skill + hook
@@ -239,8 +479,14 @@ user prompt. UserPromptSubmit is the right pre-hook for routing decisions.
239
479
  | Preview without writing | `simplicio init --dry-run` |
240
480
  | Skill-only (no hook) | Copy `.skills/simplicio-cli/SKILL.md` to `~/.claude/skills/simplicio-cli/SKILL.md` manually, skip `simplicio init` |
241
481
 
482
+ ---
483
+
242
484
  ## Configure — any LLM, nothing hardcoded
243
485
 
486
+ > Applies to **Path 2** (standalone CLI). Path 1 users can skip this entire
487
+ > section — Claude Code handles the LLM call with the model and key already
488
+ > tied to your subscription.
489
+
244
490
  | Provider | SIMPLICIO_MODEL | SIMPLICIO_BASE_URL |
245
491
  |---|---|---|
246
492
  | OpenRouter | `anthropic/claude-opus-4` | `https://openrouter.ai/api/v1` |
@@ -258,25 +504,53 @@ your `base_url` — so **any** OpenAI-like provider works without code changes.
258
504
  simplicio smoke # prints provider config + one test call
259
505
  ```
260
506
 
261
- ## Use
507
+ ### The pipeline (both paths)
262
508
 
263
- ```bash
264
- # index once (caches embeddings; re-run after big changes)
265
- simplicio index --stack angular
509
+ Whichever entry point you use, each task runs through the same engine:
266
510
 
267
- # run a task
268
- simplicio task "hide Delete button for non-admins" \
269
- --stack angular \
270
- --target src/app/screen/screen.component.html \
271
- --criteria "- no admin perm: button absent from DOM
272
- - with admin perm: button present" \
273
- --constraints "- don't touch save flow
274
- - build passes"
511
+ ```
512
+ precedent (from cache)
513
+ skill match
514
+ 6-layer prompt
515
+ LLM generates diff + test + Playwright
516
+ apply diff
517
+ run SIMPLICIO_TEST_CMD
518
+ pass? done : send the error back → fix → retry (up to 3x)
275
519
  ```
276
520
 
277
- Each `task`: precedent (from cache) skill match 6 layers LLM generates
278
- (diff + test + Playwright) apply → run `SIMPLICIO_TEST_CMD` → pass? **done** :
279
- send the error back fix retry (up to 3x).
521
+ The 6-layer contract is what moves pass-rate from 41% to 99% on frontier
522
+ models (see [the numbers](#why-it-works--the-numbers) above). The retry loop
523
+ is what catches the remaining edge cases measured separately in the
524
+ [4-quadrant bench](#4-quadrant-bench--agent--simplicio-matrix).
525
+
526
+ ### Common questions
527
+
528
+ **"I have a Claude Pro subscription but no API key — does this work?"** Yes,
529
+ on Path 1. Install simplicio-cli, open Claude Code, type your task as normal.
530
+ Claude Code makes the LLM call with your subscription; simplicio shapes the
531
+ prompt. No key needed.
532
+
533
+ **"I want to run it in CI / a script / outside Claude Code."** Path 2. Get an
534
+ API key from any of the providers above (OpenRouter is the cheapest way to
535
+ try multiple models behind one key), set `SIMPLICIO_API_KEY` +
536
+ `SIMPLICIO_MODEL` + optional `SIMPLICIO_BASE_URL`, run `simplicio task ...`.
537
+
538
+ **"I have Codex CLI / ChatGPT Plus and don't want to pay for an API key."**
539
+ Not auto-wired yet. Workarounds: (a) get an OpenRouter key (~$2 covers
540
+ thousands of tasks at small-model rates), (b) wait for the shell-out provider
541
+ that pipes through `claude -p` / `codex exec` using your subscription —
542
+ tracked, not shipped.
543
+
544
+ **"Will Claude Code use simplicio for *every* prompt now?"** No. The skill
545
+ only triggers on prompts that look like code edits (the description is
546
+ specific). The hook fires `simplicio detect` on every prompt but only emits
547
+ a hint when the deterministic classifier scores ≥ 3 (verbs + file extensions
548
+ + code nouns − read-only cues). "What does this function do?" gets no
549
+ nudge. "Add a delete confirmation to UserList.tsx" does.
550
+
551
+ **"How do I turn it off?"** See [Disable / re-enable](#disable--re-enable)
552
+ above. Two ways: env var (`SIMPLICIO_SKIP_AUTO_INIT=1` before first call) or
553
+ delete the hook entry from `~/.claude/settings.json`.
280
554
 
281
555
  ---
282
556