Repository navigation
Conversation
The panel's footer now carries the CRM's own advancement buttons — Backlog → Prioritize, « À faire » → Mark in progress, « En cours » → Mark as Done, « Review » → Approve & Done — each writing the status in one click. They write the status DIRECTLY, which is the point: work happens away from Claude too (an email sent, a call made), and saying so must not require starting an agent. That is a deliberate reversal of the narrower 2026-08-07 decision, confirmed with Alexandre on 2026-09-07. Panel only — the task ROW is unchanged (it keeps its single « Done » from « Review »). The CRM's « Start » is spelled « Mark in progress » here because the same footer already carries a « Start » that hands the task to /pickup; two buttons one gap apart with the same label would make the distinction unreadable. Starting a BLOCKED task asks first and names the blockers, as the CRM does — resolved relations are history and do not stop the click. Writes go through the existing useSetTosseTaskStatus, inheriting its optimistic patch, whole-board rollback and already-rendered error. The ladder lives in tosseModel.ts as a pure, tested table; the JSX only knows how to paint a button and when to ask first. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Audit of the Codex app-server between binary 0.144.4 and 0.153.4, done by
diffing the schema dumps of both versions definition-by-definition, then
confirming live.
The LIVE wire turned out to be purely additive (516 -> 622 defs, one removal
in the whole surface; deltas and item lifecycle byte-identical; the context
ring contract intact). The damage was on DISK: 0.153.x stopped writing the
`event_msg{user_message}`/`{agent_message}` lines every reader in
codex/history.rs took its prose from, so a Codex conversation written by it
reloaded completely blank (verified on real rollouts: 0 user, 0 assistant
text), vanished from the History panel (a row without an excerpt is dropped
as noise) and was indexed empty. The prose moved into `item_completed`,
whose item is the normalized one — so the disk now mirrors the live wire.
- history.rs: detect the dialect and pick one path. The 0.153.x path renders
messages, reasoning (as Thinking), commands, patches and web searches, and
names an unmodelled item rather than dropping it; the response_item twins
are skipped so nothing double-renders. Listing + search index follow.
Older rollouts keep the legacy path, unchanged.
- session.rs/protocol.rs: map `functionCallOutput`; stop dropping a
questions-only `agentMessage` (empty text) without restating a question
the prose already asks; feed `webSearch.results` into the source chips
through the same renderer the cold path uses.
- Re-capture the turn fixture against 0.153.4, pinning model/effort/summary
and validating coverage BEFORE writing it — asserting after the write had
left a fixture stripped of its reasoning.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The wire id is `gpt-6-astra`, verified against `model/list` on codex-cli
0.144.4 (the installed binary already serves it — no update needed). It is
the model the binary itself flags `isDefault`, declares the full low→ultra
effort ladder, and is the first to expose a 2x "Fast" service tier.
Also replaces the effort-ladder heuristic with a table transcribed from that
same `model/list` response. The ladder is per MODEL, not per family:
`m.includes("gpt-5.6")` handed gpt-5.6-luna an `ultra` rung it never
declares, and would have given a new family only low→xhigh. Neither shows up
as an error — the CLI silently swallows an effort a model doesn't accept.
`gpt-5.4` is dropped from the static fallback: `model/list` no longer returns
it, and that list is what the picker shows while the dynamic one loads.
Defaults move to gpt-6-astra in both places that hold one — FACTORY_DEFAULTS
(what seeds a new conversation) and DEFAULT_CODEX_MODEL (the safety fallback).
Nothing to wire on the Rust side: `codex_model_label` derives "GPT-6 Astra"
algorithmically, now pinned by a test. Live probe: a turn really starts on
gpt-6-astra, effective context window 258400.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The ring was rendered `disabled` until BOTH the token count and the context window were known. Only the end-of-turn `result` reports the window (`result.modelUsage`; Codex: `modelContextWindow`) and the on-disk transcript carries none — so the trigger stayed dead for a conversation's whole first turn, and again after every reload until the next turn ended. That hid the account-global plan usage (5h/7d), which has nothing to do with the turn in flight. The ring is now always clickable; only the ARC is withheld while the window is unknown, because there is no honest percentage to draw. The popover says what it actually knows: the real token count when the first root `message_start` has reported it, "Waiting for the first turn" otherwise — never a fake 0 %. The Plan section renders unconditionally, with an explicit empty state. - `contextData`: the fill derivation moves into the pure, tested `contextFill`, which reports `usedKnown` and `windowKnown` separately (the two figures arrive at different times and must not share one gate). - The Keychain guard is preserved: `enabled` still gates the AUTOMATIC plan-usage fetch, now keyed on `usedKnown` (a first turn in flight or a reloaded transcript is unambiguously a conversation the user has already run). Opening the popover by hand refetches while disabled — that path is a deliberate click. - Mock: `?ctx=none` / `?ctx=nowindow` reproduce both pre-window states for visual verification. Bugfix (the control was unreachable), so no settings toggle. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- history.rs: the cold `status_is_error` omitted `declined`, a real variant of BOTH `CommandExecutionStatus` and `PatchApplyStatus` (confirmed in the 0.153 schema dump) — a refused command or patch reloaded GREEN, reading as if it had run. Now mirrors the live actor's helper. - session.rs: `search_result_links` filtered an empty `title` but not an empty `domain`, so the empty domain won the `or_else` and shadowed the `url` fallback → a label-less source chip. - session.rs: `function_call_output_content` serialized an EMPTY `output` array as the literal `[]`, while the adjacent null case read "(no output)". - models.ts: dropping `gpt-5.4` from the catalogue orphaned the conversations pinned to it (`modelLabel` fell through to the raw wire id, `modelFamily` returned null). Added RETIRED_CODEX_MODELS — read by the resolvers, never by the picker, so those conversations read correctly without the app ever offering an id the binary would reject. Regression tests for all four. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
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.
Release v2.1.0. Voir les commits de dev depuis la dernière release.