@akagilnc/pi-workflow-roles 0.1.5365 → 0.1.5375

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.
Files changed (170) hide show
  1. package/dist/acp-host/production-host.js +5585 -5655
  2. package/dist/activation-ledger-git.js +2 -2
  3. package/dist/activation-ledger-topology.js +1 -7
  4. package/dist/analyst-entry.js +4 -8
  5. package/dist/analyst-gate-cycles-read.js +3 -11
  6. package/dist/analyst-index.js +3 -9
  7. package/dist/analyst-ledger.js +1 -11
  8. package/dist/analyst-metric-families/acceptance-success-rework.js +1 -3
  9. package/dist/analyst-metric-families/round-timeline.js +1 -3
  10. package/dist/analyst-page.js +2 -2
  11. package/dist/archivist-record-topology.js +2 -2
  12. package/dist/audit-escalation.js +2 -1
  13. package/dist/auditor-soul.js +2 -1
  14. package/dist/collector-config.js +6 -8
  15. package/dist/compliance-transport.js +2 -1
  16. package/dist/countersign-contracts.js +2 -1
  17. package/dist/diarist-contracts.js +3 -2
  18. package/dist/doctor-contracts.js +1 -3
  19. package/dist/doctor-evidence.js +7 -8
  20. package/dist/dossier-resolution.js +1 -3
  21. package/dist/engine-detour-usage.js +1 -3
  22. package/dist/gatekeeper-role.js +2 -9
  23. package/dist/gleaner-left-contracts.js +2 -1
  24. package/dist/headless-host/description.js +14 -17
  25. package/dist/headless-host/production-host.js +1665 -1737
  26. package/dist/host-session-record.js +3 -2
  27. package/dist/inspector-contracts.js +2 -1
  28. package/dist/ledger-session-read.js +1 -3
  29. package/dist/merger-contracts.js +9 -9
  30. package/dist/migrate-book-topology.js +348 -314
  31. package/dist/navigator-attendance.js +9 -11
  32. package/dist/navigator-invocation-identity.js +3 -2
  33. package/dist/navigator-public-session.js +3 -5
  34. package/dist/navigator-session-contracts.js +8 -10
  35. package/dist/navigator-work-base.js +5 -8
  36. package/dist/notary-contracts.js +3 -5
  37. package/dist/package-contracts/auditor-output.js +1 -3
  38. package/dist/package-contracts/fixer-packet.js +3 -6
  39. package/dist/package-contracts/gatekeeper-output.js +1 -3
  40. package/dist/package-contracts/navigator-output.js +8 -8
  41. package/dist/package-contracts/terminating-infrastructure.js +5 -9
  42. package/dist/package-contracts/terminating-tools.js +4 -3
  43. package/dist/public-cli/analyst-run.js +3 -2
  44. package/dist/public-cli/auto-resume.js +4 -9
  45. package/dist/public-cli/cli.js +66 -64
  46. package/dist/public-cli/config.js +12 -11
  47. package/dist/public-cli/countersign-run.js +1 -3
  48. package/dist/public-cli/host-providers.js +7 -14
  49. package/dist/public-cli/instruction-seat-run.js +69 -43
  50. package/dist/public-cli/invocation.js +141 -136
  51. package/dist/public-cli/main.js +1919 -1968
  52. package/dist/public-cli/post-admission.js +89 -89
  53. package/dist/public-cli/role-seat-runtime.js +29 -0
  54. package/dist/public-cli/run-lifecycle.js +20 -32
  55. package/dist/public-cli/settlement.js +10 -26
  56. package/dist/public-cli/turn-request.js +14 -0
  57. package/dist/public-role-summons.js +23 -35
  58. package/dist/receipt-delivery-policy.js +1 -3
  59. package/dist/role-run-placement.js +7 -5
  60. package/dist/role-run-relocation.js +12 -19
  61. package/dist/run-terminal-artifacts.js +1 -11
  62. package/dist/run-ticket-number.js +2 -4
  63. package/dist/session-assistant-usage.js +2 -1
  64. package/dist/session-dialogue.js +1 -14
  65. package/dist/sitian-reader.js +2 -4
  66. package/dist/submission-correctable-error.js +2 -1
  67. package/dist/submission-errors.js +2 -1
  68. package/dist/submission-gate.js +2 -1
  69. package/dist/submission-ledger.js +4 -5
  70. package/dist/ticket-provenance-contracts.js +1 -3
  71. package/dist/ticket-provenance.js +2 -1
  72. package/dist/typed-provider-http.js +4 -7
  73. package/dist/unknown-value.js +28 -0
  74. package/dist/user-dialogue-stdin.js +2 -1
  75. package/package.json +1 -1
  76. package/src/acp-host/role-turn-host.ts +4 -2
  77. package/src/activation-ledger-git.ts +3 -2
  78. package/src/activation-ledger-topology.ts +4 -12
  79. package/src/analyst-entry.ts +3 -11
  80. package/src/analyst-gate-cycles-read.ts +3 -15
  81. package/src/analyst-index.ts +3 -13
  82. package/src/analyst-ledger.ts +2 -16
  83. package/src/analyst-metric-families/acceptance-success-rework.ts +2 -4
  84. package/src/analyst-metric-families/round-timeline.ts +2 -4
  85. package/src/analyst-page.ts +2 -2
  86. package/src/archivist-record-topology.ts +2 -2
  87. package/src/audit-escalation.ts +2 -1
  88. package/src/auditor-soul.ts +3 -1
  89. package/src/book-topology-migration-placement.ts +8 -21
  90. package/src/book-topology-migrators-t11.ts +16 -15
  91. package/src/book-topology-mixed-volume-migrators.ts +3 -6
  92. package/src/book-topology-record-class-migrators.ts +7 -10
  93. package/src/book-topology-runs-migrator.ts +4 -3
  94. package/src/collector-config.ts +7 -9
  95. package/src/compliance-transport.ts +2 -1
  96. package/src/countersign-contracts.ts +2 -1
  97. package/src/diarist-contracts.ts +3 -2
  98. package/src/doctor-contracts.ts +3 -1
  99. package/src/doctor-evidence.ts +8 -7
  100. package/src/doctor-role.ts +4 -2
  101. package/src/dossier-resolution.ts +2 -4
  102. package/src/engine-detour-tool.ts +0 -2
  103. package/src/engine-detour-usage.ts +2 -4
  104. package/src/external-host-turn-loop.ts +3 -1
  105. package/src/factory-board.ts +1 -8
  106. package/src/gatekeeper-role.ts +2 -10
  107. package/src/gleaner-left-contracts.ts +3 -1
  108. package/src/headless-host/description.ts +15 -18
  109. package/src/headless-host/role-turn-host.ts +10 -9
  110. package/src/host-session-record.ts +4 -2
  111. package/src/inspector-contracts.ts +2 -1
  112. package/src/ledger-session-read.ts +2 -5
  113. package/src/merger-contracts.ts +10 -9
  114. package/src/navigator-attendance.ts +10 -12
  115. package/src/navigator-invocation-identity.ts +3 -2
  116. package/src/navigator-public-session.ts +4 -6
  117. package/src/navigator-session-contracts.ts +8 -11
  118. package/src/navigator-work-base.ts +5 -8
  119. package/src/navigator-work-context.ts +2 -1
  120. package/src/notary-contracts.ts +4 -6
  121. package/src/oauth-keepalive.ts +5 -18
  122. package/src/package-contracts/auditor-output.ts +2 -4
  123. package/src/package-contracts/fixer-packet.ts +4 -6
  124. package/src/package-contracts/gatekeeper-output.ts +2 -4
  125. package/src/package-contracts/judge-output.ts +0 -1
  126. package/src/package-contracts/navigator-output.ts +8 -8
  127. package/src/package-contracts/terminating-infrastructure.ts +6 -20
  128. package/src/package-contracts/terminating-tools.ts +8 -12
  129. package/src/pi/adapter.ts +0 -1
  130. package/src/pi/role-turn-host.ts +0 -1
  131. package/src/public-cli/analyst-run.ts +4 -2
  132. package/src/public-cli/auto-resume.ts +5 -12
  133. package/src/public-cli/cli.ts +77 -83
  134. package/src/public-cli/config.ts +16 -27
  135. package/src/public-cli/countersign-run.ts +2 -4
  136. package/src/public-cli/host-providers.ts +10 -27
  137. package/src/public-cli/instruction-seat-run.ts +87 -58
  138. package/src/public-cli/invocation.ts +159 -172
  139. package/src/public-cli/post-admission.ts +115 -103
  140. package/src/public-cli/role-seat-runtime.ts +72 -0
  141. package/src/public-cli/run-lifecycle.ts +27 -67
  142. package/src/public-cli/settlement.ts +11 -33
  143. package/src/public-cli/terminal.ts +2 -17
  144. package/src/public-cli/turn-request.ts +26 -0
  145. package/src/public-role-summons.ts +24 -48
  146. package/src/receipt-delivery-policy.ts +1 -4
  147. package/src/reviewer-role.ts +0 -1
  148. package/src/role-envelope.ts +5 -3
  149. package/src/role-run-placement.ts +9 -10
  150. package/src/role-run-relocation.ts +13 -23
  151. package/src/role-runtime.ts +9 -15
  152. package/src/run-terminal-artifacts.ts +2 -16
  153. package/src/run-ticket-number.ts +4 -10
  154. package/src/session-assistant-usage.ts +3 -1
  155. package/src/session-dialogue.ts +1 -4
  156. package/src/session-identity.ts +0 -1
  157. package/src/sitian-reader.ts +2 -4
  158. package/src/submission-correctable-error.ts +3 -1
  159. package/src/submission-errors.ts +2 -1
  160. package/src/submission-gate.ts +3 -1
  161. package/src/submission-ledger.ts +5 -6
  162. package/src/ticket-provenance-contracts.ts +1 -4
  163. package/src/ticket-provenance.ts +3 -1
  164. package/src/ticket-snapshot.ts +2 -4
  165. package/src/ticket-trajectory.ts +1 -8
  166. package/src/typed-provider-http.ts +5 -15
  167. package/src/unknown-value.ts +34 -0
  168. package/src/user-dialogue-stdin.ts +3 -1
  169. package/src/worker-role.ts +2 -5
  170. package/src/worker-submission-gates.ts +5 -7
@@ -3,7 +3,8 @@
3
3
  * Seat differences are composition-root fields. An omitted reviewer lens
4
4
  * starts two ordinary single-axis runs here.
5
5
  */
6
- import { dirname, resolve, sep } from "node:path";
6
+ import { dirname, resolve } from "node:path";
7
+ import { isUnboundRunDirectory } from "../role-run-placement.ts";
7
8
  import { AUDITOR_DOSSIER_PROMPT } from "../compliance-transport.ts";
8
9
  import { bookDirectOfficerRunPointer } from "../archivist-record-pointer.ts";
9
10
  import { createPiDoctorAuditor } from "../doctor-auditor.ts";
@@ -24,6 +25,7 @@ import {
24
25
  latestQueueStatus,
25
26
  } from "../submission-gate.ts";
26
27
  import { isSafePositiveTicketNumber, readBoardTicketNumber } from "../run-ticket-number.ts";
28
+ import type { NotarySourceRunLocator } from "../notary-contracts.ts";
27
29
  import { NotarySourceRunError, resolveNotarySourceRunLocator } from "../notary-source-run.ts";
28
30
  import { engineSessionMaterialFromOptions, pickEngineAxis } from "../package-resources/engine-material.ts";
29
31
  import type { PackagedRole } from "../packaged-role-registry.ts";
@@ -33,7 +35,7 @@ import {
33
35
  packagedRebindSourceOnResume,
34
36
  packagedRoleMetadata,
35
37
  } from "../packaged-role-registry.ts";
36
- import { isAuditorSoulRole, readAuditorResumeBinding } from "../auditor-soul.ts";
38
+ import { readAuditorResumeBinding } from "../auditor-soul.ts";
37
39
  import { CliUsageError } from "./cli-errors.ts";
38
40
  import {
39
41
  admitPublicRole,
@@ -89,6 +91,7 @@ import {
89
91
  } from "./terminal.ts";
90
92
  import {
91
93
  admittedSeatTurnDetails,
94
+ projectPublicTurnAxes,
92
95
  projectRoleTurnRequest,
93
96
  requiredMethodSkills,
94
97
  type RoleTurnRequestProjectionOptions,
@@ -98,6 +101,8 @@ import {
98
101
  latestPayloadEscalated,
99
102
  type CountersignRunEnv,
100
103
  } from "./countersign-run.ts";
104
+ import { isRecord, errorText } from "../unknown-value.ts";
105
+
101
106
  export type InstructionSeatRunEnv = PostAdmissionEnv & Pick<
102
107
  CountersignRunEnv,
103
108
  "reviewReask" | "gateReviewInstruction" | "parentRunPath"
@@ -156,7 +161,7 @@ function unreadablePostSubmissionStatus(
156
161
  const route = POST_SUBMISSION_ROUTING[admitted.role];
157
162
  if (route === undefined) return undefined;
158
163
  const payload = terminal.roleOutcome.payloads?.at(-1);
159
- const status = payload !== null && typeof payload === "object" && !Array.isArray(payload)
164
+ const status = isRecord(payload)
160
165
  ? (payload as Record<string, unknown>).status
161
166
  : undefined;
162
167
  return typeof status === "string" && route.statuses.has(status)
@@ -455,6 +460,45 @@ async function runOmittedLensBatch(
455
460
  return { exitCode: failed ? 1 : 0, terminal };
456
461
  }
457
462
 
463
+ /**
464
+ * One same-parent lookup. Seat branches still build their own summons.
465
+ * A found child resumes that child; no prior run returns undefined so the caller mints.
466
+ */
467
+ function resumeSameParentInstructionSeat(input: {
468
+ readonly env: InstructionSeatRunEnv;
469
+ readonly io: CliIo;
470
+ readonly projectRoot: string;
471
+ readonly role: PackagedRole;
472
+ readonly parentRunPath: string;
473
+ readonly summons: SameTicketSummonsMaterials;
474
+ readonly ticketNumber?: number;
475
+ }): Promise<SeatRunResult | undefined> {
476
+ return tryResumeSameTicketSeatRun({
477
+ home: input.env.home,
478
+ projectRoot: input.projectRoot,
479
+ role: input.role,
480
+ parentRunPath: input.parentRunPath,
481
+ ...(input.ticketNumber === undefined ? {} : { ticketNumber: input.ticketNumber }),
482
+ freshSummons: input.env.freshSummons,
483
+ summons: input.summons,
484
+ resume: (runId, materials) => runPublicInstructionSeatResume(
485
+ { runId, ...(materials === undefined ? {} : { summons: materials }) },
486
+ input.env,
487
+ input.io,
488
+ ),
489
+ });
490
+ }
491
+
492
+ /** Re-ask words when the parent supplied them; otherwise the caller's own instruction. */
493
+ function sameParentInstruction(
494
+ env: InstructionSeatRunEnv,
495
+ fallback: { readonly instruction: string; readonly instructionEmpty: boolean },
496
+ ): { readonly instruction: string; readonly instructionEmpty: boolean } {
497
+ const resumeInstruction = env.reviewReask ?? env.gateReviewInstruction;
498
+ if (resumeInstruction === undefined) return fallback;
499
+ return { instruction: resumeInstruction, instructionEmpty: false };
500
+ }
501
+
458
502
  /**
459
503
  * Countersign on the shared entry: gate parent resume, deferred materialization,
460
504
  * then the same one-shot settlement as every other seat.
@@ -470,23 +514,20 @@ async function runCountersignBody(
470
514
  : undefined;
471
515
  if (gateParentRunPath !== undefined) {
472
516
  const resumeInstruction = env.reviewReask ?? env.gateReviewInstruction ?? parsed.instruction ?? "";
473
- const resumed = await tryResumeSameTicketSeatRun({
474
- home: env.home,
517
+ const resumed = await resumeSameParentInstructionSeat({
518
+ env,
519
+ io,
475
520
  projectRoot: resolve(parsed.project ?? env.cwd),
476
521
  role: "countersign",
477
522
  parentRunPath: gateParentRunPath,
478
- ...(isSafePositiveTicketNumber(env.boundTicketNumber) ? { ticketNumber: env.boundTicketNumber } : {}),
479
- freshSummons: env.freshSummons,
523
+ ...(isSafePositiveTicketNumber(env.boundTicketNumber)
524
+ ? { ticketNumber: env.boundTicketNumber }
525
+ : {}),
480
526
  summons: {
481
527
  sourceRunPath: gateParentRunPath,
482
528
  instruction: resumeInstruction,
483
529
  instructionEmpty: resumeInstruction.trim() === "",
484
530
  },
485
- resume: (runId, materials) => runPublicInstructionSeatResume(
486
- { runId, ...(materials === undefined ? {} : { summons: materials }) },
487
- env,
488
- io,
489
- ),
490
531
  });
491
532
  if (resumed != null) return resumed;
492
533
  }
@@ -521,12 +562,7 @@ async function runCountersignBody(
521
562
  admitted = { ...admitted, sourceRunPath: gateParentRunPath };
522
563
  }
523
564
  const turnProjection: RoleTurnRequestProjectionOptions = {
524
- packageRoot: env.packageRoot,
525
- home: env.home,
526
- agentDir: env.agentDir,
527
- ...(env.model === undefined ? {} : { model: env.model }),
528
- ...pickEngineAxis(env),
529
- ...(env.timeoutMs === undefined ? {} : { timeoutMs: env.timeoutMs }),
565
+ ...projectPublicTurnAxes(env),
530
566
  ...(env.correlationId === undefined || env.correlationId.trim() === ""
531
567
  ? {}
532
568
  : { correlationId: env.correlationId }),
@@ -608,49 +644,45 @@ export async function runPublicInstructionSeat(
608
644
  let auditorSubject: "judge" | "doctor" | undefined;
609
645
  let auditorSource: string | undefined;
610
646
  let auditorTicket: number | undefined;
647
+ let resolvedNotarySource: NotarySourceRunLocator | undefined;
611
648
  if (record.sameParent === "subject-source") {
612
- if (!isAuditorSoulRole(parsed.subject)) {
649
+ if (parsed.subject === undefined) {
613
650
  presentStructuralRejection(new CliUsageError("auditor --subject requires judge|doctor"), io);
614
651
  return { exitCode: 2 };
615
652
  }
616
653
  auditorSubject = parsed.subject;
617
- const source = typeof parsed.sourceRun === "string" ? parsed.sourceRun.trim() : "";
618
- if (source === "") {
654
+ if (parsed.sourceRun === undefined) {
619
655
  presentStructuralRejection(new CliUsageError("auditor --source-run requires a run locator"), io);
620
656
  return { exitCode: 2 };
621
657
  }
658
+ const source = parsed.sourceRun;
622
659
  try {
623
660
  const resolved = await resolveNotarySourceRunLocator({ projectRoot, sourceRun: source, home: env.home });
624
661
  auditorSource = resolved.runDirectory;
625
662
  auditorTicket = await readBoardTicketNumber(resolved.runDirectory);
626
663
  } catch (error) {
627
- presentStructuralRejection(new CliUsageError(error instanceof Error ? error.message : String(error)), io);
664
+ presentStructuralRejection(new CliUsageError(errorText(error)), io);
628
665
  return { exitCode: 2 };
629
666
  }
630
667
  if (auditorSource === undefined) return { exitCode: 2 };
631
668
  const sourceDirectory = auditorSource;
632
- const resumeInstruction = env.reviewReask ?? env.gateReviewInstruction;
633
669
  const summons: SameTicketSummonsMaterials = {
634
- ...(resumeInstruction === undefined
635
- ? { instruction: parsed.instruction ?? "", instructionEmpty: (parsed.instruction ?? "").trim() === "" }
636
- : { instruction: resumeInstruction, instructionEmpty: false }),
670
+ ...sameParentInstruction(env, {
671
+ instruction: parsed.instruction ?? "",
672
+ instructionEmpty: (parsed.instruction ?? "").trim() === "",
673
+ }),
637
674
  attachmentPaths: parsed.attachmentPaths ?? [],
638
675
  };
639
676
  const resumed = await withAuditorSoulEnv({
640
677
  subject: auditorSubject,
641
678
  sourceRunDirectory: auditorSource,
642
- run: () => tryResumeSameTicketSeatRun({
643
- home: env.home,
679
+ run: () => resumeSameParentInstructionSeat({
680
+ env,
681
+ io,
644
682
  projectRoot,
645
683
  role,
646
684
  parentRunPath: sourceDirectory,
647
- freshSummons: env.freshSummons,
648
685
  summons,
649
- resume: (runId, materials) => runPublicInstructionSeatResume(
650
- { runId, ...(materials === undefined ? {} : { summons: materials }) },
651
- env,
652
- io,
653
- ),
654
686
  }),
655
687
  });
656
688
  if (resumed != null) return resumed;
@@ -659,26 +691,21 @@ export async function runPublicInstructionSeat(
659
691
  if (record.sameParent === "gate-pointer") {
660
692
  const parentRunPath = parentRunPathFromGatePointerInstruction(parsed.instruction ?? "");
661
693
  if (parentRunPath !== undefined) {
662
- const resumeInstruction = env.reviewReask ?? env.gateReviewInstruction;
663
694
  const summons: SameTicketSummonsMaterials = {
664
695
  sourceRunPath: parentRunPath,
665
- ...(resumeInstruction === undefined
666
- ? { instruction: parsed.instruction ?? "", instructionEmpty: (parsed.instruction ?? "").trim() === "" }
667
- : { instruction: resumeInstruction, instructionEmpty: false }),
696
+ ...sameParentInstruction(env, {
697
+ instruction: parsed.instruction ?? "",
698
+ instructionEmpty: (parsed.instruction ?? "").trim() === "",
699
+ }),
668
700
  attachmentPaths: parsed.attachmentPaths ?? [],
669
701
  };
670
- const resumed = await tryResumeSameTicketSeatRun({
671
- home: env.home,
702
+ const resumed = await resumeSameParentInstructionSeat({
703
+ env,
704
+ io,
672
705
  projectRoot,
673
706
  role,
674
707
  parentRunPath,
675
- freshSummons: env.freshSummons,
676
708
  summons,
677
- resume: (runId, materials) => runPublicInstructionSeatResume(
678
- { runId, ...(materials === undefined ? {} : { summons: materials }) },
679
- env,
680
- io,
681
- ),
682
709
  });
683
710
  if (resumed != null) return resumed;
684
711
  }
@@ -703,31 +730,33 @@ export async function runPublicInstructionSeat(
703
730
  const summons: SameTicketSummonsMaterials = {
704
731
  sourceRunPath: source.runDirectory,
705
732
  sourceRun: source,
706
- ...(resumeInstruction === undefined ? {} : { instruction: resumeInstruction, instructionEmpty: false }),
733
+ ...(resumeInstruction === undefined
734
+ ? {}
735
+ : { instruction: resumeInstruction, instructionEmpty: false }),
707
736
  };
708
- const resumed = await tryResumeSameTicketSeatRun({
709
- home: env.home,
737
+ resolvedNotarySource = source;
738
+ const resumed = await resumeSameParentInstructionSeat({
739
+ env,
740
+ io,
710
741
  projectRoot,
711
742
  role,
712
743
  parentRunPath: source.runDirectory,
713
- freshSummons: env.freshSummons,
714
744
  summons,
715
- resume: (runId, materials) => runPublicInstructionSeatResume(
716
- { runId, ...(materials === undefined ? {} : { summons: materials }) },
717
- env,
718
- io,
719
- ),
720
745
  });
721
746
  if (resumed != null) return resumed;
722
747
  }
723
748
 
724
749
  let admitted: AdmittedRoleInvocation;
725
750
  try {
751
+ const admissionOverride = {
752
+ ...(auditorTicket === undefined ? {} : { assertedTicketNumber: auditorTicket }),
753
+ ...(resolvedNotarySource === undefined ? {} : { resolvedSourceRun: resolvedNotarySource }),
754
+ };
726
755
  admitted = await admitPublicRole(
727
756
  role,
728
757
  parsed,
729
758
  env,
730
- auditorTicket === undefined ? undefined : { assertedTicketNumber: auditorTicket },
759
+ auditorTicket === undefined && resolvedNotarySource === undefined ? undefined : admissionOverride,
731
760
  );
732
761
  } catch (error) {
733
762
  const rejected = usageExit(error, io);
@@ -764,7 +793,7 @@ export async function runPublicInstructionSeat(
764
793
  timedOut: false, code: null, stderr: "", thrown: error,
765
794
  }, seatAdapters(admitted, env), env.principalAuthority, io) as SeatRunResult;
766
795
  }
767
- if (outcome.admitted?.runDirectory.includes(`${sep}unbound${sep}runs${sep}`)) {
796
+ if (outcome.admitted !== undefined && isUnboundRunDirectory(outcome.admitted.runDirectory)) {
768
797
  await recordChildDiaristRun(admitted, outcome.admitted.runId);
769
798
  }
770
799
  if (outcome.failedWithoutEscalate !== undefined) {
@@ -970,7 +999,7 @@ async function auditSubmittedRole(
970
999
  || turn.terminal?.roleOutcome.kind !== "accepted") return turn;
971
1000
  const accepted = turn.terminal.roleOutcome.payloads?.at(-1);
972
1001
  if (accepted === undefined) throw new Error("accepted submission has no payload");
973
- const record = accepted !== null && typeof accepted === "object" && !Array.isArray(accepted)
1002
+ const record = isRecord(accepted)
974
1003
  ? accepted as Record<string, unknown> : undefined;
975
1004
  const status = admitted.role === "secretariat" ? record?.secretariatStatus : record?.status;
976
1005
  if (admitted.role === "secretariat" && status !== "converged" && status !== "escalate") {