Skip to content

feat(execute): per-task worker names, per-step status table, deeper lint areas - #55

Merged
kvnwolf merged 3 commits into
mainfrom
learn/execute-per-task-worker-names
Sep 8, 2026
Merged

kvnwolf merged 3 commits into
mainfrom
learn/execute-per-task-worker-names

Conversation

@kvnwolf

@kvnwolf kvnwolf commented Sep 8, 2026

Copy link
Copy Markdown
Owner

Summary

Three learnings from a field /dobby:execute session, mined with /dobby:learn:

  • Per-task worker names. build-protocol.md prescribed name: "dobby:<role>", which the Agent tool rejects (: fails its name regex) — every first dispatch failed. Workers are now addressed as test-author-t<id> / implementor-t<id> / qa-t<id> (subagent_type stays dobby:<role>), each dispatch opens with its task's roster, and a task's workers are dispatched once and reached by the same name across fix rounds until the task is terminal (never replaced mid-task). Synced in execute/SKILL.md, root CONTEXT.md, CLAUDE.md, README.md, and the protocol contract test.
  • Per-step status table. After every worker verdict or fix-round message the Architect prints one row per task, one emoji per step (⚪ not started · 🔄 in progress · ❌ failed, in fix · ✅ passed · — n/a). New protocol section + Step 3 rule; the closing summary table is unchanged.
  • spec lint accepts $param dirs and deeper created paths. AREA_PATH_SHAPE now allows $ (file-router dynamic segments), and a nonexistent area passes when any ancestor below the repo root exists — not only its direct parent. This removes the whole-directory workaround that serialised every task in the field. task-decomposition.md now says: name files, not directories, from the first draft.

Test plan

  • bunx dobby check --fix --baseline exit 0 (Biome, tsc, knip, vitest, kit checks)
  • cli/src/artifact-lint.test.ts: new cases — existing $param dir passes, path under a $param dir passes, path two levels below an existing dir passes, path with no existing ancestor still fails, parenthetical fragment still fails
  • cli/src/build-protocol.test.ts: address regexes updated to <role>-t<id>; namespaced dobby:<role> still asserted present as subagent_type
  • Next live /dobby:execute run: first dispatch succeeds with name: "implementor-t1", status table prints after each step, fix rounds reach the same names

https://claude.ai/code/session_011KMhSVrdJ8baqG7oGrhzVQ

…int areas

Learned from a field /dobby:execute session (solraci/vonda) via /dobby:learn.

Worker naming. build-protocol.md told the Architect to dispatch workers as
`name: "dobby:<role>"`, but the Agent tool's `name` regex
(`^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$`) rejects `:` — the first dispatch failed
with InputValidationError every time. One name per role also collides once
several tasks are in flight. The address is now `test-author-t<id>` /
`implementor-t<id>` / `qa-t<id>` (subagent_type stays `dobby:<role>`), every
dispatch opens with its task's roster, and a task's three workers are
dispatched once and reached by that same name across fix rounds until the
task is terminal — "alive" means not replaced, since SendMessage resumes a
returned agent with its context. Root CONTEXT.md, CLAUDE.md, README and the
protocol contract test follow.

Per-step status table. The user asked mid-run for a live view: after every
worker verdict or fix-round message the Architect prints one row per task,
one emoji per step (⚪ 🔄 ❌ ✅ —). Added as a protocol section and a Step 3
rule; the closing summary table is unchanged.

spec lint areas. `AREA_PATH_SHAPE` excluded `$`, so TanStack `$param` route
directories were "not a real path", and a path was accepted only when its
direct parent existed, so a module created two levels deep (or a file under a
directory an earlier task creates) was rejected. The field workaround —
whole-directory areas — overlapped every task and serialised the plan. `$` is
now allowed and existence walks up to the nearest existing ancestor below
the repo root; task-decomposition.md tells specs to name files, not
directories, from the first draft.

Claude-Session: https://claude.ai/code/session_011KMhSVrdJ8baqG7oGrhzVQ
@greptile-apps

greptile-apps Bot commented Sep 8, 2026 •

Copy link
Copy Markdown

Greptile Summary

This PR makes execute workers uniquely addressable per task, adds a live per-step status table, and broadens spec-lint support for dynamic and deeply created paths. Changes since the previous review complete the corrected-test-contract route so QA resumes only after the implementor has passed its Exit gate.

  • Restricts task IDs to safe worker-address fragments.
  • Keeps each task’s named workers addressable throughout fix rounds.
  • Defines status transitions for code and test-contract repairs.
  • Routes corrected test contracts through the implementor before QA re-checks.
  • Allows $param path segments and paths anchored by deeper existing ancestors.

Confidence Score: 5/5

The PR appears safe to merge; the previously identified Exit-gate bypass is closed and no new actionable failure remains.

The corrected-contract path now consistently moves from the test-author to the implementor, requires a green Exit gate, and only then resumes QA under the same round number. All previous threads were resolved, and the withdrawn deep-path concern reflects an explicitly accepted design trade-off rather than an outstanding defect.

Important Files Changed

Filename Overview
cli/src/artifact-lint.ts Adds address-safe task-ID validation and accepts affected paths anchored by any existing in-repository ancestor.
cli/src/artifact-lint.test.ts Covers invalid worker-address IDs, $param routes, deeper planned paths, and paths without an in-repository anchor.
plugin/skills/execute/references/build-protocol.md Defines per-task worker addresses, worker reuse, live status transitions, and complete fix-round routing.
plugin/skills/execute/SKILL.md Requires per-task names, stable worker identities, and status-table output after each relevant event.
plugin/agents/test-author.md Directs corrected test contracts to the implementor rather than directly to QA.
plugin/agents/implementor.md Requires corrected contracts to pass the Exit gate before the implementor resumes QA.
plugin/agents/qa.md Makes the implementor’s post-gate message the sole trigger for QA re-checks.
cli/src/build-protocol.test.ts Adds a contract assertion that corrected tests pass through the implementor’s gate before QA resumes.

Reviews (3): Last reviewed commit: "fix(execute): corrected test contracts r..." | Re-trigger Greptile

Comment thread plugin/skills/execute/references/build-protocol.md
Comment thread plugin/skills/execute/references/build-protocol.md
Comment thread cli/src/artifact-lint.ts
Comment thread plugin/skills/execute/references/build-protocol.md Outdated
… transitions

Greptile's round on #55 found three real gaps in the per-task worker
addressing shipped in the previous commit:

- Task ids flowed unchecked into `<role>-t<id>`; `spec lint` now constrains
  the `#` column to `[A-Za-z0-9][A-Za-z0-9_-]{0,20}`, so every address is a
  legal Agent name by construction.
- Nothing said who resumes QA after a fix. The field session answered it:
  the fixer messages the reporter back by name with the round number, which
  resumes it for the re-check. The protocol now states that return leg; the
  test-author gains SendMessage so it can close a test-contract round too.
- The status-table example showed the implementor ✅ while QA was mid-fix.
  Transitions are now spelled out per routing/re-check step and pinned by
  the protocol contract test.

The "deep typos pass lint" finding was dismissed on the thread: the
existence check anchors an area to real ground and never detected typos.

Claude-Session: https://claude.ai/code/session_011KMhSVrdJ8baqG7oGrhzVQ
@kvnwolf

kvnwolf commented Sep 8, 2026

Copy link
Copy Markdown
Owner Author

@greptileai review

Comment thread plugin/skills/execute/references/build-protocol.md Outdated
…'s gate

Review round 2 on #55: the return leg let the test-author resume QA
directly after a QA-reported contract problem. QA never runs the suite, so
the corrected contract could reach `done` without ever passing the
implementor's Exit gate. The test-author now always returns to
`implementor-t<id>`, whoever reported the problem; the implementor adapts
the implementation if needed, re-runs its gate, and only then resumes QA.
Transitions, agent definitions and the protocol contract test follow.

Claude-Session: https://claude.ai/code/session_011KMhSVrdJ8baqG7oGrhzVQ
@kvnwolf

kvnwolf commented Sep 8, 2026

Copy link
Copy Markdown
Owner Author

@greptileai review

@kvnwolf
kvnwolf merged commit b8eb33c into main Sep 8, 2026
3 checks passed
@kvnwolf
kvnwolf deleted the learn/execute-per-task-worker-names branch September 8, 2026 16:03
kvnwolf added a commit that referenced this pull request Sep 8, 2026
…areas

The v0.17.0 release asks consumers for two things #55 introduced: a
`/reload-plugins` (or fresh session) because `test-author` gained
SendMessage and every worker is now addressed as `<role>-t<id>`, and a
renumber of any task-table `#` cell `dobby spec lint` now rejects. The note
also records the relaxed `Affected areas` rule and the new execute
behaviour that needs no action. Registered in the upgrade skill's note list.

Claude-Session: https://claude.ai/code/session_011KMhSVrdJ8baqG7oGrhzVQ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant