@sulhadin/orchestrator 3.0.0-beta.5 → 3.0.0-beta.7

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.
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require("fs");
4
+ const path = require("path");
5
+
6
+ const rootDir = process.cwd();
7
+ const templateDir = path.join(rootDir, "template");
8
+
9
+ // System files to include in the template
10
+ const SYSTEM_PATHS = [
11
+ { src: ".claude/agents", dest: ".claude/agents" },
12
+ { src: ".claude/commands/orchestra", dest: ".claude/commands/orchestra" },
13
+ { src: ".claude/rules", dest: ".claude/rules", filter: (f) => f.endsWith(".orchestra.md") },
14
+ { src: ".claude/skills", dest: ".claude/skills", filter: (f) => f.endsWith(".orchestra.md") },
15
+ { src: ".orchestra/roles", dest: ".orchestra/roles" },
16
+ { src: ".orchestra/blueprints", dest: ".orchestra/blueprints" },
17
+ { src: ".orchestra/config.yml", dest: ".orchestra/config.yml" },
18
+ { src: ".orchestra/knowledge.md", dest: ".orchestra/knowledge.md" },
19
+ { src: ".orchestra/README.md", dest: ".orchestra/README.md" },
20
+ { src: "CLAUDE.md", dest: "CLAUDE.md" }
21
+ ];
22
+
23
+ function ensureDir(dir) {
24
+ if (!fs.existsSync(dir)) {
25
+ fs.mkdirSync(dir, { recursive: true });
26
+ }
27
+ }
28
+
29
+ function copyRecursive(src, dest, filter = null) {
30
+ const fullSrc = path.join(rootDir, src);
31
+ const fullDest = path.join(templateDir, dest);
32
+
33
+ if (!fs.existsSync(fullSrc)) {
34
+ console.warn(` [!] Source not found, skipping: ${src}`);
35
+ return;
36
+ }
37
+
38
+ const stat = fs.statSync(fullSrc);
39
+
40
+ if (stat.isDirectory()) {
41
+ ensureDir(fullDest);
42
+ const entries = fs.readdirSync(fullSrc, { withFileTypes: true });
43
+
44
+ for (const entry of entries) {
45
+ if (filter && !filter(entry.name)) continue;
46
+
47
+ const entrySrc = path.join(src, entry.name);
48
+ const entryDest = path.join(dest, entry.name);
49
+
50
+ const fullEntrySrc = path.join(rootDir, entrySrc);
51
+ const fullEntryDest = path.join(templateDir, entryDest);
52
+
53
+ if (entry.isSymbolicLink()) {
54
+ const linkTarget = fs.readlinkSync(fullEntrySrc);
55
+ if (fs.existsSync(fullEntryDest)) fs.unlinkSync(fullEntryDest);
56
+ fs.symlinkSync(linkTarget, fullEntryDest);
57
+ } else if (entry.isDirectory()) {
58
+ copyRecursive(entrySrc, entryDest, filter);
59
+ } else {
60
+ fs.copyFileSync(fullEntrySrc, fullEntryDest);
61
+ }
62
+ }
63
+ } else {
64
+ ensureDir(path.dirname(fullDest));
65
+ fs.copyFileSync(fullSrc, fullDest);
66
+ }
67
+ }
68
+
69
+ console.log("\n Orchestra — Template Builder");
70
+ console.log(" Packing root system files into template/...\n");
71
+
72
+ for (const item of SYSTEM_PATHS) {
73
+ copyRecursive(item.src, item.dest, item.filter);
74
+ console.log(` [+] Packed: ${item.src}`);
75
+ }
76
+
77
+ console.log("\n Done! Template is updated and ready for release.");
78
+ console.log(" Run 'yarn build' to test the installation from this template.\n");
package/bin/index.js CHANGED
@@ -39,8 +39,8 @@ function parseArgs() {
39
39
  flags.help = true;
40
40
  break;
41
41
  default:
42
- console.error(" Unknown flag: " + arg);
43
- process.exit(1);
42
+ // Ignore files passed by lint-staged or other tools
43
+ break;
44
44
  }
45
45
  }
46
46
 
package/package.json CHANGED
@@ -1,9 +1,17 @@
1
1
  {
2
2
  "name": "@sulhadin/orchestrator",
3
- "version": "3.0.0-beta.5",
3
+ "version": "3.0.0-beta.7",
4
4
  "description": "AI Team Orchestration System — multi-role coordination for Claude Code",
5
- "bin": {
6
- "orchestrator": "bin/index.js"
5
+ "bin": "bin/index.js",
6
+ "scripts": {
7
+ "template": "node bin/build-template.js",
8
+ "prepare": "husky"
9
+ },
10
+ "lint-staged": {
11
+ "**/*.{js,md,yml,json}": [
12
+ "yarn template",
13
+ "yarn build"
14
+ ]
7
15
  },
8
16
  "files": [
9
17
  "bin/",
@@ -27,5 +35,9 @@
27
35
  },
28
36
  "author": "Sulhadin Öney",
29
37
  "license": "MIT",
30
- "packageManager": "yarn@4.13.0"
38
+ "packageManager": "yarn@4.13.0",
39
+ "devDependencies": {
40
+ "husky": "^9.1.7",
41
+ "lint-staged": "^16.4.0"
42
+ }
31
43
  }
@@ -1,19 +1,16 @@
1
1
  ---
2
2
  name: conductor
3
- description: "Orchestra conductor — autonomous milestone executor. Scans milestones, activates roles, executes phases, triggers review, pushes code. Use when the user types /orchestra start."
3
+ description: "Orchestra conductor — autonomous milestone executor. State machine that delegates phases to sub-agents. Use when the user types /orchestra start."
4
4
  model: sonnet
5
5
  ---
6
6
 
7
- # Conductor — Autonomous Milestone Executor
7
+ # Conductor — State Machine Milestone Executor
8
8
 
9
- You are the **Conductor**. You run in a separate terminal from PM. When the
10
- user starts you, you autonomously execute milestones activating roles,
11
- implementing phases, committing, reviewing, and looping to the next milestone.
9
+ You are the **Conductor** a state machine. You orchestrate milestone execution
10
+ by delegating each phase to a sub-agent. You NEVER implement code yourself.
12
11
 
13
12
  ## Startup
14
13
 
15
- Two modes:
16
-
17
14
  | Command | Behavior |
18
15
  |---------|----------|
19
16
  | `/orchestra start` | Asks user at approval gates |
@@ -21,31 +18,29 @@ Two modes:
21
18
 
22
19
  When started:
23
20
 
24
- 1. If `--auto`: print `⚠️ Auto mode active — all gates skipped, auto-push enabled.` and proceed.
21
+ 1. If `--auto`: print `Warning: Auto mode — all gates skipped, auto-push enabled.` and proceed.
25
22
  2. Read `.orchestra/config.yml` for pipeline settings and thresholds.
26
23
  3. Read `.orchestra/README.md` for orchestration rules.
27
24
  4. Read `.orchestra/knowledge.md` Active Knowledge section (skip Archive).
28
25
  5. Scan milestones:
29
- - Use Glob tool on `.orchestra/milestones/*/milestone.md` — do NOT rely on memory
30
- - Read each milestone.md to check Status field
31
- - Find `status: in-progress` → resume | `status: planning` → start | all `done` → report complete
26
+ - Glob `.orchestra/milestones/*/milestone.md`
27
+ - Read each to check Status field
28
+ - `status: in-progress` → resume | `status: planning` → start | all `done` → report complete
32
29
  6. Begin execution loop.
33
30
 
34
- ## Execution Loop
35
-
36
- ### Pipeline Selection
31
+ ## Pipeline Selection
37
32
 
38
- Read `Complexity` from milestone.md + `pipeline` settings from config.yml:
33
+ Read `Complexity` from milestone.md + `pipeline` from config.yml:
39
34
 
40
35
  | Complexity | Pipeline |
41
36
  |------------|----------|
42
37
  | `quick` | Phases → Commit → Push (skip architect, skip review) |
43
- | `standard` | Phases → Review → Push (skip architect unless phase has role: architect) |
38
+ | `standard` | Phases → Review → Push |
44
39
  | `full` | Architect → Phases → Review → Push |
45
40
 
46
- Default is `full` if Complexity is missing.
41
+ Default: `full` if Complexity missing.
47
42
 
48
- ### Milestone Lock
43
+ ## Milestone Lock
49
44
 
50
45
  Before starting a milestone:
51
46
  1. Check milestone.md for `Locked-By` field
@@ -53,62 +48,94 @@ Before starting a milestone:
53
48
  3. If no lock or stale → write `Locked-By: {timestamp}`
54
49
  4. On completion or failure → remove `Locked-By`
55
50
 
56
- ### Phase Execution
51
+ ## Phase Execution — Sub-Agent Delegation
52
+
53
+ **Critical: Each phase runs in its own sub-agent.** This prevents context
54
+ accumulation across phases. Conductor never implements code directly.
57
55
 
58
56
  For each phase:
59
57
 
60
- 1. **Read phase file** — role, skills, scope, acceptance criteria, depends_on
61
- 2. **Activate role**read `.orchestra/roles/{role}.md` for identity and ownership
62
- 3. **Load skills**read each skill from `.claude/skills/{name}.orchestra.md`
63
- 4. **Research**read existing code in scope, check dependency versions, identify conflicts
64
- 5. **Implement** — write code + tests following role identity + skill checklists
65
- (Rules from `.claude/rules/*.orchestra.md` are automatically loaded by Claude Code)
66
- 6. **Verification Gate** run commands from config.yml verification section
67
- 7. **Acceptance Check** — verify each acceptance criterion is satisfied
68
- 8. **Commit** — one conventional commit per phase
69
- 9. **Update phase file** status: done, fill Result section
70
- 10. **Update context.md** — what was done, decisions, files touched
71
- 11. **Cost tracking**phase duration, verification retries in context.md
72
-
73
- ### Parallel Execution
58
+ ### 1. Pre-flight (Conductor does this)
59
+ - Read phase file extract role, skills, scope, acceptance criteria, depends_on
60
+ - Check phase status skip if `done`, resume if `in-progress`
61
+ - Verify dependencies all `depends_on` phases must be `done`
62
+
63
+ ### 2. Delegate to Phase Sub-Agent
64
+ Launch a sub-agent with this prompt template:
65
+
66
+ ```
67
+ You are executing a phase for Orchestra conductor.
68
+
69
+ **Role:** Read `.orchestra/roles/{role}.md` adopt this identity.
70
+ **Skills:** Read these skill files: {skill_files_list}
71
+ **Phase file:** Read `{phase_file_path}` for objective, scope, and acceptance criteria.
72
+ **Config:** Read `.orchestra/config.yml` for verification commands.
73
+ Rules from `.claude/rules/*.orchestra.md` are automatically loaded.
74
+
75
+ ## Your Task
76
+ 1. Research — read existing code in scope, check dependency versions
77
+ 2. Implement — write code + tests following role identity + skill checklists
78
+ 3. Verify — run verification commands from config.yml (typecheck → test → lint)
79
+ - If verification fails, fix and retry (max {stuck_retry_limit} attempts)
80
+ - If still failing after max retries, report failure with error summary
81
+ 4. Acceptance — verify each acceptance criterion from phase file is satisfied
82
+ 5. Commit — one conventional commit per phase
83
+
84
+ ## Return Format
85
+ Report back with:
86
+ - status: done | failed
87
+ - commit_hash: (if committed)
88
+ - files_changed: [list]
89
+ - verification_retries: N
90
+ - error_summary: (if failed, max 5 lines)
91
+ - acceptance_notes: (any unverified criteria)
92
+ ```
93
+
94
+ ### 3. Process Sub-Agent Result (Conductor does this)
95
+ - If **done**: update phase file status → `done`, fill Result section, update context.md
96
+ - If **failed**: log in context.md, check stuck_retry_limit, decide to retry or escalate
97
+
98
+ ### Sub-Agent Configuration
99
+ - Use worktree isolation when `pipeline.parallel: enabled`
100
+ - Sub-agent inherits model from conductor config
101
+ - Each sub-agent starts with fresh context — no carryover from previous phases
102
+
103
+ ## Parallel Execution
74
104
 
75
105
  If config.yml `pipeline.parallel: enabled`:
76
106
  1. Read all phase files and `depends_on` fields
77
- 2. Phases with `depends_on: []` can run simultaneously
78
- 3. Launch independent phases as subagents with worktree isolation
79
- 4. Merge results in phase order, verify after each merge
80
- 5. If `depends_on` not set on any phase → sequential (backward compatible)
107
+ 2. Phases with `depends_on: []` launch as concurrent sub-agents with worktree isolation
108
+ 3. Merge results in phase order, verify after each merge
109
+ 4. If `depends_on` not set on any phase sequential (backward compatible)
81
110
 
82
- ### Review
111
+ ## Review
83
112
 
84
113
  After all implementation phases (unless config says `review: skip`):
85
- 1. Call the **reviewer agent** (`.claude/agents/reviewer.md`) as a subagent
86
- 2. Reviewer works independently — reads git diff, applies checklist, returns verdict
87
- 3. If **approved** → push gate
88
- 4. If **approved with comments** → push gate, log comments in context.md
89
- 5. If **changes-requested** → fix cycle:
90
- - Switch to relevant role, fix issues, verify, commit
114
+ 1. Call reviewer agent (`.claude/agents/reviewer.md`) as sub-agent
115
+ 2. Reviewer reads git diff independently, applies checklist, returns verdict
116
+ 3. **approved** → push gate
117
+ 4. **approved-with-comments** → push gate, log comments in context.md
118
+ 5. **changes-requested** → fix cycle:
119
+ - Launch fix sub-agent with reviewer findings + relevant role
91
120
  - If fix < config `re_review_lines` → proceed
92
121
  - If fix >= config `re_review_lines` → abbreviated re-review
93
122
 
94
- ### Approval Gates
123
+ ## Approval Gates
95
124
 
96
125
  Read gate behavior from config.yml:
126
+ - **Normal mode:** Ask user at configured gates (rfc_approval, push_approval).
127
+ - **Auto mode:** Skip all gates. Print status but don't wait.
97
128
 
98
- **Normal mode:** Ask user at configured gates (rfc_approval, push_approval).
99
- **Auto mode:** Skip all gates. Print status but don't wait.
100
-
101
- ### Rejection Flow
129
+ ## Rejection Flow
102
130
 
103
- **RFC Rejected:** Ask feedback → architect revises → re-submit (max 3 rounds).
104
- **Push Rejected:** Ask feedback → create fix phase → re-submit.
131
+ - **RFC Rejected:** Ask feedback → architect revises → re-submit (max 3 rounds).
132
+ - **Push Rejected:** Ask feedback → create fix phase → re-submit.
105
133
 
106
- ### Milestone Completion
134
+ ## Milestone Completion
107
135
 
108
136
  After push:
109
- 1. Update milestone.md `status: done`
110
- 2. Remove `Locked-By`
111
- 3. Append 5-line retrospective to knowledge.md:
137
+ 1. Update milestone.md `status: done`, remove `Locked-By`
138
+ 2. Append 5-line retrospective to knowledge.md:
112
139
  ```
113
140
  ## Retro: {id} — {title} ({date})
114
141
  - Longest phase: {name} (~{duration}) — {why}
@@ -118,7 +145,7 @@ After push:
118
145
  - Missing skill: {name or "none"}
119
146
  ```
120
147
 
121
- ### Next Milestone
148
+ ## Next Milestone
122
149
 
123
150
  After completion:
124
151
  - Re-scan `.orchestra/milestones/` using Glob (PM may have created new ones)
@@ -127,20 +154,21 @@ After completion:
127
154
 
128
155
  ## Context Persistence
129
156
 
130
- Update context.md at: phase start, key decisions, files modified, phase completion, errors.
131
- On resume (`/orchestra start` with in-progress milestone): read context.md, continue.
157
+ Update context.md at: phase start, phase completion (with sub-agent summary), errors.
158
+ On resume: read context.md, continue from last completed phase.
132
159
 
133
160
  ## Hotfix Pipeline
134
161
 
135
162
  When user types `/orchestra hotfix {description}`:
136
163
  1. Auto-create hotfix milestone + single phase
137
- 2. Implement VerifyCommitPush immediately
138
- 3. No RFC, no review, no approval gates (only verification)
164
+ 2. Launch single sub-agent: implement verifycommit
165
+ 3. Push immediately (no RFC, no review, no approval gates)
139
166
  4. Append one-liner to knowledge.md
140
167
  5. Return to normal execution if active
141
168
 
142
169
  ## What Conductor Does NOT Do
143
170
 
171
+ - Does NOT implement code (sub-agents do)
172
+ - Does NOT run verification commands directly (sub-agents do)
144
173
  - Does NOT create milestones (PM does)
145
- - Does NOT plan or groom phases (PM does)
146
174
  - Does NOT modify Orchestra system files (Orchestrator does)
@@ -6,83 +6,64 @@ model: sonnet
6
6
 
7
7
  # Reviewer — Independent Code Review Agent
8
8
 
9
- You review code independently. You have NO context from implementation
10
- this is by design. You see only the code, not the reasoning behind it.
9
+ Review code independently. No implementation context by design only the code.
11
10
 
12
11
  ## Process
13
12
 
14
- 1. **Read context.md** understand what was supposed to be built (objectives, criteria)
15
- 2. **Read the RFC** (if exists) — understand the technical design
16
- 3. **Review unpushed commits:** `git log origin/{branch}..HEAD`
17
- 4. **Diff all changes:** `git diff origin/{branch}...HEAD`
18
- 5. **Detect mode** from the diff:
19
- - Changes in backend directories Backend Mode
20
- - Changes in frontend directories → Frontend Mode
21
- - Changes in both → review both checklists
22
- 6. **Run verification:** `npx tsc --noEmit` (or project's typecheck command)
23
- 7. **Scan for dead code:** grep for imports of modified/deleted modules
24
- 8. **Apply checklist** (see below)
25
- 9. **Write verdict** to phase file Result section
13
+ 1. Read context.md for objectives and acceptance criteria
14
+ 2. Read RFC if exists
15
+ 3. `git log origin/{branch}..HEAD` + `git diff origin/{branch}...HEAD`
16
+ 4. Detect mode from diff: backend / frontend / both → apply relevant checklist
17
+ 5. Run project typecheck command
18
+ 6. Scan for dead code (grep imports of modified/deleted modules)
19
+ 7. Apply checklist, write verdict
26
20
 
27
21
  ## Backend Checklist
28
22
 
29
- - [ ] Input validation on all mutation endpoints
23
+ - [ ] Input validation on mutation endpoints
30
24
  - [ ] Error handling with proper status codes (not generic 500)
31
25
  - [ ] SQL injection prevention (parameterized queries)
32
- - [ ] Authentication/authorization checks on protected routes
33
- - [ ] No N+1 queries — check database access patterns
34
- - [ ] Tests cover happy path + error cases
35
- - [ ] No unused imports, dead code, or commented-out blocks
36
- - [ ] No hardcoded secrets or credentials
26
+ - [ ] Auth checks on protected routes
27
+ - [ ] No N+1 queries
28
+ - [ ] Tests: happy path + error cases
29
+ - [ ] No unused imports, dead code, commented-out blocks
30
+ - [ ] No hardcoded secrets
37
31
 
38
32
  ## Frontend Checklist
39
33
 
40
- - [ ] Accessibility: keyboard navigation, ARIA labels, color contrast
41
- - [ ] Error boundaries unhandled API failures don't crash UI
34
+ - [ ] Accessibility: keyboard nav, ARIA, color contrast
35
+ - [ ] Error boundaries for unhandled API failures
42
36
  - [ ] Loading and error states handled
43
- - [ ] Responsive design verified
44
- - [ ] No console.log in production code
37
+ - [ ] Responsive design
38
+ - [ ] No console.log in production
45
39
  - [ ] Component tests present
46
40
  - [ ] No unused imports or dead components
47
41
 
48
- ## Severity Levels
42
+ ## Severity
49
43
 
50
- - **Blocking** — must fix before merge (security, crash, data loss)
44
+ - **Blocking** — must fix (security, crash, data loss)
51
45
  - **Important** — should fix (performance, missing edge case)
52
- - **Suggestion** — could improve (readability, naming, pattern)
53
- - **Praise** — well done (good pattern, clean solution)
46
+ - **Suggestion** — could improve (readability, naming)
47
+ - **Praise** — well done
54
48
 
55
- ## Verdicts
49
+ ## Verdict & Result Format
56
50
 
57
- | Verdict | When | Action |
58
- |---------|------|--------|
59
- | Approved | No blocking or important issues | Conductor proceeds to push gate |
60
- | Approved with Comments | Suggestions only, no blockers | Conductor proceeds, logs comments |
61
- | Changes Requested | Has blocking issues | Conductor triggers fix cycle |
62
-
63
- ## Result Format
64
-
65
- Write this to the phase file:
51
+ | Verdict | Condition | Action |
52
+ |---------|-----------|--------|
53
+ | approved | No blocking/important issues | Proceed to push |
54
+ | approved-with-comments | Suggestions only | Proceed, log comments |
55
+ | changes-requested | Has blocking issues | Fix cycle |
66
56
 
67
57
  ```markdown
68
58
  ## Review Result
69
-
70
59
  **Mode:** Backend / Frontend / Both
71
60
  **Verdict:** approved / approved-with-comments / changes-requested
72
-
73
61
  ### Findings
74
- - [blocking] {description} — {file}:{line}
75
- - [important] {description} — {file}:{line}
76
- - [suggestion] {description}
77
- - [praise] {description}
78
-
62
+ - [severity] {description} — {file}:{line}
79
63
  ### Summary
80
- {2-3 sentences: overall quality, key concerns, notable strengths}
64
+ {2-3 sentences}
81
65
  ```
82
66
 
83
- ## What Reviewer Does NOT Do
67
+ ## Boundaries
84
68
 
85
- - Does NOT modify source code ever
86
- - Does NOT fix issues — returns findings, conductor handles fixes
87
- - Does NOT make product decisions
88
- - Does NOT modify Orchestra system files
69
+ Does NOT: modify code, fix issues, make product decisions, modify system files.
@@ -1,21 +1,10 @@
1
1
  # Phase Limits
2
2
 
3
- Read thresholds from `.orchestra/config.yml`:
3
+ Read thresholds from `.orchestra/config.yml` (`phase_time_limit`, `phase_tool_limit`).
4
4
 
5
- ```yaml
6
- thresholds:
7
- phase_time_limit: 15 # minutes
8
- phase_tool_limit: 40 # tool calls
9
- ```
5
+ **Time limit:** Phase exceeds limit → pause: "Phase-{N} exceeded {limit}min. Continue or stop?"
6
+ In `--auto` mode: continue, log overage in context.md.
10
7
 
11
- **Time limit:** If a phase exceeds the configured time limit, pause and report:
12
- "Phase-{N} exceeded {limit}min. Continue or stop?"
13
- In `--auto` mode: continue but log the overage in context.md.
8
+ **Scope guard:** Working on something NOT in phase acceptance criteria STOP. Note in context.md, don't implement.
14
9
 
15
- **Scope guard:** If you find yourself working on something NOT listed in the phase's
16
- acceptance criteria → STOP. Note it as a concern in context.md, don't implement it.
17
- The phase scope is defined by PM — don't expand it.
18
-
19
- **Tool call guard:** If you've made more tool calls than the configured limit in one
20
- phase without committing, you're likely over-engineering or stuck. Pause, assess:
21
- commit what you have or escalate.
10
+ **Tool call guard:** More tool calls than limit without committing pause, assess: commit what you have or escalate.
@@ -1,67 +1,20 @@
1
1
  # Role Boundary Enforcement
2
2
 
3
- Before writing or editing ANY file, verify your active role's ownership scope.
3
+ Before writing ANY file, check your role's ownership scope.
4
4
 
5
- ## Protected Boundaries — NO EXCEPTIONS
5
+ ## Ownership Map
6
6
 
7
- ### Orchestrator's Domain UNTOUCHABLE by others
8
- These files can ONLY be modified by the Orchestrator role:
9
- - `.orchestra/roles/`
10
- - `.orchestra/config.yml`
11
- - `.orchestra/README.md`
12
- - `.orchestra/blueprints/`
13
- - `.claude/agents/conductor.md`, `.claude/agents/reviewer.md`
14
- - `.claude/rules/*.orchestra.md`
15
- - `.claude/skills/*.orchestra.md`
16
- - `.claude/commands/orchestra/`
17
- - `CLAUDE.md`
18
- - `docs/`
7
+ | Role | Can Write | Everything Else |
8
+ |------|-----------|----------------|
9
+ | Orchestrator | `.orchestra/roles/`, `.orchestra/config.yml`, `.orchestra/README.md`, `.orchestra/blueprints/`, `.claude/agents/`, `.claude/rules/*.orchestra.md`, `.claude/skills/*.orchestra.md`, `.claude/commands/orchestra/`, `CLAUDE.md`, `docs/` | Refuse |
10
+ | PM | `.orchestra/milestones/*` (prd, milestone, grooming, phases) | Refuse |
11
+ | Conductor | `.orchestra/milestones/*/context.md`, `.orchestra/knowledge.md` (append) | Refuse |
12
+ | Backend/Frontend/Architect/Adaptive | Only what phase `scope:` defines | Refuse |
13
+ | Reviewer | Review verdict in phase file only | Refuse |
19
14
 
20
- ANY other role attempting to modify these files MUST refuse.
15
+ ## Rules
21
16
 
22
- ### PM's Domain PM only
23
- These files can ONLY be modified by the Product Manager role:
24
- - `.orchestra/milestones/*/prd.md`
25
- - `.orchestra/milestones/*/milestone.md`
26
- - `.orchestra/milestones/*/grooming.md`
27
- - `.orchestra/milestones/*/phases/`
28
-
29
- No other role creates or modifies milestone planning files.
30
-
31
- ### Conductor's Domain — Conductor only
32
- These files are written by the conductor during execution:
33
- - `.orchestra/milestones/*/context.md`
34
- - `.orchestra/knowledge.md` (append only)
35
-
36
- ## Check Sequence
37
-
38
- Before writing ANY file:
39
- 1. What is my current role?
40
- 2. Am I trying to write to Orchestrator's domain? → REFUSE (unless I am Orchestrator)
41
- 3. Am I trying to write to PM's domain? → REFUSE (unless I am PM)
42
- 4. Am I writing within my phase's scope? → PROCEED
43
-
44
- ## If User Insists
45
-
46
- Still refuse. Say:
47
- "This is outside my scope as {role}. Use /orchestra {command} or switch role for this."
48
-
49
- **Never break role boundaries to "be helpful". The pipeline exists for a reason.**
50
-
51
- ### The Rule Is Simple
52
-
53
- Each role can ONLY write to files in its ownership scope. Period.
54
-
55
- - **PM** → only `.orchestra/milestones/` — anything else, refuse
56
- - **Orchestrator** → only system files — anything else, refuse
57
- - **Backend/Frontend/Architect/Adaptive** → only what phase `scope:` defines — anything else, refuse
58
- - **Reviewer** → writes nothing except review verdict — anything else, refuse
59
- - **Conductor** → only `context.md` and `knowledge.md` — anything else, refuse
60
-
61
- If ANY action would result in writing to a path outside your scope → refuse.
62
- Don't check what the user said. Check what file you'd be writing to.
63
-
64
- ## Exemptions
65
-
66
- - Discussion mode (no role) — no restrictions
67
- - Reading files — always allowed regardless of role
17
+ - Check what file you'd write to, not what the user said
18
+ - If user insists still refuse: "Outside my scope as {role}. Use /orchestra {command}."
19
+ - Discussion mode (no role) → no restrictions
20
+ - Reading → always allowed
@@ -1,24 +1,9 @@
1
1
  # Verification Gate
2
2
 
3
- Before EVERY commit, you MUST pass ALL verification checks. No exceptions.
3
+ Before EVERY commit, pass ALL verification checks from `.orchestra/config.yml` verification section.
4
4
 
5
- Read verification commands from `.orchestra/config.yml`:
5
+ **Process:** Run typecheck test → lint (in order, stop at first failure).
6
+ Fix issue → re-run ALL from start. Max retries: config.yml `thresholds.stuck_retry_limit` (default 3).
7
+ After max retries → set phase `failed`, report to user.
6
8
 
7
- ```yaml
8
- verification:
9
- typecheck: "npx tsc --noEmit" # or go vet, etc.
10
- test: "npm test" # or go test, pytest, etc.
11
- lint: "npm run lint" # or golangci-lint, etc.
12
- ```
13
-
14
- **Process:**
15
- 1. Run typecheck command → must exit 0
16
- 2. Run test command → must exit 0
17
- 3. Run lint command → must exit 0
18
- 4. Run in order. Stop at first failure.
19
- 5. Fix the issue, re-run ALL from step 1.
20
- 6. Max retries from config.yml `thresholds.stuck_retry_limit` (default 3).
21
- 7. After max retries → set phase `failed`, report to user.
22
-
23
- **NEVER commit if verification fails.** This is a hard gate.
24
- If a command doesn't exist in the project, skip it but log the skip.
9
+ **NEVER commit if verification fails.** If a command doesn't exist in the project, skip it but log the skip.