Skip to content

Chat rows survive configs from newer peers; iOS learns opencode - #210

Merged
wingleeio merged 1 commit into
mainfrom
zeron/unknown-harness-rows
Aug 23, 2026
Merged

wingleeio merged 1 commit into
mainfrom
zeron/unknown-harness-rows

Conversation

@wingleeio

@wingleeio wingleeio commented Aug 23, 2026 •

Copy link
Copy Markdown
Contributor

Field report (multi-device): new sessions never appear in the work laptop's sidebar (old ones keep updating), and on iOS opencode sessions wear the claude mark and open showing claude with Fable selected.

Root cause — one skew, two surfaces

The fleet learned a harness id the other surfaces don't know. HarnessId::Opencode shipped in v0.2.10; every chat row created with it since carries config.harness: "opencode".

  • Desktop (the laptop): the typed row decode (read_kind → RawChat) skips any row it can't parse — and ChatConfig.harness is a closed enum. A build older than v0.2.10 therefore drops every opencode chat row wholesale, logging only skipping malformed registry row. Old (claude) rows still decode, so their status keeps updating — exactly the reported asymmetry. → The immediate remedy for the laptop is updating the app there (curl -fsSL https://zeron.sh/install.sh | sh); it's running something older than v0.2.10 (Aug 18).
  • iOS: rows sync fine (harness is a plain string there), but HarnessCatalog/BrandMark had no "opencode" entry — the default: arms answer with the claude mark and the claude model list, hence "claude with Fable" on open.

Fix

  • Desktop, forward-compat for all future skew: the chat row's config now decodes leniently — an unknown harness/reasoning/sandbox value costs the config (the row renders and is selectable with generic defaults, and up-to-date devices still see the real config), never the row. Same rule as transcript salvage: a missing field costs at most what the field carried. Regression test constructs a row from a "harness-from-the-future" peer and asserts it stays visible with config: None while its well-formed sibling keeps its config.
  • iOS: added the OpenCode label, the brand mark (the desktop opencode-mark.svg frame path, even-odd fill), and a static model fallback (the anonymous Zen tier — a reachable host still answers listModels with its live connected-provider discovery). ⚠️ Swift changes are unbuilt here (Linux box) — needs a quick mac build + TestFlight pass.

All doc + engine suites green (83 + 160 tests).

🤖 Generated with Claude Code


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

Field report (multi-device): new sessions never appeared in a work
laptop's sidebar while old sessions kept updating, and on iOS opencode
sessions wore the claude mark and opened showing claude/Fable.

Two independent gaps, one cause — the fleet learned a harness id
('opencode', v0.2.10) that older surfaces don't know:

- Desktop: the typed row decode (read_kind → RawChat) SKIPPED any row it
  couldn't parse, and ChatConfig.harness is a closed enum — so a client
  older than the newest harness id drops every such chat row wholesale.
  Exactly 'old rows update, new rows invisible'. The config field now
  decodes leniently: an unknown harness/reasoning/sandbox value costs
  the CONFIG (row renders with generic defaults), never the row. Same
  rule as transcript salvage: a missing field costs at most what it
  carried. Regression-tested with a future-harness row.
- iOS: HarnessCatalog and BrandMark had no 'opencode' entry, so the
  default arms answered with the claude mark and the claude model list.
  Added the label, the mark (opencode-mark.svg's frame path), and a
  static model fallback (the anonymous Zen tier; a reachable host still
  answers listModels with live discovery).

The laptop itself needs an app update to pick this up — the tolerance
protects every FUTURE skew, it cannot reach builds that predate it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@wingleeio
wingleeio merged commit 6e2ec41 into main Aug 23, 2026
1 check passed
guilhermexp pushed a commit to guilhermexp/comet that referenced this pull request Aug 30, 2026
Chat rows survive configs from newer peers; iOS learns opencode
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants