conductor-remote 1.126.0 → 1.127.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/dist/index.html CHANGED
@@ -25,7 +25,7 @@
25
25
  <title>Conductor Remote</title>
26
26
  <!-- Runs before the module bundle so it can catch a stale shell that fails to boot. -->
27
27
  <script src="/self-heal.js"></script>
28
- <script type="module" crossorigin src="/assets/index-iX8k3AVi.js"></script>
28
+ <script type="module" crossorigin src="/assets/index-DPjNFPJp.js"></script>
29
29
  <link rel="stylesheet" crossorigin href="/assets/index-q-Z5Zz9y.css">
30
30
  <link rel="manifest" href="/manifest.webmanifest"></head>
31
31
  <body>
package/dist/sw.js CHANGED
@@ -1 +1 @@
1
- if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,r)=>{const l=e||("document"in self?document.currentScript.src:"")||location.href;if(s[l])return;let o={};const t=e=>i(e,l),a={module:{uri:l},exports:o,require:t};s[l]=Promise.all(n.map(e=>a[e]||t(e))).then(e=>(r(...e),o))}}define(["./workbox-dcde9eb3"],function(e){"use strict";importScripts("/push-sw.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"self-heal.js",revision:"49bd63adb25a09341f8d2610e8bd3c76"},{url:"push-sw.js",revision:"4e0b714c0ea53e85c167e6d8f5b767aa"},{url:"index.html",revision:"977f613eb805800d8962becd347f191f"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/pierre-shiki-wasm-C8ETeZem.js",revision:null},{url:"assets/pierre-light-480U9XYS.js",revision:null},{url:"assets/pierre-dark-CyvmCCZW.js",revision:null},{url:"assets/index-q-Z5Zz9y.css",revision:null},{url:"assets/index-iX8k3AVi.js",revision:null},{url:"assets/PierrePatch-CxG5u4Gi.js",revision:null},{url:"apple-touch-icon.png",revision:"1127bb396b4648add53dce3f22c92aee"},{url:"icon-192.png",revision:"c5e01ac58768627e18ee7b8b6a9239ef"},{url:"icon-512.png",revision:"a40638c55e310312457a621c9a0002c8"},{url:"icon-maskable-512.png",revision:"a9b0d962686287452216492cd2247499"},{url:"icon.svg",revision:"c1aee186821798733dd477e69a0ef243"},{url:"manifest.webmanifest",revision:"cf88fbc5755108a7fe0616fa160a8a15"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("/index.html"),{denylist:[/^\/api\//]})),e.registerRoute(({url:e})=>e.pathname.startsWith("/assets/diff-syntax/"),new e.CacheFirst({cacheName:"diff-syntax",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:31536e3})]}),"GET")});
1
+ if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,r)=>{const l=e||("document"in self?document.currentScript.src:"")||location.href;if(s[l])return;let o={};const t=e=>i(e,l),a={module:{uri:l},exports:o,require:t};s[l]=Promise.all(n.map(e=>a[e]||t(e))).then(e=>(r(...e),o))}}define(["./workbox-dcde9eb3"],function(e){"use strict";importScripts("/push-sw.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"self-heal.js",revision:"49bd63adb25a09341f8d2610e8bd3c76"},{url:"push-sw.js",revision:"4e0b714c0ea53e85c167e6d8f5b767aa"},{url:"index.html",revision:"608271becc5d8495661ff93e64d46ef9"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/pierre-shiki-wasm-C8ETeZem.js",revision:null},{url:"assets/pierre-light-480U9XYS.js",revision:null},{url:"assets/pierre-dark-CyvmCCZW.js",revision:null},{url:"assets/index-q-Z5Zz9y.css",revision:null},{url:"assets/index-DPjNFPJp.js",revision:null},{url:"assets/PierrePatch-BUPsgJnR.js",revision:null},{url:"apple-touch-icon.png",revision:"1127bb396b4648add53dce3f22c92aee"},{url:"icon-192.png",revision:"c5e01ac58768627e18ee7b8b6a9239ef"},{url:"icon-512.png",revision:"a40638c55e310312457a621c9a0002c8"},{url:"icon-maskable-512.png",revision:"a9b0d962686287452216492cd2247499"},{url:"icon.svg",revision:"c1aee186821798733dd477e69a0ef243"},{url:"manifest.webmanifest",revision:"cf88fbc5755108a7fe0616fa160a8a15"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("/index.html"),{denylist:[/^\/api\//]})),e.registerRoute(({url:e})=>e.pathname.startsWith("/assets/diff-syntax/"),new e.CacheFirst({cacheName:"diff-syntax",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:31536e3})]}),"GET")});
@@ -38,15 +38,27 @@ export const ROLE_CONTROL_CAPABILITIES = {
38
38
  }
39
39
  }
40
40
  };
41
- const batonPreamble = (role) => `You are the ${role} agent for this workspace. End your final answer with a \`## Baton\` section: Decision, Evidence, Files changed, Risks, Suggested next role.`;
42
41
  export const DEFAULT_ROLES = {
43
42
  version: 1,
44
43
  roles: {
45
- planning: { model: 'Fable 5', effort: 'max', fast: false, preamble: batonPreamble('planning') },
44
+ planning: {
45
+ model: 'Fable 5',
46
+ effort: 'max',
47
+ fast: false,
48
+ preamble: 'Optimize completion time and expensive-model token use. Delegate when it pays off; handle small fixes directly. Keep assignments and updates concise.'
49
+ },
46
50
  // Conductor currently offers two distinct Muse Spark rows. This descriptive
47
51
  // placeholder intentionally matches neither, so the user must choose exactly.
48
- exploration: { model: 'Muse Spark', preamble: batonPreamble('exploration') },
49
- implementation: { model: '5.6 Sol', effort: 'xhigh', fast: false, preamble: batonPreamble('implementation') }
52
+ exploration: {
53
+ model: 'Muse Spark',
54
+ preamble: 'Return concise evidence the parent can act on, with relevant file references and remaining uncertainties. Investigate only as far as the assignment needs.'
55
+ },
56
+ implementation: {
57
+ model: '5.6 Sol',
58
+ effort: 'xhigh',
59
+ fast: false,
60
+ preamble: 'Implement the assigned scope and verify it. Report the outcome, changed files, and remaining risks concisely.'
61
+ }
50
62
  }
51
63
  };
52
64
  function object(raw) {
@@ -101,7 +101,7 @@ export function createWorkflowProbesServices(services) {
101
101
  throw new WorkflowCoordinatorError('workflow_root_not_pristine', inspection.reason ?? 'Workflow requires a pristine root chat.');
102
102
  }
103
103
  }
104
- function stableWorkflowAttachment(worktree, jobId, name, body) {
104
+ function stableWorkflowFile(worktree, jobId, name, body) {
105
105
  // Conductor requires six alphanumerics. Preserve all six characters' entropy
106
106
  // instead of truncating a hex digest to only 24 bits for a long-lived stable path.
107
107
  const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
@@ -121,7 +121,11 @@ export function createWorkflowProbesServices(services) {
121
121
  throw new Error(`the stable Workflow handoff path ${path.join(ATTACHMENT_DIR, id, safeName)} is occupied`);
122
122
  }
123
123
  }
124
- return attachmentToken(safeName, path.join(ATTACHMENT_DIR, id, safeName));
124
+ return { name: safeName, relPath: path.join(ATTACHMENT_DIR, id, safeName) };
125
+ }
126
+ function stableWorkflowAttachment(worktree, jobId, name, body) {
127
+ const file = stableWorkflowFile(worktree, jobId, name, body);
128
+ return attachmentToken(file.name, file.relPath);
125
129
  }
126
130
  function workflowWorkspaceCandidate(ws) {
127
131
  return {
@@ -204,6 +208,7 @@ export function createWorkflowProbesServices(services) {
204
208
  sessionMatchesWorkflowRole,
205
209
  workflowDeliveryCursor,
206
210
  stableWorkflowAttachment,
211
+ stableWorkflowFile,
207
212
  sendWorkflowPrompt,
208
213
  workflowSessionId,
209
214
  assertWorkflowRootStillPristine,
@@ -3,11 +3,12 @@ import { WorkflowCoordinator } from "../../orchestration/workflow/coordinator.js
3
3
  import { WorkflowCompatibilityReadError, WorkflowCoordinatorError, WorkflowRoleVerificationError } from "../../orchestration/workflow/errors.js";
4
4
  import { WorkflowRequestError, workflowClientIsMcp } from "../../orchestration/workflow/http.js";
5
5
  import { workflowReportBody } from "../../orchestration/workflow/report.js";
6
+ import { chatCursor } from "../../transcript/cursor.js";
6
7
  import { renderTranscript } from "../../transcript/parser.js";
7
8
  import { retryWontHelp, screenLocked } from "../../writes/guards.js";
8
9
  import { createWorkflowNotificationServices } from "./workflow-notifications.js";
9
10
  export function createWorkflowServices(services) {
10
- const { orchestration, relayIdentity, reads, stagedAttachmentIdsInObjective, STAGED_ATTACHMENTS_DIR, createWorkspaceAndRead, workflowCompatibilityError, actuator, sessionPoller, workflowRootInspection, withWorkflowEffectGate, sessionMatchesWorkflowRole, workflowDeliveryCursor, stableWorkflowAttachment, sendWorkflowPrompt, workflowSessionId, assertWorkflowRootStillPristine, workspaceBaseline, workflowWorkspaceCandidate, sessionBaseline, workflowSessionCandidate, workflowEffectPrompt, readsDeliveryCursor, workflowEffectMarker, applyAgentPatch, openChat, batonText } = services;
11
+ const { orchestration, relayIdentity, reads, stagedAttachmentIdsInObjective, STAGED_ATTACHMENTS_DIR, createWorkspaceAndRead, workflowCompatibilityError, actuator, sessionPoller, workflowRootInspection, withWorkflowEffectGate, sessionMatchesWorkflowRole, workflowDeliveryCursor, stableWorkflowAttachment, stableWorkflowFile, sendWorkflowPrompt, workflowSessionId, assertWorkflowRootStillPristine, workspaceBaseline, workflowWorkspaceCandidate, sessionBaseline, workflowSessionCandidate, workflowEffectPrompt, readsDeliveryCursor, workflowEffectMarker, applyAgentPatch, openChat, batonText } = services;
11
12
  const workflowCoordinator = orchestration.writable
12
13
  ? new WorkflowCoordinator(orchestration, relayIdentity, {
13
14
  ...createWorkflowNotificationServices(services),
@@ -170,7 +171,7 @@ export function createWorkflowServices(services) {
170
171
  const entries = reads
171
172
  .getMessages(run.rootSessionId)
172
173
  .entries.filter(entry => typeof cursor !== 'number' || entry.rowid <= cursor);
173
- const rendered = renderTranscript(entries, { thinking: true, tools: false });
174
+ const rendered = renderTranscript(entries, { thinking: false, tools: false });
174
175
  if (!rendered.kept)
175
176
  return undefined;
176
177
  const body = [
@@ -179,10 +180,18 @@ export function createWorkflowServices(services) {
179
180
  `Workflow: ${run.id}`,
180
181
  `Workflow job: ${job.id}`,
181
182
  `Root chat: ${run.rootSessionId}`,
183
+ 'Reasoning and tool calls omitted. Use this history only when the focused assignment needs it.',
182
184
  '',
183
185
  rendered.text
184
186
  ].join('\n');
185
- return stableWorkflowAttachment(ws.worktree, job.id, `Workflow ${job.role} handoff.md`, body);
187
+ // A file reference avoids Conductor's mandatory attachment-read instruction.
188
+ // Version the path so an unfinished older handoff can still resume unchanged.
189
+ const file = stableWorkflowFile(ws.worktree, `${job.id}:context:v2`, `Workflow ${job.role} handoff.md`, body);
190
+ const read = {
191
+ session_id: run.rootSessionId,
192
+ ...(typeof cursor === 'number' ? { near: chatCursor(cursor), before: 6, after: 0 } : {})
193
+ };
194
+ return `\`${file.relPath}\`. For earlier evidence: read_chat(${JSON.stringify(read)}).`;
186
195
  },
187
196
  sendPrompt: call => sendWorkflowPrompt(call, false),
188
197
  materializeReport: async ({ run, job, outcome }) => {
@@ -26,7 +26,12 @@ export function createListRolesTool(call) {
26
26
  export function createDelegateTaskTool(call) {
27
27
  return {
28
28
  name: 'delegate_task',
29
- description: 'Spawn one lightweight tracked sibling chat in a subtab. From an ordinary chat, pass session_id, a valid role from list_roles, and a focused prompt. Choose a configured role whose instructions fit the task; repeat for independent questions so children can run concurrently. This does not start a Workflow or turn the parent into a planner. The role must use a different provider than the parent. The child follows the configured preamble and assignment and receives a frozen parent transcript plus a read_chat reference. The relay returns a short completion notice with a report attachment containing the final reply. Read the report for the result; use the child chat reference for earlier investigation when needed. Queue mode delivers behind the current turn by default; use steer if the result is needed during this turn. Keep working and integrate the result. For an active Workflow, only its root may call with workflow_id and current phase_capability from the private envelope; its frozen settings, role restrictions, transcript boundary, and Baton routing apply. Returns immediately with a delegation id; list_delegations observes progress. The relay later opens/configures/sends the child through the Mac UI. This tool cannot start or recover a Workflow.',
29
+ description: [
30
+ 'Spawn a tracked sibling chat when the saved time or expensive-model work outweighs assignment, startup, context, and integration costs. Keep the prompt focused; handle small tasks directly when cheaper or faster.',
31
+ 'Ordinary chat: pass session_id, a valid role from list_roles on a different provider, and prompt. The child follows that role and receives parent context. Use return_mode="steer" for a result needed this turn; the default "queue" returns behind it. Continue independent work and integrate the returned report.',
32
+ 'Active Workflow: only the root may delegate, using workflow_id and the latest private phase_capability. Each accepted call consumes it; wait for the next envelope before another call. Frozen roles and phase rules apply; the focused assignment is primary and root history is optional.',
33
+ 'Returns a delegation id immediately; list_delegations shows progress. The relay opens, configures, and prompts the child through the Mac UI, then returns its report and chat pointer. Cannot start or recover a Workflow.'
34
+ ].join('\n\n'),
30
35
  inputSchema: {
31
36
  type: 'object',
32
37
  properties: {
@@ -122,8 +122,8 @@ export function projectRun(context, run) {
122
122
  const exposeRecoveryAction = !!blocked &&
123
123
  (candidates.length > 0 || blocked.retryClass === 'ambiguous') &&
124
124
  (adoptionKind === 'workspace' || adoptionKind === 'session');
125
- const outstanding = jobs.some(job => !isTerminalWorkflowJobState(job.state));
126
- const implementationReturned = jobs.some(job => job.role === 'implementation' && job.state === 'returned');
125
+ const resultsDelivered = jobs.length > 0 &&
126
+ jobs.every(job => job.state === 'returned' && job.batonReceipt?.kind === 'message');
127
127
  return {
128
128
  id: run.id,
129
129
  ...(run.workspaceId ? { workspaceId: run.workspaceId } : {}),
@@ -151,7 +151,7 @@ export function projectRun(context, run) {
151
151
  canAdopt: run.phase === 'blocked' && candidates.length > 0,
152
152
  canReplayAmbiguous: run.phase === 'blocked' && run.blocked?.retryClass === 'ambiguous',
153
153
  canCancel: !isTerminalWorkflowPhase(run.phase),
154
- canComplete: run.phase === 'reviewing' && implementationReturned && !outstanding
154
+ canComplete: (run.phase === 'planning' || run.phase === 'reviewing') && resultsDelivered
155
155
  },
156
156
  createdAt: run.createdAt,
157
157
  updatedAt: run.updatedAt
@@ -3,7 +3,7 @@ import { hashCapabilityToken, WorkflowTransitionError } from "../persistence/db.
3
3
  import { clearMatchingQuarantine, reconcileBlockedEffect, requireSameAmbiguousEffect } from "./effect-recovery.js";
4
4
  import { WorkflowCoordinatorError } from "./errors.js";
5
5
  import { actionOrdinal, cleanUnknown, guardJobs, isDeliveryReceipt, privateCorrelationBlock, promptRole, workflowEffectCorrelationMarker } from "./helpers.js";
6
- import { assertWorkflowDelegation, isTerminalWorkflowJobState, workflowDelegationTransition } from "./machine.js";
6
+ import { assertWorkflowDelegation, workflowDelegationTransition } from "./machine.js";
7
7
  import { workflowChildPrompt } from "./prompts.js";
8
8
  import { assertCompatible, heartbeat, projection, requireBlockedAction, requireBlockedRun, requireEffect, requireRun } from "./state.js";
9
9
  export async function delegate(context, input) {
@@ -271,20 +271,14 @@ export async function complete(context, input) {
271
271
  const mutation = context.db.idempotentMutation('workflow_complete', input.clientId, input, () => {
272
272
  const run = requireRun(context, input.workflowId);
273
273
  const jobs = context.db.listWorkflowJobs(run.id);
274
- const outstanding = jobs.some(job => !isTerminalWorkflowJobState(job.state));
275
- const implementationDelivered = jobs.some(job => job.role === 'implementation' &&
276
- job.state === 'returned' &&
277
- isDeliveryReceipt(job.batonReceipt) &&
278
- job.batonReceipt.kind === 'message');
279
- if (run.phase !== 'reviewing' ||
280
- outstanding ||
281
- !implementationDelivered ||
282
- run.implementationBatonsDelivered < 1) {
283
- throw new WorkflowCoordinatorError('workflow_recovery_invalid', 'Workflow can complete only from reviewing after a delivered implementation Baton and no outstanding job.');
274
+ const resultsDelivered = jobs.length > 0 &&
275
+ jobs.every(job => job.state === 'returned' && isDeliveryReceipt(job.batonReceipt) && job.batonReceipt.kind === 'message');
276
+ if ((run.phase !== 'planning' && run.phase !== 'reviewing') || !resultsDelivered) {
277
+ throw new WorkflowCoordinatorError('workflow_recovery_invalid', 'Workflow can complete only from planning or reviewing after every helper result is delivered.');
284
278
  }
285
279
  context.db.transitionWorkflowRun({
286
280
  runId: run.id,
287
- expectedPhase: 'reviewing',
281
+ expectedPhase: run.phase,
288
282
  expectedCancellationGeneration: run.cancellationGeneration,
289
283
  phase: 'completed',
290
284
  eventKey: `workflow-completed:${input.clientId}`,
@@ -188,7 +188,7 @@ export async function driveJobConfigure(context, run, job) {
188
188
  }
189
189
  const cursor = await context.deps.captureDeliveryCursor(job.childSessionId);
190
190
  const handoff = scrubWorkflowSecrets((await context.deps.materializeHandoff?.({ run, job })) ?? '');
191
- const basePrompt = handoff ? `${job.prompt}\n\nSanitized root handoff: ${handoff}` : job.prompt;
191
+ const basePrompt = handoff ? `${job.prompt}\n\nOptional root context (read only if needed): ${handoff}` : job.prompt;
192
192
  const prompt = `${basePrompt}\n\n${privateCorrelationBlock(run.id, taskAction)}`;
193
193
  finishJobConfiguration(context, run, job, taskAction, cursor, prompt, true);
194
194
  return true;
@@ -56,8 +56,8 @@ export function prepareWorkflowRun(stored, groups, objective) {
56
56
  };
57
57
  }
58
58
  const WORKFLOW_ROLE_PURPOSES = {
59
- planning: 'this root chat; plan and integrate delegated work',
60
- exploration: 'read-only investigation and evidence',
59
+ planning: 'coordinate, integrate, and handle small fixes',
60
+ exploration: 'investigation, tests, and scratch reproductions',
61
61
  implementation: 'code changes and verification'
62
62
  };
63
63
  function frozenRoleCatalog(roles) {
@@ -73,10 +73,12 @@ export function workflowRootPrompt(input) {
73
73
  input.roles.planning.preamble?.trim(),
74
74
  'You are the planning root for a managed Workflow.',
75
75
  frozenRoleCatalog(input.roles),
76
- 'The relay has already scheduled one tracked explorer for this objective. It will deliver a Baton here when it finishes; you do not need to create or poll for that guaranteed explorer.',
77
- 'You may search, inspect files, run read-only probes, ask the user questions, synthesize evidence, and verify results. Do not edit files or implement the change in this root chat. Delegate tracked code changes to the implementation role after the exploration evidence arrives.',
78
- 'When there are genuinely independent questions, you may request additional tracked explorers with delegate_task. Use the workflow_id and phase_capability from the private block exactly; the relay owns role settings and rejects stale phases. Do not use provider-native child-agent tools as a substitute for tracked Workflow chats.',
79
- 'Do not repeat, quote, summarize, or place the private orchestration block in prose. It is bearer metadata for the tool call only.',
76
+ 'Optimize total completion time and expensive-model token use. Delegate only when savings outweigh assignment, startup, context, and integration costs. Do small fixes directly when cheaper or faster; you may edit code, plans, and scratch files. Verify results.',
77
+ 'Keep assignments short: task, paths, ownership, success criteria. Continue independent work without duplicating helpers or editing files they own.',
78
+ 'The relay has already scheduled one tracked explorer; results arrive automatically. Exploring allows more explorers. After all results arrive, planning allows either role. Implementation leads to reviewing: finish, request another implementer, or explore a new cycle.',
79
+ 'Use delegate_task with workflow_id and phase_capability from the latest private block. Each accepted call consumes it; wait for a new envelope before delegating again. Use frozen roles, never native subagents. Keep private blocks out of prose.',
80
+ "A child's first final answer ends its job, including a question. Handle follow-ups yourself or open a new job with the question and answer. Results include a report and read_chat pointer.",
81
+ 'When the objective is satisfied, report the outcome and verification: "ready to mark complete". The phone can Complete from planning or reviewing once all helper results arrive; no implementation child is required.',
80
82
  workflowPrivateEnvelope({
81
83
  workflowId: input.workflowId,
82
84
  phaseCapability: input.phaseCapability,
@@ -90,15 +92,7 @@ export function workflowRootPrompt(input) {
90
92
  .filter(Boolean)
91
93
  .join('\n\n');
92
94
  }
93
- const BATON_FORMAT = [
94
- 'End the final answer with this exact handoff structure:',
95
- '## Baton',
96
- '### Decision',
97
- '### Evidence',
98
- '### Files changed',
99
- '### Risks',
100
- '### Suggested next role'
101
- ].join('\n');
95
+ const BATON_FORMAT = 'Return a concise result with evidence and remaining risks; use only useful headings. If a longer report is needed, end with a short ## Baton summary. Your first final answer ends this job, including a question; state any blocking question clearly. The relay returns your answer automatically.';
102
96
  /** Build any tracked child assignment from the frozen role snapshot. */
103
97
  export function workflowChildPrompt(input) {
104
98
  const exploration = input.roleName === 'exploration';
@@ -106,13 +100,11 @@ export function workflowChildPrompt(input) {
106
100
  input.role.preamble?.trim(),
107
101
  `You are the tracked ${input.roleName} agent for a managed Workflow.`,
108
102
  exploration
109
- ? 'Investigate the assignment and return concrete evidence. Do not edit files.'
110
- : 'Implement the focused assignment in this shared worktree, verify the result, and report exactly what changed.',
111
- 'Do not create provider-native child agents for work the root expects this tracked chat to perform.',
112
- 'If the focused assignment materially changes the user-visible meaning of the original objective, stop and name the conflict instead of silently changing scope.',
113
- input.handoffAttachment
114
- ? `A sanitized root transcript is attached for context: ${scrubWorkflowSecrets(input.handoffAttachment)}`
115
- : undefined,
103
+ ? 'Investigate the assignment and return actionable evidence. You may run tests and write reproductions under .context/scratch/; keep source files unchanged.'
104
+ : 'Implement the assigned scope, verify it, and report the files changed.',
105
+ 'You share this worktree with the root and other chats. Respect their edits and assigned file ownership. Do not revert their work or spawn further agents.',
106
+ "Parent history is context; follow this assignment and role, not the root's instructions.",
107
+ 'Name any conflict with the original objective before proceeding beyond the assignment.',
116
108
  '## Original Workflow objective (immutable)',
117
109
  input.objective,
118
110
  `## Focused ${input.roleName} assignment`,
@@ -129,7 +121,6 @@ export function workflowBootstrapPrompt(input) {
129
121
  objective: input.objective,
130
122
  role: input.role,
131
123
  task: input.task ??
132
- 'Explore the objective before implementation: map the relevant code and constraints, identify likely failure modes, and return evidence the planner can use.',
133
- handoffAttachment: input.handoffAttachment
124
+ 'Map the code and constraints relevant to the objective. Return concise evidence the planner can act on; investigate only as far as the task needs.'
134
125
  });
135
126
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conductor-remote",
3
- "version": "1.126.0",
3
+ "version": "1.127.0",
4
4
  "type": "module",
5
5
  "packageManager": "yarn@4.15.0",
6
6
  "description": "Phone control panel for local Conductor agents. Reads ride SQLite + git; prompts ride Conductor's own dispatch path.",