Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CONTEXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,7 @@ The standing constraint — expressed as a `## Scope-boundary guard` section in
_Avoid_: scope check, brief filter (the guard is a positive constraint on what the brief may contain, enforced at two points — inside the investigator definition and at the orchestrator boundary)

**Orchestrator judgment spine**:
The irreducible body of the orchestrate `SKILL.md` that remains after **MCP-first decomposition** — the roles & safety boundary, the two-axis complexity-tier assessment, wave-concurrency policy, failure-cause narration, and checkpoint/resume semantics. It is the residue that cannot be extracted to an `orchestrate-mcp` tool or a subagent because it is non-mechanizable orchestration judgment. After the #275 procedural-prose relocation the spine lands near ~425 lines — refined down from the ~750 the decomposition first projected — which is now *within* the project's 500-line `SKILL.md` body cap; the documented over-cap exception for this spine remains on record (ADR-0013) so it is never flagged as bloat should its judgment grow back over the cap, and is orchestrate-specific (not generalized to other skills). Deterministic procedure is extracted to MCP tools (no execution-permission prompt); judgment-bearing procedure is relocated to on-demand `references/` (loaded only when its phase runs, outside the smart zone); only judgment stays in the always-loaded spine. See ADR-0013.
The irreducible body of the orchestrate `SKILL.md` that remains after **MCP-first decomposition** — the roles & safety boundary, the two-axis complexity-tier assessment, wave-concurrency policy, the slice-executor briefing contract, failure-cause narration, the read boundary on slice-internal artifacts, and checkpoint/resume semantics. It is the residue that cannot be extracted to an `orchestrate-mcp` tool or a subagent because it is non-mechanizable orchestration judgment. The #275 procedural-prose relocation refined it to ~425 lines — down from the ~750 the decomposition first projected — but the ADR-0017 delegation then moved the intra-slice procedure out to the slice executor while adding the briefing contract, the structured envelope-recovery path, and the read boundary, leaving the spine at **542 lines of body**. It therefore *exercises* the documented over-cap exception recorded in ADR-0013, explicitly and at that measured figure, rather than merely holding it in reserve; the exception is orchestrate-specific (not generalized to other skills). Deterministic procedure is extracted to MCP tools (no execution-permission prompt); judgment-bearing procedure is relocated to on-demand `references/` (loaded only when its phase runs, outside the smart zone); only judgment stays in the always-loaded spine. See ADR-0013.
_Avoid_: orchestrator core, skill body (the spine is specifically what remains after extraction, not the whole file or its runtime)

**Routing variant**:
Expand Down
6 changes: 3 additions & 3 deletions plugins/orchestrate/orchestrate-mcp/dist/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21980,7 +21980,7 @@ var routingConfigSchema = external_exports.object({
"Run-wide policy: how to process the independent slices within one wave. 'parallel' (default) spawns all processable slices at once and integrates them sequentially. 'sequential' processes slices one at a time in issue-id ascending order, refreshing the umbrella base between each so slice N branches from base+slice1..N-1 \u2014 guaranteed conflict-free, at the cost of serializing the wave. Optional; the three tier blocks remain required."
),
continuationBudget: external_exports.number().int().min(0).default(2).describe(
"How many times the orchestrator may re-spawn the implementer in the same worktree after an 'incomplete' envelope (re-spawns BEYOND the initial run). 0 disables continuation (incomplete FAILs immediately, the legacy behavior). Defaults to 2."
"How many times the slice executor may re-spawn the implementer in the same worktree after an 'incomplete' envelope (re-spawns BEYOND the initial run). 0 disables continuation (incomplete FAILs immediately, the legacy behavior). Defaults to 2."
)
});
var routingConfigSchemaV1 = routingConfigSchema;
Expand Down Expand Up @@ -22048,7 +22048,7 @@ var runConfigSchema = external_exports.object({
"Run-wide policy: how to process the independent slices within one wave. 'parallel' (default) or 'sequential'. Lifted from the v1 top-level key."
),
continuationBudget: external_exports.number().int().min(0).optional().default(2).describe(
"How many times the orchestrator may re-spawn the implementer in the same worktree after an 'incomplete' envelope. 0 disables continuation. Defaults to 2. Lifted from the v1 top-level key."
"How many times the slice executor may re-spawn the implementer in the same worktree after an 'incomplete' envelope. 0 disables continuation. Defaults to 2. Lifted from the v1 top-level key."
)
});
var routingConfigSchemaV2 = external_exports.object({
Expand Down Expand Up @@ -23573,7 +23573,7 @@ var sliceExecutorEnvelopeSchema = external_exports.object({
"Prose description of what happened, in the executor's own words. Complements `failureClass` (the closed-set machine label) with the specific detail a human or the next executor needs. Absent for a 'completed' envelope."
),
reportPath: external_exports.string().describe(
"Path, relative to the worktree root, of the slice's report \u2014 the human-readable artifact the executor wrote describing its own run."
"Path, relative to the run directory (`.orchestrate/runs/<runId>/`), of the slice's report \u2014 the human-readable artifact the executor wrote describing its own run. It is written beside the executor's progress record, NEVER into the worktree, where the Changeset scope check would see it as an undeclared change."
),
nextTaskBriefing: external_exports.string().describe(
"Advice carried forward to whoever picks up the next slice. This is advice only, never a selection of WHICH slice runs next \u2014 wave ordering and loop termination stay computed by `plan_waves` and wave exhaustion, not declared here (see the module-level note above)."
Expand Down
4 changes: 2 additions & 2 deletions plugins/orchestrate/orchestrate-mcp/src/tools/routing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ export const routingConfigSchema = z.object({
.min(0)
.default(2)
.describe(
"How many times the orchestrator may re-spawn the implementer in the " +
"How many times the slice executor may re-spawn the implementer in the " +
"same worktree after an 'incomplete' envelope (re-spawns BEYOND the " +
"initial run). 0 disables continuation (incomplete FAILs immediately, " +
"the legacy behavior). Defaults to 2."
Expand Down Expand Up @@ -384,7 +384,7 @@ export const runConfigSchema = z.object({
.optional()
.default(2)
.describe(
"How many times the orchestrator may re-spawn the implementer in the " +
"How many times the slice executor may re-spawn the implementer in the " +
"same worktree after an 'incomplete' envelope. 0 disables continuation. " +
"Defaults to 2. Lifted from the v1 top-level key."
),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -344,8 +344,11 @@ export const sliceExecutorEnvelopeSchema = z.object({
reportPath: z
.string()
.describe(
"Path, relative to the worktree root, of the slice's report — the " +
"human-readable artifact the executor wrote describing its own run."
"Path, relative to the run directory (`.orchestrate/runs/<runId>/`), of " +
"the slice's report — the human-readable artifact the executor wrote " +
"describing its own run. It is written beside the executor's progress " +
"record, NEVER into the worktree, where the Changeset scope check " +
"would see it as an undeclared change."
),
nextTaskBriefing: z
.string()
Expand Down
Loading
Loading