every commit in this project, since the first one.
Read out of the repository each time this page is built, never typed by hand. A changelog somebody maintains starts lying the week after it is written, and the only version of this project worth showing is the one the history already proves.
755commits
30days with work in them
2026-07-24first commit
2026-08-26 6 commits
b68883005:35answerer: split F1 into F1a (runs asleep) and F1n (publish, waits for operator), reorder F2 before F1b, harden both on measured corpus
399de4f05:22f0 close: single root on main, worktrees removed, minutes and post-phase red-set re-run
ad26ff905:13f0 card: collect env hardening from the retired driver into scripts/onkontrol.sh, 8/8 green, measure gate wiring
493f08c05:08f0 card 3: one live run doc — archive runs 1-4 with a cancellation line, point PROJECT.md at run 5
70c963205:07f0 card 1: inventory measured, not trusted to the document
e49f40f01:18plan: uncommitted work is unowned work, and agents that share a file do not run in parallel
a42a3f701:08R1.3 ACCEPTED: the ruler now catches what it claims to measure
26ed23001:07r1.3 accept: measure goal 4 and goal 6 in-process, proved against a planted 150us regression
31fe1ca01:01plan: R4's five ambiguities decided, and the certain level's false-positive class named
b67b54201:00R4 acceptance: injection, written before the code and red
f6c34ae00:54signals_test: 39 assertions for the detectors, and the threshold is not what protects honest work
b43e34800:53add native/signals_test.sh: regression net under R2's detectors and R3's tier 1
117b5c600:48plan: a budget gate that cannot resolve its own quantity is worse than none
c1ec39e00:47R1.3 PROFIL: save#2 removed — the recorder marks, the exit writes
dab31af00:39plan: a document that states a number goes stale as the code grows
b197ca600:26semantic.h: the threshold comment quotes the numbers this header measures
9d7e0b200:25readme: the core is 20337 lines, not ~17k
7433cb300:20gate: run tier 1 after tier 0, and only where tier 0 said nothing
f4dfd8c00:20R3 tier 1: winnowing k-gram fingerprint over the shape of an edit
1d493b200:11plan: the daemon's win is a measured number now, and the record's shape is what shipped
71fc53a00:09R1.3 PROFIL: the after numbers for both causes, beside the before
2026-08-22 29 commits
78748b923:50last_ledger_mode reads the spool's tail, not the whole day file
22215bb23:47dirty-track the shared state.json write, not just the session file
c12798123:41R1.3 PROFIL: the recorder's cost is a second save(), not the ring
7b9014923:41accept.sh: add GOAL 6, the median at 50 events against the median at 400
419351923:41accept.sh 1b: compare the record's bytes instead of hashing sed's empty output
12b00ef23:41accept.sh: glob the ring file, not the jsonl log it replaced
0773fbd23:19plan: rounds are delegated to agents, and budgets stop measuring process spawn
d7cd5b923:15plan: R3's latency criterion named a tool that cannot see the thing it measures
b69247123:14add R3 acceptance script for the semantic signature, red before the code
ca1a74d21:13R1.3 design D: the record stops being text, and the cost halves
8375c1e21:08R1.3 KARAR: all three options rejected, and the invariant is named
0a240ab21:07orchestration v2: three sessions, three authorities, and the advisor stops choosing from the menu
75099ce20:35R1.3: the hashing left the hot path and took 497 us with it; the parse stayed
f79155f17:31R1.2: the record became an append-only log, and the cost moved instead of leaving
4d0ab0817:25R1.2 acceptance, written first and red: one goal, and a number that can fail
366d84017:24gate: a separate session judges the round, and a third open question is a stop
7a87da917:00R1.1 measured: dirty-tracking bought nothing, and the gate says stop
d873a9d16:58plan: add the between-rounds gate, and apply it from R2's close onward
248e24116:55R2: five detectors over the record, and not one of them speaks
e7d519216:47R2 acceptance, written first and red: five detectors, silent
ad1035c15:44R1 hygiene: T1 recognises the retired plan at the address R0 moved it to
3a1d02315:35R1: the session writes down what it did
832d42315:29postuse differential: the move record is native-only by design, and named as such
0cdfb4a15:18R1 acceptance, written first and red: the move record
a1fdcc815:18T1 and T2 replayed after R0: T2 accepted untouched, T1 red on a path R0 moved
325012915:10plan: the M4 price hypothesis is reopened, and three claims the sources did not support are out
532c8e814:37R0 acceptance: 17 green, 0 red, and the round's two challenges written down
4222ab414:37S0.2: the Makefile stops naming a compiler that a g++-only box does not have
37a0dfd14:37R0 handover: KOSU-RABADON.md is the only plan, and POSITIONING.md is where marketing gets its facts
2026-08-21 9 commits
165949a14:38T2 closed: 21 green, verified on clean ground, two discoverability tests moved to the new surface
fbc987b14:30T2: five commands on the surface, 29 under rabadon dev, and loop.cpp becomes pipeline.cpp
45f556c14:25unknown_verb_probe: a verb explained under rabadon dev is explained where a reader can reach
fd0ac1914:20cli_test: discoverability is the law, not the main screen — read rabadon dev --help too
01923f914:18T2 discards: correct my own claim — fleet is unlisted but still advertised in help
3e1693414:18T2 acceptance: single authoritative list of 29 moved verbs, narrower surface allowance, unlisted-verb regression guard
02881a214:01protocol: T2 counted 25 verbs from memory; the dispatcher has 43, and 29 move
a51fd6700:33T2 acceptance test and pre-round baseline, written before the round by a session that cannot implement it
524af1a00:09T2 opening check: T1 accepted on clean ground (20 green), and why the /tmp run was a confound
2026-08-20 22 commits
24be5e123:56close the contradiction T1 created: the zero-config bar is about one-step install, not about npm
df4719922:54T1 closed: 20 green, scope complete, drift flag cleared
fab4e4822:52T1 acceptance: exempt per-project ledger rows, and assert the dump's total reads 2
e41b17d22:38protocol: separate claim from data in T1.4 — a ledger dump's per-project row is not a claim
0b22f7422:16T1: close what the judge caught — trimming disclosed, stale zero phrasing dropped, challenge narrowed to one line
3ce4c4822:04T1: the project says what it is — canonical sentence, one repair number, no unpublished install command
3b2cd9c21:50T1 acceptance test, written before the round by a session that cannot implement it
a0188cb20:48add T1-T8 product protocol as the handoff document
1cd0b1605:29phase 3: a verdict now says which tree it is about, and the mode is layered; the collapse is blocked on a protocol contradiction
f72d02305:22the seal is broken on purpose and in the open: one line adds the neighbour-isolation test the protocol's Kabul demands
162ba2005:17phase 3 gate: a red in one directory must not refuse work in its neighbour
cbc615004:59phase 2: four honest repairs mined out of express's own history, each one re-run from its artifacts
25c3bbf04:47phase 2 gate: a mined case that does not reproduce is not a case
8b63a5304:38the miner's clean-tree rule was too wide: checkout --force never touches untracked files
547011c04:37phase 1: every repair start now says how it ended, and the 267 that never did are counted not guessed
722992804:01phase 1 gate: every repair start must close with a traceable outcome, and unclassified must be counted not hidden
aef6fc203:53the refusal-length metric was inflating itself: allow is a list, join it instead of str()
1264a7503:52re-baseline the scoreboard on the corrected definitions, old rows kept beside it
5ec315703:51fix the 15 review findings: the miner refuses a dirty tree, the seal covers the js suites, the scoreboard reads the numbers it was misreading
d4f030e03:29phase 0 review: 16 findings across the protocol, the miner and the scoreboard, plus the baseline row
9d15c1b03:26phase 0 gate: the corpus must rebuild from fetch.sh and still refuse 10 of 10
6206e0103:25place the phase protocol, the honest-arm miner and the scoreboard, unmodified
2026-08-17 39 commits
a3fcef320:48V1.2 part one: the test scripts stop naming a compiler that may not exist, and two suites turn out to be wired into nothing
61094d620:41the session log: the project column becomes an identity, make test is green, and the triage list is 41 names
e42251a20:29the deliberate red gets its own target and its own CI job: a suite designed to fail cannot also be the gate
f278d2d20:27the published project field carries an identity, and two withheld projects stop being published under their nicknames
a6833c620:24criterion first: a home-directory session is labelled (no project), not home
7979d0720:15a project identity is not a directory basename: the module, the list and the check
30aa52f19:02the deliberate red moves to the end of the test target: it was hiding 7 suites
cfc894b16:32ci mirrors the local run on both platforms: the gate enforces a public decision without a private list
e161e3e16:27the session log: two decisions recorded, the build stops writing into the tracked tree, and the gate caught its author
bca018c16:20everything under site/ is deployed, comments included: describe the withheld class, never the name
6d5af5f16:14the test suite stops rewriting what the site serves: build.py renders where the caller asks
d8d4bd115:30the session log: the census decided after scrubbing, and 60 names are published without a decision
404566515:29a project name is published by decision, not by default: a public allowlist and the check that enforces it
c3f6e2114:41the rule id was the disclosure: scrub the withheld project name out of the two published artifacts
33de42014:39the census scrubbed the evidence before deciding: withhold on the original text, rewrite only what survives
0c3386c14:37the redbase fix is independently confirmed; promise 2 stays red on rule 2
e74c79013:53ci confirms the redbase fix on both platforms, and the redaction leak is one ci structurally cannot see
db2d95413:47the session log records the silent skip, the measurement, and the redaction leak that owns the next session
dbe3bdf13:46a second edit inside the same two seconds was a silent skip: tool events no longer dedupe on a time bucket
55abd6213:23stop publishing numbers minted on a red base: the field job is paused, the overnight range is tainted
e41fdef13:22promise 2 goes red: the challenge is approved, the status now matches the evidence
6776ccf12:57the field numbers, regenerated from the ledger at 443 recorded and 508 refused
69d84ba12:25the field numbers, regenerated from the ledger at 443 recorded and 505 refused
cd5963807:21the field numbers, regenerated from the ledger at 443 recorded and 502 refused
8055a6206:50the field numbers, regenerated from the ledger at 443 recorded and 502 refused
623999a06:19the field numbers, regenerated from the ledger at 443 recorded and 498 refused
21268f005:48the field numbers, regenerated from the ledger at 443 recorded and 496 refused
ae9590405:16the field numbers, regenerated from the ledger at 443 recorded and 494 refused
2308f7504:14the field numbers, regenerated from the ledger at 443 recorded and 491 refused
e2471ed03:43the field numbers, regenerated from the ledger at 443 recorded and 491 refused
ffe0a4503:25the session log opens with a challenge: promise 2 is red, not done
c224fb203:24the session law ships with the repo: CLAUDE.md is tracked, not local
4c9393603:24add PROJECT.md: the roadmap, the invariants and the session protocol
b6c924303:13the field numbers, regenerated from the ledger at 443 recorded and 490 refused
e926fc202:41the field numbers, regenerated from the ledger at 443 recorded and 489 refused
32e199802:10the field numbers, regenerated from the ledger at 443 recorded and 489 refused
b6f890501:38the field numbers, regenerated from the ledger at 443 recorded and 489 refused
e41e8f501:07the field numbers, regenerated from the ledger at 443 recorded and 486 refused
d4866c300:35the field numbers, regenerated from the ledger at 443 recorded and 484 refused
2026-08-16 29 commits
f6a5dfc23:32the field numbers, regenerated from the ledger at 443 recorded and 482 refused
8cb0c1623:02the field numbers, regenerated from the ledger at 443 recorded and 482 refused
a35200222:43the redactor never saw a rule id or a project label: a withheld project name was live on the public site in five artifacts
920d0a222:37a scoreboard for the four promises, in the owner's words, red on purpose where the work is not done
ed251a921:00the field numbers, regenerated from the ledger at 443 recorded and 481 refused
58c2d4e16:10the field numbers, regenerated from the ledger at 443 recorded and 481 refused
bb57ff815:29the field numbers, regenerated from the ledger at 443 recorded and 480 refused
1208b9a14:58the field numbers, regenerated from the ledger at 443 recorded and 478 refused
7ffb0fb14:28close the three holes the audit found: shell edits went unchecked, the escape hatch was spelling-sensitive, and a passing suite that says 'failing' was called red
5af14d414:28the field numbers, regenerated from the ledger at 443 recorded and 473 refused
d2bca9014:13a red check stops the next action, every action, until it passes
d7a0a9614:03the contract: rabadon states its terms at session start, and says so when it cannot protect you
dc4e0b713:56delete prove: the merge-gate story was never the customer
b30b3f313:43the field numbers, regenerated from the ledger at 443 recorded and 468 refused
137f42513:16the first sweep over real history, and the two ways it caught prove lying about weak tests
e67d0cb13:12the field numbers, regenerated from the ledger at 443 recorded and 465 refused
81836c306:08the field numbers, regenerated from the ledger at 443 recorded and 464 refused
103271805:38the field numbers, regenerated from the ledger at 443 recorded and 464 refused
49fe5da05:07the field numbers, regenerated from the ledger at 443 recorded and 461 refused
cb2c54804:48prove's first two real verdicts: a merged PR that proves its fix, and a merged PR whose own tests never touch it
052413604:45prove: the evidence a change works is not that the tests pass, it is that removing it turns them red
975478f04:36the field numbers, regenerated from the ledger at 443 recorded and 457 refused
7af04b504:05the field numbers, regenerated from the ledger at 443 recorded and 443 refused
28317f103:34the field numbers, regenerated from the ledger at 443 recorded and 438 refused
59e70ca03:19publication blockers: a site that said enforce was off, a benchmark that said zero repairs, and a doctor that calls a broken tree green
ebd1e3a03:03the field numbers, regenerated from the ledger at 443 recorded and 433 refused
af2179b02:55rabadon stops being a claude code plugin: cursor and any other agent, one binding, proven by refusals
c46efe402:33the field numbers, regenerated from the ledger at 443 recorded and 430 refused
7158ca102:06the field numbers, regenerated from the ledger
2026-08-15 27 commits
450ffb504:21the field numbers, regenerated from the ledger at 443 recorded and 428 refused
110be3103:50the field numbers, regenerated from the ledger at 443 recorded and 428 refused
15c611c03:43BLOCKER 2 (second site): a second unfiltered counter contradicted the headline on the same page
bd8cbb203:35BLOCKERS 4 and 6: the docs contradicted the code, the SPEC and themselves
6ad32e603:33BLOCKER 2: one refused number and one watch number, and the remaining gap is named on the page
c677e7b03:30BLOCKER 1: 206 drills were published as field catches with the flag stripped
1f576ba03:25the delete law was a third of the hole: mv, cp, ln, install, chmod, tee and dd reached the switch untouched
bd06a8903:19the field numbers, regenerated from the ledger at 476 recorded and 597 refused
0b2518702:53supervision could be removed with rm, and the tool that records everything recorded nothing
8438f9102:49the field numbers, regenerated from the ledger at 471 recorded and 597 refused
a45bb7f02:18the field numbers, regenerated from the ledger at 459 recorded and 597 refused
fc3e49f02:05the scan reported its own explanation as a finding
5db745f01:59the redactor's own comment spelled out a home path, and on linux ci that path was the runner's
9660ec201:53ci was red on every push for seven findings that were all the word "runner"
5d5e5a501:47the field numbers, regenerated from the ledger at 457 recorded and 597 refused
cacaa7901:40the landing page called watch mode a refusal, and the engine's own source had written the warning against it
3f6e97501:16the field numbers, regenerated from the ledger at 452 recorded and 597 refused
c899b3b00:46the field numbers, regenerated from the ledger at 452 recorded and 597 refused
480b87400:44document what the tool costs, what the exits mean, and one release it never made
00a77b300:38drop the example guard packs nothing has read since they stopped shipping
b3db65c00:34the maintainer's private notes stop shipping with the product
d7b712800:28rabadon no longer spends your money without being asked: the two in-hook model calls are opt-in
b5cbefa00:21the ledger now records what the supervisor spent on your account, including the calls that bought nothing
97ca5fb00:15the field numbers, regenerated from the ledger at 447 recorded and 597 refused
a127b4200:15the supervisor stops picking your vendor: both judge models are env, and an unpriced model says its own name
b02a01b00:07site: regenerate from the ledger after the drill and reader fixes
378148000:07three defects the ledger found in itself: a fixture wearing the headline, a generator judged as work, and a clipped character that broke the line
2026-08-14 5 commits
e7e345721:13the field numbers, regenerated from the ledger at 443 recorded and 597 refused
1f1348920:42the field numbers, regenerated from the ledger at 443 recorded and 597 refused
11f4f9720:11the field numbers, regenerated from the ledger at 438 recorded and 597 refused
dd4237a15:17the field numbers, regenerated from the ledger at 431 recorded and 597 refused
b941c4c14:43the field numbers, regenerated from the ledger at 430 recorded and 597 refused
2026-08-13 2 commits
c5ef3b505:02the field numbers, regenerated from the ledger at 430 recorded and 597 refused
22ae46703:01the field numbers, regenerated from the ledger at 430 recorded and 597 refused
2026-08-12 11 commits
11e0a5122:24the field numbers, regenerated from the ledger at 430 recorded and 597 refused
2e9a17821:53the field numbers, regenerated from the ledger at 430 recorded and 597 refused
286724821:23the field numbers, regenerated from the ledger at 430 recorded and 596 refused
58f908616:43the field numbers, regenerated from the ledger at 430 recorded and 596 refused
cee733e16:13the field numbers, regenerated from the ledger at 430 recorded and 596 refused
aa848e315:42the field numbers, regenerated from the ledger at 430 recorded and 593 refused
294f15c15:11the field numbers, regenerated from the ledger at 430 recorded and 591 refused
fd1187002:35the field numbers, regenerated from the ledger at 430 recorded and 591 refused
e1ff47c02:05the field numbers, regenerated from the ledger at 430 recorded and 591 refused
eb796df01:34the field numbers, regenerated from the ledger at 430 recorded and 589 refused
e12474901:03the field numbers, regenerated from the ledger at 430 recorded and 589 refused
2026-08-11 4 commits
89aa77521:23the field numbers, regenerated from the ledger at 430 recorded and 588 refused
ca22eac19:22the field numbers, regenerated from the ledger at 430 recorded and 588 refused
2f712e918:10the field numbers, regenerated from the ledger at 430 recorded and 588 refused
eb431b707:59the field numbers, regenerated from the ledger at 430 recorded and 585 refused
2026-08-10 7 commits
6af0b3421:48the field numbers, regenerated from the ledger at 430 recorded and 582 refused
e011cee21:17the field numbers, regenerated from the ledger at 430 recorded and 579 refused
4cb4bcc17:56the field numbers, regenerated from the ledger at 430 recorded and 578 refused
729319717:26the field numbers, regenerated from the ledger at 430 recorded and 578 refused
5e7972716:38the field numbers, regenerated from the ledger at 430 recorded and 578 refused
8d2aab016:07the field numbers, regenerated from the ledger at 430 recorded and 574 refused
14092d615:37the field numbers, regenerated from the ledger at 430 recorded and 571 refused
2026-08-09 10 commits
0a3b04320:27the field numbers, regenerated from the ledger at 430 recorded and 571 refused
3ec0c4f19:57the field numbers, regenerated from the ledger at 430 recorded and 571 refused
76fecd719:26the field numbers, regenerated from the ledger at 430 recorded and 570 refused
9e2112318:56the field numbers, regenerated from the ledger at 430 recorded and 570 refused
4ebfd7318:25the field numbers, regenerated from the ledger at 430 recorded and 569 refused
04268a917:54the field numbers, regenerated from the ledger at 430 recorded and 569 refused
88f9b7117:24the field numbers, regenerated from the ledger at 430 recorded and 568 refused
219bf5516:53the field numbers, regenerated from the ledger at 430 recorded and 567 refused
2f4f34a16:23the field numbers, regenerated from the ledger at 430 recorded and 567 refused
100363c15:52the field numbers, regenerated from the ledger at 430 recorded and 565 refused
2026-08-08 10 commits
843479223:03the field numbers, regenerated from the ledger at 430 recorded and 565 refused
7e2d6a122:33the field numbers, regenerated from the ledger at 430 recorded and 565 refused
2f8f64021:46the field numbers, regenerated from the ledger at 430 recorded and 565 refused
53509a916:25the field numbers, regenerated from the ledger at 430 recorded and 565 refused
19411d016:24the fixture inherited the runner's default branch, so a probe about a missing remote died on a refspec instead
35541b216:14the release that never reached the registry: three tags died in the build, and the runner was grading eight cases it could not run
a8a8cea15:54the field numbers, regenerated from the ledger at 430 recorded and 559 refused
43be66815:36the repository had nothing anybody could watch, and the recording it got caught the tool printing its verdicts before the runs they belonged to
2d90c1b15:24the arbiter was refusing correct fixes nine times in twelve, and both reasons were rabadon's own
681c87615:24the field numbers, regenerated from the ledger at 430 recorded and 558 refused
2026-08-06 2 commits
6a11c6501:21the field numbers, regenerated from the ledger at 430 recorded and 556 refused
9d5bb8700:50the field numbers, regenerated from the ledger at 430 recorded and 556 refused
2026-08-05 21 commits
7657ba813:49the field numbers, regenerated from the ledger at 430 recorded and 555 refused
54f785810:28the field numbers, regenerated from the ledger at 430 recorded and 555 refused
11d8b6209:17the same missing module was in three test files, and the two releases that died each fixed the one the log happened to name
31fe88807:04the field numbers, regenerated from the ledger at 430 recorded and 552 refused
ec3f76605:40the release died twice on the same missing module, because the fix was written into one test file and the identical assumption sat in another
7affa1804:28the field numbers, regenerated from the ledger at 430 recorded and 549 refused
e0c19af04:28the project name on every record was the home path in another alphabet, and three checks in a row were looking for a slash
2ddc91e03:43a harness file added as a symlink is still a harness file: the scanner skipped links and an ignore-the-failing-test config walked in behind one
436ca2a03:39the script the check runs is part of the harness: a proposer that rewrote it to exit 0 was earning a verified verdict the suite never gave
a528c2103:30the landing page declared a canonical url for a repo that does not exist
8d046b703:26a suite that cannot run a case now says so instead of failing it: the release build was reporting a missing interpreter as four broken locks
cf010a503:19a coin flip stopped counting as a held repair: the ungradeable run gets its own ledger event instead of borrowing the word OK
0b319eb03:09the switch a supervisor cannot read now enforces instead of going quiet: three fail-open paths closed, an absent flag still watches
92a6efb03:02the release lab let the host name its branch: a runner that defaults to master killed the publish job, 2 failures reproduced and closed
bd0449a02:50a check that reads what the domain serves, not what a generator meant
876918602:50the census is written through the redactor or it is not written
4771d3302:50the redactor a file wrote for itself protected only that file
51e374202:16ignore root .env variants and editor leftovers
477e3d002:15move turkish session handoff docs out of root into docs/internal
d9f638702:15stop tracking HISTORY.md: it was added to .gitignore and committed in the same commit
f6e951100:27the published tarball stops carrying its own tests: 69 files to 53, and the bench source stays because make all builds it
2026-08-04 14 commits
03f407523:45the field numbers, regenerated from the ledger at 430 recorded and 509 refused
aac2edc23:14the field numbers, regenerated from the ledger at 430 recorded and 507 refused
f34adf922:55a trace was a folder's whole history and a tool call was two zero-width marks
8a7302a22:13the field numbers, regenerated from the ledger at 430 recorded and 501 refused
0730dca21:43the field numbers, regenerated from the ledger at 430 recorded and 501 refused
4b8a8d421:12the field numbers, regenerated from the ledger at 430 recorded and 499 refused
08f651020:46the gate held the id that pairs a tool call and spent it on deduplication only
16688a814:39the field numbers, regenerated from the ledger at 430 recorded and 497 refused
ef0690114:12a millisecond epoch times a million does not fit in the type it was multiplied in
65caefb14:08the field numbers, regenerated from the ledger at 430 recorded and 497 refused
8e223d313:59the star ran two steps ahead of the word and that only reads well in a comment
4ce641713:37the field numbers, regenerated from the ledger at 430 recorded and 495 refused
237c6f413:06the field numbers, regenerated from the ledger at 430 recorded and 495 refused
ff188b912:36the field numbers, regenerated from the ledger at 430 recorded and 494 refused
2026-08-03 47 commits
0f6967423:57the field numbers, regenerated from the ledger at 430 recorded and 493 refused
94a594e23:26the field numbers, regenerated from the ledger at 430 recorded and 493 refused
c0cdf2623:04the field numbers, regenerated from the ledger at 430 recorded and 492 refused
efad5d523:04the page had two numbers on it and the publisher only watched one
7b7859822:29a rule could prove it was not too wide and nothing could prove it was not too narrow
7d2264922:25the field numbers, regenerated from the ledger at 430 recorded and 490 refused
69db43022:07the thing supervising a fan-out kept the last four sessions, and seven were running
0113f5a21:55the field numbers, regenerated from the ledger at 430 recorded and 483 refused
6aca9f621:24the field numbers, regenerated from the ledger at 430 recorded and 476 refused
ebafdb620:42the census was re-run against the repaired gate: 411 of 430 became 425
d6d81b920:37the otlp export lost eight lines in eighteen and said nothing
a460bf020:36the field numbers, regenerated from the ledger at 430 recorded and 473 refused
74404c120:19the push gate could not run any repo that activates a toolchain first
854883820:05the field numbers, regenerated from the ledger at 430 recorded and 470 refused
cfde84419:59handoff: the unanswered review comment is half right, and the half matters
e750ec314:43the field numbers, regenerated from the ledger at 430 recorded and 469 refused
54f516014:43the census of every guard rule on this machine, on the page
54d918314:40two ways a rule could lint clean and never fire, closed
0b953d914:40a red needs evidence of its own, not just the absence of a green
637391314:32the field numbers, regenerated from the ledger at 430 recorded and 463 refused
0b47fe114:27'the pattern did not match' was being read as 'the suite failed'
730c15914:22only a green rabadon ran itself may skip the push gate
fc7d69714:16the push gate asked a timestamp question and the session could write the answer
05e01dc14:10discovery decides by where a file lives, not what language it is
e6363a314:06a suite in a language nobody listed was never locked
eae43a814:05the field numbers, regenerated from the ledger at 430 recorded and 456 refused
f9b2d4c14:05a failed push exits zero, and a scheduler only ever sees the exit code
de089aa14:03the deploy was never the publish; the alias was, and nothing was moving it
1b0bec814:02a project's law stopped at the directory the session happened to start in
69b04e514:02the field numbers, regenerated from the ledger at 430 recorded and 456 refused
d84119b14:00handoff: commit on every move, not every step
b384d6a13:59the field numbers, regenerated from the ledger at 430 recorded and 456 refused
75fa7b113:58the field numbers, regenerated from the ledger at 430 recorded and 456 refused
55dcee313:58handoff: one job for the next session, the layer that decides what to protect
f1fe37f13:56the field numbers, regenerated from the ledger at 430 recorded and 456 refused
fad012e13:55the field numbers, regenerated from the ledger at 430 recorded and 456 refused
c8c10c213:48the refusal count means nothing without the count of refusals that were wrong
43ba38d03:03the field page, rebuilt at the last commit of the night
feb2ddd03:01a report cites the command, and the ledger holds the whole line the shell ran
554d50202:51the field numbers, regenerated at the deploy the page describes
8c9625b02:502>&1 is a descriptor, and the delete law read it as a file named 1
7730c1f02:35a number in a report can now be asked which run produced it
8faacf802:24nine days of evidence were on disk and no page had ever asked the ledger for them
474671102:16the engine recorded writing a rule that is in no guard file anywhere
c1c5e6c02:07redaction matched whole strings, and the gate had already cut the path in half
66007ca01:47nine days of evidence were sitting in a file nobody rendered
f561e9601:12the rules a person writes were the only layer that could be stepped out of
2026-08-02 43 commits
62dcd4412:08the walk that decides where a delete happens followed one verb and misread its argument
b49f97211:52the destroyer does not have to be called rm, and one speed filter was hiding all of them
3bda2af11:27the target the drift check measures against now has a history
d539d4311:24a session may make its own supervision stronger and never weaker
304bcf710:53the strength number said 1 for the strongest rung and 0 for none, so it could not be compared in either direction
6736e7410:37git has more ways to lose work than push --force, and the law named none of them: 58 open escapes go 49
8f55ac610:08a rule that refuses everything passed lint, because only firing was ever checked
bbd5c7c09:36the handoff is session state and it was riding into other people's pull requests
288730609:27the ledger label was cut in bytes, so a three-byte character left two orphans and the line stopped being json
c0a589808:49a table is a table: alignment moves from padded strings to the browser
e100b3e03:23devir: the fixture number and the ledger number, and why enforce stays off
b94c70403:21the fixture says 100.0% and the ledger says 26.3%, and both are now on the page
066556103:11the ledger says the gate refuses 57 times and 42 of them are the operator's own work
e91e24703:01devir: eight fronts closed, what was measured, and the four that were not
aa8d66202:59site: the cheat corpus table, ten families against the binary that ships
bdbc44802:58discovery had three silent bounds, and a suite it cannot see is a suite the lock cannot cover
a5b4f1402:47the lock was strongest on small suites and absent on large ones: 122 files discovered, 0 locked
43e43cf02:43the guard the suite lints was never in the repo: suite 14 of 58 died on a clean clone
29064ba02:33the overview shows both suites: eight ways of buying a green, six twins that still certify
0450f9e02:32the two cheats no hash can see: a green keyed to the test's own input, and a comparison the patch invented
787bbd902:21the domain was answering a login screen, and the public url was serving last week's page
aea320f02:17a worktree's config is not where its .git is, and the suite now says so
28ff57802:15the number on the page and the run behind it: 42.0us was unmeasurable, the overview was hand-kept
71ddf5902:12name the branch a config refspec writes, not the refspec
6d6c32702:05resolve the branch in the repo git will use, not the one the shell stands in
6d4019902:02resolve the branch in the repo git will use, not the one the shell stands in
72c8bd801:58a lease is not an excuse, and the excuse was not about order
a95ecc601:54an unambiguous prefix of a long option is that option: four commands the laws could not read
03ee0cf01:48the repo a push rewrites is not the one the shell stands in: red proof
927173b01:37partially qualified refs: the red proof that heads slash main reaches the branch and the law does not
217925201:18devir: what is measured, the two claims that are not, and the work in order
4f944ac01:15two wrapper names the laws could not see, and the tail the run left uncommitted
b3ec16c01:04one ledger day, one name: the loop and the direction check were writing to a file the gate never opened
0d3d4d900:55the ledger day is utc, and the suite was preparing a file the gate never opens
239e65a00:44a wrapper the table does not name is still a wrapper: 14 red checks go 63 green
d53cfb300:37a launcher that ships with the machine is still a launcher: 37 red checks go 80 green
16c718d00:30a wrapper the table never learned is read as the command: 34 red checks go 64 green
501edc500:30lock the jvm and go build files, and say plainly which of them was proved
9e74a5500:25a session recorder is a wrapper, and it eats a file first: 26 red checks go 61 green
9a9329e00:23a tool finder is not the tool: 29 red checks go 90 green
43f2e0200:21site: fill the line instead of stretching the box, and name the defect instead of its shape
170fcd700:15site: the claim on top, the argument beside the evidence, and no box wider than the run inside it
2b97be100:08site: sell the benefit first, then the named proof, then the record behind it
2026-08-01 166 commits
8b8f4bd23:46the tag example in the floor table was a version literal the release script never touches
47b080323:29the floor table names the law that removes a branch
34d0fec23:24a push that names no refspec is not a push of head
1a6de7623:21site: one centred column at 1280px, heading then its own text, tables as terminal blocks
a0ead7f23:18site: name the project and print the line the ledger wrote when it refused
3b40f1823:16a ref the repo resolves is not a branch name: 45 red checks go 106 green
d6f9ac223:05a clustered short option is still that option: 27 red checks go 74 green
873b2ab22:52a refspec with an empty source side removes the branch: 20 red checks
f2cddaf22:48site: the page a buyer asks for is what it caught, not what was committed
ef92f6422:32site: four pages, and the three that cannot be written by hand are generated
aa6e89322:18an argv element is one word: exec stops re-splitting it, 55 checks go 63
28734d922:18one parser resolves the alias git resolves: the 28 red checks go 55 green
f202e4d22:05a loop header is an assignment the line writes down: 27 red checks go 29 green
0b8d62222:09a name the line binds and then runs: the suite goes 18 red to 44 green
a77764922:03a reserved word is not a command name: the suite goes 24 red to 55 green
f2ecc7e22:00the shell accepts two more prefix spellings, and both walked past the same predicate
7c8730321:56a verb written into a config value: 28 checks red before the parser learns to read it
43d1c7121:55one predicate reads the NAME, not the whole word: the leak suite goes 8 red to 30 green
b30332821:53a command inside a loop or a conditional is not judged: 27 of 27 checks fail
ceda1bf21:51a slash inside a variable VALUE switched every law off: the new suite is red 8 of 30
c70f42121:14one list decides which roots are scratch: the env-named root goes 11 open of 12 to 0
2b207b520:59the same file, written and then run three more ways: 63 -> 78 checks
221726320:52one parser reads what a shell will read: 63 of 63, and the three cases go 0 -> 2
21a483d20:52the judge now refuses a green it did not grade: harness files are hash-locked
a740d5f20:43text a shell reads from stdin is never judged as a program: 33 of 63 checks fail
d13133a20:34one resolver: precision 55.0% -> 100.0%, recall still 100.0%
880b0e520:27devir: current state, the one blocker, the open work, and the decision to run watch on foreign ground
fd9462020:23one question, two answers: the failing test that measures it
9f549d720:22spec: the repair loop turns on its own rules, and a rule change is held only if precision rises with recall intact
579d39020:17devir: what is measured, what is open, and the one number that blocks enforce mode
9cbea6216:43five shapes nobody enumerated land too, which is what one parser was for
703406016:38one parser: the twelve spellings the laws could not read were the second parser, not twelve dangers
dbc46f216:35trace: the fail-open sibling can no longer stand in for its day ledger
2cc468316:27trace: measure ledger loss before pricing the saving
db36f3c16:19twelve spellings of a refused command walk past the compiled-in laws: the failing test that measures it
e1107d216:06the temp carve-out covers the caller's own scratch, not the shared root's list of entries
6a0351a15:29the sentence the docs promise about a wildcard target now matches what the gate does
9e3a32515:25the delete law computes where a pattern lands instead of reading the text before it
882c60915:22a pattern is judged by its prefix: 13 checks fail on a target that leaves the temp area
2db3bf914:47the delete law reads the system scratch area as scratch: 73 of 73 wild refusals were the agent's own temp dir
fda74e714:31a deny rule now reads the command a shell will run, not the text it carries
4d6fd2814:09measure how often a refusal is the right refusal: 33.3% on the watch-mode ledger
108706613:16the rejected word goes into a case pattern, so it is pinned as data not glob
ec740bc13:13the verb list a stranger is shown is now asserted equal to the one that routes
a67910b13:10a mistyped verb answered with a menu that hid the product: the list is read off the case arms now
7b731a312:59docs and --help stop promising exit 0: the ledger has a failed-question code now, and says which one it is
4473ec312:58asking for a project is its own bit: --project "$P" with an unset P answered for the whole machine at exit 0
978f36212:56a window that ends before it starts is refused where it is read, not rendered as a heading over an empty answer
9c8923512:55the wrong project name now names itself and what the window does hold, on all three renderers, at exit 1
db148ba12:55a filter that matched nothing is a failed question: the ledger answered a wrong project name with onboarding copy at exit 0
dc4a97409:09docs: name what the saved: line is allowed to say, since the section promises every number is in the ledger
7a0ff7e09:08a refused attempt is not a STOP: the line said "steps 2-3 NEVER ran" over three STEP_OKs
953ee9709:03the step range is the run's own, and a catch on the last step has no range to print
235d30e09:01the saved: line counts a step range backwards and names a step 10 no run ever had
3056b9108:49the routed view drew a dead step green: "not escalated" is also true of a step that escalated nowhere because it died
c4640e608:47the third reader of the spool now has a suite, and `make test` runs it
9293eda08:47the repair would have sold a WATCH verdict as enforcement: same orphan shape, opposite fact
3734e6208:43a run that called no model was billed for one: the refusal header said "? · 0 tok · $0 · claude -p"
2697a5808:41the refusal row was drawn as a fake fix that got caught cheating: an event that never happened
49a1fac08:40a catch with no step to hang on was dropped on the floor: trace now opens the step the refusal names
734c40608:38trace had no suite: a refusal written by the real gate and the real exec renders CAUGHT 0 while usage says 2
d3fccf808:18the same swallow wearing a file extension: a ledger path that does not exist answered with 21568 lines of the default spool
087f42608:16the reference section for trace was "still to be written" while its one documented form did not work; it is written now, and it names the exit codes
c47b94608:14an absent run is a failed question: "(no matching run)" left stdout at exit 0, so a caller could not tell it apart from a run with nothing in it
4dddf0308:13a run id addresses the spool, not the newest day file: --run now searches the --days window like usage, export and audit
b97332808:07the documented form `trace <run>` was a swallowed word: a bare positional now names a run, not a file that does not exist
23eef5b07:57the fixture line the whole defect hid behind is now the producers' shape, and the state.json alias is tested as what it is
51dcb6f07:55a priced verb this repo has never heard of keeps both its usage and its raw fields
93ab8e207:54the readme sold gen_ai attributes the export could not produce, so the docs now name the exact keys and where they come from
4bd061207:53cost never left the machine: usd_e6 appeared nowhere in export.cpp, so the one number the product sells was missing from the standard surface
154853207:51the exporter now reads the token keys gate.cpp and loop.cpp actually write, and 180 spans of this ledger stopped leaving empty
282f95007:48export_test built its genai fixture in the reader's key names, so the arm passed over bytes no producer writes
082a57707:41drill.h said two readers and there were three, so the readme claim was thin
331236107:40the exclusion is per run, and the fail-closed branch is a brand number too
c891e3407:38trace counted rabadon's own self-tests as catches; now all three readers agree
f1854b007:35the build could not have noticed trace ignores drill.h
25099af07:16the header still promised six ev values out of ten
cde57f807:15a span with an empty name is a blank row, which is vanishing with extra steps
add257507:14a generic span that throws the payload away still loses the event
969a4f407:12export_test arm 8: eleven ev values in, eleven spans out, counted
614d5f007:10the exporter's allow-list dropped two of spec's own ten ev values
838194f07:02the lock sits in the gate's hot path, so only EEXIST may cost it time
a83f43e06:55chain.h documented a second day file that no longer exists
86ac84b06:54the bus test asked for the private file by name, so it had to be told
6d5b2fa06:53the bus writes the day file every reader tails, and now it may
e7dd3f006:52the chained file's mutex is now one both languages can take
ea5f59606:50the two chain implementations share no mutex, and nothing was asking
75d25a706:34both lock failure paths are exercised, not just the happy one
46876d206:33chain.h counted three writers and the fourth was the shipped api
5254af006:32the bus spool verifies as a chain, and the lock is what makes it one
aaff57906:30the js bus now chains, so the public api costs the ledger nothing
33d5eb106:28the shipped js api is the ledger fourth writer, and it does not chain
173f36706:18the trace renderer had the same blind spot, quieter
c4de8bd06:14spec: serialization was never part of the ledger contract
93607f006:13the exporter arm: same events, someone else spacing, same spans
c7ca52806:12the stranger arm: a stock serializer is not tampering
2e338a506:10the otlp exporter reads the ledger, not its own whitespace
1dd262806:09the migration count agrees with the referee on what "chained" means
6fb398506:07the referee parses json instead of fingerprinting its own printf
b1df11105:48the exec pipe keeps its surface; the ledger is what folds it
6793e1f05:46the fold holds for the repo filter, the json, and the odd labels
06cc96005:45one repo is one row: the ledger folds the surface off the pipe
45abc5005:45the exec pipe forked one repo into two rows in the usage artifact
f09cad805:39"every verb of the rabadon CLI" was a claim the file no longer met
f9989cc05:37the discoverability check was passing on prose, not on the verb list
320167b05:35a verb nobody can read about is only half-shipped
be15a5005:34the verb list is now read off the shipped binaries, so the next one cannot hide
05e8deb05:30lens was not alone: nine of the sixteen shipped binaries had no verb at all
8e67d9905:29the cost half of the product shipped in every package with no verb in front of it
178f33605:16wire the lint suite into make test and make the docs match what lint now refuses
7f49c5f05:15make would not rebuild the rule engine's callers, so the proof could run stale
408498f05:14lint now reads the rule object, so a typo cannot be certified as law
64eab0005:11a one-letter key typo in a rule passes lint while the gate ignores that rule
b73d2d504:52the second sample is charged only where it keeps a verdict from being a guess
08d4f3204:50the published exit codes did not have a word for a check that cannot be graded
ba8187f04:49one red arbiter run threw away a fix that ran green the next invocation
6ca7fde04:47a green entry sample the checker never re-ran dropped the catch on the floor
caf6de304:36the help screen promised one rule and the command now keeps four
273d94e04:35a drill whose marker is a heartbeat is still a drill
dab038904:34the one surface that leaves the machine shipped 3,442 of rabadon own events as spans
d0674aa04:31the four drill rules move into one header without moving a single number
0b0842d04:23the postinstall build counted the core by rabadon-gate alone — 15 of 16 read as "already built"
3f9dc0104:21one derivation of "what the native core is", in install.mjs where nativeBin already lives
dc4bc6f04:19the doctor sample in the docs showed the six-name count it no longer prints
e70510504:18the doctor suite joins make test now that it is green — 17 passed, 0 failed, 3.6s, no network
0e9485004:18doctor reads the Makefile now: 10 absent binaries, named, exit 1 — was "all green", exit 0
0e824eb04:16doctor: a suite that fails on the current doctor — 10 absent binaries read as "all green"
6b3ecbb03:52docs: the third way a repair can refuse now has a name in commands.md
43ad80803:51the isolation suite mutation numbers are measured now, and one of them was wrong
ecb6ac403:50the isolation suite joins make test now that it is green, 1.7s and no network
8f3bc5c03:50repair now refuses to grade a fix its copy would never read: exit 3 when the check resolves outside the isolated copy
5b0efb503:47repair: the isolated copy was not isolated — an editable install anchors the check to the original tree
8b252a103:36the make arm asked make a question whose answer the caller's environment could set
2217f3d03:35version.h claimed doctor watches for drift; doctor asks one binary out of sixteen
8dfcde503:33version lockstep joins make test, first, before anything else is asked of the tree
4f8c0dc03:32the make arm used to disable itself after one pass, which is the hole this file is about
4bcc4b703:32the quickstart said 0.2.0 in prose, where nothing would ever have bumped it
ea9dfbe03:29make now rebuilds on a version bump; before, it answered "up to date" and shipped the old string
971ba6303:29budget and drift now say the version the repo says, by reading it instead of repeating it
b8cd48403:28two of the sixteen binaries announce a version no manifest says, and make cannot fix it
4386d4603:19readme: --help is now part of what the tool promises, not a thing sixteen binaries each got wrong differently
d21135d03:18the help gate discovers its own subjects: a seventeenth binary cannot walk around a hand-kept list
e2b854303:17an undefined flag is now named back by all sixteen and buys no output; proven by rebuilding lens from the pre-fix source (4 fails)
79083fc03:15the six that swallowed --help now name themselves; gate and drift refuse a typo without ever blocking, since a hook exit 2 means block
b5bf77f03:12the seven binaries that answered --help with exit 1, 2 or 3 now answer with a help screen
771052503:09help stops hanging: rabadon-do no longer bills a model call for --help, rabadon-serve no longer opens a socket for -h
39b7d2e03:08trace --help printed 31798 bytes of the live ledger; now it prints 733 bytes of help
15214c802:58spec: g3 stops being a promise — the gate now names the ledger number that clears it
38e1dd602:58g3: two held repairs and one refused fake are the same code path, only the proposer differed
a65921b02:54repair: a fail-closed rejection that shows no output cannot be told from a flaky suite
1ee1ac202:46g3: the first held repair on a stranger repo — express, 91 locks, counter moved 0 -> 1
c930d6902:34repair test: record the mutation runs that make case 7 worth having
c57a1ae02:33repair: write down that VERIFIED is earned by the lock, not by the green
e64820802:32repair: the screen now says what the ledger says when nothing was locked
2d0d11102:31repair: a test that fails today — zero locks still prints the word VERIFIED
d3669f302:24lens: a transcript that died mid-write must not make the ledger talk back
9329b3902:22lens: the footer is now held to the same rule as the rows
ae20dc002:20lens: the suite no longer reads the transcripts of whoever runs it
a110da702:18lens: the byte-exact ledger claim now has transcripts of its own
976176702:10proposer: record what the live demo proved once the argv was fixed
6bf53b902:07build: the proposer argv test runs in `make test`, so the bash 3.2 path stays covered
b596f9a02:07proposer: the metrics sidecar claimed best-effort but printed a shell error
14b302502:06proposer: the un-routed run now actually spawns claude, on bash 3.2 as well
211cfab02:05proposer: the default path never reached claude — macos bash 3.2 calls an empty array unbound
8c5aa4900:16route: a negative assertion pinned to a renamed string passes for the wrong reason
960865200:11cli: the first three things a stranger types all did the wrong thing
2026-07-31 31 commits
2e3a63123:59exec: the escape hatch was sold as the hard boundary — it now enforces the same law the hook does
63b3b3423:45numbers: the bench was measuring a gate nobody runs, and one counter was holding four different facts
318b05b20:44readme: the linux kernel fence has evidence now, and a badge instead of a promise
a74e7d820:42sandbox: presence is not capability — --check now asks the backend to do the smallest version of its job
ab3894b20:38sandbox: the linux fence was handed freed memory, and the suite could not tell a dead backend from a kernel refusal
0ad1f7620:35ci: install bubblewrap on linux, because a skip that reports 'passed' is worse than a failure
5674abf20:32the first ci run failed on linux: this has never compiled on a modern libstdc++
64d81c120:28npm i -g rabadon installed a gate that guarded nothing, and no test walked that path
d91b9e620:17two bugs the first real ledger found: the migration undercounted by one, and a friend was being called an attacker
e23a31220:11baseline: a command that is neither git nor rm leaves the gate's hot path untouched
645926e20:07three laws compiled into the gate: a repo with no guard.json is no longer a repo with no gate
204286619:56the ledger's head sidecar is now the authority: a stripped chain, a re-stitched deletion and a deleted day file all convict
0cf3cf918:07release matrix: macos-13 retired in Dec 2025 and a retired label does not fail, it queues forever — the 31.07 dry-run had three targets green while darwin-x64 sat unscheduled, which fail-fast would have turned into a silently stranded release; darwin-x64 moves to macos-15-intel and darwin-arm64 off deprecating macos-14 onto macos-15
031a49717:53handoff: v0.3 wild-proof milestone — five real catches in five foreign repos, live repair with 91 hash locks, three wild-found bugs closed same day; the open front is phase 5 (npm org + token + tag + show hn), all manual
44f346017:50net single-flight test: wait for the lock file instead of napping 0.4s (a cold CI runner loses that race and double-counts), and use a sleep duration unique to this test so a shared runner's other sleeps are not counted — first release.yml dry-run caught both
ad6bfe317:45repair's hash lock now actually holds in the wild: truth discovers the singular test/ convention (express keeps 91 test files there and the old heuristic saw zero), reads the guard's own testPaths as law, and stops silently capping the lock list at 32; repair reports the lock count out loud and refuses to claim 'hash untouched' when it locked nothing — before this a test-neutering fake fix sailed through a foreign repo as VERIFIED
93d966e17:34close the git -C bypass: an agent in the wild wrote 'git -C <path> push --force origin master' and slid past every git\s+push deny rule — both gates now retry the match on a git-global-stripped form (-C/-c/--git-dir/--work-tree/--no-pager), raw command tried first so rules can only catch more, never less; the push gate trigger gets the same treatment
8708e0517:27one home rule: RABADON_DIR, when set, carries the mode flags (enabled/silent) as well as the spool — before this the gate wrote events to RABADON_DIR but read its mode from HOME, so an isolated run could flip or obey the wrong machine; drift's enabled check follows the same rule, and every native suite now plants its flag inside the RABADON_DIR it passes
5a99fd817:09guard authoring works on a stranger's repo: evidence = law files (README/CONTRIBUTING/AGENTS.md/.cursorrules, case-insensitive, nested .github|docs) + project facts (manifests, two most test-shaped CI workflows); deny rules still come only from law, test plumbing is derived from facts; lint learns the pushGate and evidence keys it was wrongly flagging
ee7187316:54handoff: v0.2 rework milestone (installable + kernel enforcement + verifiable ledger + real repair + honest docs); the open front is now npm publish, not a missing capability
2382a6f16:51docs: honest README rewrite (kernel enforcement, audit, real repair, OTLP export front and center; ui marked a stub; npm-publish gap stated) + a full docs/ set (quickstart, commands, guard, how-it-works, threat-model, faq, uninstall); SPEC gains the hash-chain prev field, WOULD_BLOCK, network deny, and kernel-fence semantics
4cb76e516:40prebuilt distribution: four @rabadon/<platform> packages with os/cpu gates, main package lists them as optionalDependencies so npm i -g rabadon lands a compiler-free binary; GH Actions release matrix builds reproducibly (SOURCE_DATE_EPOCH, static-linked linux) and publishes with npm provenance; prepare-release keeps every version in lockstep
523737b16:38gitignore: stop tracking compiled binaries — one glob covers every rabadon-* executable while keeping the .cpp/.h/.sh sources; untrack the four that slipped in
b5ccf4116:38the ledger speaks OpenTelemetry: rabadon export --otlp emits OTLP/JSON traces (one trace per session, refusals as ERROR spans, GenAI semconv token attributes) so any backend — Jaeger, Grafana, Langfuse — can render a rabadon session; drills stay local, proven 7/7
9c9ceb216:34init/remove/doctor become real: init falls open to a baseline guard when authoring is unavailable and lints before wiring, prints what it did; rabadon remove strips exactly its own hooks; doctor checks binaries/version-lockstep/sandbox-backend/global-hook-health/spool; gate --lint catches typo'd keys and uncompilable regex; spool auto-prunes past RABADON_SPOOL_DAYS on session start
fe848e716:28kernel-enforced guard: rabadon exec compiles protectedPaths + network denies from guard.json into a macOS Seatbelt / Linux bwrap profile, so a forbidden write fails with EPERM even when the hook is bypassed; refuses to run unprotected when a fence is asked for and no backend exists; proven with real OS denial 8/8
86380ac16:25the repair loop is real: caught red -> claude -p proposes in an isolated copy -> the same check re-runs green + hash-locked test files -> the verified patch is held, never silently applied; fake fixes rejected, proven 13/13
b9607b016:19tamper-evident ledger: every gate event carries prev = sha256 of the previous line (flock-serialized, head sidecar), rabadon audit names the broken link by line, replay renders the verified timeline
663094b16:14usage: the ledger groups refusals by rule id with the rule's why, watch verdicts become a first-class bucket, drill fires the real gate without polluting the numbers, report/--json/--md, empty state teaches the first command
2f3d40616:04portable install: self-locating cli, native-gate hooks with repair and removeHooks, npm package skeleton (source build on postinstall)
2026-07-29 22 commits
710798809:33handoff: the product model damla corrected today (agent not code, cost is the pitch, arbiter is the deed), what shipped, 4 bugs the tests caught, and the honest open gaps
f0856f709:01the ledger stops overstating: gate-side REPAIR_* events now say what they actually were (diagnosis / rule / testrun) and the trace counts only real repairs — installing a rule or watching a green run no longer inflates the repair count
799617308:57the net RUNS: on-mode edits fire a detached bounded check, the next tool call catches the green->red transition and feeds the correction back; watch spends zero cycles on the repo; a timed-out check is inconclusive, never green; fixed a level-3 rung that could not fail (compileall skipped cached files)
9ce794f08:49truth: find the strongest runnable check a repo already has (suite > build > syntax > none) — measured on 66 real folders, 32 have a runnable truth vs 7 if only tests counted; the npm no-test stub is refused
a739c4008:16three states: watch records what it WOULD have blocked without touching anything, on makes the same verdict a refusal, silent stays fully dead (child-recursion guard intact); statusline reads all three
8aa4f3505:25statusline: the ON lamp breathes (6s lilac ramp, phase from wall clock, star leads the word); OFF stays dead and static; pinned-clock lamp test 7/7
ea36e0905:07verified routing: measured live A/B — control(opus) $1.6933 vs routed(haiku,opus) $0.2758, 5/5 proven cheap, both arms accepted; escalation not triggered live and the handoff says so
dd58df605:00second face: verified routing — cheap tier first, the same arbiter decides, auto-escalate on rejection; two-arm measured A/B in the trace (no price table, no estimate)
ae9694c05:00tests: hermetic HOME so the default-off gate is actually exercised (32 checks were silently passing on a dormant gate)
b08f01504:30handoff: second face = verified routing (cheap model -> deterministic arbiter proves it -> auto-escalate); cost is the wedge, the arbiter is the moat; rejected dark/no-code-buyer/cost-only directions
008a57003:59step D: rabadon-trace native renderer — langfuse-grade catch/fix/proof/cost trace; byte-exact token/$ fused into the spool from claude -p's result event; trace_demo proves it on a live 5-step repair (bug at step 3, steps 4-5 clean base) + cheat fail-closed; rabadon trace is now a CLI verb
986541803:37handoff: B/B2/C proven + default-off toggle/lamp; next = step D trace renderer
64a10da03:23step C: door-less deep bug in a REAL module, caught by the always-on net, LIVE claude -p repairs it, fake fix rejected
661579703:13statusline lamp: keep the * star (lilac on / gray off), not a circle
811c0dd03:02status lamp tells the truth + 'rabadon' command is a real toggle
7ca5f1002:09rabadon is DEFAULT OFF: native gate/drift dormant unless enabled
e22fdd101:58step B2: proposer exits on model-done, not on process-exit (181s -> 21s)
822e76901:54step B: real claude -p proposer closes the toy bug, arbiter accepts (REPAIR_OK)
f97379101:24handoff: default repair to propose-and-hold, not silent-apply (GTM risk #1 — a wrong auto-fix kills trust worse than a wrong alert); precision as public benchmark
7c6ed9501:12seal: next-session handoff — the sealed north star. rabadon = superset of langfuse (see + STOP + FIX + report), not a local clone. proven so far: repair loop closes (repair_proof.sh, real fix accepted / fake rejected by the deterministic arbiter) and the byte-exact token/cost meter (usage.h). next: toy->real — a real repo + real llm proposer + a deep ungated error, caught the moment it breaks a real invariant, repaired before it compounds, and reported as a langfuse-grade fused trace (nested steps, per-node token/$/time, catch+fix overlay, and the $/hours saved that langfuse can't show). open GTM question captured (§5).
c5cfaec00:25repair proof: first real closed repair, end-to-end. a broken repo's own test is red; rabadon-loop CATCHES it, and the honest proposer's real code fix is accepted ONLY because the project's test goes green (REPAIR_OK, repairs accepted: 1). a cheat that neuters the test to fake a pass is REJECTED by the forbidden-sha lock (REPAIR_FAIL, fail-closed, repairs accepted: 0). deterministic, zero-LLM — isolates the un-gameable arbiter, the moat langfuse can't match: it shows the red run, it cannot refuse the fake fix. native/repair_proof.sh, isolated ledger.
2026-07-28 12 commits
b97f76422:35lens: native rabadon-lens, the seeing half — per-session token/$cost/tool/duration read from ~/(withheld) transcripts (zero LLM, deterministic). the token/cost meter is extracted to usage.h and shared with the gate's budget cap (one meter, two consumers). proof: lens_test.sh differential — a fixture with known usage asserts every number exactly (incl. nested iterations + toolUseResult double-count traps ignored, unknown-model $? fallthrough), and 8/8 real transcripts have lens tokens == canonical message.usage byte-for-byte. full make test green (gate refactor byte-identical: stats real spool 42 lines still agree).
5b225e012:13keep HISTORY.md local like CLAUDE.md (internal session notes, never public)
6e978c911:14SECURITY (adversarial-hunt CRITICAL): gate ignores SIGPIPE — a dead watcher socket can no longer kill the gate mid-block and turn a deny into an allow; the verdict emit hits EPIPE (discarded) and still reaches exit(2). 10/10 blocks with a peer-closed socket; native 129/0, js 47/0
59beb2703:56G1/S5 (partial): rabadon stats goes native — native/stats.cpp reads the same spool with the same drill exclusion + --days window, byte-IDENTICAL to the JS oracle on the real spool + 18 differential proofs (UTF-16-accurate rule truncation, two-pass drill detection); binary gitignored like the others; native 127/0, js 47/0
34f22d403:09G5: benchmark page from the REAL ledger — measured gate latency (native ~2.1ms vs node ~99ms, ~45x, verdict parity held), 13/13 node==native differential parity, honest field position, and repairs-accepted=0 stated front and center; bench.py now isolates its spool (RABADON_DIR) so self-tests never inflate the real ledger — honest by construction, not just by filtering
14b214e02:50G1/S4: the hooks are binaries — PostToolUse rewired to native, NO rabadon hook calls node; push gate native (run_shell runs the project's own suite, green→allow+REPAIR_OK, red→block, hanging→killed; 9/9 proofs); delegate_to_node deleted, the gate depends on nothing but a shell; native 109/109, js 47/47
8fd336802:32statusline: the star spins for a few seconds on a catch instead of an alarm colour (Damla's call — motion, not orange); reads only the spool tail, stays instant, still a symbol not a report
d2ad31202:32G1/S3: PostToolUse goes native — code-edit tracking, scope fan-out, red/green detection (incl. the 'fail 0' trap), incident diagnose + incident-rule authoring, all in C++; run_claude spawns the model with RABADON_OFF=1 (recursion root-fix); differentially verified against the JS gate — 53/53 node==native parity across every branch; native 100/100, js 47/47
f760c3700:08G1/S1: state.json gets one owner — native gate reads+writes the full schema, the stray top-level 's' alias (doubled sessions) dies on first save, loop/dedupe/trail counters unified, state-native twin retired; 7/7 state proofs, native 39/39, js 47/47
c50514300:02G1: declare the migration pipeline before the work — promise, bounded loops, per-step checkpoints (the hand-written instance of what rabadon do will generate)
2026-07-27 18 commits
205df1423:35G2: the promise is enforced inside the session — native gate refuses anti-path edits at attempt time, challenges area creep once, and the session cannot rewrite its own goal contract; 9/9 promise proofs, suite 47/0 js + 32/0 native
2973c1b23:30spec v2: fix the end state — six pillars + five gates (G1-G5), every commit names its gate; honest [proven]/[building]/[ahead] markers
1c2365220:25scrub personal name from source comments (public repo hygiene)
caf15b720:24behavior gate: testsuite check runs the project's OWN tests as the un-gameable oracle — no dataset needed, the ground-truth is the customer's tests; live proof on node --test: a shallow check (exists+syntax) misses a dropped-*qty regression, rabadon catches it via the real suite (4/4)
790a2c015:44retire the JS do motor: native rabadon-do (planner -> gate-verified loop) replaces engine/do.mjs; cli dispatches to the binary; fix abs-path double-join in verify (live run false-failed a correct build); live greenfield task passes end-to-end (fizzbuzz planned+built+verified, exit 0). js suite 47/0, native 19/0
a6732e014:05loop engine: the autonomous product in c++ — run→gate→repair→re-verify→continue, bounded, fail-closed; fixes both fail-open holes (no-contract, no-accept); gamed repair rejected, real claude -p repair passed live (buggy double() fixed, verified 21→42 in 16s), 6/6 deterministic + 1 live
8c22edf13:56verify kernel: un-gameable contract in c++ — differential (behavior preservation) + forbidden (protected bytes) checks reject a gamed repair, accept a genuine one; fail-closed on empty/unknown; proven 7/7
ba1375413:07drift engine: measured direction check in c++ — declares a north star, counts how far a session's real files/commits strayed, speaks at session end; fires both ways (6/6), fails open, writes the goal-drift event the ledger never had
7f3d4c612:46native gate: c++ core is law — first build, verdict parity with node proven, measured 2.3ms vs 101ms per hook event (make bench)
afbcddd11:20statusline: two faces only (lilac/gray), red detector measures fail count instead of keyword-matching
9daf96911:17twin-delivery dedupe on tool_use_id, statusline ignores drills; home session guarded
3797f1811:08ledger honesty: back-fill drill labeling for history, stats reads the same store as the ui
2e7f61304:34init: clean actionable error when guard authoring fails transiently
0dd862704:30readme re-cut to the proven product, repair evidence committed, demo honesty note
b2bf1d504:27init merges into existing settings (shared installer), drill-tagged ledger, first gate tests + tamper detector fix
83d4a3004:22wrap: close the un-gated side door (responses/embeddings/batches/beta/stream), tool-use aware responseText
be50a0f03:59cli --version (first feature shipped BY rabadon do), readme: ui + do surfaces
d371e9503:55rabadon ui: local trace dashboard (store + server + page), do engine tests
2026-07-26 18 commits
7179c3619:33antivirus voice: native macos notifications on catch, on fix (ran the suite myself, opened the gate), on diagnosis and on new gates; incremental real-token ledger per session from the transcript
72d57d319:15the motor: rabadon do — task decomposed into mechanically-contracted steps, nothing flows past a broken gate, pivot repairs then replans bounded, done is a measured acceptance; multiline contract patterns
9d34c7a18:48second binding (rabadon exec routes any shell command through the same gate) + first guard packs distilled from 48 real project guards
920dea318:21devridaim: the work keeps turning — stop-hook distills state, sessionstart re-injects it, and rabadon spin launches a gate-supervised worker on the open front until green or bound
5c5953317:59loose ends closed: per-session state isolation, incident diagnosis dedup by failure signature, active goal re-anchor every 12 moves (fast judge), rabadon doctor end-to-end self-check
47454d917:55live incident brain: on red tests rabadon diagnoses in-session (which gate, root cause, concrete fix), can author a new guard rule from the incident; deterministic test-tamper detector blocks doctoring the thermometer
981742117:40push gate solves, not tells: rabadon builds and runs the suite itself on push, opens the gate on green, blocks with the actual failures on red
d44f2e317:32gate: specific guard rules speak before the generic loop-stop
f8c517117:31statusline: rabadon presence in the claude code terminal — lilac star on guard, switches to the catch itself for five minutes, gray when off
c2b3f7017:22productize for strangers: npm-ready package, rabadon off/on escape hatch, per-rule disable named in every block message, local-only privacy stated, session quickstart in readme
ec8918c16:58session depth: loop-stop (3x same command no edit = blocked), scope fan-out feedback, goal capture, catch ledger via rabadon stats, one-command rabadon init
c13c01316:23session gate: rabadon supervises a live claude code session — guard rules authored by rabadon from the project's own law files, enforced deterministically pre-action, violations blocked and fed back, all streamed live
d3d831016:10claude code cli as a zero-key repair engine: first LIVE llm repair — break caught, rewritten by claude, re-passed the same checks, watched in real time
7e5dfe216:02readme + package: wrap/watch/repair surfaces, verified field comparison table, honest status
a5994c816:02llm repair slot: raw-fetch claude-opus-4-8 rewrite of broken outputs, accepted only if the same intent checks re-pass, fail-closed on api errors
294e2c416:02wrap(): one-line client gate — langfuse/braintrust adoption surface, galileo inline stop, plus bounded re-checked repair and a shared pre-spend budget
4923c2216:02live event bus + rabadon watch: every step, break and repair streams to the terminal over a unix socket the moment it happens
2026-07-25 1 commit
e3cc5d521:47remove the wordmark dot from the landing
2026-07-24 3 commits
544a45b14:47hero: tighten sizing so everything fits one screen (title 44px, sparser spacing)
7c25f1c14:45hero: exclamation on the grass line (damla's voice)
e6496b914:09rabadon: reliability runtime that repairs your pipeline