Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
231 commits
Select commit Hold shift + click to select a range
fd82503
docs(copilot): the onboarding contract, and Copilot probed against it
paulocorcino Jul 20, 2026
e872b29
docs(adr): the Copilot adapter decisions (D1-D12)
paulocorcino Jul 20, 2026
6bdee78
docs(copilot): an out-of-range effort is dropped to the default, not …
paulocorcino Jul 20, 2026
57530d9
docs(adr): D5a — clamp the requested effort, do not forward it
paulocorcino Jul 20, 2026
c438b14
docs: English is the canonical written language
paulocorcino Jul 20, 2026
87d8e87
docs: the crate map had drifted; stop enumerating vendor crates
paulocorcino Jul 20, 2026
59ea608
feat(copilot): the adapter crate — stdin charter, JSONL parser, ADR-0…
paulocorcino Jul 20, 2026
bf78a54
feat(copilot): register the adapter across the Tier 3 run-path regist…
paulocorcino Jul 20, 2026
f096aa8
test(adapter-support): prove a >24 KB charter survives the stdin writ…
paulocorcino Jul 20, 2026
308e27a
fix(copilot): resolve the self-review findings and record the live ru…
paulocorcino Jul 20, 2026
bb49397
feat(usage-scan): the Copilot store reader — WAL-safe copy, summed ro…
paulocorcino Jul 20, 2026
d31f0e5
feat(copilot): read the session store back into Usage (#230)
paulocorcino Jul 20, 2026
78f27ae
feat(daemon): serve Copilot interactive usage on /api/usage (#230)
paulocorcino Jul 20, 2026
51eef1f
feat(cli): price Copilot catalog ids — dot-to-dash fallback + two row…
paulocorcino Jul 20, 2026
62e3020
fix(daemon): the copilot_db arg reaches the integration-test router c…
paulocorcino Jul 20, 2026
69140de
test(copilot): make the WAL-safety tests falsifiable (#230)
paulocorcino Jul 20, 2026
546b1de
feat(copilot): learn the model catalog from one free probe (#231)
paulocorcino Jul 20, 2026
47cb139
feat(cli): the Copilot login probe is the free catalog fetch (#231)
paulocorcino Jul 20, 2026
59fed29
docs(copilot): record the #231 free-catalog probe evidence (#231)
paulocorcino Jul 20, 2026
41af891
fix(copilot): harden the free-probe oracle after self-review (#231)
paulocorcino Jul 20, 2026
b118b01
feat(copilot): per-phase model settings and argv wiring (#232)
paulocorcino Jul 20, 2026
e3f0bba
feat(cli): wire copilot.plan_model/exec_model through --plan-model/--…
paulocorcino Jul 20, 2026
1c17666
feat(copilot): the per-model reasoning-effort clamp (#233)
paulocorcino Jul 20, 2026
eb29121
feat(copilot): thread the clamped --effort through both phases (#233)
paulocorcino Jul 20, 2026
ab257e2
feat(copilot): post-hoc effort verification from the vendor's session…
paulocorcino Jul 20, 2026
6e7b2c9
feat(cli): persist copilot.plan_effort/exec_effort and wire them into…
paulocorcino Jul 20, 2026
1fc5931
docs(copilot): document the persisted effort keys and the per-model c…
paulocorcino Jul 20, 2026
933ccee
fix(copilot): harden the effort clamp after self-review (#233)
paulocorcino Jul 20, 2026
a1f409b
feat(copilot): add the D7 receipt and D11 continueOnAutoMode guards (…
paulocorcino Jul 20, 2026
5b400ba
feat(copilot): enforce the D7 receipt and D11 preflight, with the esc…
paulocorcino Jul 20, 2026
ec9dc3a
feat(cli): register copilot.allow_builtin_mcp_servers_i_understand_th…
paulocorcino Jul 20, 2026
87734fe
docs(copilot): record the D7/D11 guards as enforced and document the …
paulocorcino Jul 20, 2026
6aa0cad
fix(copilot): pin the guard wirings and stop fail-closed pre-empting …
paulocorcino Jul 20, 2026
f14970b
feat(adapter-support): promote the .agents/skills dance out of the Co…
paulocorcino Jul 20, 2026
3c99d4a
refactor(codex): call the promoted skills dance from adapter-support …
paulocorcino Jul 20, 2026
e55cecb
feat(copilot): materialize skills into .agents/skills and guard the D…
paulocorcino Jul 20, 2026
9fde83f
feat(copilot): enforce the D9 skills receipt in both phases (#235)
paulocorcino Jul 20, 2026
ecb0575
docs(copilot): record ADR-0041 D9 as enforced with the live receipt s…
paulocorcino Jul 20, 2026
8f3ac62
build: record the copilot include_dir dependency in Cargo.lock (#235)
paulocorcino Jul 20, 2026
10bf883
docs(context): fold the .agents/skills dance into the adapter-support…
paulocorcino Jul 20, 2026
bb70a83
test(copilot): close the D9 review gaps and correct ADR-0041 D9's pro…
paulocorcino Jul 20, 2026
515b7bf
feat(copilot): emit --attachment per image in build_copilot_command (…
paulocorcino Jul 20, 2026
bd65056
docs(copilot): record ADR-0041 D12 as enforced for the --attachment a…
paulocorcino Jul 20, 2026
cba5771
feat(copilot): add the one-shot command builder (#237)
paulocorcino Jul 20, 2026
88e81a2
feat(copilot): add tasks.rs one-shot diagnose/draft/consolidate/triag…
paulocorcino Jul 20, 2026
6fd8f3e
feat(copilot): wire the four one-shot dispatch sites to the new tasks…
paulocorcino Jul 20, 2026
a84228c
docs(copilot): update ADR-0041 D12 enforcement now triage feeds --att…
paulocorcino Jul 20, 2026
d23327a
docs(copilot): capture the live one-shot consolidate smoke for #237
paulocorcino Jul 20, 2026
50bb449
fix(copilot): wire ADR-0041 D7/D11 safety guards into the one-shot ta…
paulocorcino Jul 20, 2026
3fb3c99
docs(adr): amend ADR-0028 to the kimi-code 0.28 contract (#240)
paulocorcino Jul 20, 2026
7f8c5aa
feat(adapter-support): add the shared EXEC_CHARTER pointer constant (…
paulocorcino Jul 20, 2026
ad8e07a
feat(kimi): move the charter to `-p` argv and pin kimi-code/k3 (#241)
paulocorcino Jul 20, 2026
e48c93d
feat(kimi): read the 0.28 auth signal, usage.record tokens and resume…
paulocorcino Jul 20, 2026
aafb4d1
fix(cli): move the kimi login probe to the 0.28 argv and price kimi-c…
paulocorcino Jul 20, 2026
e52f61b
test(kimi): pin the auth detector to the live-captured 0.28 login_req…
paulocorcino Jul 20, 2026
de3f8b7
test(kimi): make the exec-charter and usage fixtures discriminate (#241)
paulocorcino Jul 20, 2026
5e3ccf7
docs(kimi): capture the live 0.28 plan+execute smoke for #241
paulocorcino Jul 20, 2026
a64f65a
fix(daemon): wire Kimi into the daemon agent enum (#228)
paulocorcino Jul 20, 2026
74a649c
test(daemon): simulate a Kimi plan+execute run through the dispatch p…
paulocorcino Jul 20, 2026
99ebef2
feat(copilot): reach Copilot from the workbench (#238)
paulocorcino Jul 20, 2026
1c23969
docs(copilot): capture the live workbench smoke for #238
paulocorcino Jul 20, 2026
5f21c9f
docs(cursor): probe the Cursor CLI against ADR-0040 and amend the con…
paulocorcino Jul 21, 2026
505bce8
docs(cursor): decide the Cursor adapter and plan its live validation
paulocorcino Jul 21, 2026
6188402
docs(cursor): bound D13 with a negative result instead of leaving it …
paulocorcino Jul 21, 2026
ec901c9
docs(cursor): close the four Tier 1 gaps left open by the spike
paulocorcino Jul 21, 2026
bdaa115
docs(cursor): settle D11 by measurement and add the interrupt signature
paulocorcino Jul 21, 2026
894ad28
docs(cursor): measure the deny list against --force, and surface it
paulocorcino Jul 21, 2026
1e72d23
docs(cursor): correct the entitlement finding and contain the config …
paulocorcino Jul 21, 2026
6aa14a8
docs(gemini): probe the Gemini CLI against ADR-0040
paulocorcino Jul 21, 2026
58a40f5
docs(adr-0040): correct the wiring inventory from measured drift
paulocorcino Jul 21, 2026
987beb5
docs(gemini): decide the Gemini adapter (ADR-0043)
paulocorcino Jul 21, 2026
78e131b
docs(gemini): settle termination by measurement, and sequence behind …
paulocorcino Jul 21, 2026
ff0b390
docs(gemini): settle root lifetime and the policy tier; correct D15
paulocorcino Jul 21, 2026
fc81c90
feat(cursor): scaffold the ralphy-agent-cursor crate (#243)
paulocorcino Jul 21, 2026
875ab73
feat(cursor): the indexing gate and the settings section (#243)
paulocorcino Jul 21, 2026
65dbfb6
feat(cursor): binary resolution, config-dir seeding and the refused a…
paulocorcino Jul 21, 2026
0bc7c25
feat(cursor): auth detection from the vendor's status json, not its e…
paulocorcino Jul 21, 2026
5a5772f
feat(cursor): the stream fold, the gated spawn seam and the Agent imp…
paulocorcino Jul 21, 2026
660935f
feat(cursor): wire --agent cursor through the CLI enum, gate and run …
paulocorcino Jul 21, 2026
1877dca
feat(cursor): the config key, the emit pins and ADR-0042 accepted (#243)
paulocorcino Jul 21, 2026
d8ac69f
fix(cursor): probe the run preflight by agent, not by selector name (…
paulocorcino Jul 21, 2026
e0a2cec
fix(cursor): close the self-review findings — the login probe was an …
paulocorcino Jul 21, 2026
bbf3e02
docs(cursor): the live dry-run evidence against the FinCal lab (#243)
paulocorcino Jul 21, 2026
898ffc3
test(cursor): capture real CLI fixtures for the outcome ladder (#244)
paulocorcino Jul 21, 2026
76fe980
test(cursor): replace inline outcome fixtures with real CLI captures …
paulocorcino Jul 21, 2026
4b391e4
test(cursor): pin the idle watchdog default, degraded-note wiring and…
paulocorcino Jul 21, 2026
f039a04
docs(cursor): live execute-pass evidence — blocked on account quota (…
paulocorcino Jul 21, 2026
3d41cfd
docs(cursor): capture the vendor-side record of the #244 quota block
paulocorcino Jul 21, 2026
e025c73
fix(cursor): read the terminal turn's status so a vendor refusal is n…
paulocorcino Jul 21, 2026
8731592
test(cursor): capture the two live model-refusal fixtures (#245)
paulocorcino Jul 21, 2026
01dd74b
feat(cursor): normalize the model family and stop on a vendor model r…
paulocorcino Jul 21, 2026
eca68d2
refactor(pricing): split the default table into pricing/defaults.rs (…
paulocorcino Jul 21, 2026
62cf85f
feat(pricing): price every reachable Cursor model family (#245)
paulocorcino Jul 21, 2026
35deae8
fix(cursor): a quoted refusal must not fail a run the vendor served (…
paulocorcino Jul 21, 2026
303c19d
docs(cursor): live evidence that a Free plan can pin the first-party …
paulocorcino Jul 21, 2026
1354fc6
feat(cursor): materialize ralphy's skills into .cursor/skills/ (#246)
paulocorcino Jul 21, 2026
6d56f01
docs(cursor): live evidence that a materialized skill's body is read …
paulocorcino Jul 21, 2026
c28910e
docs(cursor): document the skills root and mark ADR-0042 D12 implemen…
paulocorcino Jul 21, 2026
f83855e
fix(cursor): self-review fixes — behavioral home-dir test, doc D17/D1…
paulocorcino Jul 21, 2026
30a4626
feat(cursor): the four one-shot verbs behind D6's indexing gate (#247)
paulocorcino Jul 21, 2026
42844a1
feat(cursor): wire the four one-shot dispatch sites to the adapter (#…
paulocorcino Jul 21, 2026
021ef89
docs(cursor): live evidence that a one-shot refuses an unprotected re…
paulocorcino Jul 21, 2026
43d838b
test(cursor): self-review fixes — real spawn-order pin, non-vacuous a…
paulocorcino Jul 21, 2026
a2e5384
refactor(cursor): move the vendor locator and D6 indexing gate into r…
paulocorcino Jul 21, 2026
0e6c958
feat(cursor): reachable from the daemon and the workbench (#248)
paulocorcino Jul 21, 2026
e25417e
test(cursor): use expect_err for the refused upgrade (#248)
paulocorcino Jul 21, 2026
3795059
test(cursor): self-review fixes — env-free resolver pins, honest anti…
paulocorcino Jul 21, 2026
3e26cb6
feat(cursor): capture usage from the terminal result record (#249)
paulocorcino Jul 21, 2026
668d1d7
feat(cursor): wire stream usage into plan/execute, note the credit/to…
paulocorcino Jul 21, 2026
eee21cb
refactor(usage-scan): InteractiveRecord.tokens becomes Option<Tokens>…
paulocorcino Jul 21, 2026
d3a9bf8
feat(usage-scan): scan_cursor enumerates chats sessions with tokens u…
paulocorcino Jul 21, 2026
e83a93c
feat(usage-scan): union the cursor transcripts store into scan_cursor…
paulocorcino Jul 21, 2026
72c6546
feat(daemon): chain scan_cursor into /api/usage interactive records (…
paulocorcino Jul 21, 2026
622aeb0
feat(workbench): render a null tokens cell as unavailable, never 0 (#…
paulocorcino Jul 21, 2026
9dc4fa9
docs(screenshots): cursor usage row renders tokens as unavailable (#250)
paulocorcino Jul 21, 2026
fb4acc3
docs(adr): tokens may be null in the interactive record contract (#250)
paulocorcino Jul 21, 2026
bb1d590
fix(usage-scan): self-review fixes — email cache, doc placement, shar…
paulocorcino Jul 21, 2026
9328306
feat(gemini): a real planning-capable Gemini CLI adapter, isolated an…
paulocorcino Jul 21, 2026
328e737
docs(adr): record what the gemini live probes observed, and what they…
paulocorcino Jul 21, 2026
1f4dc90
fix(gemini): self-review fixes — limit hint, error shape, case-blind …
paulocorcino Jul 21, 2026
a2a0a2c
test(adapter-support): prove a killed process tree leaves no survivin…
paulocorcino Jul 21, 2026
136a6a0
feat(gemini): name the budget, tool and relaunch stops in the outcome…
paulocorcino Jul 21, 2026
9f2634e
test: address self-review — pin the plan-agnostic absence, observe ev…
paulocorcino Jul 21, 2026
e1a2a92
feat(gemini): detect the vendor's own revocation sentences and admin-…
paulocorcino Jul 21, 2026
ec1cfa3
feat(gemini): a vendor-announced revocation outranks the exit code's …
paulocorcino Jul 21, 2026
d5ef51b
feat(gemini): stop before the spawn on an admin autonomy control; a r…
paulocorcino Jul 21, 2026
6a9688e
test(gemini): pin the autonomy request against a silent downgrade, an…
paulocorcino Jul 21, 2026
5be8746
docs(adr): record what #255 observed of gemini's revocation controls,…
paulocorcino Jul 21, 2026
4e99e2d
fix(gemini): only a hard-stop revocation may outrank a limit or an ex…
paulocorcino Jul 21, 2026
1a056cd
docs(adr): mark which gemini revocation needles are stops and which a…
paulocorcino Jul 21, 2026
2ff2602
feat(gemini): bound and prune session retention in the owned root (#256)
paulocorcino Jul 21, 2026
7133db2
docs(adr): record #256's session-retention read of the gemini bundle
paulocorcino Jul 21, 2026
e0315c3
feat(gemini): own the model-id grammar, its price keys and the 404 st…
paulocorcino Jul 21, 2026
3720c21
feat(cli): price the Gemini engines through the adapter's key transfo…
paulocorcino Jul 21, 2026
7a8938e
feat(cli): persist Gemini's per-phase model pins under gemini.* (#257)
paulocorcino Jul 21, 2026
a2220d6
feat(cli): resolve Gemini's per-phase pins flag-then-persisted at the…
paulocorcino Jul 21, 2026
8ec4093
feat(cli): surface Gemini's router tax in the init gate and document …
paulocorcino Jul 21, 2026
1b5b87b
fix(gemini): pin the price-key fold in usage and record D8's set-time…
paulocorcino Jul 21, 2026
40065c4
feat(gemini): materialize skills into the owned root, with a model-fr…
paulocorcino Jul 21, 2026
1dde598
feat(gemini): fill the skill-invocation and self-review prompt slots …
paulocorcino Jul 21, 2026
aeecfca
docs(gemini): record skills-in-owned-root usage and #258's live probe…
paulocorcino Jul 21, 2026
6bd8f09
feat(gemini): the four one-shots, under the run path's root and polic…
paulocorcino Jul 21, 2026
2291626
feat(cli): dispatch the four one-shot verbs to the gemini adapter (#259)
paulocorcino Jul 21, 2026
4dea008
docs(gemini): record the one-shot root rule and #259's live consolida…
paulocorcino Jul 21, 2026
49f7298
fix(gemini): gate the one-shot ladder on failure, and tighten its pin…
paulocorcino Jul 21, 2026
57e291a
docs(gemini): state the one-shot ladder's failure gate, not just its …
paulocorcino Jul 21, 2026
c621ef0
feat(gemini): deliver triage attachments as @-references (#260)
paulocorcino Jul 21, 2026
22878c8
docs(gemini): record the #260 live probe and the revised D14 mechanis…
paulocorcino Jul 21, 2026
d7e705a
fix(gemini): escape the full POSIX at-reference terminator set (#260)
paulocorcino Jul 21, 2026
3262d78
feat(usage-scan): enumerate the Gemini CLI session store (#261)
paulocorcino Jul 21, 2026
4049a1e
feat(daemon): serve Gemini interactive usage on /api/usage (#261)
paulocorcino Jul 21, 2026
e47b77c
feat(daemon): make Gemini launchable from the workbench under its own…
paulocorcino Jul 21, 2026
666046e
docs(adr): record Gemini's Tier-4 sites and what #261 proved (#261)
paulocorcino Jul 21, 2026
1ee9346
fix(usage-scan): stop billing Gemini's cached tokens twice (#261)
paulocorcino Jul 21, 2026
86848bc
feat(usage-scan): label the Gemini figure a lower bound end to end (#…
paulocorcino Jul 21, 2026
fb7cad1
test(daemon): prove the workbench renders the Gemini floor as a lower…
paulocorcino Jul 21, 2026
b4dc605
docs(adr): name where ADR-0043 D10's lower-bound label surfaces (#262)
paulocorcino Jul 21, 2026
99adbcf
docs(adr): record lower_bound in ADR-0033's interactive record shape …
paulocorcino Jul 21, 2026
a41e4d6
test(usage-scan): close the self-review gaps on the lower-bound label…
paulocorcino Jul 21, 2026
6781139
feat(gemini): parse token usage from the stream envelope's stats (#263)
paulocorcino Jul 21, 2026
75560fd
docs(adr): record the usage-parsing implementation in ADR-0043 D9 (#263)
paulocorcino Jul 21, 2026
afce1d4
test(gemini): pin the None/Some(non-empty) usage split, not a false S…
paulocorcino Jul 21, 2026
8cc7f3d
fix(gemini): gate the textual limit signal on !succeeded (#264)
paulocorcino Jul 21, 2026
dfdc5fe
feat(cursor): classify a quota stop as Limit(None) (#266)
paulocorcino Jul 21, 2026
0baf03c
feat(cursor): wire quota classification into plan/execute (#266)
paulocorcino Jul 21, 2026
96a0411
fix(core): match acceptance criteria as logical bullets, not physical…
paulocorcino Jul 21, 2026
16a468b
feat(prompts): fold retrospective lessons into plan/execute charters
paulocorcino Jul 21, 2026
2e0d191
fix(daemon): rebuild when assets/ui changes (include_dir! is untracked)
paulocorcino Jul 22, 2026
f1481be
feat(prompts): curator flags repo-wide facts as promotion candidates
paulocorcino Jul 22, 2026
474c5ee
feat(cursor): plan a self-review step in the cursor planning overlay
paulocorcino Jul 22, 2026
cbc2c13
fix(overlay): correct self-review step instruction for reviewer skill…
paulocorcino Jul 22, 2026
cca8d0a
fix(cursor): classify a bare-stderr ActionRequiredError quota stop as…
paulocorcino Jul 22, 2026
ce54f92
fix(verify): reject a backslash-escaped quote in a `## Verify` command
paulocorcino Jul 22, 2026
6ac7666
feat(prompt): add detailed execution guidelines to enhance clarity an…
paulocorcino Jul 22, 2026
37d3fe0
chore(prompts): regenerate prompt.plan.cursor.md from template + overlay
paulocorcino Jul 22, 2026
e2f7a59
fix(prompts): fix typo in cursor self-review-step overlay
paulocorcino Jul 22, 2026
31a189f
fix(prompts): make the copilot plan overlay actually invoke the revie…
paulocorcino Jul 22, 2026
e2287c0
refactor(prompts): enhance clarity in execution and planning guidelines
paulocorcino Jul 22, 2026
5847631
docs(adr-0042): rewrite the cursor validation plan into an accepted note
paulocorcino Jul 22, 2026
f0ccdd8
docs(evidence): add the #251 cursor capstone raw-evidence companion
paulocorcino Jul 22, 2026
2e60b7e
Refactor usage.rs to utilize StorePaths struct for directory paths
paulocorcino Jul 22, 2026
228224a
feat: implement end-of-run knowledge consolidation and token usage tr…
paulocorcino Jul 22, 2026
67eba08
feat: implement harvest-tax estimate for Cursor vendor
paulocorcino Jul 22, 2026
d7883b7
feat: implement resume path authentication check for finalized plans
paulocorcino Jul 22, 2026
90c4745
docs(evidence): add the #265 gemini capstone live-validation companion
paulocorcino Jul 22, 2026
a6ea0ad
docs(evidence): add the #272 copilot capstone live-validation companion
paulocorcino Jul 22, 2026
ab27579
docs(evidence): file the two #272 cost-accounting follow-ups (#276, #…
paulocorcino Jul 22, 2026
fcef954
docs(evidence): file the #273 opencode deep re-validation capstone
paulocorcino Jul 22, 2026
a1c444c
docs(evidence): add the remaining #272 copilot capstone live logs
paulocorcino Jul 22, 2026
cd965d3
Add logs for Ralphy runs and planning for issue #111
paulocorcino Jul 22, 2026
c44ccc8
feat(context): inline run artifacts into Gemini child's stdin to bypa…
paulocorcino Jul 22, 2026
573d9c9
feat(usage): implement token usage tracking for all adapters in conso…
paulocorcino Jul 22, 2026
ee26e23
docs(effort): ADR-0044 promotes effort to a Ralphy word (#227)
paulocorcino Jul 23, 2026
3d66bf1
feat(pricing): introduce CLI-first models.dev fetch and machine-refre…
paulocorcino Jul 23, 2026
e65e447
feat(core): add neutral effort lexicon (#284)
paulocorcino Jul 23, 2026
8eca8ab
feat(cli): validate and resolve neutral effort (#284)
paulocorcino Jul 23, 2026
1841225
feat(claude): map resolved effort through commands and events (#284)
paulocorcino Jul 23, 2026
79a9c0d
test: verify Copilot effort boundary (#284)
paulocorcino Jul 23, 2026
0c62079
test: prove Claude effort wiring paths (#284)
paulocorcino Jul 23, 2026
8eb6389
test: close effort resolution coverage gaps (#284)
paulocorcino Jul 23, 2026
c6370e1
test: pin phase-specific effort resolution (#284)
paulocorcino Jul 23, 2026
ef416cb
test: pin unset effort defaults (#284)
paulocorcino Jul 23, 2026
652f477
fix: tree-kill before output collect so a leaked pipe holder can't dr…
paulocorcino Jul 23, 2026
464a025
Add documentation for agents, run options, Telegram integration, usag…
paulocorcino Jul 23, 2026
d937a21
feat: amend D6 policy gate to auto-write opt-out file
paulocorcino Jul 23, 2026
a0290e7
feat: split variant from effort in runstate telemetry (#285)
paulocorcino Jul 23, 2026
8fae696
feat: wire Effort as documented no-op on Kimi/Gemini/OpenCode (#285)
paulocorcino Jul 23, 2026
74145ca
docs: amend ADR-0005 D3 — variant is dialect, not Effort (#285)
paulocorcino Jul 23, 2026
9f8c976
fix: avoid build_gemini_command in lib tests so root pin stays at 2 (…
paulocorcino Jul 23, 2026
4b68f28
feat: add .cursorindexingignore to exclude all files from indexing
paulocorcino Jul 23, 2026
3727726
fix message cursor
paulocorcino Jul 23, 2026
caa9766
feat: enhance run_check.py to support process tree termination and ou…
paulocorcino Jul 23, 2026
cfd5d60
fix: align effort field doc with five-rung lexicon (#285)
paulocorcino Jul 23, 2026
9d75bcd
test: cover D9 effort/variant split on executing path (#285)
paulocorcino Jul 23, 2026
b6e464b
feat: wire resolved Effort into Codex and Copilot (#286)
paulocorcino Jul 23, 2026
acb106b
fix: tighten Codex/Copilot effort tests against false greens (#286)
paulocorcino Jul 23, 2026
08bfe3b
feat: price from embedded seed and slug overlay (#288)
paulocorcino Jul 23, 2026
ee3d7f9
test: lock seed/overlay parity and cache precedence (#288)
paulocorcino Jul 23, 2026
808a9e7
feat: refresh models.dev pricing cache from ralphy usage (#289)
paulocorcino Jul 23, 2026
25ec231
fix: keep models.dev fetch within ~3s worst case (#289)
paulocorcino Jul 23, 2026
68e25d8
fix(cursor): pin SHELL+MSYSTEM to git-bash on Windows (#291)
paulocorcino Jul 23, 2026
9ec4fc3
feat(pricing): seed refresh xtask + scheduled CI cadence (#290)
paulocorcino Jul 23, 2026
541c389
fix(init): gate on git presence, ahead of the remote symptom (#292)
paulocorcino Jul 23, 2026
c682302
docs: expand the agent guide (architecture, testing, Rust baseline)
paulocorcino Jul 23, 2026
3337a6e
docs(adr): resolve ADR number collisions and 0004↔0002 cross-referenc…
paulocorcino Jul 23, 2026
12a8539
fix(kimi): recognize full-logout as an auth stop (#281)
paulocorcino Jul 24, 2026
c9d2c24
fix: harden Cursor-authored effort clamp, cache atomicity, fetch bound
paulocorcino Jul 24, 2026
d93de54
fix(kimi): route billing-cycle ceiling to PlanLimit, not "no plan" (#…
paulocorcino Jul 24, 2026
5c80efd
feat: introduce `opus-high` execution model for Claude and `xhigh` fo…
paulocorcino Jul 24, 2026
999ceb0
chore(release): bump all crates to 0.1.0-rc15
paulocorcino Jul 24, 2026
e33f055
test(runstate): realign claude effort emit-site pins to local exec_ef…
paulocorcino Jul 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .cursorindexingignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
*
56 changes: 56 additions & 0 deletions .github/workflows/refresh-seed.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
name: Refresh pricing seed

# Keep the offline pricing floor (assets/pricing/models-dev-seed.json) current
# without hand-editing it (ADR-0034 A3, issue #290). The generator refreshes the
# seed from live models.dev out-of-band — never build.rs — and this job opens a
# diffable PR only when the numbers actually change. Cadence is decoupled from
# the release cycle. HITL: the resulting PR is reviewed as data before it merges.

on:
schedule:
# Weekly, Mondays 06:00 UTC.
- cron: "0 6 * * 1"
workflow_dispatch:

env:
CARGO_TERM_COLOR: always

permissions:
contents: write # push the refresh branch
pull-requests: write # open the review PR

jobs:
refresh:
name: regenerate seed · open PR on change
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Cache cargo registry and target
uses: Swatinem/rust-cache@v2

- name: Regenerate seed from live models.dev
run: cargo run -p xtask -- refresh-seed

- name: Open a diffable PR when the seed changed
# No-op safe: with no diff the action creates/updates no PR.
uses: peter-evans/create-pull-request@v6
with:
add-paths: assets/pricing/models-dev-seed.json
branch: chore/refresh-pricing-seed
delete-branch: true
commit-message: "chore(pricing): refresh models.dev seed floor"
title: "chore(pricing): refresh models.dev seed floor"
body: |
Automated refresh of the offline pricing seed
(`assets/pricing/models-dev-seed.json`) from live models.dev,
narrowed to the driven providers (anthropic, openai, google,
moonshotai). Review the price deltas as data before merging — a
deliberate floor above upstream (e.g. `claude-opus-4-8`, ADR-0008 D8)
should be restored here rather than let the refresh regress it, and
the `floor.rs` golden values move with any accepted change.

Generated by `cargo run -p xtask -- refresh-seed` (issue #290).
99 changes: 95 additions & 4 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,33 @@ them here.
is defined there. Use these words; don't invent synonyms.
- **[docs/adr/](./docs/adr/)** — architecture decisions. Check for a relevant
ADR before changing a seam; the boundary you're about to cross was probably
decided on purpose (e.g. ADR-0004 core/adapter boundary).
decided on purpose (e.g. ADR-0002 core/adapter boundary).
- **[docs/BUILDING.md](./docs/BUILDING.md)** — build, CI, crate layout.

## Architecture — ports & adapters, ubiquitous-language-first

Ralphy is **hexagonal (ports & adapters)** at the crate seam, with DDD in its
**tactical** sense only: the [CONTEXT.md](./CONTEXT.md) glossary *is* the
ubiquitous language and each crate is roughly one bounded context. There is no
strategic-DDD ceremony here — no aggregates, repositories, or domain-event
buses. Don't add them.

- **`ralphy-core` is the center and depends on no vendor.** It defines the agent
contract (the *port*) and owns queue lifecycle, git/forge, run reporting. It
must never gain a dependency on a `ralphy-agent-*` crate or on
`ralphy-adapter-support`; the dependency arrow points *inward*, toward core
([ADR-0002](./docs/adr/0002-core-agnostic-adapter-boundary.md) protects this
seam). If core seems to need something vendor-specific, the design is wrong —
lift it behind the contract, don't leak it in.
- **Each `ralphy-agent-*` is an adapter** implementing that port: one crate per
vendor, holding all that is vendor-specific (execution mode, completion
protocol). **`ralphy-adapter-support`** is the vendor-*neutral* plumbing the
adapters share — it produces no `Outcome` (CONTEXT.md → *Adapter support*).
- **`ralphy-cli` is the composition root** — the one place that names every
vendor and wires them together. Vendor enumeration lives *there and only
there* (plus the [ADR-0040](./docs/adr/0040-agent-adapter-onboarding-contract.md)
inventory), never scattered across the tree.

## Hard rules (an agent will get these wrong without being told)

- **The green gate is CI's gate.** Before considering a change done:
Expand All @@ -28,17 +52,84 @@ them here.
[ADR-0022](./docs/adr/0022-file-split-conventions.md): `foo.rs` + `foo/`
layout (never `mod.rs`), tests migrate with the code, split by existing
responsibility only.
- **Tests live next to what they test — separated by `#[cfg(test)]`, not by a
parallel source tree.** That is this repo's convention *and* idiomatic Rust,
and `#[cfg(test)]` compiles the code out of release builds, so nothing
test-only ever ships — that gate is the "don't mix production and tests"
guarantee, not a separate root. Placement:
*unit tests* stay in the same crate as the code, either an inline
`#[cfg(test)] mod tests` or — once a file splits (ADR-0022) — a sibling
`#[cfg(test)]` submodule file (`foo/tests.rs`, or a named one like
`runstate/roundtrip.rs`); *integration tests* (black-box, public API only) go
in the crate's `tests/`, with data under `tests/fixtures/`; a **test helper
child binary** goes in `src/bin/<name>_test_child.rs`, because its
`CARGO_BIN_EXE_*` is visible only to integration tests (CONTEXT.md →
*Testing conventions*).
- **Smallest change that fits the existing seam.** A new trait, generic, crate,
or layer of indirection needs a real second caller or a deciding ADR — never
"for flexibility" (`anti-over-abstraction`). Cross a seam only where an ADR
says to; if no ADR covers the boundary you're about to add, the change is
probably in the wrong place, or the seam is a design decision that wants an
ADR first.
- **English is the canonical written language.** ADRs, docs, GitHub issues and
PRs, commit messages and code comments are written in English, whatever
language the request arrived in. A conversation with a maintainer may be in
any language; the artifact is English. Issues in particular are work orders an
agent consumes, and they quote English ADRs, identifiers and paths — prose in
a second language makes one document speak two per sentence.
- **Contributing to this repo:** commit on a branch; a human reviews and merges.
Do not push or open a PR unless explicitly asked. (This mirrors Ralphy's own
product ethos — it never pushes and never opens PRs.)

## Rust baseline (the always-on floor)

The full `/rust-skills` (179 rules) is a surgical tool — invoke it to review
non-trivial code or a specific concern. These few are the minimum that hold
without invoking anything; they apply to every change. Each names the underlying
rule so `/rust-skills <name>` gives you the bad/good example on demand.

- **Errors — this codebase is a subprocess driver, so errors are the hot path.**
No `.unwrap()`/`.expect()` on anything recoverable (spawn, I/O, git, network,
parse); `expect()` is allowed *only* for a violated invariant that is a bug,
and its message states why the invariant holds (`anti-unwrap-abuse`,
`anti-panic-expected`, `err-expect-bugs-only`). Never swallow an error — no
`let _ = result`, no bare `.ok()`, no empty `if let Err(_)`: handle or
propagate (`anti-empty-catch`). Propagate with `?` and add
`.context()`/`.with_context()` at each boundary so the chain reads
"what failed: why" (`err-context-chain`). Error messages start lowercase with
no trailing punctuation — they get chained (`err-lowercase-msg`). `anyhow` at
the app/composition boundary; a `thiserror` domain type at a seam callers must
match on (`err-anyhow-app`, `err-custom-type`).
- **Signatures — free flexibility clippy would flag anyway.** Take `&str` not
`&String`, `&[T]` not `&Vec<T>` (`anti-string-for-str`, `anti-vec-for-slice`).
A fixed set of values or a semantic identity is an `enum`/newtype, not a
`String` — this is the CONTEXT.md ubiquitous language expressed in the type
system (`anti-stringly-typed`).
- **Idiom & restraint.** Iterators over manual `for i in 0..len` indexing; don't
`.collect()` mid-chain (`anti-index-over-iter`, `anti-collect-intermediate`).
`impl Trait` over `Box<dyn Trait>` when the type is concrete; start concrete
and generalize on a real second use, not "for flexibility" (`anti-type-erasure`,
`anti-over-abstraction`). No optimization without a profile
(`anti-premature-optimize`).
- **Async (daemon only).** Never hold a lock guard across an `.await`; use
`tokio::sync` primitives and drop the guard first (`anti-lock-across-await`).

## Where things live

`crates/ralphy-cli` (the `ralphy` binary + composition root) ·
`crates/ralphy-core` (queue lifecycle, git/GitHub, run reporting) ·
`crates/ralphy-agent-{claude,codex,opencode}` (the vendor adapters) ·
`crates/ralphy-agent-*` (**the vendor adapters — one crate per vendor**;
`claude`, `codex`, `kimi`, `opencode` today, more arriving) ·
`crates/ralphy-adapter-support` (vendor-neutral child-driving plumbing) ·
`crates/ralphy-pty` · `assets/prompts` (plan/execute charters) ·
`crates/ralphy-daemon` (the supervised launcher + workbench) ·
`crates/ralphy-usage-scan` (stateless reads of the vendors' session stores) ·
`crates/ralphy-pty` · `crates/ralphy-proc-util` ·
`assets/prompts` (plan/execute charters) ·
`assets/plugin` (bundled skills, embedded into the binary).

#teste 1
Adding a vendor is not just a new crate: follow
[ADR-0040](./docs/adr/0040-agent-adapter-onboarding-contract.md), whose wiring
inventory lists every edit site across five tiers. **Do not enumerate the vendor
crates anywhere a list can go stale** — that list has already drifted once
(Kimi was missing from this section and is still missing from the daemon's
agent enum).
26 changes: 21 additions & 5 deletions CONTEXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,14 +125,16 @@ _Avoid_: model selection (reserved for Claude complexity routing).
The shared machinery every **adapter** leans on but that is specific to *no*
vendor — the headless child-driving loop (spawn, drain stdout/stderr, poll to
completion-or-timeout, kill on deadline), the `RALPHY_DONE_EXIT` /
`RALPHY_BLOCKED_EXIT` sentinel parser, and skill/plugin materialization. It is
`RALPHY_BLOCKED_EXIT` sentinel parser, and skill/plugin materialization —
including the `.agents/skills` exposure dance (link-or-copy, symlink-safe
removal, merged per-entry `.gitignore`) that Codex and Copilot both drive. It is
the deliberate counterpart of **Adapter**: where an adapter holds what is
vendor-specific, adapter support holds what is common. It owns **no** completion
protocol and produces **no** `Outcome` — it hands back raw captured output and
each adapter still classifies it (the seam ADR-0004 protects). Lives in
each adapter still classifies it (the seam ADR-0002 protects). Lives in
`ralphy-adapter-support`; depended on by the vendor adapter crates, never by the
core.
_Avoid_: shared runner, headless runner (ADR-0004 forbids a shared *Outcome*
_Avoid_: shared runner, headless runner (ADR-0002 forbids a shared *Outcome*
runner — this is only the plumbing), utils, helpers.

**Run deadline / per-issue budget / idle watchdog**:
Expand Down Expand Up @@ -164,7 +166,7 @@ beats closing a throttled session) and a `timeout`; a `done` needs only
protocol-completion and flake-repair hand-backs legitimately finish with no commit
(the plan lives in gitignored `.ralphy/plan.md`). `committed` is a *progress* signal
feeding the Claude headless no-commit **streak**, not a gate on **green**. This
*narrows* — does not reopen — ADR-0004: raw→signal extraction (including limit
*narrows* — does not reopen — ADR-0002: raw→signal extraction (including limit
trustworthiness and exit normalization) stays per-adapter; only the signal→`Outcome`
ordering is shared (ADR-0023). Claude is the reference implementation; the behavior
change lands on the Codex and OpenCode adapters.
Expand All @@ -187,6 +189,20 @@ An **optional adapter capability**, not a core guarantee — a deterministic ada
which is a deterministic knob the operator sets, not an auto-judged choice.
_Avoid_: model selection (too broad), auto-model.

**Effort**:
The deterministic reasoning-depth knob the operator sets per phase
(`--plan-effort`/`--exec-effort`), on the fixed five-rung ladder
`low | medium | high | xhigh | max` (ADR-0044) — the cross-vendor intersection of
the CLIs that expose one. `low`/`medium`/`high` are the guaranteed-universal core;
`xhigh`/`max` are accepted but clamp down on a model that cannot honour them, so
asking for more never silently delivers less. One word, translated to each
vendor's dialect **inside** the adapter (clamp where the vendor degrades silently,
passthrough where it errors loudly, a documented no-op where there is no effort
axis) — never a raw passthrough. Distinct from **complexity routing** (auto-judged
model choice) and from model selection: effort is *how hard*, not *which model*.
_Avoid_: reasoning level (vendor-specific), variant (that is OpenCode's dialect,
not the Ralphy word).

**Supervised session**:
Live human oversight of a *running* agent session — following it and intervening
mid-flight, via Remote Control (mobile) or an on-screen terminal (local/Tauri).
Expand Down Expand Up @@ -406,7 +422,7 @@ An issue's `## Blocked by` section names other issues (`#N`) it depends on. The
runner gates on it: if any named blocker is still **open**, the blocked issue is
*skipped* this run (not closed, not a stop) and picked up by a later run once the
blocker clears. A blocker counts as satisfied when simply **closed** — safe only
because every issue in a run shares one branch (see ADR-0002).
because every issue in a run shares one branch (see ADR-0045).
_Avoid_: depends-on, prerequisite, stop-before (that's flow control, not a dependency).

**stop-before**:
Expand Down
Loading
Loading