Skip to content

[Feature] Track selective upstream backports from opencode v1.14.17-v1.14.22 #209

@Astro-Han

Description

@Astro-Han

What task are you trying to do?

We need a focused review of recent upstream anomalyco/opencode changes and decide which upstream PRs are worth selectively backporting into PawWork. The issue header originally said v1.14.17 through v1.14.22, but the actual PawWork sync baseline is v1.14.20 commit 3175a3c618, landed through issue #92 and PR #155. The current review window is v1.14.20..upstream/dev, 88 commits, with upstream dev at a4bd88ab97 on 2026-04-24.

Use GitHub issue/PR history and git log as the source of truth for prior upstream work. Local upstream sync docs are obsolete and should not be treated as current guidance. In particular, do not use docs/upstream-sync.md or docs/upstream_sync.md as source material.

What do you do today?

Today the upstream delta is checked manually from release notes, PRs, and tree diffs. This works for a quick scan, but it is easy to mix already absorbed fixes, small safe backports, large schema migrations, UI fork changes, TUI-only work, and upstream history rewrite artifacts. Upstream also rewrote dev history in this window, so do not rely only on a PR's GitHub mergeCommit.oid for ancestor checks or cherry-pick planning. Verify by PR number and current file content.

What would a good result look like?

A good result is a short implementation plan that ranks upstream PRs by PawWork value and integration risk, then opens small backport PRs only for the selected items. Each backport should keep one reversible intent, avoid PawWork frontend fork churn, and include focused verification for the touched surface.

Recommended execution shape after independent review:

  1. Treat the Effect Schema migration as one coherent slice, starting from PawWork's post-PR refactor: sync opencode config schemas #102 tree rather than old v1.4.11 assumptions. Include the schema chain only if the slice compiles as a unit and updates PawWork-owned packages/opencode/src/tool/trash.ts plus packages/opencode/test/tool/trash.test.ts to the new tool framework. Keep PawWork tool description text files on the local side.
  2. Allow disjoint small PRs to run before or alongside the schema slice when their touched files do not overlap. Good parallel candidates: anomalyco/opencode#19054, #24001 plus #24016, and #23791.
  3. Put schema-adjacent small PRs after the slice unless the implementer proves the conflicts are cheaper the other way. These include #24063, #23797, #23770, and #23870.

Initial high-value candidates to re-check and likely backport:

  • anomalyco/opencode#19054: bare repo and worktree project cache fix. PawWork currently uses git rev-parse --git-common-dir, but still lacks the upstream core.bare handling and can write the cache under the wrong .git path for bare repositories. This is now ACCEPT rather than conditional.
  • anomalyco/opencode#24001 and #24016: respect project .npmrc for npm install and version lookup paths. PawWork's packages/opencode/src/npm/index.ts and packages/opencode/src/installation/index.ts currently have no .npmrc handling. Combine as one reversible npmrc PR.
  • anomalyco/opencode#23791: Bun 1.3.13 bump. PawWork is still on bun@1.3.11. Keep this as a discrete dependency PR, and do not import upstream packages/ui/src story changes.
  • anomalyco/opencode#23696: Kimi variant filtering. PawWork's ProviderTransform.variants(...) still runs after loading model data and PawWork overlays. Current code only filters k2p5 and only enables Anthropic Kimi thinking for k2p5, kimi-k2.5, or kimi-k2p5; upstream broadens this to k2p and kimi-k2.. Current snapshot includes kimi-for-coding with Anthropic k2p6, so this is user-visible. ACCEPT.
  • anomalyco/opencode#23735: Mistral Small reasoning variants. Current PawWork transform still returns no variants for all Mistral models, while current snapshot includes mistral-small-latest and mistral-small-2603 with reasoning enabled. Upstream adds the high reasoning effort variant for those models. ACCEPT.
  • anomalyco/opencode#23925: Codex model filtering logic. This does not go through ProviderTransform.variants; it affects Codex OAuth model filtering. Current PawWork allowlist keeps specific models and deletes the rest, while current snapshot already includes gpt-5.5. Upstream keeps future gpt > 5.4 models instead of filtering them out. ACCEPT.
  • anomalyco/opencode#24063: OpenAI Responses stream server_error should become retryable. PawWork's provider error path currently does not include this retry case. Likely high value, but it touches provider/session tests and should be checked against the schema slice.
  • anomalyco/opencode#23797: preserve UTF-8 BOM in write, edit, apply_patch, patch, and format round trips. Useful for Windows and existing user files, but it touches edit paths and overlaps with tool framework changes.
  • anomalyco/opencode#23770: configurable tool output truncation limits. Useful for advanced workflows where default output limits are too small or too large, but it touches config and tool plumbing.
  • anomalyco/opencode#23870: improved session compaction. Potentially valuable for long PawWork sessions, but higher risk because it touches core session behavior and message DTOs.

Large slice to plan separately:

  • Effect Schema migration chain: #23716, #23740, #23749, #23744, #23745, #23747, #23752, #23753, #23754, #23756, #23757, #23763, #23764, #24005, #24019, #24027, #24029, #24040, #24056, #23244, #24024, and #24054. The largest PawWork-specific risk is #23244, because PawWork's trash.ts is a local tool and must move from the old zod-based Tool.define shape to the new Effect Schema tool framework.

Resolved verification notes for the large slice:

  • PR refactor: sync opencode config schemas #102 partially seeded the schema base, but none of the checked commits is a full no-op. Keep #23716, #23740 plus #23749, #23744, #23753, and #23754 in the slice. Implement them against PawWork's post-PR refactor: sync opencode config schemas #102 tree rather than mechanically replaying upstream. Specific partial overlaps: PR refactor: sync opencode config schemas #102 already introduced a Schema.Struct based config shape and zod(...) walker usage, but upstream #23716 makes Config.Info itself the canonical Effect Schema with Info.zod; PR refactor: sync opencode config schemas #102 still leaves ConfigPermission.Info as a zod transform using ZodPreprocess, while #23740 moves it to Schema.decodeTo; PR refactor: sync opencode config schemas #102 did not migrate MessageV2.Format; provider and other schema leaves still hand-roll .zod in PawWork and should take #23753 plus #23754.
  • #23244 concrete local migration: change packages/opencode/src/tool/trash.ts from import z from "zod" and import { Tool } from "./tool" to import { Effect, Schema } from "effect" and import * as Tool from "./tool"; export Parameters = Schema.Struct({ path: Schema.String.annotate({ description: "The file or directory path to move to the system Trash" }) }); change execute params from z.infer<typeof Parameters> to Schema.Schema.Type<typeof Parameters>. packages/opencode/test/tool/trash.test.ts should mostly keep its current shape because Tool.InferParameters<typeof TrashTool> and info.init() still exist under the new framework.
  • #23244 does not move built-in tool descriptions into code. Upstream migrated tools still import ./write.txt style descriptions, so PawWork-owned packages/opencode/src/tool/*.txt files should stay on the local version during the slice.

Candidates that need more focused verification before final disposition:

  • anomalyco/opencode#23822: platform-specific Bun install flags. Upstream changes a reusable .github/actions/setup-bun/action.yml that PawWork does not have. Treat as DEFER unless PawWork release build logs show the same cross-platform install problem.
  • anomalyco/opencode#23806: avoid relaunching without installing updates. PawWork PR fix: harden updater stale pending handling #178 already moved install ownership into the Electron updater controller and skips install when no ready update exists. Do not direct-backport app-side API changes; only spec a tiny PawWork patch if a concrete relaunch-without-install gap remains.

Candidates to skip based on current evidence:

  • anomalyco/opencode#23808: Windows cross-spawn stderr race test. PawWork already has the same Effect.all(..., { concurrency: 2 }) fix in packages/opencode/test/effect/cross-spawn-spawner.test.ts.
  • anomalyco/opencode#23913: beta PR typecheck all packages. PawWork has no script/beta.ts, and .github/workflows/ci.yml already runs bun turbo typecheck on pull requests.
  • anomalyco/opencode#23652: log session SDK errors. This only touches upstream packages/app/src/context/global-sync.tsx, which is a PawWork frontend fork surface. PawWork PR fix: add session loop diagnostics #204 is a separate session diagnostics change, not the same patch.
  • TUI-only fixes, Linux desktop and Nix packaging updates, governance files, docs site and Zen console changes, and upstream app UI changes should be skipped by default unless a later PawWork issue gives a concrete product reason.

Which audience does this matter to most?

Both

Extra context

Checked on 2026-04-24. Upstream v1.14.20 tag is 3175a3c618, upstream v1.14.22 tag is 596145a71d, and upstream dev was a4bd88ab97. For prior PawWork upstream intake, start from GitHub issue #27, issue #92, PR #102, PR #140, PR #155, PR #178, PR #204, and current dev git history rather than local docs.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P2Medium priorityenhancementNew feature or requestupstreamTracked upstream or vendor behavior

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions