The first Claude venture builds (#148, #149) died on 'content': Hands.call("write_file") got a path and no content. A whole page in one call ran past the output limit (16000 tokens), and the cut-off call ended the paid run.
Hands.call("write_file"): without a string path or content, it returns an error naming the missing field, says the call was most likely cut off at the output limit, and asks for smaller files
venice_work: a KeyError/TypeError/ValueError/AttributeError from any tool call becomes an error: <tool> could not run (...) result for the model, so one malformed call doesn't throw away the run (gh/git failures still raise as before)
test 14d: a scripted worker sends a cut-off write_file and an argument-less read_file first; both come back as errors, and the run goes on to write its file and open the PR
Closes #154
The first Claude venture builds (#148, #149) died on `'content'`: `Hands.call("write_file")` got a path and no content. A whole page in one call ran past the output limit (16000 tokens), and the cut-off call ended the paid run.
- `Hands.call("write_file")`: without a string `path` or `content`, it returns an error naming the missing field, says the call was most likely cut off at the output limit, and asks for smaller files
- `venice_work`: a KeyError/TypeError/ValueError/AttributeError from any tool call becomes an `error: <tool> could not run (...)` result for the model, so one malformed call doesn't throw away the run (gh/git failures still raise as before)
- test 14d: a scripted worker sends a cut-off `write_file` and an argument-less `read_file` first; both come back as errors, and the run goes on to write its file and open the PR
Suite green locally (`ALL OK 79`).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
CI (ci / test) is green and the diff does what card #154 asks. The finish line itself (the next venture tick getting #148 and #149 past their first big write) can't be checked from the diff; it only holds after merge and a real run.
.github/time/time.py:1039-1045: write_file now returns an error instead of raising when path or content isn't a string. The message says the call was most likely cut off at the output limit and asks for smaller files. Empty-string content still passes, as it did before.
.github/time/time.py:1045: when both fields are missing, the message names only path. The model gets less guidance than it could. Minor, and the next step still works.
.github/time/time.py:1180-1183: the loop catches only KeyError, TypeError, ValueError and AttributeError. CalledProcessError and RuntimeError from gh/git still propagate, as the PR says. Broad enough for the failure in the card, narrow enough not to swallow infra errors.
.github/time/test_time.py:392-408 (test 14d): a scripted cut-off write_file plus an argument-less read_file both come back as tool errors, and the run still writes app.py and opens the PR. The assertions check the exact error text the model will see.
Scope: the change touches only the tool, the loop, its test and a CHANGELOG line. The CHANGELOG entry is accurate.
Residual risk: the output limit (TIME_WORKER_MAX_TOKENS, 16000) is unchanged. A cut-off call still wastes a paid turn, and recovery depends on the model splitting the file on its next step. That is the intended fix, but it is not a guarantee.
review by haiku · claude-haiku-5-5 · via Time
**Approve**
CI (`ci / test`) is green and the diff does what card #154 asks. The finish line itself (the next venture tick getting #148 and #149 past their first big write) can't be checked from the diff; it only holds after merge and a real run.
- `.github/time/time.py:1039-1045`: `write_file` now returns an error instead of raising when `path` or `content` isn't a string. The message says the call was most likely cut off at the output limit and asks for smaller files. Empty-string content still passes, as it did before.
- `.github/time/time.py:1045`: when both fields are missing, the message names only `path`. The model gets less guidance than it could. Minor, and the next step still works.
- `.github/time/time.py:1180-1183`: the loop catches only KeyError, TypeError, ValueError and AttributeError. `CalledProcessError` and `RuntimeError` from gh/git still propagate, as the PR says. Broad enough for the failure in the card, narrow enough not to swallow infra errors.
- `.github/time/test_time.py:392-408` (test 14d): a scripted cut-off `write_file` plus an argument-less `read_file` both come back as tool errors, and the run still writes `app.py` and opens the PR. The assertions check the exact error text the model will see.
- Scope: the change touches only the tool, the loop, its test and a CHANGELOG line. The CHANGELOG entry is accurate.
- Residual risk: the output limit (`TIME_WORKER_MAX_TOKENS`, 16000) is unchanged. A cut-off call still wastes a paid turn, and recovery depends on the model splitting the file on its next step. That is the intended fix, but it is not a guarantee.
<sub>review by haiku · claude-haiku-5-5 · via Time</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #154
The first Claude venture builds (#148, #149) died on
'content':Hands.call("write_file")got a path and no content. A whole page in one call ran past the output limit (16000 tokens), and the cut-off call ended the paid run.Hands.call("write_file"): without a stringpathorcontent, it returns an error naming the missing field, says the call was most likely cut off at the output limit, and asks for smaller filesvenice_work: a KeyError/TypeError/ValueError/AttributeError from any tool call becomes anerror: <tool> could not run (...)result for the model, so one malformed call doesn't throw away the run (gh/git failures still raise as before)write_fileand an argument-lessread_filefirst; both come back as errors, and the run goes on to write its file and open the PRSuite green locally (
ALL OK 79).🤖 Generated with Claude Code
https://claude.ai/code/session_017K4vyY3yUD3GsvoZaAtKkD
Approve
CI (
ci / test) is green and the diff does what card #154 asks. The finish line itself (the next venture tick getting #148 and #149 past their first big write) can't be checked from the diff; it only holds after merge and a real run..github/time/time.py:1039-1045:write_filenow returns an error instead of raising whenpathorcontentisn't a string. The message says the call was most likely cut off at the output limit and asks for smaller files. Empty-string content still passes, as it did before..github/time/time.py:1045: when both fields are missing, the message names onlypath. The model gets less guidance than it could. Minor, and the next step still works..github/time/time.py:1180-1183: the loop catches only KeyError, TypeError, ValueError and AttributeError.CalledProcessErrorandRuntimeErrorfrom gh/git still propagate, as the PR says. Broad enough for the failure in the card, narrow enough not to swallow infra errors..github/time/test_time.py:392-408(test 14d): a scripted cut-offwrite_fileplus an argument-lessread_fileboth come back as tool errors, and the run still writesapp.pyand opens the PR. The assertions check the exact error text the model will see.TIME_WORKER_MAX_TOKENS, 16000) is unchanged. A cut-off call still wastes a paid turn, and recovery depends on the model splitting the file on its next step. That is the intended fix, but it is not a guarantee.review by haiku · claude-haiku-5-5 · via Time