Skip to content

v2026.07.17

Choose a tag to compare

@github-actions github-actions released this 17 Jul 13:40
· 590 commits to main since this release

Highlights

Rebuilt Market Data Layer

Our market data stack grew up US-first and provider-shaped — each layer spoke whichever dialect the provider it happened to call used, and the US trading day was baked in as the default. The cracks showed at the edges. An after-hours Hong Kong chart kept its live styling and a "Delayed" badge, so a closed market read as an open one. London prices carried a standing 100× risk from pence-versus-pounds. Six separate pieces of code each had their own idea of what AAPL meant. Refreshing MarketView could show you 516.11 or 512.15 for the same instant, depending which of two writers resolved last.

This release replaces that with a single protocol — one instrument identity, real exchange calendars, declared data lineage — and rebuilds the quote stack, the charts, and the agent's data tools on top of it. What you'll notice:

  • Closed markets look closed. The price line restyles to a neutral grey Close and the badge reads {Exchange} Closed instead of Delayed.
  • The daily candle settles after the bell instead of freezing mid-session and serving that partial all evening. In live testing it landed on the official close 48 seconds after the US bell.
  • One header price. The big number is the official close with a change pair that agrees with it; the after-hours move gets its own labeled line instead of fighting for the same slot. Header and chart now match to the cent.
  • Non-US markets are first-class. Sessions follow the venue's real calendar — including the Hong Kong lunch break — rather than a hardcoded US day, prices render in the venue's currency (HK$, £), and non-US symbols hit the cache for the first time.
  • You can see where a price came from. The header tooltip names the provider actually serving the number you're looking at, not every provider enabled.
  • Profit margins are back. The company-overview Profit Margins chart had been empty since a provider API migration dropped the fields it relied on. Margins are now derived from the raw statements instead — checked against 48 quarters, all matching.

The MarketView chart got a pass of its own. A settled price is now labeled for what it is — Close on a closed venue, AH Close after hours — rather than styled as if it were live, which is what made yesterday's close read as a current price on a weekend or pre-market 1D chart. The dashed official-close line now stays up after the bell, so the real close sits alongside the extended-hours tape instead of disappearing behind it. Switching from a Hong Kong symbol to a US one no longer strands a grey Close pill from the previous chart. And a run of zero-filled minute bars no longer drags the forming candle's low down to zero until the next reconcile.

The agent's data tools were rebuilt on the same protocol. The built-in market-data MCP servers now share one response contract: a uniform envelope with a fixed vocabulary of error codes in place of free-text error sentences, and a guaranteed oldest-to-newest bar order. Every response now carries the instrument's currency and timezone — information the agent simply didn't have before, and had to assume — so prices in its analysis come out in the venue's own currency (HK$, £) rather than under a hardcoded dollar sign. Upstream failures reach the agent as clean codes rather than raw exception text. That contract is written down in mcp_servers/AGENT_CONTRACT.md and pinned by a snapshot test, so the instructions the agent reads can't drift by accident.

New Models

Adds the GPT-5.6 series — Sol, Terra, and Luna — with a 1,050,000-token context window, up from 400K on GPT-5.4. Also adds Claude Sonnet 5 (1M context, adaptive thinking) and GLM-5.2. GPT-5.4 and GPT-5.3 Codex are retired; a saved preference pointing at a retired model falls back on its own.

GLM-5.2 now maps the reasoning slider onto its native reasoning levels, so low and medium actually run lighter — previously every non-low request ran at maximum reasoning regardless of the setting.

If you sign in with your ChatGPT account, the OAuth models get two improvements. Long threads now stay pinned to a single backend instead of scattering across replicas between turns, so the cached prompt prefix stays warm — replies come back quicker deep into a conversation, and the same prefix isn't re-read at full price against your own ChatGPT plan every turn. And the model picker now only offers the OAuth models your subscription actually includes, rather than listing ones that fail when you pick them.

Workspace Controls

Workspace cards now have a full menu — rename, duplicate, change spec, pin, and always-on — where before there was only open and delete. Three resource tiers are selectable per workspace:

  • Standard — 1 vCPU · 1 GB RAM · 3 GB disk
  • Performance — 2 vCPU · 4 GB RAM · 5 GB disk
  • Max — 4 vCPU · 8 GB RAM · 10 GB disk

Always-on stops a workspace idling out after 30 minutes, which removes the 15–60 second reprovision wait the next time you use it. It stays running until you turn it off.

One caveat worth knowing: changing a workspace's tier recreates its sandbox. Files in the workspace directory are preserved, but installed packages and running processes are not.

Model Retries and Fallback

When a model call fails you now see it happen. A status pill reports {model} error — retrying (2/4)… or Falling back to {model}…, and the transcript records {from} failed — switched to {to} with the underlying error behind an expander. If a fallback produced your answer, a dismissible pill offers to make that model your default. Previously all of this was silent — a failing model meant a long unexplained stall, and if every attempt failed, the error named a model you never chose.

Thread History Reads From the Checkpoint

Groundwork, mostly. Reloading a thread now rebuilds it from the agent's own checkpoint and the authoritative records rather than from a stored copy of the events we streamed you. Nothing changes on screen — the transcript is identical, and the old copy stays behind it as a fallback.

What it sets up matters more than what it changes today. A thread's history is still written twice, once into the checkpoint and once into that event copy, and two copies can drift. Moving the read onto the checkpoint is the step that lets the second write go away entirely, which is where this is headed. It's also part of an ongoing move onto LangChain's v3 streaming API. Along the way, widget data and generated images became content-addressed on the way in, keeping bulk payloads out of the agent's state.

One real fix rides along: saved error records are now scrubbed of credentials, where scrubbing previously covered only the live stream.

New Login Page

The login page is now split-screen: a market tape drawn from two years of real S&P 500 closes on one side, auth on the other, opening on a method picker rather than dropping you into a form. Magic-link sign-in is new, along with password reset, resend confirmation, and a check-inbox screen showing the exact address it wrote to — and sign-in links now open on any browser or device. Loading states that used to be a black screen, including the moment right after sign-in, now show a dim quote wall.

Changelog

New Features

  • market-data: canonical market data protocol (CMDP) (#312)
  • login: split-screen redesign + email auth flows (#321)
  • OpenAI GPT-5.6 series with explicit prompt caching, gated to api.openai.com (#316)
  • workspaces: resource tiers, always-on, duplicate/rename (#301)
  • surface model retry/fallback to the user (unified resilience middleware + UI) (#306)
  • replay: checkpoint-sourced history replay + single-source persistence (#315)
  • llms: add Claude Sonnet 5 to the model manifest (#300)
  • llms: GLM-5.2 support via vendored langchain-zai ChatZai client (#297)
  • llms: map reasoning effort onto GLM-5.2's native reasoning_effort; remove dead ChatGLM extension (#302)
  • llms: remove GPT-5.3 Codex from the model manifest (#303)
  • llms: codex session-affinity cache headers derived from cache_key (#323)
  • threads: channel-identity stamp endpoint + external-id conflict handling (#309)
  • concurrent PTC report-back dispatch (#299)
  • chat: reliable scroll-to-latest + shared nav-panel folder state (#290)
  • config: inherit flash model for blank compaction/fetch (2459e56)

Bug Fixes

  • recover from sandbox transport failures and 404 malformed thread ids (#322)
  • llms: Codex OAuth model access — first-party client headers, per-plan gating, fresh model lists (#318)
  • server,web: accept CN/HK digit-first tickers in market-view chat (#319)
  • cache: daily-bar staleness backstop with single-flight refetch (#304)
  • mcp: drop NaN OHLC bars from yfinance price history (#314)
  • chat: steer_only contract + unify the admission decision (#313)
  • chat: recover the chat stream after iOS Safari backgrounds the tab (#291)
  • web: dedupe HITL interrupt cards by interrupt_id; hide orphan empty bubbles (#305)
  • dashboard: restore Market Overview index cards (#287) (#293)
  • compaction: heal orphaned tool_result brick + id-persistence (#296)
  • glob: bound Glob tool output to prevent context overflow (#311)
  • dispatch: reject unauthenticated background dispatch instead of running foreground (#308)
  • logging: silence yfinance no-data ERROR-log flood + bump to 1.5.1 (#320)
  • docker: enable file-watch polling for containerized dev HMR (b544c1b)

Documentation

  • readme: add Japanese README (#317)
  • readme: add Simplified Chinese README translation (7bd1138)
  • agents: split agent context into AGENTS.md canon + CLAUDE.md bridges (40c6e92)

New Contributors

A warm welcome and thank you to our new contributors this release:

Full Changelog: v2026.06.27...v2026.07.17


15 features, 14 fixes, 3 doc changes — 32 changes total