happy-stacks 0.6.12 → 0.6.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/docs/commit-audits/happy/_tools/generate-plans.mjs +453 -0
  2. package/docs/commit-audits/happy/_tools/generate-pr-assignment.mjs +430 -0
  3. package/docs/commit-audits/happy/_tools/init-pr-assignment-working.mjs +107 -0
  4. package/docs/commit-audits/happy/leeroy-wip.commit-analysis.md +1849 -0
  5. package/docs/commit-audits/happy/leeroy-wip.commit-export.fuller-stat.md +747 -1
  6. package/docs/commit-audits/happy/leeroy-wip.commit-index.json +11740 -0
  7. package/docs/commit-audits/happy/leeroy-wip.commit-index.tsv +252 -0
  8. package/docs/commit-audits/happy/leeroy-wip.commit-inventory.md +18 -11
  9. package/docs/commit-audits/happy/leeroy-wip.commit-manual-review.md +1236 -92
  10. package/docs/commit-audits/happy/leeroy-wip.maintainers-overview.draft.md +448 -0
  11. package/docs/commit-audits/happy/leeroy-wip.pr-assignment.draft.tsv +252 -0
  12. package/docs/commit-audits/happy/leeroy-wip.pr-assignment.working.tsv +288 -0
  13. package/docs/commit-audits/happy/leeroy-wip.pr-catalog.draft.md +245 -0
  14. package/docs/commit-audits/happy/leeroy-wip.pr-stack-plan.draft.md +350 -0
  15. package/docs/commit-audits/happy/leeroy-wip.rewrite-deferred-fragments.tsv +65 -0
  16. package/docs/commit-audits/happy/leeroy-wip.rewrite-ledger.tsv +56 -0
  17. package/docs/commit-audits/happy/leeroy-wip.rewrite-process.md +240 -0
  18. package/docs/commit-audits/happy/leeroy-wip.rewrite-status.tsv +39 -0
  19. package/docs/commit-audits/happy/leeroy-wip.split-plan.draft.md +93 -0
  20. package/docs/commit-audits/happy/leeroy-wip.topic-buckets.md +76 -0
  21. package/docs/commit-audits/happy/pr-desc.extraction-ledger.tsv +279 -0
  22. package/docs/commit-audits/happy/pr-desc.original.md +0 -0
  23. package/docs/commit-audits/happy/pr-desc.post-audit-extraction-ledger.tsv +54 -0
  24. package/docs/commit-audits/happy/pr-desc.working-document.md +536 -0
  25. package/docs/happy-development.md +18 -1
  26. package/docs/isolated-linux-vm.md +23 -1
  27. package/docs/stacks.md +21 -1
  28. package/package.json +1 -1
  29. package/scripts/auth.mjs +46 -8
  30. package/scripts/daemon.mjs +44 -21
  31. package/scripts/doctor.mjs +2 -2
  32. package/scripts/doctor_cmd.test.mjs +67 -0
  33. package/scripts/happy.mjs +18 -5
  34. package/scripts/provision/linux-ubuntu-review-pr.sh +5 -1
  35. package/scripts/provision/macos-lima-happy-vm.sh +34 -2
  36. package/scripts/review.mjs +347 -124
  37. package/scripts/review_pr.mjs +78 -2
  38. package/scripts/run.mjs +2 -1
  39. package/scripts/stack.mjs +265 -19
  40. package/scripts/stack_daemon_cmd.test.mjs +196 -0
  41. package/scripts/stack_happy_cmd.test.mjs +103 -0
  42. package/scripts/utils/cli/prereqs.mjs +12 -1
  43. package/scripts/utils/dev/daemon.mjs +3 -1
  44. package/scripts/utils/proc/pm.mjs +1 -1
  45. package/scripts/utils/review/detached_worktree.mjs +61 -0
  46. package/scripts/utils/review/detached_worktree.test.mjs +62 -0
  47. package/scripts/utils/review/findings.mjs +133 -20
  48. package/scripts/utils/review/findings.test.mjs +88 -1
  49. package/scripts/utils/review/runners/augment.mjs +71 -0
  50. package/scripts/utils/review/runners/augment.test.mjs +42 -0
  51. package/scripts/utils/review/runners/coderabbit.mjs +54 -10
  52. package/scripts/utils/review/runners/coderabbit.test.mjs +15 -48
  53. package/scripts/utils/review/sliced_runner.mjs +39 -0
  54. package/scripts/utils/review/sliced_runner.test.mjs +47 -0
  55. package/scripts/utils/review/tool_home_seed.mjs +99 -0
  56. package/scripts/utils/review/tool_home_seed.test.mjs +113 -0
  57. package/scripts/utils/stack/cli_identities.mjs +29 -0
  58. package/scripts/utils/stack/startup.mjs +45 -7
  59. package/scripts/worktrees.mjs +8 -5
@@ -0,0 +1,448 @@
1
+ # Maintainers overview (draft) — leeroy-wip rewrite
2
+
3
+ Generated: 2026-01-25T18:17:34.943Z
4
+
5
+ This document is a *maintainer-friendly* summary of the PR buckets being carved out of the `leeroy-wip` work.
6
+ It lists each PR bucket and a concrete sample of the changes/features/fixes mapped into it.
7
+
8
+ Sources:
9
+ - PR definitions: `docs/commit-audits/happy/leeroy-wip.pr-catalog.draft.md`
10
+ - Commit → PR mapping: `docs/commit-audits/happy/leeroy-wip.pr-assignment.working.tsv`
11
+ - Rewrite execution status/order: `docs/commit-audits/happy/leeroy-wip.rewrite-status.tsv`
12
+
13
+ Current rewrite status (bucket count):
14
+ - completed: 3
15
+ - deferred: 1
16
+ - in_progress: 1
17
+ - pending: 32
18
+
19
+ ---
20
+
21
+ ## PR01 — Foundations / DevX
22
+ Status: completed (stack #01)
23
+
24
+ Changes/features/fixes (examples; 19 commits mapped):
25
+ - chore(crypto): patch react-native-libsodium
26
+ - test(deps): add @types/react-test-renderer
27
+ - chore(config): harden app variant defaults
28
+ - fix(dev): gate CLI detection logging
29
+ - chore(test): define __DEV__ for vitest
30
+ - docs: add AGENTS.md symlink + update CLAUDE.md
31
+ - chore(deps): align react-test-renderer with react
32
+ - chore(format): replace stray tabs with spaces
33
+ - fix(i18n): improve untranslated literal scan parsing
34
+ - docs: add AGENTS.md symlink
35
+ - test(happy): run cli and server checks from root scripts
36
+ - test(happy-cli): reset modules for runtime override
37
+ - …and 7 more small commits/fixups in this bucket
38
+
39
+ ## PR02 — UI modal/overlay/popover system (native + web) + Expo web modal behavior
40
+ Status: completed (stack #02)
41
+
42
+ Changes/features/fixes (examples; 19 commits mapped):
43
+ - fix(command-palette): include navigate dependency
44
+ - refactor(ui): unify list selectors and modal primitives
45
+ - fix(agent-input): use compact permission badges
46
+ - fix(autocomplete): remove debug suggestion logs
47
+ - feat(agent-input): add configurable action bar layout
48
+ - fix(modal): prevent stacked modal touch-blocking on iOS
49
+ - fix(ui): localize error alerts
50
+ - refactor(ui): improve item rendering and action menu timing
51
+ - refactor(ui): add modal + popover overlay primitives
52
+ - fix(popover): allow web fixed positioning types
53
+ - fix(ui): apply small review fixes
54
+ - test(modal): make backdrop z-index assertion safer
55
+ - …and 7 more small commits/fixups in this bucket
56
+
57
+ ## PR38 — UI list primitives + pending UI polish
58
+ Status: completed (stack #03)
59
+
60
+ Changes/features/fixes (examples; 1 commits mapped):
61
+ - expo-app(ui): add list/pending primitives and polish
62
+
63
+ ## PR03 — i18n foundation sweep (optional)
64
+ Status: deferred (stack #04)
65
+
66
+ Changes/features/fixes (examples; 4 commits mapped):
67
+ - refactor(i18n): separate translation types and content
68
+ - refactor(i18n): update translations and tooling
69
+ - refactor(i18n): replace remaining UI literals
70
+ - expo-app(i18n): add device locale helpers + update translations
71
+
72
+ ## PR04 — Auth + storage scoping
73
+ Status: in_progress (stack #05)
74
+
75
+ Changes/features/fixes (examples; 5 commits mapped):
76
+ - fix(auth): harden tokenStorage web persistence
77
+ - feat(persistence): scope storage and validate draft modes
78
+ - fix(auth): surface auth failures and gate unauth routes
79
+ - fix(expo-app): avoid hooks order violation on redirect
80
+ - cli(auth): add --no-open to skip browser open
81
+
82
+ ## PR05 — Persistence / drafts
83
+ Status: pending (stack #06)
84
+
85
+ Changes/features/fixes (examples; 1 commits mapped):
86
+ - docs(persistence): update profile schema version comment
87
+
88
+ ## PR06 — Settings: API keys + experiments + settings screens
89
+ Status: pending (stack #07)
90
+
91
+ Changes/features/fixes (examples; 9 commits mapped):
92
+ - fix(settings): make parsing tolerant for profiles
93
+ - feat(settings): add api keys and experiment toggles
94
+ - feat(api-keys): add saved API keys UI
95
+ - feat(settings): expose per-experiment toggles
96
+ - feat(experiments): gate Zen, file viewer, and voice auth flow
97
+ - refactor(zen): avoid todo variable shadowing
98
+ - fix(i18n): localize session settings item
99
+ - fix(settings): include Codex resume in master experiment toggle
100
+ - fix(i18n): translate Spanish experiment subtitles
101
+
102
+ ## PR07 — Env var templates + preview/resolution end-to-end
103
+ Status: pending (stack #08)
104
+
105
+ Changes/features/fixes (examples; 3 commits mapped):
106
+ - feat(env): add env var template parsing
107
+ - fix(env): improve remote env resolution and previews
108
+ - feat(env): update env var list, cards, and preview modal
109
+
110
+ ## PR15 — preview-env end-to-end
111
+ Status: pending (stack #09)
112
+
113
+ Changes/features/fixes (examples; 3 commits mapped):
114
+ - feat(rpc): add preview-env handler
115
+ - test(cli): accept lowercase preview-env keys
116
+ - fix(cli): allow lowercase preview-env keys
117
+
118
+ ## PR08 — Profiles feature
119
+ Status: pending (stack #10)
120
+
121
+ Changes/features/fixes (examples; 3 commits mapped):
122
+ - fix(profiles): harden routing, grouping, and editing
123
+ - feat(profiles): add API key requirements flow
124
+ - fix(profiles): align experimentsEnabled for built-in profiles
125
+
126
+ ## PR09 — Secrets / vault
127
+ Status: pending (stack #11)
128
+
129
+ Changes/features/fixes (examples; 6 commits mapped):
130
+ - feat(sync): add secrets + terminal settings primitives
131
+ - feat(secrets): add secrets management + requirement resolver
132
+ - fix(secrets): tighten callback deps and fix indentation
133
+ - fix(settings): keep valid secrets when one entry is invalid
134
+ - fix(secrets): hide values when using secret vault
135
+ - expo-app(ui): add InlineAddExpander; inline add for secrets/env vars
136
+
137
+ ## PR10 — Permission framework (Claude/cloud baseline)
138
+ Status: pending (stack #12)
139
+
140
+ Changes/features/fixes (examples; 10 commits mapped):
141
+ - feat(sync): add permission mode types and mapping
142
+ - fix(agent-input): cycle permission mode from normalized state
143
+ - fix(sync): restore session permission mode from last message
144
+ - fix(sync): persist permission mode timestamp for restart-safe arbitration
145
+ - fix(sync): persist permission mode reliably across devices
146
+ - fix(typecheck): restore permission imports and Popover web styles
147
+ - fix(claude): carry permission mode across remote/local switches
148
+ - fix(claude): publish permission mode in session metadata
149
+ - fix(permission): avoid no-op permissionModeUpdatedAt bumps
150
+ - feat(permission): add permission mode option helpers
151
+
152
+ ## PR11 — Agent permissions (Codex/Gemini): permission modes + allowlists
153
+ Status: pending (stack #13)
154
+
155
+ Changes/features/fixes (examples; 3 commits mapped):
156
+ - fix(cli): publish permission mode for codex/gemini sessions
157
+ - fix(typecheck): resolve duplicate terminalRuntime and RPC handler types
158
+ - cli(permissions): persist per-session allowlists; harden shell approvals
159
+
160
+ ## PR16 — Daemon reliability (ownership + reattach/restart safety)
161
+ Status: pending (stack #14)
162
+
163
+ Changes/features/fixes (examples; 17 commits mapped):
164
+ - fix(daemon): do not apply CLI active profile to GUI-spawned sessions
165
+ - feat(session): persist profileId in session metadata via daemon spawn
166
+ - fix(pr107): harden daemon spawn + align profile schema
167
+ - fix(security): redact spawn secrets from daemon logs
168
+ - refactor(profiles): remove unwired startup script and local env cache
169
+ - refactor(profiles): drop provider config objects
170
+ - feat(runtime): support bun for daemon-spawned subprocesses
171
+ - refactor(rpc): accept arbitrary env var maps for spawn
172
+ - refactor(persistence): remove deprecated tmuxConfig
173
+ - feat(daemon): support tmux spawn + harden runtime
174
+ - fix(daemon): reattach sessions after daemon restart
175
+ - test(daemon): add PID classification + session marker tests
176
+ - …and 5 more small commits/fixups in this bucket
177
+
178
+ ## PR17 — CLI reliability (socket/metadata waiters + reconnection + backoff)
179
+ Status: pending (stack #15)
180
+
181
+ Changes/features/fixes (examples; 10 commits mapped):
182
+ - fix(socket): restore offline buffering for sends
183
+ - fix(logging): gate debug output and redact templates
184
+ - fix(pr107): redact profile secrets in doctor + align tmux tmpDir
185
+ - fix(env): implement default assignment semantics
186
+ - chore(cli): fix gemini daemon block indentation
187
+ - fix(rpc): add structured code for missing RPC methods
188
+ - test(utils): stabilize serverConnectionErrors retry count test
189
+ - test(utils): cover failuresCount with custom backoff
190
+ - fix(utils): track failuresCount for custom backoff
191
+ - fix(cli): clean up metadata waiters on disconnect
192
+
193
+ ## PR27 — Sync robustness (transport/error parsing + backoff semantics)
194
+ Status: pending (stack #16)
195
+
196
+ Changes/features/fixes (examples; 6 commits mapped):
197
+ - refactor(sync): centralize outgoing message metadata
198
+ - perf(sync): debounce pending settings writes
199
+ - fix(sync): handle non-JSON 400 responses
200
+ - fix(sync): guard JSON parsing on disconnect errors
201
+ - test(sync): restore stubbed fetch between tests
202
+ - fix(sync): avoid hanging invalidateAndAwait on errors
203
+
204
+ ## PR28 — Model modes (per-session selection + persistence)
205
+ Status: pending (stack #17)
206
+
207
+ Changes/features/fixes (examples; 2 commits mapped):
208
+ - fix(session): clamp configurable model modes
209
+ - feat(storage): persist session model modes
210
+
211
+ ## PR14 — Capabilities end-to-end (protocol + wiring + reliability)
212
+ Status: pending (stack #18)
213
+
214
+ Changes/features/fixes (examples; 17 commits mapped):
215
+ - feat(cli-detection): add daemon detect-cli RPC support
216
+ - feat(machine): surface detected CLI status
217
+ - feat(rpc): add detect-cli handler
218
+ - feat(rpc): include tmux in detect-cli
219
+ - test(detect-cli): avoid process.env reassignment
220
+ - fix(common): handle execFileAsync exit codes
221
+ - fix(detect-cli): relax tmux version probe timeout
222
+ - refactor(cli): modularize capabilities and env preview
223
+ - test(ui): update useCLIDetection hook tests for capabilities
224
+ - fix(expo-app): avoid stuck loading in capabilities cache
225
+ - fix(happy-cli): parse CLI versions from full output
226
+ - test(happy): keep useCLIDetection timestamp stable
227
+ - …and 5 more small commits/fixups in this bucket
228
+
229
+ ## PR37 — Agent registry end-to-end (selection + settings + UX helpers)
230
+ Status: pending (stack #19)
231
+
232
+ Changes/features/fixes (examples; 3 commits mapped):
233
+ - expo-app(agents): introduce agent registry + UI behavior helpers
234
+ - expo-app(settings): wire agent registry into settings
235
+ - expo-app(settings): update features toggles for agents/inbox/codex
236
+
237
+ ## PR36 — ACP agents end-to-end (runtimes + replay + tool normalization)
238
+ Status: pending (stack #20)
239
+
240
+ Changes/features/fixes (examples; 5 commits mapped):
241
+ - cli(acp): support loadSession + replay capture; normalize tool events
242
+ - cli(agents): wire ACP agents into factory/transport registry
243
+ - cli(opencode): add OpenCode ACP agent runtime
244
+ - cli(codex-acp): add runtime + capability gating
245
+ - cli(entry): refactor agent subcommands and startup flags
246
+
247
+ ## PR12 — Tool interaction: AskUserQuestion + ExitPlan native handling
248
+ Status: pending (stack #21)
249
+
250
+ Changes/features/fixes (examples; 10 commits mapped):
251
+ - feat(tools): add approve/reject buttons to ExitPlanMode
252
+ - fix(tools): support Windows arm64 tool unpacking
253
+ - Revert \"fix(tools): support Windows arm64 tool unpacking\"
254
+ - fix(ui): respond to plan/question tools via session RPC
255
+ - feat(cli): add interaction.respond for AskUserQuestion
256
+ - fix(i18n): translate ExitPlanMode strings
257
+ - fix(tools): require permission id for ExitPlanMode actions
258
+ - test(tools): avoid null permission in ExitPlanToolView tests
259
+ - fix(tools): alert when AskUserQuestion permission id is missing
260
+ - cli(claude): support AskUserQuestion answers + ExitPlanMode negotiation
261
+
262
+ ## PR39 — Tool UX: normalization + specialized views + tracing
263
+ Status: pending (stack #22)
264
+
265
+ Changes/features/fixes (examples; 4 commits mapped):
266
+ - fix(tools): harden ACP tool parsing and titles
267
+ - cli(tool-trace): add fixture extraction + CLI script
268
+ - expo-app(tools): normalize tool inference + rendering inputs
269
+ - expo-app(tools): add specialized tool views + tests
270
+
271
+ ## PR13 — MessageQueueV1 + Pending messages (end-to-end)
272
+ Status: pending (stack #23)
273
+
274
+ Changes/features/fixes (examples; 11 commits mapped):
275
+ - feat(queue): add pending message queue UI and send modes
276
+ - fix(sync): omit model meta for queued messages
277
+ - feat(queue): add server-side pending message pull support
278
+ - feat(cli): harden session queue, switching, and lifecycle
279
+ - feat(app): add pending queue, discard markers, and capabilities
280
+ - refactor(expo-app): remove dead code and dedupe types
281
+ - fix(ui): send pending messages before closing modal
282
+ - fix(cli): reject invalid messageQueueV1 inFlight
283
+ - refactor(queue): simplify stale in-flight reclaim
284
+ - fix(expo): harden tool submit and pending send
285
+ - cli(api): observe self-broadcasts for pending-queue; add tool tracing
286
+
287
+ ## PR26 — New session wizard end-to-end (wizard + pick flows + machine selection)
288
+ Status: pending (stack #24)
289
+
290
+ Changes/features/fixes (examples; 10 commits mapped):
291
+ - fix(new-session): restore standard modal flow
292
+ - feat(new-session): add api key selection and wizard extraction
293
+ - refactor(new-session): integrate secrets + terminal spawn options
294
+ - fix(new): keep pick screens above iOS modal
295
+ - fix(new-session): avoid stuck secret requirement modal guard
296
+ - fix(expo-app): persist resumeSessionId and harden clipboard paste
297
+ - fix(i18n): localize Codex resume dialog
298
+ - fix(i18n): move openMachine to connect scope
299
+ - feat(new-session): add WizardSectionHeaderRow
300
+ - expo-app(secret-requirement): add picker route + modularized modal
301
+
302
+ ## PR19 — Resume end-to-end (inactive resume + session lifecycle)
303
+ Status: pending (stack #25)
304
+
305
+ Changes/features/fixes (examples; 28 commits mapped):
306
+ - feat(resume): add resume session option for new sessions
307
+ - feat(resume): show resume chip under path in new session
308
+ - feat: resume inactive Claude sessions from UI
309
+ - refactor(resume): don't require agentSessionId from UI
310
+ - feat(fork): enable Codex resume support
311
+ - refactor(offline): make offline session stub safer
312
+ - fix(codex): disable model override and remove experimental resume
313
+ - fix(session): prime agent state for readiness
314
+ - feat: resume Claude sessions from UI
315
+ - feat(resume): add happy resume and persist vendor resume id
316
+ - feat(resume): allow resume-session without agentSessionId
317
+ - feat(fork): enable Codex inactive-session resume via codex-reply
318
+ - …and 16 more small commits/fixups in this bucket
319
+
320
+ ## PR20 — Claude session reliability (switching + transcript/scanner + local runner)
321
+ Status: pending (stack #26)
322
+
323
+ Changes/features/fixes (examples; 10 commits mapped):
324
+ - test(claude): align sessionScanner path mapping
325
+ - fix(claude): use hook transcript path across switching
326
+ - fix(claude): support -c/-r and avoid session loss on switch
327
+ - fix(scanner): tolerate onMessage exceptions
328
+ - fix(claude): accept -c as continue flag
329
+ - fix: move claudeArgs to end of args array for slash command support
330
+ - fix(cli): improve abort error handling to reduce spurious error messages
331
+ - fix(claude): trim CLAUDE_CONFIG_DIR overrides
332
+ - test(claude): remove stale transcriptPath red-test scaffolding
333
+ - …and 1 more small commits/fixups in this bucket
334
+
335
+ ## PR31 — Terminal switching reliability (remote↔local)
336
+ Status: pending (stack #27)
337
+
338
+ Changes/features/fixes (examples; 4 commits mapped):
339
+ - fix(terminal): harden remote→local switching input
340
+ - fix(claude): forward signals to binary child process
341
+ - Add signal forwarding to claudeLocal.ts
342
+ - fix(ink): avoid async useInput handler
343
+
344
+ ## PR18 — TMUX end-to-end (headless sessions + attach + settings)
345
+ Status: pending (stack #28)
346
+
347
+ Changes/features/fixes (examples; 12 commits mapped):
348
+ - feat(terminal): add Terminal settings + tmux metadata
349
+ - fix: tmux parsing/targeting + review feedback
350
+ - feat(tmux): support per-instance socket path
351
+ - fix(tmux): correct env, tmpdir, and session selection
352
+ - feat(terminal): add tmux metadata + attach tooling
353
+ - fix(tmux): print attach instructions in correct order
354
+ - test(tmux): avoid brittle assertions
355
+ - refactor(app): rename tmux/message-send settings under session
356
+ - fix(terminal): prevent sessionId path traversal in attachment info
357
+ - fix(terminal): clarify missing --happy-starting-mode value
358
+ - test(cli): prevent legacy sessionId path traversal
359
+ - fix(cli): block legacy sessionId path traversal
360
+
361
+ ## PR32 — Codex approvals + MCP tool interactions (execpolicy + elicitation)
362
+ Status: pending (stack #29)
363
+
364
+ Changes/features/fixes (examples; 7 commits mapped):
365
+ - feat: add execpolicy approval option for Codex
366
+ - feat(codex): support execpolicy approvals and MCP tool calls
367
+ - fix(i18n): add Codex execpolicy button text
368
+ - fix(reducer): keep permission messages idempotent
369
+ - fix: use runtime execPath for MCP bridge
370
+ - fix(codex): use mcp tool call id for approvals
371
+ - test(happy-cli): fix timer cleanup and MCP schema mocks
372
+
373
+ ## PR21 — Codex MCP tool-call result correctness
374
+ Status: pending (stack #30)
375
+
376
+ Changes/features/fixes (examples; 3 commits mapped):
377
+ - fix(codex): harden MCP command detection
378
+ - test(codex): reset transport instances between tests
379
+ - fix(codex): preserve falsy MCP tool results
380
+
381
+ ## PR33 — Codex special commands (/clear session reset)
382
+ Status: pending (stack #31)
383
+
384
+ Changes/features/fixes (examples; 1 commits mapped):
385
+ - feat: handle /clear command as session reset in codex
386
+
387
+ ## PR30 — Agent error surfaces (Codex/Gemini)
388
+ Status: pending (stack #32)
389
+
390
+ Changes/features/fixes (examples; 4 commits mapped):
391
+ - feat(ui): surface Codex/Gemini errors in session UI
392
+ - fix(ui): polish Codex and Gemini error messages
393
+ - fix(gemini): normalize error details for UI
394
+ - refactor(happy-cli): remove unreachable gemini error branch
395
+
396
+ ## PR29 — Sessions & message list UX
397
+ Status: pending (stack #33)
398
+
399
+ Changes/features/fixes (examples; 10 commits mapped):
400
+ - fix(session): archive when kill RPC unavailable
401
+ - Add copy-to-clipboard button to message blocks
402
+ - feat(sessions): group inactive sessions by project
403
+ - feat(sessions): add unread badge
404
+ - feat(session): add session rename support
405
+ - feat(sync): add cross-device unread markers
406
+ - fix(expo-app): avoid false homeDir prefix matches
407
+ - refactor(expo-app): remove unused optimistic flag
408
+ - fix(i18n): localize session error fallbacks
409
+ - refactor(sync): simplify path formatting
410
+
411
+ ## PR35 — Friends: UX + reliability
412
+ Status: pending (stack #34)
413
+
414
+ Changes/features/fixes (examples; 2 commits mapped):
415
+ - fix(i18n): localize search error
416
+ - expo-app(experiments): add inbox friends experiment gate
417
+
418
+ ## PR22 — Server-light flavor (variant + schema/prisma sync)
419
+ Status: pending (stack #35)
420
+
421
+ Changes/features/fixes (examples; 12 commits mapped):
422
+ - feat(server): add full/light flavors with sqlite migrations
423
+ - fix(server-light): validate PORT and normalize paths
424
+ - test(server): fix schema generation sort regex
425
+ - fix(server): make build typecheck tests
426
+ - fix(server-light): use file URLs for sqlite db
427
+ - fix(server): fix server-light typecheck
428
+ - fix(server): relax module settings for typecheck
429
+ - fix(server): keep light server running
430
+ - fix(server): validate HAPPY_SERVER_LIGHT_DATA_DIR for light migrations
431
+ - fix(server-light): avoid master secret race
432
+ - fix(server-light): harden public file path encoding
433
+ - Refactor schema sync and centralize Prisma types
434
+
435
+ ## PR23 — Server: optionally serve UI + public files safely
436
+ Status: pending (stack #36)
437
+
438
+ Changes/features/fixes (examples; 3 commits mapped):
439
+ - fix(server): handle missing UI index.html
440
+ - test(server): validate processImage resize output
441
+ - fix(server): handle missing UI index in error handlers
442
+
443
+ ## PR24 — Storage: S3 env + bucket validation
444
+ Status: pending (stack #37)
445
+
446
+ Changes/features/fixes (examples; 1 commits mapped):
447
+ - fix(storage): validate S3_PORT and bucket existence
448
+