@onepointfour-packs/flaredeck-agent 0.2.15 → 0.2.21

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/runs.js CHANGED
@@ -5,22 +5,42 @@ import { sdkServer } from './localmcp.js';
5
5
  import { z } from 'zod';
6
6
  import { flaredeckDecider } from './approval.js';
7
7
  /**
8
- * Production runs: the agent asks, a person approves, the HARNESS runs it.
8
+ * Being stuck, as one tool.
9
9
  *
10
- * The agent never holds a credential and never executes anything itself. It hands over a script,
11
- * a name and what it believes the script does; that goes to the card as an approval request —
12
- * the same one the permission broker uses, so it renders with Approve/Deny and raises a push —
13
- * and only a person's verdict makes the harness run it. The script is bound to the approval by
14
- * its hash, so what was approved is what runs.
10
+ * An agent that cannot get further has exactly one thing to reach for, and what it puts in the
11
+ * call decides what a person sees. Without a script it is a question: the card is flagged, the
12
+ * board's named answerer is told, and the session ends until somebody clears it. With a script
13
+ * it is a request: the script goes on the card as an approval, a person reads it and taps, and
14
+ * if they approve THE HARNESS runs it and hands the output back — the agent carries on in the
15
+ * same turn, holding no credential and having executed nothing itself.
15
16
  *
16
- * The description is the agent's own account of its own script, so it is never enough on its own.
17
- * Where the script is an UPDATE or DELETE with a WHERE clause, the harness derives a COUNT from
18
- * that clause and runs it first: "would touch N rows" sits next to the script when the approver
19
- * reads it, and a script that says one row and previews thousands is caught before anyone taps.
20
- * That count is written by the harness from the agent's clause, not by the agent, and it is the
21
- * only thing that runs before approval.
17
+ * This was two tools, and the split was the problem rather than the solution. `set-needs-human`
18
+ * was the only escalation most agents ever saw, because the other one was mounted only on a
19
+ * machine with a production target configured — and none were. So an agent that needed one
20
+ * command run asked a person to go and type it on two machines, and waited. One tool with an
21
+ * optional script cannot have that failure: the script path is always there, and a shell on this
22
+ * machine is a target without anybody configuring one.
23
+ *
24
+ * What a person approves is what runs. The script is bound to the approval by its hash, and
25
+ * where it is an UPDATE or DELETE with a WHERE clause the harness derives a COUNT from that same
26
+ * clause and runs it first, so "would touch N rows" sits beside the script while they decide.
27
+ * That count is the harness's, from the agent's clause — the agent's own description of its own
28
+ * script is never enough on its own.
29
+ */
30
+ export const RUN_TOOL_NAMES = ['mcp__human__set-needs-human'];
31
+ /** The wire name on the approval request: what a lead reviews and what a restart resumes. */
32
+ export const SCRIPT_REQUEST = 'run_script';
33
+ /**
34
+ * The target every machine has without anybody configuring one. No cwd, so it runs in the
35
+ * checkout of the card being worked — and a script may still leave it, because a person read
36
+ * the script before it ran.
22
37
  */
23
- export const RUN_TOOL_NAMES = ['mcp__runs__request_production_run'];
38
+ export const SHELL = {
39
+ command: ['bash', '-lc', '{script}'],
40
+ about: 'a shell on this machine, starting in your checkout',
41
+ };
42
+ /** Configured targets, plus the shell. A configured `shell` wins — the machine's owner meant it. */
43
+ export const allTargets = (configured = {}) => ({ shell: SHELL, ...configured });
24
44
  /** Long enough for a person on a phone; a run that nobody answers is not run. */
25
45
  const RUN_APPROVAL_MS = 60 * 60 * 1000;
26
46
  const OUTPUT_CAP = 6000;
@@ -100,7 +120,7 @@ export async function resumeApprovedRuns(targets, deck, cwd, log) {
100
120
  return 0;
101
121
  }
102
122
  for (const a of owed) {
103
- if (a.tool_name !== 'request_production_run')
123
+ if (a.tool_name !== SCRIPT_REQUEST)
104
124
  continue;
105
125
  const desc = a.description || '';
106
126
  const name = desc.split('"')[1] ?? a.request_id;
@@ -124,54 +144,70 @@ export async function resumeApprovedRuns(targets, deck, cwd, log) {
124
144
  }
125
145
  return n;
126
146
  }
127
- export function runTools(targets, current, deck, log,
128
- /** This agent's lead, when it has one: the request goes there first, and a person is asked only if the lead endorses it. */
147
+ export function runTools(configured, current, deck, log, human,
148
+ /** This agent's lead, when it has one: a script goes there first, and a person is asked only if the lead endorses it. */
129
149
  lead = () => null,
130
150
  /** The pane, told when a request is posted and when it is answered. */
131
151
  onAsk = () => { }) {
152
+ const targets = allTargets(configured);
132
153
  const names = Object.keys(targets);
133
154
  const list = names.map((n) => ` · ${n}${targets[n].about ? ` — ${targets[n].about}` : ''}`).join('\n');
134
155
  const server = sdkServer({
135
- name: 'runs',
156
+ name: 'human',
136
157
  version: '1.0.0',
137
158
  tools: [
138
- tool('request_production_run', 'ONLY for a script that must run against PRODUCTION — a live database, a deployed service. ' +
139
- 'Not for reading or changing files in your own checkout: those are the file tools and the ' +
140
- 'shell, they need no approval, and sending them here wastes an hour of a person\'s ' +
141
- 'attention and yours. If the shell is refusing you, the fix is on the card, not here.\n' +
142
- 'Ask a person to approve a script against a production system, and if they do, the harness ' +
143
- 'runs it and returns the output. YOU do not run anything and cannot: this call blocks until ' +
144
- 'it is answered on the card (up to an hour) or refused. If you report to a lead, the lead ' +
145
- 'reviews the script first and only an endorsed request reaches a person. Use it for the one script that ' +
146
- 'needs running, described honestly — the approver reads the script itself, and for an UPDATE ' +
147
- 'or DELETE the harness shows them how many rows it would touch before they decide. A denial ' +
148
- 'or a timeout is final for that script: do not resubmit it unchanged.\n\nTargets on this machine:\n' + list, {
149
- target: z.string().describe(`Which system. One of: ${names.join(', ')}`),
150
- name: z.string().describe('A short name for this script, e.g. "enrol-sofia-fsr-course".'),
151
- purpose: z.string().describe('What it does and why, in one or two plain sentences, for the person approving it.'),
152
- script: z.string().describe('The exact script to run. What is approved is what runs, byte for byte.'),
153
- expected_effect: z.string().describe('What you expect it to change or return, e.g. "1 row inserted" or "returns ~5 rows".'),
154
- }, async ({ target, name, purpose, script, expected_effect }) => {
155
- const t = targets[target];
156
- if (!t)
157
- return say(`No target called "${target}" on this machine. Targets: ${names.join(', ') || 'none'}.`, true);
159
+ tool('set-needs-human', 'Stop and involve a person. This is the ONLY way to do that, and what you put in it ' +
160
+ 'decides what they get.\n\n' +
161
+ 'Without `script` it is a question. The card is flagged, whoever the board names for this ' +
162
+ 'kind of thing is told, and your turn ends — you are not waiting, and you do not carry on ' +
163
+ 'without the answer. Use it for what only a person can supply: a decision, a credential, ' +
164
+ 'access that does not exist.\n\n' +
165
+ 'With `script` it is a request to RUN something. A person reads the script itself and ' +
166
+ 'approves or denies it; if they approve, the HARNESS runs it and gives you the output, and ' +
167
+ 'you carry on in this same turn. Use it when the thing you need is a command, in a place ' +
168
+ 'you cannot reach — a live database, a deployed service, a checkout that is not yours. ' +
169
+ 'You never hold the credential and you never run it. If you report to a lead, the lead ' +
170
+ 'reads the script first and only an endorsed request reaches a person. A denial is final ' +
171
+ 'for that script: do not send it again unchanged.\n\n' +
172
+ 'What does NOT belong here: anything inside your own checkout. Installing dependencies, ' +
173
+ 'building, running the tests, starting the app — you have the shell, do it yourself. ' +
174
+ 'Asking a person to type a command you could have typed costs them an hour and you the ' +
175
+ 'card.\n\nPlaces a script can run:\n' + list, {
176
+ reason: z.string().describe('What you need and why, in plain sentences, for the person reading it.'),
177
+ kind: z
178
+ .enum(['technical', 'product', 'access', 'information', 'business'])
179
+ .describe('What sort of thing this is, so it reaches the right person: technical, product, access, information, or business.'),
180
+ script: z.string().optional().describe('The exact script, when what you need is something RUN. What is approved is what runs, byte for byte. Leave it out if you are asking a question.'),
181
+ where: z.string().optional().describe(`Which place the script runs in. One of: ${names.join(', ')}. Defaults to shell.`),
182
+ expected_effect: z.string().optional().describe('With a script: what you expect it to change or return, e.g. "1 row inserted" or "returns ~5 rows".'),
183
+ }, async ({ reason, kind, script, where, expected_effect }) => {
158
184
  const cur = current();
159
185
  if (!cur)
160
- return say('There is no card being worked, so there is nowhere to ask for approval.', true);
186
+ return say('There is no card being worked, so there is nobody to ask about it.', true);
161
187
  if (!deck)
162
- return say('This harness has no FlareDeck credentials of its own, so it cannot post an approval request.', true);
163
- const body = script.trim();
164
- if (!body)
165
- return say('The script is empty.', true);
188
+ return say('This harness has no FlareDeck credentials of its own, so it cannot reach a person.', true);
189
+ const body = (script ?? '').trim();
190
+ // A question. The card is flagged and the turn is over — nothing here waits.
191
+ if (!body) {
192
+ const told = await human.flag(reason, kind);
193
+ return say(`Flagged for a person.${told ? ` ${told}` : ''}\n\nEnd your turn now. You are not waiting for ` +
194
+ `this — the card comes back to you when somebody clears it, and whatever you have done so ` +
195
+ `far should be committed and said on the card before you stop.`);
196
+ }
197
+ const name = where?.trim() || 'shell';
198
+ const t = targets[name];
199
+ if (!t)
200
+ return say(`There is no place called "${name}" to run a script. Places: ${names.join(', ')}.`, true);
166
201
  if (body.length > 18_000)
167
202
  return say(`The script is ${body.length} characters; the approval record holds 18,000. Split it into smaller runs, each reviewed on its own.`, true);
168
203
  const hash = createHash('sha256').update(body).digest('hex').slice(0, 12);
204
+ const label = reason.trim().split('\n')[0].slice(0, 60);
169
205
  // The harness's own check, before anyone is asked. Read-only by construction.
170
206
  let previewNote = '';
171
207
  let previewLine = '';
172
208
  const preview = previewFor(body);
173
209
  if (preview) {
174
- log(`preview for ${name}: ${preview}`);
210
+ log(`preview for ${label}: ${preview}`);
175
211
  const p = await exec(t, preview, cur.cwd);
176
212
  previewLine = p.code === 0
177
213
  ? `would touch: ${p.out.split('\n').slice(-1)[0]?.trim() || '?'}`
@@ -180,6 +216,9 @@ onAsk = () => { }) {
180
216
  ? `-- harness preview (${preview}):\n-- ${p.out.split('\n').slice(-3).join(' | ')}\n\n`
181
217
  : `-- harness preview FAILED (exit ${p.code}): ${p.out.split('\n').slice(0, 2).join(' ')}\n\n`;
182
218
  }
219
+ // Flagged as well as asked. The approval raises its own push, but the flag is what puts
220
+ // the card in a person's "Needs you" list — which is where they actually look.
221
+ const told = await human.flag(reason, kind);
183
222
  // Same request shape and same wait loop as every other approval: renders with
184
223
  // Approve/Deny, raises the push, and accepts a typed `approve <id>`.
185
224
  const leadId = lead();
@@ -190,24 +229,26 @@ onAsk = () => { }) {
190
229
  }, (p) => {
191
230
  posted = p;
192
231
  onAsk({
193
- kind: 'asking', requestId: p.request_id, commentId: p.comment_id, name, target,
194
- purpose: purpose.trim(), ...(previewLine ? { preview: previewLine } : {}), script: body, withLead: !!leadId,
232
+ kind: 'asking', requestId: p.request_id, commentId: p.comment_id, name: label, target: name,
233
+ purpose: reason.trim(), ...(previewLine ? { preview: previewLine } : {}), script: body, withLead: !!leadId,
195
234
  });
196
235
  });
197
- log(leadId ? `asking the lead to review ${name}` : `asking for approval of ${name}`);
236
+ log(leadId ? `asking the lead to review a script on ${name}` : `asking for approval to run a script on ${name}${told ? ` · ${told}` : ''}`);
198
237
  const verdict = await ask({
199
- toolName: 'request_production_run',
238
+ toolName: SCRIPT_REQUEST,
200
239
  input: {
201
- description: `PRODUCTION RUN "${name}" on ${target} — ${purpose.trim()} Expected: ${expected_effect.trim()} [${hash}]`,
240
+ description: `SCRIPT "${label}" on ${name} — ${reason.trim()}${expected_effect ? ` Expected: ${expected_effect.trim()}` : ''} [${hash}]`,
202
241
  command: `${previewNote}${body}`,
203
242
  whole: true,
204
243
  },
205
244
  }, { signal: new AbortController().signal });
206
245
  onAsk({ kind: 'answered', requestId: hash });
246
+ // Answered either way, so the card is no longer waiting on anybody.
247
+ await human.unflag();
207
248
  if (!verdict.allow)
208
249
  return say(`Not run. ${verdict.reason}`, true);
209
- const r = await runAndReport(t, { commentId: posted?.comment_id ?? '', card: cur.card, cwd: cur.cwd, name, target, script: body, hash }, deck, log);
210
- return say(`${r.code === 0 ? 'Ran' : `FAILED (exit ${r.code})`} "${name}" on ${target}. Output:\n${r.out || '(no output)'}`, r.code !== 0);
250
+ const r = await runAndReport(t, { commentId: posted?.comment_id ?? '', card: cur.card, cwd: cur.cwd, name: label, target: name, script: body, hash }, deck, log);
251
+ return say(`${r.code === 0 ? 'Ran' : `FAILED (exit ${r.code})`} on ${name}. Output:\n${r.out || '(no output)'}`, r.code !== 0);
211
252
  }),
212
253
  ],
213
254
  });
package/dist/runs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"runs.js","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runs.js","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"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"}
package/dist/serve.js CHANGED
@@ -7,8 +7,8 @@ import { pushStatus, StatusTracker } from './status.js';
7
7
  import { fetchTeam, myTeam, teamTools, TEAM_TOOL_NAMES } from './team.js';
8
8
  import { scheduleTools, SCHEDULE_TOOL_NAMES } from './schedules.js';
9
9
  import { preflightFlaredeck } from './flaredeck-check.js';
10
- import { NOT_FOR_WORKERS, callFlaredeckTool, flaredeckProxy } from './flaredeck-proxy.js';
11
- import { resumeApprovedRuns, runTools } from './runs.js';
10
+ import { NOT_FOR_WORKERS, REPLACED_BY_HARNESS, callFlaredeckTool, flaredeckProxy } from './flaredeck-proxy.js';
11
+ import { SCRIPT_REQUEST, allTargets, resumeApprovedRuns, runTools } from './runs.js';
12
12
  import { deliverDecision, flaredeckDecider } from './approval.js';
13
13
  import { CouldNotWork, engineFor } from './engine.js';
14
14
  import { jevGuard } from './jevguard.js';
@@ -246,7 +246,7 @@ export async function serve(opts) {
246
246
  // themselves. The card being worked is what the approval is asked on.
247
247
  let onCard = null;
248
248
  /**
249
- * The pane's list of production runs waiting on a person: this agent's own request and, on a
249
+ * The pane's list of script requests waiting on a person: this agent's own request and, on a
250
250
  * lead's pane, its team's. Read from the server — the one place every request and verdict
251
251
  * lands — and refreshed whenever the stream says something changed, never on a timer worth
252
252
  * noticing. Rows a person answered here are marked until the next refresh drops them.
@@ -260,7 +260,7 @@ export async function serve(opts) {
260
260
  if (refreshing)
261
261
  return refreshing;
262
262
  refreshing = reader.pendingApprovals().then((all) => {
263
- const mine = all.filter((a) => a.tool_name === 'request_production_run');
263
+ const mine = all.filter((a) => a.tool_name === SCRIPT_REQUEST);
264
264
  state.approvals = mine.map((a) => {
265
265
  const lines = (a.input_preview || '').split('\n');
266
266
  const preview = lines.find((l) => l.startsWith('-- RAN') || /would_touch/.test(l))?.replace(/^-- /, '').replace(/^harness preview.*?:\s*/, '');
@@ -304,7 +304,7 @@ export async function serve(opts) {
304
304
  * The ask now goes where the person already is — posted on the card being worked, as the same
305
305
  * Approve/Deny the production-run flow uses (web, phone, push) — and the turn waits for the
306
306
  * verdict. Nobody has to be at this keyboard. It is routed through the lead first when this
307
- * agent has one, exactly as a production run is.
307
+ * agent has one, exactly as a script request is.
308
308
  *
309
309
  * With no card to ask on (a pane question, the idle sweep) there is nowhere to post, so it
310
310
  * falls back to the configured decider and the old refusal stands.
@@ -342,8 +342,26 @@ export async function serve(opts) {
342
342
  log('tool', jevKey
343
343
  ? 'jev guard on — irreversible commands are refused, the rest run'
344
344
  : 'jev guard on, with NO OpenRouter key — every risky command will interrupt a person. Set one: flaredeck-agent providers --openrouter <key>');
345
- const runsSet = Object.keys(config.runs ?? {}).length
346
- ? runTools(config.runs, () => onCard, opts.deck ?? null, (t) => log('tool', t), () => leadId, onAsk)
345
+ // Always mounted, never conditional: being stuck is not a thing some machines have. The
346
+ // configured production targets are added to the shell every machine already has.
347
+ const runsSet = opts.deck
348
+ ? runTools(config.runs ?? {}, () => onCard, opts.deck, (t) => log('tool', t), {
349
+ flag: async (reason, kind) => {
350
+ const cur = onCard;
351
+ if (!cur)
352
+ return null;
353
+ return flagCard({ card: cur.card, board: cur.board, code: cur.code }, reason, kind);
354
+ },
355
+ unflag: async () => {
356
+ const cur = onCard;
357
+ if (!cur)
358
+ return;
359
+ await callFlaredeckTool(config.mcpUrl, await opts.auth(), 'clear-needs-human', {
360
+ card_id: cur.code || cur.card,
361
+ ...(cur.board ? { board_id: cur.board } : {}),
362
+ }).catch((e) => log('warn', `could not clear needs-human: ${e instanceof Error ? e.message : String(e)}`));
363
+ },
364
+ }, () => leadId, onAsk)
347
365
  : undefined;
348
366
  // Answering from this keyboard: the person's own login decides, through the same endpoint the
349
367
  // phone uses, so the agent waiting on it sees the verdict as any other.
@@ -367,9 +385,9 @@ export async function serve(opts) {
367
385
  // Anything a person approved while this harness was not waiting runs now, before the first
368
386
  // event — so the approval the pane showed as "picking it up" is actually picked up.
369
387
  if (runsSet && opts.deck) {
370
- void resumeApprovedRuns(config.runs, opts.deck, config.repo, (t) => log('tool', t))
388
+ void resumeApprovedRuns(allTargets(config.runs), opts.deck, config.repo, (t) => log('tool', t))
371
389
  .then((n) => { if (n) {
372
- log('event', `ran ${n} approved production run(s) owed from before this restart`);
390
+ log('event', `ran ${n} approved script(s) owed from before this restart`);
373
391
  void refreshApprovals();
374
392
  } });
375
393
  }
@@ -408,12 +426,12 @@ export async function serve(opts) {
408
426
  }))
409
427
  .sort((x, y) => x.name.localeCompare(y.name));
410
428
  };
411
- /** Who this agent reports to, when it is a worker on a team: production runs go there first. */
429
+ /** Who this agent reports to, when it is a worker on a team: script requests go there first. */
412
430
  let leadId = null;
413
431
  let leadName = '';
414
432
  /** A lead's surface is wider than a worker's, so the tool list is too. */
415
433
  let isLead = false;
416
- const keepTool = (name) => isLead || !NOT_FOR_WORKERS.includes(name);
434
+ const keepTool = (name) => !REPLACED_BY_HARNESS.includes(name) && (isLead || !NOT_FOR_WORKERS.includes(name));
417
435
  /** Cards already handed to the lead, so a retried tool call does not assign or message twice. */
418
436
  const handedBack = new Set();
419
437
  try {
@@ -917,28 +935,37 @@ export async function serve(opts) {
917
935
  * needs-human" over the top of it. An agent said it had asked for help, a person was never told,
918
936
  * and the card sat.
919
937
  */
920
- const flagForHuman = async (event, reason, kind) => {
921
- const label = event.cardCode || event.cardKey || 'card';
938
+ const flagCard = async (ref, reason, kind) => {
939
+ const label = ref.code || ref.card || 'card';
922
940
  try {
923
941
  const out = await callFlaredeckTool(config.mcpUrl, await opts.auth(), 'set-needs-human', {
924
942
  // The code when there is one — it resolves on its own. The board always goes with the key.
925
- card_id: event.cardCode || event.cardKey,
926
- ...(event.boardKey ? { board_id: event.boardKey } : {}),
943
+ card_id: ref.code || ref.card,
944
+ ...(ref.board ? { board_id: ref.board } : {}),
927
945
  reason,
928
946
  ...(kind ? { kind } : {}),
929
947
  });
930
- if (out.trimStart().startsWith('❌') || out.trimStart().startsWith('🚫')) {
931
- log('warn', `${label}: FlareDeck did not flag this card — ${out.split('\n')[0]}`);
932
- return;
948
+ if (out.trimStart().startsWith('\u274c') || out.trimStart().startsWith('\ud83d\udeab')) {
949
+ log('warn', `${label}: FlareDeck did not flag this card \u2014 ${out.split('\n')[0]}`);
950
+ return null;
933
951
  }
934
952
  // Say who was told, which the tool reports back, so the pane shows whether anyone heard it.
935
- const told = out.split('\n').find((l) => l.startsWith('**Told**'));
936
- log('warn', `${label}: flagged needs-human — ${reason.split('.')[0]}${told ? ` · ${told.replace(/\*\*/g, '')}` : ''}`);
953
+ const told = out.split('\n').find((l) => l.startsWith('**Told**'))?.replace(/\*\*/g, '') ?? null;
954
+ log('warn', `${label}: flagged needs-human \u2014 ${reason.split('.')[0]}${told ? ` \u00b7 ${told}` : ''}`);
955
+ return told;
937
956
  }
938
957
  catch (e) {
939
- log('warn', `${label}: could not flag the card (${e instanceof Error ? e.message : String(e)}) — ${reason}`);
958
+ log('warn', `${label}: could not flag the card (${e instanceof Error ? e.message : String(e)}) \u2014 ${reason}`);
959
+ return null;
940
960
  }
941
961
  };
962
+ const flagForHuman = async (event, reason, kind) => {
963
+ await flagCard({
964
+ card: event.cardKey ?? '',
965
+ ...(event.boardKey ? { board: event.boardKey } : {}),
966
+ ...(event.cardCode ? { code: event.cardCode } : {}),
967
+ }, reason, kind);
968
+ };
942
969
  async function handle(event) {
943
970
  // A scheduled run that sat in the queue past its window (this machine was off, the pane was
944
971
  // busy) is dropped, not run late: a "7am summary" at noon is worse than none. Acknowledged by
@@ -1179,7 +1206,14 @@ export async function serve(opts) {
1179
1206
  if (!resume && event.cardKey && event.event !== 'review' && event.event !== 'ask') {
1180
1207
  await startOnBoard(event.cardCode || event.cardKey);
1181
1208
  }
1182
- onCard = event.cardKey ? { card: event.cardKey, cwd } : null;
1209
+ onCard = event.cardKey
1210
+ ? {
1211
+ card: event.cardKey,
1212
+ cwd,
1213
+ ...(event.boardKey ? { board: event.boardKey } : {}),
1214
+ ...(event.cardCode ? { code: event.cardCode } : {}),
1215
+ }
1216
+ : null;
1183
1217
  job = tree
1184
1218
  ? {
1185
1219
  cwd,
@@ -1630,7 +1664,7 @@ function prompt(event) {
1630
1664
  'Read the card with get-card-details. The request is the newest comment carrying an approval,',
1631
1665
  'with its comment id, the script, the worker\'s own account of it, and the harness\'s row-count',
1632
1666
  'preview. Check that the WHERE clause matches the stated purpose and that the preview matches',
1633
- 'the expected effect. Then call review_production_run with that comment id: endorse, and the',
1667
+ 'the expected effect. Then call review_script with that comment id: endorse, and the',
1634
1668
  'people who can approve it are asked; reject, and the worker is refused with your note. Do not',
1635
1669
  'dispatch, re-assign, or change anything else — this is a review, not a card to work.',
1636
1670
  ].join('\n');