diff --git a/docs/language_status/apex.md b/docs/language_status/apex.md index adc90e12..5fb08cf4 100644 --- a/docs/language_status/apex.md +++ b/docs/language_status/apex.md @@ -210,20 +210,24 @@ regex gaps directly. whole-match fallback overcounted every zero/one-arg signature by +1 across 13 languages including Apex; fixed by wrapping the parenthesized parameter span in its own capture group. -**Open, unresolved (as of this writing):** -- [#1963](https://github.com/squid-protocol/gitgalaxy/issues/1963) (OPEN, filed 2026-08-20) — - `func_start` false-positives on `new ClassName(...)` object-instantiation expressions inside - multi-line constructor-call arguments (e.g. `TestFactory.createSObject(\n new - Account(name = 'X'),\n true\n)` misparses `new Account(...)` as a method definition named - `Account`). Root cause: the method branch's optional return-type/modifier prefix group accepts - *any* identifier-shaped token followed by whitespace, and nothing excludes the reserved `new` - keyword from that slot — unlike csharp/java/groovy/dart, whose equivalent prefix groups already - exclude `new`. Diagnosed via the tri-comparison ledger - (`apex/function/existence/agree[gitgalaxy]_vs[tree_sitter]`) and confirmed against the real - `language-crucible` apex corpus (6 occurrences across `AuraEnabledRecipes_Tests.cls` and - `SOQLRecipes_Tests.cls` in `apex-recipes`). Not yet fixed; suggested fix is a `(?!new\b)` - negative lookahead immediately before the optional return-type/modifier prefix group in both - `func_start` and (likely) `args`, which shares the identical prefix shape. +**Real bugs found and fixed the same day, follow-on to the tri-comparison sweep:** +- [#1963](https://github.com/squid-protocol/gitgalaxy/issues/1963) (CLOSED same day) — + `func_start` (and, confirmed separately, `args`) false-positived on `new ClassName(...)` + object-instantiation expressions inside multi-line constructor-call arguments (e.g. + `TestFactory.createSObject(\n new Account(name = 'X'),\n true\n)` misparsed `new Account(...)` + as a method definition named `Account`, with a bogus 1-parameter arg count). Root cause: both + regexes' optional return-type/modifier prefix group accepted *any* identifier-shaped token + followed by whitespace, with nothing excluding the reserved `new` keyword — unlike + csharp/java/groovy/dart, whose equivalent prefix groups already exclude it. Diagnosed via the + tri-comparison ledger (`apex/function/existence/agree[gitgalaxy]_vs[tree_sitter]`), confirmed + against the local `language-crucible` apex corpus (6 occurrences across + `AuraEnabledRecipes_Tests.cls` and `SOQLRecipes_Tests.cls`), and fixed with a `(?!new\b)` + negative lookahead in both regexes, mirroring csharp's own GHOST ARGS SHIELD precedent. + `crucible_check.py`'s ~80-repo differential scan surfaced a third, independent instance of the + same bug (`xml/apex/IterationRecipes_Tests.cls`, 3 more `new Account(...)` false positives + inside a `List{...}` initializer) that neither the ledger sample nor the local corpus + had shown — also resolved by the same fix, confirming it generalizes correctly. GitGalaxy's + function count on the local corpus now matches tree-sitter exactly (38/38, zero name diffs). Search performed via `gh issue list --search 'in:title "Extraction hardening: apex"'` / `'in:title "Strict parsing tests: \`apex\`"'` / `'in:title apex'` (2026-08-20), cross-checked @@ -260,23 +264,25 @@ produced against each other was investigated by reading real source `docs/self_scan/tri_comparison_ledger.json`, filterable to `"language": "apex"`. **Result: 1 of 1 discrepancy shape (6 individual occurrences corpus-wide) resolved, 1 confirmed -GitGalaxy engine defect.** Unlike c.md's or cobol.md's §9, this pass did NOT come out clean for -GitGalaxy — the one shape investigated is a real false-positive bug, filed as -[#1963](https://github.com/squid-protocol/gitgalaxy/issues/1963) and still open as of this -writing. Current measured numbers (`tests/tools/tri_comparison_chart.py --languages apex`, +GitGalaxy engine defect — found, root-caused, and fixed the same day** (see +[#1963](https://github.com/squid-protocol/gitgalaxy/issues/1963), closed). Current measured +numbers post-fix (`tests/tools/tri_comparison_chart.py --languages apex`, `language-crucible/data/apex/apex-recipes/`): | Signal | GitGalaxy | tree-sitter | Read as | |---|---|---|---| -| Functions found (of 40 total claimed by either tool) | 40 | 38 | GitGalaxy's higher count includes the 6 (2 sampled, ledger-capped) false positives below | -| Function precision (of what each tool claimed, how much corroborates) | 95.0% (38/40) | **100%** (38/38) | badged: tree-sitter | +| Functions found (of 38 total claimed by either tool) | 38 | 38 | exact agreement, zero name diffs post-fix | +| Function precision (of what each tool claimed, how much corroborates) | **100%** (38/38) | **100%** (38/38) | tied — no badge | | Class recall/precision | 4/4 | 4/4 | tied — no badge | | Args exact-match | 38 | 38 | unranked found-count panel, no badge | -### Where GitGalaxy has a confirmed gap (not tree-sitter's problem) +Before the fix, GitGalaxy over-claimed at 40/38 (95.0% precision) while tree-sitter sat at 100% +(38/38) — see the fix writeup below for what closed that gap. + +### The one confirmed bug this pass found (root-caused and fixed) - **`new ClassName(...)` constructor calls misparsed as function definitions.** The apex - `func_start` regex's optional return-type/modifier prefix accepts any identifier-shaped token + `func_start` regex's optional return-type/modifier prefix accepted any identifier-shaped token followed by whitespace at the start of a line, with no exclusion for Apex's `new` keyword — so a multi-line SObject-builder call like: ```apex @@ -285,27 +291,46 @@ writing. Current measured numbers (`tests/tools/tri_comparison_chart.py --langua true ); ``` - gets its `new Account(` line parsed as "return type = `new`, function name = `Account`". + had its `new Account(` line parsed as "return type = `new`, function name = `Account`" (with a + bogus 1-parameter arg count derived from the constructor's own named-parameter assignment). tree-sitter's grammar correctly distinguishes `object_creation_expression` from - `method_declaration` and never makes this mistake. Confirmed via direct source read - (`apex-recipes/AuraEnabledRecipes_Tests.cls:25,43`, the ledger's sampled pair) and via running - the regex standalone against the whole corpus, which surfaces 6 total instances across 2 files - (`AuraEnabledRecipes_Tests.cls:6,25,43`, `SOQLRecipes_Tests.cls:226,235,504`) — all the identical - shape. Filed as [#1963](https://github.com/squid-protocol/gitgalaxy/issues/1963); not yet fixed. + `method_declaration` and never made this mistake. Confirmed via direct source read + (`apex-recipes/AuraEnabledRecipes_Tests.cls:25,43`, the ledger's sampled pair), via running the + regex standalone against the local corpus (6 total instances across 2 files: + `AuraEnabledRecipes_Tests.cls:6,25,43`, `SOQLRecipes_Tests.cls:226,235,504`), and — separately — + in the `args` regex itself, which shared the identical unshielded prefix shape (confirmed to + false-positive on the same 6 lines standalone, though it never surfaced its own ledger shape + since `args_count` is only derived within a scope `func_start` already anchored). An incidental-finding pass across sibling C-family/OOP languages (csharp, java, groovy, dart, kotlin, scala, php) found none of them reproduce this — csharp/java/groovy/dart already carry an - explicit `(?!new[ \t\n]+...)` exclusion for exactly this shape, so the fix is applying an - already-proven pattern from a sibling language, not designing a new one. + explicit `(?!new[ \t\n]+...)` exclusion for exactly this shape (csharp's own "GHOST ARGS SHIELD"), + so the fix applied an already-proven pattern from a sibling language rather than designing a new + one: a `(?!new\b)` negative lookahead immediately before the optional prefix-consuming group in + both `func_start` and `args`. + + `crucible_check.py`'s ~80-repo differential scan (required for any `language_standards.py` + change per this repo's PR protocol) surfaced a **third, independent instance** of the same bug + neither the ledger sample nor the local `apex-recipes/` corpus had shown: + `xml/apex/IterationRecipes_Tests.cls`, 3 more `new Account(...)` false positives inside a + `List{...}` collection initializer (lines 9–11). Also resolved by the same fix, + confirming it generalizes correctly rather than being narrowly tailored to the two files + originally found. Both `tests/golden_master_audit.json` and + `tests/golden_master_zero_dep_audit.json` were re-blessed to reflect the intentional, + correct output change (function/param counts, and their downstream derived metrics — + topological coordinates, structural magnitude, testing-exposure percentage — recomputing + from the corrected counts). ### Ties +- **Function existence/precision** — post-fix, both tools agree on all 38 real functions in the + sampled corpus, 100%/100%, no badge (a tie). - **Class existence/precision** — both tools agree on all 4 real classes in the sampled corpus, - 100%/100%, no unresolved disagreement and no badge (a tie, per the chart's own badge rule). + 100%/100%, no badge. ### Scope caveat This corpus (`apex-recipes/`) is small (2 `.cls` files with hits, single-digit class count) — the -1 discrepancy shape and its 6 occurrences are everything this methodology surfaced on the -currently-available corpus, not a claim that apex's `func_start` regex has no other gaps a larger -corpus might reveal. See the ledger entry +1 discrepancy shape and its 6 (plus 3 more found via the wider crucible corpus) occurrences are +everything this methodology surfaced on the currently-available corpus, not a claim that apex's +`func_start`/`args` regexes have no other gaps a larger corpus might reveal. See the ledger entry `apex/function/existence/agree[gitgalaxy]_vs[tree_sitter]` for the full investigation writeup. diff --git a/docs/self_scan/tri_comparison_chart.svg b/docs/self_scan/tri_comparison_chart.svg index 41548a21..1b2f5cfa 100644 --- a/docs/self_scan/tri_comparison_chart.svg +++ b/docs/self_scan/tri_comparison_chart.svg @@ -78,16 +78,14 @@ apex -40 - +38 + 38 - -38/40 + +38/38 38/38 - -T 4 @@ -1073,11 +1071,11 @@ GitGalaxy best: 8 (31%) T -tree-sitter best: 2 (8%) +tree-sitter best: 1 (4%) C ctags best: 0 (0%) -Ties: 16 (62%) +Ties: 17 (65%) Ranked-panel labels are matched/total; found-count panels are a single raw count, no denominator. Regenerate: tri_comparison_chart.py --all --write \ No newline at end of file diff --git a/docs/self_scan/tri_comparison_ledger.json b/docs/self_scan/tri_comparison_ledger.json index 4af88258..8d706cb2 100644 --- a/docs/self_scan/tri_comparison_ledger.json +++ b/docs/self_scan/tri_comparison_ledger.json @@ -13,7 +13,7 @@ "investigated_at": "2026-08-20T00:00:00Z", "investigated_by": "Claude (Sonnet 5), direct investigation via tri-comparison-ledger-sweep", "language": "agc_assembly", - "last_reconciled_at": "2026-08-20T22:18:34Z", + "last_reconciled_at": "2026-08-20T22:53:27Z", "last_seen_count": 215, "last_seen_examples": [ { @@ -118,7 +118,7 @@ "investigated_at": "2026-08-20T00:00:00Z", "investigated_by": "Claude (Sonnet 5), direct investigation via tri-comparison-ledger-sweep", "language": "agc_assembly", - "last_reconciled_at": "2026-08-20T22:18:34Z", + "last_reconciled_at": "2026-08-20T22:53:27Z", "last_seen_count": 37, "last_seen_examples": [ { @@ -221,7 +221,7 @@ "investigated_at": "2026-08-20T22:17:39Z", "investigated_by": "Claude Sonnet 5, dispatched via tri-comparison-ledger-sweep (direct investigation, no Gemini dispatch needed -- root cause was immediately clear from source)", "language": "apex", - "last_reconciled_at": "2026-08-20T22:21:09Z", + "last_reconciled_at": "2026-08-20T22:53:28Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -243,9 +243,9 @@ ], "metric": "existence", "status": "validated", - "still_reproduces": true, + "still_reproduces": false, "symbol_type": "function", - "verdict": "Confirmed GitGalaxy engine defect, not a tree-sitter gap. Both sampled occurrences (apex-recipes/AuraEnabledRecipes_Tests.cls:25 and :43) are `new Account(name = ...)` object-instantiation expressions inside a multi-line SObject-builder call, not real method/constructor definitions -- confirmed by reading the source directly. Root cause: the func_start regex (language_standards.py, apex rules) treats any `[a-zA-Z_][\\w.]*[ \\t\\n]+` token at start-of-line as an eligible optional return-type/modifier prefix before the captured function name, with no exclusion for the `new` keyword -- so `new Account(` parses as \"returnType=new, name=Account\", passing the #1221 gating fix (which only requires the line START with one of annotation/modifier/return-type-shaped token, not that the token be a real type). tree_sitter correctly does not report these as functions since its grammar distinguishes object_creation_expression from method_declaration structurally. Verified this generalizes beyond the 2-occurrence ledger sample: running the regex directly against the whole apex corpus found 6 total false-positive matches across 2 files (AuraEnabledRecipes_Tests.cls:6,25,43 and SOQLRecipes_Tests.cls:226,235,504), all the identical `new ClassName(` shape. Filed as GitHub issue #1963 (exclude `new` from the eligible return-type/modifier prefix token). No credit_tools/debit_tools adjustment needed: since only gitgalaxy is in agreeing_tools here (len(present)==1), the reconciler already excludes this from gitgalaxy matched_consensus by default while still counting it in total_slots -- the default precision score already reflects this correctly as an unconfirmed/wrong claim." + "verdict": "Confirmed GitGalaxy engine defect, not a tree-sitter gap. Both sampled occurrences (apex-recipes/AuraEnabledRecipes_Tests.cls:25 and :43) are `new Account(name = ...)` object-instantiation expressions inside a multi-line SObject-builder call, not real method/constructor definitions -- confirmed by reading the source directly. Root cause: the func_start regex (language_standards.py, apex rules) treats any `[a-zA-Z_][\\w.]*[ \\t\\n]+` token at start-of-line as an eligible optional return-type/modifier prefix before the captured function name, with no exclusion for the `new` keyword -- so `new Account(` parses as \"returnType=new, name=Account\", passing the #1221 gating fix (which only requires the line START with one of annotation/modifier/return-type-shaped token, not that the token be a real type). tree_sitter correctly does not report these as functions since its grammar distinguishes object_creation_expression from method_declaration structurally. Verified this generalizes beyond the 2-occurrence ledger sample: running the regex directly against the whole apex corpus found 6 total false-positive matches across 2 files (AuraEnabledRecipes_Tests.cls:6,25,43 and SOQLRecipes_Tests.cls:226,235,504), all the identical `new ClassName(` shape. Filed as GitHub issue #1963 and FIXED in the same pass: added `(?!new\\b)` immediately before the optional return-type/modifier prefix group in both `func_start` and `args` (the latter had the identical unshielded shape, confirmed by testing it directly against the same lines -- also fixed, matching csharp's own GHOST ARGS SHIELD precedent). Verified post-fix against both the local apex-recipes corpus (0 remaining false positives, GitGalaxy's function count now matches tree-sitter exactly at 38/38 with zero name diffs) and the full ~80-repo language-crucible corpus via `crucible_check.py`, which surfaced a THIRD independent instance of the same bug (`xml/apex/IterationRecipes_Tests.cls`, 3 more `new Account(...)` false positives inside a `List{...}` initializer) neither the ledger sample nor the local corpus had shown -- also resolved by the same fix, confirming it generalizes correctly. Golden master fixtures re-blessed to reflect the intentional, correct output change. No credit_tools/debit_tools adjustment needed: since only gitgalaxy was in agreeing_tools here (len(present)==1), the reconciler already excluded this from gitgalaxy matched_consensus by default while still counting it in total_slots -- the default precision score already reflected this correctly as an unconfirmed/wrong claim, and now correctly reads 100%/100% (a tie with tree-sitter) post-fix." }, "assembly/function/existence/agree[ctags]_vs[gitgalaxy]": { "agreeing_tools": [ @@ -260,7 +260,7 @@ "investigated_at": "2026-08-20T00:00:00Z", "investigated_by": "Claude (Sonnet 5), direct investigation via tri-comparison-ledger-sweep", "language": "assembly", - "last_reconciled_at": "2026-08-20T22:18:37Z", + "last_reconciled_at": "2026-08-20T22:53:30Z", "last_seen_count": 26, "last_seen_examples": [ { @@ -363,7 +363,7 @@ "investigated_at": "2026-08-20T00:00:00Z", "investigated_by": "Claude (Sonnet 5), direct investigation via tri-comparison-ledger-sweep", "language": "assembly", - "last_reconciled_at": "2026-08-20T22:18:37Z", + "last_reconciled_at": "2026-08-20T22:53:30Z", "last_seen_count": 7, "last_seen_examples": [ { @@ -443,7 +443,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (resolved + fixed directly, no dispatch needed)", "language": "c", - "last_reconciled_at": "2026-08-20T22:18:42Z", + "last_reconciled_at": "2026-08-20T22:53:35Z", "last_seen_count": 23, "last_seen_examples": [ { @@ -557,7 +557,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Gemini (dispatched via tri-comparison-ledger-sweep), confirmed by Claude Sonnet 5", "language": "c", - "last_reconciled_at": "2026-08-20T22:18:42Z", + "last_reconciled_at": "2026-08-20T22:53:35Z", "last_seen_count": 9, "last_seen_examples": [ { @@ -662,7 +662,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Gemini (dispatched via tri-comparison-ledger-sweep), confirmed by Claude Sonnet 5", "language": "c", - "last_reconciled_at": "2026-08-20T22:18:42Z", + "last_reconciled_at": "2026-08-20T22:53:35Z", "last_seen_count": 525, "last_seen_examples": [ { @@ -776,7 +776,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (resolved directly, no dispatch needed) -- corrected after cross-referencing #1837", "language": "c", - "last_reconciled_at": "2026-08-20T22:18:42Z", + "last_reconciled_at": "2026-08-20T22:53:35Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -809,7 +809,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (resolved + fixed directly, no dispatch needed)", "language": "c", - "last_reconciled_at": "2026-08-20T22:18:42Z", + "last_reconciled_at": "2026-08-20T22:53:35Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -842,7 +842,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Gemini (dispatched via tri-comparison-ledger-sweep), confirmed by Claude Sonnet 5", "language": "c", - "last_reconciled_at": "2026-08-20T22:18:42Z", + "last_reconciled_at": "2026-08-20T22:53:35Z", "last_seen_count": 13, "last_seen_examples": [ { @@ -959,7 +959,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (resolved directly, no dispatch needed)", "language": "c", - "last_reconciled_at": "2026-08-20T22:18:42Z", + "last_reconciled_at": "2026-08-20T22:53:35Z", "last_seen_count": 3, "last_seen_examples": [ { @@ -1010,7 +1010,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (resolved + fixed directly, no dispatch needed)", "language": "c", - "last_reconciled_at": "2026-08-20T22:18:42Z", + "last_reconciled_at": "2026-08-20T22:53:35Z", "last_seen_count": 7, "last_seen_examples": [ { @@ -1097,7 +1097,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Gemini (dispatched via tri-comparison-ledger-sweep), confirmed by Claude Sonnet 5", "language": "c", - "last_reconciled_at": "2026-08-20T22:18:42Z", + "last_reconciled_at": "2026-08-20T22:53:35Z", "last_seen_count": 3, "last_seen_examples": [ { @@ -1150,7 +1150,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (resolved directly, no dispatch needed)", "language": "c", - "last_reconciled_at": "2026-08-20T22:18:42Z", + "last_reconciled_at": "2026-08-20T22:53:35Z", "last_seen_count": 4, "last_seen_examples": [ { @@ -1210,7 +1210,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Gemini (dispatched via tri-comparison-ledger-sweep), confirmed by Claude Sonnet 5", "language": "c", - "last_reconciled_at": "2026-08-20T22:18:42Z", + "last_reconciled_at": "2026-08-20T22:53:35Z", "last_seen_count": 74, "last_seen_examples": [ { @@ -1325,7 +1325,7 @@ "investigated_at": "2026-08-19", "investigated_by": "gemini-3.1-pro-high (agy), dispatched via tri-comparison-ledger-sweep, self-corrected and reviewed by claude-sonnet-5", "language": "cobol", - "last_reconciled_at": "2026-08-20T22:18:48Z", + "last_reconciled_at": "2026-08-20T22:53:40Z", "last_seen_count": 19, "last_seen_examples": [ { @@ -1428,7 +1428,7 @@ "investigated_at": "2026-08-19", "investigated_by": "gemini-3.1-pro-high (agy), dispatched via tri-comparison-ledger-sweep, reviewed by claude-sonnet-5", "language": "cobol", - "last_reconciled_at": "2026-08-20T22:18:48Z", + "last_reconciled_at": "2026-08-20T22:53:40Z", "last_seen_count": 136, "last_seen_examples": [ { @@ -1531,7 +1531,7 @@ "investigated_at": "2026-08-19", "investigated_by": "gemini-3.1-pro-high (agy), dispatched via tri-comparison-ledger-sweep, reviewed by claude-sonnet-5", "language": "cobol", - "last_reconciled_at": "2026-08-20T22:18:48Z", + "last_reconciled_at": "2026-08-20T22:53:40Z", "last_seen_count": 43, "last_seen_examples": [ { @@ -1635,7 +1635,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -1677,7 +1677,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 95, "last_seen_examples": [ { @@ -1791,7 +1791,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 22, "last_seen_examples": [ { @@ -1905,7 +1905,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 13, "last_seen_examples": [ { @@ -2019,7 +2019,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 15, "last_seen_examples": [ { @@ -2133,7 +2133,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -2165,7 +2165,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -2198,7 +2198,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 8, "last_seen_examples": [ { @@ -2294,7 +2294,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -2327,7 +2327,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 1074, "last_seen_examples": [ { @@ -2441,7 +2441,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 1097, "last_seen_examples": [ { @@ -2555,7 +2555,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 62, "last_seen_examples": [ { @@ -2669,7 +2669,7 @@ "investigated_at": null, "investigated_by": null, "language": "cpp", - "last_reconciled_at": "2026-08-20T22:18:52Z", + "last_reconciled_at": "2026-08-20T22:53:45Z", "last_seen_count": 98, "last_seen_examples": [ { @@ -2783,7 +2783,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 3, "last_seen_examples": [ { @@ -2834,7 +2834,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 5, "last_seen_examples": [ { @@ -2903,7 +2903,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 6, "last_seen_examples": [ { @@ -2981,7 +2981,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -3014,7 +3014,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 7, "last_seen_examples": [ { @@ -3101,7 +3101,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 4, "last_seen_examples": [ { @@ -3160,7 +3160,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -3193,7 +3193,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 271, "last_seen_examples": [ { @@ -3307,7 +3307,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 4, "last_seen_examples": [ { @@ -3367,7 +3367,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -3400,7 +3400,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 107, "last_seen_examples": [ { @@ -3514,7 +3514,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 48, "last_seen_examples": [ { @@ -3628,7 +3628,7 @@ "investigated_at": null, "investigated_by": null, "language": "csharp", - "last_reconciled_at": "2026-08-20T22:18:59Z", + "last_reconciled_at": "2026-08-20T22:53:51Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -3661,7 +3661,7 @@ "investigated_at": null, "investigated_by": null, "language": "css", - "last_reconciled_at": "2026-08-20T22:19:00Z", + "last_reconciled_at": "2026-08-20T22:53:52Z", "last_seen_count": 3, "last_seen_examples": [ { @@ -3710,7 +3710,7 @@ "investigated_at": null, "investigated_by": null, "language": "dart", - "last_reconciled_at": "2026-08-20T22:19:04Z", + "last_reconciled_at": "2026-08-20T22:53:56Z", "last_seen_count": 216, "last_seen_examples": [ { @@ -3813,7 +3813,7 @@ "investigated_at": null, "investigated_by": null, "language": "dart", - "last_reconciled_at": "2026-08-20T22:19:04Z", + "last_reconciled_at": "2026-08-20T22:53:56Z", "last_seen_count": 37, "last_seen_examples": [ { @@ -3916,7 +3916,7 @@ "investigated_at": null, "investigated_by": null, "language": "dart", - "last_reconciled_at": "2026-08-20T22:19:04Z", + "last_reconciled_at": "2026-08-20T22:53:56Z", "last_seen_count": 18, "last_seen_examples": [ { @@ -4020,7 +4020,7 @@ "investigated_at": null, "investigated_by": null, "language": "fortran", - "last_reconciled_at": "2026-08-20T22:19:10Z", + "last_reconciled_at": "2026-08-20T22:54:02Z", "last_seen_count": 8, "last_seen_examples": [ { @@ -4115,7 +4115,7 @@ "investigated_at": null, "investigated_by": null, "language": "fortran", - "last_reconciled_at": "2026-08-20T22:19:10Z", + "last_reconciled_at": "2026-08-20T22:54:02Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -4148,7 +4148,7 @@ "investigated_at": null, "investigated_by": null, "language": "fortran", - "last_reconciled_at": "2026-08-20T22:19:10Z", + "last_reconciled_at": "2026-08-20T22:54:02Z", "last_seen_count": 14, "last_seen_examples": [ { @@ -4262,7 +4262,7 @@ "investigated_at": null, "investigated_by": null, "language": "fortran", - "last_reconciled_at": "2026-08-20T22:19:10Z", + "last_reconciled_at": "2026-08-20T22:54:02Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -4304,7 +4304,7 @@ "investigated_at": null, "investigated_by": null, "language": "fortran", - "last_reconciled_at": "2026-08-20T22:19:10Z", + "last_reconciled_at": "2026-08-20T22:54:02Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -4346,7 +4346,7 @@ "investigated_at": null, "investigated_by": null, "language": "go", - "last_reconciled_at": "2026-08-20T22:19:12Z", + "last_reconciled_at": "2026-08-20T22:54:04Z", "last_seen_count": 75, "last_seen_examples": [ { @@ -4460,7 +4460,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (session investigation)", "language": "haskell", - "last_reconciled_at": "2026-08-20T22:19:15Z", + "last_reconciled_at": "2026-08-20T22:54:07Z", "last_seen_count": 16, "last_seen_examples": [ { @@ -4572,7 +4572,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (session investigation)", "language": "haskell", - "last_reconciled_at": "2026-08-20T22:19:15Z", + "last_reconciled_at": "2026-08-20T22:54:07Z", "last_seen_count": 9, "last_seen_examples": [ { @@ -4677,7 +4677,7 @@ "investigated_at": null, "investigated_by": null, "language": "haskell", - "last_reconciled_at": "2026-08-20T22:19:15Z", + "last_reconciled_at": "2026-08-20T22:54:07Z", "last_seen_count": 38, "last_seen_examples": [ { @@ -4791,7 +4791,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (dispatched agent investigation)", "language": "haskell", - "last_reconciled_at": "2026-08-20T22:19:15Z", + "last_reconciled_at": "2026-08-20T22:54:07Z", "last_seen_count": 103, "last_seen_examples": [ { @@ -4905,7 +4905,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (dispatched agent investigation)", "language": "haskell", - "last_reconciled_at": "2026-08-20T22:19:15Z", + "last_reconciled_at": "2026-08-20T22:54:07Z", "last_seen_count": 69, "last_seen_examples": [ { @@ -5019,7 +5019,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (session investigation)", "language": "haskell", - "last_reconciled_at": "2026-08-20T22:19:15Z", + "last_reconciled_at": "2026-08-20T22:54:07Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -5060,7 +5060,7 @@ "investigated_at": null, "investigated_by": null, "language": "haskell", - "last_reconciled_at": "2026-08-20T22:19:15Z", + "last_reconciled_at": "2026-08-20T22:54:07Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -5100,7 +5100,7 @@ "investigated_at": null, "investigated_by": null, "language": "haskell", - "last_reconciled_at": "2026-08-20T22:19:15Z", + "last_reconciled_at": "2026-08-20T22:54:07Z", "last_seen_count": 91, "last_seen_examples": [ { @@ -5214,7 +5214,7 @@ "investigated_at": null, "investigated_by": null, "language": "java", - "last_reconciled_at": "2026-08-20T22:19:18Z", + "last_reconciled_at": "2026-08-20T22:54:10Z", "last_seen_count": 28, "last_seen_examples": [ { @@ -5328,7 +5328,7 @@ "investigated_at": null, "investigated_by": null, "language": "java", - "last_reconciled_at": "2026-08-20T22:19:18Z", + "last_reconciled_at": "2026-08-20T22:54:10Z", "last_seen_count": 12, "last_seen_examples": [ { @@ -5442,7 +5442,7 @@ "investigated_at": null, "investigated_by": null, "language": "java", - "last_reconciled_at": "2026-08-20T22:19:18Z", + "last_reconciled_at": "2026-08-20T22:54:10Z", "last_seen_count": 28, "last_seen_examples": [ { @@ -5555,7 +5555,7 @@ "investigated_at": null, "investigated_by": null, "language": "java", - "last_reconciled_at": "2026-08-20T22:19:18Z", + "last_reconciled_at": "2026-08-20T22:54:10Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -5588,7 +5588,7 @@ "investigated_at": null, "investigated_by": null, "language": "java", - "last_reconciled_at": "2026-08-20T22:19:18Z", + "last_reconciled_at": "2026-08-20T22:54:10Z", "last_seen_count": 3, "last_seen_examples": [ { @@ -5639,7 +5639,7 @@ "investigated_at": null, "investigated_by": null, "language": "java", - "last_reconciled_at": "2026-08-20T22:19:18Z", + "last_reconciled_at": "2026-08-20T22:54:10Z", "last_seen_count": 315, "last_seen_examples": [ { @@ -5753,7 +5753,7 @@ "investigated_at": null, "investigated_by": null, "language": "java", - "last_reconciled_at": "2026-08-20T22:19:18Z", + "last_reconciled_at": "2026-08-20T22:54:10Z", "last_seen_count": 3, "last_seen_examples": [ { @@ -5804,7 +5804,7 @@ "investigated_at": null, "investigated_by": null, "language": "javascript", - "last_reconciled_at": "2026-08-20T22:19:21Z", + "last_reconciled_at": "2026-08-20T22:54:13Z", "last_seen_count": 96, "last_seen_examples": [ { @@ -5918,7 +5918,7 @@ "investigated_at": null, "investigated_by": null, "language": "javascript", - "last_reconciled_at": "2026-08-20T22:19:21Z", + "last_reconciled_at": "2026-08-20T22:54:13Z", "last_seen_count": 7, "last_seen_examples": [ { @@ -6005,7 +6005,7 @@ "investigated_at": null, "investigated_by": null, "language": "javascript", - "last_reconciled_at": "2026-08-20T22:19:21Z", + "last_reconciled_at": "2026-08-20T22:54:13Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -6047,7 +6047,7 @@ "investigated_at": null, "investigated_by": null, "language": "javascript", - "last_reconciled_at": "2026-08-20T22:19:21Z", + "last_reconciled_at": "2026-08-20T22:54:13Z", "last_seen_count": 11, "last_seen_examples": [ { @@ -6161,7 +6161,7 @@ "investigated_at": null, "investigated_by": null, "language": "javascript", - "last_reconciled_at": "2026-08-20T22:19:21Z", + "last_reconciled_at": "2026-08-20T22:54:13Z", "last_seen_count": 150, "last_seen_examples": [ { @@ -6275,7 +6275,7 @@ "investigated_at": null, "investigated_by": null, "language": "javascript", - "last_reconciled_at": "2026-08-20T22:19:21Z", + "last_reconciled_at": "2026-08-20T22:54:13Z", "last_seen_count": 266, "last_seen_examples": [ { @@ -6389,7 +6389,7 @@ "investigated_at": null, "investigated_by": null, "language": "javascript", - "last_reconciled_at": "2026-08-20T22:19:21Z", + "last_reconciled_at": "2026-08-20T22:54:13Z", "last_seen_count": 182, "last_seen_examples": [ { @@ -6503,7 +6503,7 @@ "investigated_at": null, "investigated_by": null, "language": "javascript", - "last_reconciled_at": "2026-08-20T22:19:21Z", + "last_reconciled_at": "2026-08-20T22:54:13Z", "last_seen_count": 104, "last_seen_examples": [ { @@ -6617,7 +6617,7 @@ "investigated_at": null, "investigated_by": null, "language": "kotlin", - "last_reconciled_at": "2026-08-20T22:19:24Z", + "last_reconciled_at": "2026-08-20T22:54:16Z", "last_seen_count": 3, "last_seen_examples": [ { @@ -6668,7 +6668,7 @@ "investigated_at": null, "investigated_by": null, "language": "kotlin", - "last_reconciled_at": "2026-08-20T22:19:24Z", + "last_reconciled_at": "2026-08-20T22:54:16Z", "last_seen_count": 15, "last_seen_examples": [ { @@ -6782,7 +6782,7 @@ "investigated_at": null, "investigated_by": null, "language": "kotlin", - "last_reconciled_at": "2026-08-20T22:19:24Z", + "last_reconciled_at": "2026-08-20T22:54:16Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -6814,7 +6814,7 @@ "investigated_at": "2026-08-20", "investigated_by": "claude-sonnet-5 (direct source read, no dispatch needed)", "language": "m4", - "last_reconciled_at": "2026-08-20T22:19:30Z", + "last_reconciled_at": "2026-08-20T22:54:22Z", "last_seen_count": 4, "last_seen_examples": [ { @@ -6869,7 +6869,7 @@ "investigated_at": "2026-08-20", "investigated_by": "gemini-3.1-pro-high (agy), dispatched via tri-comparison-ledger-sweep, reviewed by claude-sonnet-5", "language": "m4", - "last_reconciled_at": "2026-08-20T22:19:30Z", + "last_reconciled_at": "2026-08-20T22:54:22Z", "last_seen_count": 79, "last_seen_examples": [ { @@ -6972,7 +6972,7 @@ "investigated_at": "2026-08-20", "investigated_by": "claude-sonnet-5 (direct source read, no dispatch needed)", "language": "m4", - "last_reconciled_at": "2026-08-20T22:19:30Z", + "last_reconciled_at": "2026-08-20T22:54:22Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -7004,7 +7004,7 @@ "investigated_at": null, "investigated_by": null, "language": "makefile", - "last_reconciled_at": "2026-08-20T22:19:31Z", + "last_reconciled_at": "2026-08-20T22:54:23Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -7035,7 +7035,7 @@ "investigated_at": null, "investigated_by": null, "language": "matlab", - "last_reconciled_at": "2026-08-20T22:19:33Z", + "last_reconciled_at": "2026-08-20T22:54:25Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -7068,7 +7068,7 @@ "investigated_at": null, "investigated_by": null, "language": "objective-c", - "last_reconciled_at": "2026-08-20T22:19:34Z", + "last_reconciled_at": "2026-08-20T22:54:26Z", "last_seen_count": 91, "last_seen_examples": [ { @@ -7182,7 +7182,7 @@ "investigated_at": null, "investigated_by": null, "language": "objective-c", - "last_reconciled_at": "2026-08-20T22:19:34Z", + "last_reconciled_at": "2026-08-20T22:54:26Z", "last_seen_count": 104, "last_seen_examples": [ { @@ -7296,7 +7296,7 @@ "investigated_at": null, "investigated_by": null, "language": "objective-c", - "last_reconciled_at": "2026-08-20T22:19:34Z", + "last_reconciled_at": "2026-08-20T22:54:26Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -7329,7 +7329,7 @@ "investigated_at": null, "investigated_by": null, "language": "objective-c", - "last_reconciled_at": "2026-08-20T22:19:34Z", + "last_reconciled_at": "2026-08-20T22:54:26Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -7371,7 +7371,7 @@ "investigated_at": null, "investigated_by": null, "language": "perl", - "last_reconciled_at": "2026-08-20T22:19:40Z", + "last_reconciled_at": "2026-08-20T22:54:33Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -7404,7 +7404,7 @@ "investigated_at": null, "investigated_by": null, "language": "perl", - "last_reconciled_at": "2026-08-20T22:19:40Z", + "last_reconciled_at": "2026-08-20T22:54:33Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -7435,7 +7435,7 @@ "investigated_at": null, "investigated_by": null, "language": "perl", - "last_reconciled_at": "2026-08-20T22:19:40Z", + "last_reconciled_at": "2026-08-20T22:54:33Z", "last_seen_count": 64, "last_seen_examples": [ { @@ -7549,7 +7549,7 @@ "investigated_at": null, "investigated_by": null, "language": "perl", - "last_reconciled_at": "2026-08-20T22:19:40Z", + "last_reconciled_at": "2026-08-20T22:54:33Z", "last_seen_count": 7, "last_seen_examples": [ { @@ -7636,7 +7636,7 @@ "investigated_at": null, "investigated_by": null, "language": "perl", - "last_reconciled_at": "2026-08-20T22:19:40Z", + "last_reconciled_at": "2026-08-20T22:54:33Z", "last_seen_count": 7, "last_seen_examples": [ { @@ -7723,7 +7723,7 @@ "investigated_at": null, "investigated_by": null, "language": "perl", - "last_reconciled_at": "2026-08-20T22:19:40Z", + "last_reconciled_at": "2026-08-20T22:54:33Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -7756,7 +7756,7 @@ "investigated_at": null, "investigated_by": null, "language": "perl", - "last_reconciled_at": "2026-08-20T22:19:40Z", + "last_reconciled_at": "2026-08-20T22:54:33Z", "last_seen_count": 122, "last_seen_examples": [ { @@ -7870,7 +7870,7 @@ "investigated_at": null, "investigated_by": null, "language": "php", - "last_reconciled_at": "2026-08-20T22:19:45Z", + "last_reconciled_at": "2026-08-20T22:54:37Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -7903,7 +7903,7 @@ "investigated_at": null, "investigated_by": null, "language": "php", - "last_reconciled_at": "2026-08-20T22:19:45Z", + "last_reconciled_at": "2026-08-20T22:54:37Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -7936,7 +7936,7 @@ "investigated_at": null, "investigated_by": null, "language": "php", - "last_reconciled_at": "2026-08-20T22:19:45Z", + "last_reconciled_at": "2026-08-20T22:54:37Z", "last_seen_count": 68, "last_seen_examples": [ { @@ -8050,7 +8050,7 @@ "investigated_at": null, "investigated_by": null, "language": "powershell", - "last_reconciled_at": "2026-08-20T22:19:47Z", + "last_reconciled_at": "2026-08-20T22:54:40Z", "last_seen_count": 7, "last_seen_examples": [ { @@ -8135,7 +8135,7 @@ "investigated_at": null, "investigated_by": null, "language": "powershell", - "last_reconciled_at": "2026-08-20T22:19:47Z", + "last_reconciled_at": "2026-08-20T22:54:40Z", "last_seen_count": 5, "last_seen_examples": [ { @@ -8204,7 +8204,7 @@ "investigated_at": null, "investigated_by": null, "language": "powershell", - "last_reconciled_at": "2026-08-20T22:19:47Z", + "last_reconciled_at": "2026-08-20T22:54:40Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -8237,7 +8237,7 @@ "investigated_at": null, "investigated_by": null, "language": "powershell", - "last_reconciled_at": "2026-08-20T22:19:47Z", + "last_reconciled_at": "2026-08-20T22:54:40Z", "last_seen_count": 16, "last_seen_examples": [ { @@ -8351,7 +8351,7 @@ "investigated_at": null, "investigated_by": null, "language": "python", - "last_reconciled_at": "2026-08-20T22:19:57Z", + "last_reconciled_at": "2026-08-20T22:54:49Z", "last_seen_count": 4, "last_seen_examples": [ { @@ -8411,7 +8411,7 @@ "investigated_at": null, "investigated_by": null, "language": "python", - "last_reconciled_at": "2026-08-20T22:19:57Z", + "last_reconciled_at": "2026-08-20T22:54:49Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -8444,7 +8444,7 @@ "investigated_at": null, "investigated_by": null, "language": "python", - "last_reconciled_at": "2026-08-20T22:19:57Z", + "last_reconciled_at": "2026-08-20T22:54:49Z", "last_seen_count": 32, "last_seen_examples": [ { @@ -8558,7 +8558,7 @@ "investigated_at": null, "investigated_by": null, "language": "python", - "last_reconciled_at": "2026-08-20T22:19:57Z", + "last_reconciled_at": "2026-08-20T22:54:49Z", "last_seen_count": 68, "last_seen_examples": [ { @@ -8672,7 +8672,7 @@ "investigated_at": null, "investigated_by": null, "language": "ruby", - "last_reconciled_at": "2026-08-20T22:19:58Z", + "last_reconciled_at": "2026-08-20T22:54:50Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -8714,7 +8714,7 @@ "investigated_at": null, "investigated_by": null, "language": "ruby", - "last_reconciled_at": "2026-08-20T22:19:58Z", + "last_reconciled_at": "2026-08-20T22:54:50Z", "last_seen_count": 6, "last_seen_examples": [ { @@ -8792,7 +8792,7 @@ "investigated_at": null, "investigated_by": null, "language": "ruby", - "last_reconciled_at": "2026-08-20T22:19:58Z", + "last_reconciled_at": "2026-08-20T22:54:50Z", "last_seen_count": 3, "last_seen_examples": [ { @@ -8843,7 +8843,7 @@ "investigated_at": null, "investigated_by": null, "language": "ruby", - "last_reconciled_at": "2026-08-20T22:19:58Z", + "last_reconciled_at": "2026-08-20T22:54:50Z", "last_seen_count": 6, "last_seen_examples": [ { @@ -8920,7 +8920,7 @@ "investigated_at": null, "investigated_by": null, "language": "rust", - "last_reconciled_at": "2026-08-20T22:20:02Z", + "last_reconciled_at": "2026-08-20T22:54:54Z", "last_seen_count": 14, "last_seen_examples": [ { @@ -9034,7 +9034,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (resolved directly via live ctags run, no dispatch)", "language": "rust", - "last_reconciled_at": "2026-08-20T22:20:02Z", + "last_reconciled_at": "2026-08-20T22:54:54Z", "last_seen_count": 3, "last_seen_examples": [ { @@ -9087,7 +9087,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Gemini (dispatched via tri-comparison-ledger-sweep), confirmed by Claude Sonnet 5", "language": "rust", - "last_reconciled_at": "2026-08-20T22:20:02Z", + "last_reconciled_at": "2026-08-20T22:54:54Z", "last_seen_count": 25, "last_seen_examples": [ { @@ -9201,7 +9201,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Gemini (dispatched via tri-comparison-ledger-sweep, 2 rounds with self-correction), confirmed by Claude Sonnet 5", "language": "rust", - "last_reconciled_at": "2026-08-20T22:20:02Z", + "last_reconciled_at": "2026-08-20T22:54:54Z", "last_seen_count": 21, "last_seen_examples": [ { @@ -9313,7 +9313,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Gemini (dispatched via tri-comparison-ledger-sweep), confirmed by Claude Sonnet 5", "language": "rust", - "last_reconciled_at": "2026-08-20T22:20:02Z", + "last_reconciled_at": "2026-08-20T22:54:54Z", "last_seen_count": 21, "last_seen_examples": [ { @@ -9426,7 +9426,7 @@ "investigated_at": null, "investigated_by": null, "language": "rust", - "last_reconciled_at": "2026-08-20T22:20:02Z", + "last_reconciled_at": "2026-08-20T22:54:54Z", "last_seen_count": 83, "last_seen_examples": [ { @@ -9539,7 +9539,7 @@ "investigated_at": null, "investigated_by": null, "language": "rust", - "last_reconciled_at": "2026-08-20T22:20:02Z", + "last_reconciled_at": "2026-08-20T22:54:54Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -9572,7 +9572,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (resolved directly via live ctags run, no dispatch)", "language": "rust", - "last_reconciled_at": "2026-08-20T22:20:02Z", + "last_reconciled_at": "2026-08-20T22:54:54Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -9607,7 +9607,7 @@ "investigated_at": "2026-08-19T00:00:00Z", "investigated_by": "Claude Sonnet 5 (resolved from existing Claim 6 documentation, no dispatch)", "language": "rust", - "last_reconciled_at": "2026-08-20T22:20:02Z", + "last_reconciled_at": "2026-08-20T22:54:54Z", "last_seen_count": 152, "last_seen_examples": [ { @@ -9719,7 +9719,7 @@ "investigated_at": null, "investigated_by": null, "language": "scala", - "last_reconciled_at": "2026-08-20T22:20:04Z", + "last_reconciled_at": "2026-08-20T22:54:56Z", "last_seen_count": 16, "last_seen_examples": [ { @@ -9822,7 +9822,7 @@ "investigated_at": "2026-08-20", "investigated_by": "gemini-3.1-pro-high (agy), dispatched via tri-comparison-ledger-sweep, reviewed and fixed by claude-sonnet-5", "language": "scheme", - "last_reconciled_at": "2026-08-20T22:20:09Z", + "last_reconciled_at": "2026-08-20T22:55:01Z", "last_seen_count": 84, "last_seen_examples": [ { @@ -9924,7 +9924,7 @@ "investigated_at": null, "investigated_by": null, "language": "scheme", - "last_reconciled_at": "2026-08-20T22:20:09Z", + "last_reconciled_at": "2026-08-20T22:55:01Z", "last_seen_count": 50, "last_seen_examples": [ { @@ -10028,7 +10028,7 @@ "investigated_at": null, "investigated_by": null, "language": "shell", - "last_reconciled_at": "2026-08-20T22:20:10Z", + "last_reconciled_at": "2026-08-20T22:55:02Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -10060,7 +10060,7 @@ "investigated_at": null, "investigated_by": null, "language": "solidity", - "last_reconciled_at": "2026-08-20T22:20:11Z", + "last_reconciled_at": "2026-08-20T22:55:04Z", "last_seen_count": 6, "last_seen_examples": [ { @@ -10130,7 +10130,7 @@ "investigated_at": null, "investigated_by": null, "language": "swift", - "last_reconciled_at": "2026-08-20T22:20:13Z", + "last_reconciled_at": "2026-08-20T22:55:05Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -10161,7 +10161,7 @@ "investigated_at": null, "investigated_by": null, "language": "swift", - "last_reconciled_at": "2026-08-20T22:20:13Z", + "last_reconciled_at": "2026-08-20T22:55:05Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -10192,7 +10192,7 @@ "investigated_at": null, "investigated_by": null, "language": "swift", - "last_reconciled_at": "2026-08-20T22:20:13Z", + "last_reconciled_at": "2026-08-20T22:55:05Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -10224,7 +10224,7 @@ "investigated_at": null, "investigated_by": null, "language": "tcl", - "last_reconciled_at": "2026-08-20T22:20:14Z", + "last_reconciled_at": "2026-08-20T22:55:07Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -10257,7 +10257,7 @@ "investigated_at": null, "investigated_by": null, "language": "tcl", - "last_reconciled_at": "2026-08-20T22:20:14Z", + "last_reconciled_at": "2026-08-20T22:55:07Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -10299,7 +10299,7 @@ "investigated_at": null, "investigated_by": null, "language": "tcl", - "last_reconciled_at": "2026-08-20T22:20:14Z", + "last_reconciled_at": "2026-08-20T22:55:07Z", "last_seen_count": 4, "last_seen_examples": [ { @@ -10359,7 +10359,7 @@ "investigated_at": null, "investigated_by": null, "language": "tcl", - "last_reconciled_at": "2026-08-20T22:20:14Z", + "last_reconciled_at": "2026-08-20T22:55:07Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -10391,7 +10391,7 @@ "investigated_at": null, "investigated_by": null, "language": "tcl", - "last_reconciled_at": "2026-08-20T22:20:14Z", + "last_reconciled_at": "2026-08-20T22:55:07Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -10433,7 +10433,7 @@ "investigated_at": null, "investigated_by": null, "language": "typescript", - "last_reconciled_at": "2026-08-20T22:20:35Z", + "last_reconciled_at": "2026-08-20T22:55:27Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -10475,7 +10475,7 @@ "investigated_at": null, "investigated_by": null, "language": "typescript", - "last_reconciled_at": "2026-08-20T22:20:35Z", + "last_reconciled_at": "2026-08-20T22:55:27Z", "last_seen_count": 501, "last_seen_examples": [ { @@ -10587,7 +10587,7 @@ "investigated_at": null, "investigated_by": null, "language": "typescript", - "last_reconciled_at": "2026-08-20T22:20:35Z", + "last_reconciled_at": "2026-08-20T22:55:27Z", "last_seen_count": 4, "last_seen_examples": [ { @@ -10646,7 +10646,7 @@ "investigated_at": null, "investigated_by": null, "language": "typescript", - "last_reconciled_at": "2026-08-20T22:20:35Z", + "last_reconciled_at": "2026-08-20T22:55:27Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -10679,7 +10679,7 @@ "investigated_at": null, "investigated_by": null, "language": "typescript", - "last_reconciled_at": "2026-08-20T22:20:35Z", + "last_reconciled_at": "2026-08-20T22:55:27Z", "last_seen_count": 9, "last_seen_examples": [ { @@ -10784,7 +10784,7 @@ "investigated_at": null, "investigated_by": null, "language": "typescript", - "last_reconciled_at": "2026-08-20T22:20:35Z", + "last_reconciled_at": "2026-08-20T22:55:27Z", "last_seen_count": 61, "last_seen_examples": [ { @@ -10898,7 +10898,7 @@ "investigated_at": null, "investigated_by": null, "language": "typescript", - "last_reconciled_at": "2026-08-20T22:20:35Z", + "last_reconciled_at": "2026-08-20T22:55:27Z", "last_seen_count": 1907, "last_seen_examples": [ { @@ -11012,7 +11012,7 @@ "investigated_at": null, "investigated_by": null, "language": "typescript", - "last_reconciled_at": "2026-08-20T22:20:35Z", + "last_reconciled_at": "2026-08-20T22:55:27Z", "last_seen_count": 2, "last_seen_examples": [ { @@ -11054,7 +11054,7 @@ "investigated_at": null, "investigated_by": null, "language": "typescript", - "last_reconciled_at": "2026-08-20T22:20:35Z", + "last_reconciled_at": "2026-08-20T22:55:27Z", "last_seen_count": 174, "last_seen_examples": [ { @@ -11167,7 +11167,7 @@ "investigated_at": null, "investigated_by": null, "language": "zig", - "last_reconciled_at": "2026-08-20T22:20:44Z", + "last_reconciled_at": "2026-08-20T22:55:36Z", "last_seen_count": 1, "last_seen_examples": [ { @@ -11198,7 +11198,7 @@ "investigated_at": null, "investigated_by": null, "language": "zig", - "last_reconciled_at": "2026-08-20T22:20:44Z", + "last_reconciled_at": "2026-08-20T22:55:36Z", "last_seen_count": 10, "last_seen_examples": [ { @@ -11301,7 +11301,7 @@ "investigated_at": null, "investigated_by": null, "language": "zig", - "last_reconciled_at": "2026-08-20T22:20:44Z", + "last_reconciled_at": "2026-08-20T22:55:36Z", "last_seen_count": 1, "last_seen_examples": [ { diff --git a/docs/self_scan/tri_comparison_points_of_interest.md b/docs/self_scan/tri_comparison_points_of_interest.md index 9bac3681..c15bd454 100644 --- a/docs/self_scan/tri_comparison_points_of_interest.md +++ b/docs/self_scan/tri_comparison_points_of_interest.md @@ -8,7 +8,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `agc_assembly` function existence: ctags agree, GitGalaxy differ -*2-vs-1 -- 215 occurrences as of 2026-08-20T22:18:34Z* +*2-vs-1 -- 215 occurrences as of 2026-08-20T22:53:27Z* **Verdict** (by Claude (Sonnet 5), direct investigation via tri-comparison-ledger-sweep, 2026-08-20T00:00:00Z): > Mixed-cause shape, fully accounted for via a corpus-wide cross-reference of ctags' actual output against GitGalaxy's raw func_start regex matches and its real pipeline/DB output (215 + 50 = 265, no unexplained residual). (1) 215/265 (81%): ctags' Asm "l" kind tags EVERY line-start label unconditionally, including pure data/constant-definition labels (e.g. ERASCON1 OCTAL 00061, S10BITS, LSTBNKCH -- AGC_BLOCK_TWO_SELF-CHECK.agc:133 and nearby) that are never followed by an executable instruction. GitGalaxy's func_start regex deliberately requires the label be followed by a real instruction mnemonic from a fixed whitelist, so it does not count these as functions -- a genuine, intentional precision distinction (code label vs. data label), not a GitGalaxy defect; ctags' generic Asm parser has no way to make this distinction at all. (2) 50/265 (19%): a real, confirmed GitGalaxy engine defect in detector.py's _slice_by_labels (Mode A), independently root-caused to two separate bugs: (a) `RELINT` is incorrectly included in `self.assembly_returns`'s early-termination keyword list (detector.py:572-575) -- in real AGC assembly RELINT means "release interrupt inhibit" and commonly opens a long interrupt-handler routine rather than closing one, so it truncates the real body to one line (confirmed: ELOOPFIN, AGC_BLOCK_TWO_SELF-CHECK.agc:303, a 20+-line real routine collapsed to just its own label line); (b) the `len(block.splitlines()) < 2` guard (detector.py:1973) unconditionally discards legitimate single-instruction assembly subroutines when the next func_start match sits on the very next line (confirmed: SOPTION1-SOPTION5+, AGC_BLOCK_TWO_SELF-CHECK.agc:210-214, each a real one-instruction label). Filed as #1949 -- a follow-up read-only Gemini/agy dispatch confirmed both root causes generalize beyond agc_assembly to the shared Mode A mechanism (assembly, cobol, fortran, abap all independently exhibit bug 1; assembly and cobol also exhibit bug 2), plus two further bug-1 variants not visible from agc_assembly alone: the terminator regex also false-matches inside comments (assembly) and inside hyphenated identifier names (cobol), not just legitimate-but-misclassified instructions. See #1949 for the full cross-language evidence and fix scope. No credit/debit -- the 215 portion is an honest scope difference (not two tools independently wrong about the same fact), and the 50 portion is GitGalaxy's own unresolved bug, not something ctags corroborates or contradicts. @@ -28,7 +28,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `agc_assembly` function existence: GitGalaxy agree, ctags differ -*2-vs-1 -- 37 occurrences as of 2026-08-20T22:18:34Z* +*2-vs-1 -- 37 occurrences as of 2026-08-20T22:53:27Z* **Verdict** (by Claude (Sonnet 5), direct investigation via tri-comparison-ledger-sweep, 2026-08-20T00:00:00Z): > Confirmed: all 35 occurrences are real AGC labels that GitGalaxy correctly extracts and Universal Ctags' generic Asm parser structurally cannot tag, due to AGC assembly's non-standard label-naming conventions. Two sub-patterns, both confirmed corpus-wide (14/35 + 21/35 = 35/35, not just the sample): (1) labels with an embedded hyphen -- AGC's own convention of naming a point relative to an event, e.g. TIG-35/TIG-30/CALLT-35 in BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc:250/292/222 ("35/30 seconds before Time of Ignition"); (2) labels starting with a digit or a leading minus sign, e.g. 1CHK/2EBANK/-1CHK in AGC_BLOCK_TWO_SELF-CHECK.agc:184 (real label text is "-1CHK"). Directly verified via `ctags --language-force=Asm --kinds-Asm=l` against the real corpus files: ctags emits zero tags for any of these names (confirmed by grepping its actual output for the exact names and their surrounding CHK-suffixed siblings, which ARE tagged when they don't start with a hyphen/digit) -- ctags' Asm parser requires a tag name to start with a letter and contain no hyphen, neither of which is a real constraint in AGC assembly's own label syntax. GitGalaxy's func_start regex ([A-Z0-9_-]+ at line start) has no such restriction. This is a confirmed, structural ctags/Asm-parser limitation, not corroboration of anything wrong on GitGalaxy's side -- logged to docs/why_gitgalaxy_beats_ast_here.md. @@ -46,25 +46,11 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest | apollo-11/BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc | `TIG-30` | 292 | *(n/a)* | *(n/a)* | | apollo-11/BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc | `TIG-5` | 354 | *(n/a)* | *(n/a)* | -## apex - -### ✅ `apex` function existence: GitGalaxy agree, tree-sitter differ - -*2-vs-1 -- 2 occurrences as of 2026-08-20T22:21:09Z* - -**Verdict** (by Claude Sonnet 5, dispatched via tri-comparison-ledger-sweep (direct investigation, no Gemini dispatch needed -- root cause was immediately clear from source), 2026-08-20T22:17:39Z): -> Confirmed GitGalaxy engine defect, not a tree-sitter gap. Both sampled occurrences (apex-recipes/AuraEnabledRecipes_Tests.cls:25 and :43) are `new Account(name = ...)` object-instantiation expressions inside a multi-line SObject-builder call, not real method/constructor definitions -- confirmed by reading the source directly. Root cause: the func_start regex (language_standards.py, apex rules) treats any `[a-zA-Z_][\w.]*[ \t\n]+` token at start-of-line as an eligible optional return-type/modifier prefix before the captured function name, with no exclusion for the `new` keyword -- so `new Account(` parses as "returnType=new, name=Account", passing the #1221 gating fix (which only requires the line START with one of annotation/modifier/return-type-shaped token, not that the token be a real type). tree_sitter correctly does not report these as functions since its grammar distinguishes object_creation_expression from method_declaration structurally. Verified this generalizes beyond the 2-occurrence ledger sample: running the regex directly against the whole apex corpus found 6 total false-positive matches across 2 files (AuraEnabledRecipes_Tests.cls:6,25,43 and SOQLRecipes_Tests.cls:226,235,504), all the identical `new ClassName(` shape. Filed as GitHub issue #1963 (exclude `new` from the eligible return-type/modifier prefix token). No credit_tools/debit_tools adjustment needed: since only gitgalaxy is in agreeing_tools here (len(present)==1), the reconciler already excludes this from gitgalaxy matched_consensus by default while still counting it in total_slots -- the default precision score already reflects this correctly as an unconfirmed/wrong claim. - -| file | name | GitGalaxy | tree-sitter | ctags | -|---|---|---|---|---| -| apex-recipes/AuraEnabledRecipes_Tests.cls | `Account` | 25 | *(n/a)* | *(n/a)* | -| apex-recipes/AuraEnabledRecipes_Tests.cls | `Account` | 43 | *(n/a)* | *(n/a)* | - ## assembly ### ✅ `assembly` function existence: ctags agree, GitGalaxy differ -*2-vs-1 -- 26 occurrences as of 2026-08-20T22:18:37Z* +*2-vs-1 -- 26 occurrences as of 2026-08-20T22:53:30Z* **Verdict** (by Claude (Sonnet 5), direct investigation via tri-comparison-ledger-sweep, 2026-08-20T00:00:00Z): > Mixed shape, no clean credit/debit call. (1) A real, confirmed GitGalaxy defect: the same detector.py `_slice_by_labels` bug filed for agc_assembly as #1949 (RELINT-style early truncation and single-line/blank-collapsed body discard) independently confirmed live for generic assembly too -- `del_command:` (bootos/os.asm:269) sits immediately before the next label `os22:` with nothing between, collapsing to a one-line block and getting discarded; `C:`/`prtstr:` (hellosilicon/matrixmultneon.s:90,92) are each followed only by a data directive (`.fill`, `.asciz`) then a blank line before the next label, same one-line-after-strip() collapse. All three are real regex matches (confirmed via direct func_start.finditer against the raw text) that never reach the final function list -- tracked under #1949, not a new issue. (2) A correct-by-design GitGalaxy exclusion: `.Lenv0:`/`.Largv0:` (cosmopolitan/ape.S:1784-1785) start with the `.L` prefix func_start's own negative lookahead deliberately excludes (GCC's own convention for compiler-generated local/temporary labels) -- both are genuinely data labels (`.asciz` string constants) here, not real subroutines; ctags' generic Asm parser has no such convention-awareness and tags them anyway. (3) ctags itself over-tags some non-callable constructs GitGalaxy correctly excludes -- C-preprocessor `#define` macro constants (`GRUB_MAGIC`/`GRUB_EAX`/`GRUB_AOUT`/`GRUB_CHECKSUM`/`USE_SYMBOL_HACK`, cosmopolitan/ape.S:49,1679-1682) are not real assembly labels at all (no trailing `:`), but ctags' Asm parser tags them regardless. No credit/debit -- the shape mixes a real unresolved GitGalaxy recall gap (#1949) with cases where ctags is the one over-tagging, not a clean corroboration story either direction. @@ -84,7 +70,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `assembly` function existence: GitGalaxy agree, ctags differ -*2-vs-1 -- 7 occurrences as of 2026-08-20T22:18:37Z* +*2-vs-1 -- 7 occurrences as of 2026-08-20T22:53:30Z* **Verdict** (by Claude (Sonnet 5), direct investigation via tri-comparison-ledger-sweep, 2026-08-20T00:00:00Z): > Mixed shape, three distinct confirmed mechanisms, no clean credit/debit call (real wins and real gaps in both directions within the same shape). (1) A dot-prefix naming-convention split -- NASM/GAS local labels scoped to the preceding global label are written with a leading `.` (e.g. `.load_vec:`, `.loop:` in bootos/os.asm:197,306), which GitGalaxy's func_start regex captures verbatim but ctags' Asm parser strips before emitting the tag (confirmed: ctags reports the SAME real label as `load_vec`/`loop`, no dot -- both tools genuinely found the same real construct, they just serialize the name differently). This is a name-string artifact of exact-string ledger grouping, not a detection difference on either side. (2) A genuine ctags gap: purely numeric local labels (`.1:`, `.2:` in bootos/counter.asm:52,67) are not tagged by ctags' Asm parser under ANY name (confirmed: neither `1`/`2` nor `.1`/`.2` appear in its output at all) -- GitGalaxy correctly finds these. (3) A genuine GitGalaxy precision gap, the mirror image of agc_assembly's own win: unlike agc_assembly's func_start (which requires a label be followed by a real instruction opcode), generic assembly's func_start has no such requirement -- ANY `identifier:` at line start matches, so it also matches pure data/constant declaration labels ctags' comparatively more conservative reading skips: `max_entries: equ sector_size/entry_size` (bootos/os.asm:166, a compile-time constant, not a subroutine), and several string/metadata labels in cosmopolitan/ape.S followed only by `.asciz`/data directives (`ape.ident`, `freebsd.ident`, `netbsd.ident`, `openbsd.ident`, `str.error`, `str.crlf`, `str.e820`, `str.oldcpu`). Not filed as a bug -- generic assembly's func_start is intentionally permissive because it has to span wildly different, informally-specified dialects (x86/ARM/legacy real-mode) where a fixed per-opcode whitelist like agc_assembly's isn't practical; worth a future harden-language-extraction look at whether a narrower heuristic (e.g. excluding labels followed only by known data-directive pseudo-ops like .asciz/.long/.byte/equ) could recover some of this precision without losing real dialect coverage, but that's a design tradeoff, not a clear regression to fix urgently. @@ -103,7 +89,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `c` function existence: tree-sitter agree, GitGalaxy, ctags differ -*2-vs-1 -- 74 occurrences as of 2026-08-20T22:18:42Z* +*2-vs-1 -- 74 occurrences as of 2026-08-20T22:53:35Z* **Verdict** (by Gemini (dispatched via tri-comparison-ledger-sweep), confirmed by Claude Sonnet 5, 2026-08-19T00:00:00Z): > Confirmed, independently verified all 6 sampled names against real source -- GitGalaxy and ctags both correct, tree-sitter over-recalling from two related but distinct preprocessor-driven mechanisms, both already covered by existing infrastructure: (1) keyword/macro misparse -- 'if' (dictobject.c:522-527, an `#if SIZEOF_VOID_P > 4` / `else if` sequence desyncs the parse) and 'DICT___REVERSED___METHODDEF' (dictobject.c:5102, a PyMethodDef array-initializer macro, not a definition) are both ALREADY in tree_sitter_accuracy_audit.py's `_C_KNOWN_MACRO_HALLUCINATIONS` exclusion set (confirmed by reading it directly) -- this tri-comparison tool's raw walk deliberately doesn't apply that list (it's a curated, ground-truth-shaped judgment call, appropriately left to reconciliation per this module's own stated design, not baked into the walk). (2) dead #if 0 code -- '_PyObject_ManagedDictValidityCheck' (dictobject.c:7396) and 'tos_char'/'print_stack'/'print_stacks' (frameobject.c:1264-1313) are genuinely well-formed function definitions sitting entirely inside `#if 0 ... #endif` guards; tree-sitter has no preprocessor model and parses the dead branch as live code. Both mechanisms are already the exact shape docs/why_gitgalaxy_beats_ast_here.md's Claim 8 names generically ('a dead #if 0 block... macro definitions... that merely look structural') -- added these 4 new concrete citations to Claim 8's evidence section rather than treating this as a new finding. No GitHub issue -- both tools already behave as intended; this is expected, already-documented tree-sitter preprocessor-blindness surfacing under the new tri-comparison reconciliation, not a fresh defect. @@ -123,7 +109,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `c` function existence: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 13 occurrences as of 2026-08-20T22:18:42Z* +*2-vs-1 -- 13 occurrences as of 2026-08-20T22:53:35Z* **Verdict** (by Gemini (dispatched via tri-comparison-ledger-sweep), confirmed by Claude Sonnet 5, 2026-08-19T00:00:00Z): > 3 distinct causes, all genuine tree-sitter-c grammar limitations (GitGalaxy and ctags both correct in all 10 sampled cases) -- confirmed via dispatched investigation (which ran tree-sitter's C grammar directly and found ERROR nodes in every case) plus independent source-level spot-checks of all 3 trigger shapes. This is a C-scale instance of Claim 7 (CPP-directive-driven recall loss) -- added to that claim's evidence section. (1) 4 samples: an #if/#else pair splitting a single `if` condition inside a function body (ceval.c:33, _Py_ReachedRecursionLimitWithMargin). (2) 5 samples: bare, un-semicoloned macro invocations the grammar can't cleanly recover from, losing the next real function (object.c:1269-1271's _Py_COMP_DIAG_PUSH/IGNORE_DEPR_DECLS/POP before _PyObject_SetAttributeErrorContext; similar shape for the typeobject.c slot-getattr cluster). (3) 1 sample: #if/#endif wrapping only the `static` storage-class specifier, separated from the rest of the signature (micropython/compile.c:3473-3476, mp_compile_to_raw_code). Unlike Fortran's existing Claim 7 evidence (entire trailing sections lost), C's version is local -- one function lost per trigger, not a cascading region. No GitHub issue -- documented as new Claim 7 evidence, not a fixable tooling bug (this repo doesn't control tree-sitter-c's grammar). @@ -143,7 +129,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `c` function existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 7 occurrences as of 2026-08-20T22:18:42Z* +*2-vs-1 -- 7 occurrences as of 2026-08-20T22:53:35Z* **Verdict** (by Claude Sonnet 5 (resolved + fixed directly, no dispatch needed), 2026-08-19T00:00:00Z): > Confirmed real ctags limitation, not a GitGalaxy or tree-sitter defect -- resolved directly (no dispatch needed), source read confirms all 7 sampled names. RICHCMP_WRAPPER/SLOT0/SLOT1/SLOT1BINFULL are all-caps macro names; every occurrence is a MACRO INVOCATION (a call to a previously-#define'd boilerplate-generating macro), not a function definition -- confirmed at cpython/typeobject.c:10099 (`RICHCMP_WRAPPER(lt, Py_LT)`) and :10544 (`SLOT1(slot_mp_subscript, __getitem__, PyObject *)`), same shape as the multiple SLOT0/SLOT1 hits at different lines (each is a separate invocation of the same macro generating a different wrapper function). ctags' regex-based C parser tags the macro-invocation site itself as a function; GitGalaxy and tree-sitter both correctly don't. Deliberately NOT fixed with a curated name-exclusion list in the gatherer (unlike the sibling __anon* class shape, this would require hand-curating specific macro names -- the same ground-truth-judgment category tri_comparison_gatherer.py's own docstring reasons belongs in reconciliation, not the raw reader) -- documented in ctags_reader.py instead, alongside its existing per-language notes. @@ -160,7 +146,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `c` function existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 4 occurrences as of 2026-08-20T22:18:42Z* +*2-vs-1 -- 4 occurrences as of 2026-08-20T22:53:35Z* **Verdict** (by Claude Sonnet 5 (resolved directly, no dispatch needed), 2026-08-19T00:00:00Z): > Confirmed GitGalaxy correct, real finding -- a new, narrower instance of Claim 3 (parse-error cascade), added to docs/why_gitgalaxy_beats_ast_here.md. All 4 sampled names (slot_mp_ass_subscript:10544, slot_nb_inplace_power:10697, slot_tp_repr:10714, slot_tp_hash:10730, all cpython/typeobject.c) are ordinary, unremarkable function definitions -- nothing unusual individually -- but each sits directly after a bare SLOT0/SLOT1 macro-invocation LINE (`SLOT1(slot_mp_subscript, __getitem__, PyObject *)`, `SLOT0(slot_tp_str, __str__)`, etc.) that isn't valid freestanding C without macro expansion. GitGalaxy's regex has no adjacency sensitivity and finds all 4 correctly; both ctags and tree-sitter locally lose the SINGLE function immediately following each such line (recovers after just one function, not a full cascade to EOF -- confirmed by resolving all 4 as isolated single-function misses, not a growing region). Resolved directly, no dispatch needed -- same pattern verified at all 4 sample points before writing up. @@ -174,7 +160,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `c` function existence: tree-sitter, ctags agree, GitGalaxy differ -*2-vs-1 -- 3 occurrences as of 2026-08-20T22:18:42Z* +*2-vs-1 -- 3 occurrences as of 2026-08-20T22:53:35Z* **Verdict** (by Claude Sonnet 5 (resolved directly, no dispatch needed), 2026-08-19T00:00:00Z): > Not a new finding -- both sampled names are ALREADY in tree_sitter_accuracy_audit.py's _C_KNOWN_MACRO_HALLUCINATIONS exclusion set (confirmed by grep: 'EXPORT_FUN' and 'MICROPY_WRAP_MP_EXECUTE_BYTECODE' both present). This shape is the same already-documented macro-hallucination mechanism (Claim 8) as the earlier tree-sitter-alone shape, just with ctags ALSO independently hallucinating the same 2 names the same way (both tools' regex/grammar parsers get fooled by the same macro-definition text). GitGalaxy correctly excludes both. Resolved directly, no dispatch needed. @@ -187,7 +173,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `c` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 3 occurrences as of 2026-08-20T22:18:42Z* +*2-vs-1 -- 3 occurrences as of 2026-08-20T22:53:35Z* **Verdict** (by Gemini (dispatched via tri-comparison-ledger-sweep), confirmed by Claude Sonnet 5, 2026-08-19T00:00:00Z): > Two distinct causes, both confirmed by independent verification, not one -- resolved via dispatched investigation plus direct fixes. (1) 5 of 8 (I_AllocLow, I_ZoneBase, I_BaseTiccmd, R_CheckBBox, R_AddLine, all doom): a real bug in THIS tool's OWN ctags_reader.py, not a ctags limitation. Old Doom source uses literal TAB characters for column alignment (e.g. `byte*\tI_AllocLow(int length)`); ctags faithfully echoes that tab into its tag-file's address/pattern field, and read_ctags_symbols' naive line.split('\t') then misreads a fragment of the SOURCE LINE as the kind field, fails the kind-membership check, and silently drops the symbol. Confirmed by running ctags with the exact flags this code uses and inspecting the raw tab-delimited output directly -- reproduced the exact column-shift byte for byte. Fixed: parse now finds the tag-file format's guaranteed `;"` address-terminator marker instead of blind-splitting the whole line, only tab-splitting the safe trailer after it. Verified: all 5 names now correctly found. (2) 3 of 8 (slot_nb_power, slot_nb_bool, wrap_next, all cpython typeobject.c): extension of the already-documented SLOT-macro ctags limitation -- each follows a SLOT1BINFULL/SLOT0/RICHCMP_WRAPPER macro invocation ctags misreads as a function (confirmed at typeobject.c:10574/10577/10630), which also swallows the real function immediately after it. Not code-fixed (same ground-truth-judgment reasoning as the sibling 7-occurrence shape) -- already covered by ctags_reader.py's existing note on this mechanism. @@ -200,7 +186,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `c` function args: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:18:42Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:53:35Z* **Verdict** (by Claude Sonnet 5 (resolved + fixed directly, no dispatch needed), 2026-08-19T00:00:00Z): > Not a GitGalaxy or ctags defect -- a bug in this tool's OWN _count_ctags_signature_params (tri_comparison_gatherer.py), now fixed. Confirmed directly: ran ctags against cpython/ceval.c, PyEval_GetLocals(void)'s raw signature field is literally the text '(void)'. GitGalaxy and tree-sitter both already special-case C's explicit empty-parameter-list idiom (0 real args, matching detector.py's own _count_top_level_args docstring) -- _count_ctags_signature_params did not, splitting '(void)' into one non-empty segment and counting it as 1 real parameter (the same class of bug its own docstring already describes fixing twice for Python's trailing-comma and bare * / marker cases). Added 'void' to the segment-exclusion set alongside the existing '*'/'/'/'**' -- verified fix: _count_ctags_signature_params('(void)') now returns 0. This corpus (cpython) uses the (void) idiom extremely heavily, plausibly explaining most/all of the 104 occurrences; not independently re-verified beyond the sample, but the mechanism is unconditional (any '(void)' signature was miscounted the same way, corpus-wide) so high confidence it generalizes. No GitHub issue needed -- fixed directly in this same commit, not a repo-code defect. @@ -213,7 +199,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `cobol` function existence: ctags agree, GitGalaxy differ -*2-vs-1 -- 136 occurrences as of 2026-08-20T22:18:48Z* +*2-vs-1 -- 136 occurrences as of 2026-08-20T22:53:40Z* **Verdict** (by gemini-3.1-pro-high (agy), dispatched via tri-comparison-ledger-sweep, reviewed by claude-sonnet-5, 2026-08-19): > Mixed-cause shape, majority ctags-side false positives plus a smaller hidden GitGalaxy defect. (1) Majority (all 10 capped examples, all named END-IF): Universal Ctags' COBOL parser tags ANY period-terminated word as a 'paragraph' (kind p), including scope terminators like END-IF./END-PERFORM. that are not paragraph definitions -- confirmed by a live ctags run on cics-banking-sample-application-cbsa/BANKDATA.cbl showing dozens of plain 'END-IF.' lines (e.g. lines 455, 600) tagged as paragraphs. GitGalaxy correctly excludes these via its END-[A-Za-z0-9_-]+ reserved-word shield. This is a permanent, structural ctags limitation (documented in tests/tools/ctags_reader.py), not a GitGalaxy defect. (2) A smaller (~20 of 133), genuine GitGalaxy false-negative hiding underneath: cics-genapp/lgdpol01.cbl:139 'DELETE-POLICY-DB2-INFO.' and lgapol01.cbl:137 'WRITE-ERROR-MESSAGE.' are real, called (PERFORM'd) paragraph definitions that GitGalaxy's own func_start regex wrongly excludes -- its reserved-word negative lookahead ends in a bare \b, and since '-' is a non-word character in Python re, any real paragraph name that happens to start with a banned keyword followed by a hyphen (a common COBOL verb-prefixed naming convention: WRITE-*, READ-*, SET-*, DELETE-*, ...) is wrongly rejected. Verified directly against the compiled regex (both return no match) and confirmed ~20 such real paragraphs exist corpus-wide via grep. Filed as GitHub issue #1892. Investigated via gemini-3.1-pro-high (agy), file:line citations and regex behavior independently re-verified by Claude before applying. @@ -233,7 +219,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `cobol` function existence: GitGalaxy agree, ctags differ -*2-vs-1 -- 43 occurrences as of 2026-08-20T22:18:48Z* +*2-vs-1 -- 43 occurrences as of 2026-08-20T22:53:40Z* **Verdict** (by gemini-3.1-pro-high (agy), dispatched via tri-comparison-ledger-sweep, reviewed by claude-sonnet-5, 2026-08-19): > Mixed-cause shape, two independent confirmed defects, neither in GitGalaxy's core function detection being right or wrong as a whole. (1) MAINLINE/TIMESTAMP and most of the 18 cases: these are real COBOL SECTION headers in the PROCEDURE DIVISION (e.g. cics-genapp/lgacdb01.cbl:128 "MAINLINE SECTION.", cics-banking-sample-application-cbsa/BANKDATA.cbl:1441 "TIMESTAMP SECTION." followed by executable CALL statements) that GitGalaxy correctly captures per its own documented func_start scope ("Paragraphs and Sections") -- and ctags ALSO correctly tags them, as kind 'section' (verified via live ), not as the 'paragraph' kind. The disagreement is manufactured by tests/tools/ctags_reader.py's CTAGS_FUNC_KINDS["cobol"] = {"p"}, which drops section-kind tags before comparison -- a test-harness bug, not a real ctags-vs-GitGalaxy disagreement. Filed as GitHub issue #1891. (2) LOCAL-STORAGE (cics-banking-sample-application-cbsa/XFRFUN.cbl:107 "LOCAL-STORAGE SECTION." immediately followed by 01-level data item declarations, no executable logic): this is a genuine GitGalaxy false positive -- the func_start regex's reserved-word negative lookahead bans WORKING-STORAGE and LINKAGE as Data Division section names but omits LOCAL-STORAGE, so it slips through and gets miscounted as a paragraph. ctags correctly reports nothing here. Filed as GitHub issue #1890. Investigated via gemini-3.1-pro-high (agy), file:line citations independently re-verified by Claude against language_standards.py and a live ctags run before applying. @@ -255,7 +241,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `cpp` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 1097 occurrences as of 2026-08-20T22:18:52Z* +*2-vs-1 -- 1097 occurrences as of 2026-08-20T22:53:45Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`cpp/function/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -274,7 +260,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `cpp` function existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 1074 occurrences as of 2026-08-20T22:18:52Z* +*2-vs-1 -- 1074 occurrences as of 2026-08-20T22:53:45Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`cpp/function/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -293,7 +279,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `cpp` function existence: tree-sitter agree, GitGalaxy, ctags differ -*2-vs-1 -- 98 occurrences as of 2026-08-20T22:18:52Z* +*2-vs-1 -- 98 occurrences as of 2026-08-20T22:53:45Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`cpp/function/existence/agree[tree_sitter]_vs[ctags,gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -312,7 +298,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `cpp` class existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 95 occurrences as of 2026-08-20T22:18:52Z* +*2-vs-1 -- 95 occurrences as of 2026-08-20T22:53:45Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`cpp/class/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -331,7 +317,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `cpp` function existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 62 occurrences as of 2026-08-20T22:18:52Z* +*2-vs-1 -- 62 occurrences as of 2026-08-20T22:53:45Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`cpp/function/existence/agree[gitgalaxy]_vs[ctags,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -350,7 +336,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `cpp` class existence: tree-sitter agree, GitGalaxy, ctags differ -*2-vs-1 -- 22 occurrences as of 2026-08-20T22:18:52Z* +*2-vs-1 -- 22 occurrences as of 2026-08-20T22:53:45Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`cpp/class/existence/agree[tree_sitter]_vs[ctags,gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -369,7 +355,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `cpp` function args: tree-sitter, ctags agree, GitGalaxy differ -*2-vs-1 -- 15 occurrences as of 2026-08-20T22:18:52Z* +*2-vs-1 -- 15 occurrences as of 2026-08-20T22:53:45Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`cpp/function/args/agree[ctags,tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -388,7 +374,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `cpp` function args: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 13 occurrences as of 2026-08-20T22:18:52Z* +*2-vs-1 -- 13 occurrences as of 2026-08-20T22:53:45Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`cpp/function/args/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -407,7 +393,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `cpp` function existence: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 8 occurrences as of 2026-08-20T22:18:52Z* +*2-vs-1 -- 8 occurrences as of 2026-08-20T22:53:45Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`cpp/function/existence/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -424,7 +410,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `cpp` class existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 2 occurrences as of 2026-08-20T22:18:52Z* +*2-vs-1 -- 2 occurrences as of 2026-08-20T22:53:45Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`cpp/class/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -435,7 +421,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `cpp` function existence: tree-sitter, ctags agree, GitGalaxy differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:18:52Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:53:45Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`cpp/function/existence/agree[ctags,tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -445,7 +431,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `cpp` function args: none agree, GitGalaxy, tree-sitter, ctags differ -*3-way split -- 1 occurrence as of 2026-08-20T22:18:52Z* +*3-way split -- 1 occurrence as of 2026-08-20T22:53:45Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`cpp/function/args/agree[none]_vs[ctags,gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -457,7 +443,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` function existence: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 271 occurrences as of 2026-08-20T22:18:59Z* +*2-vs-1 -- 271 occurrences as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/function/existence/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -476,7 +462,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 107 occurrences as of 2026-08-20T22:18:59Z* +*2-vs-1 -- 107 occurrences as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/function/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -495,7 +481,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` function existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 48 occurrences as of 2026-08-20T22:18:59Z* +*2-vs-1 -- 48 occurrences as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/function/existence/agree[gitgalaxy]_vs[ctags,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -514,7 +500,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` function args: tree-sitter, ctags agree, GitGalaxy differ -*2-vs-1 -- 7 occurrences as of 2026-08-20T22:18:59Z* +*2-vs-1 -- 7 occurrences as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/function/args/agree[ctags,tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -530,7 +516,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` class existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 6 occurrences as of 2026-08-20T22:18:59Z* +*2-vs-1 -- 6 occurrences as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/class/existence/agree[gitgalaxy]_vs[ctags,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -545,7 +531,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` class existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 5 occurrences as of 2026-08-20T22:18:59Z* +*2-vs-1 -- 5 occurrences as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/class/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -559,7 +545,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` function args: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 4 occurrences as of 2026-08-20T22:18:59Z* +*2-vs-1 -- 4 occurrences as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/function/args/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -572,7 +558,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` function existence: tree-sitter, ctags agree, GitGalaxy differ -*2-vs-1 -- 4 occurrences as of 2026-08-20T22:18:59Z* +*2-vs-1 -- 4 occurrences as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/function/existence/agree[ctags,tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -585,7 +571,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` class existence: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 3 occurrences as of 2026-08-20T22:18:59Z* +*2-vs-1 -- 3 occurrences as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/class/existence/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -597,7 +583,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` function args: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:18:59Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/function/args/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -607,7 +593,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` function existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:18:59Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/function/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -617,7 +603,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` function existence: tree-sitter agree, GitGalaxy, ctags differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:18:59Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/function/existence/agree[tree_sitter]_vs[ctags,gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -627,7 +613,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `csharp` function args: none agree, GitGalaxy, tree-sitter, ctags differ -*3-way split -- 1 occurrence as of 2026-08-20T22:18:59Z* +*3-way split -- 1 occurrence as of 2026-08-20T22:53:51Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`csharp/function/args/agree[none]_vs[ctags,gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -639,7 +625,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `css` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 3 occurrences as of 2026-08-20T22:19:00Z* +*2-vs-1 -- 3 occurrences as of 2026-08-20T22:53:52Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`css/function/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -653,7 +639,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `dart` function existence: GitGalaxy agree, tree-sitter differ -*2-vs-1 -- 37 occurrences as of 2026-08-20T22:19:04Z* +*2-vs-1 -- 37 occurrences as of 2026-08-20T22:53:56Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`dart/function/existence/agree[gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -672,7 +658,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `dart` function existence: tree-sitter agree, GitGalaxy differ -*2-vs-1 -- 18 occurrences as of 2026-08-20T22:19:04Z* +*2-vs-1 -- 18 occurrences as of 2026-08-20T22:53:56Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`dart/function/existence/agree[tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -691,7 +677,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `dart` function args: none agree, GitGalaxy, tree-sitter differ -*3-way split -- 216 occurrences as of 2026-08-20T22:19:04Z* +*3-way split -- 216 occurrences as of 2026-08-20T22:53:56Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`dart/function/args/agree[none]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -712,7 +698,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `fortran` function existence: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 14 occurrences as of 2026-08-20T22:19:10Z* +*2-vs-1 -- 14 occurrences as of 2026-08-20T22:54:02Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`fortran/function/existence/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -731,7 +717,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `fortran` class existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 8 occurrences as of 2026-08-20T22:19:10Z* +*2-vs-1 -- 8 occurrences as of 2026-08-20T22:54:02Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`fortran/class/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -748,7 +734,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `fortran` function existence: tree-sitter, ctags agree, GitGalaxy differ -*2-vs-1 -- 2 occurrences as of 2026-08-20T22:19:10Z* +*2-vs-1 -- 2 occurrences as of 2026-08-20T22:54:02Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`fortran/function/existence/agree[ctags,tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -759,7 +745,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `fortran` function existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 2 occurrences as of 2026-08-20T22:19:10Z* +*2-vs-1 -- 2 occurrences as of 2026-08-20T22:54:02Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`fortran/function/existence/agree[gitgalaxy]_vs[ctags,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -770,7 +756,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `fortran` function args: none agree, GitGalaxy, tree-sitter, ctags differ -*3-way split -- 1 occurrence as of 2026-08-20T22:19:10Z* +*3-way split -- 1 occurrence as of 2026-08-20T22:54:02Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`fortran/function/args/agree[none]_vs[ctags,gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -782,7 +768,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `go` function args: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 75 occurrences as of 2026-08-20T22:19:12Z* +*2-vs-1 -- 75 occurrences as of 2026-08-20T22:54:04Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`go/function/args/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -803,7 +789,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `haskell` function existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 103 occurrences as of 2026-08-20T22:19:15Z* +*2-vs-1 -- 103 occurrences as of 2026-08-20T22:54:07Z* **Verdict** (by Claude Sonnet 5 (dispatched agent investigation), 2026-08-19T00:00:00Z): > All 10 sampled cases are ctags-side artifacts, not real GitGalaxy/tree-sitter misses -- confirmed via direct `ctags -x` output against the corpus. Three distinct ctags Haskell-parser weaknesses cover the sample: (1) multi-clause double/triple-tagging -- ctags tags every pattern-matched equation line as its own occurrence of the name (writerFn/writeFnBinary/expandFilterPath: confirmed 2-3 raw ctags tags per function, one per clause; a file-wide count found 45 such extra same-name tags across the 7-file corpus, e.g. blockToInlines alone has 14). GitGalaxy/tree-sitter both correctly anchor to the FIRST clause only, leaving ctags' later-clause tags as the ones unpaired. (2) keyword-as-identifier misparsing -- `class`/`where`/`pattern` (from PatternSynonyms) get tagged as function names when ctags fails to parse past the keyword; confirmed at Options.hs:62 (`class HasSyntaxExtensions`), Parsing.hs:184 (module-header `where`), and 3 PatternSynonyms declarations in Options.hs. (3) CAF/value-vs-function kind collapse -- defaultAbbrevs/defaultKaTeXURL/defaultMathJaxURL/defaultWebTeXURL are zero-arg top-level VALUES (non-arrow type signatures), not functions; ctags has no value/variable kind at all (`ctags --list-kinds-full=Haskell` shows only constructor/function/module/type) so it lumps every `name = expr` binding into "function". GitGalaxy (language_standards.py haskell rules, #1312) and tree-sitter's own audit tooling (_find_haskell_signature_for_bind, #1566) both independently make the same value-vs-function distinction correctly -- real cross-tool corroboration, not coincidence. (4) TH-splice call sites misread as definitions -- deriveJSON at Options.hs:454/458 is a Template Haskell splice INVOKING an imported function, not defining one; ctags misparses the call as a definition. No GitGalaxy/tree-sitter defect anywhere in this shape; purely a ctags parser limitation, same category as the already-documented empty CTAGS_CLASS_KINDS['haskell']. @@ -823,7 +809,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `haskell` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 69 occurrences as of 2026-08-20T22:19:15Z* +*2-vs-1 -- 69 occurrences as of 2026-08-20T22:54:07Z* **Verdict** (by Claude Sonnet 5 (dispatched agent investigation), 2026-08-19T00:00:00Z): > Confirmed: all 10 sampled misses (and, by cross-check against additional non-sampled instances in Options.hs/Shared.hs, plausibly all 69) are locally-scoped function definitions -- `instance ... where` methods, `where`-clause helpers, or `let`-bound names inside `do` blocks -- never top-level module definitions. ctags' Haskell parser has no layout-rule/scope awareness and only tags equations anchored at column 1; it correctly handles multi-clause TOP-LEVEL definitions (verified via expandFilterPath, writeFnBinary, writerFn -- all tag fine, clauses and all), so this is a pure scope blind spot, not a clause-counting bug (distinct from the tree-sitter clause-splitting bug fixed earlier in this same effort, which shares 2 of the 10 sample names by coincidence of subject matter, not root cause). GitGalaxy and tree-sitter are both correct; ctags is not wrong so much as structurally incapable of seeing these. Known, expected limitation of ctags' Haskell parser, now documented alongside its existing Haskell notes in tests/tools/ctags_reader.py -- not a GitHub issue, nothing in this repo to fix. @@ -843,7 +829,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `haskell` class existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 16 occurrences as of 2026-08-20T22:19:15Z* +*2-vs-1 -- 16 occurrences as of 2026-08-20T22:54:07Z* **Verdict** (by Claude Sonnet 5 (session investigation), 2026-08-19T00:00:00Z): > Not a real discrepancy -- structural tooling gap, already documented in the codebase. tests/tools/ctags_reader.py:39-40,228 sets CTAGS_CLASS_KINDS['haskell'] = set() on purpose: "ctags' Haskell parser has no class-shaped kind at all (constructor/function/module/type only)". Every example in this shape (data/newtype/class declarations -- ReaderOptions, CiteMethod, HasSyntaxExtensions, etc.) is real; ctags structurally cannot report any of them for this language, not a sample-specific miss. No action needed beyond this note. @@ -863,7 +849,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `haskell` function existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 2 occurrences as of 2026-08-20T22:19:15Z* +*2-vs-1 -- 2 occurrences as of 2026-08-20T22:54:07Z* **Verdict** (by Claude Sonnet 5 (session investigation), 2026-08-19T00:00:00Z): > Mixed shape, resolved by reading both of the 2 occurrences directly (no larger sample needed). (1) Options.hs:438 getExtensions -- real function, `instance HasSyntaxExtensions WriterOptions where getExtensions opts = writerExtensions opts`. A sibling instance for ReaderOptions at Options.hs:80 has the identical shape. Tree-sitter's Haskell grammar doesn't expose typeclass-instance-method clause bodies the way it does top-level bindings, and ctags' Haskell parser has no instance-method kind either -- GitGalaxy is correct, both other tools have a real recall gap on typeclass instance methods. (2) Shared.hs:475 extensionEnabled -- NOT a real function. Imported from Text.Pandoc.Extensions (Shared.hs:114), only ever appears as a guard-clause call (`| extensionEnabled Ext_gfm_auto_identifiers exts = ...`). GitGalaxy's regex misreads a guard-clause invocation as a definition -- genuine GitGalaxy false positive, worth its own engine bug against language_standards.py's haskell func_start rule. @@ -875,7 +861,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `haskell` function args: none agree, GitGalaxy, tree-sitter differ -*3-way split -- 9 occurrences as of 2026-08-20T22:19:15Z* +*3-way split -- 9 occurrences as of 2026-08-20T22:54:07Z* **Verdict** (by Claude Sonnet 5 (session investigation), 2026-08-19T00:00:00Z): > One systematic cause, confirmed by reading source for 3 of the 9 (getMetadataFromFiles App.hs:395-397, splitTextByIndices Shared.hs:142-143, tabFilter Shared.hs:256-259) and consistent with the shape of the remaining 6. Every case is a point-free/eta-reduced Haskell equation: the type signature declares N params, but the specific clause GitGalaxy and tree-sitter both align to only explicitly binds N-1 of them, handling the trailing argument via composition (`.`) or `\case`. GitGalaxy counts arity from the full type signature (the true logical arity); tree-sitter's declaration-only reading counts only the clause's explicitly-bound patterns (correct for that one equation, but undercounts true arity). Neither reader is wrong about what it's measuring -- same shape as Claim 1 in docs/why_gitgalaxy_beats_ast_here.md. GitGalaxy's answer is arguably the more useful coupling signal; recommend documenting as a candidate Claim rather than treating as an engine defect to fix toward matching tree-sitter. @@ -896,7 +882,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `java` function args: tree-sitter, ctags agree, GitGalaxy differ -*2-vs-1 -- 28 occurrences as of 2026-08-20T22:19:18Z* +*2-vs-1 -- 28 occurrences as of 2026-08-20T22:54:10Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`java/function/args/agree[ctags,tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -915,7 +901,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `java` function args: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 12 occurrences as of 2026-08-20T22:19:18Z* +*2-vs-1 -- 12 occurrences as of 2026-08-20T22:54:10Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`java/function/args/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -934,7 +920,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `java` function existence: tree-sitter, ctags agree, GitGalaxy differ -*2-vs-1 -- 3 occurrences as of 2026-08-20T22:19:18Z* +*2-vs-1 -- 3 occurrences as of 2026-08-20T22:54:10Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`java/function/existence/agree[ctags,tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -946,7 +932,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `java` function args: none agree, GitGalaxy, tree-sitter, ctags differ -*3-way split -- 1 occurrence as of 2026-08-20T22:19:18Z* +*3-way split -- 1 occurrence as of 2026-08-20T22:54:10Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`java/function/args/agree[none]_vs[ctags,gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -958,7 +944,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `javascript` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 266 occurrences as of 2026-08-20T22:19:21Z* +*2-vs-1 -- 266 occurrences as of 2026-08-20T22:54:13Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`javascript/function/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -977,7 +963,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `javascript` function existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 182 occurrences as of 2026-08-20T22:19:21Z* +*2-vs-1 -- 182 occurrences as of 2026-08-20T22:54:13Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`javascript/function/existence/agree[gitgalaxy]_vs[ctags,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -996,7 +982,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `javascript` function existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 150 occurrences as of 2026-08-20T22:19:21Z* +*2-vs-1 -- 150 occurrences as of 2026-08-20T22:54:13Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`javascript/function/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1015,7 +1001,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `javascript` function existence: tree-sitter agree, GitGalaxy, ctags differ -*2-vs-1 -- 104 occurrences as of 2026-08-20T22:19:21Z* +*2-vs-1 -- 104 occurrences as of 2026-08-20T22:54:13Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`javascript/function/existence/agree[tree_sitter]_vs[ctags,gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -1034,7 +1020,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `javascript` class existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 96 occurrences as of 2026-08-20T22:19:21Z* +*2-vs-1 -- 96 occurrences as of 2026-08-20T22:54:13Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`javascript/class/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1053,7 +1039,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `javascript` function existence: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 11 occurrences as of 2026-08-20T22:19:21Z* +*2-vs-1 -- 11 occurrences as of 2026-08-20T22:54:13Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`javascript/function/existence/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1072,7 +1058,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `javascript` function args: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 7 occurrences as of 2026-08-20T22:19:21Z* +*2-vs-1 -- 7 occurrences as of 2026-08-20T22:54:13Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`javascript/function/args/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1088,7 +1074,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `javascript` function args: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 2 occurrences as of 2026-08-20T22:19:21Z* +*2-vs-1 -- 2 occurrences as of 2026-08-20T22:54:13Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`javascript/function/args/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1101,7 +1087,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `kotlin` function existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 15 occurrences as of 2026-08-20T22:19:24Z* +*2-vs-1 -- 15 occurrences as of 2026-08-20T22:54:16Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`kotlin/function/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1120,7 +1106,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `kotlin` class existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 3 occurrences as of 2026-08-20T22:19:24Z* +*2-vs-1 -- 3 occurrences as of 2026-08-20T22:54:16Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`kotlin/class/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1132,7 +1118,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `kotlin` function existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:19:24Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:54:16Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`kotlin/function/existence/agree[gitgalaxy]_vs[ctags,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1144,7 +1130,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `m4` function existence: ctags agree, GitGalaxy differ -*2-vs-1 -- 79 occurrences as of 2026-08-20T22:19:30Z* +*2-vs-1 -- 79 occurrences as of 2026-08-20T22:54:22Z* **Verdict** (by gemini-3.1-pro-high (agy), dispatched via tri-comparison-ledger-sweep, reviewed by claude-sonnet-5, 2026-08-20): > Clean, single-cause shape (all 10 sampled cases), not a GitGalaxy defect. Every sampled occurrence (curl/configure.ac lines 967-4994) is a real AC_DEFINE or AC_DEFINE_UNQUOTED call (e.g. line 2112: AC_DEFINE_UNQUOTED([CURL_DEFAULT_SSL_BACKEND], [...], [...])) -- an autoconf helper that emits a C preprocessor #define into the generated config.h at build time, NOT a new callable M4 macro definition. GitGalaxy's own func_start regex for m4 deliberately excludes AC_DEFINE/AC_DEFINE_UNQUOTED from its keyword set (m4_define|define|AC_DEFUN|AC_DEFUN_ONCE|AU_DEFUN|m4_defun only), so its silence here is correct. ctags' M4 parser heuristically tags any AC_DEFINE*-family call with a bracketed/plain first argument as a macro definition -- same macro-invocation-vs-definition confusion already documented for C's RICHCMP_WRAPPER pattern, now also documented in tests/tools/ctags_reader.py's m4 note. No GitHub issue against GitGalaxy -- this is a real, confirmed ctags-side limitation. (Separately, unrelated to this shape: a deeper live-pipeline recall gap causing GitGalaxy to extract only 1 m4 function total across the whole corpus, despite its func_start regex matching dozens of genuine AC_DEFUN/m4_define calls when run standalone, was found and fixed in part -- see PR #1927 for the func_start capture-group fix; the remaining pipeline-level gap is tracked separately, not part of this shape's verdict.) Investigated via gemini-3.1-pro-high (agy), all 10 sampled file:line citations independently verified. @@ -1164,7 +1150,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `m4` class existence: GitGalaxy agree, ctags differ -*2-vs-1 -- 4 occurrences as of 2026-08-20T22:19:30Z* +*2-vs-1 -- 4 occurrences as of 2026-08-20T22:54:22Z* **Verdict** (by claude-sonnet-5 (direct source read, no dispatch needed), 2026-08-20): > Confirmed real GitGalaxy false positive, not yet fixed (tracked separately). m4's own class_start rule is explicitly None (m4 has no class/OOP concept) -- but detector.py's class extraction branch only checks _CLASS_START_NAMED_EXTRACTION_LANGS allowlist membership, not whether the language's own class_start is None, so m4 (and 18 other class_start=None languages) falls through to the generic 'class|struct|interface|trait|enum NAME' fallback regex regardless. That fallback has no awareness of m4 document structure, so it matches raw C struct declarations embedded as literal text inside autoconf feature-test macro arguments (e.g. curl/configure.ac:1358's 'struct SocketIFace *ISocket = NULL;' inside an AC_LANG_PROGRAM([[ ... ]]) block) as if they were real m4 classes. Verified directly against the live gatherer: gg_classes for curl/configure.ac returns ['SocketIFace', 'Library', 'sockaddr_in6'], none of which are real m4 constructs; ctags correctly reports none (no class-shaped kind for m4 at all). Filed as GitHub issue #1925 (broader architectural gap, confirmed for m4, 18 other class_start=None languages not yet checked) -- not fixed in this sweep. @@ -1178,7 +1164,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `m4` function existence: GitGalaxy agree, ctags differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:19:30Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:54:22Z* **Verdict** (by claude-sonnet-5 (direct source read, no dispatch needed), 2026-08-20): > Confirmed real GitGalaxy false positive, now fixed. The old func_start regex had no capture group over the macro-name argument, so it matched the AC_DEFUN keyword itself as the 'function name' -- structurally identical to matching 'def' as a Python function's name instead of what follows it. gnucobol/configure.ac:658 'AC_DEFUN([AC_PROG_F77], [])' was reported as a function literally named 'AC_DEFUN'; ctags correctly reports nothing here since this call defines an empty macro body (a no-op placeholder, common autoconf idiom for stubbing out a check). Fixed in PR #1927: func_start now captures the real macro-name argument (AC_PROG_F77), handling m4's three real quoting conventions (backtick/apostrophe, bracket, double-bracket). Verified directly: the pipeline now reports 'AC_PROG_F77' at line 658, not 'AC_DEFUN'. @@ -1191,7 +1177,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `makefile` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:19:31Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:54:23Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`makefile/function/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1203,7 +1189,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `matlab` function args: none agree, GitGalaxy, tree-sitter differ -*3-way split -- 1 occurrence as of 2026-08-20T22:19:33Z* +*3-way split -- 1 occurrence as of 2026-08-20T22:54:25Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`matlab/function/args/agree[none]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1215,7 +1201,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `objective-c` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 104 occurrences as of 2026-08-20T22:19:34Z* +*2-vs-1 -- 104 occurrences as of 2026-08-20T22:54:26Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`objective-c/function/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1234,7 +1220,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `objective-c` function existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 91 occurrences as of 2026-08-20T22:19:34Z* +*2-vs-1 -- 91 occurrences as of 2026-08-20T22:54:26Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`objective-c/function/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1253,7 +1239,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `objective-c` function existence: tree-sitter agree, GitGalaxy, ctags differ -*2-vs-1 -- 2 occurrences as of 2026-08-20T22:19:34Z* +*2-vs-1 -- 2 occurrences as of 2026-08-20T22:54:26Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`objective-c/function/existence/agree[tree_sitter]_vs[ctags,gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -1264,7 +1250,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `objective-c` function existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:19:34Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:54:26Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`objective-c/function/existence/agree[gitgalaxy]_vs[ctags,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1276,7 +1262,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `perl` function existence: tree-sitter agree, GitGalaxy, ctags differ -*2-vs-1 -- 122 occurrences as of 2026-08-20T22:19:40Z* +*2-vs-1 -- 122 occurrences as of 2026-08-20T22:54:33Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`perl/function/existence/agree[tree_sitter]_vs[ctags,gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -1295,7 +1281,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `perl` function existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 7 occurrences as of 2026-08-20T22:19:40Z* +*2-vs-1 -- 7 occurrences as of 2026-08-20T22:54:33Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`perl/function/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1311,7 +1297,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `perl` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 7 occurrences as of 2026-08-20T22:19:40Z* +*2-vs-1 -- 7 occurrences as of 2026-08-20T22:54:33Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`perl/function/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1327,7 +1313,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `perl` class existence: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:19:40Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:54:33Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`perl/class/existence/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1337,7 +1323,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `perl` function existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:19:40Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:54:33Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`perl/function/existence/agree[gitgalaxy]_vs[ctags,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1347,7 +1333,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `perl` function args: none agree, GitGalaxy, tree-sitter differ -*3-way split -- 64 occurrences as of 2026-08-20T22:19:40Z* +*3-way split -- 64 occurrences as of 2026-08-20T22:54:33Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`perl/function/args/agree[none]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1368,7 +1354,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `php` class existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:19:45Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:54:37Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`php/class/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1378,7 +1364,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `php` function existence: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:19:45Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:54:37Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`php/function/existence/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1390,7 +1376,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `powershell` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 16 occurrences as of 2026-08-20T22:19:47Z* +*2-vs-1 -- 16 occurrences as of 2026-08-20T22:54:40Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`powershell/function/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1409,7 +1395,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `powershell` class existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 7 occurrences as of 2026-08-20T22:19:47Z* +*2-vs-1 -- 7 occurrences as of 2026-08-20T22:54:40Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`powershell/class/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1425,7 +1411,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `powershell` function existence: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:19:47Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:54:40Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`powershell/function/existence/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1435,7 +1421,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `powershell` function args: none agree, GitGalaxy, tree-sitter differ -*3-way split -- 5 occurrences as of 2026-08-20T22:19:47Z* +*3-way split -- 5 occurrences as of 2026-08-20T22:54:40Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`powershell/function/args/agree[none]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1451,7 +1437,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `python` function existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 68 occurrences as of 2026-08-20T22:19:57Z* +*2-vs-1 -- 68 occurrences as of 2026-08-20T22:54:49Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`python/function/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1470,7 +1456,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `python` function existence: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 32 occurrences as of 2026-08-20T22:19:57Z* +*2-vs-1 -- 32 occurrences as of 2026-08-20T22:54:49Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`python/function/existence/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1489,7 +1475,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `python` class existence: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 4 occurrences as of 2026-08-20T22:19:57Z* +*2-vs-1 -- 4 occurrences as of 2026-08-20T22:54:49Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`python/class/existence/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1502,7 +1488,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `python` function args: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:19:57Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:54:49Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`python/function/args/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1514,7 +1500,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `ruby` class existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 6 occurrences as of 2026-08-20T22:19:58Z* +*2-vs-1 -- 6 occurrences as of 2026-08-20T22:54:50Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`ruby/class/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1529,7 +1515,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `ruby` function args: tree-sitter, ctags agree, GitGalaxy differ -*2-vs-1 -- 6 occurrences as of 2026-08-20T22:19:58Z* +*2-vs-1 -- 6 occurrences as of 2026-08-20T22:54:50Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`ruby/function/args/agree[ctags,tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -1544,7 +1530,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `ruby` function args: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 3 occurrences as of 2026-08-20T22:19:58Z* +*2-vs-1 -- 3 occurrences as of 2026-08-20T22:54:50Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`ruby/function/args/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1556,7 +1542,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `ruby` class existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 2 occurrences as of 2026-08-20T22:19:58Z* +*2-vs-1 -- 2 occurrences as of 2026-08-20T22:54:50Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`ruby/class/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1569,7 +1555,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `rust` function existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 152 occurrences as of 2026-08-20T22:20:02Z* +*2-vs-1 -- 152 occurrences as of 2026-08-20T22:54:54Z* **Verdict** (by Claude Sonnet 5 (resolved from existing Claim 6 documentation, no dispatch), 2026-08-19T00:00:00Z): > Not a new question -- already-documented, evidence-backed rust behavior (Claim 6, docs/why_gitgalaxy_beats_ast_here.md: 'structure recall inside opaque macro bodies'). Confirmed directly: all 5 sampled names (get_param, init_access, get_components, from_components, apply) are in bevy/bevy_ecs_macros.rs, inside a `quote! { ... }` proc-macro body (confirmed at source lines 444-460 -- `#path`/`#fields_alias` interpolation syntax is the classic quote! token-generation pattern). These are real Rust function definitions being code-generated by a proc macro; GitGalaxy's regex correctly parses real function syntax wherever it textually appears, including inside macro bodies. tree-sitter-rust and ctags' Rust parser both treat macro_rules!/macro-invocation bodies as opaque token trees and structurally cannot emit function nodes for anything inside one -- not a bug in either, a real grammar limitation. This is exactly why rust is one of the 3 languages (with csharp/fortran) already promoted into ground truth via blind-spot-region detection in the OLD bi-comparison tool (tree_sitter_accuracy_audit.py's _find_blind_spot_ranges) -- this tri-comparison ledger entry is that same, already-understood gap surfacing again under the new 3-tool reconciliation. GitGalaxy is correct; no engine defect, no issue needed. Resolved directly from existing documentation, no fresh dispatch required (tri-comparison-ledger-sweep skill step 1.3). @@ -1589,7 +1575,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `rust` class existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 25 occurrences as of 2026-08-20T22:20:02Z* +*2-vs-1 -- 25 occurrences as of 2026-08-20T22:54:54Z* **Verdict** (by Gemini (dispatched via tri-comparison-ledger-sweep), confirmed by Claude Sonnet 5, 2026-08-19T00:00:00Z): > Same mechanism as the already-resolved rust/function/existence/agree[gitgalaxy]_vs[ctags,tree_sitter] shape (Claim 6, docs/why_gitgalaxy_beats_ast_here.md) -- extended from `fn` definitions inside `quote!{}` invocation bodies to `struct` definitions inside `macro_rules!` DEFINITION bodies. All 6 sampled names confirmed, independently re-verified against source (not just the dispatched agent's own read): NonZeroVisitor (line 90), SaturatingVisitor (112), PrimitiveVisitor (136) inside serde/serde_core_de_impls.rs's `impl_deserialize_num!` macro (def starts line 81); SeqVisitor (998), SeqInPlaceVisitor (1036) inside `seq_impl!` (def starts 978); TupleVisitor (1403) inside `tuple_impl_body!` (nested in `tuple_impls!`, def starts 1396). All 6 are real, complete `struct` declarations, each immediately followed by a genuine `impl<'de,...> Visitor<'de> for ` block -- generated once per macro invocation, not fragments or hallucinated matches. tree-sitter and ctags both treat a macro_rules! arm's body as an opaque, unexpanded token tree and structurally cannot emit struct nodes from inside one, for the identical reason they can't see function definitions inside quote!{} bodies. GitGalaxy is correct in all 6 sampled cases; judged (not independently re-confirmed beyond the sample) to generalize to the full 25, all same-shaped serde-crate occurrences. No new tool defect -- Claim 6's doc text already covered this generically (`struct_item` was already named) but had no concrete cited example for this specific shape; added one (docs/why_gitgalaxy_beats_ast_here.md) rather than filing an issue. @@ -1609,7 +1595,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `rust` function args: tree-sitter, ctags agree, GitGalaxy differ -*2-vs-1 -- 21 occurrences as of 2026-08-20T22:20:02Z* +*2-vs-1 -- 21 occurrences as of 2026-08-20T22:54:54Z* **Verdict** (by Gemini (dispatched via tri-comparison-ledger-sweep, 2 rounds with self-correction), confirmed by Claude Sonnet 5, 2026-08-19T00:00:00Z): > Confirmed GitGalaxy engine defect, same root cause as the sibling shape rust/function/args/agree[none]_vs[gitgalaxy,tree_sitter] (#1872): a Rust lifetime tick (`'_`, `'a`, `'static`) never gets recognized as non-string during bracket/quote scanning. This shape surfaces the SECOND manifestation, in a different function than the first: `_matching_paren_end` (gitgalaxy/core/detector.py:3675-3703) has NO lifetime guard at all (unlike _count_top_level_args's broken-but-present one). A lifetime tick makes its self-containment check falsely fail, falling through to the comma/whitespace-split fallback meant for Lisp/Scheme/Shell (~line 4296) -- for single-parameter signatures with a lifetime and no comma this OVER-counts (opposite direction from the sibling shape's under-count), for multi-param signatures it under-counts via the same swallowed-closing-paren mechanism. Extends the how_to_investigate_a_discrepancy.md worked example (bevy_ecs_table.rs::initialize, 5 real params, GitGalaxy reports 3) across the full 8-item sample, independently hand-traced and confirmed exact-match against real source for all 8: bevy_ecs_table.rs:171,194, bevy_ecs_world.rs:2969,3005, serde_internals_ast.rs:62 (under-count, multi-param); bevy_reflect_path.rs:43, serde_core_de_impls.rs:3147, serde_internals_ast.rs:119 (over-count, single-param via the whitespace-split fallback). Dispatched investigation initially produced a fabricated mechanism on its first pass; caught by the dispatching agent's own manual code trace, corrected on a second pass, then independently re-verified byte-for-byte against all 8 real signatures before being accepted here -- treat this as a genuinely double-checked finding, not a single-pass claim. ctags and tree-sitter are both correct in every case. Judged to plausibly explain most/all of the remaining 21 (any rust signature with a lifetime annotation is susceptible) and possibly under-reported beyond this specific ledger shape too, since lifetimes are extremely common idiomatic rust. Added as a follow-up comment on #1872 rather than a duplicate issue, since both bugs should be fixed together. @@ -1629,7 +1615,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `rust` class existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 3 occurrences as of 2026-08-20T22:20:02Z* +*2-vs-1 -- 3 occurrences as of 2026-08-20T22:54:54Z* **Verdict** (by Claude Sonnet 5 (resolved directly via live ctags run, no dispatch), 2026-08-19T00:00:00Z): > Confirmed structural ctags limitation, not a bug -- resolved directly (no dispatch needed). All 3 sampled names (XRegUnion, FRegUnion, VRegUnion) are real Rust `union { }` declarations (confirmed at wasmtime/wasmtime_pulley_interp.rs:404,529,604), distinct from `struct` -- Rust's less-common C-style unsafe union construct. Ran `ctags --list-kinds-full=Rust` directly: its Rust parser's kind list is macro/method/implementation/enumerator/function/enum/interface/field/module/struct/typedef/variable -- there is NO union kind at all. Confirmed via direct ctags run against this exact file: it correctly finds the wrapping `struct FRegVal(FRegUnion)`-shaped types right next to each missed union, so this isn't a general miss, specifically a missing Rust-union kind. Same category as the already-documented ctags Haskell class-kind gap (tests/tools/ctags_reader.py) -- worth a similar doc note there, not a GitHub issue (nothing to fix, ctags upstream has no union support for this language). @@ -1642,7 +1628,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `rust` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:20:02Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:54:54Z* **Verdict** (by Claude Sonnet 5 (resolved directly via live ctags run, no dispatch), 2026-08-19T00:00:00Z): > Confirmed via direct ctags run and sibling comparison, resolved directly (no dispatch needed). `done_decode` (wasmtime/wasmtime_pulley_interp.rs:964) has a destructuring-pattern parameter -- `Done { _priv }: Done`, not a simple `name: Type` binding. Ran ctags directly against the file: its IMMEDIATE SIBLING in the same impl block, `debug_assert_done_reason_none` (line 960, same visibility/receiver shape, ordinary `&mut self`-only signature), IS correctly found as a ctags 'method'. done_decode alone is missing from ctags' output. Isolates the cause precisely to the destructuring-pattern parameter -- ctags' regex-based Rust parser appears to fail/skip the whole function when a parameter is a struct pattern rather than a plain identifier binding. GitGalaxy and tree-sitter both handle this fine (both agree on line 964). N=1 in this corpus, plausibly a real, narrow ctags parser gap (not GitGalaxy's) -- not chasing further given the tiny sample, noting rather than filing an issue since there's nothing in this repo to fix. @@ -1653,7 +1639,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `rust` function args: none agree, GitGalaxy, tree-sitter differ -*3-way split -- 21 occurrences as of 2026-08-20T22:20:02Z* +*3-way split -- 21 occurrences as of 2026-08-20T22:54:54Z* **Verdict** (by Gemini (dispatched via tri-comparison-ledger-sweep), confirmed by Claude Sonnet 5, 2026-08-19T00:00:00Z): > Confirmed GitGalaxy engine defect, not a modeling disagreement -- tree-sitter is correct in all 8 sampled cases (and this generalizes to the full 21: every sampled name is a deserialize_*/spawn_*_caller-shaped signature carrying a rust lifetime annotation, the exact trigger). Root cause, independently confirmed via two methods (dispatched agent read the code path; a second grep pass confirmed the attribute is dead): `gitgalaxy/core/detector.py::StructuralExtractor._count_top_level_args` has a guard meant to exempt rust/scala lifetime marks (`'_`, `'static`) from its string-literal scanner -- `getattr(self, 'language', '') in ('rust', 'scala')` around line 3766 -- but the class stores the language as `self.primary_lang_id` (set at line 497), never `self.language`. `self.language` is referenced NOWHERE ELSE in the file, confirmed by grep. The getattr always silently falls back to `''`, so the exemption guard never fires for any language, ever -- every lifetime `'` gets treated as an unterminated string-literal opener, swallowing all subsequent top-level commas until a real closing quote or end-of-string, fusing 2+ parameters into 1. A signature with 3 lifetime marks (odd count) never exits string mode at all and undercounts every remaining parameter. Real signatures confirmed at source: bevy/bevy_ecs_world.rs:1106,1121,1270 (`MovingPtr<'_, B>` swallows the next comma, 3 vs real 4, or 2 vs real 3); serde/serde_core_de_mod.rs:1105,1115 (`&'static str` swallows the next comma, 2 vs real 3); serde_core_de_mod.rs:1136 (two lifetimes, both trailing commas swallowed, 2 vs real 4); serde_core_de_mod.rs:1152,1163 (three lifetime marks, odd count means string mode never exits, 2 vs real 4). ctags has null coverage for these specific occurrences because they're bodyless trait-method declarations (ending in `;` inside a `trait` block) -- unrelated to the args bug, ctags appears to skip signature-only declarations generally. Filed as its own GitHub issue (attribute-name mismatch, one-line fix: `self.language` -> `self.primary_lang_id`, or equivalent), separate from this ledger record. @@ -1675,7 +1661,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `scala` function args: none agree, GitGalaxy, tree-sitter differ -*3-way split -- 16 occurrences as of 2026-08-20T22:20:04Z* +*3-way split -- 16 occurrences as of 2026-08-20T22:54:56Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`scala/function/args/agree[none]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1696,7 +1682,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `scheme` function existence: GitGalaxy agree, ctags differ -*2-vs-1 -- 50 occurrences as of 2026-08-20T22:20:09Z* +*2-vs-1 -- 50 occurrences as of 2026-08-20T22:55:01Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`scheme/function/existence/agree[gitgalaxy]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1715,7 +1701,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ✅ `scheme` function existence: ctags agree, GitGalaxy differ -*2-vs-1 -- 84 occurrences as of 2026-08-20T22:20:09Z* +*2-vs-1 -- 84 occurrences as of 2026-08-20T22:55:01Z* **Verdict** (by gemini-3.1-pro-high (agy), dispatched via tri-comparison-ledger-sweep, reviewed and fixed by claude-sonnet-5, 2026-08-20): > Confirmed real, catastrophic GitGalaxy engine defect, generalizes to the full 92 occurrences (and beyond -- this was a 100% recall drop for the whole language, not specific to the sampled cases). Root cause isolated to detector.py's StructuralExtractor._slice_by_braces (Integration Mode B): its scope-delimiter selection checked `lang_id == "lisp"` to choose parenthesis delimiters over the curly-brace default -- but "lisp" has never been a real key in LANGUAGE_DEFINITIONS (only "scheme" is), so that branch was unreachable dead code in production. Every real scheme file fell through to the curly-brace default; since scheme is entirely parenthesis-delimited, the downstream scope-body search never found an opener and silently discarded every func_start match. GitGalaxy's own func_start regex was never the problem -- confirmed matching correctly standalone (31/31 hits on one file) and prism.py's comment stripping confirmed clean (raw (define count unchanged pre/post-prism). Fixed: delimiter choice now keys off lexical_family ("recursive_block_lisp") instead of the dead lang_id string, verified directly against the gatherer (0 -> 58 real functions found; ctags finds 92, so a smaller residual recall gap remains for a future pass, tracked as a follow-on, not blocking this fix). Filed as GitHub issue #1928. A pre-existing unit test (test_detector_mode_b_lisp_family) had been passing for the wrong reason (its mock language was literally named "lisp", matching the dead string check by construction) -- corrected to use scheme's real lexical_family value so it now validates the actual production mechanism. Investigated via gemini-3.1-pro-high (agy): live-pipeline isolation with a monkey-patch before/after proof (0 -> 14 functions when lang_id coerced to match the old check), independently re-verified by Claude against the exact cited source lines before applying. @@ -1737,7 +1723,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `shell` function existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:20:10Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:55:02Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`shell/function/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1749,7 +1735,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `solidity` function existence: GitGalaxy agree, tree-sitter differ -*2-vs-1 -- 6 occurrences as of 2026-08-20T22:20:11Z* +*2-vs-1 -- 6 occurrences as of 2026-08-20T22:55:04Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`solidity/function/existence/agree[gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1766,7 +1752,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `swift` function existence: GitGalaxy agree, tree-sitter differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:20:13Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:55:05Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`swift/function/existence/agree[gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1776,7 +1762,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `swift` function existence: tree-sitter agree, GitGalaxy differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:20:13Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:55:05Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`swift/function/existence/agree[tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -1786,7 +1772,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `swift` function args: none agree, GitGalaxy, tree-sitter differ -*3-way split -- 1 occurrence as of 2026-08-20T22:20:13Z* +*3-way split -- 1 occurrence as of 2026-08-20T22:55:05Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`swift/function/args/agree[none]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1798,7 +1784,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `tcl` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 4 occurrences as of 2026-08-20T22:20:14Z* +*2-vs-1 -- 4 occurrences as of 2026-08-20T22:55:07Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`tcl/function/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1811,7 +1797,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `tcl` function existence: tree-sitter, ctags agree, GitGalaxy differ -*2-vs-1 -- 2 occurrences as of 2026-08-20T22:20:14Z* +*2-vs-1 -- 2 occurrences as of 2026-08-20T22:55:07Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`tcl/function/existence/agree[ctags,tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -1822,7 +1808,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `tcl` function existence: GitGalaxy, ctags agree, tree-sitter differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:20:14Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:55:07Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`tcl/function/existence/agree[ctags,gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1832,7 +1818,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `tcl` function existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:20:14Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:55:07Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`tcl/function/existence/agree[gitgalaxy]_vs[ctags,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1844,7 +1830,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `typescript` function existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 1907 occurrences as of 2026-08-20T22:20:35Z* +*2-vs-1 -- 1907 occurrences as of 2026-08-20T22:55:27Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`typescript/function/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1863,7 +1849,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `typescript` class existence: GitGalaxy, tree-sitter agree, ctags differ -*2-vs-1 -- 501 occurrences as of 2026-08-20T22:20:35Z* +*2-vs-1 -- 501 occurrences as of 2026-08-20T22:55:27Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`typescript/class/existence/agree[gitgalaxy,tree_sitter]_vs[ctags]`) in `tri_comparison_ledger.json`. @@ -1882,7 +1868,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `typescript` function existence: tree-sitter agree, GitGalaxy, ctags differ -*2-vs-1 -- 174 occurrences as of 2026-08-20T22:20:35Z* +*2-vs-1 -- 174 occurrences as of 2026-08-20T22:55:27Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`typescript/function/existence/agree[tree_sitter]_vs[ctags,gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -1901,7 +1887,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `typescript` function existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 61 occurrences as of 2026-08-20T22:20:35Z* +*2-vs-1 -- 61 occurrences as of 2026-08-20T22:55:27Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`typescript/function/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1920,7 +1906,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `typescript` function existence: tree-sitter, ctags agree, GitGalaxy differ -*2-vs-1 -- 9 occurrences as of 2026-08-20T22:20:35Z* +*2-vs-1 -- 9 occurrences as of 2026-08-20T22:55:27Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`typescript/function/existence/agree[ctags,tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -1938,7 +1924,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `typescript` class existence: ctags agree, GitGalaxy, tree-sitter differ -*2-vs-1 -- 2 occurrences as of 2026-08-20T22:20:35Z* +*2-vs-1 -- 2 occurrences as of 2026-08-20T22:55:27Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`typescript/class/existence/agree[ctags]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1949,7 +1935,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `typescript` function existence: GitGalaxy agree, tree-sitter, ctags differ -*2-vs-1 -- 2 occurrences as of 2026-08-20T22:20:35Z* +*2-vs-1 -- 2 occurrences as of 2026-08-20T22:55:27Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`typescript/function/existence/agree[gitgalaxy]_vs[ctags,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1960,7 +1946,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `typescript` function args: none agree, GitGalaxy, tree-sitter differ -*3-way split -- 4 occurrences as of 2026-08-20T22:20:35Z* +*3-way split -- 4 occurrences as of 2026-08-20T22:55:27Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`typescript/function/args/agree[none]_vs[gitgalaxy,tree_sitter]`) in `tri_comparison_ledger.json`. @@ -1975,7 +1961,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `zig` class existence: tree-sitter agree, GitGalaxy differ -*2-vs-1 -- 10 occurrences as of 2026-08-20T22:20:44Z* +*2-vs-1 -- 10 occurrences as of 2026-08-20T22:55:36Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`zig/class/existence/agree[tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. @@ -1994,7 +1980,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `zig` class existence: GitGalaxy agree, tree-sitter differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:20:44Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:55:36Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`zig/class/existence/agree[gitgalaxy]_vs[tree_sitter]`) in `tri_comparison_ledger.json`. @@ -2004,7 +1990,7 @@ Sorted 2-vs-1 splits before 3-way splits, unvalidated before validated, biggest ### ❓ `zig` function existence: tree-sitter agree, GitGalaxy differ -*2-vs-1 -- 1 occurrence as of 2026-08-20T22:20:44Z* +*2-vs-1 -- 1 occurrence as of 2026-08-20T22:55:36Z* **Not yet investigated.** See `docs/self_scan/how_to_investigate_a_discrepancy.md` for the process -- read the source at a few examples below, then hand-edit this entry (`zig/function/existence/agree[tree_sitter]_vs[gitgalaxy]`) in `tri_comparison_ledger.json`. diff --git a/gitgalaxy/standards/language_standards.py b/gitgalaxy/standards/language_standards.py index 519402d5..34515e5a 100644 --- a/gitgalaxy/standards/language_standards.py +++ b/gitgalaxy/standards/language_standards.py @@ -9194,9 +9194,15 @@ class PrismConfigSchema(TypedDict): # way Python's did (#1199). Name groups added too, purely so # existing extraction tests keep passing. "args": re.compile( + # #1963: `new` is a reserved instantiation keyword, never a real return + # type/modifier -- excluded from the optional prefix-consuming group so a + # line-leading `new ClassName(...)` constructor-call argument (common in + # multi-line SObject-builder calls) can't be parsed as "return type = new, + # name = ClassName". Mirrors csharp's own GHOST ARGS SHIELD, which already + # excludes `new` from its equivalent prefix group. r"^[ \t]*(?:@[\w.]+\b(?:\s*\((?:[^)(]|\([^)(]*\))*\))?\s*){0,5}" r"(?:(?:public|private|global|protected|static|override|virtual|abstract|testMethod)\s+){0,5}" - r"(?:[a-zA-Z_][\w.]*(?:\s*<(?:[^<>]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)*>)?(?:\s*\[\s*\])*\s+)?(?!(?:class|interface|enum|if|for|while|switch|catch)\b)([a-zA-Z_]\w*)\s*(\([^)]*\))|" + r"(?:(?!new\b)[a-zA-Z_][\w.]*(?:\s*<(?:[^<>]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)*>)?(?:\s*\[\s*\])*\s+)?(?!(?:class|interface|enum|if|for|while|switch|catch)\b)([a-zA-Z_]\w*)\s*(\([^)]*\))|" r"^[ \t]*trigger\s+([a-zA-Z_]\w*)\s+on\s+[a-zA-Z_]\w*\s*(\([^)]*\))", re.M | re.I, ), @@ -9227,10 +9233,18 @@ class PrismConfigSchema(TypedDict): # regex's own `args` sibling ("GHOST ARGS SHIELD") pattern # of demanding structural proof before treating text as a # definition rather than an invocation. - r"^[ \t]*(?=@|(?:public|private|global|protected|static|override|virtual|abstract|testMethod)\b|[a-zA-Z_][\w.]*[ \t\n]+)" + # + # #1963: `new` is a reserved instantiation keyword, never a real return + # type/modifier -- excluded from both the initial gating lookahead's + # bare-identifier alternative and the optional prefix-consuming group so a + # line-leading `new ClassName(...)` constructor-call argument (common in + # multi-line SObject-builder calls) can't satisfy the #1221 gate as + # "return type = new, name = ClassName". Mirrors csharp's own GHOST ARGS + # SHIELD, which already excludes `new` from its equivalent prefix group. + r"^[ \t]*(?=@|(?:public|private|global|protected|static|override|virtual|abstract|testMethod)\b|(?!new\b)[a-zA-Z_][\w.]*[ \t\n]+)" r"(?:@[\w.]+\b(?:\s*\((?:[^)(]|\([^)(]*\))*\))?\s*){0,5}" r"(?:(?:public|private|global|protected|static|override|virtual|abstract|testMethod)\s+){0,5}" - r"(?:[a-zA-Z_][\w.]*(?:\s*<(?:[^<>]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)*>)?(?:\s*\[\s*\])*\s+)?(?!(?:class|interface|enum|if|for|while|switch|catch)\b)([a-zA-Z_]\w*)(?=\s*\()|" + r"(?:(?!new\b)[a-zA-Z_][\w.]*(?:\s*<(?:[^<>]|<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)*>)?(?:\s*\[\s*\])*\s+)?(?!(?:class|interface|enum|if|for|while|switch|catch)\b)([a-zA-Z_]\w*)(?=\s*\()|" r"^[ \t]*trigger\s+([a-zA-Z_]\w*)(?=\s+on\b)", re.M, ), diff --git a/tests/golden_master_audit.json b/tests/golden_master_audit.json index 729979ee..802ba9fb 100644 --- a/tests/golden_master_audit.json +++ b/tests/golden_master_audit.json @@ -12,8 +12,8 @@ }, "Target Root Name": "data", "Absolute Project Path": "/home/joe/nyx_projects/language-crucible/data", - "Analysis ISO Timestamp": "2026-08-20T21:48:21.861331+00:00", - "Total Scan Duration": "46.09 seconds" + "Analysis ISO Timestamp": "2026-08-20T22:46:56.918396+00:00", + "Total Scan Duration": "45.79 seconds" }, "Source Control Footprint (Immutable Anchor)": { "Active Branch": "HEAD", @@ -225,7 +225,7 @@ "apex": { "files": 7, "loc": 988, - "impact": 269.16 + "impact": 260.86 }, "json": { "files": 9, @@ -508,7 +508,7 @@ }, "apex/apex-recipes": { "file_count": 8, - "total_mass": 248.74, + "total_mass": 240.44, "avg_exposures": { "cognitive_load": 14.15, "safety_score": 27.13, @@ -409092,7 +409092,7 @@ } }, "apex/apex-recipes": { - "Directory Group Magnitude": 248.74, + "Directory Group Magnitude": 240.44, "File Count": 8, "Ecosystem Fingerprint (Archetypes)": { "Unclassified": "87.5%", @@ -409441,9 +409441,9 @@ "Identity Proof": "Single Indicator (Ext: .cls)" }, "2. Topological Coordinates": { - "X": -478.82, - "Y": 100.42, - "Z": 4190.13 + "X": -90.85, + "Y": 58.4, + "Z": 4302.15 }, "3. Architectural Profile": { "Repository Archetype": "Unclassified", @@ -409455,7 +409455,7 @@ "Total LOC": 74, "Coding LOC": 68, "Documentation LOC": 0, - "Structural Magnitude": 20.66, + "Structural Magnitude": 12.36, "Control Flow Ratio": "80.0%", "Popularity Rank": 0, "Raw Churn Frequency": 0.0, @@ -409467,7 +409467,7 @@ "Cognitive Load Exposure": "7.79%", "Error & Exception Exposure": "44.65%", "Tech Debt Exposure": "99.46%", - "Testing Exposure": "2.33%", + "Testing Exposure": "2.3%", "API Exposure": "0.0%", "Concurrency Exposure": "0.0%", "State Flux Exposure": "0.0%", @@ -409479,16 +409479,6 @@ "Hardcoded Payload Artifacts": "0.0%" }, "5. Function Analysis": [ - { - "Function Name": "Account", - "Structural Impact": 5.1, - "Lines of Code (LOC)": 18, - "Control Flow Branches": 2, - "Input Parameters": 1, - "Control Flow Ratio": "100.0%", - "Start Line": 43, - "End Line": 60 - }, { "Function Name": "testUpdateAccountNameNegativeMinAccessProfile", "Structural Impact": 4.2, @@ -409509,16 +409499,6 @@ "Start Line": 22, "End Line": 38 }, - { - "Function Name": "Account", - "Structural Impact": 3.2, - "Lines of Code (LOC)": 8, - "Control Flow Branches": 1, - "Input Parameters": 1, - "Control Flow Ratio": "100.0%", - "Start Line": 25, - "End Line": 32 - }, { "Function Name": "testUpdateAccountNamePositive", "Structural Impact": 1.5, @@ -409544,8 +409524,8 @@ "7. Structural Signatures (Net Mitigated Signals)": { "Control Flow Branches": 4, "Sequential Logic Declarations": 1, - "Function Parameters": 7, - "Function/Method Declarations": 7, + "Function Parameters": 4, + "Function/Method Declarations": 4, "Class/Entity Declarations": 1, "Defensive Programming Constructs": 5, "Type/Safety Bypasses": 3, @@ -409659,9 +409639,9 @@ "Identity Proof": "Single Indicator (Ext: .cls)" }, "2. Topological Coordinates": { - "X": -248.71, - "Y": 118.8, - "Z": 4947.07 + "X": -475.03, + "Y": 155.83, + "Z": 4225.27 }, "3. Architectural Profile": { "Repository Archetype": "Unclassified", @@ -410358,8 +410338,8 @@ "7. Structural Signatures (Net Mitigated Signals)": { "Control Flow Branches": 13, "Sequential Logic Declarations": 1, - "Function Parameters": 23, - "Function/Method Declarations": 23, + "Function Parameters": 20, + "Function/Method Declarations": 20, "Class/Entity Declarations": 1, "Defensive Programming Constructs": 7, "Type/Safety Bypasses": 0, @@ -410473,9 +410453,9 @@ "Identity Proof": "Single Indicator (Ext: .json)" }, "2. Topological Coordinates": { - "X": -109.54, - "Y": 44.44, - "Z": 4375.86 + "X": -991.77, + "Y": 131.5, + "Z": 4565.58 }, "3. Architectural Profile": { "Repository Archetype": "Unclassified", @@ -410630,9 +410610,9 @@ "Identity Proof": "Single Indicator (Ext: .json)" }, "2. Topological Coordinates": { - "X": -971.03, - "Y": 127.91, - "Z": 4393.09 + "X": -253.01, + "Y": 46.08, + "Z": 4813.99 }, "3. Architectural Profile": { "Repository Archetype": "Unclassified", @@ -420598,8 +420578,8 @@ "7. Structural Signatures (Net Mitigated Signals)": { "Control Flow Branches": 3, "Sequential Logic Declarations": 4, - "Function Parameters": 6, - "Function/Method Declarations": 6, + "Function Parameters": 3, + "Function/Method Declarations": 3, "Class/Entity Declarations": 1, "Defensive Programming Constructs": 3, "Type/Safety Bypasses": 0, diff --git a/tests/golden_master_zero_dep_audit.json b/tests/golden_master_zero_dep_audit.json index cf126063..a2c118ed 100644 --- a/tests/golden_master_zero_dep_audit.json +++ b/tests/golden_master_zero_dep_audit.json @@ -12,8 +12,8 @@ }, "Target Root Name": "data", "Absolute Project Path": "/home/joe/nyx_projects/language-crucible/data", - "Analysis ISO Timestamp": "2026-08-20T21:49:18.439339+00:00", - "Total Scan Duration": "46.92 seconds" + "Analysis ISO Timestamp": "2026-08-20T22:50:58.786893+00:00", + "Total Scan Duration": "43.59 seconds" }, "Source Control Footprint (Immutable Anchor)": { "Active Branch": "HEAD", @@ -225,7 +225,7 @@ "apex": { "files": 7, "loc": 988, - "impact": 269.16 + "impact": 260.86 }, "json": { "files": 9, @@ -508,7 +508,7 @@ }, "apex/apex-recipes": { "file_count": 8, - "total_mass": 248.74, + "total_mass": 240.44, "avg_exposures": { "cognitive_load": 14.15, "safety_score": 27.13, @@ -409092,7 +409092,7 @@ } }, "apex/apex-recipes": { - "Directory Group Magnitude": 248.74, + "Directory Group Magnitude": 240.44, "File Count": 8, "Ecosystem Fingerprint (Archetypes)": { "Unclassified": "87.5%", @@ -409441,9 +409441,9 @@ "Identity Proof": "Single Indicator (Ext: .cls)" }, "2. Topological Coordinates": { - "X": -478.82, - "Y": 100.42, - "Z": 4190.13 + "X": -90.85, + "Y": 58.4, + "Z": 4302.15 }, "3. Architectural Profile": { "Repository Archetype": "Unclassified", @@ -409455,7 +409455,7 @@ "Total LOC": 74, "Coding LOC": 68, "Documentation LOC": 0, - "Structural Magnitude": 20.66, + "Structural Magnitude": 12.36, "Control Flow Ratio": "80.0%", "Popularity Rank": 0, "Raw Churn Frequency": 0.0, @@ -409467,7 +409467,7 @@ "Cognitive Load Exposure": "7.79%", "Error & Exception Exposure": "44.65%", "Tech Debt Exposure": "99.46%", - "Testing Exposure": "2.33%", + "Testing Exposure": "2.3%", "API Exposure": "0.0%", "Concurrency Exposure": "0.0%", "State Flux Exposure": "0.0%", @@ -409479,16 +409479,6 @@ "Hardcoded Payload Artifacts": "0.0%" }, "5. Function Analysis": [ - { - "Function Name": "Account", - "Structural Impact": 5.1, - "Lines of Code (LOC)": 18, - "Control Flow Branches": 2, - "Input Parameters": 1, - "Control Flow Ratio": "100.0%", - "Start Line": 43, - "End Line": 60 - }, { "Function Name": "testUpdateAccountNameNegativeMinAccessProfile", "Structural Impact": 4.2, @@ -409509,16 +409499,6 @@ "Start Line": 22, "End Line": 38 }, - { - "Function Name": "Account", - "Structural Impact": 3.2, - "Lines of Code (LOC)": 8, - "Control Flow Branches": 1, - "Input Parameters": 1, - "Control Flow Ratio": "100.0%", - "Start Line": 25, - "End Line": 32 - }, { "Function Name": "testUpdateAccountNamePositive", "Structural Impact": 1.5, @@ -409544,8 +409524,8 @@ "7. Structural Signatures (Net Mitigated Signals)": { "Control Flow Branches": 4, "Sequential Logic Declarations": 1, - "Function Parameters": 7, - "Function/Method Declarations": 7, + "Function Parameters": 4, + "Function/Method Declarations": 4, "Class/Entity Declarations": 1, "Defensive Programming Constructs": 5, "Type/Safety Bypasses": 3, @@ -409659,9 +409639,9 @@ "Identity Proof": "Single Indicator (Ext: .cls)" }, "2. Topological Coordinates": { - "X": -248.71, - "Y": 118.8, - "Z": 4947.07 + "X": -475.03, + "Y": 155.83, + "Z": 4225.27 }, "3. Architectural Profile": { "Repository Archetype": "Unclassified", @@ -410358,8 +410338,8 @@ "7. Structural Signatures (Net Mitigated Signals)": { "Control Flow Branches": 13, "Sequential Logic Declarations": 1, - "Function Parameters": 23, - "Function/Method Declarations": 23, + "Function Parameters": 20, + "Function/Method Declarations": 20, "Class/Entity Declarations": 1, "Defensive Programming Constructs": 7, "Type/Safety Bypasses": 0, @@ -410473,9 +410453,9 @@ "Identity Proof": "Single Indicator (Ext: .json)" }, "2. Topological Coordinates": { - "X": -109.54, - "Y": 44.44, - "Z": 4375.86 + "X": -991.77, + "Y": 131.5, + "Z": 4565.58 }, "3. Architectural Profile": { "Repository Archetype": "Unclassified", @@ -410630,9 +410610,9 @@ "Identity Proof": "Single Indicator (Ext: .json)" }, "2. Topological Coordinates": { - "X": -971.03, - "Y": 127.91, - "Z": 4393.09 + "X": -253.01, + "Y": 46.08, + "Z": 4813.99 }, "3. Architectural Profile": { "Repository Archetype": "Unclassified", @@ -420598,8 +420578,8 @@ "7. Structural Signatures (Net Mitigated Signals)": { "Control Flow Branches": 3, "Sequential Logic Declarations": 4, - "Function Parameters": 6, - "Function/Method Declarations": 6, + "Function Parameters": 3, + "Function/Method Declarations": 3, "Class/Entity Declarations": 1, "Defensive Programming Constructs": 3, "Type/Safety Bypasses": 0,