<feed xmlns='http://www.w3.org/2005/Atom'>
<title>claudomator.git, 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:52:47+00:00</updated>
<entry>
<title>docs: fix workflow diagram — create_story does not auto-spawn a builder task</title>
<updated>2026-07-11T09:52:47+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator.local</email>
</author>
<published>2026-07-11T09:52:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=8c9c659ef2352705eeff9660b315f50ee1bf143f'/>
<id>urn:sha1:8c9c659ef2352705eeff9660b315f50ee1bf143f</id>
<content type='text'>
The StoryOrchestrator skips stories with no root_task_id (if st.RootTaskID == "")
so create_story / POST /api/stories do not trigger Builder spawning on the next tick
as the diagram incorrectly claimed. Corrected the flowchart node, the entry-point
table rows, and added an explanatory note on the story lifecycle kickoff flow.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<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>docs: fix workflow diagram — webhook and spawn_subtask don't auto-submit to pool</title>
<updated>2026-07-11T07:46:30+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator</email>
</author>
<published>2026-07-11T07:46:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=5caa21a204b6eec9362583dc237afa775e1f40d8'/>
<id>urn:sha1:5caa21a204b6eec9362583dc237afa775e1f40d8</id>
<content type='text'>
- GitHub webhook (createCIFailureTask) only calls store.CreateTask with
  PENDING state; it never calls Pool.Submit. Previous diagram said
  "creates task + auto-runs" which was wrong.

- spawn_subtask (both role= and no-role= variants) only calls
  store.CreateTask with PENDING state via storeChannel.SpawnSubtask.
  The pool is not called. Previous diagram labelled this "Pool.Submit()
  for new child/sibling" which was wrong.

- Both spawn_subtask variants always set parent_task_id. The "sibling
  with depends_on" description for the role= case was misleading.

- propose_epic and propose_role_config are storage-only writes with no
  connection to the pool at all. Previous diagram drew arrows from these
  to executor.Pool; removed and replaced with a STORAGE node.

- Added explicit note that PENDING children need a separate /run call
  (scripts/start-next-task, StoryOrchestrator.spawnRoleTask, or manual).

- StoryOrchestrator's spawnRoleTask correctly creates + QUEUED +
  Pool.Submit in one step; that path remains accurate.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</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>docs: add workflow and entry points diagram</title>
<updated>2026-07-11T01:19:24+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator</email>
</author>
<published>2026-07-11T01:19:24+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=858756244129fa326af53495561882b51815f4d3'/>
<id>urn:sha1:858756244129fa326af53495561882b51815f4d3</id>
<content type='text'>
Covers all entry points verified against current code:
- REST API (POST /api/tasks + /run), chatbot MCP (submit_task,
  create_story, accept_story), GitHub webhook, Story REST API,
  agent spawn_subtask (parent_task_id vs depends_on/role paths),
  propose_epic, propose_role_config, StoryOrchestrator's internal
  spawning (ensureEvaluators/ensureArbitration/ensureFixAttempt/
  spawnNestedFixAttempt/processRetro), Scheduler retry/escalation
  and ask_user-timeout escalation, claudomator run &lt;file&gt; CLI.

Includes task state machine diagram and recursive arbitrated-review
cycle showing that builder-role READY means awaiting arbitration,
not done. All diagrams use Mermaid (renders on GitHub).

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>docs: rewrite CLAUDE.md's Story orchestrator section to describe the finished recursive arbitrated-review design</title>
<updated>2026-07-10T22:19:37+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-10T22:19:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=6214aa83b0b0b127b9da716e6e8b8290f3e752f0'/>
<id>urn:sha1:6214aa83b0b0b127b9da716e6e8b8290f3e752f0</id>
<content type='text'>
The old text described pre-piece-4a behavior (root auto-accepted eagerly)
and a since-closed Design Debt item (arbitration claimed to never parse a
verdict, when ReportVerdict/KindVerdictReported already existed). Rewritten
to describe the actual current mechanism: builder-role nodes at any depth
only reach COMPLETED via finalizeArbitration's approval, the tree-walk
trigger, task.CurrentAttempt resolution, root-vs-nested fix-attempt
plumbing, and SeedRoleConfigs seeding the builder role's prompt.
</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>docs: rewrite piece 5 plan as a code-based SeedRoleConfigs (mirrors SeedProjects) instead of a manual API call</title>
<updated>2026-07-10T20:17:33+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-07-10T20:17:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=db1f7d9f18142791776a510ab4e8e28974cdcd40'/>
<id>urn:sha1:db1f7d9f18142791776a510ab4e8e28974cdcd40</id>
<content type='text'>
</content>
</entry>
</feed>
