Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
87 commits
Select commit Hold shift + click to select a range
e631b08
perf(strkern): one header for the byte-parallel string kernels, three…
joyful-ii-V-I Sep 10, 2026
3eebd03
quality(churn): SELF stops gating; what gates is two committed in-win…
joyful-ii-V-I Sep 10, 2026
35623f5
test(emit): the escaper gate lands before the escaper rewrite it meas…
joyful-ii-V-I Sep 10, 2026
209f97a
fix(capsweep): the harness could not tell a refusal from an answer, a…
joyful-ii-V-I Sep 10, 2026
09d4f5f
quality(dead-code): what the LANGUAGE invokes, not what a header exports
joyful-ii-V-I Sep 10, 2026
c7bb069
fix(help-task): an intent word may not mint the symbol its own gate r…
joyful-ii-V-I Sep 10, 2026
8bb4d9f
fix(limits): "every compile-time cap in src/" was 120 of 212 — the sh…
joyful-ii-V-I Sep 10, 2026
9aa47af
test(skills): the four restored stop rules are now measured — presenc…
joyful-ii-V-I Sep 10, 2026
e246ca2
perf(ingest): the preprocessor-dead walk was O(C^2) — llvm cold 202.1…
joyful-ii-V-I Sep 10, 2026
236a1ad
perf(ingest): the field NAME resolved once per grammar, not once per …
joyful-ii-V-I Sep 10, 2026
540938e
feat(handoff): the continuation packet showed one symbol in six of wh…
joyful-ii-V-I Sep 10, 2026
33ea149
perf(lexical): the tokenizer, the BM25 scan's inner loop and its file…
joyful-ii-V-I Sep 10, 2026
eb7a1dc
test(cache): gate the eviction pin and the warm-path reserve BEFORE t…
joyful-ii-V-I Sep 10, 2026
5723b2c
fix(cache): the budget sweep pins the root you are working in, and sa…
joyful-ii-V-I Sep 10, 2026
d1b1a13
quality(verbosity,complexity): code lines, and growth as a signal
joyful-ii-V-I Sep 10, 2026
d6371f7
docs(lexindex,subtokencheck): the comments say "fused rolling hash" a…
joyful-ii-V-I Sep 10, 2026
ec90bc0
quality(api-surface): a count for new exports, and one row per fact
joyful-ii-V-I Sep 10, 2026
da7af62
fix(mention,situ): a disclosure that names no total, and one that cou…
joyful-ii-V-I Sep 10, 2026
04dceea
feat(help-task): route the three verbs with none, and give the router…
joyful-ii-V-I Sep 10, 2026
05a800b
perf(lint,match): the #match? regex compiled once per query, not once…
joyful-ii-V-I Sep 10, 2026
b65bb1e
test(cache): gate ONE root key for every cache family, and prove it red
quaterniondrift Sep 10, 2026
6afaa45
fix(capsweep): a $A in a tree-sitter pattern is not an environment va…
joyful-ii-V-I Sep 10, 2026
68a735d
perf(emit): the escapers copy runs instead of bytes — measured first,…
joyful-ii-V-I Sep 10, 2026
ecaff19
quality(clones): an overload set, one file, and vendored upstream are…
joyful-ii-V-I Sep 10, 2026
99b41ed
perf(slice): the def-use walk indexed a file-wide child list — and th…
joyful-ii-V-I Sep 10, 2026
f892d2b
perf(pattern): the structural-search walks indexed the candidate's ch…
joyful-ii-V-I Sep 10, 2026
0751ac5
perf(ingest): the last four file-wide child walks, plus the three cla…
joyful-ii-V-I Sep 10, 2026
cd7e035
fix(cache): one root key for every cache family — the pin covers the …
quaterniondrift Sep 10, 2026
f0597f1
quality(error-masking): a comment is not a handler
joyful-ii-V-I Sep 10, 2026
c7e9308
docs(quality-bar): name the flag that cuts the checkpoint report by 84%
joyful-ii-V-I Sep 10, 2026
ca747de
feat(mcp): no_route — the CLI's own recovery from a route mis-fire, r…
joyful-ii-V-I Sep 10, 2026
45065b6
fix(gate): the escaper harness generator was not sanitizer-clean
joyful-ii-V-I Sep 10, 2026
cca0bf8
quality(self): clear the five findings this branch's own dials report…
joyful-ii-V-I Sep 10, 2026
932ce5c
docs(gate): the residual child-iterator cost, attributed — bindsVisit…
joyful-ii-V-I Sep 10, 2026
b41c226
chore(pins): regenerate docs/LIMITS.md and re-pin test/qschemetrip.hash
joyful-ii-V-I Sep 10, 2026
692546c
merge(lane): lane/emit-grep-kernels-2026-09-10
joyful-ii-V-I Sep 10, 2026
947463e
merge(lane): lane/helptask-precision-2026-09-10
joyful-ii-V-I Sep 10, 2026
2fbbf17
merge(lane): lane/fieldid-regex-2026-09-10
joyful-ii-V-I Sep 10, 2026
0dd3bea
merge(lane): lane/cache-rootkey-unify-2026-09-10
joyful-ii-V-I Sep 10, 2026
56cb14e
merge(lane): lane/childwalk-sweep-2026-09-10
joyful-ii-V-I Sep 10, 2026
8e1a04c
quality(clones): withdraw the one-file drop — two of this repo's own …
joyful-ii-V-I Sep 10, 2026
3e534f7
merge(lane): lane/qd-perkind-dials-2026-09-10
joyful-ii-V-I Sep 10, 2026
67b930d
perf(strkern): the byte-set scan's tail stops calling the oracle it w…
joyful-ii-V-I Sep 10, 2026
f0186fe
refactor(strkern): one header — the sibling scan folds back in and th…
joyful-ii-V-I Sep 11, 2026
c857f27
test(strkern): two standalone harnesses become one doctest target bes…
joyful-ii-V-I Sep 11, 2026
4d74e81
feat(doc-drift,flags,flip,situ): three listing verbs learn to say wha…
joyful-ii-V-I Sep 11, 2026
e06e587
merge(lane): origin/main edbb978d (the eight PRs landed tonight)
joyful-ii-V-I Sep 11, 2026
4e440cb
measure(capsweep): the re-run on the fixed harness — 51 cap responses…
joyful-ii-V-I Sep 11, 2026
725fb15
merge(lane): lane/capregister-harness-2026-09-10
joyful-ii-V-I Sep 11, 2026
ab0d608
perf(ingest,slice): the last indexed child walks — bindsVisitNode, --…
quaterniondrift Sep 11, 2026
44ca357
merge(lane): lane/listing-paging-2026-09-10
joyful-ii-V-I Sep 11, 2026
3379496
merge(lane): lane/strkern-onefile-doctest-2026-09-10
joyful-ii-V-I Sep 11, 2026
edcea4b
chore(integ): regenerate docs/TUNING.md from the sweep records on the…
joyful-ii-V-I Sep 11, 2026
4310044
merge(lane): lane/strkern-tokenizer-2026-09-10 (K's tokenizer, head-m…
joyful-ii-V-I Sep 11, 2026
868d775
merge(lane): lane/childwalk-final-2026-09-10
joyful-ii-V-I Sep 11, 2026
5e1ae38
fix(taskroute): the routing fixtures' example plan documents get ordi…
joyful-ii-V-I Sep 11, 2026
434b2fd
docs(didyoumean): the edit-distance cutoff's comment loses its audit-…
joyful-ii-V-I Sep 11, 2026
8309660
test(mcp): the manifest ceiling re-anchors at 42,200 with the two lan…
joyful-ii-V-I Sep 11, 2026
1ec420f
docs(lineage): the string kernels' sources, credited where the techni…
joyful-ii-V-I Sep 11, 2026
06414b5
fix(mention): three helpers the disclosure rewrite left with no calle…
joyful-ii-V-I Sep 11, 2026
1705812
test(emittertruth): the api-new-surface= count gets its zero probe (Z…
joyful-ii-V-I Sep 11, 2026
7d31a5a
fix(lexindex): the AVX2 block mask's seam bit is masked before the sh…
joyful-ii-V-I Sep 11, 2026
82110b2
test: four gates reconciled with what the round changed, and the qual…
joyful-ii-V-I Sep 11, 2026
c8abcb1
fix(situ,fieldidcheck): the --situ follow-up hint echoes the locator-…
joyful-ii-V-I Sep 11, 2026
f7498e7
fix(strkern): the trailing-zero count is std::countr_zero, not a GCC/…
joyful-ii-V-I Sep 11, 2026
dcbe3fc
test(strkern): every sweep probe runs on every iteration; only the me…
joyful-ii-V-I Sep 11, 2026
a56dba7
test(lexical): the empty length bucket and empty longRows are gated, …
joyful-ii-V-I Sep 11, 2026
8961bd0
test(astqueryregex): arm D asserts the dynamic predicate MATCHED, not…
joyful-ii-V-I Sep 11, 2026
b2ee9fe
test(capsweep): the metavariable arm belongs INSIDE the run-corpus su…
joyful-ii-V-I Sep 11, 2026
41e0867
test(eviction): arm (h) finds the LEAN blob by name, not whatever the…
joyful-ii-V-I Sep 11, 2026
71ca36f
test(portablebuild): the aarch64 arm fails on CONFIGURE_FAILED instea…
joyful-ii-V-I Sep 11, 2026
69e57e5
fix(cache): cacheBlobRootKey reads a key field terminated by '.', so …
joyful-ii-V-I Sep 11, 2026
556925b
fix(errormask): a comment that OPENS the block does not close it — co…
joyful-ii-V-I Sep 11, 2026
c7a9132
fix(mcp): situational_awareness discloses BOTH of its paged arrays
joyful-ii-V-I Sep 11, 2026
3947c2a
docs(tuning): regenerate for situational_awareness's two new disclosu…
joyful-ii-V-I Sep 11, 2026
3d88a9e
fix(capsweep): the fingerprint sees CONTENTS, and the split is over e…
joyful-ii-V-I Sep 11, 2026
13c461f
refactor: the four quality-delta regressions this round's own work in…
joyful-ii-V-I Sep 11, 2026
3afa260
merge(lane): lane/cr127-2026-09-10 (CodeRabbit's twelve findings: ten…
joyful-ii-V-I Sep 11, 2026
ae058c1
merge(lane): origin/main 3511c93b (#124 clang-tidy defaults)
joyful-ii-V-I Sep 11, 2026
5afadec
test: three pins reconciled after the CodeRabbit lane merged
joyful-ii-V-I Sep 11, 2026
64fcd72
test(fieldidcheck): the harness links grammar objects it compiled its…
joyful-ii-V-I Sep 11, 2026
5c80848
test(strkerncheck): two vacuous-pass shapes closed — the zero count t…
joyful-ii-V-I Sep 11, 2026
d6e378a
test(strkerncheck): a SIGILL before the slice's first line is Rosetta…
joyful-ii-V-I Sep 11, 2026
d94ac28
test(strkerncheck): the Rosetta arms run only where a probe has EXECU…
joyful-ii-V-I Sep 11, 2026
7bed6f3
test(strkerncheck): the x86_64 mirror runs the baseline (scalar) slic…
joyful-ii-V-I Sep 11, 2026
150fb6d
test(strkerncheck): the Rosetta probe exercises the whole x86-64-v3 f…
joyful-ii-V-I Sep 11, 2026
b4ebf0b
test(strkerncheck): the probe's comment corrected, and the gate disas…
joyful-ii-V-I Sep 11, 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
98 changes: 82 additions & 16 deletions .ripwire_quality_acks

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,13 +82,19 @@ changed mid-compile; the discipline is the fix.
## Verify

```bash
./build/ripwire . --quality-delta --legend=compact # the "am I done" checkpoint — see the note below
python3 test/pargates.py . ./build/ripwire -j 6 # the full gate suite, in parallel
test/regression.sh # the same set, sequentially (authoritative list)
LSAN_OPTIONS=suppressions=lsan_suppressions.txt ./asan/ripwire <dir> >/dev/null
./build/ripwire <dir> >a; ./build/ripwire <dir> >b; diff -q a b # determinism gate
./build/ripwire <dir> | xmllint --noout - # well-formedness gate
```

`--legend=compact` on the checkpoint run is not cosmetic: on a clean report the legend is nearly the
whole document, and dropping it takes the run from 2,776 B to 454 B (measured 2026-09-10 on a
two-function fixture; 15,601 B to 8,775 B on this repo mid-change). The findings are byte-identical
either way — only the dictionary in front of them is shorter, and you already know it.

Run gates in the **foreground**. A new `test/*check.sh` must be listed in `test/regression.sh` in
the same commit — `test/manifestcheck.sh` fails otherwise.

Expand Down
19 changes: 16 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -640,6 +640,19 @@ if(RIPWIRE_TESTS)
src/infra/diagnostics.cpp)
target_include_directories(ripwire_test_radix PRIVATE src/infra third_party src)
add_test(NAME ripwire.radix COMMAND ripwire_test_radix)

# src/infra/strkern.h's SIMD-vs-scalar parity, src/lexindex.h's tokenizer equivalence, and the three
# emit escapers' byte-identity — one target, driven by test/strkerncheck.sh and test/emitescapecheck.sh
# (each adds its own mutation and cross-arch arms, which are compile flags a second configure cannot
# express in this tree). RIPWIRE_TEST_ROOT is the repo whose src/ and docs/ the real-text arms read, so
# a bare `ctest` is as honest as a gate run; the gates override it with RIPWIRE_ROOT in the environment.
add_executable(ripwire_test_strkern
test/verify_strkern.cpp
src/infra/diagnostics.cpp)
target_include_directories(ripwire_test_strkern PRIVATE src/infra third_party src)
target_compile_definitions(ripwire_test_strkern PRIVATE RIPWIRE_TEST_ROOT="${CMAKE_CURRENT_SOURCE_DIR}")
target_link_libraries(ripwire_test_strkern PRIVATE doctest::doctest)
add_test(NAME ripwire.strkern COMMAND ripwire_test_strkern)
endif()

# ---- self-profiling build (src/infra/profileScope.h): -DRIPWIRE_PROFILE=ON ----
Expand Down Expand Up @@ -726,9 +739,9 @@ set(RIPWIRE_RUNTIME_LINK_TARGETS ripwire_probe ripwire)
# the only ones the libstdc++ header exemption below has anything to say about (the grammars are C).
set(RIPWIRE_OWNED_CXX_TARGETS ripwire_probe ripwire)
if(RIPWIRE_TESTS)
list(APPEND RIPWIRE_RUNTIME_COMPILE_TARGETS ripwire_test_csr ripwire_test_pagerank ripwire_test_radix)
list(APPEND RIPWIRE_RUNTIME_LINK_TARGETS ripwire_test_csr ripwire_test_pagerank ripwire_test_radix)
list(APPEND RIPWIRE_OWNED_CXX_TARGETS ripwire_test_csr ripwire_test_pagerank ripwire_test_radix)
list(APPEND RIPWIRE_RUNTIME_COMPILE_TARGETS ripwire_test_csr ripwire_test_pagerank ripwire_test_radix ripwire_test_strkern)
list(APPEND RIPWIRE_RUNTIME_LINK_TARGETS ripwire_test_csr ripwire_test_pagerank ripwire_test_radix ripwire_test_strkern)
list(APPEND RIPWIRE_OWNED_CXX_TARGETS ripwire_test_csr ripwire_test_pagerank ripwire_test_radix ripwire_test_strkern)
endif()
# G1's `integer` is a CLANG-ONLY UBSan group (unsigned-integer-overflow, implicit-*-truncation,
# implicit-integer-sign-change — the defined-but-suspicious conversions, not UB). GCC has no such group
Expand Down
12 changes: 5 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
Point it at any repository and your agent gets a ranked, deterministic call graph — what to touch,
what it breaks, which tests to run — instead of grepping around and reading whole files.

<p align="center"><img src="docs/assets/paddle-out.svg" alt="Paddle out with a map. See the rip before you’re in it." width="470"><br><a href="https://trendshift.io/repositories/217924?utm_source=trendshift-badge&amp;utm_medium=badge&amp;utm_campaign=badge-trendshift-217924"><img src="https://trendshift.io/api/badge/trendshift/repositories/217924/daily?language=C%2B%2B" alt="Trendshift: C++ Repository of the Day badge for redhat-et/ripwire" width="250" height="55"></a></p>
<p align="center"><img src="docs/assets/paddle-out.svg" alt="Paddle out with a map. See the rip before you’re in it." width="470"> <a href="https://trendshift.io/repositories/217924?utm_source=trendshift-badge&amp;utm_medium=badge&amp;utm_campaign=badge-trendshift-217924"><img align="middle" src="https://trendshift.io/api/badge/trendshift/repositories/217924/daily?language=C%2B%2B" alt="Trendshift: C++ Repository of the Day badge for redhat-et/ripwire" width="250" height="55"></a></p>

<details>
<summary><b>Fifty years of software-engineering results, and research from last month.</b> 46 repositories and 69 papers folded — McCabe (1976) through to <b>seven published in the last two months</b> — each row in <a href="docs/LINEAGE.md"><b>docs/LINEAGE.md</b></a> naming the lesson taken and the file it lives in</summary>
<summary><b>Fifty years of software-engineering results, and research from last month.</b> 49 repositories and 70 papers folded — McCabe (1976) through to <b>seven published in the last two months</b> — each row in <a href="docs/LINEAGE.md"><b>docs/LINEAGE.md</b></a> naming the lesson taken and the file it lives in</summary>

Beside those sits a labelled survey of **237 tools** that contributed nothing and says so. The two
sets are disjoint by construction, so they add rather than nest — a tool that gave a lesson is never
Expand Down Expand Up @@ -78,8 +78,6 @@ cd your-repo
ripwire . --for="<the change you are about to make, in words>"
```

Every install route (prebuilt, from source, per-agent skills, hooks, the MCP server) is in [INSTALL.md](INSTALL.md).

**Reach for the CLI first — it is the cheaper interface.** The MCP server is the optional second
way in, and its convenience has a cost the shell pipe does not carry: its verb schemas sit in your
agent's context every session, whether or not it calls them.
Expand Down Expand Up @@ -1674,7 +1672,7 @@ timing-only, and `pmccheck`'s inactive arm now proves that was truly the case.
<summary>43 repositories, 69 papers and a 237-tool survey — and the study where search over a pre-built index beats a delegating planner <b>65.2% to 46.2%</b>, at under half the cost</summary>

Almost none of the ideas here are new; the combination and the constraints are. Lessons folded from
**46 repositories and 69 papers** into one deterministic executable, alongside a labelled
**49 repositories and 70 papers** into one deterministic executable, alongside a labelled
survey of 237 tools that folded nothing and are catalogued separately — the two sets are disjoint,
so they add rather than nest. The row-by-row ledger, each with the lesson taken and where it lives, is
[`docs/LINEAGE.md`](docs/LINEAGE.md). Those three counts are derived from that document's own tables
Expand Down Expand Up @@ -1827,9 +1825,9 @@ wrong, and it has. These are the results that say so, all in-tree, all published
### In the tests

<details>
<summary><b>588 gate scripts</b>, five contracts no unit test can hold, and the house rule: write the gate before the code it measures</summary> <!-- gatecount -->
<summary><b>597 gate scripts</b>, five contracts no unit test can hold, and the house rule: write the gate before the code it measures</summary> <!-- gatecount -->

`test/regression.sh` names **588 gate scripts** and is the authoritative list; <!-- gatecount -->
`test/regression.sh` names **597 gate scripts** and is the authoritative list; <!-- gatecount -->
`python3 test/pargates.py . ./build/ripwire -j 6` runs the same set in parallel. On top of them sit the
contracts that do not fit a unit test: two runs byte-identical, warm output identical to cold, output
that pipes clean through `xmllint --noout`, a sanitizer build with `-fno-sanitize-recover=all`, and a
Expand Down
Loading
Loading