<feed xmlns='http://www.w3.org/2005/Atom'>
<title>claudomator.git/internal/storage, 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:44:02+00:00</updated>
<entry>
<title>feat: require repository_url on tasks; fix UpdateTask to persist it; fix cascade-retry test race</title>
<updated>2026-04-03T08:44:02+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-03T08:44:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=1271ba1d329c8b16062600dfafdec1d06c735c2e'/>
<id>urn:sha1:1271ba1d329c8b16062600dfafdec1d06c735c2e</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: register modal-shell project; document project registry</title>
<updated>2026-03-29T08:37:02+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-29T08:37:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=59c9b40e5d45e82cc676061ca215feb6b56cd405'/>
<id>urn:sha1:59c9b40e5d45e82cc676061ca215feb6b56cd405</id>
<content type='text'>
Adds modal-shell to SeedProjects() and documents how to find
and edit seed.go in .agent/design.md.
</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>
<entry>
<title>feat: merge story branch to master before deploy, add doot project to registry</title>
<updated>2026-03-24T23:01:22+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-24T23:01:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=4a47ec318c92cc899ee7392bb200cf9ee482e0da'/>
<id>urn:sha1:4a47ec318c92cc899ee7392bb200cf9ee482e0da</id>
<content type='text'>
- triggerStoryDeploy: fetch/checkout/merge --no-ff/push before running deploy script (ADR-007)
- executor_test: TestPool_StoryDeploy_MergesStoryBranch proves merge happens
- seed.go: add doot project with deploy script; wire claudomator deploy script

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: Phase 3 — stories data model, ValidStoryTransition, storage CRUD, API endpoints</title>
<updated>2026-03-22T00:56:54+00:00</updated>
<author>
<name>Claudomator Agent</name>
<email>agent@claudomator.local</email>
</author>
<published>2026-03-22T00:56:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=5081b0c014d8e82e7be1907441c246fbd01ca21e'/>
<id>urn:sha1:5081b0c014d8e82e7be1907441c246fbd01ca21e</id>
<content type='text'>
- internal/task/story.go: Story struct, StoryState constants, ValidStoryTransition
- internal/task/task.go: add StoryID field
- internal/storage/db.go: stories table + story_id on tasks migrations; CreateStory,
  GetStory, ListStories, UpdateStoryStatus, ListTasksByStory; update all task
  SELECT/INSERT to include story_id; scanTask extended with sql.NullString for story_id;
  added modernc timestamp format to GetMaxUpdatedAt
- internal/storage/sqlite_cgo.go + sqlite_nocgo.go: build-tag based driver selection
  (mattn/go-sqlite3 with CGO, modernc.org/sqlite pure-Go fallback) so tests run
  without a C compiler
- internal/api/stories.go: GET/POST /api/stories, GET /api/stories/{id},
  GET/POST /api/stories/{id}/tasks (auto-wires depends_on chain),
  PUT /api/stories/{id}/status (validates transition)
- internal/api/server.go: register all story routes
- go.mod/go.sum: add modernc.org/sqlite pure-Go dependency

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: Phase 2 — project registry, legacy field cleanup, credential path fix</title>
<updated>2026-03-21T21:23:42+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-21T21:23:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=888f3014b42ff48f597d0a81e9f52104d19be6db'/>
<id>urn:sha1:888f3014b42ff48f597d0a81e9f52104d19be6db</id>
<content type='text'>
- task.Project type + storage CRUD + UpsertProject + SeedProjects
- Remove AgentConfig.ProjectDir, RepositoryURL, SkipPlanning
- Remove ContainerRunner fallback git init logic
- Project API endpoints: GET/POST /api/projects, GET/PUT /api/projects/{id}
- processResult no longer extracts changestats (pool-side only)
- claude_config_dir config field; default to credentials/claude/
- New scripts: sync-credentials, fix-permissions, check-token

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: add errors, throughput, and billing sections to stats dashboard</title>
<updated>2026-03-19T23:15:58+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-19T23:15:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=eeee3b60a1fd8dc8b8b92997f709ef65e4b2097f'/>
<id>urn:sha1:eeee3b60a1fd8dc8b8b92997f709ef65e4b2097f</id>
<content type='text'>
- GET /api/stats?window=7d: pre-aggregated SQL queries for errors, throughput, billing
- Errors section: category summary (quota/rate_limit/timeout/git/failed) + failure table
- Throughput section: stacked hourly bar chart (completed/failed/other) over 7d
- Billing section: KPIs (7d total, avg/day, cost/run) + daily cost bar chart

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: agent status dashboard with availability timeline and Gemini quota detection</title>
<updated>2026-03-19T23:03:56+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-19T23:03:56+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=7e8967decbc8221694953abf1435fda8aaf18824'/>
<id>urn:sha1:7e8967decbc8221694953abf1435fda8aaf18824</id>
<content type='text'>
- Detect Gemini TerminalQuotaError (daily quota) as BUDGET_EXCEEDED, not generic FAILED
- Surface container stderr tail in error so quota/rate-limit classifiers can match it
- Add agent_events table to persist rate-limit start/recovery events across restarts
- Add GET /api/agents/status endpoint returning live agent state + 24h event history
- Stats dashboard: agent status cards, 24h availability timeline, per-run execution table

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
<entry>
<title>feat: implement containerized repository-based execution model</title>
<updated>2026-03-18T07:54:48+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-18T00:17:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=0fb4e3e81c20b2e2b58040772b747ec1dd9e09e7'/>
<id>urn:sha1:0fb4e3e81c20b2e2b58040772b747ec1dd9e09e7</id>
<content type='text'>
This commit implements the architectural shift from local directory-based
sandboxing to containerized execution using canonical repository URLs.

Key changes:
- Data Model: Added RepositoryURL and ContainerImage to task/agent configs.
- Storage: Updated SQLite schema and queries to handle new fields.
- Executor: Implemented ContainerRunner using Docker/Podman for isolation.
- API/UI: Overhauled task creation to use Repository URLs and Image selection.
- Webhook: Updated GitHub webhook to derive Repository URLs automatically.
- Docs: Updated ADR-005 with risk feedback and added ADR-006 to document the
  new containerized model.
- Defaults: Updated serve command to use ContainerRunner for all agents.

This fixes systemic task failures caused by build dependency and permission
issues on the host system.
</content>
</entry>
<entry>
<title>fix: persist VAPID keys in DB instead of config file</title>
<updated>2026-03-16T20:49:54+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-03-16T20:49:54+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/claudomator.git/commit/?id=48aec51b531d995574c5788e5f474343cc6e5c87'/>
<id>urn:sha1:48aec51b531d995574c5788e5f474343cc6e5c87</id>
<content type='text'>
The service runs as www-data which cannot write to the root-owned
config file. VAPID keys are now stored in the settings table in
SQLite (which is writable), loaded on startup, and generated once.
Removes saveVAPIDToConfig and the stale warning on every restart.

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