Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
174 commits
Select commit Hold shift + click to select a range
f47581a
test: reproduce Elixir quote live-hole and accounting gaps
LaimaWu Oct 4, 2026
b5cacea
fix: preserve Elixir unquote calls and count quoted call sites
LaimaWu Oct 4, 2026
d2870fa
test: re-pin extraction scheme tripwire for issue 357
LaimaWu Oct 4, 2026
0cb0a82
test: cover Elixir quote options before enabling live holes
LaimaWu Oct 4, 2026
aa0361d
test: expose inert declines in default map and callees output
LaimaWu Oct 4, 2026
f3f94d7
fix: honor quote options and explain inert declines in compact output
LaimaWu Oct 4, 2026
474d9c0
test: reproduce non-Elixir CDATA legend marker collision
LaimaWu Oct 4, 2026
3dca9ba
fix: select inert decline readings only from emitted XML comments
LaimaWu Oct 4, 2026
2ece366
test: reproduce live holes in quoted declarations and metadata
LaimaWu Oct 4, 2026
3a5c8fb
fix: stop quoted declaration filters at enabled live-hole arguments
LaimaWu Oct 4, 2026
6bc1c90
test: reproduce falsely live unquotes in inert nested quotes
LaimaWu Oct 4, 2026
5c65fed
fix: retain outer inert boundaries after traversing quote live holes
LaimaWu Oct 4, 2026
d9cffb3
docs: describe inert counts after all quote boundaries are considered
LaimaWu Oct 4, 2026
04bdf4d
test(elixir): reproduce inert operator and capture accounting loss
LaimaWu Oct 5, 2026
16284d0
fix(ingest): count inert operator and named-capture references
LaimaWu Oct 5, 2026
fff9fa7
docs: define inert reference counting coverage
LaimaWu Oct 5, 2026
4bfb96d
test(elixir): reproduce quoted module stealing live-hole scope
LaimaWu Oct 5, 2026
75a0670
fix(elixir): skip inert declarations when finding live-hole module scope
LaimaWu Oct 5, 2026
7e83493
test(elixir): pin live-hole callee identity across quoted modules
LaimaWu Oct 5, 2026
0167bdd
chore: account for inert-region ingest section in optimization triage
LaimaWu Oct 5, 2026
bc53df2
docs: regenerate shifted graph seed showcase blocks
LaimaWu Oct 5, 2026
b479b4f
docs: synchronize navigation captures and generated command reference
LaimaWu Oct 5, 2026
d441cac
docs(skills): --token-budget gates the map but shapes the task lenses
barefootski Oct 14, 2026
4b5a4dc
test: forsoftbudgetcheck — --for stops when complete; an explicit bud…
barefootski Oct 14, 2026
64c2e78
test(attribmultidef): gate per-row definition attribution on multi-de…
barefootski Oct 14, 2026
a44f30b
test: forsoftbudgetcheck round 2 — stop-at-target, continuations that…
barefootski Oct 14, 2026
271c612
test(attribmultidef): round-2 gates — foreign declarations, row pins,…
barefootski Oct 14, 2026
d099ec2
feat(for): stop when complete; an explicit --token-budget is a soft t…
barefootski Oct 14, 2026
349e302
feat(grep): an <enc> carrier row names its reads and the functions it…
barefootski Oct 14, 2026
a0a4f1c
fix(mcp grep): next mirrors the CLI carrier rule
barefootski Oct 14, 2026
755b2d3
fix(valuerefs): capture a function stored through a value-preserving …
barefootski Oct 14, 2026
77e2255
fix(for): guard at its pre-registered 30,000 B; lego scoped at the ta…
barefootski Oct 14, 2026
64b8de2
refactor(grep): carrier emitters keep the grep entry points' shape; d…
barefootski Oct 14, 2026
f30c816
refactor(grep): split the carrier verdict into its vals and reads passes
barefootski Oct 14, 2026
3413622
test: qddegradecheck — --quality-delta=A..B answers under memory pres…
barefootski Oct 14, 2026
0fa110f
test(ownerhopcheck): an apostrophe in the (R) comment broke the hered…
barefootski Oct 14, 2026
8319601
test: qddegradecheck — verdicts through if/else, an absence read only…
barefootski Oct 14, 2026
480bc90
fix(for): scope the default's lego at the target cut by rank, not pos…
barefootski Oct 14, 2026
ba729c9
fix(for): CI round 1 — MCP descriptions under the manifest ceiling; c…
barefootski Oct 14, 2026
feac850
refactor(serialize): the ladder's row-drop walks as two helpers; the …
barefootski Oct 14, 2026
1da6c31
feat(attrib): multi-definition answers say which definition each row …
barefootski Oct 14, 2026
51f12b8
refactor(attrib): one edge-index helper, smaller reach walk, no dead …
barefootski Oct 14, 2026
0c397b6
refactor(attrib): one path-hop walk for via= and prov=, edgeExists fo…
barefootski Oct 14, 2026
30b6b89
refactor(attrib): split-hop count instead of a second path walk wrapp…
barefootski Oct 14, 2026
b8383fe
refactor(attrib): the path's split-hop bit rides PathEndpointBinding
barefootski Oct 14, 2026
7340fd7
feat(for): a --for <calls> row of a resolver-split call carries prov=…
barefootski Oct 14, 2026
ca3c45c
refactor(for): Q1's split-arm bytes ride the existing packBodies/pack…
barefootski Oct 14, 2026
86a28e6
fix(for): scope the default's sections by the past-target rows' shown…
barefootski Oct 14, 2026
635a01c
test(compactlegendcheck): the P arms assert the soft target (rule 4)
barefootski Oct 14, 2026
66a9e57
test: qddegradecheck round 2 — the gates review's R1-R9, exit 6, B23 …
barefootski Oct 14, 2026
e300420
regen: LIMITS.md, TUNING.md and the README cap count for kDefTableCap
barefootski Oct 14, 2026
22b7be4
test(fornotesbudgetcheck): notes under a soft target (rule 4)
barefootski Oct 14, 2026
13297e3
test(compactlegendcheck): a ";" inside the P4 floor twin's message re…
barefootski Oct 14, 2026
73a09f0
test: qddegradecheck round 2 — five arm corrections found running the…
barefootski Oct 14, 2026
a466e66
feat(quality): --quality-delta=A..B answers the kinds it can under me…
barefootski Oct 14, 2026
157493d
fix(quality): the kinds_next replay is not degraded again, and never …
barefootski Oct 15, 2026
2b7ae3e
fix(for): Q1's prov="split" clause is exempt from the <sigs> ledger, …
barefootski Oct 15, 2026
e669069
fix(attrib): path legend clause opens with no attribute; two gates re…
barefootski Oct 15, 2026
ad5d4a4
fix(quality): exit-2 wording names the ack-healing exception; memguar…
barefootski Oct 15, 2026
ab79c71
fix(grep): count carrier reads only for the top hit, under the memory…
barefootski Oct 15, 2026
c50c5b3
feat(graph): an element access calls its receiver class's subscript o…
barefootski Oct 15, 2026
25c7967
refactor(lego): the main-object rows ride LegoTargetedArgs::withMainR…
barefootski Oct 15, 2026
37c3f64
fix(for): a shorter compact prov=split clause (forrankordercheck q6 c…
barefootski Oct 15, 2026
5414abc
fix(quality): CI round 1 — svLess comparators, a registered popen, th…
barefootski Oct 15, 2026
a65f2ed
refactor(grep): the reads ingest's roots and its stop name, each its …
barefootski Oct 15, 2026
09677ab
refactor(grep): reads_skipped= spellings as a table indexed by the stop
barefootski Oct 15, 2026
c19afb0
test: legotransitivecheck's DSL count reads the main-object row; qsch…
barefootski Oct 15, 2026
88fd23b
test(attrib): final-review arms R1 (untied prototype on a printed tab…
barefootski Oct 15, 2026
a87c57d
test(quality): qddegradecheck arms for the final review's C1-C3 (red …
barefootski Oct 15, 2026
d045314
fix(attrib): list every untied declaration on a printed table (R1); a…
barefootski Oct 15, 2026
0459f34
fix(quality): the final review's C1-C3 — a selector's exclusions are …
barefootski Oct 15, 2026
d272628
refactor(quality): memorySkippedClause — degradedStderrLine back unde…
barefootski Oct 15, 2026
92c2893
test(forsoftbudgetcheck): round C arms — the tail carries the file pa…
barefootski Oct 15, 2026
84f12d6
feat(for): fold the file page into the tail; an explicit target reser…
barefootski Oct 15, 2026
e6e379e
test: round C rule-4 updates (tail page rows, reserve-first twins, re…
barefootski Oct 15, 2026
56a66dd
fix(quality): the selector,memory legend sentence rides only with mem…
barefootski Oct 15, 2026
5c7d928
refactor(for): round C's refill as helpers (qd)
barefootski Oct 15, 2026
f8bff23
test(quality): qddegradecheck (W) — the memory_skipped= legend senten…
barefootski Oct 15, 2026
22728af
refactor(attrib): one of_def emitter for both dialects (quality-delta…
barefootski Oct 15, 2026
3aae2b0
test: two new verdicts as if/else (gateexitcheck G2)
barefootski Oct 15, 2026
c0c6b93
githarden: find the governing git config from the filesystem, no git …
barefootski Oct 15, 2026
87e6718
refactor(mcp): the for twin's <hdr> rows and round C refill as helper…
barefootski Oct 15, 2026
31c0541
refactor(for): one <hdr> rows render for the CLI and MCP twins (forpa…
barefootski Oct 15, 2026
f612722
test: re-pin printffmtparity help_all — the --quality-delta=A..B row'…
barefootski Oct 15, 2026
0bb078b
test(forrankordercheck): (3) also allows the growth of the tail's leg…
barefootski Oct 15, 2026
868b0f2
githarden: split the discovery superset into one-level and one-gitdir…
barefootski Oct 15, 2026
dcc7c8f
fix(for): kForFileTailShownCap stays the rank rows' literal 24; kForF…
barefootski Oct 15, 2026
ea45ac3
githardencheck: report the (O5) fixture check through if/else (gateex…
barefootski Oct 15, 2026
c16eee8
githarden: a NUL inside a .git gitdir file or commondir defers to git
barefootski Oct 15, 2026
7d05c7c
githarden: read a .git gitdir file in its own helper
barefootski Oct 15, 2026
754925a
test(declinedsite): gate named rows for the call sites the resolver d…
barefootski Oct 15, 2026
b758c6b
test(declinedsite): arms for the wrong implementations the first gate…
barefootski Oct 15, 2026
43ffced
fix(for): a terser compact tail clause; CI round 1 rule-4 updates
barefootski Oct 15, 2026
3c9886e
feat(declined): name the call sites the resolver declined, as hedged …
barefootski Oct 15, 2026
dc162c4
test(compactlegendcheck): A-PIN for.xml re-anchored (FOLD C tail only…
barefootski Oct 15, 2026
fde5074
docs(declined): help, change-check skill and CHANGELOG name the <dc> …
barefootski Oct 15, 2026
48fd7b7
fix(declined): the callees record query checks its count on the no-re…
barefootski Oct 15, 2026
658fc77
harden git subprocesses
barefootski Oct 15, 2026
badc8fb
docs(limits): regenerate LIMITS.md and TUNING.md for the two <dc> cap…
barefootski Oct 15, 2026
260517e
test(declinedsite): shard weight 25 -> 35 s (113 arms, measured 30.1 …
barefootski Oct 15, 2026
fd7a7c7
refactor(declined): one call yields declined_calls= and its <dc> reco…
barefootski Oct 15, 2026
b3d21e6
refactor(declined): the cut's JSON keys through countFieldOrEmpty + n…
barefootski Oct 15, 2026
2b84440
style(declined): clang-format 22 on DeclinedSitesLegendFlags (graphle…
barefootski Oct 15, 2026
974dd5b
fix(for): the refill charges the tail at its reserve, so rows stay mo…
barefootski Oct 15, 2026
6844905
harden git subprocesses: probe request-named roots at dispatch
barefootski Oct 15, 2026
5222634
fix(for): FIX1 R1 rows monotone in N at every root length; R2 the --j…
barefootski Oct 15, 2026
3c10d1d
test(forrankordercheck): FIX1 N2 — q6/q7/q8 re-pinned in-lane with th…
barefootski Oct 15, 2026
fdad963
refactor(for): forLensJsonTailShare spelled with named shares (qd clo…
barefootski Oct 15, 2026
711bf4b
test: forbodyslotcheck — the owner body of an explanatory --for quest…
barefootski Oct 15, 2026
f278ac5
test: FIX1 — ST maximality counts the tail at no less than the no-bud…
barefootski Oct 15, 2026
94d1f61
test: gitchildoptscheck ok() sets the accumulator when its PASS line …
barefootski Oct 15, 2026
31531b1
test: qchurnmemocheck matches the churn diff spawn by shape, not one …
barefootski Oct 15, 2026
07e4dc1
test: deckcheck allowlists the git options the CHANGELOG hardening en…
barefootski Oct 15, 2026
591efad
Merge lane/forbudget-soft FIX1 (f278ac58) into lane/for-body-slot
barefootski Oct 15, 2026
039dbf0
test(forbodyslotcheck): Phase B amendments of the early gates review,…
barefootski Oct 15, 2026
ca0c53c
feat(for): one owner body for an explanatory --for question (CLI and …
barefootski Oct 15, 2026
6b966a5
test: FIX2 — one shared tail_size (test/lib/softbudget.py) for the fi…
barefootski Oct 15, 2026
97a6808
refactor(for): the slot's helpers without clone rows (pick= table, th…
barefootski Oct 15, 2026
d3062eb
docs: regenerate LIMITS.md, TUNING.md and the README cap count (kForB…
barefootski Oct 15, 2026
d7e3240
test: FIX2 C1 — the upper-bound twin of the relaxed ST maximality (ru…
barefootski Oct 15, 2026
fe2f3c2
test(forrankordercheck): FIX2 N2 — q6/q7/q8 re-pinned from a clean tree
barefootski Oct 15, 2026
66cc4b6
fix(for): CI round 1 — the slot's ENSURES reads a computed bool (self…
barefootski Oct 15, 2026
cdea46e
Merge remote-tracking branch 'origin/lane/forbudget-soft' into lane/f…
barefootski Oct 15, 2026
83cc4d0
fix(for): FIX1 F — drop the subtoken fallback; no owner, no slot (own…
barefootski Oct 15, 2026
04b58c9
fix(impact): FIX1 R1 — define importers_next= in the full --impact le…
barefootski Oct 16, 2026
c902c78
fix(for): FIX1 R3 — the compact owner-body clause says what pick= and…
barefootski Oct 16, 2026
b2fc46b
test(ownerhopcheck): FIX1 R4 — (I) runs the head side with RIPWIRE_NO…
barefootski Oct 16, 2026
c3d5c4e
Merge lane/grep-carrier (09677aba) into train 28
barefootski Oct 16, 2026
e09dbb1
Merge lane/ruby-pair (c19afb0f) into train 28
barefootski Oct 16, 2026
6f83bf6
Merge lane/qd-memory-degrade (f6127221) into train 28
barefootski Oct 16, 2026
b65d7d4
Merge lane/githarden-speed (7d05c7cd) into train 28
barefootski Oct 16, 2026
2091120
Merge lane/git-child-hardening (07e4dc16) into train 28
barefootski Oct 16, 2026
3c21fdf
Merge PR #380 (@LaimaWu, fix/issue-357-inert-regions, b479b4f8) into …
barefootski Oct 16, 2026
30b52b1
train 28: versions above every live value; qschemetrip re-derived once
barefootski Oct 16, 2026
c2c67db
Merge lane/forbudget-soft (fe2f3c21) into train 28
barefootski Oct 16, 2026
a7eca4c
test(estchargecheck): forbudget-soft's soft-target arms on #398's poo…
barefootski Oct 16, 2026
5c3e473
Merge lane/for-body-slot (b2fc46b2) into train 28
barefootski Oct 16, 2026
16a3823
Merge lane/attrib-multidef (22728af8) into train 28
barefootski Oct 16, 2026
942cefc
test(forsoftbudgetcheck): E2 splits the two bare-space <c> row readings
barefootski Oct 16, 2026
96b0200
Merge lane/declined-sites (2b84440c) into train 28
barefootski Oct 16, 2026
3c07fa0
fix(graph): an inert quoted call site has no <dc> record, and --calle…
barefootski Oct 16, 2026
933c7d6
fix(lego): Ruby's main object is one implementor, however many direct…
barefootski Oct 16, 2026
d31c104
fix(legend): declined_calls= scopes "two or more definitions" to tier…
barefootski Oct 16, 2026
d893c58
test(softbudget): state the XML upper-bound twin's resolution
barefootski Oct 16, 2026
e966102
docs(CONTRIBUTING): where language-specific code lives; most wanted: …
barefootski Oct 16, 2026
fb26610
fix(for): the body slot's <calls> rows carry prov="split" like every …
barefootski Oct 16, 2026
f7ce360
test(attribmultidefcheck): [S] the --for body slot labels a split arm
barefootski Oct 16, 2026
d091e20
fix(declinedsites): the per-answer row postcondition counts inert quo…
barefootski Oct 16, 2026
e91e999
fix(for): a spent soft target's hops cut marker drops the split readi…
barefootski Oct 16, 2026
f3826f3
fix(declined): inert quoted sites are described where they are counte…
barefootski Oct 16, 2026
3d3abe6
docs: the versions paragraph counts from the release; CONTRIBUTING ro…
barefootski Oct 16, 2026
70405af
docs: train 28 generated counts — LIMITS, TUNING, gate count, README …
barefootski Oct 16, 2026
0a5d057
test(showcase): a capture case for --quality-kinds
barefootski Oct 16, 2026
1532c0d
docs: the train 28 regeneration from the merged binary — showcase cap…
barefootski Oct 16, 2026
4c1e03c
refactor: the train's stacked growth in symbolQueryJson and two estch…
barefootski Oct 16, 2026
604915d
test(selfcheckcheck): three read-only callees a promise may call
barefootski Oct 16, 2026
bcbe02b
fix(legend): the MCP declined_note names its keys without attribute s…
barefootski Oct 16, 2026
ea0c16d
test(forsoftbudgetcheck): E2 counts the <c> row readings as present-only
barefootski Oct 16, 2026
6d3f425
style: clang-format src/graphlegend.h (the train's two legend helpers)
barefootski Oct 16, 2026
4508cd0
fix(grep): the carrier's string_view searches pass the byte comparator
barefootski Oct 16, 2026
c699d1a
test(pyimportprecisecheck): the cache walker reads layout version 32
barefootski Oct 16, 2026
b63c361
test(forrankordercheck): q2 re-pinned to the merged stack's answer (o…
barefootski Oct 16, 2026
c1855a0
test(langidentity): one-time named ratchet exception for train 28 (ow…
barefootski Oct 16, 2026
50fe89d
fix(graph): a declined proven subscript records its own reference index
barefootski Oct 16, 2026
cf574cd
fix(plan-lint): probe FILE's repository before its first git child
barefootski Oct 16, 2026
0872659
fix(quality): a failed export-attribute git grep refuses, never reads…
barefootski Oct 16, 2026
b635a97
fix(memguard): the kinds_next= replay limit covers both projection li…
barefootski Oct 16, 2026
ed30314
fix(quality): the memory-peak line and legend never call a changed-fi…
barefootski Oct 16, 2026
a586f7b
fix(for): the skipped body slot's next= goes through nextFlag
barefootski Oct 16, 2026
addb572
docs(readme): the section summary states 192 long flags, and the drif…
barefootski Oct 16, 2026
7b2ecfc
test(forsectioncollapse): re-anchor the MCP twin (13e) at 6000 tokens…
barefootski Oct 16, 2026
0e6edd9
docs(skills): --token-budget beside --for --limit is the candidate pa…
barefootski Oct 16, 2026
8234a8c
docs(captures): regenerate the showcase capture after the harvest's s…
barefootski Oct 16, 2026
c97e530
docs(commands): regenerate COMMANDS.md from the regenerated showcase …
barefootski Oct 16, 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
5 changes: 5 additions & 0 deletions .github/pargates-shard-weights.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
"artifactcheck.sh": 5.4,
"atcheck.sh": 12.1,
"atomscheck.sh": 4.2,
"attribmultidefcheck.sh": 75.0,
"attrvocabcheck.sh": 66.7,
"baselinecheck.sh": 1.8,
"baselinedirtycheck.sh": 9.8,
Expand Down Expand Up @@ -111,6 +112,7 @@
"deadprecisioncheck.sh": 0.8,
"deckcheck.sh": 54.8,
"deckclaimcheck.sh": 0.1,
"declinedsitecheck.sh": 35.0,
"deeptailcheck.sh": 1.0,
"defaultceilingcheck.sh": 20.1,
"defectshapecheck.sh": 14.2,
Expand Down Expand Up @@ -187,6 +189,7 @@
"fnptrcheck.sh": 11.3,
"forautobodycheck.sh": 21.6,
"forblowupcheck.sh": 1.0,
"forbodyslotcheck.sh": 150.0,
"forbudgetmonotoncheck.sh": 2.5,
"forcalibfactscheck.sh": 8.0,
"forcompresscheck.sh": 6.4,
Expand All @@ -200,6 +203,7 @@
"forrootlegendcheck.sh": 8.6,
"forsectioncollapsecheck.sh": 5.2,
"forsigspancheck.sh": 6.0,
"forsoftbudgetcheck.sh": 120.0,
"freshclonecheck.sh": 170.8,
"freshnesscheck.sh": 4.4,
"g1configcheck.sh": 0.8,
Expand Down Expand Up @@ -428,6 +432,7 @@
"qbaselineproducercheck.sh": 5.0,
"qchurncheck.sh": 3.7,
"qchurnmemocheck.sh": 4.3,
"qddegradecheck.sh": 20.0,
"qdrefpaircheck.sh": 92.2,
"qextractionkeycheck.sh": 2.8,
"qoriginoraclecheck.sh": 8.7,
Expand Down
158 changes: 157 additions & 1 deletion CHANGELOG.md

Large diffs are not rendered by default.

42 changes: 36 additions & 6 deletions CONTRIBUTING.md

Large diffs are not rendered by default.

12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -982,9 +982,9 @@ Full retrieval tables — including the MRR figures behind the router numbers ab
## What it answers

<details>
<summary><b>190 long flags</b> across seven families, plus the MCP server — and <code>--help-task</code> names the ONE command a task wants, or abstains honestly when the evidence is too thin</summary>
<summary><b>192 long flags</b> across seven families, plus the MCP server — and <code>--help-task</code> names the ONE command a task wants, or abstains honestly when the evidence is too thin</summary>

Around the core sit 191 long flags advertised in `--help`, across seven families — plus an MCP
Around the core sit 192 long flags advertised in `--help`, across seven families — plus an MCP
server, so a coding agent can call any of them mid-task instead of grepping and reading whole files.
`--help` prints one line per flag (~4.5K tokens); `--help=--FLAG` prints that flag's full entry with
every caveat, `--help=SECTION` one family, and `--help=all` the whole catalog.
Expand Down Expand Up @@ -2120,9 +2120,9 @@ wrong, and it has. These are the results that say so, all in-tree, all published
### In the tests

<details>
<summary><b>685 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>692 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 **685 gate scripts** and is the authoritative list; <!-- gatecount -->
`test/regression.sh` names **692 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 Expand Up @@ -2684,7 +2684,7 @@ identity of the index, and says which one is at fault.

### 5. Command families

The `--help` output groups 191 long flags advertised in `--help` into seven families. The `--help=`
The `--help` output groups 192 long flags advertised in `--help` into seven families. The `--help=`
column below is the argument that prints one family: `ripwire --help=navigate`. `ripwire
--help=--FLAG` prints one flag's full text — the caveats, the units, what it refuses and why.
`ripwire --help=all` is the whole catalog, about 46,000 tokens.
Expand Down Expand Up @@ -2878,7 +2878,7 @@ python3 test/pargates.py . ./build/ripwire -j 6
A new gate script must be added to `test/regression.sh` in the same change. The gate
`test/manifestcheck.sh` enforces this rule.

Another gate derives the cap inventory. The tool has 253 compile-time caps and 7 ranking parameters.
Another gate derives the cap inventory. The tool has 259 compile-time caps and 7 ranking parameters.
`docs/LIMITS.md` lists each cap, its value, and whether the file discloses a truncation when the cap
fires, and `python3 docs/limits_build.py --check` proves that list against `src/`. `docs/TUNING.md`
lists the measured cost of each cap.
Expand Down
2 changes: 1 addition & 1 deletion SECURITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ ripwire is a command-line indexing tool with the following security model:
- **Input:** Arbitrary source code repositories on the local filesystem
- **Output:** XML summaries and analysis results streamed to stdout or written to cache
- **Trust boundary:** The tool operates only on local files with the user's own permissions. It does not communicate over the network, with two named exceptions: a root given as a git URL is cloned into the cache (`git clone --depth=1`, with `protocol.ext.allow=never` and `protocol.file.allow=user` pinned on the command), and the tree-sitter registry is listed during initial setup
- **Subprocesses:** ripwire runs **read-only `git`** inside the analysed checkout (`status --porcelain`, `ls-files`, `log`, `diff --numstat`, `archive`, `rev-parse`), and — only for binary document formats, which are not collected by default — `markitdown`. Git honours the checkout's **own** `.git/config`. A *hook-form* `core.fsmonitor` there is a command git would run on every one of those calls, so ripwire neutralises that one key for its own git children at process start and says so (`--doctor`'s `git-config-trust` row; a stderr line carrying `git_harden=fsmonitor-hook`); boolean values, git's builtin daemon, are left alone. `git clone` never copies `.git/config`, so a repository you cloned yourself carries no such key — a tarball, a copied worktree or a shared checkout carries whatever its last owner wrote. Treat pointing ripwire at one as you would treat running `git status` there yourself
- **Subprocesses:** ripwire runs **read-only `git`** inside the analysed checkout (`status --porcelain`, `ls-files`, `log`, `diff --numstat`, `archive`, `rev-parse`), and — only for binary document formats, which are not collected by default — `markitdown`. Git honours the checkout's **own** `.git/config`. A *hook-form* `core.fsmonitor` there is a command git would run on every one of those calls, so ripwire neutralises that one key for its own git children at process start and says so (`--doctor`'s `git-config-trust` row; a stderr line carrying `git_harden=fsmonitor-hook`); boolean values, git's builtin daemon, are left alone. ripwire likewise neutralises repository-configured filter and diff programs for its own git children: the repository's own `filter.<name>.clean/smudge/process` drivers are pinned to an empty command on every git child ripwire starts (a stderr line carrying `git_harden=filter-driver`, and `--doctor`'s `git-config-trust` row: `filter_drivers=`, `filter_scope=`, `filter_pinned=`), diff programs are refused with `--no-ext-diff --no-textconv`, signature display is pinned off, and `status`/`diff` do not enter submodule repositories (`--ignore-submodules=dirty`). The MCP and LSP servers apply the same pinning to every root a request names. The user-visible cost: files behind a repository-local filter (git-crypt, a per-repository LFS driver) are read as stored, and edits inside a submodule no longer mark `+dirty`. `git clone` never copies `.git/config`, so a repository you cloned yourself carries no such key — a tarball, a copied worktree or a shared checkout carries whatever its last owner wrote. Treat pointing ripwire at one as you would treat running `git status` there yourself

Security vulnerabilities relevant to this tool include:

Expand Down
15 changes: 11 additions & 4 deletions docs/ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,16 @@ metadata do not become executable calls. Alias/import/require/use and behaviour
module dependencies resolved through declared module identities, regardless of umbrella/file layout.
`@behaviour` and `defimpl` supply contract/implementation relationships for `--uses` and `--lego`.

**Static limits:** quoted AST and macro-generated definitions are not expanded. `use` records the
**Static limits:** quoted AST and macro-generated definitions are not expanded. Ordinary call,
operator and named-function-capture candidates inside a `quote` body mint no edges and are counted
in the map's `declined=` gauge; `--callees` counts those sites on their enclosing function.
Bare variable-shaped AST identifiers are not counted merely for being identifiers. Calls inside `unquote(...)` and
`unquote_splicing(...)` are live when enabled, as are expressions in `bind_quoted:` options.
`bind_quoted` disables unquoting by default; explicit `unquote: true` re-enables it and
`unquote: false` keeps its argument inert. Nonliteral unquote options cannot prove a live hole.
Nested quotes become inert again inside a live hole; an inner quote that is itself inert
cannot execute its own holes in the current stage. Quoted module declarations do not change the lexical module of evaluated holes. Quoted declaration heads and metadata
do not suppress evaluated hole arguments; bound variables in those arguments remain variables. `use` records the
dependency, but does not execute `__using__`; framework DSLs and generated Phoenix/Ecto functions
therefore need an explicit source definition to appear. A call that only an injected import could
answer has no lexical candidate: no edge is minted from a same-named function elsewhere, and the call
Expand Down Expand Up @@ -197,9 +206,7 @@ that function — the underscore rule is for unused variables, and a bare `_seed
(`src/ingest_elixir.h`); and a call that omits a defaulted argument reaches the bodyless head that
evaluates the default beside the clauses, so `--path` and `--impact` see the default expression's calls
from that caller, while a call that supplies the argument reaches the clauses alone
(`src/elixir_resolve.h`). One gap stays open: executable `unquote(...)` and `bind_quoted:` expressions
under `quote` are omitted with the rest of the quoted-AST filter, so a helper called only from inside
an `unquote` has no caller edge from its macro.
(`src/elixir_resolve.h`).

`test/elixircheck.sh`, `test/eliximportcheck.sh` and `test/elixirsemanticcheck.sh` cover extraction,
metrics, exact target selection against decoys, lexical boundaries, contracts, CLI/MCP use-site parity,
Expand Down
Loading
Loading