Repository navigation
Chat rows survive configs from newer peers; iOS learns opencode - #210
Merged
Merged
Conversation
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>
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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::Opencodeshipped in v0.2.10; every chat row created with it since carriesconfig.harness: "opencode".read_kind→RawChat) skips any row it can't parse — andChatConfig.harnessis a closed enum. A build older than v0.2.10 therefore drops every opencode chat row wholesale, logging onlyskipping 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).HarnessCatalog/BrandMarkhad no"opencode"entry — thedefault:arms answer with the claude mark and the claude model list, hence "claude with Fable" on open.Fix
confignow 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 withconfig: Nonewhile its well-formed sibling keeps its config.opencode-mark.svgframe path, even-odd fill), and a static model fallback (the anonymous Zen tier — a reachable host still answerslistModelswith its live connected-provider discovery).All doc + engine suites green (83 + 160 tests).
🤖 Generated with Claude Code
Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.