Skip to content

Test the two bounds that were written and never exercised - #285

Merged
adamjohnwright merged 1 commit into
mainfrom
011-phase9-polish
Sep 21, 2026
Merged

adamjohnwright merged 1 commit into
mainfrom
011-phase9-polish

Conversation

@adamjohnwright

Copy link
Copy Markdown
Contributor

Spec 011 Phase 9, less the two tasks that need a deploy (T036, T037).

Two bounds with no tests

T034 and T035 were implemented back in Phase 3 by copying the answer endpoint's patterns, and neither had a test. Written code is not working code, and both only run on paths nobody exercises deliberately.

The timeout now has one: a stuck model, the bound patched to 0.25s, and the stream must end with a terminal failed rather than holding the connection open. The stand-in hangs for a finite five seconds so a regression fails quickly instead of hanging the suite.

A second test the task did not ask for: a timed-out generation must not store its partial text. put already refuses empty text, but a truncated summary is not empty — it is worse, a plausible fragment ending mid-sentence that would then be served as the summary forever.

The abandoned-stream log has one too, driven through the response iterator rather than a client, because the point is to close it mid-stream and a TestClient will not. An abandoned stream is identical to a healthy one in every other signal: the request 200s, tokens flow, then nothing happens.

A stable form for column references

At the website's request. Expression summaries now refer to columns as column 1, column 2 and in no other form.

They hold the real labels and we never do, so they substitute them into our prose — which only works if our wording is fixed. They had decided to show labels alongside rather than splice on brittle matching; pinning the form is the better half of that trade. In the contract now.

All three verified by sabotage, each sabotage asserted to have applied.

🤖 Generated with Claude Code

Spec 011 Phase 9, less the two tasks that need a deploy.

T034 and T035 were implemented in Phase 3 by copying the answer endpoint's
patterns, and neither had a test. Written code with no test is not the same
as working code, and both of these only run on paths nobody exercises
deliberately.

The bound now has one: a stuck model, the timeout patched to 0.25s, and the
stream must still end with a terminal `failed` rather than holding the
connection. The stand-in hangs for a finite five seconds so a regression
fails quickly instead of hanging the suite.

And a second test the task did not ask for: a timed-out generation must not
store its partial text. `put` already refuses empty text, but a truncated
summary is not empty -- it is worse, a plausible fragment ending mid-sentence
that would then be served as the summary forever.

The abandoned-stream log has one too, driven through the response iterator
rather than a client, because the point is to close it mid-stream and a
TestClient will not. An abandoned stream is identical to a healthy one in
every other signal: the request 200s, tokens flow, and then nothing happens.

Also, at the website's request, expression summaries now refer to columns as
`column 1`, `column 2` and in no other form. They hold the real labels and we
never do, so they substitute them into our prose -- which only works if our
wording is fixed. They had decided to show labels alongside rather than
splice on brittle matching; pinning the form is the better half of that
trade, and it is in the contract now.

All three verified by sabotage, with each sabotage asserted to have applied.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@adamjohnwright
adamjohnwright merged commit d0c9a1e into main Sep 21, 2026
9 of 10 checks passed
@adamjohnwright
adamjohnwright deleted the 011-phase9-polish branch September 21, 2026 00:47
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