<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-05-13T04:02:20+00:00</updated>
<entry>
<title>merge: integrate github/main — LocalRunner, real GeminiRunner, llm client</title>
<updated>2026-05-13T04:02:20+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-05-13T04:02:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=68399a598924775a3ec22a39c2336ae497fb07f3'/>
<id>urn:sha1:68399a598924775a3ec22a39c2336ae497fb07f3</id>
<content type='text'>
Merges 12 commits from github/main (formerly master) that were developed
independently. Key additions:
- LocalRunner: OpenAI-compatible local LLM execution (Ollama, LM Studio)
- Real GeminiRunner with full sandbox parity to ClaudeRunner
- llm.Client for enriching CI failures and elaboration via local model
- retry.ParseRetryAfter moved to shared package
- tokens_in/tokens_out columns in executions table

Conflict resolutions:
- Kept local main's VAPID/push, stories, projects, agent events schema
- Merged both sets of Config fields (local + LocalModel from github/main)
- Unified activePerAgent accounting (decActiveAgent helper)
- Removed duplicate helpers from claude.go (now in helpers.go)
- Fixed double-decrement bug in handleRunResult vs decActiveAgent

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Merge pull request #4 from thepeterstone/claude/gemini-sandbox</title>
<updated>2026-05-12T21:08:46+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-05-12T21:08:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=d970c0730ff0dc7d714d3261197d8ba52b5d21f4'/>
<id>urn:sha1:d970c0730ff0dc7d714d3261197d8ba52b5d21f4</id>
<content type='text'>
Gemini runner: full sandbox-flow parity with Claude</content>
</entry>
<entry>
<title>feat(executor): bring GeminiRunner to sandbox-flow parity with Claude</title>
<updated>2026-05-12T21:03:30+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-05-12T21:03:30+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=e7171181fff10c66b2b74eabfb1fc94b3cfbb4fb'/>
<id>urn:sha1:e7171181fff10c66b2b74eabfb1fc94b3cfbb4fb</id>
<content type='text'>
All coding tasks now follow the same flow regardless of runner: when
project_dir is set, the agent runs in a temp clone, not in the user's
working tree. On success, edits are autocommitted and pushed back to
origin/master and the sandbox is removed. On failure or BLOCKED, the
sandbox is preserved and its path surfaces in the error / BlockedError
so the user can inspect partial work or resume in place.

Before this commit, GeminiRunner.Run set cmd.Dir to project_dir
directly, so an agent run could leave half-done edits in the user's
working tree with no rollback. ClaudeRunner has had the full sandbox
flow for a while; this commit closes the gap.

Reused the existing package-level helpers from claude.go verbatim:
setupSandbox, teardownSandbox, sandboxCloneSource, gitSafe, plus the
resume/stale-sandbox/blocked-error patterns. No new shared abstraction
needed — same package.

LocalRunner intentionally not changed. The OpenAI chat path has no
tool use, so the agent can't edit files; sandbox would be theater.

Tests (6 new):
- Run_ProjectDir_RunsInSandbox: cwd captured by fake binary is a
  sandbox path, not project_dir.
- Run_BlockedError_IncludesSandboxDir: when question.json appears,
  BlockedError.SandboxDir is set and the dir exists.
- Run_ExecError_PreservesSandbox: failing exit wraps error with
  "(sandbox preserved at &lt;path&gt;)" and the path exists on disk.
- Run_ResumeUsesStoredSandboxDir: ResumeSessionID + SandboxDir →
  runs in that dir without re-cloning.
- Run_StaleSandboxDir_ClonesAfresh: resume pointing at missing
  dir falls back to a fresh clone from project_dir.
- Run_NoProjectDir_SkipsSandbox: tasks without project_dir don't
  trigger sandbox setup.

https://claude.ai/code/session_017Edeq947TpSm1vQTxMhi1J
</content>
</entry>
<entry>
<title>test(executor): verify explicit Claude commits are captured in execRecord</title>
<updated>2026-05-07T19:33:44+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-05-07T19:33:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=22ecff1fde5aa17d3053f43a8ac81f9ca49d8d56'/>
<id>urn:sha1:22ecff1fde5aa17d3053f43a8ac81f9ca49d8d56</id>
<content type='text'>
Adds TestTeardownSandbox_CapturesExplicitCommits to cover the case
where the agent explicitly commits changes (no autocommit needed).
Previously only the autocommit path was tested; this confirms
teardownSandbox populates Commits for any commits ahead of origin.

https://claude.ai/code/session_01G4dT9JBWFFb8xGcSHenzRS
</content>
</entry>
<entry>
<title>fix: atomic execution creation + RUNNING state transition</title>
<updated>2026-05-03T17:59:18+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-10T09:17:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=f01231cc45f41ce2dc37072e77428e467ef3fc15'/>
<id>urn:sha1:f01231cc45f41ce2dc37072e77428e467ef3fc15</id>
<content type='text'>
Add CreateExecutionAndSetRunning to storage.DB and Store interface,
replacing the two sequential CreateExecution/UpdateTaskState calls in
executor.go. Eliminates the crash window where a task stays PENDING
with an orphaned RUNNING execution record.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>chore: add next-steps.md session handoff summary</title>
<updated>2026-05-03T17:59:18+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-04-10T03:10:27+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=2196a048b1a980ff6a4d04918cbee69778186c83'/>
<id>urn:sha1:2196a048b1a980ff6a4d04918cbee69778186c83</id>
<content type='text'>
https://claude.ai/code/session_01W8P6wwDYF7dpETXWVXCz5L
</content>
</entry>
<entry>
<title>docs: rewrite CLAUDE.md with accurate architecture, known bugs, and design debt; add improvement plan</title>
<updated>2026-05-03T17:58:37+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-04-06T06:52:37+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=eedff0c86363f3bb1d88871bb6c21ee283cc356b'/>
<id>urn:sha1:eedff0c86363f3bb1d88871bb6c21ee283cc356b</id>
<content type='text'>
- Fix YAML key in Task format (agent: not claude:)
- Document complete state machine including BLOCKED and READY states
- Document sandbox lifecycle and git clone failure root cause (sandboxDir shadowing)
- Document all packages including notify, deployment, version, classifier, preamble
- Call out GeminiRunner as a non-functional stub
- Document design debt: unused priority/retry fields, double changestats extraction,
  hardcoded master branch, context.Background() in resume, non-atomic exec creation
- Add docs/IMPROVEMENT_PLAN.md with 20 prioritized issues ranked by effort and impact

https://claude.ai/code/session_01W8P6wwDYF7dpETXWVXCz5L
</content>
</entry>
<entry>
<title>fix: prevent SHIPPABLE stories and wrong READY state on failed tasks</title>
<updated>2026-05-03T17:58:25+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-04T21:59:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=25cf4c9d4d6f3c18ee7565bf8e6172896fff00c3'/>
<id>urn:sha1:25cf4c9d4d6f3c18ee7565bf8e6172896fff00c3</id>
<content type='text'>
Three related bugs fixed:

1. maybeUnblockParent: guard against promoting QUEUED leaf tasks (no
   subtasks) to READY. The vacuously-true 'all subtasks done' check was
   advancing tasks that stalled in QUEUED (due to a prior SQLite lock
   error) to READY on server restart via RecoverStaleBlocked, despite
   having only failed executions and no commits.

2. checkStoryCompletion: require COMPLETED (not just READY) for all
   top-level tasks before advancing a story to SHIPPABLE. READY means
   the checker agent is still pending or the task awaits human review;
   a story with READY tasks is not ready to ship.

3. handleAcceptTask: call CheckStoryCompletion after a task is accepted
   so stories with parent tasks (whose subtasks are all done and then
   the parent is manually accepted) can auto-advance to SHIPPABLE.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>Merge pull request #3 from thepeterstone/claude/deferred-work</title>
<updated>2026-05-03T08:10:48+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-05-03T08:10:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=b32bfe1bc6bcbc45d7d1549d6ae6412bc3e4424f'/>
<id>urn:sha1:b32bfe1bc6bcbc45d7d1549d6ae6412bc3e4424f</id>
<content type='text'>
Close deferred work — real GeminiRunner subprocess, Local UI option</content>
</entry>
<entry>
<title>chore: close deferred work — real GeminiRunner, Local UI option, db.go cleanup</title>
<updated>2026-05-03T08:00:20+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-05-03T08:00:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=e7b382bf177cbe518af3d86c3ee6c49344d225f4'/>
<id>urn:sha1:e7b382bf177cbe518af3d86c3ee6c49344d225f4</id>
<content type='text'>
Closes the three items left on the deferred queue after the post-epic
cleanup.

GeminiRunner.execOnce now actually executes the gemini binary instead
of writing hardcoded stream data. Mirrors ClaudeRunner.execOnce:
- exec.CommandContext with the same env vars (CLAUDOMATOR_API_URL etc.)
- process group SIGKILL on context cancel
- stdout piped through parseGeminiStream → stdoutFile
- stderr to file
- exit codes captured, stderr tail surfaced on failure

Test infrastructure bug uncovered in passing: testServerWithGeminiMockRunner's
mock script used double-quoted echo with literal triple-backticks, which
bash interpreted as command substitution. The script always produced
empty output. The bug was invisible until now because GeminiRunner
ignored the script entirely. Switched to a single-quoted heredoc.

Frontend: index.html dropdown gains a "Local" option. No JS branching
needed — the value flows through to agent.type verbatim and downstream
display reads the type string as-is.

storage/db.go: removed stale debug-comment scaffolding (the "TODO:
Replace with proper logger" block) that was tracking a dead
`fmt.Printf` call. The path it commented on is fine without logging —
unmarshal errors are returned wrapped.

Test status: `go test -race ./...` green across every package, zero
skips, zero excluded tests.

https://claude.ai/code/session_017Edeq947TpSm1vQTxMhi1J
</content>
</entry>
</feed>
