Part of #2560 — per-language tracking for the keyword-rosetta control corpus (built for #1096). Planted intent is identical in every language, so every deviation below is measured bias vs. the 46-language median, validated in the corpus's deviation ledger. 🔴 = beyond ±50% of the cross-language median, 🟡 = ±25–50%.
Triage order (per the epic): structure detection first, then signal/keyword rules, then risk-score consequences — §3's numbers are downstream of §1–§2 and re-baseline as those fix. Cross-cutting engine issues (e.g. #2535/#2546) fix many languages at once; this issue tracks this language's residual after each cross-cutting fix lands, and closes when the language sits inside the ±25% band on every comparable metric (or every remaining deviation is ledgered as intended morphology).
1. Structure detection (fix first)
In band — no structure-level deviations.
2. Signal / keyword deviations
- 🔴
branch: 19 vs median 5 (+280%)
- 🔴
doc: 2 vs median 1 (+100%)
- 🔴
io: 0 vs median 3 (-100%)
- 🔴
ownership: 4 vs median 1 (+300%)
- 🟡
state_mutation: 9 vs median 6 (+50%)
3. Risk-exposure consequences (downstream)
- 🔴
risk_cognitive_load: 29.041 vs median 15.1444 (+92%)
Ledgered shapes touching solidity
| defect |
type |
issue |
evidence |
summary |
census-requires-git-tracked |
engine-semantic |
— |
— |
GalaxyScope's census enumerates git-tracked files only; an untracked folder scans as '0 files mapped' with no per-file warning |
batch5-tier2-morphology-shapes |
keyword-overlap |
— |
— |
Collective entry for Tier-2 finditer/report-confirmed shapes, detailed per-manifest: css at-rules triple-count (func+branch, @supports also safety; args tracks @import u… |
kotlin-return-in-branch |
upstream-question |
#2545 |
b.sol |
kotlin's branch rule counts return: every file's branch = returns + real branch keywords (main.kt 8 = 5 returns + if/else/when; files with only returns record branch 3) |
string-literal-selective-shielding |
upstream-question |
#2535 |
b.sol |
Keywords inside one string literal ('if eval fails, try open') count toward branch (+2), safety (+1), io (+1) but eval does NOT count toward high_risk_execution (routes … |
Decoy outcomes (file-level evidence)
- b.sol ·
string memory note = "if eval fails, try open" (string): if + try count branch +2 (solidity includes try AND return — main 8 = 5 returns + if/else/for, joining the return-in-branch family as its 6th member); the note line is a 3rd raw state hit, tripled to 9 by flux. eval inert. Ledger: string-literal-selective-shielding, state-flux-branch-weighting, kotlin-return-in-branch
- c.sol ·
uint hack_level; (code): inert (underscore)
Reproduce / evidence
Part of #2560 — per-language tracking for the keyword-rosetta control corpus (built for #1096). Planted intent is identical in every language, so every deviation below is measured bias vs. the 46-language median, validated in the corpus's deviation ledger. 🔴 = beyond ±50% of the cross-language median, 🟡 = ±25–50%.
Triage order (per the epic): structure detection first, then signal/keyword rules, then risk-score consequences — §3's numbers are downstream of §1–§2 and re-baseline as those fix. Cross-cutting engine issues (e.g. #2535/#2546) fix many languages at once; this issue tracks this language's residual after each cross-cutting fix lands, and closes when the language sits inside the ±25% band on every comparable metric (or every remaining deviation is ledgered as intended morphology).
1. Structure detection (fix first)
In band — no structure-level deviations.
2. Signal / keyword deviations
branch: 19 vs median 5 (+280%)doc: 2 vs median 1 (+100%)io: 0 vs median 3 (-100%)ownership: 4 vs median 1 (+300%)state_mutation: 9 vs median 6 (+50%)3. Risk-exposure consequences (downstream)
risk_cognitive_load: 29.041 vs median 15.1444 (+92%)Ledgered shapes touching solidity
census-requires-git-trackedbatch5-tier2-morphology-shapeskotlin-return-in-branchstring-literal-selective-shieldingDecoy outcomes (file-level evidence)
string memory note = "if eval fails, try open"(string): if + try count branch +2 (solidity includes try AND return — main 8 = 5 returns + if/else/for, joining the return-in-branch family as its 6th member); the note line is a 3rd raw state hit, tripled to 9 by flux. eval inert. Ledger: string-literal-selective-shielding, state-flux-branch-weighting, kotlin-return-in-branchuint hack_level;(code): inert (underscore)Reproduce / evidence
data/solidity/—expected_signals.jsoncarries the shape-by-shape accountingGALAXYSCOPE_BIN=<venv>/bin/galaxyscope python tools/verify_language.py solidityin the corpus repo