Repository navigation
Description
Objective
Declare Branch, Switch, Loop, Catch, ElseIf and Exit per language and route cognitive's nesting and increment arms, cyclomatic's statement arms and nexits through them. Zero drift.
Umbrella: R00: #1690 · Planning ID: R07: #1697
Completion prerequisites: R05: #1695, R06: #1696
Status (2026-10-31): implemented on branch refactor/1697-control-flow-roles (20 commits over origin/main 96a45849, tip fa3f316f); every checkbox below is met on the tree and the evidence is summarised in the completion comment. Merge prerequisite outside the tree: the output submodule commit af5c6222 (#1720's 33 Rust snapshots) is on the submodule's local main and not yet pushed. Two behaviour changes ride on the branch as their own commits after the zero-drift migration: #1720 (Rust type-syntax for) and #1602 (Elixir keyword sections).
Status (2026-10-26): both prerequisites are merged to main (PR #1717, e2fd7193). The plan below predates R06's DSL; the briefing comment of this date lists what landed since, the consumer shape this inherits, and the traps the last two packages paid for — read it before planning.
Why this exists, and why after R05: #1695 and R06: #1696
Lesson 19's founding cases are all in this family — C/C++ ternary and range-for uncounted by cognitive (#172, #173), Java enhanced-for (#178), Python match scoring zero for both cyclomatic and cognitive (#212) — and each fix was an audit table built by hand across twenty languages. ElseIf is the largest hand-written per-language predicate in the tree (grammar-dispatch.md §4: three macros, three hand-written impls, one constant false for Elixir that lesson 10 calls a stub). Exit already has a per-language macro, impl_exit_match_kinds! in src/metrics/nexits.rs, which cognitive's jump arm restates.
It needs R05: #1695 because cognitive's nesting expression includes owns_Ternary and its boolean-sequence arm reads pays_ShortCircuit, which R05: #1695 declares. It needs R06: #1696 because the nesting expression includes owns_Closure (a lambda body resets nesting — #1103's shared function-boundary rule). Cyclomatic's keyword-vs-statement distinction (If the token vs IfStatement the node, #284) is an owners/payers split, and ElseIf is a subtraction in cognitive (an else if pays the increment but not the nesting), expressible only once Branch is a row.
Implementation steps
-
Branch(if-like owners) and a separateSwitchrole (the switch-like container kinds): standard cyclomatic's policy expression omitsowns_SwitchbecauseCaseArmpays; modified cyclomatic and cognitive's nesting include it. The declaration says what a switch is; the root expressions say who counts it. (Switchis added to R01: #1691's inventory under this package's name; R01: #1691 lists it from the start.)Loop(everyforspelling: classic, range, enhanced,for…of,foreach, do-while, Tclforeach/dict for, iRules),Catch,ElseIf(§4's three strategies become three row forms —parent_clause,prev_sibling,clause; Elixir declaresabsentwith the reason, or atext_gated_byrow ifcond/elsecan be told apart — decided here),Exit(return,throw,yield,co_return,exit; Bashreturn/exitcommands by text). - Cognitive: nesting reads
owns_Branch ∪ owns_Switch ∪ owns_Loop ∪ owns_Ternary ∪ owns_Catch ∪ owns_Closure, minusElseIf(cognitive/cpp.rsnests onSwitchStatementtoday; the expression keeps it);compute_booleansreadspays_ShortCircuit; thejs_cognitive!body shrinks to the walk. - Cyclomatic:
impl_cyclomatic_c_family!/_js_family!/_java_like!take their decision set from the rows and collapse to one macro that differs only in the policy expression. -
nexits:impl_exit_match_kinds!becomesowns_Exit. - Delete the replaced lists inside the consumer boundary; bypass gate clean.
Tests and edge cases
-
tests/parity/{cognitive,cyclomatic,exit}_cross_language_parity.rsunchanged and passing. -
ElseIfper language: anif / else if / elsechain, a genuinely nestedifinside anelseblock, and the language's own clause shape (elif,elsif,elseif,else_clause > if) — the predicate must distinguish the first from the second. - Zero drift; both snapshot forms; plain run;
bench-scalingon the nested-if probe sinceElseIfconsults the chain;chain-audit.
Acceptance criteria
- Every (language, Branch|Switch|Loop|Catch|ElseIf|Exit) pair has rows or
absent(reason). -
rg -o 'impl_is_else_if_(\w+)!'finds no invocation; §4's table ingrammar-dispatch.mdpoints at the row forms. - The three cyclomatic macros are one.
Verification and completion evidence
- Corpus diff per language;
bench-scalingexponents;chain-audit;BCA_GATE:line.
Activity
dekobon commentedon Oct 23, 2026
Tracking is ready
The body now links the master issue and the work packages it references. Native parent and blocked-by relationships match the listed completion prerequisites. Implementation and acceptance checkboxes remain open; prerequisite closure and the R04: #1694 go decision govern execution order.
dekobon commentedon Oct 26, 2026
Briefing for planning — what landed since this was written (PR #1717,
e2fd7193onmain)The plan above is still right in outline; it was written against the pre-R06 DSL and consumer shape. Everything below is what the body does not know. 132
pending R07cells remain across the 25 tables (six roles × 22 languages, the restabsent).DSL surface now available (
big-code-analysis-ast/src/roles/mod.rs)gated_by f/text_gated_by f/holds_payer(R05), pluscallable,callable_when f,opens K,opens_by f(R06). Every gate is a namedfn(&Node, &[u8], Ancestors) -> boolinroles/<lang>.rs; a gate the Python reader cannot see by name is not a gate.OWNERS,PAYERS,EXCLUDED,WRAPS,CALLABLE,TEXT_GATED, andowns/owns_kind/owns_via/pays_at_leaf[_kind]/pays_at_wrapper/pays_at_token_kind/is_callable[_kind]/lists_kind/project.owns_kind(kind, …)is the form every cognitive arm uses — onekind_id()read per node, bound once at the top ofcompute; a guard that re-reads it is the regression refactor(getter): declare Modifier, DeclKeyword and Primitive through role tables #1693 / refactor(checker,getter): declare FuncOpener, Closure, Container and opens_space; migrate entry-point callers #1696 removed.lists_kind(kind)is the only byte-less emission (the kind table, gates aside). The byte-lessCheckerspellings forward withAncestors::known(&[]), neverAncestors::unknown(); Tcl's string gate reads "no parent" as a script body, so the known-empty chain is a per-site decision, not a default.ruby_byte_less_spellings_stay_the_kind_tableis the pin to copy where a row's gate reads the chain.TEXT_GATEDper row;nargs::tests::byte_less_spellings_read_only_rows_without_a_text_gateandnom's twin pin the rows the byte-lessis_func/is_closurereaders depend on. AnExitorBranchrow that reads bytes must not be read by a byte-less spelling...c_family_x!()/..js_family_x!()/..tcl_family_x!()splice intoowns/pays; per-dialect gate macros (cpp_family_gates!,js_family_binding_gates!,tcl_family_string_gates!) emit the named gate fns.utils/role_tables.pymust learn every new attribute keyword — it parses the DSL for the three gates, andpython_reader_agrees_with_the_compiled_tablesholds it to the compiled constants. Thedsl_gatesproof table inroles/mod.rs's tests declares each attribute in every position it can sit; a@scanterminal that reads a word the fold consumes must sit above the fold rules, or it is reachable only when the word comes first and no production row need spell the losing order (astra finding on refactor(roles): declare every language's space tree, calls and string literals as role rows #1717; comment at the arms).Consumer shape R07 inherits
src/metrics/cognitive/<lang>.rs) already readsternary/short_circuit/null_safe/func_opener/closureas_ if row::owns_kind(kind, …)guard arms after the kind arms. R07 converts the remaining kind arms —IfStatement, the loops,SwitchStatement,CatchClause,Else, theIfStatement if !Self::is_else_if(…)gate — the same way.enter_function_boundary(…, stops)takesfunc_opener::CALLABLE(orOWNERSfor Java / Groovy / Kotlin, deliberately; C# keeps its own list becauseCALLABLEis gates-aside) and is not R07's, but every new arm sits beside it.nexits.rs:impl_exit_match_kinds!is 6 of the 10 remaining.role-bypass-baseline.txtlines (the other 4 are Elixir's byte-less kind table, enhancement(elixir): add text-aware dispatch for def/defp/defstruct metrics #275). R07'sExitrow clears them;--updateis remove-only, so a swap cannot hide.defmodule/defareCallnodes told apart by text, through oneelixir_declarationread shared byFuncOpenerandContainer(pinned by a counter).cognitive/elixir.rs'selixir_sectiongates keyword-formelse:/rescue:/catch:on an owner list — that list is open bug fix(cognitive/elixir): keyword sections gated on an owner list, block sections not #1602, and R07'sBranch/Catchrows are where it is fixed or explicitly deferred; say which in the plan.impl_cyclomatic_c_family!is a known cause-2rustfmt-bailentry ($ternary $(| $short_circuit)+is not parseable Rust) — the rewrite is the chance to retire that baseline line, and.claude/rules/formatting.mdsays what not to try.Traps the last two packages paid for
Ancestors::of_children(body)is the way to ask a row about a body's children; build it inside the arm that has decided the node is a body, never before the kind test — ahead of it, it ran for every node and a 64k-deep expression cost 3–6 s per metric.ElseIfconsults the chain, andimpl_is_else_if_{parent_clause,prev_sibling,clause}!inchecker.rsare three strategies (grammar-dispatch §4: parent iselse_clause; previous sibling iselse; the clause node is the else-if), with Go / PHP / Python hand-written and Elixir a constantfalse. The row wants onegated_byper strategy, each a named fn;Ancestors::previous_siblingis the chain-fed sibling read, and the byte-less forwarding needs the known-empty-chain decision per language.ifso a reset of the enclosing nesting is observable: every flat lambda fixture in the tree passed withnesting.conditional = 0injected into the arm until the audit-tests pass rewrote them (python_lambda_contributes_lambda_nestingis the corrected shape). R07'sBranch/Loop/Catcharms want the same: a fixture where the arm's own increment and the nesting it inherits are both non-zero, with the alternatives named in theexpected:comment.owners_coveredinroles/call_string_tests.rsiterates the defensive alias list separately and requires each to be declared — a dropped defensive alias was invisible until then. The space-tree tests pin every row answer per kind string in a hand-written table (roles/space_tree_tests.rs); the R07 twin should do the same for the six roles, and eachelse ifstrategy needs its three shapes (chain, nestedifinelse, the language's own clause).~/bca-evidence/1696/has the drivers (oracle3.py,recovery_oracle.py,perturb.py), theverbatim-oraclesource, the base binaries and 27,024 baseline records at7425561f. R07 re-bases one2fd7193: rebuildbcaandverbatim-oraclethere, recapture, then compare per slice. The recovery sweep's cut set must include keyword boundaries (lesson 102). Keep everything under~/bca-evidence/1697/, not/tmp(AGENTS.md, "Oracle evidence lives under a durable path").cognitive/nested-fn,nom/nested-arrowandnpa/java-deep-expressionare the depth probes nearest R07's paths; three unrelated probes tripped at load average 21–29 and cleared at idle. Add the probe this plan already names for theElseIfchain climb on a deepelse ifladder, and falsify it with the climb reinstated.roles/mod.rsis baselined atsloc1430 /ploc688 against 1300 / 550;cognitive/kotlin.rsandcognitive/rust.rshalstead.effortsit just over 50 k from the*_kindspelling. Every DSL addition and every converted arm needsmake self-scan-write-baseline-headroomin the commit that moved it (AGENTS.md, baseline-refresh discipline; split commits need therebase --execform).Process that worked on R06 / R08
Per-language-family story commits (Java → JS family → kind-only → C++ / ObjC → C# → Kotlin / Groovy / Ruby → Python / Elixir), each
BCA_GATE: pass; a completion-review commit; then simplify-rust → audit-tests → rust-optimize → five parallel reviews (thereviewchecklist, performance / recursion, least-reviewed code, acceptance criteria against the issues, astra) → astra on the fixes, twice. Squash the cleanup passes into one commit before the PR and keep the story commits. For scale: the review passes found 11 test gaps, 2 pre-existing performance defects on touched paths, and 1 DSL reachability bug that the story commits' own gates did not — budget for them.dekobon commentedon Oct 31, 2026
Completion — R07 implemented on
refactor/1697-control-flow-rolesTip
fa3f316f, 20 commits overorigin/main(96a45849); the branch base wase2fd7193, and the story commits were rebased with identical per-commit diffs. Every checkbox in the body is ticked against the tree; this comment is the evidence. Full records live under~/bca-evidence/1697/on the author's host (README.mdindexes them;reviews/holds every checkpoint;acceptance-report.mdis the independent 53-row audit).What landed
8df4fcccElseIfscaling probes, oracle/recovery/perturbation drivers, #1720 filed from the keyword-outside-owner measurement8fa309d6impl_cyclomatic_rows!shape fixed (per-tier term lists,extra/constraints, build-time cross-tier disjointness onLEAF_KINDS);ElseIfas apays []split row71de2ccecfcbb0a4fed874e1712aae6195033bdcbd80d2673901ab84paying_roles!(…, control_flow), sharedelse_if_parent_clause_gate!/else_if_prev_sibling_gate!emitters, compare-chain prefilters (slice_contains14–28 → 0 per Halstead body), the test-lang-gates macro-inheritance rulec96cc8fbefc6b283277db30fifdeclined by the payer gate;Elifthe oneElseIfpayer any grammar has; sole-if-under-elsegate read off the chain before scanning) and Rust (count_try,let … elsepays itself);keyword_payers_outside_ownerspinsdce25219c83e9decTclCommandWord/ElixirCallTarget, cached per visited node onFoldCache(Ancestors::classified);elixir_declarationa projection of the same read;impl_is_else_if_clause!deleted9b2de0b8f0632335grammar-dispatch.md§4 on the rows, DSL docs, baseline refresh86cb2034for—impl … for, HRTB,for<'a> fn, andimpl for<'a> Fn(…)(the fourth parent, found in review) — no longer a decision; Halstead untouched; 33 output-submodule snapshots, 387 spacesbb8fc577else:/rescue:/catch:score for any Call riding ado:; two per-list / per-argument memos; two width probes9a05080eimpl_else_if_from_row!with a compile-time!TEXT_GATEDpin, a third Elixir memo for a quadratic inherited frommain,parse_elixirfuzz target + 15 R07 recovery seeds on the existing targets, WMC scope in the #1720 entry, gate fix forhand-written(…)macro invokersfa3f316fnpm/ruby.rsbypass exemptions name the rows main'sdbbf3536tables restateAcceptance criteria
absent:rg 'pending R07' roles/→ 0; census 287 → 157 lines (all remainingpendingare R09). Absent with reasons: RustCatch; PerlSwitch; ElixirElseIf; LuaSwitch; Bash/Go/Lua/Kotlin/…Catch/Guardas stated on each row; Ccomment/Preproc all six.rg -o 'impl_is_else_if_(\w+)!'→ nothing;impl_exit_match_kinds!,impl_cyclomatic_{c_family,js_family,java_like}!deleted;grammar-dispatch.md§4 re-derived: parent-clause (C, Cpp, Mozcpp, Objc, Rust, JS×4; PHP two-word by its own gate), prev-sibling (C#, Groovy, Java, Kotlin), Go parent-is-if, dedicated clause (Bash, iRules, Lua, Perl, Ruby, Tcl; PHP one-word), Python sole-statement, Elixirabsent.impl_cyclomatic_rows!for 19 languages; Python/Rust/Tcl/Elixir hand-written reading rows (ternary decline + loop/tryelse;count_try; per-handlertryandCaseArm∩LooponCommand; per-word tier table).tests/parity/*untouched (git diff --statempty), 31/31 passing.ElseIfper language:roles/control_flow_tests.rs— 22 walk-order row tables + 19is_else_if_*tests covering chain / nested / clause shapes;else_if_chain_scores_below_its_nested_twin_in_every_languagethrough the metric.make role-bypass/role-census/role-coverageOK.Zero drift, then exactly two changes
Oracle (
bcaCLI:metricsunder a 7-variant option matrix,ops,dump,find,count, plus the library's verbatim export) over the integration corpora + a fixture per language, 24,652 files / 345,128 outputs:perffix(end of C2a)Recovery sweeps (every fixture cut at each line/offset/operator/word boundary, both binaries): C1 … C5a 0 differing; 5b 11,688 inputs, 0. One drift caught in flight and kept: C#'s
catchtoken stranded under recovery when read at its clause.Perturbation sweeps: 26 (5a) + 16 (5b) + 23 (audit-tests) production mutations, each caught by the named test (
expectpopulated); the one uncaught (Tcltrypaying flat 1 vs per-handler) is unreachable at the pin (oneon error, notrap) and documented rather than pinned on invalid input.Performance
make bench-scaling: 93/93 probes within bound at the tip (bench/scaling-1602-final.log). New probes:cognitive/else-if-ladder0.94,cognitive/wide-if-siblings0.79,cognitive/python-wide-if-siblings1.00,cognitive/elixir-keyword-sections1.02,cognitive/elixir-rejected-keyword-list1.20 (1.92 / 1.68 / 1.67 with their memos removed — each discriminates).make chain-audit: rc 0 at Phase 0, 5a and Phase 3.bench/c5b-README.md). Deterministic evidence instead: IR check — everyimpl_cyclomatic_rows!body folds to oneswitch i16withkind_idthe only miss-path call (ir/tip-5be8a8c3/);call_keyword_reads/command_name_readscounters pin one text read percall/commandper visit (4→1 Tcl, 9–12→1 Elixir).Gates
make pre-commit→BCA_GATE: pass (gate=pre-commit)at every commit;check-test-lang-gates-compare COMPARE_REF=origin/main→ no test lost a build; single-feature-pbuilds green with differing filtered-out counts (ast: rust 289 / tcl 274 / elixir 263 / go 254; root: rust 601 / tcl 475 / elixir 527 / go 463 / python 597 / none 345);make fuzz-checkbuilds all targets, seeds replay,parse_elixir2,000 runs clean.Patch coverage (plan §6.7,
coverage/README.md): 99.73 % (1,117 / 1,120 changed executable lines) against a floor of max(base 97.65 %, head 98.94 %) = 98.94 %, same toolchain and CI commands on both revisions; the three missed lines were a non-owner early return (now tested) and twois_enabled()continues a single-feature leg reaches.Reviews
C0, C1, C2a, five-agent round, C2 (5b: astra + cost audit), C3a ×2 (#1720 found
abstract_type; #1602 found a pre-existing quadratic), C3b, Phase 3 skill passes (simplify-rust ×3 agents, rust-optimize, review, audit-tests) + four parallel reviews (astra, cost, acceptance, least-reviewed), C4 on the squash. All findings fixed and re-reviewed; dispositions inreviews/.Open before merge
af5c6222todekobon/big-code-analysis-outputmain(parent gitlink already recorded in86cb2034) — awaiting authorisation.dekobon commentedon Oct 31, 2026
Evidence record (supersedes the
~/bca-evidence/1697/path citations above)Per the temp-file tiers rule that landed in #1733, a claim cites what reproduces it, not a path on one host. The numbers in the completion comment stand; this is how each was produced, so they can be re-measured.
Revisions. Branch base
e2fd7193; branch tip after the second rebase7af369d4(25 commits overorigin/main95f5008f). Output-submodule commit for #1720:af5c6222. Toolchainrustc 1.99.0,cargo-llvm-cov 0.9.1,cargo-nextest 0.9.146.Zero-drift oracle. Two release binaries per comparison —
bcafromcargo build --release -p big-code-analysis-cli, and a verbatim-export oracle (a 60-line binary crate depending on the root withfeatures = ["all-languages"]that printsAst::analyze'sFuncSpacetree as JSON lines). Driven overtests/repositories/(the integration corpora: serde, DeepSpeech, pdf.js) plus one hand-written fixture per language, withmetrics -O jsonunder seven option variants (--exclude-tests×--cyclomatic-count-try=false,--metrics cyclomatic|cognitive|nexits),ops,dump,find call|string,count; outputs compared byte-for-byte after normalising the fixture-root path. 24,652 files, 345,128 outputs. Results: 0 differing at the migration's last commit vse2fd7193; 207 at the pre-rebase tip (201 Rust = #1720, cyclomatic and MI only, 397 spaces by position; 6 Elixir = #1602, cognitive only, the R07 fixture); at7af369d4vse2fd7193, 247 — the same 207 plus 40 C++/Mozcpp outputs on four DeepSpeech headers whose only changed fields areclass_npm_sum/coa/class_methods/total_methods/class_coa/total, i.e.main's own7b6ec276(fix(npa/cpp)) brought in by the rebase.Recovery sweep. Every fixture cut at each line, byte offset, operator and word boundary, both binaries, fail-closed on a non-zero exit: 14,508 inputs at 5a, 11,688 at 5b, 0 differing.
Perturbation sweeps. Production mutations applied from an in-memory backup and restored, full
--libsuite per mutation: 26 (5a) + 16 (5b) + 23 + 21 (two audit-tests rounds), each caught by the named test; the one uncaught (Tcltrypaying flat 1 vs per handler) is unreachable at the pin (oneon error, notrap) and documented incyclomatic/tcl.rsrather than pinned on invalid input.Performance.
make bench-scaling96/96 at7af369d4; the five R07 probes' perturbed exponents are recorded in theirrationalestrings inbig-code-analysis-bench/src/shapes.rs. IR check:cargo rustc --release -p big-code-analysis -- --emit=llvm-ir, demangle, countswitch i16/icmp eq i16/callin eachCyclomatic::computebody — everyimpl_cyclomatic_rows!body is oneswitchwithkind_idthe only miss-path call (Java1 / 0 / 1, C1 / 0 / 1, Perl1 / 0 / 2); identical at5be8a8c3andb140cf5c.make chain-auditrc 0.Coverage.
cargo llvm-cov clean --workspace; cargo llvm-cov --no-report nextest --all-features --workspace --locked; cargo llvm-cov report --workspace --jsonone2fd7193and11bbd049,codecov.ymlignores applied to both: project 97.65 % → 98.94 % lines; patch 1,117 / 1,120 = 99.73 % against the 98.94 % floor.Tier-1 follow-ups (drivers and fixtures with no permanent home yet, to be filed with the PR): the oracle / compare / recovery / perturbation drivers,
coverage_diff.py, the IR check script, and the 21 per-language R07 fixtures.dekobon commentedon Oct 31, 2026
History restructured for review
The branch's 27 chronological commits (preserved locally as
backup/1697-27-commits) carried three generations of the else-if design and ten review-pass commits that reshaped the two behaviour fixes after they landed — a reviewer walking them would review code that no longer exists. Rebased ontoorigin/main0a9b6ebdand rewritten as four final-shape commits, each one reviewable on its own:3e0609b2fix(utils): the test-lang-gates derivation reads a macro from its invokers (standalone; applies onmain)9076c554f673cbefrefactor(roles,…): the six control-flow roles declared and read everywhere — the zero-drift migration9076c554357c1ffbfix(cyclomatic/rust): #1720, with its snapshotsaf5c62224cb989c2fix(cognitive/elixir): #1602af5c6222The final tree is byte-identical to the 27-commit tip except one CHANGELOG sentence that cross-referenced the fixes from the refactor entry (each entry now stands alone).
Zero drift re-established on commit 2's tree, which had never existed as a commit before: whole-corpus oracle (
oracle.py/compare.pyas recorded above,--jobs 8) atf673cbefvs basee2fd7193— 984 raw differences of 345,128; 944 are the fixture-root path rename, the 40 that survive normalisation are the cpp/mozcpp NPA fields of main's7b6ec276; R07's own drift 0. Andf673cbefvs the previous tip (7af369d4's capture): 207 differing — rust 201 / 33 files, fieldscyclomatic.{sum,average,modified.*}andmi.{sei,visual_studio,original}only; elixir 6 /r07.ex, cognitive only — i.e. tip − refactor = exactly #1720 + #1602.Per-commit
make pre-commitin a fresh worktree: commit 1BCA_GATE: pass; commits 2–4 recorded on the PR.dekobon commentedon Nov 1, 2026
PR open: #1741. Final chain on
origin/main0a9b6ebd:b7bb9024(gate fix) →4e401612(refactor, zero drift) →6c639f71(#1720) →f53f55c7(#1602); output-submoduleaf5c6222pushed todekobon/big-code-analysis-outputmain. Each commitBCA_GATE: passin a fresh worktree;check-test-lang-gates-compareOK against main.refactor(roles,cyclomatic,cognitive,nexits,abc,getter): declare Branc…
dekobon commentedon Nov 1, 2026
Working-cache records (attached before the cache was cleared)
The regenerable evidence under the working cache (corpus captures, coverage profiles, per-checkpoint binaries, bench logs, IR dumps — ~134 GB) is deleted; every number it supported is recorded in the evidence-record comment above with the command and revisions that regenerate it. What was not regenerable and had no tree home is zipped here (98 files, 2.6 MB uncompressed):
reviews/— every review round's findings and dispositions (C0–C4, the five-agent and skill passes,phase3-passes.mdwith the two closing reviews), plus the per-slice diffs they were taken over. The audit trail of why 27 commits became 4.acceptance-report.md(the 53-row independent audit), the drift attributions (p3-tip-README.md, which corrects the squash message's 320 to 397 spaces;ATTRIBUTION.md), the coverage and bench READMEs.perturb-c*.json— the perturbation specs for the 86-mutation sweeps, with their results; without these the "each caught by the named test" claim could not be re-run. R11 (docs(ast): document the role tables and close out #1701) carries theutils/home forperturb.py; the specs belong beside it.probe/,review-1720/,review-1602/,perf-audit-tip/,audit6/*.py— the hand-written probe fixtures from the fix(cyclomatic/rust): impl … for and for<'a> bounds score a loop decision #1720 / fix(cognitive/elixir): keyword sections gated on an owner list, block sections not #1602 reviews (abstract.rsis the one that found the fourth type-syntax parent) and the two audit drivers.Still in the cache for R10 / R11, as their steps say:
oracle.py,compare.py,recovery_oracle.py,perturb.py,coverage_diff.py,ir_check.sh,snapdiff.py,verbatim-oracle-src/(source only),fixtures-r07/,fixtures-c5b/,fixtures-0e/.Attached in the next comment: bca-1697-records.zip (429 KB, 98 files).
dekobon commentedon Nov 1, 2026
bca-1697-records.zip
docs(lessons): record the 2026-11-01 batch
docs(lessons): record the 2026-11-01 batch