# Maintainers overview (draft) — leeroy-wip rewrite

Generated: 2026-01-25T18:17:34.943Z

This document is a *maintainer-friendly* summary of the PR buckets being carved out of the `leeroy-wip` work.
It lists each PR bucket and a concrete sample of the changes/features/fixes mapped into it.

Sources:
- PR definitions: `docs/commit-audits/happy/leeroy-wip.pr-catalog.draft.md`
- Commit → PR mapping: `docs/commit-audits/happy/leeroy-wip.pr-assignment.working.tsv`
- Rewrite execution status/order: `docs/commit-audits/happy/leeroy-wip.rewrite-status.tsv`

Current rewrite status (bucket count):
- completed: 3
- deferred: 1
- in_progress: 1
- pending: 32

---

## PR01 — Foundations / DevX
Status: completed (stack #01)

Changes/features/fixes (examples; 19 commits mapped):
- chore(crypto): patch react-native-libsodium
- test(deps): add @types/react-test-renderer
- chore(config): harden app variant defaults
- fix(dev): gate CLI detection logging
- chore(test): define __DEV__ for vitest
- docs: add AGENTS.md symlink + update CLAUDE.md
- chore(deps): align react-test-renderer with react
- chore(format): replace stray tabs with spaces
- fix(i18n): improve untranslated literal scan parsing
- docs: add AGENTS.md symlink
- test(happy): run cli and server checks from root scripts
- test(happy-cli): reset modules for runtime override
- …and 7 more small commits/fixups in this bucket

## PR02 — UI modal/overlay/popover system (native + web) + Expo web modal behavior
Status: completed (stack #02)

Changes/features/fixes (examples; 19 commits mapped):
- fix(command-palette): include navigate dependency
- refactor(ui): unify list selectors and modal primitives
- fix(agent-input): use compact permission badges
- fix(autocomplete): remove debug suggestion logs
- feat(agent-input): add configurable action bar layout
- fix(modal): prevent stacked modal touch-blocking on iOS
- fix(ui): localize error alerts
- refactor(ui): improve item rendering and action menu timing
- refactor(ui): add modal + popover overlay primitives
- fix(popover): allow web fixed positioning types
- fix(ui): apply small review fixes
- test(modal): make backdrop z-index assertion safer
- …and 7 more small commits/fixups in this bucket

## PR38 — UI list primitives + pending UI polish
Status: completed (stack #03)

Changes/features/fixes (examples; 1 commits mapped):
- expo-app(ui): add list/pending primitives and polish

## PR03 — i18n foundation sweep (optional)
Status: deferred (stack #04)

Changes/features/fixes (examples; 4 commits mapped):
- refactor(i18n): separate translation types and content
- refactor(i18n): update translations and tooling
- refactor(i18n): replace remaining UI literals
- expo-app(i18n): add device locale helpers + update translations

## PR04 — Auth + storage scoping
Status: in_progress (stack #05)

Changes/features/fixes (examples; 5 commits mapped):
- fix(auth): harden tokenStorage web persistence
- feat(persistence): scope storage and validate draft modes
- fix(auth): surface auth failures and gate unauth routes
- fix(expo-app): avoid hooks order violation on redirect
- cli(auth): add --no-open to skip browser open

## PR05 — Persistence / drafts
Status: pending (stack #06)

Changes/features/fixes (examples; 1 commits mapped):
- docs(persistence): update profile schema version comment

## PR06 — Settings: API keys + experiments + settings screens
Status: pending (stack #07)

Changes/features/fixes (examples; 9 commits mapped):
- fix(settings): make parsing tolerant for profiles
- feat(settings): add api keys and experiment toggles
- feat(api-keys): add saved API keys UI
- feat(settings): expose per-experiment toggles
- feat(experiments): gate Zen, file viewer, and voice auth flow
- refactor(zen): avoid todo variable shadowing
- fix(i18n): localize session settings item
- fix(settings): include Codex resume in master experiment toggle
- fix(i18n): translate Spanish experiment subtitles

## PR07 — Env var templates + preview/resolution end-to-end
Status: pending (stack #08)

Changes/features/fixes (examples; 3 commits mapped):
- feat(env): add env var template parsing
- fix(env): improve remote env resolution and previews
- feat(env): update env var list, cards, and preview modal

## PR15 — preview-env end-to-end
Status: pending (stack #09)

Changes/features/fixes (examples; 3 commits mapped):
- feat(rpc): add preview-env handler
- test(cli): accept lowercase preview-env keys
- fix(cli): allow lowercase preview-env keys

## PR08 — Profiles feature
Status: pending (stack #10)

Changes/features/fixes (examples; 3 commits mapped):
- fix(profiles): harden routing, grouping, and editing
- feat(profiles): add API key requirements flow
- fix(profiles): align experimentsEnabled for built-in profiles

## PR09 — Secrets / vault
Status: pending (stack #11)

Changes/features/fixes (examples; 6 commits mapped):
- feat(sync): add secrets + terminal settings primitives
- feat(secrets): add secrets management + requirement resolver
- fix(secrets): tighten callback deps and fix indentation
- fix(settings): keep valid secrets when one entry is invalid
- fix(secrets): hide values when using secret vault
- expo-app(ui): add InlineAddExpander; inline add for secrets/env vars

## PR10 — Permission framework (Claude/cloud baseline)
Status: pending (stack #12)

Changes/features/fixes (examples; 10 commits mapped):
- feat(sync): add permission mode types and mapping
- fix(agent-input): cycle permission mode from normalized state
- fix(sync): restore session permission mode from last message
- fix(sync): persist permission mode timestamp for restart-safe arbitration
- fix(sync): persist permission mode reliably across devices
- fix(typecheck): restore permission imports and Popover web styles
- fix(claude): carry permission mode across remote/local switches
- fix(claude): publish permission mode in session metadata
- fix(permission): avoid no-op permissionModeUpdatedAt bumps
- feat(permission): add permission mode option helpers

## PR11 — Agent permissions (Codex/Gemini): permission modes + allowlists
Status: pending (stack #13)

Changes/features/fixes (examples; 3 commits mapped):
- fix(cli): publish permission mode for codex/gemini sessions
- fix(typecheck): resolve duplicate terminalRuntime and RPC handler types
- cli(permissions): persist per-session allowlists; harden shell approvals

## PR16 — Daemon reliability (ownership + reattach/restart safety)
Status: pending (stack #14)

Changes/features/fixes (examples; 17 commits mapped):
- fix(daemon): do not apply CLI active profile to GUI-spawned sessions
- feat(session): persist profileId in session metadata via daemon spawn
- fix(pr107): harden daemon spawn + align profile schema
- fix(security): redact spawn secrets from daemon logs
- refactor(profiles): remove unwired startup script and local env cache
- refactor(profiles): drop provider config objects
- feat(runtime): support bun for daemon-spawned subprocesses
- refactor(rpc): accept arbitrary env var maps for spawn
- refactor(persistence): remove deprecated tmuxConfig
- feat(daemon): support tmux spawn + harden runtime
- fix(daemon): reattach sessions after daemon restart
- test(daemon): add PID classification + session marker tests
- …and 5 more small commits/fixups in this bucket

## PR17 — CLI reliability (socket/metadata waiters + reconnection + backoff)
Status: pending (stack #15)

Changes/features/fixes (examples; 10 commits mapped):
- fix(socket): restore offline buffering for sends
- fix(logging): gate debug output and redact templates
- fix(pr107): redact profile secrets in doctor + align tmux tmpDir
- fix(env): implement default assignment semantics
- chore(cli): fix gemini daemon block indentation
- fix(rpc): add structured code for missing RPC methods
- test(utils): stabilize serverConnectionErrors retry count test
- test(utils): cover failuresCount with custom backoff
- fix(utils): track failuresCount for custom backoff
- fix(cli): clean up metadata waiters on disconnect

## PR27 — Sync robustness (transport/error parsing + backoff semantics)
Status: pending (stack #16)

Changes/features/fixes (examples; 6 commits mapped):
- refactor(sync): centralize outgoing message metadata
- perf(sync): debounce pending settings writes
- fix(sync): handle non-JSON 400 responses
- fix(sync): guard JSON parsing on disconnect errors
- test(sync): restore stubbed fetch between tests
- fix(sync): avoid hanging invalidateAndAwait on errors

## PR28 — Model modes (per-session selection + persistence)
Status: pending (stack #17)

Changes/features/fixes (examples; 2 commits mapped):
- fix(session): clamp configurable model modes
- feat(storage): persist session model modes

## PR14 — Capabilities end-to-end (protocol + wiring + reliability)
Status: pending (stack #18)

Changes/features/fixes (examples; 17 commits mapped):
- feat(cli-detection): add daemon detect-cli RPC support
- feat(machine): surface detected CLI status
- feat(rpc): add detect-cli handler
- feat(rpc): include tmux in detect-cli
- test(detect-cli): avoid process.env reassignment
- fix(common): handle execFileAsync exit codes
- fix(detect-cli): relax tmux version probe timeout
- refactor(cli): modularize capabilities and env preview
- test(ui): update useCLIDetection hook tests for capabilities
- fix(expo-app): avoid stuck loading in capabilities cache
- fix(happy-cli): parse CLI versions from full output
- test(happy): keep useCLIDetection timestamp stable
- …and 5 more small commits/fixups in this bucket

## PR37 — Agent registry end-to-end (selection + settings + UX helpers)
Status: pending (stack #19)

Changes/features/fixes (examples; 3 commits mapped):
- expo-app(agents): introduce agent registry + UI behavior helpers
- expo-app(settings): wire agent registry into settings
- expo-app(settings): update features toggles for agents/inbox/codex

## PR36 — ACP agents end-to-end (runtimes + replay + tool normalization)
Status: pending (stack #20)

Changes/features/fixes (examples; 5 commits mapped):
- cli(acp): support loadSession + replay capture; normalize tool events
- cli(agents): wire ACP agents into factory/transport registry
- cli(opencode): add OpenCode ACP agent runtime
- cli(codex-acp): add runtime + capability gating
- cli(entry): refactor agent subcommands and startup flags

## PR12 — Tool interaction: AskUserQuestion + ExitPlan native handling
Status: pending (stack #21)

Changes/features/fixes (examples; 10 commits mapped):
- feat(tools): add approve/reject buttons to ExitPlanMode
- fix(tools): support Windows arm64 tool unpacking
- Revert \"fix(tools): support Windows arm64 tool unpacking\"
- fix(ui): respond to plan/question tools via session RPC
- feat(cli): add interaction.respond for AskUserQuestion
- fix(i18n): translate ExitPlanMode strings
- fix(tools): require permission id for ExitPlanMode actions
- test(tools): avoid null permission in ExitPlanToolView tests
- fix(tools): alert when AskUserQuestion permission id is missing
- cli(claude): support AskUserQuestion answers + ExitPlanMode negotiation

## PR39 — Tool UX: normalization + specialized views + tracing
Status: pending (stack #22)

Changes/features/fixes (examples; 4 commits mapped):
- fix(tools): harden ACP tool parsing and titles
- cli(tool-trace): add fixture extraction + CLI script
- expo-app(tools): normalize tool inference + rendering inputs
- expo-app(tools): add specialized tool views + tests

## PR13 — MessageQueueV1 + Pending messages (end-to-end)
Status: pending (stack #23)

Changes/features/fixes (examples; 11 commits mapped):
- feat(queue): add pending message queue UI and send modes
- fix(sync): omit model meta for queued messages
- feat(queue): add server-side pending message pull support
- feat(cli): harden session queue, switching, and lifecycle
- feat(app): add pending queue, discard markers, and capabilities
- refactor(expo-app): remove dead code and dedupe types
- fix(ui): send pending messages before closing modal
- fix(cli): reject invalid messageQueueV1 inFlight
- refactor(queue): simplify stale in-flight reclaim
- fix(expo): harden tool submit and pending send
- cli(api): observe self-broadcasts for pending-queue; add tool tracing

## PR26 — New session wizard end-to-end (wizard + pick flows + machine selection)
Status: pending (stack #24)

Changes/features/fixes (examples; 10 commits mapped):
- fix(new-session): restore standard modal flow
- feat(new-session): add api key selection and wizard extraction
- refactor(new-session): integrate secrets + terminal spawn options
- fix(new): keep pick screens above iOS modal
- fix(new-session): avoid stuck secret requirement modal guard
- fix(expo-app): persist resumeSessionId and harden clipboard paste
- fix(i18n): localize Codex resume dialog
- fix(i18n): move openMachine to connect scope
- feat(new-session): add WizardSectionHeaderRow
- expo-app(secret-requirement): add picker route + modularized modal

## PR19 — Resume end-to-end (inactive resume + session lifecycle)
Status: pending (stack #25)

Changes/features/fixes (examples; 28 commits mapped):
- feat(resume): add resume session option for new sessions
- feat(resume): show resume chip under path in new session
- feat: resume inactive Claude sessions from UI
- refactor(resume): don't require agentSessionId from UI
- feat(fork): enable Codex resume support
- refactor(offline): make offline session stub safer
- fix(codex): disable model override and remove experimental resume
- fix(session): prime agent state for readiness
- feat: resume Claude sessions from UI
- feat(resume): add happy resume and persist vendor resume id
- feat(resume): allow resume-session without agentSessionId
- feat(fork): enable Codex inactive-session resume via codex-reply
- …and 16 more small commits/fixups in this bucket

## PR20 — Claude session reliability (switching + transcript/scanner + local runner)
Status: pending (stack #26)

Changes/features/fixes (examples; 10 commits mapped):
- test(claude): align sessionScanner path mapping
- fix(claude): use hook transcript path across switching
- fix(claude): support -c/-r and avoid session loss on switch
- fix(scanner): tolerate onMessage exceptions
- fix(claude): accept -c as continue flag
- fix: move claudeArgs to end of args array for slash command support
- fix(cli): improve abort error handling to reduce spurious error messages
- fix(claude): trim CLAUDE_CONFIG_DIR overrides
- test(claude): remove stale transcriptPath red-test scaffolding
- …and 1 more small commits/fixups in this bucket

## PR31 — Terminal switching reliability (remote↔local)
Status: pending (stack #27)

Changes/features/fixes (examples; 4 commits mapped):
- fix(terminal): harden remote→local switching input
- fix(claude): forward signals to binary child process
- Add signal forwarding to claudeLocal.ts
- fix(ink): avoid async useInput handler

## PR18 — TMUX end-to-end (headless sessions + attach + settings)
Status: pending (stack #28)

Changes/features/fixes (examples; 12 commits mapped):
- feat(terminal): add Terminal settings + tmux metadata
- fix: tmux parsing/targeting + review feedback
- feat(tmux): support per-instance socket path
- fix(tmux): correct env, tmpdir, and session selection
- feat(terminal): add tmux metadata + attach tooling
- fix(tmux): print attach instructions in correct order
- test(tmux): avoid brittle assertions
- refactor(app): rename tmux/message-send settings under session
- fix(terminal): prevent sessionId path traversal in attachment info
- fix(terminal): clarify missing --happy-starting-mode value
- test(cli): prevent legacy sessionId path traversal
- fix(cli): block legacy sessionId path traversal

## PR32 — Codex approvals + MCP tool interactions (execpolicy + elicitation)
Status: pending (stack #29)

Changes/features/fixes (examples; 7 commits mapped):
- feat: add execpolicy approval option for Codex
- feat(codex): support execpolicy approvals and MCP tool calls
- fix(i18n): add Codex execpolicy button text
- fix(reducer): keep permission messages idempotent
- fix: use runtime execPath for MCP bridge
- fix(codex): use mcp tool call id for approvals
- test(happy-cli): fix timer cleanup and MCP schema mocks

## PR21 — Codex MCP tool-call result correctness
Status: pending (stack #30)

Changes/features/fixes (examples; 3 commits mapped):
- fix(codex): harden MCP command detection
- test(codex): reset transport instances between tests
- fix(codex): preserve falsy MCP tool results

## PR33 — Codex special commands (/clear session reset)
Status: pending (stack #31)

Changes/features/fixes (examples; 1 commits mapped):
- feat: handle /clear command as session reset in codex

## PR30 — Agent error surfaces (Codex/Gemini)
Status: pending (stack #32)

Changes/features/fixes (examples; 4 commits mapped):
- feat(ui): surface Codex/Gemini errors in session UI
- fix(ui): polish Codex and Gemini error messages
- fix(gemini): normalize error details for UI
- refactor(happy-cli): remove unreachable gemini error branch

## PR29 — Sessions & message list UX
Status: pending (stack #33)

Changes/features/fixes (examples; 10 commits mapped):
- fix(session): archive when kill RPC unavailable
- Add copy-to-clipboard button to message blocks
- feat(sessions): group inactive sessions by project
- feat(sessions): add unread badge
- feat(session): add session rename support
- feat(sync): add cross-device unread markers
- fix(expo-app): avoid false homeDir prefix matches
- refactor(expo-app): remove unused optimistic flag
- fix(i18n): localize session error fallbacks
- refactor(sync): simplify path formatting

## PR35 — Friends: UX + reliability
Status: pending (stack #34)

Changes/features/fixes (examples; 2 commits mapped):
- fix(i18n): localize search error
- expo-app(experiments): add inbox friends experiment gate

## PR22 — Server-light flavor (variant + schema/prisma sync)
Status: pending (stack #35)

Changes/features/fixes (examples; 12 commits mapped):
- feat(server): add full/light flavors with sqlite migrations
- fix(server-light): validate PORT and normalize paths
- test(server): fix schema generation sort regex
- fix(server): make build typecheck tests
- fix(server-light): use file URLs for sqlite db
- fix(server): fix server-light typecheck
- fix(server): relax module settings for typecheck
- fix(server): keep light server running
- fix(server): validate HAPPY_SERVER_LIGHT_DATA_DIR for light migrations
- fix(server-light): avoid master secret race
- fix(server-light): harden public file path encoding
- Refactor schema sync and centralize Prisma types

## PR23 — Server: optionally serve UI + public files safely
Status: pending (stack #36)

Changes/features/fixes (examples; 3 commits mapped):
- fix(server): handle missing UI index.html
- test(server): validate processImage resize output
- fix(server): handle missing UI index in error handlers

## PR24 — Storage: S3 env + bucket validation
Status: pending (stack #37)

Changes/features/fixes (examples; 1 commits mapped):
- fix(storage): validate S3_PORT and bucket existence

