Untangle tuios
tuios refactor, status at 12:30 on 11 November 2026

Untangle tuios

One pass over the whole codebase so that a change lands in one place, state is explicit, nothing is copied, more is configurable, and tuios costs less CPU and memory. An audit listed every problem first. The fixes land as small pull requests, each reviewed before it goes in.

123findings from six audit lanes
12root fixes in the decision log
40refactor pull requests so far
9workers in tuios panes
Pull request pipeline
Landed on mainIn the train, CI runningOpen, next train

How the work flows

The audit changed nothing. Its findings became twelve root fixes, each written above the problems it removes. Workers build the fixes; the lead reads every diff and lands them in stacked batches.

still something worth fixingnothing leftAudit6 lanes, 123 findingsDecision log12 root fixesFix wavessmall reviewed PRsTrainsstacked, landed togetherRe-auditDone
11 November 202609.20Six auditors startNo code changes11.00123 findings inDecision log written11.40Go 1.27.4 landsCI unblocked12.10Train bb lands11 pull requests onmain12.30ovnfs adopted219 old worktreesremoved13.00Train bd in CI17 pull requests

Where the pull requests are

Each pull request, by the root fix it belongs to. The band shows how many sit in each state; the chips below link to GitHub.

Bug fixes → Landed on main: 6Bug fixes → In the train: 5Bug fixes → Open for the next train: 3Option spec R3 → In the train: 3Option spec R3 → Open for the next train: 1Action table R2 → In the train: 2Action table R2 → Open for the next train: 4Tests R10 → Open for the next train: 5Cheap hooks R12 → In the train: 3Cheap hooks R12 → Open for the next train: 1Shared helpers R9 → Open for the next train: 4Agent state R4 → In the train: 2Build → Landed on main: 1Bug fixes 14Landed on main 7In the train 15Open for the next train 18Option spec R3 4Action table R2 6Tests R10 5Cheap hooks R12 4Shared helpers R9 4Agent state R4 2Build 1
LandedIn the trainOpen

The twelve root fixes

Each square is one planned step: filled when it has landed, outlined in colour when it has a pull request, grey when it is still planned.

What depends on what

The test fixture comes first because the old tests set model fields directly, so every state change would rewrite hundreds of them. The option spec is what makes "everything configurable" cheap.

R10 Test fixtureR1 One overlay tableR6 State grouped by ownerR7 One list stateR2 One action tableR3 Option specEverything configurableR5 Wire types out of thedaemonR4 Agent state machineRex bridge, laterR8 Cell frameLess CPU per frameR12 Cheap hooksR9 Shared helpersR11 Comment sweep

Cell frame spike: CPU time per frame

Benchmark on arch-btw, same machine and rounds for both paths. Each bar is the new cell path as a share of today's string path, which is the full width. Bytes written to the terminal are identical.

ScenarioAfter, as a share of beforeBefore
Keystroke, 9 floating panes
904 µs -53%
1941 µs
Keystroke, 9 tiled panes
1163 µs -44%
2082 µs
Output flood, 9 panes
11.9 ms -21%
15.1 ms
97 M to about 16 Minstructions per hook event: a full tuios start today, against the socket forwarder (estimate)
645 to 326allocations at process start in the config package, after option defaults became lazy
219stale worktrees removed on the Mac and arch-btw; new branches use copy-on-write ovnfs checkouts

The board

The tuios task board of the workers' session, as it stands. 36 cards.

To do 15
  • t2R3-6 One Settings constructor, config.Global removed
  • t3R3-7 Daemon timings become [daemon] options
  • t4R2-1 and R2-2 The action table and the handler table
  • t5Config candidates: add the top options from the audit
  • t10R4 agent track and transition table (steps 4 to 10)Blocked: waits for guios #1819 and #1677
  • t11R5 wire types out of the daemon packageBlocked: needs a quiet window and a guios rebase the same day
  • t14R8 ordered PRs after the spike
  • t19R10 port internal/app tests batch by batch with each state refactor
  • t20R1 one overlay table
  • t21R6 client state grouped by owner
  • t22R7 one list state and one line editor
  • t30R11 comment sweep, one pass per package
  • t31Program icons in the rail and dock (kitty graphics, configurable)
  • t32Rex ideas: skill text, whoami, host-native opens, rex bridge prototype
  • t33ovnfs: prune preview, push action, new checkout at a branch, review through the checkout remote
Doing 11
  • t1R3-4b Settings resolve for the remaining sections (with ZeroRule)inputcfg
  • t9R12 hook forwarder and follow-ups (#1892 #1895 #1897 #1908)session
  • t13R8 cell frame spike, gate 2 on the live clientrender
  • t17B13 scrolling layout cascades panes made with no client attachedappstate
  • t23R9 helper dedup: id shorteners, hex colour, small generics, platform files, dead codelibs
  • t25R10 e2e wait helpers: fold the next family, then loops in the 20 flakiest filestests
  • t27sketch: port pele 1.13.0sketch
  • t28GitHub triage: issues, PRs, discussions, CI failurestriage
  • t34Task board: card preview and attachments (plan first)board
  • t35R9 short-id helper (branch untangle/short-id, 113 files, parked)libsBlocked: parked by the lead: 113 files against about 25 open PRs; lands with the R5 wire-type move, then I rebase
  • t36R3-6 Resolve, no config.Globalinputcfg
In review 10
  • t6R3 steps 1, 2, 5, 4a (#1884 #1885 #1890 #1912)inputcfg
  • t7R2 steps: sub-menu, palette, copy motions, pending, browser (#1891 #1893 #1896 #1899 #1902)inputcfg
  • t8CLI target flags declared once (#1907)inputcfg
  • t12R4 state package and harness aliases (#1883 #1894)session
  • t15Fuzzer routes input, oracle gaps closed, plus the copy-mode drag fix (B11)appstate
  • t16B12 tape manager clears the docksappstate
  • t18R10 app test fixture (#1898)appstate
  • t24R9 atomic write, home expansion, shell quoting (#1900 #1904 #1905)libs
  • t26R10 e2e waits and the diff ratchet (#1909 #1910 #1911)tests
  • t29ovnfs plugin and ship fixes (#1901 #1903), Windows Ctrl+C (#1882)triage

The crew

Full Claude sessions in tuios panes. The lead (Fable 5.2) plans, reviews every diff and lands. Heavy test runs go to arch-btw.

renderOpus 5.5At rest
Cell frame spike
  • R8 cell frame spike, gate 2 on the live client
appstateOpus 5.5Working
Test fixture, fuzzer, layout bugs
  • B13 scrolling layout cascades panes made with no client attached
sessionOpus 5.5Working
Agent state, cheap hooks
  • R12 hook forwarder and follow-ups (#1892 #1895 #1897 #1908)
inputcfgOpus 5.5Working
Option spec, action table
  • R3-4b Settings resolve for the remaining sections (with ZeroRule)
  • R3-6 Resolve, no config.Global
libsSonnet 5.5At rest
Helper deduplication
  • R9 helper dedup: id shorteners, hex colour, small generics, platform files, dead code
  • R9 short-id helper (branch untangle/short-id, 113 files, parked)
testsSonnet 5.5At rest
Bug fixes, e2e waits
  • R10 e2e wait helpers: fold the next family, then loops in the 20 flakiest files
triageOpus 5.5At rest
Issues, pull requests, CI failures
  • GitHub triage: issues, PRs, discussions, CI failures
sketchOpus 5.5Needs input
pele 1.13 port for sketch
  • sketch: port pele 1.13.0
boardOpus 5.5Working
Card preview and attachments
  • Task board: card preview and attachments (plan first)

Bugs the work turned up

Each fix has a test that fails without it. Three audit claims were checked and withdrawn as not bugs.

Open points