<feed xmlns='http://www.w3.org/2005/Atom'>
<title>claudomator.git/internal, branch main</title>
<subtitle>claudomator — task automation server
</subtitle>
<id>https://git.terst.org/claudomator.git/atom?h=main</id>
<link rel='self' href='https://git.terst.org/claudomator.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/'/>
<updated>2026-07-11T09:37:31+00:00</updated>
<entry>
<title>fix(executor): validate the model classifier's output against a known model list</title>
<updated>2026-07-11T09:37:31+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-11T09:37:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=027536520409757ba38cd4c78e07b2ca0797a2d7'/>
<id>urn:sha1:027536520409757ba38cd4c78e07b2ca0797a2d7</id>
<content type='text'>
The Gemini-based Classifier trusted its LLM output verbatim. Twice in
production it echoed part of its own prompt's JSON schema literally --
'model-name' (the prompt's own placeholder, also fixed here to be less
echo-prone) and separately 'choose-the-best-model' -- instead of
substituting a real model identifier. Both were syntactically valid JSON
strings that passed straight through to the claude CLI's --model flag,
which rejected them and failed the task outright. validateClassification
now rejects anything outside the known model list, which Classify's
existing error handling already treats as 'classification failed' and
falls back to no explicit model override -- the same documented fallback
path, now also covering 'succeeded but returned garbage.'
</content>
</entry>
<entry>
<title>fix(scheduler): retry role-typed FAILED tasks even with no active role_configs</title>
<updated>2026-07-11T08:33:10+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-11T08:32:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=7978760316319d22670cd6369c15b68c649761bc'/>
<id>urn:sha1:7978760316319d22670cd6369c15b68c649761bc</id>
<content type='text'>
Before this, a role with no seeded role_configs (every role except
builder/planner) got no retry safety net at all: processTask returned
immediately on GetActiveRoleConfig's error, leaving a task FAILED forever
after a single transient infra blip. retryWithoutLadder mirrors
escalateAskUserTimeout's existing 'no active role config -- still
resuming, just without a provider/model change' fallback, bounded by
maxRetriesNoRoleConfig (2) before declining final=true. Same treatment
now applies to a decoded role config with an empty EscalationLadder.
</content>
</entry>
<entry>
<title>fix(scheduler): make arbitration fail-closed on a missing verdict, seed planner's system prompt</title>
<updated>2026-07-11T05:38:25+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-11T05:37:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=204fe6c536d5d3bca2cb712f66b1d63054807dac'/>
<id>urn:sha1:204fe6c536d5d3bca2cb712f66b1d63054807dac</id>
<content type='text'>
A live production run (2026-07-11) showed finalizeArbitration's 'no
verdict reported = approve' default silently shipping work an evaluator
had already flagged as factually wrong -- the arbitration agent never
called report_verdict because the planner role had no system prompt
telling it to. finalizeArbitration now treats a missing verdict the same
as an explicit rejection (fail-closed), and SeedRoleConfigs now also
seeds planner with a prompt that explicitly mandates calling
report_verdict before finishing.
</content>
</entry>
<entry>
<title>fix(executor): periodically sweep stale dispatch workspace directories</title>
<updated>2026-07-10T22:13:49+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-10T22:13:49+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=06c9730441593c191f968f8041a0e76f56368a39'/>
<id>urn:sha1:06c9730441593c191f968f8041a0e76f56368a39</id>
<content type='text'>
ContainerRunner preserves a failed execution's workspace indefinitely for
debugging, with no expiry -- this accumulated 161 stale directories
(~17.6GB) and took the host to 100% disk full on 2026-07-10. Pool.RunWorkspaceCleanup
sweeps claudomator-workspace-* dirs older than 24h every hour, started from
serve.go, mirroring StoryOrchestrator.Run's ticker shape. Never removes a
directory still referenced as a currently-BLOCKED task's sandbox_dir,
regardless of age.
</content>
</entry>
<entry>
<title>feat(storage): seed the builder role's system prompt on server startup</title>
<updated>2026-07-10T20:22:30+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator</email>
</author>
<published>2026-07-10T20:22:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=3728fb07ddc9c3a85cf4f2152b35e090618f87db'/>
<id>urn:sha1:3728fb07ddc9c3a85cf4f2152b35e090618f87db</id>
<content type='text'>
</content>
</entry>
<entry>
<title>refactor(scheduler): migrate story fix loop off RootTaskID re-pointing onto CurrentAttempt resolution</title>
<updated>2026-07-10T20:06:20+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator.local</email>
</author>
<published>2026-07-10T20:06:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=34380da06b1b0f2088f83c1edcb0b506e3196cca'/>
<id>urn:sha1:34380da06b1b0f2088f83c1edcb0b506e3196cca</id>
<content type='text'>
</content>
</entry>
<entry>
<title>refactor(scheduler): recurse processStory into a tree walk over every READY builder-role node</title>
<updated>2026-07-10T19:29:58+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator.local</email>
</author>
<published>2026-07-10T19:29:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=c812eeac49f5ebbcf8b9855a3f56ac4940e074d8'/>
<id>urn:sha1:c812eeac49f5ebbcf8b9855a3f56ac4940e074d8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>refactor(scheduler): generalize finalizeArbitration to any builder-role node, add nested fix-attempt spawning and acceptance-criteria fallback</title>
<updated>2026-07-10T05:49:36+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator.local</email>
</author>
<published>2026-07-10T05:49:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=063a6c1661a91370e2f70d7fab670acd09561619'/>
<id>urn:sha1:063a6c1661a91370e2f70d7fab670acd09561619</id>
<content type='text'>
</content>
</entry>
<entry>
<title>refactor(executor): nested builder-role tasks go READY not COMPLETED, requiring external arbitrated review</title>
<updated>2026-07-10T03:03:50+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator.local</email>
</author>
<published>2026-07-10T03:03:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=2c8a5c17dd43bee329f62a9c662d04571b9cd2d7'/>
<id>urn:sha1:2c8a5c17dd43bee329f62a9c662d04571b9cd2d7</id>
<content type='text'>
</content>
</entry>
<entry>
<title>refactor(scheduler): promote story root to COMPLETED only after arbitration approves it, not eagerly on READY</title>
<updated>2026-07-10T00:49:10+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator.local</email>
</author>
<published>2026-07-10T00:49:10+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=dba9c2e0293f7dd0a4c08d9516df1c7f473c6d8f'/>
<id>urn:sha1:dba9c2e0293f7dd0a4c08d9516df1c7f473c6d8f</id>
<content type='text'>
</content>
</entry>
</feed>
