konductor 0.12.4 → 0.14.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/agents/konductor-designer.json +41 -0
- package/agents/konductor-plan-checker.json +1 -1
- package/agents/konductor-spec-reviewer.json +40 -0
- package/agents/konductor.json +2 -2
- package/package.json +1 -1
- package/skills/konductor-design/SKILL.md +78 -0
- package/skills/konductor-discuss/SKILL.md +2 -2
- package/skills/konductor-exec/SKILL.md +110 -56
- package/skills/konductor-exec/references/execution-guide.md +108 -50
- package/skills/konductor-next/SKILL.md +104 -75
- package/skills/konductor-plan/SKILL.md +18 -96
- package/skills/konductor-plan/references/planning-guide.md +229 -50
- package/skills/konductor-review/SKILL.md +91 -0
- package/skills/{konductor-init → konductor-spec}/SKILL.md +9 -9
- package/skills/konductor-status/SKILL.md +6 -5
- /package/skills/{konductor-init → konductor-spec}/references/questioning.md +0 -0
|
@@ -39,26 +39,80 @@ Plans execute in waves. Wave dependencies must form a DAG (directed acyclic grap
|
|
|
39
39
|
|
|
40
40
|
## Task Sizing
|
|
41
41
|
|
|
42
|
-
Each plan contains 2-5 tasks. Each task
|
|
42
|
+
Each plan contains 2-5 tasks. Each task is broken into **bite-sized steps that take 2-5 minutes each**. Every step that involves code must include the actual code block — no prose descriptions of what to write.
|
|
43
43
|
|
|
44
44
|
**If a plan would need more than 5 tasks:** Split it into multiple plans in the same wave.
|
|
45
45
|
|
|
46
46
|
**Task structure:**
|
|
47
47
|
- **files:** Which files to modify/create
|
|
48
|
-
- **action:** What to do
|
|
48
|
+
- **action:** What to do — broken into numbered steps, each 2-5 minutes
|
|
49
49
|
- **verify:** How to check success (command to run)
|
|
50
50
|
- **done:** What "done" looks like (observable outcome)
|
|
51
51
|
|
|
52
|
-
**
|
|
52
|
+
**Each step within a task must:**
|
|
53
|
+
1. Be completable in 2-5 minutes
|
|
54
|
+
2. Include the exact code to write (for code steps)
|
|
55
|
+
3. Include the command to run (for verification steps)
|
|
56
|
+
4. Be independently verifiable
|
|
57
|
+
|
|
58
|
+
**Example task with bite-sized steps (TDD):**
|
|
53
59
|
```markdown
|
|
54
60
|
### Task 2: Add password hashing to User model
|
|
55
61
|
|
|
56
62
|
- **files:** `src/models/user.rs`
|
|
57
|
-
- **action:**
|
|
58
|
-
|
|
59
|
-
|
|
63
|
+
- **action:**
|
|
64
|
+
1. Write failing test:
|
|
65
|
+
```rust
|
|
66
|
+
#[cfg(test)]
|
|
67
|
+
mod tests {
|
|
68
|
+
use super::*;
|
|
69
|
+
|
|
70
|
+
#[test]
|
|
71
|
+
fn test_password_is_hashed() {
|
|
72
|
+
let user = User::new("test@example.com".into(), "Secret123!".into()).unwrap();
|
|
73
|
+
assert_ne!(user.password_hash(), "Secret123!");
|
|
74
|
+
assert!(user.verify_password("Secret123!"));
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
2. Run `cargo test user::tests::test_password_is_hashed` — confirm it fails (method not found)
|
|
79
|
+
3. Implement:
|
|
80
|
+
```rust
|
|
81
|
+
use bcrypt::{hash, verify, DEFAULT_COST};
|
|
82
|
+
|
|
83
|
+
impl User {
|
|
84
|
+
pub fn new(email: String, password: String) -> Result<Self, AuthError> {
|
|
85
|
+
let password_hash = hash(&password, DEFAULT_COST)
|
|
86
|
+
.map_err(|_| AuthError::HashError)?;
|
|
87
|
+
Ok(Self { id: Uuid::new_v4(), email, password_hash, created_at: Utc::now() })
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
pub fn password_hash(&self) -> &str { &self.password_hash }
|
|
91
|
+
|
|
92
|
+
pub fn verify_password(&self, password: &str) -> bool {
|
|
93
|
+
verify(password, &self.password_hash).unwrap_or(false)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
4. Run `cargo test user::tests::test_password_is_hashed` — confirm it passes
|
|
98
|
+
- **verify:** `cargo test user::tests::test_password_is_hashed`
|
|
99
|
+
- **done:** Passwords are hashed with bcrypt before storage, verified by test
|
|
60
100
|
```
|
|
61
101
|
|
|
102
|
+
## No Placeholders
|
|
103
|
+
|
|
104
|
+
Every step must contain the actual content an engineer needs to execute it. The **konductor-plan-checker** agent enforces this rule and will reject plans that violate it.
|
|
105
|
+
|
|
106
|
+
**Banned patterns:**
|
|
107
|
+
- `"TBD"`, `"TODO"`, `"implement later"`, `"fill in details"`
|
|
108
|
+
- `"Add appropriate error handling"` / `"add validation"` / `"handle edge cases"` (show the actual error handling, validation, or edge case code)
|
|
109
|
+
- `"Write tests for the above"` without actual test code (include the test code)
|
|
110
|
+
- `"Similar to Task N"` (repeat the code — the engineer may be reading tasks out of order)
|
|
111
|
+
- Steps that describe what to do without showing how (code blocks required for code steps)
|
|
112
|
+
- References to types, functions, or methods not defined in any prior or current task
|
|
113
|
+
|
|
114
|
+
**Rule:** If a step involves writing code, the step must include the code block. If a step involves running a command, the step must include the command. No exceptions.
|
|
115
|
+
|
|
62
116
|
## Plan File Format
|
|
63
117
|
|
|
64
118
|
Each plan is a markdown file with TOML frontmatter and a structured body.
|
|
@@ -68,7 +122,7 @@ Each plan is a markdown file with TOML frontmatter and a structured body.
|
|
|
68
122
|
- `plan`: Plan number within the phase (1, 2, 3...)
|
|
69
123
|
- `wave`: Execution wave (1, 2, 3...)
|
|
70
124
|
- `depends_on`: List of plan numbers this plan depends on (e.g., `[1, 2]`)
|
|
71
|
-
- `type`: Either "execute" (standard implementation)
|
|
125
|
+
- `type`: Either "tdd" (test-driven, default) or "execute" (standard implementation). Use `type = "execute"` to opt out of TDD for infrastructure, configuration, or documentation tasks. The planner must always emit an explicit `type` field.
|
|
72
126
|
- `autonomous`: Boolean, true if executor can proceed without human input
|
|
73
127
|
- `requirements`: List of REQ-XX identifiers this plan addresses
|
|
74
128
|
- `files_modified`: List of files this plan will touch (helps with merge conflict prediction)
|
|
@@ -93,7 +147,7 @@ phase = "01-auth-system"
|
|
|
93
147
|
plan = 1
|
|
94
148
|
wave = 1
|
|
95
149
|
depends_on = []
|
|
96
|
-
type = "
|
|
150
|
+
type = "tdd"
|
|
97
151
|
autonomous = true
|
|
98
152
|
requirements = ["REQ-01", "REQ-02"]
|
|
99
153
|
files_modified = ["src/models/user.rs", "src/db/migrations/001_users.sql"]
|
|
@@ -138,33 +192,120 @@ impl User {
|
|
|
138
192
|
|
|
139
193
|
## Tasks
|
|
140
194
|
|
|
141
|
-
### Task 1: Create User struct
|
|
195
|
+
### Task 1: Create User struct with tests
|
|
142
196
|
|
|
143
197
|
- **files:** `src/models/user.rs`
|
|
144
|
-
- **action:**
|
|
145
|
-
|
|
146
|
-
|
|
198
|
+
- **action:**
|
|
199
|
+
1. Write failing test:
|
|
200
|
+
```rust
|
|
201
|
+
#[cfg(test)]
|
|
202
|
+
mod tests {
|
|
203
|
+
use super::*;
|
|
204
|
+
|
|
205
|
+
#[test]
|
|
206
|
+
fn test_new_user_has_correct_email() {
|
|
207
|
+
let user = User::new("test@example.com".into(), "Secret123!".into()).unwrap();
|
|
208
|
+
assert_eq!(user.email, "test@example.com");
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
#[test]
|
|
212
|
+
fn test_new_user_has_uuid() {
|
|
213
|
+
let user = User::new("test@example.com".into(), "Secret123!".into()).unwrap();
|
|
214
|
+
assert!(!user.id.is_nil());
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
2. Run `cargo test models::user::tests` — confirm it fails (User not defined)
|
|
219
|
+
3. Implement:
|
|
220
|
+
```rust
|
|
221
|
+
use chrono::{DateTime, Utc};
|
|
222
|
+
use uuid::Uuid;
|
|
223
|
+
|
|
224
|
+
pub struct User {
|
|
225
|
+
pub id: Uuid,
|
|
226
|
+
pub email: String,
|
|
227
|
+
password_hash: String,
|
|
228
|
+
pub created_at: DateTime<Utc>,
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
impl User {
|
|
232
|
+
pub fn new(email: String, password: String) -> Result<Self, AuthError> {
|
|
233
|
+
Ok(Self {
|
|
234
|
+
id: Uuid::new_v4(),
|
|
235
|
+
email,
|
|
236
|
+
password_hash: password, // placeholder — next task adds hashing
|
|
237
|
+
created_at: Utc::now(),
|
|
238
|
+
})
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
4. Run `cargo test models::user::tests` — confirm both tests pass
|
|
243
|
+
- **verify:** `cargo test models::user::tests`
|
|
244
|
+
- **done:** User struct compiles and passes basic tests
|
|
147
245
|
|
|
148
246
|
### Task 2: Add password hashing
|
|
149
247
|
|
|
150
248
|
- **files:** `src/models/user.rs`
|
|
151
|
-
- **action:**
|
|
152
|
-
|
|
153
|
-
|
|
249
|
+
- **action:**
|
|
250
|
+
1. Add failing test:
|
|
251
|
+
```rust
|
|
252
|
+
#[test]
|
|
253
|
+
fn test_password_is_hashed_not_plaintext() {
|
|
254
|
+
let user = User::new("test@example.com".into(), "Secret123!".into()).unwrap();
|
|
255
|
+
assert_ne!(user.password_hash, "Secret123!");
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
#[test]
|
|
259
|
+
fn test_verify_correct_password() {
|
|
260
|
+
let user = User::new("test@example.com".into(), "Secret123!".into()).unwrap();
|
|
261
|
+
assert!(user.verify_password("Secret123!"));
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
#[test]
|
|
265
|
+
fn test_verify_wrong_password() {
|
|
266
|
+
let user = User::new("test@example.com".into(), "Secret123!".into()).unwrap();
|
|
267
|
+
assert!(!user.verify_password("WrongPass1!"));
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
2. Run `cargo test models::user::tests` — confirm new tests fail
|
|
271
|
+
3. Update `User::new` and add `verify_password`:
|
|
272
|
+
```rust
|
|
273
|
+
use bcrypt::{hash, verify, DEFAULT_COST};
|
|
274
|
+
|
|
275
|
+
impl User {
|
|
276
|
+
pub fn new(email: String, password: String) -> Result<Self, AuthError> {
|
|
277
|
+
let password_hash = hash(&password, DEFAULT_COST)
|
|
278
|
+
.map_err(|_| AuthError::HashError)?;
|
|
279
|
+
Ok(Self { id: Uuid::new_v4(), email, password_hash, created_at: Utc::now() })
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
pub fn verify_password(&self, password: &str) -> bool {
|
|
283
|
+
verify(password, &self.password_hash).unwrap_or(false)
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
```
|
|
287
|
+
4. Run `cargo test models::user::tests` — confirm all 5 tests pass
|
|
288
|
+
- **verify:** `cargo test models::user::tests`
|
|
289
|
+
- **done:** Passwords are hashed with bcrypt, verified by 3 new tests
|
|
154
290
|
|
|
155
291
|
### Task 3: Create migration
|
|
156
292
|
|
|
157
293
|
- **files:** `src/db/migrations/001_users.sql`
|
|
158
|
-
- **action:**
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
294
|
+
- **action:**
|
|
295
|
+
1. Write the migration:
|
|
296
|
+
```sql
|
|
297
|
+
CREATE TABLE users (
|
|
298
|
+
id UUID PRIMARY KEY,
|
|
299
|
+
email VARCHAR(255) NOT NULL UNIQUE,
|
|
300
|
+
password_hash VARCHAR(255) NOT NULL,
|
|
301
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
302
|
+
);
|
|
303
|
+
|
|
304
|
+
CREATE INDEX idx_users_email ON users (email);
|
|
305
|
+
```
|
|
306
|
+
2. Run `sqlx migrate run` — confirm it succeeds
|
|
307
|
+
- **verify:** `sqlx migrate run`
|
|
308
|
+
- **done:** users table exists in database with email unique constraint
|
|
168
309
|
```
|
|
169
310
|
|
|
170
311
|
## Phase-Level Design Document
|
|
@@ -245,37 +386,71 @@ A requirement can span multiple plans. Example: "REQ-05: Users can manage their
|
|
|
245
386
|
- Plan 3: View profile (requirements = ["REQ-05"])
|
|
246
387
|
- Plan 4: Edit profile (requirements = ["REQ-05"])
|
|
247
388
|
|
|
248
|
-
## TDD
|
|
389
|
+
## TDD as Default
|
|
390
|
+
|
|
391
|
+
TDD is the default execution mode for all plans. The planner must always emit `type = "tdd"` unless the plan explicitly opts out.
|
|
249
392
|
|
|
250
|
-
|
|
393
|
+
**Backward compatibility:** Existing plans without an explicit `type` field are treated as `"execute"`. The planner must always emit an explicit `type` field going forward, making the default moot for well-formed plans.
|
|
251
394
|
|
|
252
|
-
**
|
|
253
|
-
-
|
|
254
|
-
-
|
|
255
|
-
-
|
|
256
|
-
-
|
|
395
|
+
**Opt-out with `type = "execute"`:** Use `type = "execute"` for tasks where TDD doesn't apply:
|
|
396
|
+
- Infrastructure plans (SAM templates, Terraform, CI/CD configs)
|
|
397
|
+
- Configuration files (TOML, YAML, JSON configs)
|
|
398
|
+
- Documentation-only plans (README, guides, specs)
|
|
399
|
+
- Refactoring plans where existing tests already cover the behavior
|
|
257
400
|
|
|
258
|
-
**TDD
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
401
|
+
**TDD task structure (RED → GREEN → REFACTOR):**
|
|
402
|
+
1. **RED:** Write a failing test with the exact test code
|
|
403
|
+
2. **Verify RED:** Run the test command — confirm it fails
|
|
404
|
+
3. **GREEN:** Write the minimal implementation to pass the test
|
|
405
|
+
4. **Verify GREEN:** Run the test command — confirm it passes
|
|
406
|
+
5. **REFACTOR** (optional): Clean up while keeping tests green
|
|
263
407
|
|
|
264
408
|
**Example TDD task:**
|
|
265
409
|
```markdown
|
|
266
|
-
### Task 1: Write password validation tests
|
|
267
|
-
|
|
268
|
-
- **files:** `src/validation/password_test.rs`
|
|
269
|
-
- **action:**
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
410
|
+
### Task 1: Write password validation tests and implement
|
|
411
|
+
|
|
412
|
+
- **files:** `src/validation/password.rs`, `src/validation/password_test.rs`
|
|
413
|
+
- **action:**
|
|
414
|
+
1. Write failing tests:
|
|
415
|
+
```rust
|
|
416
|
+
#[cfg(test)]
|
|
417
|
+
mod tests {
|
|
418
|
+
use super::validate_password;
|
|
419
|
+
|
|
420
|
+
#[test]
|
|
421
|
+
fn rejects_short_password() {
|
|
422
|
+
assert!(validate_password("Ab1!").is_err());
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
#[test]
|
|
426
|
+
fn rejects_no_uppercase() {
|
|
427
|
+
assert!(validate_password("abcdefg1!").is_err());
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
#[test]
|
|
431
|
+
fn rejects_no_number() {
|
|
432
|
+
assert!(validate_password("Abcdefgh!").is_err());
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
#[test]
|
|
436
|
+
fn accepts_valid_password() {
|
|
437
|
+
assert!(validate_password("Secret123!").is_ok());
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
```
|
|
441
|
+
2. Run `cargo test validation::password` — confirm all 4 tests fail
|
|
442
|
+
3. Implement:
|
|
443
|
+
```rust
|
|
444
|
+
pub fn validate_password(password: &str) -> Result<(), &'static str> {
|
|
445
|
+
if password.len() < 8 { return Err("too short"); }
|
|
446
|
+
if !password.chars().any(|c| c.is_uppercase()) { return Err("no uppercase"); }
|
|
447
|
+
if !password.chars().any(|c| c.is_numeric()) { return Err("no number"); }
|
|
448
|
+
Ok(())
|
|
449
|
+
}
|
|
450
|
+
```
|
|
451
|
+
4. Run `cargo test validation::password` — confirm all 4 tests pass
|
|
452
|
+
- **verify:** `cargo test validation::password`
|
|
453
|
+
- **done:** Password validation passes all 4 test cases
|
|
279
454
|
```
|
|
280
455
|
|
|
281
456
|
## Interface Context
|
|
@@ -330,9 +505,13 @@ Before finalizing plans, verify:
|
|
|
330
505
|
|
|
331
506
|
- [ ] Phase-level `design.md` exists with overview, components, interactions, key decisions, and shared interfaces
|
|
332
507
|
- [ ] Every plan has valid TOML frontmatter
|
|
508
|
+
- [ ] Every plan has an explicit `type` field (`"tdd"` or `"execute"`)
|
|
509
|
+
- [ ] Plans default to TDD unless explicitly opted out (infra, config, docs)
|
|
333
510
|
- [ ] Every plan has a `## Design` section with Approach, Key Interfaces, Error Handling, and Trade-offs
|
|
334
511
|
- [ ] Wave numbers form a valid DAG (no cycles)
|
|
335
512
|
- [ ] Each plan has 2-5 tasks
|
|
513
|
+
- [ ] Each task has bite-sized steps (2-5 minutes each) with code blocks for code steps
|
|
514
|
+
- [ ] No placeholder patterns (TBD, TODO, implement later, etc.)
|
|
336
515
|
- [ ] Each task has files, action, verify, and done
|
|
337
516
|
- [ ] Every requirement from requirements.md is covered
|
|
338
517
|
- [ ] `must_haves` section is complete and observable
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: konductor-review
|
|
3
|
+
description: Review design and plans before execution. Use when the user says review, check design, review plans, or approve.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Konductor Review — Design & Plan Review
|
|
7
|
+
|
|
8
|
+
You are the Konductor orchestrator. Review the design and plans for a phase before execution.
|
|
9
|
+
|
|
10
|
+
## Critical Rules
|
|
11
|
+
|
|
12
|
+
1. **Only YOU manage state transitions** — use the MCP tools (`state_get`, `state_add_blocker`) instead of writing `state.toml` directly.
|
|
13
|
+
2. **Read config via MCP** — call `config_get` to get feature flags (design_review).
|
|
14
|
+
3. **Accept a phase argument** — the user may say "review phase 01". Resolve short form by scanning `.konductor/phases/` directories.
|
|
15
|
+
|
|
16
|
+
## Step 1: Validate State
|
|
17
|
+
|
|
18
|
+
Call the `state_get` MCP tool to read current state.
|
|
19
|
+
|
|
20
|
+
Validate that `current.step` is `"planned"`. If not, tell the user:
|
|
21
|
+
> "Phase {phase} is not ready for review. Current step: {step}. Run 'plan' first."
|
|
22
|
+
Then stop.
|
|
23
|
+
|
|
24
|
+
## Step 2: Design Review (if enabled)
|
|
25
|
+
|
|
26
|
+
If `config.toml` `features.design_review = true`:
|
|
27
|
+
|
|
28
|
+
Use the **konductor-design-reviewer** agent to review the technical design. Provide it with:
|
|
29
|
+
- `.konductor/phases/{phase}/design.md`
|
|
30
|
+
- All plan files in `.konductor/phases/{phase}/plans/`
|
|
31
|
+
- `.konductor/requirements.md`
|
|
32
|
+
- `.konductor/roadmap.md` (phase goal and success criteria)
|
|
33
|
+
- `.konductor/project.md` (tech stack and constraints)
|
|
34
|
+
- Instructions: analyze the phase design and per-plan Design sections, then write a structured review to `.konductor/phases/{phase}/review.md`
|
|
35
|
+
|
|
36
|
+
**Review criteria the agent must evaluate:**
|
|
37
|
+
1. Architectural soundness of design.md — do the components and interactions make sense?
|
|
38
|
+
2. Feasibility of per-plan Design sections — are the proposed interfaces and approaches realistic?
|
|
39
|
+
3. Cross-plan consistency — do shared interfaces match across plans that depend on each other?
|
|
40
|
+
4. Requirement coverage — every REQ-XX for this phase is addressed
|
|
41
|
+
5. Risk identification — missing error handling, security concerns, dependency issues
|
|
42
|
+
|
|
43
|
+
**Review output format** (written to `.konductor/phases/{phase}/review.md`):
|
|
44
|
+
```markdown
|
|
45
|
+
# Design Review: Phase {phase}
|
|
46
|
+
|
|
47
|
+
## Summary
|
|
48
|
+
{one paragraph overall assessment}
|
|
49
|
+
|
|
50
|
+
## Verdict: {pass | revise | reject}
|
|
51
|
+
|
|
52
|
+
## Issues
|
|
53
|
+
|
|
54
|
+
### Issue 1: {title}
|
|
55
|
+
- **Severity:** critical | warning | info
|
|
56
|
+
- **Affected plan:** {plan number or "design.md"}
|
|
57
|
+
- **Description:** {what's wrong}
|
|
58
|
+
- **Suggestion:** {how to fix}
|
|
59
|
+
|
|
60
|
+
## Strengths
|
|
61
|
+
{what the design does well}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Wait for the reviewer to complete. Verify `review.md` was created.
|
|
65
|
+
|
|
66
|
+
**If verdict is "pass":** Proceed to Step 3.
|
|
67
|
+
|
|
68
|
+
**If verdict is "revise"** (has critical or warning issues):
|
|
69
|
+
1. Spawn a new **konductor-planner** agent with the review feedback as additional context
|
|
70
|
+
2. Instruct it to revise `design.md` and the affected plans in-place
|
|
71
|
+
3. Re-run the **konductor-design-reviewer**
|
|
72
|
+
4. Maximum 2 review-revise iterations. If still "revise" after 2 iterations, proceed to user approval with warnings noted.
|
|
73
|
+
|
|
74
|
+
**If verdict is "reject":** Stop. Tell the user:
|
|
75
|
+
> "Design rejected by reviewer. See `.konductor/phases/{phase}/review.md` for details. Fix the fundamental issues and re-run design."
|
|
76
|
+
|
|
77
|
+
## Step 3: User Approval
|
|
78
|
+
|
|
79
|
+
Present the review summary to the user. Ask:
|
|
80
|
+
> "Approve plans for execution? (approve / reject)"
|
|
81
|
+
|
|
82
|
+
- **On approve:** Tell the user: "Plans approved. Say 'next' to execute, or 'exec' to start execution."
|
|
83
|
+
- **On reject:** Tell the user: "Plans not approved. Edit the plans in `.konductor/phases/{phase}/plans/` or re-run design."
|
|
84
|
+
|
|
85
|
+
If `features.design_review = false`: skip the automated review and go straight to user approval, presenting a summary of the plans instead.
|
|
86
|
+
|
|
87
|
+
## Error Handling
|
|
88
|
+
|
|
89
|
+
If the reviewer subagent fails:
|
|
90
|
+
1. Call `state_add_blocker` MCP tool with the phase and reason for the failure
|
|
91
|
+
2. Report failure to user with actionable context
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: konductor-
|
|
3
|
-
description:
|
|
2
|
+
name: konductor-spec
|
|
3
|
+
description: Define project requirements and generate spec documents. Use when the user says spec, define requirements, new project, start project, set up konductor, or bootstrap.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Konductor
|
|
6
|
+
# Konductor Spec — Project Requirements
|
|
7
7
|
|
|
8
|
-
You are the Konductor orchestrator.
|
|
8
|
+
You are the Konductor orchestrator. Define project requirements and generate spec documents.
|
|
9
9
|
|
|
10
10
|
## Step 1: Check Existing State
|
|
11
11
|
|
|
12
12
|
Check if `.konductor/` directory already exists.
|
|
13
13
|
- If it exists, call the `state_get` MCP tool. If it returns valid state:
|
|
14
|
-
- If `current.step` is `"shipped"`: ask the user: "Project is shipped. Do you want to (a) add a new phase to the existing project, or (b)
|
|
14
|
+
- If `current.step` is `"shipped"`: ask the user: "Project is shipped. Do you want to (a) add a new phase to the existing project, or (b) re-spec from scratch?"
|
|
15
15
|
- If (a): ask for the new phase name. Read `.konductor/roadmap.md` to determine the updated `phases_total`. Call the `state_advance_phase` MCP tool with the new phase identifier and updated phases_total. Skip to Step 8 (report success).
|
|
16
|
-
- If (b): proceed with normal
|
|
17
|
-
- Otherwise: warn the user: "A Konductor project already exists here.
|
|
16
|
+
- If (b): proceed with normal re-spec below.
|
|
17
|
+
- Otherwise: warn the user: "A Konductor project already exists here. Re-speccing will overwrite project.md, requirements.md, and roadmap.md. Proceed? (y/n)"
|
|
18
18
|
- If user declines, stop.
|
|
19
19
|
|
|
20
20
|
## Step 2: Create Directory Structure
|
|
@@ -64,7 +64,7 @@ Call the `state_init` MCP tool with:
|
|
|
64
64
|
- `phase`: the first phase identifier from the roadmap
|
|
65
65
|
- `phases_total`: the total number of phases from the roadmap
|
|
66
66
|
|
|
67
|
-
This creates `.konductor/state.toml` with
|
|
67
|
+
This creates `.konductor/state.toml` with step `specced`.
|
|
68
68
|
|
|
69
69
|
Call the `config_init` MCP tool to create `.konductor/config.toml` with defaults.
|
|
70
70
|
|
|
@@ -80,4 +80,4 @@ Create/update `.kiro/steering/` files:
|
|
|
80
80
|
Tell the user:
|
|
81
81
|
- How many phases were identified in the roadmap
|
|
82
82
|
- List the phase names
|
|
83
|
-
- Suggest: "Say 'next' to start
|
|
83
|
+
- Suggest: "Say 'next' to start designing phase 1, or 'discuss phase 01' to set preferences first."
|
|
@@ -19,7 +19,7 @@ Call the `status` MCP tool. This returns a structured JSON report with:
|
|
|
19
19
|
- `next_suggestion`
|
|
20
20
|
|
|
21
21
|
If the tool returns a `STATE_NOT_FOUND` error, tell the user:
|
|
22
|
-
> "No Konductor project found. Run '
|
|
22
|
+
> "No Konductor project found. Run 'spec' to initialize a project."
|
|
23
23
|
|
|
24
24
|
Then stop.
|
|
25
25
|
|
|
@@ -90,13 +90,14 @@ Last activity: {last_activity_relative} ({last_activity_absolute})
|
|
|
90
90
|
- · = pending
|
|
91
91
|
|
|
92
92
|
**Next step suggestions by current step:**
|
|
93
|
-
- `
|
|
94
|
-
- `discussed` → "Say 'next' to begin
|
|
93
|
+
- `specced` → "Say 'next' to start design, or 'discuss phase {n}' to set preferences first."
|
|
94
|
+
- `discussed` → "Say 'next' to begin designing phase {n}."
|
|
95
|
+
- `designed` → "Say 'next' to create execution plans."
|
|
95
96
|
- `planned` → "Say 'exec' to execute the plans."
|
|
96
97
|
- `executing` → "Execution in progress. Wait for completion or check logs."
|
|
97
98
|
- `executed` → "Say 'next' to verify the phase."
|
|
98
99
|
- `complete` → "Phase {n} complete. Say 'next' to move to phase {n+1}."
|
|
99
|
-
- `shipped` → "All phases shipped. Add new phases to roadmap.md or say '
|
|
100
|
+
- `shipped` → "All phases shipped. Add new phases to roadmap.md or say 'spec' to start a new project."
|
|
100
101
|
- `blocked` → "Resolve the blocker with `state_resolve_blocker`, then say 'next'."
|
|
101
102
|
|
|
102
103
|
## Error Handling
|
|
@@ -104,7 +105,7 @@ Last activity: {last_activity_relative} ({last_activity_absolute})
|
|
|
104
105
|
**Missing state files:**
|
|
105
106
|
If the `status` tool returns an error:
|
|
106
107
|
1. Report the error
|
|
107
|
-
2. Suggest running `
|
|
108
|
+
2. Suggest running `spec` to re-spec (warn about overwriting)
|
|
108
109
|
|
|
109
110
|
**Empty results directory:**
|
|
110
111
|
If `.konductor/.results/` is empty, that's normal for newly initialized projects — simply report no activity yet.
|
|
File without changes
|