muse-crew 0.6.1 → 0.6.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "muse-crew",
3
- "version": "0.6.1",
3
+ "version": "0.6.2",
4
4
  "description": "Opinionated orchestration for Muse \u2014 workflows, identities, and tooling for autonomous software development.",
5
5
  "license": "UNLICENSED",
6
6
  "private": false,
@@ -323,8 +323,14 @@ function buildVisualCapturePlan(taskTitle, taskDescription, kind, captureTargets
323
323
  // opt-in — a missing or garbled line degrades to "unknown", which callers
324
324
  // treat as non-experiential. The task is never parked on a garbled line.
325
325
  async function resolveExperiential() {
326
- if (isExperiential === true) return "yes";
327
- if (isExperiential === false) return "no";
326
+ // Triage notes are immutable within a run: cache the resolved outcome —
327
+ // yes, no, AND unknown — so the dashboard lookup runs at most once per
328
+ // run. Without the unknown branch a missing experiential marker would
329
+ // re-fire the same "resolve-experiential-<taskId>" agent key on every
330
+ // Capture/Map entry and throw a duplicate replay key error.
331
+ if (experientialResolved !== null) return experientialResolved;
332
+ if (isExperiential === true) return (experientialResolved = "yes");
333
+ if (isExperiential === false) return (experientialResolved = "no");
328
334
  var expCheck = null;
329
335
  try {
330
336
  expCheck = await agent(
@@ -340,12 +346,14 @@ async function resolveExperiential() {
340
346
  );
341
347
  } catch (e) {
342
348
  log("resolveExperiential: agent call failed (" + (e && e.message ? e.message : e) + ") — treating as unknown");
343
- return "unknown";
349
+ experientialResolved = "unknown";
350
+ return experientialResolved;
344
351
  }
345
352
  var marker = extractExperiential(expCheck && expCheck.experiential_line ? expCheck.experiential_line : "");
346
- if (marker === true) return "yes";
347
- if (marker === false) return "no";
348
- return "unknown";
353
+ if (marker === true) experientialResolved = "yes";
354
+ else if (marker === false) experientialResolved = "no";
355
+ else experientialResolved = "unknown";
356
+ return experientialResolved;
349
357
  }
350
358
  // Baseline evidence status: reads the task's note events for the exact
351
359
  // protocol prefixes (explicit state, never English matching). Returns
@@ -456,6 +464,9 @@ let mapperSpec = "";
456
464
  // plan, and the Map-gate bounce counter (keeps agent stable-keys unique when
457
465
  // a Map-gate bounce re-runs Capture/Map in the same run).
458
466
  let isExperiential = null;
467
+ // Caches all three resolveExperiential() outcomes (yes/no/unknown); Triage
468
+ // notes are immutable within a run, so the lookup runs at most once.
469
+ let experientialResolved = null;
459
470
  let captureTargets = "";
460
471
  let mapGateBounceCount = 0;
461
472
  // Merge-time versioning: the release decision is extracted deterministically
@@ -544,7 +555,7 @@ while (i < STEPS.length) {
544
555
  "Find the task with id \"" + taskId + "\" in the returned tasks array.\n" +
545
556
  "Return exactly { \"project\": \"<the task's project field, or empty string if absent>\" } and nothing else.",
546
557
  {
547
- key: "project-check-" + step.name + (totalReworkCount > 0 ? "-r" + totalReworkCount : ""),
558
+ key: "project-check-" + step.name + (totalReworkCount > 0 ? "-r" + totalReworkCount : "") + (mapGateBounceCount > 0 ? "-g" + mapGateBounceCount : ""),
548
559
  label: "Checking project before " + step.name,
549
560
  schema: { type: "object", properties: { project: { type: "string" } }, required: ["project"] }
550
561
  }
@@ -321,8 +321,14 @@ function buildVisualCapturePlan(taskTitle, taskDescription, kind, captureTargets
321
321
  // opt-in — a missing or garbled line degrades to "unknown", which callers
322
322
  // treat as non-experiential. The task is never parked on a garbled line.
323
323
  async function resolveExperiential() {
324
- if (isExperiential === true) return "yes";
325
- if (isExperiential === false) return "no";
324
+ // Triage notes are immutable within a run: cache the resolved outcome —
325
+ // yes, no, AND unknown — so the dashboard lookup runs at most once per
326
+ // run. Without the unknown branch a missing experiential marker would
327
+ // re-fire the same "resolve-experiential-<taskId>" agent key on every
328
+ // Capture/Map entry and throw a duplicate replay key error.
329
+ if (experientialResolved !== null) return experientialResolved;
330
+ if (isExperiential === true) return (experientialResolved = "yes");
331
+ if (isExperiential === false) return (experientialResolved = "no");
326
332
  var expCheck = null;
327
333
  try {
328
334
  expCheck = await agent(
@@ -338,12 +344,14 @@ async function resolveExperiential() {
338
344
  );
339
345
  } catch (e) {
340
346
  log("resolveExperiential: agent call failed (" + (e && e.message ? e.message : e) + ") — treating as unknown");
341
- return "unknown";
347
+ experientialResolved = "unknown";
348
+ return experientialResolved;
342
349
  }
343
350
  var marker = extractExperiential(expCheck && expCheck.experiential_line ? expCheck.experiential_line : "");
344
- if (marker === true) return "yes";
345
- if (marker === false) return "no";
346
- return "unknown";
351
+ if (marker === true) experientialResolved = "yes";
352
+ else if (marker === false) experientialResolved = "no";
353
+ else experientialResolved = "unknown";
354
+ return experientialResolved;
347
355
  }
348
356
  // Baseline evidence status: reads the task's note events for the exact
349
357
  // protocol prefixes (explicit state, never English matching). Returns
@@ -414,6 +422,9 @@ let mapperSpec = "";
414
422
  // a Map-gate bounce re-runs Capture/Map in the same run). Chore has no QA
415
423
  // phase, so there is no visual-verdict function — Capture only.
416
424
  let isExperiential = null;
425
+ // Caches all three resolveExperiential() outcomes (yes/no/unknown); Triage
426
+ // notes are immutable within a run, so the lookup runs at most once.
427
+ let experientialResolved = null;
417
428
  let captureTargets = "";
418
429
  let mapGateBounceCount = 0;
419
430
  // Merge-time versioning: the release decision is extracted deterministically
@@ -502,7 +513,7 @@ while (i < STEPS.length) {
502
513
  "Find the task with id \"" + taskId + "\" in the returned tasks array.\n" +
503
514
  "Return exactly { \"project\": \"<the task's project field, or empty string if absent>\" } and nothing else.",
504
515
  {
505
- key: "project-check-" + step.name + (reworkCount > 0 ? "-r" + reworkCount : ""),
516
+ key: "project-check-" + step.name + (reworkCount > 0 ? "-r" + reworkCount : "") + (mapGateBounceCount > 0 ? "-g" + mapGateBounceCount : ""),
506
517
  label: "Checking project before " + step.name,
507
518
  schema: { type: "object", properties: { project: { type: "string" } }, required: ["project"] }
508
519
  }
@@ -323,8 +323,14 @@ function buildVisualCapturePlan(taskTitle, taskDescription, kind, captureTargets
323
323
  // opt-in — a missing or garbled line degrades to "unknown", which callers
324
324
  // treat as non-experiential. The task is never parked on a garbled line.
325
325
  async function resolveExperiential() {
326
- if (isExperiential === true) return "yes";
327
- if (isExperiential === false) return "no";
326
+ // Triage notes are immutable within a run: cache the resolved outcome —
327
+ // yes, no, AND unknown — so the dashboard lookup runs at most once per
328
+ // run. Without the unknown branch a missing experiential marker would
329
+ // re-fire the same "resolve-experiential-<taskId>" agent key on every
330
+ // Capture/Map entry and throw a duplicate replay key error.
331
+ if (experientialResolved !== null) return experientialResolved;
332
+ if (isExperiential === true) return (experientialResolved = "yes");
333
+ if (isExperiential === false) return (experientialResolved = "no");
328
334
  var expCheck = null;
329
335
  try {
330
336
  expCheck = await agent(
@@ -340,12 +346,14 @@ async function resolveExperiential() {
340
346
  );
341
347
  } catch (e) {
342
348
  log("resolveExperiential: agent call failed (" + (e && e.message ? e.message : e) + ") — treating as unknown");
343
- return "unknown";
349
+ experientialResolved = "unknown";
350
+ return experientialResolved;
344
351
  }
345
352
  var marker = extractExperiential(expCheck && expCheck.experiential_line ? expCheck.experiential_line : "");
346
- if (marker === true) return "yes";
347
- if (marker === false) return "no";
348
- return "unknown";
353
+ if (marker === true) experientialResolved = "yes";
354
+ else if (marker === false) experientialResolved = "no";
355
+ else experientialResolved = "unknown";
356
+ return experientialResolved;
349
357
  }
350
358
  // Baseline evidence status: reads the task's note events for the exact
351
359
  // protocol prefixes (explicit state, never English matching). Returns
@@ -455,6 +463,9 @@ let mapperSpec = "";
455
463
  // plan, and the Map-gate bounce counter (keeps agent stable-keys unique when
456
464
  // a Map-gate bounce re-runs Capture/Map in the same run).
457
465
  let isExperiential = null;
466
+ // Caches all three resolveExperiential() outcomes (yes/no/unknown); Triage
467
+ // notes are immutable within a run, so the lookup runs at most once.
468
+ let experientialResolved = null;
458
469
  let captureTargets = "";
459
470
  let mapGateBounceCount = 0;
460
471
  // Merge-time versioning: the release decision is extracted deterministically
@@ -543,7 +554,7 @@ while (i < STEPS.length) {
543
554
  "Find the task with id \"" + taskId + "\" in the returned tasks array.\n" +
544
555
  "Return exactly { \"project\": \"<the task's project field, or empty string if absent>\" } and nothing else.",
545
556
  {
546
- key: "project-check-" + step.name + (totalReworkCount > 0 ? "-r" + totalReworkCount : ""),
557
+ key: "project-check-" + step.name + (totalReworkCount > 0 ? "-r" + totalReworkCount : "") + (mapGateBounceCount > 0 ? "-g" + mapGateBounceCount : ""),
547
558
  label: "Checking project before " + step.name,
548
559
  schema: { type: "object", properties: { project: { type: "string" } }, required: ["project"] }
549
560
  }