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.
@@ -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 should take 15-60 minutes of execution time.
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 (be specific)
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
- **Example task:**
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:** Import bcrypt crate, add `hash_password` method to User impl, call it in `new` constructor
58
- - **verify:** `cargo test user::test_password_hashing`
59
- - **done:** Passwords are hashed with bcrypt before storage
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) or "tdd" (test-driven)
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 = "execute"
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:** Define User struct with fields: id (UUID), email (String), password_hash (String), created_at (DateTime)
145
- - **verify:** `cargo check` passes
146
- - **done:** User struct compiles
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:** Import bcrypt, add `hash_password` method, call in constructor
152
- - **verify:** `cargo test user::test_password_hashing`
153
- - **done:** Passwords are hashed before storage
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:** Write CREATE TABLE users with columns matching User struct
159
- - **verify:** `sqlx migrate run` succeeds
160
- - **done:** users table exists in database
161
-
162
- ### Task 4: Wire User model to auth routes
163
-
164
- - **files:** `src/routes/auth.rs`
165
- - **action:** Import User model, use it in registration handler
166
- - **verify:** Compilation succeeds, User is referenced
167
- - **done:** Registration route can create User instances
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 Detection
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
- If a task can be expressed as "expect(fn(input)).toBe(output)", make it a TDD plan.
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
- **Indicators:**
253
- - Pure functions (no I/O)
254
- - Clear input/output contract
255
- - Algorithmic logic (sorting, parsing, validation)
256
- - Data transformations
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 plan differences:**
259
- - `type = "tdd"` in frontmatter
260
- - First task writes tests
261
- - Remaining tasks implement to pass tests
262
- - Verification is `cargo test` or equivalent
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:** Write tests for: min 8 chars, has uppercase, has number, has special char
270
- - **verify:** Tests exist and fail
271
- - **done:** 4 test cases written
272
-
273
- ### Task 2: Implement password validation
274
-
275
- - **files:** `src/validation/password.rs`
276
- - **action:** Write validate_password function to satisfy tests
277
- - **verify:** `cargo test validation::password` passes
278
- - **done:** All password validation tests pass
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-init
3
- description: Initialize a new Konductor project with spec-driven development. Use when the user says init, initialize, new project, start project, set up konductor, or bootstrap.
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 Init — Project Initialization
6
+ # Konductor Spec — Project Requirements
7
7
 
8
- You are the Konductor orchestrator. Initialize a new spec-driven development project.
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) reinitialize from scratch?"
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 reinitialization below.
17
- - Otherwise: warn the user: "A Konductor project already exists here. Reinitializing will overwrite project.md, requirements.md, and roadmap.md. Proceed? (y/n)"
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 the correct initial structure.
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 planning phase 1, or 'discuss phase 01' to set preferences first."
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 'init' to initialize a project."
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
- - `initialized` → "Say 'next' to start planning, or 'discuss phase {n}' to set preferences first."
94
- - `discussed` → "Say 'next' to begin planning phase {n}."
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 'init' to start a new project."
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 `init` to reinitialize (warn about overwriting)
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.