Skip to content

Commit bdbabb4

Browse files
#925's two conversation sentences are false now, so they go
The rebase carried #925's words onto a tree where the cut makes them untrue. `a pick in a conversation you are sitting in front of still lands on your next message` and `a model you pick with /model does not redirect a rescue that is already happening` were both true on the day they were written and neither survives the request boundary: a pick lands on the next REQUEST, and a person's word is the head of the chain. The room's own sentence loses its rescue clause with them. It was worth a clause while the pick had to wait for a move somebody else made; now the next request carries the pick whether that request is a rescue, a retry or the step's own next step, so naming the rescue would name one road out of three. #925's `TaskNode.picked` is untouched. It owns where a node's NEXT WORKER is built and this owns the request already out — two scopes, no second mechanism. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
1 parent 7fe96fd commit bdbabb4

3 files changed

Lines changed: 21 additions & 18 deletions

File tree

‎docs/changes/unreleased/935-persons-word-cuts.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ invalidates:
1212
- "`Agent.Steer` cancelled `a.generation` itself. `Agent.cutGenerationLocked` is the only place in `internal/session` that cancels a generation, and `internal/session/generation_law_test.go` fails the build on a second one."
1313
- "`Agent.SetReasoning` said a level latches for the turn `exactly as the model does`. The two rules are deliberately different now — a level lands at the next Submit, a model at the next request — because turning the thinking up is setting a level for the next thing you ask and changing models is redirecting work you are watching go the wrong way."
1414
- "The five manual claims that a model picked inside a task's room takes effect on `the task's next turn` (tasks.md, models-and-cost.md twice, how-tasks-run.md, screen.md, task-controls.md) are replaced by the next REQUEST and the two landings. models-and-cost.md has a new section for somebody who pressed a model mid-reply."
15+
- "#925 landed the half of this that could be said a day earlier and its words are superseded here, not contradicted. The room's `the next turn takes it; a rescue goes to it first` is gone: the rescue no longer needs a clause of its own, because the pick rides the next request whether that request is a rescue, a retry or the step's own next step. And #925's two conversation sentences — `a pick in a conversation you are sitting in front of still lands on your next message` and `a model you pick with /model does not redirect a rescue that is already happening` — are both false now and are replaced in models-and-cost.md. #925's `TaskNode.picked` is untouched and still owns where a node's NEXT WORKER is built; this owns the request already out."
1516
---
1617

1718
The owner's evidence, 2026-09-11 14:40:10: a task step on `waiting · rate limited

‎internal/manual/chat/models-and-cost.md‎

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1157,10 +1157,11 @@ the model went quiet mid-reply · moving to gpt-5-mini
11571157
The turn finishes there and the cost lands against the model that actually answered. **It
11581158
is a rescue, not a choice you made**: your model is untouched, `/status` still shows it,
11591159
and your next message goes back to it. If it keeps stalling, `/model` is how you move for
1160-
good.
1160+
good — and it does not wait for the stall to finish: name a model while nothing has come
1161+
back and that request is let go of and asked again on yours.
11611162

1162-
Only when there is nowhere to go — you are on `--one-model`, or no chain resolves — does
1163-
the turn end instead:
1163+
Only when there is nowhere to go — you are on `--one-model`, or no chain resolves, **and
1164+
you have not named a model yourself** — does the turn end instead:
11641165

11651166
```
11661167
error: nothing came back from the model in 1m30s, three times. a different model may answer — /model, or set models.fallbacks so this can move on its own
@@ -1343,15 +1344,16 @@ there is no ceiling, only the deadline. That patience is the *call's* own, insid
13431344
request. What happens when the whole request
13441345
keeps failing — several 429s in a row, a `502` between them — is the next section.
13451346

1346-
**Inside a task, picking another model is worth doing while this is happening.** The call in
1347-
flight finishes on the model it started on, and so does the rest of that step — but a step
1348-
being paced no longer just sits there: it moves to **the model you picked in the task's
1349-
room**, rather than to the next name in your `fallback models` row, and it says so in the
1350-
run's own log. Before 2026-09-11 a rate limit was the one failure that moved nothing at
1351-
all, so a pick made over a stuck step was read only after something else had already
1352-
rescued it. This is about a task's model; **a pick in a conversation you are sitting in
1353-
front of still lands on your next message.** See *I changed the model but my task is still
1354-
on the old one*.
1347+
**Picking another model is worth doing while this is happening, and it is the fastest way
1348+
out of it.** A call that is only waiting has given you nothing, so it is **let go of at
1349+
once** and asked again on the model you named — within a second, in a task's room and in
1350+
the conversation alike. A step being paced no longer just sits there. If the answer had
1351+
already begun arriving, it finishes on the model it started on and the step's next request
1352+
is on yours; either way the move goes to **the model you picked**, rather than to the next
1353+
name in your `fallback models` row, and it says so in the run's own log. Before 2026-09-11
1354+
a rate limit was the one failure that moved nothing at all, so a pick made over a stuck
1355+
step was read only after something else had already rescued it. See *Can I switch models
1356+
while it is replying* above, and *I changed the model but my task is still on the old one*.
13551357

13561358
## The model kept refusing and aforge moved to another one — 429 and 502 in a row, my turn died while another model was working, does a refusal reach my fallback models
13571359

@@ -1385,10 +1387,10 @@ the model would not take the request · moving to gpt-5-mini
13851387
The new model gets a whole give-up of its own — what the last one did says nothing about
13861388
this one — and the cost lands against the model that actually answered. **It is a rescue,
13871389
not a choice you made**: your model is untouched, `/status` still shows it, and your next
1388-
message goes back to it. **In a conversation the chain is the whole of it** — a model you
1389-
pick with `/model` applies to your next message and does not redirect a rescue that is
1390-
already happening. Inside a task's room it is different, and *Changing the model for one
1391-
task while it is running* on the tasks page says how.
1390+
message goes back to it. **But a model you name is the head of that chain** — pick one with
1391+
`/model` while the moving is happening and the next move goes to yours instead of to the
1392+
next name in the row, in the conversation exactly as in a task's room. *Changing the model
1393+
for one task while it is running* on the tasks page says what a room adds to that.
13921394

13931395
**It did not use to.** Until this changed, only a *cut* reply reached your fallback models;
13941396
a refusal walked the four tries and then ended the turn, so a measured conversation on

‎internal/session/taskretarget_test.go‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,8 @@ func retargetAgent(t *testing.T) (*Agent, *TaskNode, *Agent, func()) {
7777

7878
// A RUNNING NODE MOVES, AND EVERYTHING THAT RECORDS ITS MODEL MOVES WITH IT: the
7979
// spec the checkpoint is written from, the row a surface draws, and the worker
80-
// itself — which is what makes the switch a fact about the next turn rather than
81-
// a label.
80+
// itself — which is what makes the switch a fact about the work rather than a
81+
// label. WHEN it reaches the work is the separate law in personsword_test.go.
8282
func TestRetargetTaskMovesARunningNodeAndEveryRowThatNamesIt(t *testing.T) {
8383
agent, node, child, land := retargetAgent(t)
8484
updates := agent.TaskUpdates()

0 commit comments

Comments
 (0)