You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This issue is the handoff surface. Every session (any model, any vendor) working rosetta reads
this issue top to bottom including comments before touching anything, claims one item by
comment, and leaves a status comment when it stops. The per-language issues (#2561–#2607) are not the work queue; they get a scripted status comment after each batch's regen (Batch E).
Session start protocol (every session, every time)
gh issue view <this> --comments — the last comment per item is its true state.
Read docs/bias_data.json / docs/bias_report.md from keyword-rosetta main — bias-history.yml regenerates it on every corpus push and nightly against engine main, and the report header names the engine SHA. Do not regenerate locally to triage; regenerate only to verify a change before a PR.
Claim: comment claiming <item id> — <model> — branch <name>. One item per session unless the
item says "fan-out".
Stop: comment status <item id>: <done|blocked|partial> — <branch/PR> — <what remains>.
Unfinished branches are pushed, never left local.
From Batch F on, claim a family, not a language or a batch (F.5 is the one fan-out).
Model tiers
tier
use for
why
T1 — Fable / Opus
classification across languages, writing fix shapes, ledger verdicts, attributing regen movers, every golden-master bless review, Batch D
judgment work; the failure mode is a plausibly-explained wrong number baked into a baseline
T2 — Sonnet
implementing a filed fix shape + strict tests, the regen/PR mechanics after a T1 review, tools scripting in Batch E, resolver fix in C
bounded tasks with a machine gate (verify_language.py, pytest, crucible_check.py)
T3 — Haiku / Gemini flash-class
the 32 per-language decoy edits (fan-out), #2660's 11 per-language anchor checks (fan-out), capstone prose from the template
templated, one language at a time, each self-checked by the verifier before it can be wrong
Rule of thumb: a T3 item must have a mechanical pass/fail the model runs itself; a T2 item must
have a written fix shape from T1; T1 owns anything that ends in a manifest number or a bless.
Batch 0 — unblock the gate owner: repo admintier: none
0.1 gh api -X PATCH repos/squid-protocol/gitgalaxy/actions/variables/KEYWORD_ROSETTA_REF -f value=<corpus main sha> then gh workflow run rosetta-audit.yml --ref main → green. (Run 33657474420 proved the stale state: 13 languages fail = PR Update README with improved mapping description #29's set.)
0.2 Process: add "bump KEYWORD_ROSETTA_REF" as the last checklist line of the engine-PR template's Cross-repo section.
Batch A — corpus only (keyword-rosetta), one PR, one regen
A.1 fan-out, T3 — decoy migration per rosetta#17 template (PR test(security): add comprehensive test suite for security and complia… #23 is the worked example) for: ada apex c cpp csharp dart dockerfile embedded_python go groovy haskell java javascript kotlin livecode lua m4 makefile matlab objective-c perl php powershell ruby scala scheme shell solidity swift tcl typescript zig. Done criterion per language: verify_language.py <lang> --report shows exactly +1 high_risk_execution from the new literal and no other delta vs the current manifest except removed decoy hits. Each language = one commit on the shared branch corpus/decoy-migration-wave2.
A.2 T2 — css/html empty probe bodies: plant css doc/globals/ownership/safety_bypasses and html cleanup/telemetry per SPEC.md; ~20 cells.
A.3 T2 — authoring fixes: perl =cut; apex Type.forName chain (gives apex a DAG); agc CA-register args; header @author swaps apex/agc/fortran; yaml single doc plant (drop one of name:/description:); cobol *> @return line (cobol: doc rule's AUTHOR-vs-ownership collision needs a corpus-side doc line planted before the engine fix (#2659 follow-up) #2661 step 1). Plus the four languages A.1's list missed — abap, assembly, cobol, sqlite still carry the retired shared sentence translated into their own vocabulary ('IF TRUNCATE FAILS TRY SELECT AGAIN', "if jmp fails try syscall again", 'IF ALTER FAILS TRY OPEN AGAIN', 'IF UPDATE FAILS TRY SELECT AGAIN'): same rosetta#17 template, same per-language gate, and screen the keyword against the risk_* inputs and the filler words too (see A.1's status comment for what that catches).
A.4 T1 — ledger: extend Tier-2 args-morphology entry to css/html/yacc/yaml/makefile/dockerfile/sqlite (not agc — A.3's CA A plant already took it to the median); normalise every entry's signal to |-joined metric names (needed by E.1).
A.5 T1 — regen (bias_report.py), attribute every mover, manifest notes, PR with Cross-repo section. Expect branch/io/safety medians to move; say so in the body. → keyword-rosetta#32 (Batch A). Pin bump owed after merge.
Batch B — engine batch 3 (gitgalaxy), one PR + one corpus rebless + pin bump
B.4 T1 — post-A residuals: sqlite io 11, tcl io 8, haskell/livecode/lua safety_bypasses 4 — classify, file with fix shapes, add to B.3 only if regex-level. Re-read sqlite's io after A.3 migrates its decoy: the old sentence's SELECT is an io keyword there, so part of that 11 is corpus-side, not engine-side. Same caution for tcl (A.1 already took its io 2→1 by dropping the prose open) and for haskell/livecode/lua safety_bypasses. → all figures were pre-A and the set was incomplete. Post-A: io RED sqlite 9, tcl 7, dockerfile 5 (missed); safety_bypasses RED lua/livecode/haskell 4 and swift/sqlite/html 0 (the low side, entirely missed), amber apex/fortran 3, yaml 1. Split: engine-side regex → safety_bypasses/io over-claim: four rules count tokens another rule owns (livecode global, lua _G+collectgarbage, fortran COMMON, dockerfile apt-get clean) — the #2659 shape #2675 (livecode/lua/fortran safety_bypasses + dockerfile io all claim tokens another rule owns; all four land on planted — B.3 material). Corpus-side → keyword-rosetta#33 (empty probe_bypass in html/sqlite/swift, half-planted yaml, apex risk-idiom collision, sqlite decoy via SELECT). Remainder is ledger, not fix: tcl source dual import/io, the cleanup-close family in c/lua/tcl, haskell unsafePerformIO (unavoidable).
B.5 T1 — scoped-diff check, golden-master bless (user go-ahead), corpus rebless PR with ENGINE_REF=pull/N/head, pin bump in the engine PR. → DONE: scoped diff 710 diffs / 0 unexplained; both golden masters blessed (e994d2a); corpus rebless keyword-rosetta#35 merged with ENGINE_REF=pull/2681/head; pin bumped to 216d57ab (full 40-char SHA).
Batch C — graph layer (gitgalaxy), parallel with A/B
C.3 T1 — bless review: real repos with ./x.js imports gain edges; the diff must be graph-only. Corpus rebless PR; remove m4/yacc from no-dependency-capture-languages. → DONE: diff verified graph-only (no extraction-signal column moved); both golden masters blessed (160 zero-dep / 165 full-precision, byte-identical to the pre-bless attribution); corpus rebless keyword-rosetta#38 MERGED with ENGINE_REF=pull/2685/head; ledger entry retired (languages_seen emptied, still_reproduces false); bias report red 270 → 236 with all 38 band changes improvements. ENGINE_REF reset open as keyword-rosetta#39; pin bump still owed after it merges.
Batch D — design pass (gitgalaxy) tier: T1 onlyblocked on A, B, C merged
E.1 T2, can start now — keyword-rosetta tools: after A.4, bias_report.py/language_deviations.py mark a red cell "explained" when a validated entry names that metric+language; exit code = epic close criterion. → keyword-rosetta#40. 444 out-of-band cells, 220 already accounted for (116 ledgered, 92 derived, 12 undefined), 224 genuinely unexplained — the ledger was carrying 116 answers the report never read, machine-readable only because A.4 normalised the signal fields. --gate exits nonzero while anything is unexplained (off by default; verify.yml unaffected). control_flow_ratio (21 cells) deliberately left unexplained rather than marked derived, because its denominator structural_boundaries is unplanted — see Design (D.1): shape-descriptor comparability — the 160 cells decompose into five mechanisms, only 15 of which are a real design question #2689 bucket B.
E.3 T3 — generate the 41 missing §10 capstones → re-scoped by docs: rosetta capstones for the two languages that qualify (#2669 E.3) #2696: a capstone is written when a language's tracking issue closes, as part of closing it (the language-status skill forbids a §10 before a real sweep). abap + groovy delivered; shell needs §1–§9 first. Standing rule, owned by F.6.
Batch F — the last 152, one cause family per session approved 2026-09-04
Plan: https://claude.ai/code/artifact/0f9f00d4-818e-4895-9e52-7ceb5fa4fc4d. State at approval: bias_report.py --gate unexplained = 152 (444 → 224 → 175 → 152), corpus main 6d26261 vs engine a334839. The regen is free and automatic now, so the unit of work is a cause family, not a batch-and-regen. Each session ends with one number here: unexplained before → after, read from corpus main the next morning.
F.2 T2 → keyword-rosetta#48 (12 cells derived; betweenness js/python → F.5) — — derivation edges for the graph family (dependency_density 10, dependency_links 2, betweenness_score 2): dependency_density → (import, coding_loc, control_flow_ratio), dependency_links → import, betweenness → the DAG inputs, each with the record_keeper/sensor line cited. Same keyword-rosetta tools PR as F.1. markdown's dependency_density 0.75 with a None import rule does not fit the formula — send it to F.5 if it survives. Expected 8–10 of 14 become derived.
F.4 T1 classify → T2/T3 execute — orphan/api/encapsulation census (raw_state_slop_orphans 16, raw_arch_api 10, def_encapsulation 7, encapsulation_ratio 5, state_slop_duplicates 1 = 39). Outputs of galaxyscope's Contextual Baseline Fix, mostly on no-call-graph languages (dockerfile, makefile, markdown, yaml, sqlite, jcl, css, html) plus a mainstream tail (python, go, perl, zig, javascript). Method: galaxyscope --db-only --debug, read [WORKER-TRACE] extracted functions for per language (CLAUDE.md recipe), sort into (i) no call graph so every probe is an orphan, (ii) orphan→api conversion via popularity, (iii) genuine over-count (orphan census counts non-function shapes on non-call-graph languages, making orphan→api conversion unauditable #2547 shape). Verify (iii) on language-crucible before filing — B.2's lesson. Expected: one ledger family for the no-call-graph languages (~25 cells), a few plants, at most one engine issue.
F.5 fan-out, T3 + T1 verdicts — the 17 single cells: classes_found cobol/css/dockerfile/jcl/kotlin, class_start cobol/css/jcl/yaml, args m4, globals csharp, high_risk_execution yacc, state_mutation yaml, test yaml, functions_found dockerfile/html/sqlite, plus whatever F.2 leaves. Per cell: reproduce with verify_language.py <lang> --report, one paragraph of cause, propose plant / rule fix / ledger; mechanical check = the change moves exactly that cell and nothing else in the manifest. yacc: %union type declarations have real record/struct morphology but class_start is wired None #2644 (yacc class_start) stays blocked on the detector allowlist and may end as a ledgered n/a. One corpus PR per wave of accepted verdicts; engine cells filed with fix shapes.
Order is by cells closed per decision: F.1+F.2 (one PR, → ~95) → F.3 (→ ~75) → F.4 (→ ~45) → F.5 (→ ~0), F.6 throughout. Housekeeping done at approval: #2544 + #2558 closed (shipped in #2677, comma-list Closes), keyword-rosetta#17 closed (40/40 migrated), KEYWORD_ROSETTA_REF variable deleted.
Stacking rules (unchanged from GATING.md, restated so no session has to rediscover them)
Commit corpus edits before verifying (census walks tracked files only).
Every manifest number cites a validated ledger entry; unexplained delta = stop.
One layer per engine PR; one corpus rebless PR per engine PR, opened against engine main after the engine PR merges (label the engine PR rosetta:rebless-owed when it moves the corpus). No ENGINE_REF, no pin.
Scoped-diff check before every bless; unrelated movers are attributed to a named merged PR or the bless waits.
Worktrees outside any path containing a tmp component.
Child of epic #2560. Full assessment with the cell-family breakdown: https://claude.ai/code/artifact/9bc0a5a3-5268-4e6a-8d2c-ea8924a45889
This issue is the handoff surface. Every session (any model, any vendor) working rosetta reads
this issue top to bottom including comments before touching anything, claims one item by
comment, and leaves a status comment when it stops. The per-language issues (#2561–#2607) are
not the work queue; they get a scripted status comment after each batch's regen (Batch E).
Session start protocol (every session, every time)
gh issue view <this> --comments— the last comment per item is its true state.gh issue list --repo squid-protocol/keyword-rosetta --search "corpus owes a re-bless against engine main" in:title --state open. If that issue is open, the corpus is behind engine main and the first job is the re-bless it lists. There is no pin to compare any more (KEYWORD_ROSETTA_REFdeleted 2026-09-04).docs/bias_data.json/docs/bias_report.mdfrom keyword-rosetta main —bias-history.ymlregenerates it on every corpus push and nightly against engine main, and the report header names the engine SHA. Do not regenerate locally to triage; regenerate only to verify a change before a PR.claiming <item id> — <model> — branch <name>. One item per session unless theitem says "fan-out".
status <item id>: <done|blocked|partial> — <branch/PR> — <what remains>.Unfinished branches are pushed, never left local.
Closes #Nper line in PR bodies — a comma-list closes only the first (yaml: missing "ownership" rule — action.yml author: / OpenAPI info.contact: idiom uncaptured #2646/yaml: missing "cleanup" rule — shell-embedded teardown verbs (rm -rf <path>, docker rm/down, kill) inside run:/script: blocks uncaptured #2647 stayed open for a day because of it).Model tiers
verify_language.py, pytest,crucible_check.py)Rule of thumb: a T3 item must have a mechanical pass/fail the model runs itself; a T2 item must
have a written fix shape from T1; T1 owns anything that ends in a manifest number or a bless.
Batch 0 — unblock the gate
owner: repo admintier: nonegh api -X PATCH repos/squid-protocol/gitgalaxy/actions/variables/KEYWORD_ROSETTA_REF -f value=<corpus main sha>thengh workflow run rosetta-audit.yml --ref main→ green. (Run 33657474420 proved the stale state: 13 languages fail = PR Update README with improved mapping description #29's set.)Batch A — corpus only (keyword-rosetta), one PR, one regen
verify_language.py <lang> --reportshows exactly +1high_risk_executionfrom the new literal and no other delta vs the current manifest except removed decoy hits. Each language = one commit on the shared branchcorpus/decoy-migration-wave2.=cut; apexType.forNamechain (gives apex a DAG); agc CA-register args; header@authorswaps apex/agc/fortran; yaml single doc plant (drop one of name:/description:); cobol*> @returnline (cobol: doc rule's AUTHOR-vs-ownership collision needs a corpus-side doc line planted before the engine fix (#2659 follow-up) #2661 step 1). Plus the four languages A.1's list missed — abap, assembly, cobol, sqlite still carry the retired shared sentence translated into their own vocabulary ('IF TRUNCATE FAILS TRY SELECT AGAIN',"if jmp fails try syscall again",'IF ALTER FAILS TRY OPEN AGAIN','IF UPDATE FAILS TRY SELECT AGAIN'): same rosetta#17 template, same per-language gate, and screen the keyword against therisk_*inputs and the filler words too (see A.1's status comment for what that catches).CA Aplant already took it to the median); normalise every entry'ssignalto|-joined metric names (needed by E.1).bias_report.py), attribute every mover, manifest notes, PR with Cross-repo section. Expect branch/io/safety medians to move; say so in the body. → keyword-rosetta#32 (Batch A). Pin bump owed after merge.Batch B — engine batch 3 (gitgalaxy), one PR + one corpus rebless + pin bump
/**+@param; solidity///+@param; apex@authorin doc, livecode (+~14 siblings): doc rule claims 'Author:' which ownership already owns — every header author line double-counts (ada has the correct pattern) #2659 shape; cobol cobol: doc rule's AUTHOR-vs-ownership collision needs a corpus-side doc line planted before the engine fix (#2659 follow-up) #2661 step 2). One issue, fix shape = count a docblock once (pair opener with tags, python/embedded_python: doc rule counts each docstring twice (open and close delimiters both match, no pairing) #2658 precedent). → doc rules count one doc comment once per marker AND once per tag — 18 languages, 8 red rosetta cells (the #2658 shape, unswept) #2672, family widened to 18 languages (adds c cpp objective-c dart javascript typescript swift yacc csharp as latent off-corpus double-counters); absorbs perl doc: a correctly-closed POD block counts twice (=pod + =cut) — the #2658 delimiter shape #2670 and cobol: doc rule's AUTHOR-vs-ownership collision needs a corpus-side doc line planted before the engine fix (#2659 follow-up) #2661 step 2. apex@authoris dormant, not a live cell — A.3 dodged it corpus-side; fix shape covers it anyway.gois real with the zig + dart: globals rule anchors ^[ \t]* so function-local var/const count as globals (+150% on the rosetta corpus) #2651 fix shape. assembly/css/lua/perl: fix harmful (indentation is not scope). cpp/dockerfile/haskell: inert or 0 incidence. livecode: not in the family (no anchor). kotlin/scheme: real FP but the col-0 anchor deletes the true positive too — need their own issue. B.3 ships go only.raw _("x")) misdetected as function when no longer masked by a nested FP #2558, each with strict positive/negative tests (+ ReDoS detonation for new quantified regexes) intests/extraction/languages/test_<lang>_strict.py. → DONE: wave 1 fix(core-engine): Rosetta batch 3 wave 1 — five registry-regex fixes with no corpus movement (#2669) #2677 (go/kotlin/swift/groovy + groovy func_start: statement keywords (new/return/throw) pass as prefix tokens, so 'throw new Foo(x)' and 'return bar(x)' misdetect as declarations — 8.6% of real branch-1 matches #2676), wave 2 fix(core-engine): Rosetta batch 3 wave 2 — doc-comment pairing, rule over-claims, three None rules (#2669) #2681 (doc family 17 langs, apex apex import rule: re.IGNORECASE neutralises the [A-Z] guard, so every qualified reference (foo.bar) counts as an import #2671, safety_bypasses/io over-claim: four rules count tokens another rule owns (livecode global, lua _G+collectgarbage, fortran COMMON, dockerfile apt-get clean) — the #2659 shape #2675 three langs, html/yaml None rules). yacc: %union type declarations have real record/struct morphology but class_start is wired None #2644 pulled (needs a slicer-layer allowlist change); fortran withdrawn from safety_bypasses/io over-claim: four rules count tokens another rule owns (livecode global, lua _G+collectgarbage, fortran COMMON, dockerfile apt-get clean) — the #2659 shape #2675 (documented intentional double-classification).SELECTis an io keyword there, so part of that 11 is corpus-side, not engine-side. Same caution for tcl (A.1 already took its io 2→1 by dropping the proseopen) and for haskell/livecode/luasafety_bypasses. → all figures were pre-A and the set was incomplete. Post-A: io RED sqlite 9, tcl 7, dockerfile 5 (missed); safety_bypasses RED lua/livecode/haskell 4 and swift/sqlite/html 0 (the low side, entirely missed), amber apex/fortran 3, yaml 1. Split: engine-side regex → safety_bypasses/io over-claim: four rules count tokens another rule owns (livecode global, lua _G+collectgarbage, fortran COMMON, dockerfile apt-get clean) — the #2659 shape #2675 (livecode/lua/fortransafety_bypasses+ dockerfileioall claim tokens another rule owns; all four land on planted — B.3 material). Corpus-side → keyword-rosetta#33 (emptyprobe_bypassin html/sqlite/swift, half-planted yaml, apex risk-idiom collision, sqlite decoy via SELECT). Remainder is ledger, not fix: tclsourcedual import/io, the cleanup-closefamily in c/lua/tcl, haskellunsafePerformIO(unavoidable).ENGINE_REF=pull/N/head, pin bump in the engine PR. → DONE: scoped diff 710 diffs / 0 unexplained; both golden masters blessed (e994d2a); corpus rebless keyword-rosetta#35 merged with ENGINE_REF=pull/2681/head; pin bumped to 216d57ab (full 40-char SHA).Batch C — graph layer (gitgalaxy), parallel with A/B
network_risk_sensor._resolve_targetrewrites./b.sh→//b/sh, looks upsh, builds no edge; zeroes popularity/betweenness/closeness/producer_ratio for shell, powershell, yaml, javascript. Guard already exists ingalaxyscope.py~L1870. → DONE — filed as network_risk_sensor: dependency resolver drops relative imports that carry an extension (./b.sh -> key 'sh'), zeroing every network metric for shell/powershell/yaml/javascript #2668 with the fix shape and the four token forms..//../, skip dot→slash when the trailing segment is a known extension; strict test with the four token forms + typescript/c controls. Add_dependency_capturefor m4include()and yacc#include(scheme: no _dependency_capture — whole DAG missing, and orphan->api conversion can never fire (tech-debt systematically inflated) #2652 shape). → fix(core-engine): graph layer — relative-import resolution (#2668) + m4/yacc dependency capture (#2669 C.2) #2685 MERGED (aacfe5da). Shipped as ordered lookup forms rather than a known-extension gate — literal path first, dot-rewrite last — which needs no extension set in the sensor and cannot regress (272-case differential vs the legacy implementation: 26 changes, allNone→correct or wrong→correct). m4/yacc captures included. New bug found while attributing the diff: galaxyscope popularity tally: a bare filename import raises popularity on every same-stemmed file in the repo, unscoped by language or directory (#2540's shape, in the tally instead of the DAG) #2684 (the popularity tally credits every same-stemmed file in a scan — fortran USE targets resolve case-sensitively in the dependency DAG (uppercase legacy style loses the whole import graph) #2540's shape in the tally rather than the DAG)../x.jsimports gain edges; the diff must be graph-only. Corpus rebless PR; remove m4/yacc fromno-dependency-capture-languages. → DONE: diff verified graph-only (no extraction-signal column moved); both golden masters blessed (160 zero-dep / 165 full-precision, byte-identical to the pre-bless attribution); corpus rebless keyword-rosetta#38 MERGED withENGINE_REF=pull/2685/head; ledger entry retired (languages_seenemptied,still_reproducesfalse); bias report red 270 → 236 with all 38 band changes improvements.ENGINE_REFreset open as keyword-rosetta#39; pin bump still owed after it merges.Batch D — design pass (gitgalaxy)
tier: T1 onlyblocked on A, B, C mergedcontrol_flow_ratiodivides bystructural_boundaries, which the corpus never plants, gates or displays — branch is pinned at 3-4 while the denominator ranges 0-45, so "normalise against planted branch count" cannot help. 92 = composites of inputs that are already ledgered (E.1 just needs to follow derivation edges). 5 = slicer segmentation. 15 = the real question: mainstream languages whose inputs are all in band but whose composite is not, i.e. formula non-linearity. Also tested and REJECTED the median-mixes-populations hypothesis (procedural-only median moves the counts by 0-1 cells).__global_context__bucket counted as a function in 5 languages, diluting every per-function descriptor) and ada: a single typed parameter counts as 3 args — the comma-free whitespace-split fallback splits 'Env : Integer' into three tokens #2692 (ada counts one typed parameter as three via a whitespace-split fallback). D.1's own recommendation to plantstructural_boundarieswas withdrawn: it is a per-language vocabulary tally, not a structural count, so planting cannot equalise it.Batch E — bookkeeping
bias_report.py/language_deviations.pymark a red cell "explained" when a validated entry names that metric+language; exit code = epic close criterion. → keyword-rosetta#40. 444 out-of-band cells, 220 already accounted for (116 ledgered, 92 derived, 12 undefined), 224 genuinely unexplained — the ledger was carrying 116 answers the report never read, machine-readable only because A.4 normalised thesignalfields.--gateexits nonzero while anything is unexplained (off by default;verify.ymlunaffected).control_flow_ratio(21 cells) deliberately left unexplained rather than marked derived, because its denominatorstructural_boundariesis unplanted — see Design (D.1): shape-descriptor comparability — the 160 cells decompose into five mechanisms, only 15 of which are a real design question #2689 bucket B.bias_data.json+ ledger (before/after bands, buckets, owning batch). Run after each batch regen. rosetta[jcl]: cross-language consistency — 13 red / 7 amber metrics, 2 ledgered shapes #2581's jcl comment is the template. → DONE: keyword-rosetta#43.tools/issue_status.pygenerates each language's status comment frombias_data.json+ ledger with the gate's own verdicts; posted to all 46 (rosetta[abap]: cross-language consistency — 3 red / 3 amber metrics, 2 ledgered shapes #2561–rosetta[zig]: cross-language consistency — 4 red / 2 amber metrics, 5 ledgered shapes #2607). Resolves issues by title search, not a stored map.generate the 41 missing §10 capstones→ re-scoped by docs: rosetta capstones for the two languages that qualify (#2669 E.3) #2696: a capstone is written when a language's tracking issue closes, as part of closing it (thelanguage-statusskill forbids a §10 before a real sweep). abap + groovy delivered; shell needs §1–§9 first. Standing rule, owned by F.6.Batch F — the last 152, one cause family per session
approved 2026-09-04Plan: https://claude.ai/code/artifact/0f9f00d4-818e-4895-9e52-7ceb5fa4fc4d. State at approval:
bias_report.py --gateunexplained = 152 (444 → 224 → 175 → 152), corpus main 6d26261 vs engine a334839. The regen is free and automatic now, so the unit of work is a cause family, not a batch-and-regen. Each session ends with one number here: unexplained before → after, read from corpus main the next morning.keyword_hits17,coding_loc13,total_loc12,token_mass7 = 49 cells). Decision: out of the gate. They measure how long the 12-probe program came out, which the corpus does not control (mainstream languages all sit within a few % of the median; the out-of-band tail is markdown/m4/yacc/jcl/css/html/dockerfile/makefile/yaml/sqlite short, haskell/scheme dense). Report them as a context group, excluded from banding and--gate; say so in SPEC.md + GATING.md. Plus the length-leak check: for each derived metric, over the languages whose planted inputs for it are all on the median, correlate the metric againstcoding_loc; a strong correlation is ONE engine finding on that formula (cite the source line, asDERIVED_INPUTSdoes), not N language cells. Known candidates:dependency_density(= import / (coding_loc × control_flow_ratio)),cog_raw's LOC term,structural_mass'sloc/50,risk_tech_debtLOC normalisation (risk formulas: audit language-tier membership (embedded_python lands tier3) + decide how rosetta bias reporting treats documented Fc/Irc tier constants #2653's note). Each flag becomes a UEF small-file normalization isn't achieving its intent — redesign scoring so identical intent scores identically regardless of file size (design pass for Fable) #2655-style design question, filed as an engine issue, not fixed in this PR. Expected: 152 → ~103 before any leak is acted on.dependency_density10,dependency_links2,betweenness_score2):dependency_density→ (import,coding_loc,control_flow_ratio),dependency_links→import, betweenness → the DAG inputs, each with the record_keeper/sensor line cited. Same keyword-rosetta tools PR as F.1. markdown'sdependency_density0.75 with a None import rule does not fit the formula — send it to F.5 if it survives. Expected 8–10 of 14 become derived.risk_*cells with every input in band; ~20 are tiers). Evidence:risk_tech_debtis byte-identical (29.88) across exactly the engine's tier-1 set {csharp, dart, go, java, rust, swift, typescript};risk_documentationsteps 29.9 / 40.8 / 55.8 by tier with doc/ownership on plant. Decision: option (a) —bias_report.pydivides Fc/Irc out before banding, raw values stay inbias_data.json; plus the membership audit risk formulas: audit language-tier membership (embedded_python lands tier3) + decide how rosetta bias reporting treats documented Fc/Irc tier constants #2653 already narrowed (embedded_python is python). Classify the 13 non-tier cells in the same session:risk_api_exposure/risk_documentationat 0 for ada/haskell/sqlite/yaml/dockerfile (theapi == 0short-circuit A.2 met in css),risk_concurrencyon a zero median for agc_assembly/swift,risk_stabilitymarkdown. Output: design comment on risk formulas: audit language-tier membership (embedded_python lands tier3) + decide how rosetta bias reporting treats documented Fc/Irc tier constants #2653, then one corpus tools PR, and an engine PR only if membership changes.raw_state_slop_orphans16,raw_arch_api10,def_encapsulation7,encapsulation_ratio5,state_slop_duplicates1 = 39). Outputs of galaxyscope's Contextual Baseline Fix, mostly on no-call-graph languages (dockerfile, makefile, markdown, yaml, sqlite, jcl, css, html) plus a mainstream tail (python, go, perl, zig, javascript). Method:galaxyscope --db-only --debug, read[WORKER-TRACE] extracted functions forper language (CLAUDE.md recipe), sort into (i) no call graph so every probe is an orphan, (ii) orphan→api conversion via popularity, (iii) genuine over-count (orphan census counts non-function shapes on non-call-graph languages, making orphan→api conversion unauditable #2547 shape). Verify (iii) on language-crucible before filing — B.2's lesson. Expected: one ledger family for the no-call-graph languages (~25 cells), a few plants, at most one engine issue.classes_foundcobol/css/dockerfile/jcl/kotlin,class_startcobol/css/jcl/yaml,argsm4,globalscsharp,high_risk_executionyacc,state_mutationyaml,testyaml,functions_founddockerfile/html/sqlite, plus whatever F.2 leaves. Per cell: reproduce withverify_language.py <lang> --report, one paragraph of cause, propose plant / rule fix / ledger; mechanical check = the change moves exactly that cell and nothing else in the manifest. yacc: %union type declarations have real record/struct morphology but class_start is wired None #2644 (yaccclass_start) stays blocked on the detector allowlist and may end as a ledgered n/a. One corpus PR per wave of accepted verdicts; engine cells filed with fix shapes.tools/issue_status.py <lang> --postfor languages that moved; close any language whoselanguage_deviations.pyexits 0, writing its capstone as part of closing (E.3's rule); reopen any closed language that no longer passes (decision 2026-09-04: F.6 owns reopening automatically — today cobol rosetta[cobol]: cross-language consistency — 4 red / 8 amber metrics, 5 ledgered shapes #2567 and jcl rosetta[jcl]: cross-language consistency — 13 red / 7 amber metrics, 2 ledgered shapes #2581 fail the gate, abap rosetta[abap]: cross-language consistency — 3 red / 3 amber metrics, 2 ledgered shapes #2561 drifted to 1 amber). apex, matlab and solidity qualify for closure today.Order is by cells closed per decision: F.1+F.2 (one PR, → ~95) → F.3 (→ ~75) → F.4 (→ ~45) → F.5 (→ ~0), F.6 throughout. Housekeeping done at approval: #2544 + #2558 closed (shipped in #2677, comma-list
Closes), keyword-rosetta#17 closed (40/40 migrated),KEYWORD_ROSETTA_REFvariable deleted.Stacking rules (unchanged from GATING.md, restated so no session has to rediscover them)
rosetta:rebless-owedwhen it moves the corpus). NoENGINE_REF, no pin.tmpcomponent.