﻿# Provider notices from auxiliary requests never reach a chrome sink

- **Status**: Done
- **Kind**: Bug
- **Authors**: jp
- **Date**: 2026-09-23
- **Implements**: 090
- **Label**: domain=llm
- **Label**: package=jp_cli
- **Label**: package=jp_llm
- **Label**: package=jp_task
- **Label**: type=bug

`Event::Notice` reaches the user on the query path only.
`TurnCoordinator` prints it to stderr
(`jp_cli/src/cmd/query/turn/coordinator.rs`), but the three callers of
`collect_with_retry` do not:

| Caller                                 | What happens to a notice                    |
| -------------------------------------- | ------------------------------------------- |
| `jp_llm::title::generate`              | dropped by `event_builder::structured_data` |
| `jp_cli::cmd::query::tool::inquiry`    | dropped, never matched                      |
| `jp_cli::cmd::conversation::summarize` | `tracing::warn!`, invisible without `--log` |

RFD 090 makes the notice the audit trail for a money decision: *"switching from
fixed-cost to per-token billing is a money decision, and the notice is the audit
trail."* A title generation that falls through to `api_key` keeps that promise
only for the turn that triggered it.

`collect_with_retry` now returns notices at the front of its event list, and
keeps the ones from an attempt that later failed, so the remaining work is
delivery rather than plumbing inside `jp_llm`.

Delivery is the awkward part: none of the three callers holds a `Printer`, and
title generation runs in a `jp_task` background task that has no terminal at
all.
A sink has to be threaded in, or notices routed through the task handler's
existing reporting.

Contained for now: the cooldown that prompts a switch is persisted, so the next
main-path turn surfaces `skipping profile:… cooling down`.
The user learns one turn late rather than never.

## Comments

-----

- **From**: jp
- **Date**: 2026-09-23T10:40:25Z

Fixed in #1151.
`collect_with_retry` takes a `NoticeSink` and hands it every notice as it is
consumed, including notices from failed attempts and from a request that ends in
an error.
All callers pass `jp_cli::output::notice_sink`, which prints to stderr as
chrome: title generation (the background task and `jp c title`), inquiries, and
summarization (`jp c compact`, `jp q --compact`, `jp c fork --compact`).
