Date: 2026-03-21
Our base: origin/dev @ 5560fd8e6
Upstream: upstream/dev @ 832b8e252
Divergence: 23 ahead, 162 behind
Security audit: See docs/SECURITY_AUDIT.md for upstream CVEs and Frankencode-specific vulnerabilities.
Frankencode has diverged enough from upstream that a simple git rebase with conflict resolution is no longer viable. Each upstream change must be analyzed individually for how it can be incorporated into our codebase — not mechanically merged.
Key principles:
- No desktop app. Frankencode will never ship the Electron desktop app. Desktop-only changes are permanently skipped.
- Web app: keep but don't prioritize. Web app changes may be useful but are not a focus.
- Manual cherry-pick or reimplementation. Each fix/feature is either cherry-picked (if it applies cleanly), manually reimplemented (if it conflicts with our architecture), or skipped (if irrelevant).
- Effect-ification divergence. Upstream uses
InstanceState+ScopedCache; we deletedInstanceentirely and useInstanceALS+InstanceLifecycle+ module-level state maps withregisterDisposer. These are fundamentally different architectures — upstream Effect PRs cannot be cherry-picked, they must be analyzed for relevant behavioral changes and reimplemented in our architecture if needed. - Refactors need justification. Portability refactors (Bun→Node) are only worth adopting if we plan to support Node.js runtimes. Otherwise they add churn without benefit.
Bug fixes applicable to our fork. Each needs individual analysis for clean application.
| SHA | PR | Author | Description | Priority |
|---|---|---|---|---|
cc818f803 |
#18283 | Protocol Zero | fix(provider): only set thinkingConfig for models with reasoning capability | High |
214a6c6cf |
#18438 | Kit Langton | fix: switch consumers to service imports to break bundle cycles | High |
d70099b05 |
#18418 | Kit Langton | fix: apply Layer.fresh at instance service definition site | High |
7866dbcfc |
#18292 | Luke Parker | fix: avoid truncate permission import cycle | High |
d69962b0f |
#18264 | James Long | fix(core): disable chunk timeout by default | High |
054075189 |
#18259 | James Long | fix(core): use a queue to process events in event routes | High |
0d7e62a53 |
#17815 | Kit Langton | fix forked prompt attachments losing file parts | High |
84e62fc66 |
#18165 | Kit Langton | fix(session): preserve tagged error messages | High |
24f9df546 |
#18426 | Kit Langton | fix: update stale account url/email on re-login | Med |
1071aca91 |
#18328 | Dax | fix: miscellaneous small fixes | Med |
6fcc970de |
#18320 | Dax | fix: include cache bin directory in which() lookups | Med |
6e09a1d90 |
#18281 | Kit Langton | fix(account): handle pending console login polling | Med |
56102ff64 |
#17763 | Johannes Loher | fix(core): detect vLLM context overflow errors | Med |
5c6ec1caa |
— | Dax Raad | fix question cross out | Med |
f80343b87 |
— | Dax Raad | fix annotation | Low |
| SHA | PR | Author | Description | Relevance |
|---|---|---|---|---|
040f551c5 |
#18079 | Sebastian | Upgrade opentui to 0.1.88 | High — TUI dep |
92cd908fb |
#18324 | Dax | feat: add Node.js entry point and build script | High — portability |
b3d0446d1 |
#18175 | Jaaneek | feat: switch xai provider to responses API | Med |
05d3e65f7 |
#18014 | Vladimir Glafirov | feat: enable GitLab Agent Platform with workflow model discovery | Med |
e6f521477 |
#17961 | Shoubhit Dash | feat: add git-backed session review modes | Med |
81be54498 |
#18138 | Kit Langton | feat(filesystem): add AppFileSystem service, migrate Snapshot | Med — Effect |
171e69c2f |
#18035 | Aiden Cline | feat: integrate support for multi step auth flows | Med |
8e09e8c61 |
#18103 | Aiden Cline | feat: integrate multistep auth flows into desktop app | Low — desktop |
Each refactor analyzed for whether it provides actual value to Frankencode.
| SHA | PR | Author | Description | Why |
|---|---|---|---|---|
2dbcd79fd |
#18261 | jorge g | fix: stabilize agent and skill ordering in prompt descriptions | Deterministic ordering prevents flaky LLM behavior |
5ddfe4ada |
#18123 | Kit Langton | type Provider.list() as Record<ProviderID, Info>, delete dead code | Better types, dead code removal — aligns with our type safety work |
4b4dd2b88 |
#18009 | Ariane Emory | fix: Add apply_patch to EDIT_TOOLS filter | Bug fix disguised as refactor — apply_patch should be in the filter |
fee3c196c |
#17812 | Kit Langton | add prompt schema validation debug logs | Useful for debugging schema issues |
These replace Bun-specific APIs with Node.js equivalents. Only valuable if we plan to support Node.js runtimes. Frankencode targets Bun only — these add churn without benefit.
| SHA | PR | Author | Description | Skip reason |
|---|---|---|---|---|
52a7a04ad |
#18318 | Dax | replace Bun shell with portable Process utilities | Bun-only — no Node.js target |
37b8662a9 |
#18316 | Dax | abstract SQLite behind runtime-conditional #db import | Bun-only — we use bun:sqlite directly |
ddcb32ae0 |
#18304 | Dax | replace Bun-specific TUI APIs with portable alternatives | Bun-only |
63585db6a |
#18301 | Dax | replace Bun.sleep with node:timers/promises sleep | Bun-only |
92cd908fb |
#18324 | Dax | add Node.js entry point and build script | Bun-only — no Node target |
| SHA | PR | Author | Description | Notes |
|---|---|---|---|---|
812d1bb32 |
#18303 | Dax | inline tool descriptions, remove separate .txt files | Conflicts — our Frankencode agents use .txt prompt files. Would need to keep our .txt files. |
8ee939c74 |
#18140 | Aiden Cline | remove unnecessary parts from the fallback system prompt | Review what was removed — might remove things we rely on |
| SHA | PR | Author | Description | Priority |
|---|---|---|---|---|
a64f604d5 |
#16779 | Kyle Altendorf | fix(tui): check for selected text in dialog escape handler | Med |
51fcd04a7 |
#17782 | Shoubhit Dash | Wrap question option descriptions instead of truncating | Med |
3256886e2 |
— | David Hill | tui: make the title bar search easier to scan | Low |
e9a17e448 |
#17146 | AbigailJixiangyuyu | fix(windows): restore /editor support on Windows | Low |
54ed87d53 |
#18010 | Luke Parker | fix(windows): use cross-spawn for shim-backed commands | Low |
Cannot be cherry-picked. Architectural divergence — upstream uses InstanceState + ScopedCache, we deleted Instance entirely.
Phase 6 analysis result: zero items need reimplementation. All behavioral changes are already in our tree. The 12 PRs are pure structural refactors (move to Effect service, rename, flatten facades) with no new runtime behavior.
| SHA | PR | Description | Analysis |
|---|---|---|---|
469c3a420 |
#17544 | move scoped services to LayerMap | Pure structural — we use registerDisposer |
9e740d994 |
#17827 | effectify FileWatcherService | Pure structural |
e5cbecf17 |
#17829 | fix+refactor VcsService | Bug fix (HEAD filter scoping) already in our tree |
2cbdf04ec |
#17835 | effectify FileTimeService + Semaphore | Bug fix (await + Semaphore) already in our tree |
335356280 |
#17675 | effectify FormatService | Pure structural |
69381f6ae |
#17845 | effectify FileService | Pure structural |
384982276 |
#17849 | effectify SkillService | Pure structural — our skill cache is separate |
9e7c136de |
#17878 | effectify SnapshotService | Pure structural |
5dfe86dcb |
#17957 | effectify TruncateService, delete Scheduler | Pure structural — we don't use Scheduler |
a800583ae |
#18093 | unify service namespaces | Pure rename (drop "Service" suffix) |
e78944e9a |
#18266 | effectify Installation | Pure structural |
38e0dc9cc |
#18483 | InstanceState + flatten facades | Architectural divergence — N/A |
5d2f8d77f |
#18158 | upgrade effect beta (Luke Parker) | Dependency update — we pin our own version |
Desktop (Electron): Frankencode will never ship a desktop app. All desktop-specific changes are permanently skipped.
Web app: May be useful to keep functional. Web app changes should be evaluated individually but are not a priority. Most are by Brendan Allan (frontend) and Shoubhit Dash (review UI).
Auto-generated code (15x chore: generate), nix hashes (8x), CI, docs, vouched/disavow lists.
Zen-specific pricing, routing, model updates.
| SHA | PR | Author | Description | Action |
|---|---|---|---|---|
5dc47905a |
— | Dax Raad | allow customizing DB location | Evaluate |
bfdc38e42 |
#18337 | Aiden Cline | adjust codex plugin logic (oauth plan) | Evaluate |
68809365d |
#17847 | Aiden Cline | fix: github copilot enterprise integration | Med — backport |
0bbf26a1c |
#18343 | Luke Parker | deslopity deslopity (code cleanup) | Evaluate |
1ac1a0287 |
#18186 | Dax | anthropic legal requests | Low |
Phase 1 — High-priority fixes (8 commits, cherry-pick individually):
cc818f803#18283: thinkingConfig for reasoning models only7866dbcfc#18292: truncate permission import cycled69962b0f#18264: disable chunk timeout by default054075189#18259: queue for event route processing0d7e62a53#17815: forked prompt attachments losing file parts84e62fc66#18165: preserve tagged error messages214a6c6cf#18438: service imports to break bundle cyclesd70099b05#18418: Layer.fresh at instance service site
Phase 2 — Quality improvements (5 commits):
040f551c5#18079: OpenTUI 0.1.882dbcd79fd#18261: stabilize agent/skill ordering4b4dd2b88#18009: apply_patch in EDIT_TOOLS filter5ddfe4ada#18123: type Provider.list() as Record<ProviderID, Info>fee3c196c#17812: prompt schema validation debug logs
Phase 3 — Medium fixes + features (remaining): Cherry-pick remaining backportable fixes and evaluate features.
Phase 4 — Effect behavioral analysis (NOT a rebase): For each of the 12 Effect PRs, read the diff and extract:
- Bug fixes embedded in the refactor (e.g., VcsService #17829 fixes HEAD filter bug)
- New capabilities (e.g., Semaphore locks in FileTimeService)
- Reimplement those behaviors in our architecture — do NOT rebase
Permanently skipped:
- All desktop/Electron changes (Frankencode will never ship desktop)
- All Bun→Node portability refactors (Frankencode targets Bun only)
- All chore/generate/nix/CI commits
- All Zen platform changes
| PR | Author | Title | Priority |
|---|---|---|---|
| #18527 | Dax Raad (Vouched) | fix(core): restore SIGHUP exit handler (+1/-0) | HIGH |
| #18551 | Sebastian (Vouched) | Upgrade opentui to 0.1.90 | HIGH |
| #18113 | Ariane Emory (Vouched) | fix: Fix default timeout value (+2/-2) | HIGH |
| #12633 | Dax Raad (beta) | feat(tui): add auto-accept mode for permissions | HIGH |
| #18348 | rekram1-node (Vouched) | fix: plugins can register providers with config changes | Med |
| #18155 | rekram1-node (Vouched) | feat: add model reconciliation hook | Med |
| #13692 | Dax Raad | feat: add reference agent for searching external repos | Med |
| #18173 | Kit Langton (Vouched) | feat(bus): migrate Bus to Effect PubSub | Med — Effect |
| #18336 | Tim Smart | refactor effect runtime | Med — Effect |
Kit Langton has 10 more Effect PRs — all DRAFT, all require behavioral analysis not cherry-pick.
| PR | Author | Title | Priority |
|---|---|---|---|
| #10763 | orbisai0security | Fix CVE-2025-58179 (astrojs/cloudflare) | HIGH |
| #10974 | MaxMiksa | Guard TUI server exposure | HIGH |
| #14581 | Nicoo01x | Prevent cross-drive path bypass (Windows) | Med |
| #17362 | kvenux | Sanitize markdown link XSS | Med (web only) |
| PR | Author | Title | Why |
|---|---|---|---|
| #18539 | KnutZuidema | Discourage _noop tool call during compaction | Small, targeted |
| #18538 | zaxbysauce | Handle client disconnect in SSE writes | Crash prevention |
| #18443 | LucasSantana-Dev | Retry 429 even when provider says non-retryable | Reliability |
| #18445 | LucasSantana-Dev | Account for OpenRouter cache write tokens | Cost accuracy |
| #17834 | TomRoyls | Cap retry backoff to 30s | 2-line fix |
| #17758 | SunCreation | Prevent lone surrogate 400 errors in tool results | Provider compat |
| #17742 | RhoninSeiei | Filter empty text content blocks for all providers | Provider compat |
| #17712 | jpvelasco | Drop empty messages after reasoning filter | Provider fix |
| #18412 | ernestodeoliveira | Don't decode percent-encoding in filesystem paths | Path safety |
| #18137 | BYK | Reduce memory during prompting (lazy scan + windowing) | Performance |
| #18516 | BYK | Prevent subagent plan escape | Subagent safety |
| #17818 | LehaoLin | Validate JSON in tool call arguments | Robustness |
| #17635 | SHL0MS | Remove dead LSP clients (memory leak) | Memory |
| #17651 | vesector | Recover MCP clients after transient failures | MCP reliability |
| #17645 | mollux | Apply config model cost overrides at runtime | Cost accuracy |
| #18069 | ihubanov | Timeout for snapshot git add (large worktrees) | Reliability |
| #17888 | flacks | Honor model:inherit in subagent frontmatter | 1-line fix |
| PR | Author | Title | Notes |
|---|---|---|---|
| #18497 | amosbird | Sidebar position config | TUI layout |
| #17644 | joeyism | /edit command to open files in $EDITOR | TUI UX |
| #17868 | jwcrystal | Prompt after /compact (continue or branch) | TUI UX |
| #17156 | shiyuhang0 | Show skills in sidebar | TUI feature |
| #14190 | mocksoul | Tail-f effect for tool output | TUI UX |
| #17992 | saltykovdg | Light-clean theme | TUI theme |
| #18198 | 2KAbhishek | Syntax highlighting for kotlin, hcl, lua, toml | TUI feature |
| PR | Author | Title | Notes |
|---|---|---|---|
| #18317 | vaporwavie | Quiet mode for CLI runs | CLI UX |
| #18235 | dgruzd | Offline mode | Network control |
| #18178 | mjdouglas | Custom system prompt per model | Config |
| #17670 | dmitryryabkov | Dynamic model discovery for local providers | Provider feature |
| #18450 | potlee | Use native Output.object() for structured output | Net code deletion |
| #18280 | ryanskidmore | Plugin system robustness improvements | Plugin stability |
- Desktop/Electron: ~15 PRs (Brendan Allan, Luke Parker, OpeOginni)
- Web App UI: ~25 PRs (anduimagui, Rohansguliani, Shoubhit Dash)
- Bun→Node portability: ~5 PRs (Dax Raad)
- Docs/translations/ecosystem: ~15 PRs
- CI/chore: ~10 PRs
- Niche/massive: ~10 PRs (Kiro provider +4309 lines, multi-session daemon +7589 lines)
- Cherry-pick = isolated fix, applies cleanly
- Reimplement = extract behavioral change from architectural refactor, apply to our architecture
- Skip (desktop) = Frankencode never ships desktop — permanently irrelevant
- Skip (portability) = Bun→Node refactor — Frankencode targets Bun only
- Skip (web app) = Web app changes — low priority, evaluate individually
- Skip (chore) = auto-generated, CI, docs, translations
- Evaluate = needs code-level review before deciding