<feed xmlns='http://www.w3.org/2005/Atom'>
<title>claudomator.git/internal/executor, branch story/task-project-fk</title>
<subtitle>claudomator — task automation server
</subtitle>
<id>https://git.terst.org/claudomator.git/atom?h=story%2Ftask-project-fk</id>
<link rel='self' href='https://git.terst.org/claudomator.git/atom?h=story%2Ftask-project-fk'/>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/'/>
<updated>2026-04-03T08:39:32+00:00</updated>
<entry>
<title>fix: remove drain-lock circuit breaker that halted all executions after 3 consecutive failures</title>
<updated>2026-04-03T08:39:32+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-03T08:39:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=5aa6a15ffdf68a8dbe12eb0fdfff93deafb9da10'/>
<id>urn:sha1:5aa6a15ffdf68a8dbe12eb0fdfff93deafb9da10</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix: story stays PENDING when all subtasks complete but parent task stays QUEUED</title>
<updated>2026-03-26T09:36:30+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-26T09:36:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=759396855a967a3d509498cc55faa3b4d8cadfba'/>
<id>urn:sha1:759396855a967a3d509498cc55faa3b4d8cadfba</id>
<content type='text'>
When a story is approved with pre-created subtasks, parent tasks are
QUEUED but never run. Their subtasks complete, but:
- maybeUnblockParent only handled BLOCKED parents, not QUEUED ones
- checkStoryCompletion required ALL tasks (incl. subtasks) to be done

Fixes:
- maybeUnblockParent now also promotes QUEUED parents to READY when all
  subtasks are COMPLETED
- checkStoryCompletion only checks top-level tasks (parent_task_id="")
- RecoverStaleBlocked now also scans QUEUED parents on startup and
  triggers checkStoryCompletion if it promotes them
- Add QUEUED→READY to valid state transitions (subtask delegation path)

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: graceful shutdown — drain workers before exit (default 3m timeout)</title>
<updated>2026-03-26T09:14:14+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-26T09:09:19+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=3f9843b34d7ae9df2dd9c69427ecab45744b97e9'/>
<id>urn:sha1:3f9843b34d7ae9df2dd9c69427ecab45744b97e9</id>
<content type='text'>
- Add workerWg to Pool; Shutdown() closes workCh and waits for all
  in-flight execute/executeResume goroutines to finish
- Signal handler now shuts down HTTP first, then drains the pool
- ShutdownTimeout config field (toml: shutdown_timeout); default 3m
- Tests: WaitsForWorkers and TimesOut

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix: ensure story branch exists before cloning at task start</title>
<updated>2026-03-26T08:56:04+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-26T08:56:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=909fa86bea1f55acc1ccb119e9509d2c724f6b5b'/>
<id>urn:sha1:909fa86bea1f55acc1ccb119e9509d2c724f6b5b</id>
<content type='text'>
Add ensureStoryBranch() that runs git ls-remote to check, then clones
into a temp dir to create and push the branch if missing. Called before
the task's own clone so checkout is guaranteed to succeed.

Removes the post-checkout fallback hack added in the previous commit.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix: auto-create story branch if missing at clone time</title>
<updated>2026-03-26T08:28:02+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-26T08:28:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=6dcd26901b862aa680a1cb501f24183bcf854abc'/>
<id>urn:sha1:6dcd26901b862aa680a1cb501f24183bcf854abc</id>
<content type='text'>
If git checkout of the story branch fails (branch never pushed to bare
repo), create it from HEAD and push to origin instead of hard-failing
the task.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix: cancel waiting tasks when dep hits terminal failure (QUEUED→CANCELLED)</title>
<updated>2026-03-26T07:03:02+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-26T07:03:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=34b4f397b1f46cb5027ba910983021a68f3e7333'/>
<id>urn:sha1:34b4f397b1f46cb5027ba910983021a68f3e7333</id>
<content type='text'>
QUEUED→FAILED is not a valid state transition. When a dependency enters a
terminal failure state, cancel the waiting task instead.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix: story branch push to bare repo; drain at 3 consecutive failures</title>
<updated>2026-03-26T06:36:32+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-26T06:36:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=44521cc50e304b61c44b9a269a8239fd0fef49cd'/>
<id>urn:sha1:44521cc50e304b61c44b9a269a8239fd0fef49cd</id>
<content type='text'>
createStoryBranch was pushing to 'origin' which doesn't exist — branches
never landed in the bare repo so agents couldn't clone them. Now uses
the project's RemoteURL (bare repo path) directly for fetch and push.

Raise drain threshold from 2 to 3 consecutive failures to reduce false
positives from transient errors.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>test: add TestPool_DependsOn_NoDeadlock</title>
<updated>2026-03-26T05:49:29+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-26T05:49:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=ba6a83ae5a62c3e93d7a119c5d8e6690bee7c099'/>
<id>urn:sha1:ba6a83ae5a62c3e93d7a119c5d8e6690bee7c099</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix: resolve dep-chain deadlock; broadcast task_started for UI visibility</title>
<updated>2026-03-26T05:45:19+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-26T05:45:19+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=2710eb8a3a58abbea95bd487797abbb3e67f0d0a'/>
<id>urn:sha1:2710eb8a3a58abbea95bd487797abbb3e67f0d0a</id>
<content type='text'>
With maxPerAgent=1, tasks with DependsOn were entering waitForDependencies
while holding the per-agent slot, preventing the dependency from ever running.

Fix: check deps before taking the slot. If not ready, requeue without holding
activePerAgent. Also accept StateReady (leaf tasks) as a satisfied dependency,
not just StateCompleted.

Add startedCh to pool and broadcast task_started WebSocket event when a task
transitions to RUNNING, so the UI immediately shows the running state during
the clone phase instead of waiting for completion.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>fix: expose drained state in agent status API; fix AgentEvent JSON casing</title>
<updated>2026-03-26T05:10:56+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-26T05:10:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=b009880307298abea11efad92da2cd955afafe99'/>
<id>urn:sha1:b009880307298abea11efad92da2cd955afafe99</id>
<content type='text'>
AgentStatusInfo was missing drained field so UI couldn't show drain lock.
AgentEvent had no JSON tags so ev.agent/event/timestamp were undefined in
the stats timeline. UI now shows "Drain locked" card state with undrain CTA.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
