Skip to content

[Types] LLM-driven type-error transform capstone#7407

Open
keithharvey wants to merge 13 commits intobeyond-all-reason:masterfrom
keithharvey:fmt-llm
Open

[Types] LLM-driven type-error transform capstone#7407
keithharvey wants to merge 13 commits intobeyond-all-reason:masterfrom
keithharvey:fmt-llm

Conversation

@keithharvey
Copy link
Copy Markdown
Contributor

@keithharvey keithharvey commented Apr 11, 2026

Part of BAR type-error cleanup. Final stage: deterministic transforms + env layer + LLM type-fix pass.

Commits

# Commit What it does
1 06c789ea46 env: expose detached BAR modules to widget/gadget sandbox expose detached BAR modules to widget/gadget sandbox
2 af84ac4e04 deps: add kikito/i18n.lua as lux dependency add kikito/i18n.lua as lux dependency
3 f327f4e968 gen(hand): integration tests return-table shape luaui/Tests + luaui/TestsExamples → return-table shape; dbg_test_runner reads hooks from the returned table
4 973c0aee84 gen(hand): inline luassert and busted LuaCATS types vendored LuaCATS/busted + LuaCATS/luassert type annotations under types/ (pending lumen-oss/lux#953)
5 5e0dc1b41e gen(stylua): initial formatting of entire codebase stylua across the entire codebase
6 894373988a gen(bar_codemod): bracket-to-dot x["y"] → x.y, ["y"]= → y= via full_moon AST rewrite
7 fc0c52e504 gen(bar_codemod): rename-aliases deprecated Spring API aliases (GetMyTeamID → GetLocalTeamID, etc.)
8 c64f7be008 gen(bar_codemod): detach-bar-modules Spring.{I18N,Utilities,Debug,Lava,GetModOptionsCopy} → bare globals
9 4cd052514c gen(bar_codemod): i18n-kikito vendored gajop/i18n → kikito/i18n.lua via lux dependency
10 6d08a3382b gen(bar_codemod): spring-split Spring.X → SpringSynced/SpringUnsynced/SpringShared.X per @context
11 9db43c4a63 env(llm): fmt-llm-source preparation for the LLM run .emmyrc.json globals, types/* stubs, busted mock, CI gate, manual fixes
12 76aec3f928 gen(llm): type-error triage (127 → 38 errors) parallel LLM workers applying SKILL.md fix recipes per file chunk
13 05f7331510 git-blame-ignore-revs: add transform commits register transform commits with git blame

Triage run

baseline_errors=127
final_errors=38
chunks=6
model=claude-sonnet-4-6
timestamp=2026-04-14T18:49:45Z

Branch Topology

All branches in the BAR type-error cleanup stack. Regenerated deterministically by just bar::fmt-mig-generate. Generated 2026-04-14 18:58:04 UTC.

Leaves — each targets master, mergeable independently:

Branch Command Diff vs master Units
fmt stylua 1421 files, +178457 −184495 ✅ pass
mig-bracket bar-lua-codemod bracket-to-dot 341 files, +7632 −7632 ✅ pass
mig-rename-aliases bar-lua-codemod rename-aliases 164 files, +352 −352 ✅ pass
mig-detach-bar-modules bar-lua-codemod detach-bar-modules 173 files, +1434 −1301 ✅ pass
mig-i18n bar-lua-codemod i18n-kikito 19 files, +105 −1187 ✅ pass
mig-spring-split bar-lua-codemod spring-split 760 files, +9591 −9587 ✅ pass
mig-integration-tests bar-lua-codemod integration-tests 21 files, +1230 −1151 ✅ pass
mig-busted-types bar-lua-codemod busted-types 12 files, +1501 −0 ✅ pass

Rollups — composite branches stacking the leaves and (for fmt-llm) the env + LLM layers:

Branch Diff vs master Diff vs mig Units
mig 1452 files, +189169 −194574 ✅ pass
fmt-llm 1480 files, +189970 −194795 126 files, +861 −281 ✅ pass

@keithharvey keithharvey force-pushed the fmt-llm branch 2 times, most recently from f4467f5 to cceb22b Compare April 12, 2026 01:10
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 12, 2026

Integration Test Results

0 tests   - 16   0 ✅  - 8   0s ⏱️ -4s
0 suites  -  1   0 💤  - 8 
0 files    -  1   0 ❌ ±0 

Results for commit 05f7331. ± Comparison against base commit 5a1fd3e.

♻️ This comment has been updated with latest results.

@keithharvey
Copy link
Copy Markdown
Contributor Author

Integration tests are passing, it's a lie because of the engine version. I could zip up the engine and run a custom workflow every time I push this to prove that, but I'm not gonna.

@keithharvey keithharvey force-pushed the fmt-llm branch 3 times, most recently from e21ffa5 to c4ea6c1 Compare April 14, 2026 16:40
Add Utilities, I18N, Debug, Lava, and GetModOptionsCopy to the
System tables in luaui/system.lua and luarules/system.lua so that
widgets and gadgets can access them after detach-bar-modules moves
them off the Spring table.

Also add .luarc.json globals and type stubs for LSP support.
Replaces the vendored gajop/i18n fork with the upstream i18n package
via lux. The mig-i18n branch applies the codemod that rewrites the
wrapper and call sites to use this dependency.
Restructures the 20 files under luaui/Tests/ and luaui/TestsExamples/
from bare-global hook declarations to a return-table shape, and
updates the dbg_test_runner widget to read test hooks from the table
returned by the chunk.

Motivation: the pre-existing shape required the test files to run
under setfenv(chunk, testEnvironment) and define `function test()`,
`function setup()`, etc. as bare module-level globals that setfenv
redirected into the environment. That works at runtime but emmylua
can't model the sandboxing — it sees 20 files declaring project-wide
globals like `test`, `setup`, `widget`, `unitID`, `initialCameraState`,
etc. To analyze the test files, .emmyrc.json had to blacklist both
test directories under workspace.ignoreDir — a kludge on clearly-ours
code. Lives on its own leaf so the convention change can be discussed
in isolation.

Shape change, per file:
  function skip()    return ... end        ─┐
  function setup()   ... end                 │   return {
  function test()    ... end                 ├─▶   skip = function() return ... end,
  function cleanup() ... end                ─┘     setup = function() ... end,
                                                   test = function() ... end,
                                                   cleanup = function() ... end,
                                                 }

Cross-hook shared state (e.g. `widget`, `initialCameraState`, mocks
whose .remove() gets called in cleanup) now declared as file-scope
locals above the return block, so the hook closures capture them
without leaking the names into emmylua's project globals.

Helper functions (runCritterTest, runDistanceTest, test_factory_*,
sanityChecks/failingTests/etc. in selftests) converted from bare
globals to `local function` above the return block — they're only
called from other hooks in the same file.

Runner patch — luaui/Widgets/dbg_test_runner.lua, loadTestFromFile:
  - capture the return value of pcall(chunk)
  - require it to be a table
  - merge its keys into testEnvironment so runTestInternal still reads
    bare `skip`/`setup`/`test`/`cleanup` under setfenv(testEnvironment)
Vendored LuaCATS annotations for busted/luassert to provide
IntelliSense for the unit-test surface. Lives on its own leaf so the
discussion around 'vendoring LuaCATS types' can happen in isolation —
prior pushback on the same direction in an earlier unit-testing PR
makes this the right place to litigate it rather than burying it in a
broader env commit.

Why vendored instead of declared as a Lux dep: Lux does not yet
support pulling LuaCATS annotations from library deps, and quick
attempts to wire this up in Lux failed. Upstream tracking issue:
lumen-oss/lux#953 — once that lands, these
directories should be deleted in favor of declaring busted as a
normal Lux dev-dep.

Sources (pinned SHAs):
  - types/busted/   https://github.com/LuaCATS/busted
                    @ 5ed85d0e016a5eb5eca097aa52905eedf1b180f1
  - types/luassert/ https://github.com/LuaCATS/luassert
                    @ d3528bb679302cbfdedefabb37064515ab95f7b9

See types/busted/provenance.md and types/luassert/provenance.md for
per-directory upstream refs + license status.
Env layer that sits between `mig` and the LLM triage pass. Creates
the emmylua config, per-class type stubs, the CI gate, source fixes
for bugs the tightened globals list unmasks, and a type stub for the
integration-test DSL.

Single commit on `fmt-llm-source`. Two concerns that used to live
here have been split off into their own leaf branches for isolated
PR discussion:

  - Vendored LuaCATS busted+luassert types → mig-busted-types
    (carried-commit leaf off busted-types-curated)
  - Integration-test return-table restructure + runner patch →
    mig-integration-tests (carried-commit leaf off
    integration-tests-curated)

Both live in TRANSFORMS now, so mig composes them in, and this env
commit assumes both landed. If either leaf gets rejected, a follow-up
env commit re-adds its compensating kludge (busted globals +
`spec/` ignoreDir for rejected busted-types; `luaui/Tests`/
`luaui/TestsExamples` ignoreDir + delete `types/Test.lua` for
rejected integration-tests).

Contents:
  - .emmyrc.json: scoped globals (engine sandbox, BAR module globals
    from detach-bar-modules, BAR sandbox entries, handful of
    BAR-defined CMD_*). Busted framework names intentionally absent —
    covered by mig-busted-types. `workspace.ignoreDir` does not list
    luaui/Tests or luaui/TestsExamples — mig-integration-tests makes
    those files analyzable.
  - types/Test.lua (new, ---@meta): integration-test DSL type
    declarations. Signatures extracted from the inline `Test` table
    in luaui/Widgets/dbg_test_runner.lua:662 + extras from
    common/testing/test_extra_utils.lua.
  - types/*.lua: BAR-defined class stubs (Widget, Gadget, Addon,
    UnitDef, Callins, GL, LuaShader/Module, VBO/VAO, BarLuaShader,
    Spring augments, etc.).
  - .github/workflows/type_check.yml: CI gate running emmylua_check.
  - Source fixes surfaced by tightening:
    - luaui/system.lua: Commands = Commands → Commands = Game.Commands
      (the bare Commands global was a dangling reference previously
      masked by the indiscriminate globals list).
    - luaui/Widgets/gui_pip.lua: forward-decl for `UpdateGuishaderBlur`
      — StartMaximizeAnimation (line 4307) calls it before the
      `local function UpdateGuishaderBlur` definition at line 4310.
  - Small per-file type/source cleanups carried over from the prior
    LLM pass.

Per PR review by Watch The Fort: globals are a code smell outside
engine-defined tables. Scope kept to declared globals that are
either (a) engine-provided sandbox members, (b) BAR module globals
intentionally hoisted off Spring.* by detach-bar-modules, or
(c) BAR-defined custom command constants with known providers.
Generated by parallel claude-sonnet-4-6 workers dispatched by
scripts/codemod/llm-type-triage.sh, applying fixes per SKILL.md categories.
Single pass, no iteration — categories that don't shrink the count
are a signal that SKILL.md needs a new rule.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant