@akagilnc/pi-workflow-roles 0.1.4321 → 0.1.4387

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 (71) hide show
  1. package/README.md +4 -1
  2. package/README.zh-CN.md +5 -1
  3. package/dist/acp-host/production-host.js +1308 -587
  4. package/dist/doctor-contracts.js +2 -2
  5. package/dist/engine-detour-tool.js +2 -8
  6. package/dist/gatekeeper-role.js +4 -19
  7. package/dist/headless-host/production-host.js +2613 -1892
  8. package/dist/merger-contracts.js +2 -2
  9. package/dist/migrate-book-topology.js +34 -9
  10. package/dist/notary-contracts.js +2 -2
  11. package/dist/package-contracts/auditor-output.js +2 -2
  12. package/dist/package-contracts/fixer-output.js +2 -2
  13. package/dist/package-contracts/gatekeeper-output.js +2 -2
  14. package/dist/package-contracts/navigator-output.js +2 -2
  15. package/dist/package-contracts/terminating-infrastructure.js +7 -2
  16. package/dist/package-contracts/terminating-tools.js +6 -0
  17. package/dist/packaged-role-registry.js +20 -1
  18. package/dist/public-cli/case-dossier-delivery.js +45 -28
  19. package/dist/public-cli/countersign-run.js +439 -0
  20. package/dist/public-cli/invocation.js +10 -0
  21. package/dist/public-cli/main.js +388 -101
  22. package/dist/public-cli/option-definitions.js +14 -0
  23. package/dist/public-cli/post-admission.js +44 -49
  24. package/dist/public-cli/run-lifecycle.js +13 -1
  25. package/dist/public-cli/settlement.js +14 -53
  26. package/dist/public-role-summons.js +14 -0
  27. package/dist/secretariat-contracts.js +8 -0
  28. package/dist/sitian-appender.js +21 -4
  29. package/extensions/role-runtime.ts +1 -0
  30. package/package.json +1 -1
  31. package/scripts/build-package.mjs +1 -0
  32. package/souls/secretariat.md +26 -0
  33. package/souls/ticket-law.md +9 -0
  34. package/src/collector-tool-schemas.ts +2 -2
  35. package/src/countersign-role.ts +2 -2
  36. package/src/diarist-role.ts +2 -2
  37. package/src/doctor-contracts.ts +2 -2
  38. package/src/engine-detour-tool.ts +3 -9
  39. package/src/gatekeeper-pass-envelope.ts +35 -2
  40. package/src/gatekeeper-role.ts +8 -31
  41. package/src/gleaner-left-role.ts +2 -2
  42. package/src/host-contracts.ts +2 -1
  43. package/src/inspector-role.ts +2 -2
  44. package/src/judge-role.ts +2 -2
  45. package/src/merger-contracts.ts +2 -2
  46. package/src/notary-contracts.ts +2 -2
  47. package/src/package-contracts/auditor-output.ts +2 -2
  48. package/src/package-contracts/fixer-output.ts +2 -2
  49. package/src/package-contracts/gatekeeper-output.ts +2 -2
  50. package/src/package-contracts/navigator-output.ts +2 -2
  51. package/src/package-contracts/terminating-infrastructure.ts +13 -3
  52. package/src/package-contracts/terminating-tools.ts +9 -1
  53. package/src/packaged-role-registry.ts +20 -1
  54. package/src/public-cli/case-dossier-delivery.ts +48 -29
  55. package/src/public-cli/cli.ts +10 -0
  56. package/src/public-cli/countersign-run.ts +29 -5
  57. package/src/public-cli/invocation.ts +28 -2
  58. package/src/public-cli/option-definitions.ts +17 -0
  59. package/src/public-cli/post-admission.ts +45 -58
  60. package/src/public-cli/run-lifecycle.ts +29 -2
  61. package/src/public-cli/secretariat-run.ts +266 -0
  62. package/src/public-cli/settlement.ts +31 -55
  63. package/src/public-cli/terminal.ts +2 -1
  64. package/src/public-role-summons.ts +23 -1
  65. package/src/reviewer-role.ts +2 -2
  66. package/src/role-runtime-dependencies.ts +1 -0
  67. package/src/role-runtime.ts +203 -18
  68. package/src/secretariat-contracts.ts +27 -0
  69. package/src/secretariat-role.ts +210 -0
  70. package/src/sitian-appender.ts +36 -3
  71. package/src/worker-role.ts +2 -2
@@ -8465,10 +8465,15 @@ var init_open_tool_schema = __esm({
8465
8465
  });
8466
8466
 
8467
8467
  // src/package-contracts/terminating-infrastructure.ts
8468
- function withInfrastructureFailureDeclaration(schema) {
8468
+ function withTerminatingOutputDeclarations(schema) {
8469
8469
  const baseProperties = schema.properties;
8470
8470
  const properties = {
8471
8471
  ...baseProperties ?? {},
8472
+ ...baseProperties?.ticketNumber === void 0 ? {
8473
+ ticketNumber: typebox_exports.Unknown({
8474
+ description: "\u53EF\u9009\u672C\u7968\u53F7\uFF1A\u5C1A\u672A\u7ED1\u5B9A\u65F6\u7531\u89D2\u8272\u5728\u65E2\u6709\u56DE\u6267\u4E2D\u7533\u62A5\uFF1B\u673A\u68B0\u5C42\u53EA\u8BB0\u5F55\u5408\u6CD5\u6B63\u6574\u6570\uFF0C\u4E0D\u4ECE\u6563\u6587\u63A8\u5BFC\u3001\u4E0D\u9A8C\u771F\u3002\u7F3A\u5931\u6216\u9519\u5F62\u4E0D\u62D2\u6536\u3002"
8475
+ })
8476
+ } : {},
8472
8477
  [INFRASTRUCTURE_FAILURE_DECLARATION_KEY]: infrastructureFailureDeclarationSchema.properties[INFRASTRUCTURE_FAILURE_DECLARATION_KEY]
8473
8478
  };
8474
8479
  const object = typebox_exports.Object(properties, { additionalProperties: true });
@@ -8525,7 +8530,7 @@ var init_gatekeeper_output = __esm({
8525
8530
  })
8526
8531
  })
8527
8532
  );
8528
- gatekeeperOutputSchema = withInfrastructureFailureDeclaration(
8533
+ gatekeeperOutputSchema = withTerminatingOutputDeclarations(
8529
8534
  gatekeeperDecisionSchema
8530
8535
  );
8531
8536
  }
@@ -8540,7 +8545,7 @@ var init_navigator_output = __esm({
8540
8545
  init_open_tool_schema();
8541
8546
  init_terminating_infrastructure();
8542
8547
  NAVIGATOR_OUTPUT_TOOL_NAME = "ak_navigator_output";
8543
- navigatorOutputSchema = withInfrastructureFailureDeclaration(
8548
+ navigatorOutputSchema = withTerminatingOutputDeclarations(
8544
8549
  openToolObject(
8545
8550
  typebox_exports.Object({
8546
8551
  status: typebox_exports.Unknown({
@@ -8616,7 +8621,7 @@ var init_fixer_output = __esm({
8616
8621
  typebox_exports.Object({ status: typebox_exports.Unknown({ description: FIXER_STATUS_DESCRIPTION }), report: typebox_exports.String({ description: "\u5982\u5B9E\u7ED3\u679C\u62A5\u544A" }), classResults: typebox_exports.Array(classResultSchema, { description: "\u5404\u7C7B\u62D2\u7EDD\u7ED3\u7B97" }) }),
8617
8622
  typebox_exports.Object({ status: typebox_exports.Unknown({ description: FIXER_STATUS_DESCRIPTION }), report: typebox_exports.String({ description: "\u5982\u5B9E\u7ED3\u679C\u62A5\u544A" }), classResults: typebox_exports.Array(classResultSchema, { description: "\u5404\u7C7B\u5B8C\u6210\u6216\u62D2\u7EDD\u7ED3\u7B97" }), testEvidence: typebox_exports.Optional(testEvidenceSchema) })
8618
8623
  ]);
8619
- fixerOutputSchema = withInfrastructureFailureDeclaration(
8624
+ fixerOutputSchema = withTerminatingOutputDeclarations(
8620
8625
  openToolObjectFromUnion(fixerOutputVariants)
8621
8626
  );
8622
8627
  }
@@ -14676,7 +14681,7 @@ var init_doctor_contracts = __esm({
14676
14681
  missingEvidence: typebox_exports.Array(typebox_exports.Object({ need: nonblank, targetKeys: evidenceIds }, { additionalProperties: true }), { description: "\u5982\u5B9E\u8BC1\u8BCD\u6240\u9700\u800C\u5C1A\u7F3A\u7684\u8BC1\u636E" })
14677
14682
  }, { additionalProperties: false, description: "\u8BC1\u636E\u4E0D\u8DB3\u4EE5\u652F\u6491\u5982\u5B9E\u6848\u8BC1\u8BCD" })
14678
14683
  ]);
14679
- doctorSubmissionSchema = withInfrastructureFailureDeclaration(
14684
+ doctorSubmissionSchema = withTerminatingOutputDeclarations(
14680
14685
  openToolObjectFromUnion(doctorSubmissionVariants)
14681
14686
  );
14682
14687
  doctorEvidenceReadSchema = typebox_exports.Object({ evidenceId: typebox_exports.String({ minLength: 1, description: "\u5F85\u8BFB\u7559\u5B58\u8BC1\u636E\u6807\u8BC6" }), offset: typebox_exports.Optional(typebox_exports.Integer({ minimum: 0, description: "\u8D77\u59CB\u5B57\u8282\u504F\u79FB\uFF08\u4ECE 0 \u8BA1\uFF09" })), limit: typebox_exports.Optional(typebox_exports.Integer({ minimum: 1, description: "\u8FD4\u56DE\u5B57\u8282\u6570\uFF08\u65E0\u4E0A\u9650\uFF09" })) }, { additionalProperties: true });
@@ -14748,7 +14753,7 @@ var init_merger_contracts = __esm({
14748
14753
  typebox_exports.Object({ status: typebox_exports.Unknown({ description: MERGER_STATUS_DESCRIPTION }), attemptId: typebox_exports.String({ description: "\u5DF2\u53D7\u7406\u5408\u5E76 attempt \u8EAB\u4EFD" }), report: typebox_exports.String({ description: "\u5982\u5B9E\u7ED3\u679C\u62A5\u544A" }), mergeCommitId: typebox_exports.String({ description: "\u5B8C\u6210\u5408\u5E76 commit object ID" }) }, { additionalProperties: false }),
14749
14754
  typebox_exports.Object({ status: typebox_exports.Unknown({ description: MERGER_STATUS_DESCRIPTION }), attemptId: typebox_exports.String({ description: "\u5DF2\u53D7\u7406\u5408\u5E76 attempt \u8EAB\u4EFD" }), diagnosis: typebox_exports.String({ description: "\u5408\u5E76\u65E0\u6CD5\u6216\u4E0D\u5E94\u7531\u672C\u5E2D\u5B8C\u6210\u7684\u539F\u56E0\uFF08\u542B\u65E0\u8FDB\u884C\u4E2D\u5408\u5E76\u3001\u65E0\u6D3B\u53EF\u5E72\u3001\u9700\u65B0\u7684\u4EA7\u54C1/\u6743\u529B\u51B3\u5B9A\uFF09" }), report: typebox_exports.String({ description: "\u5982\u5B9E\u7ED3\u679C\u62A5\u544A" }) }, { additionalProperties: false })
14750
14755
  ]);
14751
- mergerOutputSchema = withInfrastructureFailureDeclaration(openToolObjectFromUnion(mergerOutputVariants));
14756
+ mergerOutputSchema = withTerminatingOutputDeclarations(openToolObjectFromUnion(mergerOutputVariants));
14752
14757
  MERGER_OUTPUT_TOOL_NAME = "ak_merger_output";
14753
14758
  record = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
14754
14759
  blank = (v) => typeof v !== "string" || v.trim().length === 0;
@@ -14773,7 +14778,7 @@ var init_notary_contracts = __esm({
14773
14778
  init_terminating_infrastructure();
14774
14779
  NOTARY_OUTPUT_TOOL_NAME = "ak_notary_output";
14775
14780
  NOTARY_FIXED_KICKOFF = "\u7B26\u5B9D\u90CE\u6848\u5377\u5DF2\u53D7\u7406\uFF1B\u6765\u6E90 run \u5B9A\u4F4D\u89C1\u4F1A\u8BDD\u6750\u6599\u3002";
14776
- notaryOutputSchema = withInfrastructureFailureDeclaration(
14781
+ notaryOutputSchema = withTerminatingOutputDeclarations(
14777
14782
  openToolObject(
14778
14783
  typebox_exports.Object({
14779
14784
  status: typebox_exports.Unknown({
@@ -14827,7 +14832,7 @@ var init_auditor_output = __esm({
14827
14832
  init_open_tool_schema();
14828
14833
  init_terminating_infrastructure();
14829
14834
  AUDITOR_OUTPUT_TOOL_NAME = "ak_auditor_output";
14830
- auditorOutputSchema = withInfrastructureFailureDeclaration(
14835
+ auditorOutputSchema = withTerminatingOutputDeclarations(
14831
14836
  openToolObject(
14832
14837
  typebox_exports.Object({
14833
14838
  status: typebox_exports.Unknown({
@@ -14941,6 +14946,15 @@ var init_diarist_contracts = __esm({
14941
14946
  }
14942
14947
  });
14943
14948
 
14949
+ // src/secretariat-contracts.ts
14950
+ var SECRETARIAT_OUTPUT_TOOL_NAME;
14951
+ var init_secretariat_contracts = __esm({
14952
+ "src/secretariat-contracts.ts"() {
14953
+ "use strict";
14954
+ SECRETARIAT_OUTPUT_TOOL_NAME = "ak_secretariat_output";
14955
+ }
14956
+ });
14957
+
14944
14958
  // src/packaged-role-registry.ts
14945
14959
  function packagedRoleMetadata(role) {
14946
14960
  return PACKAGED_ROLE_REGISTRY.find((entry) => entry.role === role);
@@ -14969,10 +14983,12 @@ var init_packaged_role_registry = __esm({
14969
14983
  init_inspector_contracts();
14970
14984
  init_auditor_output();
14971
14985
  init_diarist_contracts();
14986
+ init_secretariat_contracts();
14972
14987
  NOTARY_SESSION_MATERIALS = [
14973
14988
  "CLAUDE.md",
14974
14989
  "souls/notary.md",
14975
14990
  "souls/audit-law.md",
14991
+ "souls/ticket-law.md",
14976
14992
  "souls/gate-output-guide.md"
14977
14993
  ];
14978
14994
  INSPECTOR_SESSION_MATERIALS = [
@@ -15095,7 +15111,24 @@ var init_packaged_role_registry = __esm({
15095
15111
  inputFlag: void 0,
15096
15112
  phaseFlag: void 0,
15097
15113
  activationStage: "load-and-install",
15098
- sessionMaterials: ["CLAUDE.md", "souls/countersign.md"]
15114
+ // #924: 公用《票面法》三席同装
15115
+ sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md"]
15116
+ },
15117
+ {
15118
+ role: "secretariat",
15119
+ phases: [null],
15120
+ outputTool: SECRETARIAT_OUTPUT_TOOL_NAME,
15121
+ inputFlag: void 0,
15122
+ phaseFlag: void 0,
15123
+ activationStage: "load-and-install",
15124
+ // #924: owner-finalized Soul + 票面法 + 给事中/符宝郎行为指南
15125
+ sessionMaterials: [
15126
+ "CLAUDE.md",
15127
+ "souls/secretariat.md",
15128
+ "souls/ticket-law.md",
15129
+ "souls/countersign.md",
15130
+ "souls/notary.md"
15131
+ ]
15099
15132
  },
15100
15133
  {
15101
15134
  role: "gleaner-left",
@@ -16360,25 +16393,40 @@ function resolveSitianVolumeCategory(kind) {
16360
16393
  }
16361
16394
  return kind;
16362
16395
  }
16396
+ function ticketProvenanceUnderBookPaths(ledgerHome, bookKey, ticketId) {
16397
+ const sessionDir = join9(activationBookDirectory(ledgerHome, bookKey), ticketId);
16398
+ return { sessionDir, recordFile: join9(sessionDir, SITIAN_RECORDS_LEAF) };
16399
+ }
16363
16400
  function resolveSitianRecordPathInLedger(input, ledgerHome) {
16364
16401
  const category = resolveSitianVolumeCategory(input.kind);
16365
16402
  const ticketNumber = category === "ticket-provenance" ? typeof input.subject === "string" && /^[1-9][0-9]*$/.test(input.subject) ? input.subject : typeof input.subject === "object" && typeof input.subject.ticketNumber === "number" && Number.isSafeInteger(input.subject.ticketNumber) && input.subject.ticketNumber > 0 ? String(input.subject.ticketNumber) : void 0 : void 0;
16366
16403
  let sessionDir;
16404
+ let recordFile;
16367
16405
  if (ticketNumber !== void 0) {
16368
- const bookDir = activationBookDirectory(
16406
+ const paths = ticketProvenanceUnderBookPaths(
16369
16407
  ledgerHome,
16370
- resolveBookKeyFromGit(input.cwd ?? process.cwd())
16408
+ resolveBookKeyFromGit(input.cwd ?? process.cwd()),
16409
+ ticketNumber
16371
16410
  );
16372
- sessionDir = join9(bookDir, ticketNumber);
16411
+ sessionDir = paths.sessionDir;
16412
+ recordFile = paths.recordFile;
16373
16413
  } else {
16374
16414
  if (input.sessionParent === void 0 || input.sessionParent.length === 0 || !physicallyContainedIn(ledgerHome, input.sessionParent)) {
16375
16415
  throw new Error("Sitian record ownership requires a parent session inside the ledger home");
16376
16416
  }
16377
16417
  sessionDir = join9(dirname5(input.sessionParent), category);
16418
+ recordFile = join9(sessionDir, SITIAN_RECORDS_LEAF);
16378
16419
  }
16379
- const recordFile = join9(sessionDir, "records.jsonl");
16380
16420
  return { sessionDir, recordFile, ledgerHome };
16381
16421
  }
16422
+ function projectTicketRecordsPathShape() {
16423
+ const { recordFile } = ticketProvenanceUnderBookPaths(
16424
+ join9("~", ".ak-roles"),
16425
+ "<\u7C3F>",
16426
+ "<\u7968\u53F7>"
16427
+ );
16428
+ return recordFile.replace(/\\/g, "/");
16429
+ }
16382
16430
  function resolveSitianRecordPath(input) {
16383
16431
  const ledgerHome = input.home !== void 0 && input.home.length > 0 ? resolveActivationLedgerHome(input.home) : resolveActivationLedgerHomeForPath(input.sessionParent);
16384
16432
  return resolveSitianRecordPathInLedger(input, ledgerHome);
@@ -16415,7 +16463,7 @@ function appendSitianRecord(input) {
16415
16463
  );
16416
16464
  }
16417
16465
  }
16418
- var S4_SUBMISSION_LEDGER_KINDS;
16466
+ var S4_SUBMISSION_LEDGER_KINDS, SITIAN_RECORDS_LEAF;
16419
16467
  var init_sitian_appender = __esm({
16420
16468
  "src/sitian-appender.ts"() {
16421
16469
  "use strict";
@@ -16429,6 +16477,7 @@ var init_sitian_appender = __esm({
16429
16477
  "sealed",
16430
16478
  "post-seal-anomaly"
16431
16479
  ]);
16480
+ SITIAN_RECORDS_LEAF = "records.jsonl";
16432
16481
  }
16433
16482
  });
16434
16483
 
@@ -17301,6 +17350,8 @@ function acceptedFacts(toolName, details) {
17301
17350
  return typeof record4.judgeStatus === "string" ? { status: record4.judgeStatus } : {};
17302
17351
  case COUNTERSIGN_OUTPUT_TOOL_NAME:
17303
17352
  return typeof record4.countersignStatus === "string" ? { status: record4.countersignStatus } : {};
17353
+ case SECRETARIAT_OUTPUT_TOOL_NAME:
17354
+ return typeof record4.secretariatStatus === "string" ? { status: record4.secretariatStatus } : {};
17304
17355
  case MERGER_OUTPUT_TOOL_NAME: {
17305
17356
  const status = typeof record4.status === "string" ? record4.status : void 0;
17306
17357
  return {
@@ -17332,6 +17383,7 @@ var init_terminating_tools = __esm({
17332
17383
  init_gleaner_left_contracts();
17333
17384
  init_inspector_contracts();
17334
17385
  init_diarist_contracts();
17386
+ init_secretariat_contracts();
17335
17387
  init_worker_output();
17336
17388
  TERMINATING_TOOL_NAMES = [
17337
17389
  CODER_OUTPUT_TOOL_NAME,
@@ -17348,7 +17400,8 @@ var init_terminating_tools = __esm({
17348
17400
  GATEKEEPER_OUTPUT_TOOL_NAME,
17349
17401
  NAVIGATOR_OUTPUT_TOOL_NAME,
17350
17402
  AUDITOR_OUTPUT_TOOL_NAME,
17351
- DIARIST_OUTPUT_TOOL_NAME
17403
+ DIARIST_OUTPUT_TOOL_NAME,
17404
+ SECRETARIAT_OUTPUT_TOOL_NAME
17352
17405
  ];
17353
17406
  AcceptedDetailsContractError = class extends CorrectableSubmissionError {
17354
17407
  code = "accepted_details_contract";
@@ -18203,7 +18256,7 @@ async function readRoleRunStateDisk(runDirectory) {
18203
18256
  if (typeof record4.runId !== "string" || record4.runId.trim() === "") {
18204
18257
  return void 0;
18205
18258
  }
18206
- if (record4.role !== "judge" && record4.role !== "coder" && record4.role !== "fixer" && record4.role !== "collector" && record4.role !== "doctor" && record4.role !== "reviewer" && record4.role !== "merger" && record4.role !== "notary" && record4.role !== "countersign" && record4.role !== "gleaner-left" && record4.role !== "inspector" && record4.role !== "gatekeeper" && record4.role !== "navigator" && record4.role !== "auditor" && record4.role !== "diarist") {
18259
+ if (record4.role !== "judge" && record4.role !== "coder" && record4.role !== "fixer" && record4.role !== "collector" && record4.role !== "doctor" && record4.role !== "reviewer" && record4.role !== "merger" && record4.role !== "notary" && record4.role !== "countersign" && record4.role !== "gleaner-left" && record4.role !== "inspector" && record4.role !== "gatekeeper" && record4.role !== "navigator" && record4.role !== "auditor" && record4.role !== "diarist" && record4.role !== "secretariat") {
18207
18260
  return void 0;
18208
18261
  }
18209
18262
  if (record4.state !== "admitted" && record4.state !== "running" && record4.state !== "resumable" && record4.state !== "terminal") {
@@ -19170,6 +19223,19 @@ async function loadResumableDiaristRun(home, runId, authority) {
19170
19223
  };
19171
19224
  return seatLoadedResult(loaded, admitted);
19172
19225
  }
19226
+ async function loadResumableSecretariatRun(home, runId, authority) {
19227
+ const loaded = await loadResumableRunRecord(home, runId, authority);
19228
+ if (loaded.run.role !== "secretariat") {
19229
+ throw new CliUsageError(
19230
+ `role run ${runId} belongs to ${loaded.run.role}, not secretariat`
19231
+ );
19232
+ }
19233
+ const admitted = {
19234
+ role: "secretariat",
19235
+ ...resumedBaseAdmitted(loaded)
19236
+ };
19237
+ return seatLoadedResult(loaded, admitted);
19238
+ }
19173
19239
  async function loadResumableMergerRun(home, runId, authority) {
19174
19240
  const loaded = await loadResumableRunRecord(home, runId, authority);
19175
19241
  if (loaded.run.role !== "merger") {
@@ -19723,7 +19789,7 @@ function renderHumanOwnerOptionLines(owner, locale2 = "en") {
19723
19789
  }
19724
19790
  return lines;
19725
19791
  }
19726
- var ANALYST_REQUIRE_ANY_OF, ANALYST_DEFAULT_MODE, REJECTED_PUBLIC_SPELLINGS, GLOBAL_OPTIONS, SHARED_PROJECT_SEMANTICS, SHARED_ATTACH_SEMANTICS, JUDGE_OPTIONS, GLEANER_LEFT_OPTIONS, INSPECTOR_OPTIONS, GATEKEEPER_OPTIONS, NAVIGATOR_OPTIONS, AUDITOR_OPTIONS, COUNTERSIGN_OPTIONS, DIARIST_OPTIONS, CODER_OPTIONS, FIXER_OPTIONS, REVIEWER_OPTIONS, COLLECTOR_OPTIONS, DOCTOR_OPTIONS, NOTARY_OPTIONS, MERGER_OPTIONS, ANALYST_OPTIONS, PUBLIC_OPTION_TABLE, PUBLIC_NAVIGATOR_HELP_NOTE, TOP_LEVEL_HELP, ROLE_COMMAND_HELP, SUPPORT_COMMAND_HELP, PUBLIC_COMMAND_HELP;
19792
+ var ANALYST_REQUIRE_ANY_OF, ANALYST_DEFAULT_MODE, REJECTED_PUBLIC_SPELLINGS, GLOBAL_OPTIONS, SHARED_PROJECT_SEMANTICS, SHARED_ATTACH_SEMANTICS, JUDGE_OPTIONS, GLEANER_LEFT_OPTIONS, INSPECTOR_OPTIONS, GATEKEEPER_OPTIONS, NAVIGATOR_OPTIONS, AUDITOR_OPTIONS, COUNTERSIGN_OPTIONS, DIARIST_OPTIONS, SECRETARIAT_OPTIONS, CODER_OPTIONS, FIXER_OPTIONS, REVIEWER_OPTIONS, COLLECTOR_OPTIONS, DOCTOR_OPTIONS, NOTARY_OPTIONS, MERGER_OPTIONS, ANALYST_OPTIONS, PUBLIC_OPTION_TABLE, PUBLIC_NAVIGATOR_HELP_NOTE, TOP_LEVEL_HELP, ROLE_COMMAND_HELP, SUPPORT_COMMAND_HELP, PUBLIC_COMMAND_HELP;
19727
19793
  var init_option_definitions = __esm({
19728
19794
  "src/public-cli/option-definitions.ts"() {
19729
19795
  "use strict";
@@ -19936,6 +20002,10 @@ var init_option_definitions = __esm({
19936
20002
  bindOwner("diarist", SHARED_PROJECT_SEMANTICS),
19937
20003
  bindOwner("diarist", SHARED_ATTACH_SEMANTICS)
19938
20004
  ];
20005
+ SECRETARIAT_OPTIONS = [
20006
+ bindOwner("secretariat", SHARED_PROJECT_SEMANTICS),
20007
+ bindOwner("secretariat", SHARED_ATTACH_SEMANTICS)
20008
+ ];
19939
20009
  CODER_OPTIONS = [
19940
20010
  {
19941
20011
  id: "phase",
@@ -20298,6 +20368,7 @@ var init_option_definitions = __esm({
20298
20368
  navigator: NAVIGATOR_OPTIONS,
20299
20369
  auditor: AUDITOR_OPTIONS,
20300
20370
  diarist: DIARIST_OPTIONS,
20371
+ secretariat: SECRETARIAT_OPTIONS,
20301
20372
  analyst: ANALYST_OPTIONS
20302
20373
  };
20303
20374
  PUBLIC_NAVIGATOR_HELP_NOTE = "Navigator also attends automatically on top-level public entry legs; that sidecar is unchanged by direct `ak-role navigator` calls.";
@@ -20435,6 +20506,14 @@ var init_option_definitions = __esm({
20435
20506
  'ak-role diarist --attach ./design.md "\u8865\u5F55\u672C\u8F6E\u8BBE\u8BA1\u4FEE\u8BA2\u3002"'
20436
20507
  ]
20437
20508
  },
20509
+ secretariat: {
20510
+ command: "secretariat",
20511
+ summary: "Secretariat (\u4E2D\u4E66\u7701): rewrite ticket per \u7968\u9762\u6CD5 and drive countersign to converged or escalate.",
20512
+ usage: ["ak-role secretariat [options] [instruction]"],
20513
+ examples: [
20514
+ 'ak-role secretariat "\u6574\u7406 #924 \u7968\u9762\u5E76\u9001\u5EAD\u3002"'
20515
+ ]
20516
+ },
20438
20517
  notary: {
20439
20518
  command: "notary",
20440
20519
  summary: "Direct Notary document check (quote fidelity + ticket alignment); zero prompt/attachment.",
@@ -20545,6 +20624,7 @@ __export(invocation_exports, {
20545
20624
  admitNavigatorInvocation: () => admitNavigatorInvocation,
20546
20625
  admitNotaryInvocation: () => admitNotaryInvocation,
20547
20626
  admitReviewerInvocation: () => admitReviewerInvocation,
20627
+ admitSecretariatInvocation: () => admitSecretariatInvocation,
20548
20628
  bindAdmittedTicketNumber: () => bindAdmittedTicketNumber,
20549
20629
  bindCourtTicketNumbersOnAdmitted: () => bindCourtTicketNumbersOnAdmitted,
20550
20630
  bindTicketNumberOnRunDirectory: () => bindTicketNumberOnRunDirectory,
@@ -20560,6 +20640,7 @@ __export(invocation_exports, {
20560
20640
  buildMergerTransportPrompt: () => buildMergerTransportPrompt,
20561
20641
  buildNotaryTransportPrompt: () => buildNotaryTransportPrompt,
20562
20642
  buildReviewerTransportPrompt: () => buildReviewerTransportPrompt,
20643
+ buildSecretariatTransportPrompt: () => buildSecretariatTransportPrompt,
20563
20644
  deriveMergerEnvelopeFromActiveMerge: () => deriveMergerEnvelopeFromActiveMerge,
20564
20645
  ensureRunArtifactsDir: () => ensureRunArtifactsDir,
20565
20646
  freezeAttachmentsIntoRun: () => freezeAttachmentsIntoRun,
@@ -20587,6 +20668,7 @@ __export(invocation_exports, {
20587
20668
  parseNotaryArgv: () => parseNotaryArgv,
20588
20669
  parsePositiveTicketNumber: () => parsePositiveTicketNumber,
20589
20670
  parseReviewerArgv: () => parseReviewerArgv,
20671
+ parseSecretariatArgv: () => parseSecretariatArgv,
20590
20672
  persistAdmittedSourceRunPath: () => persistAdmittedSourceRunPath,
20591
20673
  recordEffectiveInvocationModel: () => recordEffectiveInvocationModel,
20592
20674
  recordLaunchedPiIdentity: () => recordLaunchedPiIdentity,
@@ -21016,6 +21098,9 @@ function parseAuditorArgv(args) {
21016
21098
  function parseDiaristArgv(args) {
21017
21099
  return parseInstructionArgv(args, "diarist");
21018
21100
  }
21101
+ function parseSecretariatArgv(args) {
21102
+ return parseInstructionArgv(args, "secretariat");
21103
+ }
21019
21104
  function parseCoderArgv(args) {
21020
21105
  const attachmentPaths = [];
21021
21106
  let project;
@@ -21249,6 +21334,9 @@ async function admitAuditorInvocation(options) {
21249
21334
  async function admitDiaristInvocation(options) {
21250
21335
  return admitStandardMaterialInvocation("diarist", options);
21251
21336
  }
21337
+ async function admitSecretariatInvocation(options) {
21338
+ return admitStandardMaterialInvocation("secretariat", options);
21339
+ }
21252
21340
  function buildInstructionTransportPrompt(admitted, engineMaterial) {
21253
21341
  const lines = [admitted.instructionEmpty ? "" : admitted.instruction];
21254
21342
  if (admitted.attachments.length > 0) {
@@ -21263,6 +21351,9 @@ function buildInstructionTransportPrompt(admitted, engineMaterial) {
21263
21351
  function buildJudgeTransportPrompt(admitted, engineMaterial) {
21264
21352
  return buildInstructionTransportPrompt(admitted, engineMaterial);
21265
21353
  }
21354
+ function buildSecretariatTransportPrompt(admitted, engineMaterial) {
21355
+ return buildInstructionTransportPrompt(admitted, engineMaterial);
21356
+ }
21266
21357
  function buildInspectorTransportPrompt(admitted, engineMaterial) {
21267
21358
  return buildInstructionTransportPrompt(admitted, engineMaterial);
21268
21359
  }
@@ -24871,7 +24962,6 @@ __export(settlement_exports, {
24871
24962
  publishMergerArtifacts: () => publishMergerArtifacts,
24872
24963
  publishReviewerArtifacts: () => publishReviewerArtifacts,
24873
24964
  raceNavigatorGrace: () => raceNavigatorGrace,
24874
- readBoundAuditorKnownFailure: () => readBoundAuditorKnownFailure,
24875
24965
  readBoundEvidenceChildKnownFailure: () => readBoundEvidenceChildKnownFailure,
24876
24966
  readCollectorInfrastructureFailure: () => readCollectorInfrastructureFailure,
24877
24967
  readEngineDetourInfrastructureFailure: () => readEngineDetourInfrastructureFailure,
@@ -24909,6 +24999,7 @@ __export(settlement_exports, {
24909
24999
  trySettleNavigatorTerminalResult: () => trySettleNavigatorTerminalResult,
24910
25000
  trySettleNotaryTerminalResult: () => trySettleNotaryTerminalResult,
24911
25001
  trySettleReviewerTerminalResult: () => trySettleReviewerTerminalResult,
25002
+ trySettleSecretariatTerminalResult: () => trySettleSecretariatTerminalResult,
24912
25003
  withSubmissions: () => withSubmissions
24913
25004
  });
24914
25005
  import { randomUUID as randomUUID4 } from "node:crypto";
@@ -25415,32 +25506,6 @@ async function loadBoundAuditorVolumes(sessionFile) {
25415
25506
  }
25416
25507
  const parentId = parentEntries.find((entry) => entry.type === "session")?.id;
25417
25508
  if (parentId === void 0) return void 0;
25418
- const isResumeEnvelopeBytes = (value) => {
25419
- if (typeof value !== "string") return false;
25420
- if (value.length === 0) return true;
25421
- const nl = value.indexOf("\n");
25422
- const firstLine = nl === -1 ? value : value.slice(0, nl);
25423
- const body = firstLine === "" && nl !== -1 ? value.slice(nl + 1) : value;
25424
- return body.startsWith("\u672C\u6B21\u914D\u7F6E\u7684\u52B3\u52A1\u5F15\u64CE\u53CA\u5176\u624B\u518C\uFF1A") || body.startsWith("- engine:");
25425
- };
25426
- const isResumeEnvelope = (msg) => {
25427
- if (!isRecord10(msg) || msg.role !== "user") return false;
25428
- const text = typeof msg.text === "string" ? msg.text : typeof msg.content === "string" ? msg.content : void 0;
25429
- if (isResumeEnvelopeBytes(text)) return true;
25430
- const content = msg.content;
25431
- if (Array.isArray(content)) {
25432
- return content.some((p) => isRecord10(p) && (isResumeEnvelopeBytes(p.text) || isResumeEnvelopeBytes(p.content)));
25433
- }
25434
- return false;
25435
- };
25436
- let latestParentUserIndex = -1;
25437
- for (let i = parentEntries.length - 1; i >= 0; i -= 1) {
25438
- const entry = parentEntries[i];
25439
- if (entry?.type !== "message" || entry.message?.role !== "user") continue;
25440
- if (isResumeEnvelope(entry.message)) continue;
25441
- latestParentUserIndex = i;
25442
- break;
25443
- }
25444
25509
  const childDirectories = [join25(dirname13(sessionFile), "auditor-roles")];
25445
25510
  const valid = [];
25446
25511
  let sawAnyDirectory = false;
@@ -25477,12 +25542,9 @@ async function loadBoundAuditorVolumes(sessionFile) {
25477
25542
  for (const { entry: bindingEntry, start, end } of bindingPasses) {
25478
25543
  const bindingParent = bindingEntry !== void 0 && isRecord10(bindingEntry.data) && isRecord10(bindingEntry.data.parent) ? bindingEntry.data.parent : void 0;
25479
25544
  const attemptEntryId = typeof bindingParent?.attemptEntryId === "string" ? bindingParent.attemptEntryId : void 0;
25480
- const attemptEntryIndex = attemptEntryId === void 0 ? -1 : parentEntries.findIndex((entry) => entry.id === attemptEntryId);
25481
25545
  const boundSessionFile = typeof bindingParent?.sessionFile === "string" ? bindingParent.sessionFile : typeof header.parentSession === "string" ? header.parentSession : void 0;
25482
25546
  if (boundSessionFile !== sessionFile) continue;
25483
- if (bindingParent !== void 0 && (bindingParent.sessionId !== parentId || attemptEntryIndex < latestParentUserIndex)) {
25484
- continue;
25485
- }
25547
+ if (bindingParent !== void 0 && bindingParent.sessionId !== parentId) continue;
25486
25548
  if (bindingParent === void 0 && header.parentSession !== sessionFile) continue;
25487
25549
  valid.push({
25488
25550
  entries: entries.slice(start, end),
@@ -25537,11 +25599,6 @@ function providerStopFallbackFromAuditorVolumes(volumes) {
25537
25599
  }
25538
25600
  return void 0;
25539
25601
  }
25540
- async function readBoundAuditorKnownFailure(sessionFile) {
25541
- const volumes = await loadBoundAuditorVolumes(sessionFile);
25542
- if (volumes === void 0) return void 0;
25543
- return complianceFailureFromAuditorVolumes(volumes) ?? providerStopFallbackFromAuditorVolumes(volumes);
25544
- }
25545
25602
  async function readBoundAuditorComplianceFailure(sessionFile) {
25546
25603
  const volumes = await loadBoundAuditorVolumes(sessionFile);
25547
25604
  if (volumes === void 0) return void 0;
@@ -26781,6 +26838,15 @@ async function settleLawfulDiaristTerminalResult(admitted, authority, scope) {
26781
26838
  async function trySettleDiaristTerminalResult(admitted, authority, scope) {
26782
26839
  return settleLawfulDiaristTerminalResult(admitted, authority, scope);
26783
26840
  }
26841
+ async function settleLawfulSecretariatTerminalResult(admitted, authority, scope) {
26842
+ return settleLawfulSeatAcceptedTerminalResult(admitted, authority, {
26843
+ role: "secretariat",
26844
+ toolName: SECRETARIAT_OUTPUT_TOOL_NAME
26845
+ }, scope);
26846
+ }
26847
+ async function trySettleSecretariatTerminalResult(admitted, authority, scope) {
26848
+ return settleLawfulSecretariatTerminalResult(admitted, authority, scope);
26849
+ }
26784
26850
  async function settleLawfulInspectorTerminalResult(admitted, authority, scope) {
26785
26851
  return settleLawfulSeatAcceptedTerminalResult(admitted, authority, {
26786
26852
  role: "inspector",
@@ -27407,6 +27473,7 @@ var init_settlement = __esm({
27407
27473
  init_countersign_contracts();
27408
27474
  init_gleaner_left_contracts();
27409
27475
  init_diarist_contracts();
27476
+ init_secretariat_contracts();
27410
27477
  init_inspector_contracts();
27411
27478
  init_gatekeeper_output();
27412
27479
  init_navigator_output();
@@ -27568,11 +27635,14 @@ var init_ticket_provenance = __esm({
27568
27635
  import { mkdtemp, readFile as readFile19, rm, writeFile as writeFile8 } from "node:fs/promises";
27569
27636
  import { tmpdir } from "node:os";
27570
27637
  import { join as join27 } from "node:path";
27571
- function describeDossierFile(path) {
27572
- return path;
27573
- }
27574
27638
  async function projectCaseDossierPointerSection(input) {
27575
- if (input.ticketNumber === void 0) return void 0;
27639
+ if (input.ticketNumber === void 0) {
27640
+ return [
27641
+ UNBOUND_DOSSIER_PATH_HEADING,
27642
+ "",
27643
+ `\u8BB0\u5F55\u5377\u5B97\uFF1A${projectTicketRecordsPathShape()}`
27644
+ ].join("\n");
27645
+ }
27576
27646
  const volume = resolveTicketProvenanceVolume(
27577
27647
  input.ticketNumber,
27578
27648
  input.projectRoot,
@@ -27582,7 +27652,7 @@ async function projectCaseDossierPointerSection(input) {
27582
27652
  CASE_DOSSIER_SECTION_HEADING,
27583
27653
  "",
27584
27654
  `\u7968\u53F7\uFF1A#${input.ticketNumber}`,
27585
- `\u8BB0\u5F55\u5377\u5B97\uFF1A${describeDossierFile(volume.recordFile)}`
27655
+ `\u8BB0\u5F55\u5377\u5B97\uFF1A${volume.recordFile}`
27586
27656
  ].join("\n");
27587
27657
  }
27588
27658
  async function deliverCaseDossierAsAttachment(input) {
@@ -27591,7 +27661,6 @@ async function deliverCaseDossierAsAttachment(input) {
27591
27661
  projectRoot: input.projectRoot,
27592
27662
  home: input.home
27593
27663
  });
27594
- if (section === void 0) return void 0;
27595
27664
  const stagingDir = await mkdtemp(join27(tmpdir(), "ak-case-dossier-"));
27596
27665
  try {
27597
27666
  const stagingPath = join27(stagingDir, CASE_DOSSIER_ATTACH_FILE);
@@ -27606,13 +27675,15 @@ async function deliverCaseDossierAsAttachment(input) {
27606
27675
  await rm(stagingDir, { recursive: true, force: true });
27607
27676
  }
27608
27677
  }
27609
- var CASE_DOSSIER_SECTION_HEADING, CASE_DOSSIER_ATTACH_KEY, CASE_DOSSIER_ATTACH_FILE;
27678
+ var CASE_DOSSIER_SECTION_HEADING, UNBOUND_DOSSIER_PATH_HEADING, CASE_DOSSIER_ATTACH_KEY, CASE_DOSSIER_ATTACH_FILE;
27610
27679
  var init_case_dossier_delivery = __esm({
27611
27680
  "src/public-cli/case-dossier-delivery.ts"() {
27612
27681
  "use strict";
27682
+ init_sitian_facade();
27613
27683
  init_ticket_provenance();
27614
27684
  init_invocation();
27615
27685
  CASE_DOSSIER_SECTION_HEADING = "## \u672C\u7968\u8D77\u5C45\u5F55\uFF08\u7CFB\u7EDF\u968F\u6848\u63D0\u4F9B\uFF09";
27686
+ UNBOUND_DOSSIER_PATH_HEADING = "## \u8D77\u5C45\u5F55\u8DEF\u5F84\uFF08\u7CFB\u7EDF\u968F\u6848\u63D0\u4F9B\uFF09";
27616
27687
  CASE_DOSSIER_ATTACH_KEY = "case-dossier";
27617
27688
  CASE_DOSSIER_ATTACH_FILE = "case-dossier-pointer.md";
27618
27689
  }
@@ -28111,12 +28182,6 @@ function describeCaughtError(error) {
28111
28182
  }
28112
28183
  return { message: String(error) };
28113
28184
  }
28114
- function appendContinuationSection(continuation, section) {
28115
- const prompt = `${continuation.prompt}
28116
-
28117
- ${section}`;
28118
- return continuation.kind === "initial" ? { kind: "initial", prompt } : { kind: "resume", prompt };
28119
- }
28120
28185
  function isStationChildOfficerDialogue(role, env) {
28121
28186
  return env.stationChild === true && isOfficerReviewSeat(role);
28122
28187
  }
@@ -28278,10 +28343,24 @@ async function dispatchPostAdmissionTurn(input) {
28278
28343
  const shouldPresent = adapters.shouldPresentSettled ?? ((terminal) => isLawfulTypedTerminalOutcome(terminal.roleOutcome));
28279
28344
  let afterDispatchApplied = false;
28280
28345
  const finishAfterTurn = async (result2) => {
28281
- if (adapters.afterDispatch === void 0 || afterDispatchApplied) return result2;
28346
+ if (afterDispatchApplied) return result2;
28282
28347
  afterDispatchApplied = true;
28283
28348
  try {
28284
- await adapters.afterDispatch(admitted, lease);
28349
+ if (admitted.ticketNumber === void 0) {
28350
+ const rows = await readRecordedSubmissionRows(
28351
+ admitted.projectRoot,
28352
+ admitted.runId,
28353
+ { home: homeFromRunDirectory(admitted.runDirectory), sessionParent: join30(admitted.runDirectory, "session", "session.jsonl") }
28354
+ );
28355
+ const asserted = rows.filter((row) => row.kind === "accepted" && row.role === admitted.role).map((row) => row.accepted).find((payload) => {
28356
+ if (payload === null || typeof payload !== "object" || Array.isArray(payload)) return false;
28357
+ const value = payload.ticketNumber;
28358
+ return typeof value === "number" && Number.isSafeInteger(value) && value > 0;
28359
+ });
28360
+ const ticketNumber = asserted === void 0 ? void 0 : asserted.ticketNumber;
28361
+ if (ticketNumber !== void 0) await bindAdmittedTicketNumber(admitted, ticketNumber);
28362
+ }
28363
+ if (adapters.afterDispatch !== void 0) await adapters.afterDispatch(admitted, lease);
28285
28364
  return result2;
28286
28365
  } catch (error) {
28287
28366
  const primaryFailure = result2.terminal !== void 0 && !isLawfulTypedTerminalOutcome(result2.terminal.roleOutcome);
@@ -28396,29 +28475,12 @@ async function dispatchPostAdmissionTurn(input) {
28396
28475
  if (typeof liveHost === "string" && liveHost.trim() !== "") {
28397
28476
  turnRequest = { ...turnRequest, host: liveHost.trim() };
28398
28477
  }
28399
- if (isStationChildOfficerDialogue(admitted.role, env)) {
28400
- await deliverCaseDossierAsAttachment({
28401
- ticketNumber: admitted.ticketNumber,
28402
- projectRoot: admitted.projectRoot,
28403
- home: env.home,
28404
- runDirectory: admitted.runDirectory
28405
- });
28406
- } else {
28407
- const dossierSection = await projectCaseDossierPointerSection({
28408
- ticketNumber: admitted.ticketNumber,
28409
- projectRoot: admitted.projectRoot,
28410
- home: env.home
28411
- });
28412
- if (dossierSection !== void 0) {
28413
- turnRequest = {
28414
- ...turnRequest,
28415
- continuation: appendContinuationSection(
28416
- turnRequest.continuation,
28417
- dossierSection
28418
- )
28419
- };
28420
- }
28421
- }
28478
+ await deliverCaseDossierAsAttachment({
28479
+ ticketNumber: admitted.ticketNumber,
28480
+ projectRoot: admitted.projectRoot,
28481
+ home: env.home,
28482
+ runDirectory: admitted.runDirectory
28483
+ });
28422
28484
  await markRunRunning(
28423
28485
  admitted.runDirectory,
28424
28486
  env.model,
@@ -28675,7 +28737,7 @@ function resumeTurnRequestProjectionOptions(admitted, request, env, summonsPrepa
28675
28737
  ...env.model === void 0 ? {} : { model: env.model },
28676
28738
  ...pickEngineAxis(env),
28677
28739
  ...env.timeoutMs === void 0 ? {} : { timeoutMs: env.timeoutMs },
28678
- ...admitted.correlationId === void 0 && env.correlationId === void 0 ? {} : { correlationId: admitted.correlationId ?? env.correlationId },
28740
+ ...env.correlationId === void 0 && admitted.correlationId === void 0 ? {} : { correlationId: env.correlationId ?? admitted.correlationId },
28679
28741
  continuation: {
28680
28742
  kind: "resume",
28681
28743
  prompt
@@ -28832,10 +28894,7 @@ async function runPostAdmissionSeatResume(input) {
28832
28894
  dispatch: async (turnRequest) => {
28833
28895
  const result2 = await dispatchPostAdmissionTurn({
28834
28896
  admitted: loaded.admitted,
28835
- env: {
28836
- ...input.env,
28837
- ...loaded.admitted.correlationId === void 0 ? {} : { correlationId: loaded.admitted.correlationId }
28838
- },
28897
+ env: input.env,
28839
28898
  io: attemptIo,
28840
28899
  request: turnRequest,
28841
28900
  lease,
@@ -29006,6 +29065,7 @@ var init_post_admission = __esm({
29006
29065
  init_run_lifecycle();
29007
29066
  init_cli_errors();
29008
29067
  init_invocation();
29068
+ init_submission_ledger();
29009
29069
  init_activation_ledger_topology();
29010
29070
  init_engine_material();
29011
29071
  init_session_identity();
@@ -30502,11 +30562,15 @@ async function summonPublicRole(options) {
30502
30562
  env: {
30503
30563
  ...built.env,
30504
30564
  stationChild: true,
30565
+ // Forward composition-root adapters so nested court stations (e.g.
30566
+ // countersign → diarist) select the same faux/production table (#924).
30567
+ ...options.hostAdapters === void 0 ? {} : { hostAdapters: options.hostAdapters },
30505
30568
  ...config.autoResumeLimit === void 0 ? {} : { autoResumeLimit: config.autoResumeLimit },
30506
30569
  ...options.signal === void 0 ? {} : { signal: options.signal },
30507
30570
  ...options.reviewReask === void 0 ? {} : { reviewReask: options.reviewReask },
30508
30571
  ...options.gateReviewInstruction === void 0 ? {} : { gateReviewInstruction: options.gateReviewInstruction },
30509
30572
  ...options.boundTicketNumber === void 0 ? {} : { boundTicketNumber: options.boundTicketNumber },
30573
+ ...options.correlationId === void 0 || options.correlationId.trim() === "" ? {} : { correlationId: options.correlationId },
30510
30574
  ...options.createRunId === void 0 ? {} : { createRunId: options.createRunId }
30511
30575
  }
30512
30576
  };
@@ -30609,6 +30673,16 @@ async function summonPublicRole(options) {
30609
30673
  result2 = stepped.ok;
30610
30674
  break;
30611
30675
  }
30676
+ case "countersign": {
30677
+ const [{ runPublicCountersign: runPublicCountersign2 }, { parseCountersignArgv: parseCountersignArgv2 }] = await Promise.all([
30678
+ Promise.resolve().then(() => (init_countersign_run(), countersign_run_exports)),
30679
+ Promise.resolve().then(() => (init_invocation(), invocation_exports))
30680
+ ]);
30681
+ const stepped = await runPrepared(parseCountersignArgv2, (env, once) => runPublicCountersign2(options.argv, env, io, once));
30682
+ if ("fail" in stepped) return stepped.fail;
30683
+ result2 = stepped.ok;
30684
+ break;
30685
+ }
30612
30686
  }
30613
30687
  const stderr = captured?.stderrText();
30614
30688
  const runDirectory = result2.admitted?.runDirectory;
@@ -30623,8 +30697,8 @@ async function summonPublicRole(options) {
30623
30697
  async function summonGateOfficer(options) {
30624
30698
  let home = options.home;
30625
30699
  if (home === void 0) {
30626
- const { homeFromRunDirectory: homeFromRunDirectory3 } = await Promise.resolve().then(() => (init_activation_ledger_topology(), activation_ledger_topology_exports));
30627
- home = homeFromRunDirectory3(options.sourceRunDirectory);
30700
+ const { homeFromRunDirectory: homeFromRunDirectory2 } = await Promise.resolve().then(() => (init_activation_ledger_topology(), activation_ledger_topology_exports));
30701
+ home = homeFromRunDirectory2(options.sourceRunDirectory);
30628
30702
  }
30629
30703
  let gateReviewInstruction;
30630
30704
  if (options.reask === void 0 && options.submission !== void 0) {
@@ -30679,6 +30753,14 @@ var init_public_role_summons = __esm({
30679
30753
  });
30680
30754
 
30681
30755
  // src/public-cli/countersign-run.ts
30756
+ var countersign_run_exports = {};
30757
+ __export(countersign_run_exports, {
30758
+ buildCountersignTurnRequest: () => buildCountersignTurnRequest,
30759
+ invokeCourtDiarist: () => invokeCourtDiarist,
30760
+ runCountersignCourtDiaristStation: () => runCountersignCourtDiaristStation,
30761
+ runPublicCountersign: () => runPublicCountersign,
30762
+ runPublicCountersignResume: () => runPublicCountersignResume
30763
+ });
30682
30764
  function buildCountersignTurnRequest(admitted, options) {
30683
30765
  return projectRoleTurnRequest(
30684
30766
  admitted,
@@ -30737,7 +30819,13 @@ async function invokeCourtDiarist(input, env, io) {
30737
30819
  const { summonPublicRole: summonPublicRole2 } = await Promise.resolve().then(() => (init_public_role_summons(), public_role_summons_exports));
30738
30820
  const result2 = await summonPublicRole2({
30739
30821
  role: "diarist",
30740
- argv: ["--project", input.projectRoot, input.instruction],
30822
+ argv: [
30823
+ "--project",
30824
+ input.projectRoot,
30825
+ ...(input.attachmentPaths ?? []).flatMap((path) => ["--attach", path]),
30826
+ "--",
30827
+ input.instruction
30828
+ ],
30741
30829
  cwd: env.cwd,
30742
30830
  home: env.home,
30743
30831
  agentDir: env.agentDir,
@@ -30745,6 +30833,7 @@ async function invokeCourtDiarist(input, env, io) {
30745
30833
  io: quietIo,
30746
30834
  ...env.credentials === void 0 ? {} : { credentials: env.credentials },
30747
30835
  ...env.signal === void 0 ? {} : { signal: env.signal },
30836
+ ...input.correlationId === void 0 ? {} : { correlationId: input.correlationId },
30748
30837
  ...input.boundTicketNumber === void 0 ? {} : { boundTicketNumber: input.boundTicketNumber },
30749
30838
  // Child seat selects from the composition-root table. Do not pass the
30750
30839
  // already-selected parent adapter (#840 / ADR 0082: --host 旗标>席位配置>缺省 pi).
@@ -30803,6 +30892,7 @@ async function runCountersignCourtDiaristStation(admitted, env, io) {
30803
30892
  instruction: `\u6574\u7406 #${ticketNumber} \u7684\u672C\u6848\u4F9D\u636E\u3002`,
30804
30893
  projectRoot: admitted.projectRoot,
30805
30894
  failureLabel: `ticket #${ticketNumber}`,
30895
+ correlationId: admitted.runId,
30806
30896
  // Refresh holds a typed key — hand it off so identity is bound before turn.
30807
30897
  boundTicketNumber: ticketNumber
30808
30898
  },
@@ -30859,7 +30949,8 @@ async function runPublicCountersign(argv, env, io, parseCountersignArgv2) {
30859
30949
  {
30860
30950
  instruction: parsed.instruction,
30861
30951
  projectRoot: admitted.projectRoot,
30862
- failureLabel: "unbound summons"
30952
+ failureLabel: "unbound summons",
30953
+ correlationId: admitted.runId
30863
30954
  },
30864
30955
  env,
30865
30956
  io
@@ -31070,6 +31161,188 @@ var init_countersign_run = __esm({
31070
31161
  }
31071
31162
  });
31072
31163
 
31164
+ // src/public-cli/secretariat-run.ts
31165
+ function buildSecretariatTurnRequest(admitted, options) {
31166
+ return projectRoleTurnRequest(
31167
+ admitted,
31168
+ {
31169
+ activation: {
31170
+ role: "secretariat",
31171
+ ...admitted.ticketNumber === void 0 ? {} : { ticketNumber: admitted.ticketNumber }
31172
+ }
31173
+ },
31174
+ options
31175
+ );
31176
+ }
31177
+ function diaristEnv(env) {
31178
+ return {
31179
+ cwd: env.cwd,
31180
+ home: env.home,
31181
+ agentDir: env.agentDir,
31182
+ packageRoot: env.packageRoot,
31183
+ ...env.credentials === void 0 ? {} : { credentials: env.credentials },
31184
+ ...env.signal === void 0 ? {} : { signal: env.signal },
31185
+ ...env.hostAdapters === void 0 ? {} : { hostAdapters: env.hostAdapters }
31186
+ };
31187
+ }
31188
+ async function runPublicSecretariat(argv, env, io, parseSecretariatArgv2) {
31189
+ let parsed;
31190
+ try {
31191
+ parsed = parseSecretariatArgv2(argv);
31192
+ } catch (error) {
31193
+ if (error instanceof CliUsageError) {
31194
+ presentStructuralRejection(error, io);
31195
+ return { exitCode: 2 };
31196
+ }
31197
+ throw error;
31198
+ }
31199
+ let admitted;
31200
+ try {
31201
+ admitted = await admitSecretariatInvocation({
31202
+ home: env.home,
31203
+ principalAuthority: env.principalAuthority,
31204
+ cwd: env.cwd,
31205
+ instruction: parsed.instruction,
31206
+ attachmentPaths: parsed.attachmentPaths,
31207
+ ...parsed.project === void 0 ? {} : { project: parsed.project },
31208
+ ...env.createRunId === void 0 ? {} : { createRunId: env.createRunId },
31209
+ ...env.model === void 0 ? {} : { model: env.model },
31210
+ ...env.correlationId === void 0 ? {} : { correlationId: env.correlationId }
31211
+ });
31212
+ } catch (error) {
31213
+ if (error instanceof CliUsageError) {
31214
+ presentStructuralRejection(error, io);
31215
+ return { exitCode: 2 };
31216
+ }
31217
+ throw error;
31218
+ }
31219
+ await markRunAdmitted(admitted, env.principalAuthority);
31220
+ const outcome = await invokeCourtDiarist(
31221
+ {
31222
+ instruction: parsed.instruction,
31223
+ projectRoot: admitted.projectRoot,
31224
+ failureLabel: "secretariat unbound summons",
31225
+ attachmentPaths: admitted.attachments.map((attachment) => attachment.frozenPath),
31226
+ correlationId: admitted.runId
31227
+ },
31228
+ diaristEnv(env),
31229
+ io
31230
+ );
31231
+ if (outcome.identity.kind === "escalate") {
31232
+ return await presentControlledFailure2(
31233
+ admitted,
31234
+ {
31235
+ timedOut: false,
31236
+ code: null,
31237
+ stderr: "",
31238
+ thrown: new Error(
31239
+ "court diarist station escalated (cannot identify court target)"
31240
+ )
31241
+ },
31242
+ secretariatAdapters(),
31243
+ env.principalAuthority,
31244
+ io
31245
+ );
31246
+ }
31247
+ if (outcome.failedWithoutEscalate !== void 0) {
31248
+ return await presentControlledFailure2(
31249
+ admitted,
31250
+ {
31251
+ timedOut: false,
31252
+ code: null,
31253
+ stderr: "",
31254
+ thrown: new Error(outcome.failedWithoutEscalate.diagnostic)
31255
+ },
31256
+ secretariatAdapters(),
31257
+ env.principalAuthority,
31258
+ io
31259
+ );
31260
+ }
31261
+ if (outcome.identity.kind === "ticket") {
31262
+ try {
31263
+ await bindAdmittedTicketNumber(admitted, outcome.identity.ticketNumber);
31264
+ await relocateAdmittedRunToTicket(admitted, env.principalAuthority);
31265
+ } catch (error) {
31266
+ return await presentControlledFailure2(
31267
+ admitted,
31268
+ {
31269
+ timedOut: false,
31270
+ code: null,
31271
+ stderr: "",
31272
+ thrown: error
31273
+ },
31274
+ secretariatAdapters(),
31275
+ env.principalAuthority,
31276
+ io
31277
+ );
31278
+ }
31279
+ }
31280
+ const turnRequest = buildSecretariatTurnRequest(admitted, {
31281
+ packageRoot: env.packageRoot,
31282
+ home: env.home,
31283
+ agentDir: env.agentDir,
31284
+ ...env.model === void 0 ? {} : { model: env.model },
31285
+ ...pickEngineAxis(env),
31286
+ ...env.timeoutMs === void 0 ? {} : { timeoutMs: env.timeoutMs },
31287
+ ...env.correlationId === void 0 || env.correlationId.trim() === "" ? {} : { correlationId: env.correlationId },
31288
+ continuation: {
31289
+ kind: "initial",
31290
+ prompt: buildSecretariatTransportPrompt(
31291
+ admitted,
31292
+ engineSessionMaterialFromOptions({
31293
+ ...pickEngineAxis(env),
31294
+ packageRoot: env.packageRoot
31295
+ })
31296
+ )
31297
+ }
31298
+ });
31299
+ return await runPostAdmissionOneShot({
31300
+ admitted,
31301
+ env,
31302
+ io,
31303
+ request: turnRequest,
31304
+ adapters: secretariatAdapters(),
31305
+ ...env.engine === void 0 ? {} : { effectiveEngine: env.engine }
31306
+ });
31307
+ }
31308
+ function secretariatAdapters() {
31309
+ return {
31310
+ trySettle: (admitted, authority, scope) => trySettleSecretariatTerminalResult(admitted, authority, scope),
31311
+ shouldPresentSettled: () => true
31312
+ };
31313
+ }
31314
+ async function runPublicSecretariatResume(request, env, io) {
31315
+ return await runPostAdmissionSeatResume({
31316
+ request,
31317
+ env,
31318
+ io,
31319
+ load: (effective) => loadResumableSecretariatRun(
31320
+ env.home,
31321
+ effective.runId,
31322
+ env.principalAuthority
31323
+ ),
31324
+ buildTurnRequest: (admitted, effective) => buildSecretariatTurnRequest(
31325
+ admitted,
31326
+ resumeTurnRequestProjectionOptions(admitted, effective, env)
31327
+ ),
31328
+ adapters: secretariatAdapters(),
31329
+ ...env.engine === void 0 ? {} : { effectiveEngine: env.engine }
31330
+ });
31331
+ }
31332
+ var init_secretariat_run = __esm({
31333
+ "src/public-cli/secretariat-run.ts"() {
31334
+ "use strict";
31335
+ init_engine_material();
31336
+ init_cli_errors();
31337
+ init_invocation();
31338
+ init_countersign_run();
31339
+ init_post_admission();
31340
+ init_run_lifecycle();
31341
+ init_settlement();
31342
+ init_turn_request();
31343
+ }
31344
+ });
31345
+
31073
31346
  // src/public-cli/gleaner-left-run.ts
31074
31347
  function buildGleanerLeftTurnRequest(admitted, options) {
31075
31348
  return projectRoleTurnRequest(
@@ -34598,6 +34871,17 @@ async function runAkRole(argv, env) {
34598
34871
  (args, roleEnv, once) => runPublicDiarist(args, roleEnv, io, once)
34599
34872
  );
34600
34873
  }
34874
+ if (parsed.command === "secretariat") {
34875
+ return await dispatchPublicRoleCommand(
34876
+ env,
34877
+ home,
34878
+ io,
34879
+ parsed,
34880
+ "secretariat",
34881
+ PUBLIC_ROLE_ARGV.secretariat.parse,
34882
+ (args, roleEnv, once) => runPublicSecretariat(args, roleEnv, io, once)
34883
+ );
34884
+ }
34601
34885
  if (parsed.command === "coder") {
34602
34886
  return await dispatchPublicRoleCommand(
34603
34887
  env,
@@ -34753,6 +35037,7 @@ var init_cli = __esm({
34753
35037
  init_collector_run();
34754
35038
  init_countersign_run();
34755
35039
  init_diarist_run();
35040
+ init_secretariat_run();
34756
35041
  init_gleaner_left_run();
34757
35042
  init_doctor_run();
34758
35043
  init_fixer_run();
@@ -34782,7 +35067,8 @@ var init_cli = __esm({
34782
35067
  gatekeeper: { seat: "gatekeeper", run: runPublicInstructionSeatResume },
34783
35068
  navigator: { seat: "navigator", run: runPublicInstructionSeatResume },
34784
35069
  auditor: { seat: "auditor", run: runPublicInstructionSeatResume },
34785
- diarist: { seat: "diarist", run: runPublicDiaristResume }
35070
+ diarist: { seat: "diarist", run: runPublicDiaristResume },
35071
+ secretariat: { seat: "secretariat", run: runPublicSecretariatResume }
34786
35072
  };
34787
35073
  PUBLIC_ROLE_ARGV = {
34788
35074
  judge: { parse: parseJudgeArgv, options: optionsForOwner("judge") },
@@ -34800,6 +35086,7 @@ var init_cli = __esm({
34800
35086
  navigator: { parse: parseNavigatorArgv, options: optionsForOwner("navigator") },
34801
35087
  auditor: { parse: parseAuditorArgv, options: optionsForOwner("auditor") },
34802
35088
  diarist: { parse: parseDiaristArgv, options: optionsForOwner("diarist") },
35089
+ secretariat: { parse: parseSecretariatArgv, options: optionsForOwner("secretariat") },
34803
35090
  /** Deterministic analysis seat (#336) — argv parse only; no LLM admission. */
34804
35091
  analyst: { parse: parseAnalystArgv, options: optionsForOwner("analyst") }
34805
35092
  };