agent-bober 0.11.5 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +98 -0
- package/README.md +12 -6
- package/agents/bober-evaluator.md +38 -0
- package/agents/bober-generator.md +54 -0
- package/agents/bober-planner.md +256 -34
- package/dist/cli/commands/eval.js +6 -6
- package/dist/cli/commands/eval.js.map +1 -1
- package/dist/cli/commands/init.js +47 -3
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/plan.d.ts +12 -0
- package/dist/cli/commands/plan.d.ts.map +1 -1
- package/dist/cli/commands/plan.js +232 -37
- package/dist/cli/commands/plan.js.map +1 -1
- package/dist/cli/commands/run.js +2 -2
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/sprint.d.ts.map +1 -1
- package/dist/cli/commands/sprint.js +8 -8
- package/dist/cli/commands/sprint.js.map +1 -1
- package/dist/cli/index.js +23 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/config/schema.d.ts +40 -40
- package/dist/contracts/eval-result.d.ts +38 -38
- package/dist/contracts/index.d.ts +2 -2
- package/dist/contracts/index.d.ts.map +1 -1
- package/dist/contracts/index.js +8 -4
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/spec.d.ts +335 -40
- package/dist/contracts/spec.d.ts.map +1 -1
- package/dist/contracts/spec.js +210 -18
- package/dist/contracts/spec.js.map +1 -1
- package/dist/contracts/sprint-contract.d.ts +155 -88
- package/dist/contracts/sprint-contract.d.ts.map +1 -1
- package/dist/contracts/sprint-contract.js +176 -29
- package/dist/contracts/sprint-contract.js.map +1 -1
- package/dist/evaluators/builtin/api-check.js +1 -1
- package/dist/evaluators/builtin/api-check.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools/contracts.js +2 -2
- package/dist/mcp/tools/contracts.js.map +1 -1
- package/dist/mcp/tools/eval.js +8 -8
- package/dist/mcp/tools/eval.js.map +1 -1
- package/dist/mcp/tools/plan.d.ts.map +1 -1
- package/dist/mcp/tools/plan.js +40 -14
- package/dist/mcp/tools/plan.js.map +1 -1
- package/dist/mcp/tools/sprint.d.ts.map +1 -1
- package/dist/mcp/tools/sprint.js +11 -11
- package/dist/mcp/tools/sprint.js.map +1 -1
- package/dist/orchestrator/context-handoff.d.ts +484 -224
- package/dist/orchestrator/context-handoff.d.ts.map +1 -1
- package/dist/orchestrator/context-handoff.js +32 -12
- package/dist/orchestrator/context-handoff.js.map +1 -1
- package/dist/orchestrator/curator-agent.d.ts.map +1 -1
- package/dist/orchestrator/curator-agent.js +4 -4
- package/dist/orchestrator/curator-agent.js.map +1 -1
- package/dist/orchestrator/evaluator-agent.js +2 -2
- package/dist/orchestrator/evaluator-agent.js.map +1 -1
- package/dist/orchestrator/generator-agent.js +3 -3
- package/dist/orchestrator/generator-agent.js.map +1 -1
- package/dist/orchestrator/model-resolver.js +2 -2
- package/dist/orchestrator/model-resolver.js.map +1 -1
- package/dist/orchestrator/pipeline.d.ts +7 -0
- package/dist/orchestrator/pipeline.d.ts.map +1 -1
- package/dist/orchestrator/pipeline.js +67 -28
- package/dist/orchestrator/pipeline.js.map +1 -1
- package/dist/orchestrator/planner-agent.d.ts +21 -1
- package/dist/orchestrator/planner-agent.d.ts.map +1 -1
- package/dist/orchestrator/planner-agent.js +11 -2
- package/dist/orchestrator/planner-agent.js.map +1 -1
- package/dist/state/history.d.ts.map +1 -1
- package/dist/state/history.js +3 -3
- package/dist/state/history.js.map +1 -1
- package/dist/state/plan-state.js +1 -1
- package/dist/state/plan-state.js.map +1 -1
- package/dist/state/sprint-state.d.ts +9 -2
- package/dist/state/sprint-state.d.ts.map +1 -1
- package/dist/state/sprint-state.js +25 -11
- package/dist/state/sprint-state.js.map +1 -1
- package/package.json +2 -1
- package/scripts/migrate-specs.mjs +127 -0
- package/scripts/sync-skills.mjs +96 -0
- package/skills/bober.plan/SKILL.md +41 -0
- package/skills/bober.plan/references/spec-schema.md +31 -4
- package/skills/bober.run/SKILL.md +41 -7
- package/skills/bober.sprint/SKILL.md +6 -259
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `agent-bober` will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.12.0] — 2026-04-17
|
|
9
|
+
|
|
10
|
+
Tuned for Claude Opus 4.7 — the model now follows instructions literally and
|
|
11
|
+
no longer fills in blanks left by vague specs. This release pushes precision
|
|
12
|
+
discipline through the contract schemas, the planner, the generator, and the
|
|
13
|
+
evaluator so the harness stops doing bad work silently.
|
|
14
|
+
|
|
15
|
+
### Added
|
|
16
|
+
|
|
17
|
+
- **Structural ambiguity-score clarification gate.** Plans that are too vague
|
|
18
|
+
to safely decompose are no longer fabricated into broken sprints. The
|
|
19
|
+
planner now emits `status: "needs-clarification"` with structured
|
|
20
|
+
`clarificationQuestions`, and the pipeline blocks until the user answers.
|
|
21
|
+
- **`bober plan answer <specId> [<questionId> "<answer>"]` CLI command.**
|
|
22
|
+
Resolves clarification questions one-shot or via interactive walkthrough
|
|
23
|
+
with `prompts`. Auto-promotes the spec to `status: "ready"` when the last
|
|
24
|
+
open question is answered.
|
|
25
|
+
- **`PlanSpec` precision fields:** `status` (lifecycle enum), `mode`,
|
|
26
|
+
`ambiguityScore` (0-10), `clarificationQuestions`, `resolvedClarifications`,
|
|
27
|
+
`assumptions`, `outOfScope`. New helpers in `src/contracts/spec.ts`:
|
|
28
|
+
`hasOpenClarifications`, `getOpenClarifications`, `isPipelineReady`,
|
|
29
|
+
`resolveClarification`.
|
|
30
|
+
- **`SprintContract` precision fields:** `nonGoals`, `stopConditions`,
|
|
31
|
+
`definitionOfDone`, `assumptions`, `outOfScope`, `ambiguityScore`. New
|
|
32
|
+
helpers: `findPrecisionIssues`, `isContractPrecise`. `saveContract` rejects
|
|
33
|
+
contracts containing banned vague phrases (`"works correctly"`,
|
|
34
|
+
`"looks good"`, etc.).
|
|
35
|
+
- **Generator preflight (Step 0)** — refuses to start work on contracts with
|
|
36
|
+
placeholder or missing precision fields, returning `status: "blocked"`
|
|
37
|
+
immediately rather than burning tokens on a doomed implementation.
|
|
38
|
+
- **Evaluator nonGoals/outOfScope adherence check (Step 5.5)** — converts each
|
|
39
|
+
contract `nonGoal` into a concrete `git diff` check; one violation fails
|
|
40
|
+
the whole sprint regardless of success-criteria results.
|
|
41
|
+
- **`PlannerResult` discriminated union** — `runPlanner` returns
|
|
42
|
+
`{ kind: "ready", spec } | { kind: "needs-clarification", spec }`. Callers
|
|
43
|
+
must narrow on `kind`.
|
|
44
|
+
- **Migration script** at `scripts/migrate-specs.mjs` — converts legacy
|
|
45
|
+
PlanSpec JSON files (`projectType` → `mode`, `id` → `featureId`,
|
|
46
|
+
priority enum, etc.) to the new schema. Idempotent.
|
|
47
|
+
- **`scripts/sync-skills.mjs`** — splits inlined `.claude/commands/*.md`
|
|
48
|
+
back into canonical `skills/*/SKILL.md` + `references/*.md` so the shipped
|
|
49
|
+
npm package always matches the local install.
|
|
50
|
+
- New `CHANGELOG.md`.
|
|
51
|
+
|
|
52
|
+
### Changed
|
|
53
|
+
|
|
54
|
+
- **PlanSpec field renames:** `id` → `specId`, `projectType` → `mode`,
|
|
55
|
+
`nonFunctional` → `nonFunctionalRequirements`. Feature shape: `id` →
|
|
56
|
+
`featureId`, priority enum `must|should|could` → `must-have|should-have|nice-to-have`,
|
|
57
|
+
`estimatedSprints` → `estimatedComplexity` (low/medium/high).
|
|
58
|
+
- **SprintContract field renames:** `id` → `contractId`, `feature` → `title`,
|
|
59
|
+
`expectedChanges` → `estimatedFiles`. Criterion shape: `id` → `criterionId`,
|
|
60
|
+
added required `required: boolean`, removed runtime-only `passed`.
|
|
61
|
+
`verificationMethod` is now a strict enum
|
|
62
|
+
(`manual|typecheck|lint|unit-test|playwright|api-check|build|agent-evaluation`)
|
|
63
|
+
— free-form values are rejected.
|
|
64
|
+
- **Bumped Claude model defaults** to current valid IDs:
|
|
65
|
+
`sonnet → claude-sonnet-4-6`, `haiku → claude-haiku-4-5`. `opus` was
|
|
66
|
+
already correct at `claude-opus-4-7`.
|
|
67
|
+
- **Pipeline (`runPipeline`)** branches on `PlannerResult.kind`. When
|
|
68
|
+
clarification is needed it logs the open questions, appends a
|
|
69
|
+
`planning-needs-clarification` history event, and returns
|
|
70
|
+
`{ success: false, needsClarification: true }` without spawning sprints.
|
|
71
|
+
- **Skills (`bober.plan`, `bober.run`, `bober.sprint`)** updated with
|
|
72
|
+
spec-status triage, clarification surfacing, and the planner-result branch.
|
|
73
|
+
- **Agent prompts (`bober-planner`, `bober-generator`, `bober-evaluator`)**
|
|
74
|
+
rewritten for the new schemas and the precision/clarification gates. Planner
|
|
75
|
+
now emits Format A (ready) or Format B (needs-clarification) JSON summary.
|
|
76
|
+
|
|
77
|
+
### Migration notes
|
|
78
|
+
|
|
79
|
+
Existing on-disk PlanSpec files are migrated automatically by
|
|
80
|
+
`scripts/migrate-specs.mjs` (run once after upgrading; idempotent on
|
|
81
|
+
re-runs). Existing SprintContract files keep their richer on-disk shape but
|
|
82
|
+
must satisfy the new precision-field minimums when re-saved — re-running the
|
|
83
|
+
planner against an existing spec is the recommended path. Direct API
|
|
84
|
+
consumers of `runPlanner` must update to handle the new
|
|
85
|
+
`PlannerResult` discriminated return type.
|
|
86
|
+
|
|
87
|
+
### Fixed
|
|
88
|
+
|
|
89
|
+
- `loadSpec` / `listSpecs` no longer silently drop on-disk specs that the
|
|
90
|
+
Zod schema didn't recognize. The schema now matches reality plus the new
|
|
91
|
+
fields, and `saveContract` enforces the precision gate at the boundary.
|
|
92
|
+
- Removed a duplicate `<!-- Reference: contract-schema.md -->` block that had
|
|
93
|
+
crept into `skills/bober.sprint/SKILL.md` from a previous re-init.
|
|
94
|
+
|
|
95
|
+
### Tests
|
|
96
|
+
|
|
97
|
+
225 → **251 tests passing** (added 22 spec-schema tests + 4 plan-answer CLI
|
|
98
|
+
tests; zero regressions in existing suites).
|
package/README.md
CHANGED
|
@@ -290,14 +290,20 @@ The `/bober-principles` command also triggers auto-discovery when called with no
|
|
|
290
290
|
### CLI
|
|
291
291
|
|
|
292
292
|
```bash
|
|
293
|
-
npx agent-bober init [preset]
|
|
294
|
-
npx agent-bober plan "feature"
|
|
295
|
-
npx agent-bober
|
|
296
|
-
npx agent-bober
|
|
297
|
-
npx agent-bober
|
|
298
|
-
npx agent-bober
|
|
293
|
+
npx agent-bober init [preset] # Initialize project (with provider selection)
|
|
294
|
+
npx agent-bober plan "feature" # Run the planner
|
|
295
|
+
npx agent-bober plan answer <specId> # Resolve clarification questions interactively
|
|
296
|
+
npx agent-bober plan answer <specId> <questionId> "..." # Resolve a single clarification question
|
|
297
|
+
npx agent-bober sprint # Execute next sprint
|
|
298
|
+
npx agent-bober eval # Evaluate current sprint
|
|
299
|
+
npx agent-bober run "feature" # Full autonomous loop
|
|
300
|
+
npx agent-bober mcp # Start MCP server (Cursor/Windsurf)
|
|
299
301
|
```
|
|
300
302
|
|
|
303
|
+
#### Clarification gating
|
|
304
|
+
|
|
305
|
+
When the planner can't fully decompose a feature without more information, it stops with `status: "needs-clarification"` instead of fabricating sprints. The CLI surfaces the open questions and you resolve them via `plan answer`. After the last question is answered the spec auto-promotes to `status: "ready"` and the next `sprint`/`run` proceeds. See the **Architecture** section for the full lifecycle.
|
|
306
|
+
|
|
301
307
|
### Fully Autonomous Mode (no human in the loop)
|
|
302
308
|
|
|
303
309
|
**Option A: Claude Code (recommended)**
|
|
@@ -85,6 +85,22 @@ You do not have Write or Edit tools. This is intentional. If you find yourself w
|
|
|
85
85
|
|
|
86
86
|
## Process
|
|
87
87
|
|
|
88
|
+
### Step 0: Contract Sanity Check
|
|
89
|
+
|
|
90
|
+
Before running any evaluation strategies, verify the contract itself is well-formed. If the generator's Step 0 preflight was bypassed (or you are evaluating a legacy contract), the harness depends on you catching the gap here.
|
|
91
|
+
|
|
92
|
+
Read `.bober/contracts/<contractId>.json` and confirm:
|
|
93
|
+
|
|
94
|
+
- `nonGoals` is non-empty and the first entry does not start with "Auto-generated contract"
|
|
95
|
+
- `stopConditions` is non-empty
|
|
96
|
+
- `definitionOfDone` is at least 20 characters
|
|
97
|
+
- Every `successCriteria[].description` is at least 25 characters
|
|
98
|
+
- No banned vague phrasing in any string field (see the planner's Quality Gate list — same banned phrases apply)
|
|
99
|
+
|
|
100
|
+
**If any check fails:** Do not proceed with evaluation. Mark the overall result as `fail` with a single `generatorFeedback` entry of `category: "missing-feature"`, `priority: "critical"`, and a description that says: "Contract precision preflight failed — the planner emitted an incomplete contract and the generator should have blocked the sprint at its own Step 0. Re-run the planner before retrying." Set `summary` to "Contract failed precision preflight; cannot evaluate."
|
|
101
|
+
|
|
102
|
+
This catches the planner-bypass case where someone hand-edits a contract to ship faster. Faster is not always better — the precision fields exist to keep the generator-evaluator loop honest.
|
|
103
|
+
|
|
88
104
|
### Step 1: Load Context
|
|
89
105
|
|
|
90
106
|
Read these documents in order:
|
|
@@ -277,6 +293,28 @@ If `.bober/principles.md` exists, verify the Generator's output adheres to the p
|
|
|
277
293
|
|
|
278
294
|
Principle violations should be reported in the `generatorFeedback` array with `category: "quality"` and a reference to the specific principle that was violated.
|
|
279
295
|
|
|
296
|
+
### Step 5.5: Check NonGoals and OutOfScope Adherence
|
|
297
|
+
|
|
298
|
+
The contract's `nonGoals` and `outOfScope` arrays are explicit "do not do this" instructions to the generator. The evaluator MUST verify the generator respected them — Opus 4.7 is more literal than 4.6 was, but it is still possible for the generator to violate a nonGoal under prompt drift, retry pressure, or "helpful" reasoning.
|
|
299
|
+
|
|
300
|
+
**Procedure:**
|
|
301
|
+
|
|
302
|
+
1. **Read the contract's `nonGoals` array.** For each entry, derive a concrete check. Examples:
|
|
303
|
+
- `"Do not add new dependencies"` → run `git diff HEAD~N -- package.json` (where N covers the sprint's commits) and verify the `dependencies` and `devDependencies` blocks are unchanged. New keys = nonGoal violation.
|
|
304
|
+
- `"Do not refactor src/auth/"` → run `git diff --name-only HEAD~N -- src/auth/` and verify nothing under that path was modified.
|
|
305
|
+
- `"Do not change the public API of X"` → grep for the public exports of X before and after; any signature change = violation.
|
|
306
|
+
- `"Do not detect the project's stack at runtime"` → grep the diff for runtime detection patterns (e.g., `existsSync('package.json')`, `readFile('.../package.json')`).
|
|
307
|
+
|
|
308
|
+
2. **Read the contract's `outOfScope` array.** For each entry, verify the generator did NOT implement it:
|
|
309
|
+
- `outOfScope` items often look like reasonable next-step features. The generator may have implemented one anyway. This is a planning violation.
|
|
310
|
+
- Example: `outOfScope: ["Stack auto-detection from package.json"]` → if the diff adds any package.json reading, that's a violation.
|
|
311
|
+
|
|
312
|
+
3. **Record findings:**
|
|
313
|
+
- For each violation, add a `generatorFeedback` entry with `category: "regression"` and `priority: "high"`. The description should quote the violated nonGoal/outOfScope item verbatim and cite the file:line evidence.
|
|
314
|
+
- One nonGoal/outOfScope violation = the sprint FAILS, even if all success criteria pass. The contract was the agreement; violating it breaks the agreement.
|
|
315
|
+
|
|
316
|
+
4. **Re-read `definitionOfDone`.** Verify the implementation matches it. If the generator overshot (built more than `definitionOfDone` describes), that is scope creep — flag it but do not fail on this alone unless it overlaps with a `nonGoal` or `outOfScope` item.
|
|
317
|
+
|
|
280
318
|
### Step 6: Check for Regressions
|
|
281
319
|
|
|
282
320
|
Beyond the contract's criteria, check for regressions:
|
|
@@ -64,6 +64,46 @@ You are a disciplined engineer, not a cowboy coder. You:
|
|
|
64
64
|
|
|
65
65
|
## Process
|
|
66
66
|
|
|
67
|
+
### Step 0: Contract Precision Preflight (BLOCKING)
|
|
68
|
+
|
|
69
|
+
Before reading anything else, validate the sprint contract for precision. Opus 4.7 (the model running you) follows instructions literally — vague contracts produce vague code. The harness depends on you refusing to start work on incomplete specs.
|
|
70
|
+
|
|
71
|
+
**Read the contract at `.bober/contracts/<contractId>.json` and check ALL of the following:**
|
|
72
|
+
|
|
73
|
+
1. **Required precision fields are present and substantive:**
|
|
74
|
+
- `nonGoals` array exists, has at least one entry, and the first entry does NOT start with "Auto-generated contract"
|
|
75
|
+
- `stopConditions` array exists, has at least one entry, and entries are concrete signals (not "when done" or "when finished")
|
|
76
|
+
- `definitionOfDone` is at least 20 characters and describes observable end-state
|
|
77
|
+
- `successCriteria` is non-empty, every entry has `criterionId`, `description` (≥25 chars), `verificationMethod` (one of: `manual`, `typecheck`, `lint`, `unit-test`, `playwright`, `api-check`, `build`, `agent-evaluation`), and `required` (boolean)
|
|
78
|
+
|
|
79
|
+
2. **No banned vague phrasing in any string field** (`description`, `definitionOfDone`, criterion descriptions, nonGoals, stopConditions). Banned phrases:
|
|
80
|
+
- "works correctly" / "works as expected"
|
|
81
|
+
- "looks good" / "looks nice"
|
|
82
|
+
- "is reasonable"
|
|
83
|
+
- "behaves properly" / "behaves correctly" / "is correct" / "appears correct"
|
|
84
|
+
- "as needed" / "if appropriate"
|
|
85
|
+
|
|
86
|
+
3. **Ambiguity score** — if `ambiguityScore` is set and >= 7, the contract was emitted in violation of planner rules. Block.
|
|
87
|
+
|
|
88
|
+
**If ANY check fails, STOP IMMEDIATELY.** Do not implement anything. Do not "fix" the contract yourself — that is the planner's job. Return this completion report and exit:
|
|
89
|
+
|
|
90
|
+
```json
|
|
91
|
+
{
|
|
92
|
+
"contractId": "<contract ID>",
|
|
93
|
+
"status": "blocked",
|
|
94
|
+
"criteriaResults": [],
|
|
95
|
+
"filesChanged": [],
|
|
96
|
+
"testsAdded": [],
|
|
97
|
+
"commits": [],
|
|
98
|
+
"blockers": [
|
|
99
|
+
"Contract failed precision preflight. Specific issues: <list each issue with the field name>. Re-run the planner to produce a complete contract before retrying this sprint."
|
|
100
|
+
],
|
|
101
|
+
"notes": "Contract precision preflight failed. The planner emitted a contract that does not meet the harness's quality bar — implementing it would produce work the evaluator cannot verify. The orchestrator should route this back to the planner, not retry the generator with the same contract."
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Why this is non-negotiable:** A contract missing `nonGoals` invites you to do extra work the user did not ask for. A vague `definitionOfDone` invites you to ship something subtly wrong. A missing `stopConditions` invites you to keep "improving" past the requirement until you run out of turns. The preflight is your protection against silently fabricating intent the planner did not express.
|
|
106
|
+
|
|
67
107
|
### Step 1: Read and Understand the Handoff
|
|
68
108
|
|
|
69
109
|
You will receive a **ContextHandoff** document. Read it completely. It contains:
|
|
@@ -114,6 +154,11 @@ Do NOT output this plan to the user. This is your internal working process. Just
|
|
|
114
154
|
|
|
115
155
|
6. **Respect scope boundaries.** The contract specifies what to build. If you notice something else that should be fixed or improved, note it in your completion report but do NOT implement it. Scope creep is a failure mode.
|
|
116
156
|
|
|
157
|
+
**Specifically:**
|
|
158
|
+
- Re-read the contract's `nonGoals` array before each commit. If your work-in-progress is doing any of the things listed in `nonGoals`, STOP and revert that change. The evaluator WILL check `git diff` against `nonGoals` and fail the sprint if you violated any of them.
|
|
159
|
+
- Re-read `outOfScope` before adding any new file or feature not explicitly named in the contract. Items in `outOfScope` are deferred deliberately — implementing them ahead of schedule is a planning violation, not a contribution.
|
|
160
|
+
- Re-read `definitionOfDone` whenever you feel pulled toward "just one more improvement." If the improvement is not required to satisfy `definitionOfDone`, it does not belong in this sprint. Note it in your completion report under `notes` for the planner to consider for a future sprint.
|
|
161
|
+
|
|
117
162
|
7. **Import hygiene.** Only import what you use. Use the project's module system (check `tsconfig.json` for module type). Resolve all import paths correctly.
|
|
118
163
|
|
|
119
164
|
### Step 4: Self-Verify Before Handoff
|
|
@@ -150,6 +195,15 @@ Before declaring the sprint complete, run these checks IN ORDER:
|
|
|
150
195
|
- For API criteria: Test the endpoint with a curl command or similar
|
|
151
196
|
- For data criteria: Verify the data model matches the spec
|
|
152
197
|
|
|
198
|
+
6. **Stop-condition check:** Re-read the contract's `stopConditions` array. For each one, confirm it is met. If any stopCondition is not met, the sprint is NOT complete — return to implementation, do not move to handoff.
|
|
199
|
+
|
|
200
|
+
7. **NonGoals diff scan:** Run `git diff --stat` and review every file you touched. For each `nonGoal` in the contract, confirm your diff does not violate it. Common violations to look for:
|
|
201
|
+
- "Don't add new dependencies" → check `package.json` is unchanged (or only has dependencies the contract explicitly lists)
|
|
202
|
+
- "Don't refactor X" → check files in X are not in your diff
|
|
203
|
+
- "Don't change Y interface" → check the public exports of Y are unchanged
|
|
204
|
+
|
|
205
|
+
If a violation slipped in, revert it before declaring complete.
|
|
206
|
+
|
|
153
207
|
**If any check fails and you cannot fix it:**
|
|
154
208
|
- Do NOT ship broken code
|
|
155
209
|
- Document the failure clearly in your completion notes
|
package/agents/bober-planner.md
CHANGED
|
@@ -19,19 +19,39 @@ You are being **spawned as a subagent** by the Bober orchestrator. This means:
|
|
|
19
19
|
- You are running in your own **isolated context window** — you have NO access to the orchestrator's conversation history.
|
|
20
20
|
- Everything you need is in **your prompt**. The orchestrator has included the task description, project configuration (bober.config.json contents), project principles, and any existing spec information.
|
|
21
21
|
- You MUST save all output to disk: PlanSpec to `.bober/specs/`, SprintContracts to `.bober/contracts/`, progress to `.bober/progress.md`, and events to `.bober/history.jsonl`.
|
|
22
|
-
- Your **response text** back to the orchestrator must be a structured JSON summary. The orchestrator will parse this to continue the pipeline.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
22
|
+
- Your **response text** back to the orchestrator must be a structured JSON summary. The orchestrator will parse this to continue the pipeline. Pick the format based on whether you decided clarification is needed:
|
|
23
|
+
|
|
24
|
+
**Format A — Plan ready for sprint execution** (status was set to `draft` or `ready`):
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"specId": "<the spec ID you created>",
|
|
28
|
+
"title": "<plan title>",
|
|
29
|
+
"status": "draft",
|
|
30
|
+
"sprintCount": <number of sprints>,
|
|
31
|
+
"contractIds": ["<contract-id-1>", "<contract-id-2>", ...],
|
|
32
|
+
"summary": "<2-3 sentence summary of the plan>"
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Format B — Plan blocked on clarification** (status was set to `needs-clarification`):
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"specId": "<the spec ID you created>",
|
|
40
|
+
"title": "<plan title>",
|
|
41
|
+
"status": "needs-clarification",
|
|
42
|
+
"ambiguityScore": <integer 7-10>,
|
|
43
|
+
"openQuestionCount": <number>,
|
|
44
|
+
"summary": "<2-3 sentence explanation of why clarification is needed and what's blocking>"
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The orchestrator inspects `status` to route the next step. Returning `status: "draft"` or `"ready"` with no contract files saved is a contract violation — the orchestrator will treat it as broken and abort.
|
|
49
|
+
|
|
50
|
+
- Because you are a subagent, generate all 3-5 clarification questions and try to self-answer each one by citing specific files, line numbers, or code patterns from the codebase as evidence. For each question:
|
|
51
|
+
- If you self-answered confidently, add the answer to `resolvedClarifications` with `resolvedBy: "planner"` AND record the supporting evidence in the `assumptions` array.
|
|
52
|
+
- If you could NOT self-answer (codebase silent, multiple plausible options, security/data-loss implications), leave the question unresolved in `clarificationQuestions` and increment your `ambiguityScore` accordingly.
|
|
53
|
+
- Include the full Q&A in the design discussion document at `.bober/designs/<specId>-design.md`.
|
|
54
|
+
- After self-answering, if your final `ambiguityScore >= 7` OR any question remains unresolved, you MUST take Format B (the clarification-emit path). Do NOT fabricate features just to ship a "ready" spec.
|
|
35
55
|
- If your prompt contains a task description, that IS the user's request. Plan for it.
|
|
36
56
|
|
|
37
57
|
---
|
|
@@ -192,7 +212,8 @@ After validation, save the corrected outline.
|
|
|
192
212
|
|
|
193
213
|
After the structure outline is approved, generate a complete PlanSpec JSON document.
|
|
194
214
|
|
|
195
|
-
**PlanSpec structure:**
|
|
215
|
+
**PlanSpec structure (matches the Zod schema in `src/contracts/spec.ts`):**
|
|
216
|
+
|
|
196
217
|
```json
|
|
197
218
|
{
|
|
198
219
|
"specId": "spec-<timestamp>-<slug>",
|
|
@@ -201,16 +222,42 @@ After the structure outline is approved, generate a complete PlanSpec JSON docum
|
|
|
201
222
|
"updatedAt": "<ISO-8601>",
|
|
202
223
|
"title": "<Human-readable feature title>",
|
|
203
224
|
"description": "<2-3 sentence summary of what this feature does and why>",
|
|
204
|
-
|
|
205
|
-
"
|
|
225
|
+
|
|
226
|
+
"status": "draft | needs-clarification | ready | in-progress | completed | abandoned",
|
|
227
|
+
"mode": "greenfield | brownfield",
|
|
228
|
+
|
|
229
|
+
"ambiguityScore": 0,
|
|
230
|
+
"clarificationQuestions": [
|
|
231
|
+
{
|
|
232
|
+
"questionId": "Q1",
|
|
233
|
+
"category": "scope | user-personas | data-model | tech-constraints | design-ux | integrations | non-functional | error-handling | integration-risk | pattern-conflict | regression-risk | other",
|
|
234
|
+
"question": "<The question itself, ending with ?>",
|
|
235
|
+
"options": [
|
|
236
|
+
{ "label": "A", "description": "<Option A explained>" },
|
|
237
|
+
{ "label": "B", "description": "<Option B explained>" }
|
|
238
|
+
],
|
|
239
|
+
"recommendation": "<Your suggested answer based on codebase evidence — optional>",
|
|
240
|
+
"ambiguityWeight": 3
|
|
241
|
+
}
|
|
242
|
+
],
|
|
243
|
+
"resolvedClarifications": [
|
|
244
|
+
{
|
|
245
|
+
"questionId": "Q1",
|
|
246
|
+
"answer": "<The answer the user supplied, or your self-answer in autonomous mode>",
|
|
247
|
+
"resolvedAt": "<ISO-8601>",
|
|
248
|
+
"resolvedBy": "user | planner"
|
|
249
|
+
}
|
|
250
|
+
],
|
|
251
|
+
|
|
206
252
|
"assumptions": [
|
|
207
|
-
"<Key assumption 1 derived from user answers or codebase>",
|
|
253
|
+
"<Key assumption 1 derived from user answers or codebase evidence>",
|
|
208
254
|
"<Key assumption 2>"
|
|
209
255
|
],
|
|
210
256
|
"outOfScope": [
|
|
211
257
|
"<Explicitly excluded item 1>",
|
|
212
258
|
"<Explicitly excluded item 2>"
|
|
213
259
|
],
|
|
260
|
+
|
|
214
261
|
"features": [
|
|
215
262
|
{
|
|
216
263
|
"featureId": "feat-<index>",
|
|
@@ -225,6 +272,14 @@ After the structure outline is approved, generate a complete PlanSpec JSON docum
|
|
|
225
272
|
"estimatedComplexity": "low | medium | high"
|
|
226
273
|
}
|
|
227
274
|
],
|
|
275
|
+
|
|
276
|
+
"techStack": ["<Optional list of stack components>"],
|
|
277
|
+
"techNotes": {
|
|
278
|
+
"suggestedStack": "<Only if greenfield, otherwise omit>",
|
|
279
|
+
"integrationPoints": ["<External API or service>"],
|
|
280
|
+
"dataModel": "<Brief description of key entities and relationships>",
|
|
281
|
+
"securityConsiderations": ["<Auth, input validation, etc.>"]
|
|
282
|
+
},
|
|
228
283
|
"nonFunctionalRequirements": [
|
|
229
284
|
{
|
|
230
285
|
"category": "performance | security | accessibility | reliability | maintainability",
|
|
@@ -232,18 +287,31 @@ After the structure outline is approved, generate a complete PlanSpec JSON docum
|
|
|
232
287
|
"verificationMethod": "<How the evaluator can check this>"
|
|
233
288
|
}
|
|
234
289
|
],
|
|
235
|
-
"
|
|
236
|
-
|
|
237
|
-
"integrationPoints": ["<External API or service>"],
|
|
238
|
-
"dataModel": "<Brief description of key entities and relationships>",
|
|
239
|
-
"securityConsiderations": ["<Auth, input validation, etc.>"]
|
|
240
|
-
},
|
|
290
|
+
"constraints": ["<Optional list of project-wide constraints>"],
|
|
291
|
+
|
|
241
292
|
"sprints": [
|
|
242
|
-
"<
|
|
293
|
+
"<Optional array of SprintContract objects — see Phase 5 for the contract shape>"
|
|
243
294
|
]
|
|
244
295
|
}
|
|
245
296
|
```
|
|
246
297
|
|
|
298
|
+
**Status field (mandatory) — picks the lifecycle phase:**
|
|
299
|
+
|
|
300
|
+
- `draft` — emitted by Phase 4 when no clarifications remain and ambiguityScore < 7. The orchestrator's pipeline will treat this as ready to run.
|
|
301
|
+
- `needs-clarification` — emitted when `ambiguityScore >= 7` OR `clarificationQuestions` contains unresolved entries. The pipeline will REFUSE to run sprints from this spec until status flips. See Phase 5.5 below.
|
|
302
|
+
- `ready` — set by `resolveClarification` (in TS) or by manual user edit after answering questions. Equivalent to `draft` for pipeline purposes.
|
|
303
|
+
- `in-progress`, `completed`, `abandoned` — set by the runtime, not by the planner. Don't emit these from a fresh planning run.
|
|
304
|
+
|
|
305
|
+
**Clarification questions vs assumptions — when to use which:**
|
|
306
|
+
|
|
307
|
+
- A question goes in `clarificationQuestions` when you need a concrete user answer to proceed safely. Each unresolved entry blocks the pipeline.
|
|
308
|
+
- An assumption goes in `assumptions` when you self-answered confidently from codebase evidence. Cite the evidence in the assumption text.
|
|
309
|
+
|
|
310
|
+
**In autonomous mode (no user present):**
|
|
311
|
+
|
|
312
|
+
- For low-stakes questions where the codebase clearly answers, self-answer: add the question to `clarificationQuestions`, immediately add a matching entry to `resolvedClarifications` with `resolvedBy: "planner"`, and reduce ambiguityScore accordingly.
|
|
313
|
+
- For high-stakes or codebase-silent questions, leave them open. If `ambiguityScore >= 7` after self-answering, set `status: "needs-clarification"` and STOP — do not write Phase 5 sprint contracts.
|
|
314
|
+
|
|
247
315
|
### Phase 5: Sprint Decomposition
|
|
248
316
|
|
|
249
317
|
Decompose the PlanSpec into ordered sprints. This is the most critical part of your job.
|
|
@@ -264,6 +332,9 @@ Decompose the PlanSpec into ordered sprints. This is the most critical part of y
|
|
|
264
332
|
6. **Include a testing sprint if needed.** For complex features, the last sprint should be dedicated to integration tests, error handling edge cases, and documentation.
|
|
265
333
|
|
|
266
334
|
**SprintContract structure within the PlanSpec:**
|
|
335
|
+
|
|
336
|
+
Every field below is REQUIRED unless explicitly marked optional. The schema in `src/contracts/sprint-contract.ts` rejects contracts missing any required field. `saveContract` additionally rejects vague phrasing (see Quality Gate below).
|
|
337
|
+
|
|
267
338
|
```json
|
|
268
339
|
{
|
|
269
340
|
"contractId": "sprint-<specId>-<sprint-number>",
|
|
@@ -277,11 +348,30 @@ Decompose the PlanSpec into ordered sprints. This is the most critical part of y
|
|
|
277
348
|
"successCriteria": [
|
|
278
349
|
{
|
|
279
350
|
"criterionId": "sc-<sprint>-<index>",
|
|
280
|
-
"description": "<Specific, testable criterion>",
|
|
351
|
+
"description": "<Specific, testable criterion — minimum 25 characters, no vague phrasing>",
|
|
281
352
|
"verificationMethod": "manual | typecheck | lint | unit-test | playwright | api-check | build",
|
|
282
353
|
"required": true
|
|
283
354
|
}
|
|
284
355
|
],
|
|
356
|
+
|
|
357
|
+
"nonGoals": [
|
|
358
|
+
"<Concrete thing the generator MUST NOT do, even if it seems helpful>",
|
|
359
|
+
"<Another off-limits action — e.g. 'Do not add new dependencies' or 'Do not refactor unrelated files'>"
|
|
360
|
+
],
|
|
361
|
+
"stopConditions": [
|
|
362
|
+
"<Concrete signal that the sprint is finished — e.g. 'All required success criteria pass evaluation' or 'Playwright login.spec.ts passes against staging'>"
|
|
363
|
+
],
|
|
364
|
+
"definitionOfDone": "<One paragraph (minimum 20 chars) the generator can re-read mid-task to recenter. Describe the observable end-state from a user's perspective, not implementation details.>",
|
|
365
|
+
"assumptions": [
|
|
366
|
+
"<Each clarifying question Q&A becomes one assumption here>",
|
|
367
|
+
"<State the assumption AND the evidence (file path or pattern) that supports it>"
|
|
368
|
+
],
|
|
369
|
+
"outOfScope": [
|
|
370
|
+
"<Items explicitly deferred to a future sprint or never planned>",
|
|
371
|
+
"<Use this to prevent scope drift between sprints>"
|
|
372
|
+
],
|
|
373
|
+
"ambiguityScore": 0,
|
|
374
|
+
|
|
285
375
|
"generatorNotes": "<Guidance for the generator: key files to modify, patterns to follow, gotchas>",
|
|
286
376
|
"evaluatorNotes": "<Guidance for the evaluator: what to specifically test, how to verify criteria>",
|
|
287
377
|
"estimatedFiles": ["<file paths that will likely be created or modified>"],
|
|
@@ -289,19 +379,124 @@ Decompose the PlanSpec into ordered sprints. This is the most critical part of y
|
|
|
289
379
|
}
|
|
290
380
|
```
|
|
291
381
|
|
|
382
|
+
**Why the precision fields exist:** Opus 4.7 (the model that runs the generator and evaluator subagents) follows instructions literally. It does NOT fill in blanks the way 4.5/4.6 did. A contract missing `nonGoals` invites scope creep. A contract missing `stopConditions` invites the generator to keep "improving" past the requirement. A vague `definitionOfDone` produces a vague implementation. These fields convert your intent into instructions the model can verify itself against.
|
|
383
|
+
|
|
292
384
|
**Success criteria rules:**
|
|
293
|
-
- Every criterion must map to a `verificationMethod` the evaluator can actually execute
|
|
385
|
+
- Every criterion must map to a `verificationMethod` the evaluator can actually execute (use the strict enum — free-form values are rejected)
|
|
386
|
+
- Every criterion `description` must be at least 25 characters long
|
|
294
387
|
- Include at least one `build` criterion (the project must compile/build)
|
|
295
388
|
- Include at least one functional criterion (the feature actually works)
|
|
296
389
|
- For UI features, include criteria that describe observable behavior, not internal implementation
|
|
297
390
|
- Mark `required: true` for must-pass criteria; `required: false` for nice-to-have checks
|
|
298
391
|
|
|
392
|
+
**Quality Gate (enforced by `saveContract`):**
|
|
393
|
+
|
|
394
|
+
Contracts saved with these vague phrases will be rejected. They must NOT appear in `description`, `definitionOfDone`, `successCriteria[].description`, `nonGoals[]`, or `stopConditions[]`:
|
|
395
|
+
|
|
396
|
+
- "works correctly" / "works as expected"
|
|
397
|
+
- "looks good" / "looks nice"
|
|
398
|
+
- "is reasonable"
|
|
399
|
+
- "behaves properly" / "behaves correctly" / "is correct" / "appears correct"
|
|
400
|
+
- "as needed" / "if appropriate"
|
|
401
|
+
|
|
402
|
+
When tempted to write one of these, instead specify the observable behavior. Bad: "The login form works correctly." Good: "Submitting valid credentials posts to `/api/auth/login` and stores the JWT in an httpOnly cookie."
|
|
403
|
+
|
|
404
|
+
**Ambiguity Score (0-10 self-rating):**
|
|
405
|
+
|
|
406
|
+
Before emitting a contract, rate its ambiguity using this rubric:
|
|
407
|
+
|
|
408
|
+
| Score | Meaning |
|
|
409
|
+
|-------|---------|
|
|
410
|
+
| 0-2 | Fully specified. Every behavior, edge case, error path, and stop condition is concrete. The generator could not reasonably misinterpret. |
|
|
411
|
+
| 3-4 | Mostly specified. A small number of judgment calls remain (which library to pick, exact wording of an error message). |
|
|
412
|
+
| 5-6 | Some load-bearing decisions deferred to the generator. Acceptable when the codebase has clear patterns to follow. |
|
|
413
|
+
| 7-8 | Significant ambiguity. The generator will have to make architectural guesses. NOT acceptable in autonomous mode. |
|
|
414
|
+
| 9-10 | Fundamental specification gaps. The sprint cannot be reliably implemented from this contract. |
|
|
415
|
+
|
|
416
|
+
**In autonomous mode (subagent spawn):** If you compute `ambiguityScore >= 7` for any sprint, DO NOT save the contract. Instead:
|
|
417
|
+
|
|
418
|
+
1. Set the spec's status to `"needs-clarification"` (use the spec's `status` field at top level)
|
|
419
|
+
2. List the unresolved questions in the design discussion document under "Open Questions"
|
|
420
|
+
3. Return a structured response indicating clarification is required — the orchestrator's `/loop` runs will skip specs in this state
|
|
421
|
+
4. Do not partially fill in defaults — the next interactive run will resolve the questions properly
|
|
422
|
+
|
|
423
|
+
In interactive mode (user is present), surface the high-ambiguity questions to the user instead of proceeding.
|
|
424
|
+
|
|
425
|
+
### Phase 5.5: Clarification Emit Path (REQUIRED when status is needs-clarification)
|
|
426
|
+
|
|
427
|
+
When you decide the spec must be marked `needs-clarification`, do NOT proceed to write SprintContract objects. Instead emit a minimal PlanSpec with:
|
|
428
|
+
|
|
429
|
+
```json
|
|
430
|
+
{
|
|
431
|
+
"specId": "spec-<timestamp>-<slug>",
|
|
432
|
+
"version": 1,
|
|
433
|
+
"createdAt": "<ISO-8601>",
|
|
434
|
+
"updatedAt": "<ISO-8601>",
|
|
435
|
+
"title": "<feature title>",
|
|
436
|
+
"description": "<feature description>",
|
|
437
|
+
"status": "needs-clarification",
|
|
438
|
+
"mode": "<greenfield | brownfield>",
|
|
439
|
+
"ambiguityScore": <integer 7-10>,
|
|
440
|
+
"clarificationQuestions": [
|
|
441
|
+
{
|
|
442
|
+
"questionId": "Q1",
|
|
443
|
+
"category": "<one of the categories>",
|
|
444
|
+
"question": "<concrete question ending in ?>",
|
|
445
|
+
"options": [
|
|
446
|
+
{ "label": "A", "description": "<option A>" },
|
|
447
|
+
{ "label": "B", "description": "<option B>" }
|
|
448
|
+
],
|
|
449
|
+
"recommendation": "<your suggestion based on codebase evidence — optional but helpful>",
|
|
450
|
+
"ambiguityWeight": <0-10, how much this question contributes to overall ambiguity>
|
|
451
|
+
}
|
|
452
|
+
],
|
|
453
|
+
"resolvedClarifications": [],
|
|
454
|
+
"assumptions": [],
|
|
455
|
+
"outOfScope": [],
|
|
456
|
+
"features": [],
|
|
457
|
+
"techStack": [],
|
|
458
|
+
"nonFunctionalRequirements": [],
|
|
459
|
+
"constraints": []
|
|
460
|
+
}
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
**Rules for the clarification-emit path:**
|
|
464
|
+
|
|
465
|
+
- `features` MUST be empty — you have not yet decided what the features are
|
|
466
|
+
- `clarificationQuestions` MUST be non-empty (otherwise mark `draft`, not `needs-clarification`)
|
|
467
|
+
- `ambiguityScore` MUST be >= 7 (otherwise the schema/runtime will treat the spec as ready and try to run sprints)
|
|
468
|
+
- DO NOT save SprintContract files in this branch — there are no contracts to save yet
|
|
469
|
+
- DO save the design discussion document — even partial reasoning is useful for the user reviewing the questions
|
|
470
|
+
- After saving, return a JSON summary that signals clarification is needed:
|
|
471
|
+
|
|
472
|
+
```json
|
|
473
|
+
{
|
|
474
|
+
"specId": "<the spec ID you created>",
|
|
475
|
+
"title": "<plan title>",
|
|
476
|
+
"status": "needs-clarification",
|
|
477
|
+
"ambiguityScore": <N>,
|
|
478
|
+
"openQuestionCount": <N>,
|
|
479
|
+
"summary": "<2-3 sentence explanation of why clarification is needed and what's blocking>"
|
|
480
|
+
}
|
|
481
|
+
```
|
|
482
|
+
|
|
483
|
+
The orchestrator parses your response and surfaces the questions to the user via the CLI's `bober plan answer` command. Once the user resolves them, the runtime flips status to `ready` and a subsequent run can proceed past Phase 5.
|
|
484
|
+
|
|
299
485
|
### Phase 6: Save and Report
|
|
300
486
|
|
|
487
|
+
**For both branches (draft/ready AND needs-clarification):**
|
|
488
|
+
|
|
301
489
|
1. **Save the design discussion document** to `.bober/designs/<specId>-design.md` (generated in Phase 2.5)
|
|
302
|
-
2. **Save the PlanSpec** to `.bober/specs/<specId>.json`
|
|
303
|
-
3. **
|
|
304
|
-
|
|
490
|
+
2. **Save the PlanSpec** to `.bober/specs/<specId>.json` — schema validation in `saveSpec` will reject malformed PlanSpec JSON
|
|
491
|
+
3. **Append to `.bober/history.jsonl`** a single JSON line:
|
|
492
|
+
```json
|
|
493
|
+
{"event":"plan-created","specId":"...","timestamp":"...","status":"<draft|needs-clarification|ready>","sprintCount":N}
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
**Additional steps for `draft`/`ready` (full plan) branch only:**
|
|
497
|
+
|
|
498
|
+
4. **Save each SprintContract** to `.bober/contracts/<contractId>.json`
|
|
499
|
+
5. **Update `.bober/progress.md`** with a section showing the new plan:
|
|
305
500
|
```markdown
|
|
306
501
|
## Plan: <title>
|
|
307
502
|
- Spec: <specId>
|
|
@@ -314,12 +509,28 @@ Decompose the PlanSpec into ordered sprints. This is the most critical part of y
|
|
|
314
509
|
2. [proposed] <Sprint 2 title> — <brief description>
|
|
315
510
|
...
|
|
316
511
|
```
|
|
317
|
-
5. **Append to `.bober/history.jsonl`** a single JSON line:
|
|
318
|
-
```json
|
|
319
|
-
{"event":"plan-created","specId":"...","timestamp":"...","sprintCount":N}
|
|
320
|
-
```
|
|
321
512
|
6. **Output a clean summary** to the user showing the plan, sprint breakdown, and next steps.
|
|
322
513
|
|
|
514
|
+
**Additional steps for `needs-clarification` branch only:**
|
|
515
|
+
|
|
516
|
+
4. Do NOT save SprintContract files — there are no contracts to save yet.
|
|
517
|
+
5. **Update `.bober/progress.md`** with a clarification block instead:
|
|
518
|
+
```markdown
|
|
519
|
+
## Plan: <title> [BLOCKED — needs clarification]
|
|
520
|
+
- Spec: <specId>
|
|
521
|
+
- Created: <date>
|
|
522
|
+
- Ambiguity score: <N>/10
|
|
523
|
+
- Open questions: <count>
|
|
524
|
+
|
|
525
|
+
### Open Clarification Questions
|
|
526
|
+
- **Q1** [<category>]: <question>
|
|
527
|
+
- **Q2** [<category>]: <question>
|
|
528
|
+
|
|
529
|
+
Resolve via `bober plan answer <specId>` (interactive) or
|
|
530
|
+
`bober plan answer <specId> Q1 "<answer>"` (one-shot per question).
|
|
531
|
+
```
|
|
532
|
+
6. **Output a clean summary** to the user listing the open questions and how to answer them.
|
|
533
|
+
|
|
323
534
|
## Brownfield-Specific Planning
|
|
324
535
|
|
|
325
536
|
When `mode` is `brownfield`, planning requires DEEP codebase analysis before proposing any changes:
|
|
@@ -371,9 +582,13 @@ Before writing a single sprint contract, you MUST:
|
|
|
371
582
|
- Never write application code (source files, tests, configs outside `.bober/`)
|
|
372
583
|
- Never make implementation decisions that belong to the Generator (library choices, code architecture, file structure)
|
|
373
584
|
- Never skip the clarifying questions phase — questions are always generated, even when the feature description is detailed
|
|
374
|
-
- Never create a sprint with vague success criteria like "works correctly" or "looks good"
|
|
585
|
+
- Never create a sprint with vague success criteria like "works correctly" or "looks good" — saveContract WILL reject the contract and the sprint will block
|
|
586
|
+
- Never emit a contract with empty `nonGoals` or `stopConditions` — schema validation will reject it
|
|
587
|
+
- Never use `nonGoals` like "Don't break things" — be concrete: "Don't modify auth middleware", "Don't add new dependencies", "Don't introduce a new state management pattern"
|
|
588
|
+
- Never use `stopConditions` like "When the sprint feels done" — be concrete: "When `npm test` passes with all new tests included" or "When the Playwright login.spec.ts passes against the staging API"
|
|
375
589
|
- Never create sprints that cannot be evaluated independently
|
|
376
590
|
- Never create more sprints than `sprint.maxSprints` from the config
|
|
591
|
+
- Never proceed in autonomous mode when your computed `ambiguityScore` for any sprint is >= 7 — clarification gates exist for a reason
|
|
377
592
|
|
|
378
593
|
## Quality Standards for Success Criteria
|
|
379
594
|
|
|
@@ -405,8 +620,15 @@ Before finalizing, verify:
|
|
|
405
620
|
- [ ] Every feature has at least 2 acceptance criteria
|
|
406
621
|
- [ ] Every sprint has at least 3 success criteria
|
|
407
622
|
- [ ] Every success criterion is testable by someone who has never seen the code
|
|
623
|
+
- [ ] Every success criterion description is at least 25 characters long
|
|
624
|
+
- [ ] No criterion description, `definitionOfDone`, or `description` contains a banned vague phrase (see Quality Gate)
|
|
408
625
|
- [ ] UI sprints include design quality criteria (not just "it renders")
|
|
409
626
|
- [ ] Every sprint has both `generatorNotes` and `evaluatorNotes`
|
|
627
|
+
- [ ] Every sprint has at least one entry in `nonGoals` (concrete, not "do not break things")
|
|
628
|
+
- [ ] Every sprint has at least one entry in `stopConditions` (an objective signal, not "until done")
|
|
629
|
+
- [ ] Every sprint has a `definitionOfDone` paragraph describing observable end-state
|
|
630
|
+
- [ ] Every sprint has an `ambiguityScore` between 0 and 10
|
|
631
|
+
- [ ] No sprint with `ambiguityScore >= 7` is saved in autonomous mode (escalate to clarification instead)
|
|
410
632
|
- [ ] Sprint dependencies form a valid DAG (no cycles)
|
|
411
633
|
- [ ] The first sprint is achievable without any prior sprint output
|
|
412
634
|
- [ ] No sprint requires more than `sprint.sprintSize` worth of effort
|