feat(execute): per-task worker names, per-step status table, deeper lint areas - #55
Conversation
…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 SummaryThis 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.
Confidence Score: 5/5The 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.
|
| 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
… 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
|
@greptileai review |
…'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
|
@greptileai review |
…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
Summary
Three learnings from a field
/dobby:executesession, mined with/dobby:learn:build-protocol.mdprescribedname: "dobby:<role>", which the Agent tool rejects (:fails itsnameregex) — every first dispatch failed. Workers are now addressed astest-author-t<id>/implementor-t<id>/qa-t<id>(subagent_typestaysdobby:<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 inexecute/SKILL.md, rootCONTEXT.md,CLAUDE.md,README.md, and the protocol contract test.spec lintaccepts$paramdirs and deeper created paths.AREA_PATH_SHAPEnow 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.mdnow says: name files, not directories, from the first draft.Test plan
bunx dobby check --fix --baselineexit 0 (Biome, tsc, knip, vitest, kit checks)cli/src/artifact-lint.test.ts: new cases — existing$paramdir passes, path under a$paramdir passes, path two levels below an existing dir passes, path with no existing ancestor still fails, parenthetical fragment still failscli/src/build-protocol.test.ts: address regexes updated to<role>-t<id>; namespaceddobby:<role>still asserted present assubagent_type/dobby:executerun: first dispatch succeeds withname: "implementor-t1", status table prints after each step, fix rounds reach the same nameshttps://claude.ai/code/session_011KMhSVrdJ8baqG7oGrhzVQ