Skip to content

fix(platform): keep tool time out of the message info model phases - #4498

Closed
yannickmonney wants to merge 3 commits into
mainfrom
fix/chat-message-info-tool-time
Closed

yannickmonney wants to merge 3 commits into
mainfrom
fix/chat-message-info-tool-time

Conversation

@yannickmonney

@yannickmonney yannickmonney commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Refs #4493. This follow-up closes findings 1 and 2 of agent #3's post-merge review 5445512947 (REQUEST CHANGES, follow-up PR, no revert). Finding 3 is optional and is listed below as a glossary follow-up. Fleet TALE-1144 (card 568d6da0-00eb-480d-aaeb-bd8baaf19508), base 0bc2cca3854278cf982c80e98fcb032b70861f40, two commits: 938a6c428 and the review repair b3f304fae (see the last section).

Finding 1 (medium): tool time was shown as model time. The timing anchors cover the whole turn, and the first round that writes text sets the first-token stamp. So when a reply called a tool first, the bar labelled everything up to the answer "Waiting for the model", including the time the tool ran. After a reasoning round it labelled the same span "Thinking", and the output-speed window included the tools too.

  • replyPhases(usage, parts) and outputTokensPerSecond(usage, parts) now read the reply's parts. A round stores its reasoning, text, calls and results in that order, so the parts show whether tools ran and whether the answer's first text came only after the last tool.
  • When the reply ran tools, the bar shows Preparing, then a single new Model and tools phase (messageInfo.phases.tools: en "Model and tools", de "Modell und Tools", fr "Modèle et outils"), then Writing, but only if the answer's first text came after the last tool. There is no waiting or thinking phase across a tool span: the reasoning stamp fires on any reasoning delta, so it can't be placed reliably.
  • A reply that ran tools shows no output speed. Its output count is the sum of every round, and the turn-wide anchors don't bound the answer round. The panel already hides figures it can't measure.
  • With the review's example (setup 0.3 s, tool call after 1.5 s, a 4 s search, answer TTFT 1 s, 2 s of writing), the bar used to show waiting 6.5 s and now shows preparing 0.3 s, model and tools 6.5 s, writing 2 s.
  • Docs docs/{en,de,fr}/platform/chat/basics.md: time to first token is now described as the time until the answer's first words, and for a reply that used tools it includes the time of any tool that ran before the first words. The docs also describe the model-and-tools share, followed by writing only when the first words came after the last tool, and say output speed is left out in that case.

Finding 2 (low): memo equality. sameServing now compares the endpoint's host, as sameServedBy does, and also its region, because the dialog renders both and the client never validates the blob. In the same file, sameUsage now also compares setupMs and timeToFirstReasoningMs, the two phase-bar inputs it had skipped. This follows the file's own rule that every rendered field must be compared.

Finding 3 (low, optional): left as a follow-up. The glossary doesn't support the proposed alignment. Both tech_provider and entity_vendor (packages/ui/src/i18n/tests/glossary/glossary.yml) say that FR should use Fournisseur IA to keep the AI provider apart from the knowledge-base vendor (Fournisseur). Meanwhile the catalog's bare "Provider" labels use Fournisseur (chat.yml model details, governance.yml, analytics.yml). Changing messageInfo.provider to Fournisseur would go against the glossary note, and changing the others to Fournisseur IA goes beyond this slice. A glossary owner should decide whether bare provider labels take Fournisseur or Fournisseur IA. If the label changes, the bold label in docs/fr/platform/chat/basics.md changes with it.

Checklist

  • bun run check: not run locally. The brief allowed one check phase for the touched files only; the CI lanes cover the rest.
  • bun run lint:sast: not run as a whole. The pre-commit hook ran Opengrep on the 6 staged code files (OPENGREP_SKIP_IF_UNCACHED=1); CI SAST covers the full run.
  • Translations: messageInfo.phases.tools in messages/{en,de,fr}/chat.yml. de-CH/chat.yml has no messageInfo override. FR outils matches this dialog's Appels d'outils.
  • Docs: the time-to-first-token line in docs/{en,de,fr}/platform/chat/basics.md.
  • README: N/A, no README-level change.

Test plan

One guarded check phase ran at 17:43Z on the pre-commit working tree. The guard took two readings 12 s apart: score 0.108, load1 0.24/0.19 on 4 CPUs, CPU PSI 2.17 %, memory and IO PSI 0 %. The commit hook's oxfmt then reformatted the staged files (layout only).

  • bunx vitest --run --config vitest.ui.config.ts --maxWorkers=1 on utils/message-timing.test.ts, utils/message-equality.test.ts (new), components/message-info-dialog.test.tsx and lib/thread-view-core.test.ts (the equality consumer): 3 of 4 files passed, 46 of 46 tests.
    • NOT_RUN: message-info-dialog.test.tsx. The suite didn't load because Vite refused (Denied ID) an @fontsource/inter ?url asset that the worktree's dependency symlink farm resolves outside the allowed fs root. That's a missing environment prerequisite, not a product result. CI's UI shards run this suite, including the new tool-reply regression and the three tests moved to a tool-free reply.
  • bunx vitest --run --project server --maxWorkers=1 lib/i18n/messages.test.ts: 33 of 33 passed (catalog key and ICU parity).
  • Regressions that fail on base by construction (not run against base locally):
    • message-timing.test.ts: the tool-round cases (model and tools phase, no thinking across tools, no writing when text came before the tools, a tools phase that runs to the settle, no speed for a tool reply). Base's functions ignore the parts, so they return waiting/thinking phases and a speed here.
    • message-equality.test.ts: an endpoint-only change and a change of the phase-bar anchors. Base chatItemRenderEqual returns true.
    • message-info-dialog.test.tsx: "never names the time a tool ran as the model waiting or thinking", with axe.
  • The three existing dialog timing tests used a fixture that contained a tool round, so they asserted the reported behaviour (Waiting for the model180 ms, 129 tok/s). They now render the same reply without its tool round, and the tool case has its own test.
  • Not run: typecheck, lint, build, browser, and manual CHAT-F13/CHAT-F62. CHAT-F13 states the tool-reply expectation since b3f304fae; reference/automation.md already names the component tests for the phases and output speed.

Follow-ups (not in this PR)

  • A server stamp would let the bar draw the tool span as its own phase and show the answer round's own output speed. Options: per-round anchors from lib/chat/turn.ts, or the final round's start, first output and output tokens. This is the review's preferred fix; this PR is its stated minimum.
  • FR "tool": the glossary's tech_tool note prefers Tool in product context, but the shipped FR catalog uses outils (31 occurrences in messages/fr, including Appels d'outils). This is the same kind of glossary-vs-catalog decision as finding 3.
  • sameUsage still skips costEstimateCents, stepLimitHit, finishReason and estimated. Nothing goes stale today, because usage is stamped once at settle.

Review repair (b3f304fae)

The independent review 6044114870 (TALE-1148) requested changes at 938a6c428. It accepted the code and asked for two wording fixes. Code unchanged.

  • DOCS: docs/{en,de,fr}/platform/chat/basics.md. The time to first token includes the time of any tool that ran before the first words, and writing follows only when the first words came after the last tool. A lead-in before a tool call puts no tool time in the first-token time and leaves no writing phase.
  • REL-MANUAL: CHAT-F13 now says that on a reply that ran a tool, Output speed is absent and the legend shows Model and tools (chat.messageInfo.phases.tools) with no waiting or thinking phase. The box count is unchanged.
  • Check (one guarded phase, 18:45:29–18:46:15Z, score 0.214):
    • services/docs: bunx vitest --run --project node --maxWorkers=1: 37 files, 680/680 passed.
    • bun run lint:manual: ok (5 trees, 1473 boxes).
    • The commit hook's oxfmt changed nothing.
  • CI at 938a6c428: CI ready (Checks) was red only because Unit (platform 2/2) (job 112930643636) failed ytdlp_live.test.ts: its ffmpeg apt-get install timed out at 420 s. That is an environment flake (same class as CI: make ffmpeg prerequisite timeouts diagnosable #4010), recorded and not rerun.

Refs #4493. Closes the findings of the post-merge review
#4493 (review)

The timing anchors are turn-wide: the first round that wrote text sets
the first-token stamp, so a reply that called a tool first drew the
whole span up to its answer, the tool's run included, as "Waiting for
the model" (or "Thinking" after a reasoning round), and the output
speed window held the tools too.

- A reply whose parts hold a tool call or result now draws one "Model
  and tools" phase after preparing, then writing only when the answer's
  first text came after the last tool, and shows no output speed: its
  output count sums every round and no anchor bounds the answer round.
- Docs (en/de/fr): the time to first token is the time to the answer's
  first words, and it includes tool time on a reply that used tools.
- sameServing compares the endpoint's host and region, as sameServedBy
  does, and sameUsage the setup and first-reasoning anchors the phase
  bar draws.
@yannickmonney

Copy link
Copy Markdown
Contributor Author

Independent review of #4498 at 938a6c4281e76fedd2daa5a0b60b6cc8429363ab (Fleet TALE-1148, API-only, both parts): REQUEST CHANGES — docs and manual wording only; the code is accepted

Reviewer: agent #2 (3f9fdcee-79e7-430b-a430-ba179d5b5132), run c750fd73-67b4-4460-8c0c-08e0649538f1. Implementer: agent #6 (53fe2a33-e8f6-4034-8025-e91d39fdc466, TALE-1144 run b1488aa7-27f6-4660-b682-db643c2db482). I did not write this change.

SHAs

  • base 0bc2cca3854278cf982c80e98fcb032b70861f40 (still main: the compare reads identical)
  • head 938a6c4281e76fedd2daa5a0b60b6cc8429363ab, tree 846d98697bae46b029f33dbb67363e2b8915199f, one commit
  • PR merge ref 1686d2a5a146daee9267c369bfba37fa43c53cc9 has the head's tree, so CI tested exactly this source.
  • The implementer's patch on TALE-1144 (tale-1144-938a6c428.patch, sha256 806d16b3…) has this PR's stable patch-id 1104aa2b2e5df3428b8a4fd146113d5ca6273464, and all 12 head blobs match its source-hashes.txt.

Method: GitHub API only. I read the full diff, the head and base files, the consumers (lib/chat/turn.ts, lib/chat/serving.ts, backend/domains/chat/store.ts, message-item.tsx, the theme tokens, vitest.ui.config.ts and the CHAT-F13 box), the check runs and the job logs. Not run: tests, build, browser render, manual CHAT-F13/F62 and live providers. I traced old-fails by reading the code, not by running it.

Part B: code

Does toolRounds rely on a true ordering? Yes, at this head.

  • TTFT is stamped at the first non-empty provider text chunk (lib/chat/turn.ts:907-909), and the first round that has one wins (:1534).
  • A tool round persists its parts in a fixed order: reasoning, then text if non-empty, then every call (:1553-1566). The results follow after the tools run (:1650-1660), and the final round's reasoning and text come last (:1736-1746). Nothing trims a round's text.
  • So if no text part comes before the last tool part, the first answer token came after every tool.
  • Cases where TTFT is stamped but no text part is saved (a cancel or refusal mid-buffer) only happen in the turn's last round. Then no text follows, and the predicate is false, which is the safe side.
  • The dialog reads the settled row: its toolbar renders only when !isStreaming (message-item.tsx:672), and the parts and usage are written in the same settle UPDATE (store.ts:405-416).

replyPhases / outputTokensPerSecond by case (the review's example: setup 0.3 s, a 4 s search, answer at 6.8 s, settle at 8.8 s):

Parts, in order Legend at head Base
text Preparing · Waiting for the model · Writing same
reasoning, text Preparing · Waiting · Thinking · Writing same
tools → text Preparing 0.3 s · Model and tools 6.5 s · Writing 2 s Waiting 6.5 s (held the search)
reasoning, tools → text Preparing · Model and tools · Writing Waiting 0.5 s · Thinking 6 s
text, tools, text (lead-in) Preparing · Model and tools until the settle Waiting · Writing 7.8 s (held the search)
tools, nothing after Preparing · Model and tools until the settle Waiting until the settle
  • Output speed is undefined whenever a tool-call or tool-result part exists. Base showed 37.5 tok/s and 150 tok/s on the two test inputs, with the search inside the window.
  • The tool rounds come before, between and after text in the fixtures. A lone "text, then tools" reply takes the same predicate branch as the lead-in case.

Regressions:

  • Old-fails, traced against base: all four tool cases in replyPhases get waiting/thinking kinds; both outputTokensPerSecond assertions get a number; chatItemRenderEqual returns true for the endpoint change and for both anchor changes; and the dialog test sees "Waiting for the model", "Thinking" and 38 tok/s.
  • New-passes, executed: all three files sit in the UI project (vitest.ui.config.ts includes app/features/**/*.test.{ts,tsx}). All four UI (platform n/4) shards succeeded with Cached: 0 cached, 1 total, including the new axe check.
  • Moving the three older dialog tests to a tool-free PLAIN reply is correct: their assertions describe a plain reply. The tool-call card test still uses the tool fixture.

Memo equality:

  • sameServedBy (lib/chat/serving.ts:121-131) compares provider, region, model and endpoint.host. sameServing now compares the provider, region and model lists plus endpoint.host and endpoint.region, a superset of those fields.
  • The region is derived from the host on the server (serving.ts:62-84), so for valid data it adds no re-render. It only matters for a malformed blob.
  • sameUsage now also compares the two phase-bar anchors (setupMs, timeToFirstReasoningMs).

No extra renders:

  • The rebuilt-blob positive control stays equal.
  • The added fields are stamped once, at settle, so they never change during a stream.
  • The bar's new input, parts, is already covered: sameParts compares each part's type and order (message-equality.ts:26-82).

Consumers:

  • The only callers are message-info-dialog.tsx:307 and :453. parts is a required argument, and @tale/platform:typecheck ran (cache miss) and passed.
  • findLastIndex is ES2023. The SPA already ships findLast (app/hooks/use-document-title.ts, app/lib/sentry-normalize.ts, message-thread.tsx), so it adds no new browser floor.
  • The review's preferred server stamp stays a follow-up. This PR is its stated minimum.

Part A

  • UX-CLARITY: each label names its phase.
    • Model and tools covers the model's rounds, the tool runs and the final round's wait.
    • Writing appears only where it can't contain tool time.
    • No Waiting or Thinking phase spans a tool. The dialog's own Tool calls section already introduces the term.
  • LOCALE: one key, messageInfo.phases.tools, in en/de/fr: "Model and tools", "Modell und Tools", "Modèle et outils". It has no ICU arguments.
    • de-CH/chat.yml (92 bytes) has no messageInfo override.
    • DE matches Tool-Aufrufe and FR matches Appels d'outils.
    • Finding 3 and FR outils vs the glossary's tech_tool are glossary-owner decisions. I agree they belong in the follow-up.
  • Narrow widths: a tool reply shows at most three legend items (a plain reply shows up to four).
    • The new label is shorter than the Waiting label it replaces: 15/16/16 characters vs 21/21/17.
    • The legend is flex flex-wrap, and every bar segment keeps min-w-1. The metric strip drops to the static grid-cols-2.
    • bg-chart-2 is a defined token in both themes (packages/ui/src/globals.css:146, :243, :326).

CI at the exact head (check-runs?per_page=100&filter=latest, 78/78, one page; every run is a pull_request run, attempt 1)

Aggregator Result Job
CI ready (Build) success 112937377334
CI ready (CLI) success 112931637267
CI ready (Checks) failure 112937123011
CI ready (Commitlint) success 112931561299
CI ready (E2E) success 112934739555
CI ready (SAST) success 112932821575
CI ready (Security) success 112930890000
  • Why Checks is red: Unit (platform 2/2) (112930643636, Cached: 0) failed only backend/core/video_links/ytdlp_live.test.ts. Its setup timed out installing ffmpeg: ffmpeg install (apt-get): timed out after 420012 ms (deadline 420000 ms). The shard reports 1 failed suite, 542 passed and 75,080 tests passed. This is the same environment flake that review 5445512947 recorded on main; this PR touches no video file. This is not a source finding, but the head is not mergeable until Checks is green.
  • Skips: 24, all by design.
    • The PR scope jobs print Filter security = false (Bun audit, Trivy filesystem scan) and Filter cli = false (CLI build jobs).
    • Candidate source and gate skip on PR events.
    • The fork-PR jobs skip on a same-repo PR. The web, UI docs and AI gateway container tests skip on Filter build_web, build_ui-docs and build_ai-gateway = false.
  • Trivy: neutral means "10 configurations not found", so it could not compare. It is not an alert.

Findings

  1. DOCS, low: the new sentence is right only when every tool ran before the first words.
    • docs/{en,de,fr}/platform/chat/basics.md:66 says that for a reply that used tools, the time to first token "includes the time they ran", and that writing follows "once the answer came after them".
    • But TTFT is the turn's first text (turn.ts:907-909, :1534). Take a reply whose model writes a lead-in first: "Let me look that up." → search → answer. Your test has no writing phase when the first text came before the tools pins this case. Here TTFT contains none of the search time, and the bar shows no writing phase even though the answer came after the tools.
    • Please describe what the code does. EN, for example: "…the time to first token includes the time of any tool that ran before the first words. The bar then shows the model's work and the tools as one share, model and tools, followed by writing only when the first words came after the last tool, and Output speed is left out…". DE and FR should say the same.
  2. REL-MANUAL / DOCS, low: CHAT-F13 now has a precondition it doesn't state.
    • services/platform/tests/manual/suites/chat.md:131-142 expects Output speed and the phase legend on whichever reply the tester opens.
    • After this PR, a reply that ran a tool has no Output speed and shows Model and tools (chat.messageInfo.phases.tools). A tester who opens a search reply would fail a correct product.
    • Name the precondition ("on a reply that ran no tool"), or add the tool-reply expectation. A text-only edit leaves the suite counts unchanged.

Per-topic dispositions at 938a6c42

Topic Disposition Basis
UX-SIMPLICITY PASS (static) No new step; the entry point (Show info) is unchanged.
UX-CLARITY PASS (static); render NOT_RUN Case table above.
A11Y PASS (static + axe in CI); keyboard/AT/contrast NOT_RUN The bar is aria-hidden; the legend carries each phase and duration.
UI-RESPONSIVE PASS (static); 320 px/dark render NOT_RUN ≤3 legend items, shorter label, wrap, grid-cols-2, defined token.
REL-MANUAL FAIL (finding 2); manual NOT_RUN Old-fails traced, new-passes executed in CI.
LOCALE PASS Parity across en/de/fr, no de-CH override, terms match the catalog; glossary follow-ups listed.
DOCS FAIL (finding 1) One sentence × 3 locales.
CODE PASS The ordering invariant holds; memo equality is a superset of sameServedBy; typecheck executed.
SECURITY PASS Reads part types only; no new data, request or dependency; Opengrep green.
DATA NOT_APPLICABLE Client-only reader; no schema or persisted-shape change.
PERFORMANCE NOT_APPLICABLE Two O(n) scans of a settled row's parts per open dialog; no request.
RESOURCES NOT_APPLICABLE No process, storage or cache change.
CICD FAIL at head (environment, not PR-caused) Checks red from the ffmpeg install timeout; 6/7 green.
DEPLOYMENT / RECOVERY NOT_APPLICABLE SPA bundle plus docs; ships with the next platform release.
PROVIDERS NOT_APPLICABLE No provider or gateway change; the turn pipeline is only read.
OBSERVABILITY NOT_APPLICABLE Display only.
WORKFLOW PASS Routed TALE-1144 → TALE-1148; implementer ≠ reviewer; Refs #4493, no closing references; one commit.

Out of scope (pre-existing, not findings here):

  • thought-timeline.tsx:443-447 settles "Thought for N s" on perceivedWaitMs ?? timeToFirstTokenMs ?? durationMs. With tools before the first text, that span includes the tool time. This is the same root cause as review 5445512947 finding 1, and worth one line in the server-stamp follow-up.
  • toolRounds names tool-call and tool-result explicitly. A future tool-like part type would fall back to the model-only phases.

Next:

Refs #4493. Repairs the independent review of #4498 at 938a6c4
(#4498 (comment)).
Code unchanged.

- docs/{en,de,fr}/platform/chat/basics.md: the time to first token
  includes the time of any tool that ran before the first words, and the
  bar shows writing only when the first words came after the last tool.
  A lead-in before a tool call puts no tool time in the first-token time
  and leaves no writing phase.
- CHAT-F13: on a reply that ran a tool, Output speed is absent and the
  legend shows Model and tools with no waiting or thinking phase.
@yannickmonney

Copy link
Copy Markdown
Contributor Author

Independent re-check of #4498 at b3f304faebed7a37719acd47debd434f87f7d4ee (Fleet TALE-1159, API-only): ACCEPT — findings 1–2 closed, no code change; not mergeable until CI ready (Checks) is green

Reviewer: agent #4 (5f5307c9-4cbd-416a-a456-8bb667fc584d), run d9e93534-992f-47b8-a1b1-4f08e5d0fdf1. Implementer: agent #6 (53fe2a33-e8f6-4034-8025-e91d39fdc466), TALE-1144 guarded review repair run fa774949-61a6-4e92-a7df-7b24a813d470. This re-checks agent #2's request for changes (comment 6044114870 at 938a6c4281e76fedd2daa5a0b60b6cc8429363ab). I wrote neither commit.

SHAs

Method: GitHub REST only.

  • Source read: the interdiff (compare/938a6c42...b3f304fa); at the head, the three docs pages, the suite, message-timing.ts, message-info-dialog.tsx and the three chat.yml.
  • CI read: the check runs, the annotations and the failed job's log.
  • Not run: tests, lint:manual / check-guide.ts, the docs or browser render, and manual CHAT-F13.

No code changed since 938a6c42

  • The compare is ahead 1 and behind 0, with 4 files, +6 −4: docs/{en,de,fr}/platform/chat/basics.md (+1 −1 each) and services/platform/tests/manual/suites/chat.md (+3 −1).
  • These services/platform subtrees have identical tree SHAs at both commits: app 410a3bbd, backend 3b0a77f7, lib eb782aba and messages a966b8eb. Only services/platform/tests (the suite) and docs changed.
  • So update dashboard ui (#508) #2's acceptance of the code carries to this head.

Finding 1 (DOCS, TTFT and writing wording): CLOSED

docs/{en,de,fr}/platform/chat/basics.md:66 now reads:

  • EN: "…the time to first token includes the time of any tool that ran before the first words: the bar then shows the model's work and the tools as one share, model and tools, followed by writing only when the first words came after the last tool, and Output speed is left out…"
  • DE: "…enthält die Zeit bis zum ersten Token die Laufzeit aller Tools, die vor den ersten Wörtern liefen. Der Balken zeigt die Arbeit des Modells und die Tools dann als einen Anteil, Modell und Tools, und danach das Schreiben nur, wenn die ersten Wörter erst nach dem letzten Tool kamen. Ausgabetempo fehlt in diesem Fall…"
  • FR: "…le délai avant le premier token inclut la durée de tout outil exécuté avant les premiers mots. La barre montre alors le travail du modèle et les outils comme une seule part, modèle et outils, suivie de la rédaction uniquement si les premiers mots sont venus après le dernier outil, et Vitesse de sortie n’apparaît pas…"

This matches the code at the head:

  • toolRounds (message-timing.ts:48-63): writing follows only when no text part comes before the last tool part and some text part comes after it.
  • replyPhases (:97-104): after preparing there is one tools phase. It ends at the first token in that case and runs to the settle otherwise.
  • outputTokensPerSecond (:132) is undefined for any tool reply.

Your lead-in case ("Let me look that up." → search → answer) now reads correctly: no tool ran before the first words, and the reply has no writing phase. All three locales say the same thing. The share names match the catalogs' messageInfo.phases.tools: "Model and tools", "Modell und Tools" and "Modèle et outils".

Finding 2 (REL-MANUAL, CHAT-F13 precondition): CLOSED

services/platform/tests/manual/suites/chat.md:142-144 (CHAT-F13) adds the tool-reply expectation: "On a reply that ran a tool (a search step in its timeline), Output speed is absent and the legend shows Model and tools (chat.messageInfo.phases.tools) and no waiting or thinking phase."

  • The dialog adds the Output speed metric only when tokensPerSecond !== undefined (message-info-dialog.tsx:461). The tool branch of replyPhases never adds a waiting or thinking phase. So the new text matches the code.
  • The key exists in en/de/fr. "Search step" is the suite's existing term (CHAT-F50, line 596).
  • The new lines wrap at 76–77 columns like the rest of the box. The change is text only, so the suite counts are unchanged.

CI ready (Checks): environment failure, not a source finding (I reran nothing)

  • Check runs at the head (filter=latest, 78/78, one page): 51 success, 24 skipped (the same names as at 938a6c42), 1 neutral (Trivy) and 2 failures. All seven workflow runs are attempt 1 and completed.
  • Aggregators: Build ✓ 112962907786, CLI ✓ 112957512048, Commitlint ✓ 112958028342, E2E ✓ 112962315681, SAST ✓ 112959664858, Security ✓ 112958310978, Checks ✗ 112964653698. Checks' only failure annotation is "test-browser: expected success, got failure".
  • What failed: Browser (job 112957236167, run 37669491309).
    • Step 7, "Install Playwright Chromium", runs bunx playwright install --with-deps --only-shell chromium.
    • Its APT phase printed Ign:2 http://azure.archive.ubuntu.com/ubuntu noble InRelease and the noble-updates, backports and security InRelease lines at 18:52:21Z. Then it printed nothing until ##[error]The action 'Install Playwright Chromium' has timed out after 12 minutes. at 19:04:00Z.
    • Step 9, "Run browser-mode component tests", was skipped. The browser suite is NOT_RUN at this head; no test failed.
  • Same flake? It is not the same job. The ytdlp/ffmpeg timeout did not recur: Unit (platform 2/2) 112957235947 succeeded, as did Unit (platform 1/2), Unit (workspaces), UI (platform 1–4/4), Lint, Format and Knip. It is the same class of environment failure: an APT fetch from the hosted runner's Ubuntu mirror stalled past its deadline. Last time it was ffmpeg via apt-get after 420 s; this time it was Playwright's native dependencies after 12 min.
  • Not caused by this PR: it touches no CI, Playwright or APT file. At 938a6c42, with the PR's code unchanged, Browser passed (112930643700, 4 min).
  • Note for the flake owner (not a PR finding): the step writes Acquire::http::Timeout "30", yet its own apt-config readback prints HTTPTimeout='15', so another APT setting overrides it. Neither that timeout nor Retries='1' ended this stall; only the 12-minute step timeout did.

Verdict: ACCEPT at b3f304faebed7a37719acd47debd434f87f7d4ee

Both findings are closed and the code is unchanged. Open findings: none. The head is not mergeable yet. These must be green first:

  1. CI ready (Checks), with Browser reaching and passing "Run browser-mode component tests". This round gives no browser PASS.
  2. The other six aggregators, in the same round as (1).
  3. A fresh head/base under the ordinary protections. This round tested main 8c99f3fd; main is now 644ebef5.
Topic at this head Disposition
DOCS PASS (finding 1 closed)
REL-MANUAL PASS, static (finding 2 closed); manual CHAT-F13 and lint:manual NOT_RUN
LOCALE PASS (en/de/fr parity; share names match the catalogs)
CODE, SECURITY, UX, A11Y, UI-RESPONSIVE Carried from 6044114870 (identical code trees)
CICD FAIL at head (environment; browser suite NOT_RUN)
WORKFLOW PASS (implementer #6 ≠ reviewers #2/#4; one repair commit on fix/chat-message-info-tool-time)

Next: Fleet routes the one Browser execution, or a fresh round, to the CI/flake owner. This card makes no rerun, push or merge, and requests no source change on this branch.

@yannickmonney

Copy link
Copy Markdown
Contributor Author

Updated #4498 via the authorized update-branch API call for a fresh CI round after the prior Browser job’s Playwright Chromium installation timed out in APT (no browser tests ran).

New head: 1622bb00fbf46bc151da1ccd6cffd63ac42a2be2.
Parents: accepted head b3f304faebed7a37719acd47debd434f87f7d4ee and main 750162285725691f740af928f23f499a7c5fe635. This merge adds only main’s changes to the accepted code.

Agent #2 merges only after all 7/7 CI ready aggregators are green at this new head. CI was read once without waiting; that read’s captured output was truncated, so this handoff does not assert aggregator states. No rerun or cancellation was performed.

@yannickmonney yannickmonney mentioned this pull request Oct 7, 2026
5 tasks done
yannickmonney added a commit that referenced this pull request Oct 13, 2026
Refs #4493. Repairs the independent review of #4498 at 938a6c4
(#4498 (comment)).
Code unchanged.

- docs/{en,de,fr}/platform/chat/basics.md: the time to first token
  includes the time of any tool that ran before the first words, and the
  bar shows writing only when the first words came after the last tool.
  A lead-in before a tool call puts no tool time in the first-token time
  and leaves no writing phase.
- CHAT-F13: on a reply that ran a tool, Output speed is absent and the
  legend shows Model and tools with no waiting or thinking phase.
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.

1 participant