@akagilnc/pi-workflow-roles 0.1.5862 → 0.1.5873

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.
@@ -2237,7 +2237,7 @@ function projectDiaristTicketSessions(value) {
2237
2237
  }
2238
2238
  return Array.from(perTicket, ([ticketNumber, sessions]) => ({ ticketNumber, sessions }));
2239
2239
  }
2240
- var DIARIST_OUTPUT_TOOL_NAME, DIARIST_SESSIONS_DESCRIPTION, diaristOutputSchema;
2240
+ var DIARIST_OUTPUT_TOOL_NAME, DIARIST_BOUND_ENDPOINTS, DIARIST_SESSIONS_DESCRIPTION, diaristOutputSchema;
2241
2241
  var init_diarist_contracts = __esm({
2242
2242
  "src/diarist-contracts.ts"() {
2243
2243
  "use strict";
@@ -2247,7 +2247,8 @@ var init_diarist_contracts = __esm({
2247
2247
  init_run_ticket_number();
2248
2248
  init_unknown_value();
2249
2249
  DIARIST_OUTPUT_TOOL_NAME = "ak_diarist_output";
2250
- DIARIST_SESSIONS_DESCRIPTION = "\u5BF9\u8BDD\u8FB9\u754C\u3002\u6BCF\u5377\u542B path\uFF08\u4F1A\u8BDD\u5377\u7EDD\u5BF9\u6216\u53EF\u8BFB\u8DEF\u5F84\uFF09\u4E0E ranges\uFF08\u672C\u5377\u672C\u8F6E\u5404\u533A\u95F4\uFF09\u3002\u6BCF\u6BB5\u533A\u95F4\u542B from / to\uFF1B\u8D77\u70B9\u4E0E\u7EC8\u70B9\u5404\u5199 id\uFF08\u539F\u751F id\uFF09\u6216 line\uFF08\u672C\u8F6E\u884C\u53F7\uFF09\uFF0C\u4E8C\u9009\u4E00\u3002\u7A7A\u5217\u8868\uFF1D\u672C\u8F6E\u65E0\u5BF9\u8BDD\u53EF\u5212\u3002\u7AEF\u70B9\u65E0\u6CD5\u6307\u540D\u65F6\u8D70 reask\uFF0C\u4E0D\u4E2D\u6B62\u3002";
2250
+ DIARIST_BOUND_ENDPOINTS = "\u8D77\u70B9\u4E0E\u7EC8\u70B9\u5404\u5199 id \u6216 line\uFF0C\u4E8C\u9009\u4E00\uFF1Aid\uFF1D\u4F1A\u8BDD\u5377\u91CC\u90A3\u4E00\u884C JSON \u7684 uuid \u5B57\u6BB5\u503C\uFF08\u6CA1\u6709 uuid \u53D6 id\uFF1B\u9876\u5C42\u90FD\u6CA1\u6709\u518D\u53D6 message \u6216 payload \u91CC\u7684 uuid / id\uFF09\uFF0C\u540C\u4E00 id \u51FA\u73B0\u591A\u6B21\u65F6\u53D6\u7B2C\u4E00\u6B21\u51FA\u73B0\u7684\u90A3\u4E00\u884C\uFF1Bline\uFF1D\u90A3\u4E00\u884C\u5728\u6587\u4EF6\u91CC\u4ECE 1 \u6570\u8D77\u7684\u884C\u53F7\u3002\u4E24\u7AEF\u90FD\u542B\u5728\u533A\u95F4\u5185\u3002";
2251
+ DIARIST_SESSIONS_DESCRIPTION = `\u5BF9\u8BDD\u8FB9\u754C\u3002\u6BCF\u5377\u542B path\uFF08\u4F1A\u8BDD\u5377\u7EDD\u5BF9\u6216\u53EF\u8BFB\u8DEF\u5F84\uFF09\u4E0E ranges\uFF08\u672C\u5377\u672C\u8F6E\u5404\u533A\u95F4\uFF09\u3002\u6BCF\u6BB5\u533A\u95F4\u542B from / to\uFF1B${DIARIST_BOUND_ENDPOINTS}\u533A\u95F4\u91CC\u53EA\u6709\u8BF4\u8BDD\u4EBA\u7684\u539F\u6587\u8FDB\u5F55\uFF1A\u7528\u6237\u4E0E\u52A9\u624B\u6D88\u606F\u91CC\u7684\u6587\u672C\u3001\u771F\u4EBA\u7ECF\u961F\u5217\u7684\u63D2\u8BDD\uFF1B\u601D\u8003\u3001\u5DE5\u5177\u8C03\u7528\u3001\u5DE5\u5177\u7ED3\u679C\u548C\u673A\u5668\u901A\u77E5\u4E0D\u8FDB\u5F55\uFF0C\u533A\u95F4\u53EF\u4EE5\u76F4\u63A5\u8DE8\u8FC7\u5B83\u4EEC\uFF0C\u4E0D\u5FC5\u62C6\u6BB5\u3002\u6BCF\u6B21\u4EA4\u5377\u7684\u8FB9\u754C\u7167\u6295\u5F71\u8FFD\u52A0\u8FDB\u672C\u7968\u8D77\u5C45\u5F55\uFF0C\u4E0D\u53BB\u91CD\uFF0C\u4E5F\u4E0D\u6539\u5DF2\u6709\u7684\u5F55\u3002\u7A7A\u5217\u8868\uFF1D\u672C\u8F6E\u65E0\u5BF9\u8BDD\u53EF\u5212\u3002\u7AEF\u70B9\u65E0\u6CD5\u6307\u540D\u65F6\u8D70 reask\uFF0C\u4E0D\u4E2D\u6B62\u3002`;
2251
2252
  diaristOutputSchema = withTerminatingOutputDeclarations(
2252
2253
  openToolObject(
2253
2254
  Type13.Object({
@@ -2260,7 +2261,7 @@ var init_diarist_contracts = __esm({
2260
2261
  })
2261
2262
  ),
2262
2263
  reason: Type13.Unknown({
2263
- description: "status \u4E3A escalate \u65F6\uFF1A\u8BA4\u4E0D\u51FA\u672C\u5EAD\u5BF9\u8C61\u7684\u539F\u56E0"
2264
+ description: "status \u4E3A escalate \u65F6\uFF1A\u4E0A\u5448\u7684\u539F\u56E0"
2264
2265
  }),
2265
2266
  sessions: Type13.Optional(Type13.Unknown({ description: DIARIST_SESSIONS_DESCRIPTION })),
2266
2267
  ticketSessions: Type13.Unknown({
@@ -2512,6 +2513,7 @@ var init_packaged_role_registry = __esm({
2512
2513
  "souls/notary.md",
2513
2514
  "souls/audit-law.md",
2514
2515
  "souls/ticket-law.md",
2516
+ "souls/quality-law.md",
2515
2517
  "souls/gate-output-guide.md",
2516
2518
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
2517
2519
  ];
@@ -2527,6 +2529,7 @@ var init_packaged_role_registry = __esm({
2527
2529
  "CLAUDE.md",
2528
2530
  "souls/judge-auditor.md",
2529
2531
  "souls/doctor-auditor.md",
2532
+ "souls/judge.md",
2530
2533
  "souls/audit-law.md",
2531
2534
  "souls/quality-law.md",
2532
2535
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
@@ -2778,7 +2781,7 @@ var init_packaged_role_registry = __esm({
2778
2781
  activationStage: "load-and-install",
2779
2782
  receiptStatusKey: "status",
2780
2783
  // #924: 公用《票面法》三席同装
2781
- sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md", "resources/countersign-ticket-issue.md", "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"]
2784
+ sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md", "souls/audit-law.md", "souls/quality-law.md", "resources/countersign-ticket-issue.md", "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"]
2782
2785
  },
2783
2786
  {
2784
2787
  role: "secretariat",
@@ -3222,7 +3225,7 @@ var init_role_submission_declarations = __esm({
3222
3225
  },
3223
3226
  diarist: {
3224
3227
  label: "\u8D77\u5C45\u90CE\u8F93\u51FA",
3225
- description: "\u8D77\u5C45\u90CE\u4EA4\u5355\u7968 sessions \u6216\u591A\u7968\u9010\u7968 ticketSessions \u8FB9\u754C\uFF1B\u8BA4\u4E0D\u51FA\u672C\u5EAD\u5BF9\u8C61\u5219 escalate\u3002",
3228
+ description: "\u8D77\u5C45\u90CE\u4EA4\u5355\u7968 sessions \u6216\u591A\u7968\u9010\u7968 ticketSessions \u8FB9\u754C\uFF0C\u6216 escalate\u3002",
3226
3229
  promptSnippet: "\u8D77\u5C45\u90CE\u4EA4\u8FB9\u754C",
3227
3230
  parameters: diaristOutputSchema
3228
3231
  }
@@ -12389,6 +12392,7 @@ var init_auditor_soul = __esm({
12389
12392
  judge: [
12390
12393
  "CLAUDE.md",
12391
12394
  "souls/judge-auditor.md",
12395
+ "souls/judge.md",
12392
12396
  "souls/audit-law.md",
12393
12397
  "souls/quality-law.md",
12394
12398
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
@@ -21503,14 +21507,14 @@ init_run_ticket_number();
21503
21507
  // src/audited-run-identity.ts
21504
21508
  init_role_run_placement();
21505
21509
  import { basename as basename14 } from "node:path";
21506
- var AUDITED_RUN_IDENTITY_KIND = "audited-run-identity";
21510
+ var AUDITED_RUN_IDENTITY_KIND = "audited-run";
21507
21511
  function auditedRunIdentityFromDirectory(runDirectory) {
21508
21512
  const parsed = parseRunLeaf(basename14(runDirectory));
21509
21513
  if (parsed === void 0) return void 0;
21510
21514
  return formatRunLeaf(parsed.runId, parsed.role);
21511
21515
  }
21512
21516
  function auditedRunIdentityMaterial(identity) {
21513
- return { kind: AUDITED_RUN_IDENTITY_KIND, identity };
21517
+ return { kind: AUDITED_RUN_IDENTITY_KIND, auditedRun: identity };
21514
21518
  }
21515
21519
  function auditedRunIdentityFromParts(runId, role) {
21516
21520
  return formatRunLeaf(runId, role);
@@ -21550,11 +21554,16 @@ function projectNotaryBoundFromFlags(getFlag) {
21550
21554
  };
21551
21555
  }
21552
21556
  function assembleNotaryAgentStartPrompt(input) {
21557
+ const audited = input.audited === void 0 ? "" : `
21558
+
21559
+ <audited_seat_soul seat="${input.audited.seat}">
21560
+ ${input.audited.soul}
21561
+ </audited_seat_soul>`;
21553
21562
  return `${input.baseSystemPrompt}
21554
21563
 
21555
21564
  <notary_soul>
21556
21565
  ${input.soul}
21557
- </notary_soul>`;
21566
+ </notary_soul>${audited}`;
21558
21567
  }
21559
21568
  function createNotaryRoleRuntime(pi, dependencies, host) {
21560
21569
  let activation;
@@ -21576,9 +21585,11 @@ function createNotaryRoleRuntime(pi, dependencies, host) {
21576
21585
  const soul = (await dependencies.loadSoul()).trim();
21577
21586
  if (soul.length === 0) throw new Error("Notary soul is empty");
21578
21587
  const sourceRun = await dependencies.loadSourceRunLocator(path);
21588
+ const auditedSoul = (await dependencies.loadAuditedSoul(sourceRun.role))?.trim();
21579
21589
  activation = {
21580
21590
  soul,
21581
21591
  sourceRun,
21592
+ ...auditedSoul === void 0 || auditedSoul === "" ? {} : { auditedSoul },
21582
21593
  ...admitted?.ticketNumber === void 0 ? {} : { ticketNumber: admitted.ticketNumber }
21583
21594
  };
21584
21595
  if (!registered) {
@@ -21593,7 +21604,8 @@ function createNotaryRoleRuntime(pi, dependencies, host) {
21593
21604
  return {
21594
21605
  systemPrompt: assembleNotaryAgentStartPrompt({
21595
21606
  baseSystemPrompt: event.systemPrompt,
21596
- soul: activation.soul
21607
+ soul: activation.soul,
21608
+ ...activation.auditedSoul === void 0 ? {} : { audited: { seat: activation.sourceRun.role, soul: activation.auditedSoul } }
21597
21609
  }),
21598
21610
  readingMaterial: projectNotaryAuditedRunIdentity({
21599
21611
  sourceRun: activation.sourceRun
@@ -22792,7 +22804,7 @@ function readDiaristRunCoordinates(ctx) {
22792
22804
  ...bound === void 0 ? {} : { boundTicketNumber: bound }
22793
22805
  };
22794
22806
  }
22795
- var DIARIST_BOUNDS_REASK = "\u8FB9\u754C\u65E0\u6CD5\u4F7F\u7528\u3002\u591A\u7968\u8BF7\u9010\u7968\u91CD\u4EA4 ticketSessions\uFF0C\u5355\u7968\u91CD\u4EA4 sessions\uFF1B\u6BCF\u5377 path + ranges\uFF0C\u6BCF\u7AEF\u4EE5\u539F\u751F id \u6216\u672C\u8F6E\u884C\u53F7\u4E8C\u9009\u4E00\u6307\u540D\u3002";
22807
+ var DIARIST_BOUNDS_REASK = `\u8FB9\u754C\u65E0\u6CD5\u4F7F\u7528\u3002\u591A\u7968\u8BF7\u9010\u7968\u91CD\u4EA4 ticketSessions\uFF0C\u5355\u7968\u91CD\u4EA4 sessions\uFF1B\u6BCF\u5377 path + ranges\u3002${DIARIST_BOUND_ENDPOINTS}`;
22796
22808
  function createDiaristRoleRuntime(roleHost, dependencies, hostActions) {
22797
22809
  return createFiledOfficerRuntime(
22798
22810
  roleHost,
@@ -23254,6 +23266,9 @@ function createRoleRuntimeExtension(dependencies, deliveryRequestLimit) {
23254
23266
  async loadSourceRunLocator(path) {
23255
23267
  if (!dependencies.loadNotarySourceRun) throw new Error("Notary runtime dependencies are not configured");
23256
23268
  return dependencies.loadNotarySourceRun(path);
23269
+ },
23270
+ async loadAuditedSoul(role) {
23271
+ return packagedRoleMetadata(role) === void 0 ? void 0 : requireRoleSoul(role);
23257
23272
  }
23258
23273
  }, hostActions);
23259
23274
  const countersign = createCountersignRoleRuntime(roleHost, {
@@ -1,10 +1,11 @@
1
1
  /**
2
2
  * Shared audited-run identity for review-officer startup materials (#1166 / ADR 0087).
3
- * Value form is `<runId>@<席>` only — no directory path.
3
+ * Value form is `<runId>@<席>` only — no directory path. The field is named
4
+ * `auditedRun` so the reader sees it names the run under review, not itself.
4
5
  */
5
6
  import { basename } from "node:path";
6
7
  import { formatRunLeaf, parseRunLeaf } from "./role-run-placement.js";
7
- export const AUDITED_RUN_IDENTITY_KIND = "audited-run-identity";
8
+ export const AUDITED_RUN_IDENTITY_KIND = "audited-run";
8
9
  /** Identity leaf from a run directory basename; undefined when the leaf is not `runId@role`. */
9
10
  export function auditedRunIdentityFromDirectory(runDirectory) {
10
11
  const parsed = parseRunLeaf(basename(runDirectory));
@@ -13,7 +14,7 @@ export function auditedRunIdentityFromDirectory(runDirectory) {
13
14
  return formatRunLeaf(parsed.runId, parsed.role);
14
15
  }
15
16
  export function auditedRunIdentityMaterial(identity) {
16
- return { kind: AUDITED_RUN_IDENTITY_KIND, identity };
17
+ return { kind: AUDITED_RUN_IDENTITY_KIND, auditedRun: identity };
17
18
  }
18
19
  /** Identity from locator fields already in hand (notary source-run). */
19
20
  export function auditedRunIdentityFromParts(runId, role) {
@@ -31,7 +31,8 @@ function auditorSoulRelativePath(role) {
31
31
  return `souls/${role}-auditor.md`;
32
32
  }
33
33
  /**
34
- * #470 auditor session materials. Judge carries audit-law + quality-law; doctor does
34
+ * #470 auditor session materials. Judge carries the audited judge Soul + audit-law +
35
+ * quality-law (verdicts cite judge.md; audit-law makes the auditor check the cited line); doctor does
35
36
  * not (御批四: 参审席 = 大理寺主会话 + 其审计席; 太医线不动).
36
37
  * Reviewer auditor roster removed with #495 S6 gate retirement.
37
38
  * #675 owner: no generic auditor.md — subject selects this table.
@@ -40,6 +41,7 @@ export const AUDITOR_SESSION_MATERIALS = {
40
41
  judge: [
41
42
  "CLAUDE.md",
42
43
  "souls/judge-auditor.md",
44
+ "souls/judge.md",
43
45
  "souls/audit-law.md",
44
46
  "souls/quality-law.md",
45
47
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md",
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Public 起居郎 (diarist) terminating receipt contracts — ADR 0075 `diarist-is-role` / #901.
3
- * Lawful explicit releases: completed (入录) | escalate (认不出本庭对象上抛).
3
+ * Lawful explicit releases: completed (入录) | escalate (无法正常署时上呈,见 Soul).
4
4
  * Machine facts about the volume come from the mechanical reproject seam, never
5
5
  * from model self-report (锚定宪法); this module owns the receipt shape only.
6
6
  *
@@ -65,7 +65,8 @@ export function projectDiaristTicketSessions(value) {
65
65
  * sessions / ticketSessions 是投影所读的边界:卷路径或端点读不出时走既有 reask,不中止本轮。
66
66
  * 声明只留字段名和语义说明,不留类型、嵌套、长度、必填。
67
67
  */
68
- const DIARIST_SESSIONS_DESCRIPTION = "对话边界。每卷含 path(会话卷绝对或可读路径)与 ranges(本卷本轮各区间)。每段区间含 from / to;起点与终点各写 id(原生 id)或 line(本轮行号),二选一。空列表=本轮无对话可划。端点无法指名时走 reask,不中止。";
68
+ export const DIARIST_BOUND_ENDPOINTS = "起点与终点各写 id 或 line,二选一:id=会话卷里那一行 JSON 的 uuid 字段值(没有 uuid 取 id;顶层都没有再取 message 或 payload 里的 uuid / id),同一 id 出现多次时取第一次出现的那一行;line=那一行在文件里从 1 数起的行号。两端都含在区间内。";
69
+ const DIARIST_SESSIONS_DESCRIPTION = `对话边界。每卷含 path(会话卷绝对或可读路径)与 ranges(本卷本轮各区间)。每段区间含 from / to;${DIARIST_BOUND_ENDPOINTS}区间里只有说话人的原文进录:用户与助手消息里的文本、真人经队列的插话;思考、工具调用、工具结果和机器通知不进录,区间可以直接跨过它们,不必拆段。每次交卷的边界照投影追加进本票起居录,不去重,也不改已有的录。空列表=本轮无对话可划。端点无法指名时走 reask,不中止。`;
69
70
  export const diaristOutputSchema = withTerminatingOutputDeclarations(openToolObject(Type.Object({
70
71
  status: Type.Unknown({
71
72
  description: "completed | escalate",
@@ -74,7 +75,7 @@ export const diaristOutputSchema = withTerminatingOutputDeclarations(openToolObj
74
75
  description: "本庭对象票号(正整数)或 null/省略=真无票;下游走 typed 键;认不出用 status=escalate,不洗成无录。机械层不重判。",
75
76
  })),
76
77
  reason: Type.Unknown({
77
- description: "status 为 escalate 时:认不出本庭对象的原因",
78
+ description: "status 为 escalate 时:上呈的原因",
78
79
  }),
79
80
  sessions: Type.Optional(Type.Unknown({ description: DIARIST_SESSIONS_DESCRIPTION })),
80
81
  ticketSessions: Type.Unknown({
@@ -2107,7 +2107,7 @@ function projectDiaristTicketSessions(value) {
2107
2107
  }
2108
2108
  return Array.from(perTicket, ([ticketNumber, sessions]) => ({ ticketNumber, sessions }));
2109
2109
  }
2110
- var DIARIST_OUTPUT_TOOL_NAME, DIARIST_SESSIONS_DESCRIPTION, diaristOutputSchema;
2110
+ var DIARIST_OUTPUT_TOOL_NAME, DIARIST_BOUND_ENDPOINTS, DIARIST_SESSIONS_DESCRIPTION, diaristOutputSchema;
2111
2111
  var init_diarist_contracts = __esm({
2112
2112
  "src/diarist-contracts.ts"() {
2113
2113
  "use strict";
@@ -2117,7 +2117,8 @@ var init_diarist_contracts = __esm({
2117
2117
  init_run_ticket_number();
2118
2118
  init_unknown_value();
2119
2119
  DIARIST_OUTPUT_TOOL_NAME = "ak_diarist_output";
2120
- DIARIST_SESSIONS_DESCRIPTION = "\u5BF9\u8BDD\u8FB9\u754C\u3002\u6BCF\u5377\u542B path\uFF08\u4F1A\u8BDD\u5377\u7EDD\u5BF9\u6216\u53EF\u8BFB\u8DEF\u5F84\uFF09\u4E0E ranges\uFF08\u672C\u5377\u672C\u8F6E\u5404\u533A\u95F4\uFF09\u3002\u6BCF\u6BB5\u533A\u95F4\u542B from / to\uFF1B\u8D77\u70B9\u4E0E\u7EC8\u70B9\u5404\u5199 id\uFF08\u539F\u751F id\uFF09\u6216 line\uFF08\u672C\u8F6E\u884C\u53F7\uFF09\uFF0C\u4E8C\u9009\u4E00\u3002\u7A7A\u5217\u8868\uFF1D\u672C\u8F6E\u65E0\u5BF9\u8BDD\u53EF\u5212\u3002\u7AEF\u70B9\u65E0\u6CD5\u6307\u540D\u65F6\u8D70 reask\uFF0C\u4E0D\u4E2D\u6B62\u3002";
2120
+ DIARIST_BOUND_ENDPOINTS = "\u8D77\u70B9\u4E0E\u7EC8\u70B9\u5404\u5199 id \u6216 line\uFF0C\u4E8C\u9009\u4E00\uFF1Aid\uFF1D\u4F1A\u8BDD\u5377\u91CC\u90A3\u4E00\u884C JSON \u7684 uuid \u5B57\u6BB5\u503C\uFF08\u6CA1\u6709 uuid \u53D6 id\uFF1B\u9876\u5C42\u90FD\u6CA1\u6709\u518D\u53D6 message \u6216 payload \u91CC\u7684 uuid / id\uFF09\uFF0C\u540C\u4E00 id \u51FA\u73B0\u591A\u6B21\u65F6\u53D6\u7B2C\u4E00\u6B21\u51FA\u73B0\u7684\u90A3\u4E00\u884C\uFF1Bline\uFF1D\u90A3\u4E00\u884C\u5728\u6587\u4EF6\u91CC\u4ECE 1 \u6570\u8D77\u7684\u884C\u53F7\u3002\u4E24\u7AEF\u90FD\u542B\u5728\u533A\u95F4\u5185\u3002";
2121
+ DIARIST_SESSIONS_DESCRIPTION = `\u5BF9\u8BDD\u8FB9\u754C\u3002\u6BCF\u5377\u542B path\uFF08\u4F1A\u8BDD\u5377\u7EDD\u5BF9\u6216\u53EF\u8BFB\u8DEF\u5F84\uFF09\u4E0E ranges\uFF08\u672C\u5377\u672C\u8F6E\u5404\u533A\u95F4\uFF09\u3002\u6BCF\u6BB5\u533A\u95F4\u542B from / to\uFF1B${DIARIST_BOUND_ENDPOINTS}\u533A\u95F4\u91CC\u53EA\u6709\u8BF4\u8BDD\u4EBA\u7684\u539F\u6587\u8FDB\u5F55\uFF1A\u7528\u6237\u4E0E\u52A9\u624B\u6D88\u606F\u91CC\u7684\u6587\u672C\u3001\u771F\u4EBA\u7ECF\u961F\u5217\u7684\u63D2\u8BDD\uFF1B\u601D\u8003\u3001\u5DE5\u5177\u8C03\u7528\u3001\u5DE5\u5177\u7ED3\u679C\u548C\u673A\u5668\u901A\u77E5\u4E0D\u8FDB\u5F55\uFF0C\u533A\u95F4\u53EF\u4EE5\u76F4\u63A5\u8DE8\u8FC7\u5B83\u4EEC\uFF0C\u4E0D\u5FC5\u62C6\u6BB5\u3002\u6BCF\u6B21\u4EA4\u5377\u7684\u8FB9\u754C\u7167\u6295\u5F71\u8FFD\u52A0\u8FDB\u672C\u7968\u8D77\u5C45\u5F55\uFF0C\u4E0D\u53BB\u91CD\uFF0C\u4E5F\u4E0D\u6539\u5DF2\u6709\u7684\u5F55\u3002\u7A7A\u5217\u8868\uFF1D\u672C\u8F6E\u65E0\u5BF9\u8BDD\u53EF\u5212\u3002\u7AEF\u70B9\u65E0\u6CD5\u6307\u540D\u65F6\u8D70 reask\uFF0C\u4E0D\u4E2D\u6B62\u3002`;
2121
2122
  diaristOutputSchema = withTerminatingOutputDeclarations(
2122
2123
  openToolObject(
2123
2124
  Type13.Object({
@@ -2130,7 +2131,7 @@ var init_diarist_contracts = __esm({
2130
2131
  })
2131
2132
  ),
2132
2133
  reason: Type13.Unknown({
2133
- description: "status \u4E3A escalate \u65F6\uFF1A\u8BA4\u4E0D\u51FA\u672C\u5EAD\u5BF9\u8C61\u7684\u539F\u56E0"
2134
+ description: "status \u4E3A escalate \u65F6\uFF1A\u4E0A\u5448\u7684\u539F\u56E0"
2134
2135
  }),
2135
2136
  sessions: Type13.Optional(Type13.Unknown({ description: DIARIST_SESSIONS_DESCRIPTION })),
2136
2137
  ticketSessions: Type13.Unknown({
@@ -2382,6 +2383,7 @@ var init_packaged_role_registry = __esm({
2382
2383
  "souls/notary.md",
2383
2384
  "souls/audit-law.md",
2384
2385
  "souls/ticket-law.md",
2386
+ "souls/quality-law.md",
2385
2387
  "souls/gate-output-guide.md",
2386
2388
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
2387
2389
  ];
@@ -2397,6 +2399,7 @@ var init_packaged_role_registry = __esm({
2397
2399
  "CLAUDE.md",
2398
2400
  "souls/judge-auditor.md",
2399
2401
  "souls/doctor-auditor.md",
2402
+ "souls/judge.md",
2400
2403
  "souls/audit-law.md",
2401
2404
  "souls/quality-law.md",
2402
2405
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
@@ -2648,7 +2651,7 @@ var init_packaged_role_registry = __esm({
2648
2651
  activationStage: "load-and-install",
2649
2652
  receiptStatusKey: "status",
2650
2653
  // #924: 公用《票面法》三席同装
2651
- sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md", "resources/countersign-ticket-issue.md", "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"]
2654
+ sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md", "souls/audit-law.md", "souls/quality-law.md", "resources/countersign-ticket-issue.md", "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"]
2652
2655
  },
2653
2656
  {
2654
2657
  role: "secretariat",
@@ -4485,7 +4488,7 @@ var init_role_submission_declarations = __esm({
4485
4488
  },
4486
4489
  diarist: {
4487
4490
  label: "\u8D77\u5C45\u90CE\u8F93\u51FA",
4488
- description: "\u8D77\u5C45\u90CE\u4EA4\u5355\u7968 sessions \u6216\u591A\u7968\u9010\u7968 ticketSessions \u8FB9\u754C\uFF1B\u8BA4\u4E0D\u51FA\u672C\u5EAD\u5BF9\u8C61\u5219 escalate\u3002",
4491
+ description: "\u8D77\u5C45\u90CE\u4EA4\u5355\u7968 sessions \u6216\u591A\u7968\u9010\u7968 ticketSessions \u8FB9\u754C\uFF0C\u6216 escalate\u3002",
4489
4492
  promptSnippet: "\u8D77\u5C45\u90CE\u4EA4\u8FB9\u754C",
4490
4493
  parameters: diaristOutputSchema
4491
4494
  }
@@ -13736,6 +13739,7 @@ var init_auditor_soul = __esm({
13736
13739
  judge: [
13737
13740
  "CLAUDE.md",
13738
13741
  "souls/judge-auditor.md",
13742
+ "souls/judge.md",
13739
13743
  "souls/audit-law.md",
13740
13744
  "souls/quality-law.md",
13741
13745
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
@@ -21649,14 +21653,14 @@ init_run_ticket_number();
21649
21653
  // src/audited-run-identity.ts
21650
21654
  init_role_run_placement();
21651
21655
  import { basename as basename14 } from "node:path";
21652
- var AUDITED_RUN_IDENTITY_KIND = "audited-run-identity";
21656
+ var AUDITED_RUN_IDENTITY_KIND = "audited-run";
21653
21657
  function auditedRunIdentityFromDirectory(runDirectory) {
21654
21658
  const parsed = parseRunLeaf(basename14(runDirectory));
21655
21659
  if (parsed === void 0) return void 0;
21656
21660
  return formatRunLeaf(parsed.runId, parsed.role);
21657
21661
  }
21658
21662
  function auditedRunIdentityMaterial(identity) {
21659
- return { kind: AUDITED_RUN_IDENTITY_KIND, identity };
21663
+ return { kind: AUDITED_RUN_IDENTITY_KIND, auditedRun: identity };
21660
21664
  }
21661
21665
  function auditedRunIdentityFromParts(runId, role) {
21662
21666
  return formatRunLeaf(runId, role);
@@ -21696,11 +21700,16 @@ function projectNotaryBoundFromFlags(getFlag) {
21696
21700
  };
21697
21701
  }
21698
21702
  function assembleNotaryAgentStartPrompt(input) {
21703
+ const audited = input.audited === void 0 ? "" : `
21704
+
21705
+ <audited_seat_soul seat="${input.audited.seat}">
21706
+ ${input.audited.soul}
21707
+ </audited_seat_soul>`;
21699
21708
  return `${input.baseSystemPrompt}
21700
21709
 
21701
21710
  <notary_soul>
21702
21711
  ${input.soul}
21703
- </notary_soul>`;
21712
+ </notary_soul>${audited}`;
21704
21713
  }
21705
21714
  function createNotaryRoleRuntime(pi, dependencies, host) {
21706
21715
  let activation;
@@ -21722,9 +21731,11 @@ function createNotaryRoleRuntime(pi, dependencies, host) {
21722
21731
  const soul = (await dependencies.loadSoul()).trim();
21723
21732
  if (soul.length === 0) throw new Error("Notary soul is empty");
21724
21733
  const sourceRun = await dependencies.loadSourceRunLocator(path);
21734
+ const auditedSoul = (await dependencies.loadAuditedSoul(sourceRun.role))?.trim();
21725
21735
  activation = {
21726
21736
  soul,
21727
21737
  sourceRun,
21738
+ ...auditedSoul === void 0 || auditedSoul === "" ? {} : { auditedSoul },
21728
21739
  ...admitted?.ticketNumber === void 0 ? {} : { ticketNumber: admitted.ticketNumber }
21729
21740
  };
21730
21741
  if (!registered) {
@@ -21739,7 +21750,8 @@ function createNotaryRoleRuntime(pi, dependencies, host) {
21739
21750
  return {
21740
21751
  systemPrompt: assembleNotaryAgentStartPrompt({
21741
21752
  baseSystemPrompt: event.systemPrompt,
21742
- soul: activation.soul
21753
+ soul: activation.soul,
21754
+ ...activation.auditedSoul === void 0 ? {} : { audited: { seat: activation.sourceRun.role, soul: activation.auditedSoul } }
21743
21755
  }),
21744
21756
  readingMaterial: projectNotaryAuditedRunIdentity({
21745
21757
  sourceRun: activation.sourceRun
@@ -22759,7 +22771,7 @@ function readDiaristRunCoordinates(ctx) {
22759
22771
  ...bound === void 0 ? {} : { boundTicketNumber: bound }
22760
22772
  };
22761
22773
  }
22762
- var DIARIST_BOUNDS_REASK = "\u8FB9\u754C\u65E0\u6CD5\u4F7F\u7528\u3002\u591A\u7968\u8BF7\u9010\u7968\u91CD\u4EA4 ticketSessions\uFF0C\u5355\u7968\u91CD\u4EA4 sessions\uFF1B\u6BCF\u5377 path + ranges\uFF0C\u6BCF\u7AEF\u4EE5\u539F\u751F id \u6216\u672C\u8F6E\u884C\u53F7\u4E8C\u9009\u4E00\u6307\u540D\u3002";
22774
+ var DIARIST_BOUNDS_REASK = `\u8FB9\u754C\u65E0\u6CD5\u4F7F\u7528\u3002\u591A\u7968\u8BF7\u9010\u7968\u91CD\u4EA4 ticketSessions\uFF0C\u5355\u7968\u91CD\u4EA4 sessions\uFF1B\u6BCF\u5377 path + ranges\u3002${DIARIST_BOUND_ENDPOINTS}`;
22763
22775
  function createDiaristRoleRuntime(roleHost, dependencies, hostActions) {
22764
22776
  return createFiledOfficerRuntime(
22765
22777
  roleHost,
@@ -23221,6 +23233,9 @@ function createRoleRuntimeExtension(dependencies, deliveryRequestLimit) {
23221
23233
  async loadSourceRunLocator(path) {
23222
23234
  if (!dependencies.loadNotarySourceRun) throw new Error("Notary runtime dependencies are not configured");
23223
23235
  return dependencies.loadNotarySourceRun(path);
23236
+ },
23237
+ async loadAuditedSoul(role) {
23238
+ return packagedRoleMetadata(role) === void 0 ? void 0 : requireRoleSoul(role);
23224
23239
  }
23225
23240
  }, hostActions);
23226
23241
  const countersign = createCountersignRoleRuntime(roleHost, {
@@ -9126,7 +9126,7 @@ var init_ticket_provenance_contracts = __esm({
9126
9126
  });
9127
9127
 
9128
9128
  // src/diarist-contracts.ts
9129
- var DIARIST_OUTPUT_TOOL_NAME, DIARIST_SESSIONS_DESCRIPTION, diaristOutputSchema;
9129
+ var DIARIST_OUTPUT_TOOL_NAME, DIARIST_BOUND_ENDPOINTS, DIARIST_SESSIONS_DESCRIPTION, diaristOutputSchema;
9130
9130
  var init_diarist_contracts = __esm({
9131
9131
  "src/diarist-contracts.ts"() {
9132
9132
  "use strict";
@@ -9137,7 +9137,8 @@ var init_diarist_contracts = __esm({
9137
9137
  init_run_ticket_number();
9138
9138
  init_unknown_value();
9139
9139
  DIARIST_OUTPUT_TOOL_NAME = "ak_diarist_output";
9140
- DIARIST_SESSIONS_DESCRIPTION = "\u5BF9\u8BDD\u8FB9\u754C\u3002\u6BCF\u5377\u542B path\uFF08\u4F1A\u8BDD\u5377\u7EDD\u5BF9\u6216\u53EF\u8BFB\u8DEF\u5F84\uFF09\u4E0E ranges\uFF08\u672C\u5377\u672C\u8F6E\u5404\u533A\u95F4\uFF09\u3002\u6BCF\u6BB5\u533A\u95F4\u542B from / to\uFF1B\u8D77\u70B9\u4E0E\u7EC8\u70B9\u5404\u5199 id\uFF08\u539F\u751F id\uFF09\u6216 line\uFF08\u672C\u8F6E\u884C\u53F7\uFF09\uFF0C\u4E8C\u9009\u4E00\u3002\u7A7A\u5217\u8868\uFF1D\u672C\u8F6E\u65E0\u5BF9\u8BDD\u53EF\u5212\u3002\u7AEF\u70B9\u65E0\u6CD5\u6307\u540D\u65F6\u8D70 reask\uFF0C\u4E0D\u4E2D\u6B62\u3002";
9140
+ DIARIST_BOUND_ENDPOINTS = "\u8D77\u70B9\u4E0E\u7EC8\u70B9\u5404\u5199 id \u6216 line\uFF0C\u4E8C\u9009\u4E00\uFF1Aid\uFF1D\u4F1A\u8BDD\u5377\u91CC\u90A3\u4E00\u884C JSON \u7684 uuid \u5B57\u6BB5\u503C\uFF08\u6CA1\u6709 uuid \u53D6 id\uFF1B\u9876\u5C42\u90FD\u6CA1\u6709\u518D\u53D6 message \u6216 payload \u91CC\u7684 uuid / id\uFF09\uFF0C\u540C\u4E00 id \u51FA\u73B0\u591A\u6B21\u65F6\u53D6\u7B2C\u4E00\u6B21\u51FA\u73B0\u7684\u90A3\u4E00\u884C\uFF1Bline\uFF1D\u90A3\u4E00\u884C\u5728\u6587\u4EF6\u91CC\u4ECE 1 \u6570\u8D77\u7684\u884C\u53F7\u3002\u4E24\u7AEF\u90FD\u542B\u5728\u533A\u95F4\u5185\u3002";
9141
+ DIARIST_SESSIONS_DESCRIPTION = `\u5BF9\u8BDD\u8FB9\u754C\u3002\u6BCF\u5377\u542B path\uFF08\u4F1A\u8BDD\u5377\u7EDD\u5BF9\u6216\u53EF\u8BFB\u8DEF\u5F84\uFF09\u4E0E ranges\uFF08\u672C\u5377\u672C\u8F6E\u5404\u533A\u95F4\uFF09\u3002\u6BCF\u6BB5\u533A\u95F4\u542B from / to\uFF1B${DIARIST_BOUND_ENDPOINTS}\u533A\u95F4\u91CC\u53EA\u6709\u8BF4\u8BDD\u4EBA\u7684\u539F\u6587\u8FDB\u5F55\uFF1A\u7528\u6237\u4E0E\u52A9\u624B\u6D88\u606F\u91CC\u7684\u6587\u672C\u3001\u771F\u4EBA\u7ECF\u961F\u5217\u7684\u63D2\u8BDD\uFF1B\u601D\u8003\u3001\u5DE5\u5177\u8C03\u7528\u3001\u5DE5\u5177\u7ED3\u679C\u548C\u673A\u5668\u901A\u77E5\u4E0D\u8FDB\u5F55\uFF0C\u533A\u95F4\u53EF\u4EE5\u76F4\u63A5\u8DE8\u8FC7\u5B83\u4EEC\uFF0C\u4E0D\u5FC5\u62C6\u6BB5\u3002\u6BCF\u6B21\u4EA4\u5377\u7684\u8FB9\u754C\u7167\u6295\u5F71\u8FFD\u52A0\u8FDB\u672C\u7968\u8D77\u5C45\u5F55\uFF0C\u4E0D\u53BB\u91CD\uFF0C\u4E5F\u4E0D\u6539\u5DF2\u6709\u7684\u5F55\u3002\u7A7A\u5217\u8868\uFF1D\u672C\u8F6E\u65E0\u5BF9\u8BDD\u53EF\u5212\u3002\u7AEF\u70B9\u65E0\u6CD5\u6307\u540D\u65F6\u8D70 reask\uFF0C\u4E0D\u4E2D\u6B62\u3002`;
9141
9142
  diaristOutputSchema = withTerminatingOutputDeclarations(
9142
9143
  openToolObject(
9143
9144
  typebox_exports.Object({
@@ -9150,7 +9151,7 @@ var init_diarist_contracts = __esm({
9150
9151
  })
9151
9152
  ),
9152
9153
  reason: typebox_exports.Unknown({
9153
- description: "status \u4E3A escalate \u65F6\uFF1A\u8BA4\u4E0D\u51FA\u672C\u5EAD\u5BF9\u8C61\u7684\u539F\u56E0"
9154
+ description: "status \u4E3A escalate \u65F6\uFF1A\u4E0A\u5448\u7684\u539F\u56E0"
9154
9155
  }),
9155
9156
  sessions: typebox_exports.Optional(typebox_exports.Unknown({ description: DIARIST_SESSIONS_DESCRIPTION })),
9156
9157
  ticketSessions: typebox_exports.Unknown({
@@ -9242,6 +9243,7 @@ var init_packaged_role_registry = __esm({
9242
9243
  "souls/notary.md",
9243
9244
  "souls/audit-law.md",
9244
9245
  "souls/ticket-law.md",
9246
+ "souls/quality-law.md",
9245
9247
  "souls/gate-output-guide.md",
9246
9248
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
9247
9249
  ];
@@ -9257,6 +9259,7 @@ var init_packaged_role_registry = __esm({
9257
9259
  "CLAUDE.md",
9258
9260
  "souls/judge-auditor.md",
9259
9261
  "souls/doctor-auditor.md",
9262
+ "souls/judge.md",
9260
9263
  "souls/audit-law.md",
9261
9264
  "souls/quality-law.md",
9262
9265
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
@@ -9508,7 +9511,7 @@ var init_packaged_role_registry = __esm({
9508
9511
  activationStage: "load-and-install",
9509
9512
  receiptStatusKey: "status",
9510
9513
  // #924: 公用《票面法》三席同装
9511
- sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md", "resources/countersign-ticket-issue.md", "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"]
9514
+ sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md", "souls/audit-law.md", "souls/quality-law.md", "resources/countersign-ticket-issue.md", "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"]
9512
9515
  },
9513
9516
  {
9514
9517
  role: "secretariat",
@@ -9840,7 +9843,7 @@ var init_role_submission_declarations = __esm({
9840
9843
  },
9841
9844
  diarist: {
9842
9845
  label: "\u8D77\u5C45\u90CE\u8F93\u51FA",
9843
- description: "\u8D77\u5C45\u90CE\u4EA4\u5355\u7968 sessions \u6216\u591A\u7968\u9010\u7968 ticketSessions \u8FB9\u754C\uFF1B\u8BA4\u4E0D\u51FA\u672C\u5EAD\u5BF9\u8C61\u5219 escalate\u3002",
9846
+ description: "\u8D77\u5C45\u90CE\u4EA4\u5355\u7968 sessions \u6216\u591A\u7968\u9010\u7968 ticketSessions \u8FB9\u754C\uFF0C\u6216 escalate\u3002",
9844
9847
  promptSnippet: "\u8D77\u5C45\u90CE\u4EA4\u8FB9\u754C",
9845
9848
  parameters: diaristOutputSchema
9846
9849
  }
@@ -49,11 +49,14 @@ export function projectNotaryBoundFromFlags(getFlag) {
49
49
  ...(ticketNumber === undefined ? {} : { ticketNumber }),
50
50
  };
51
51
  }
52
- /** Assemble systemPrompt body from base + soul only (NO embedded bound JSON).
52
+ /** Assemble systemPrompt body from base + soul + the audited seat's Soul (NO embedded bound JSON).
53
53
  * Audited-run identity travels separately as `readingMaterial`; adapters fold
54
54
  * it into the provider-visible prompt at the send boundary. */
55
55
  export function assembleNotaryAgentStartPrompt(input) {
56
- return `${input.baseSystemPrompt}\n\n<notary_soul>\n${input.soul}\n</notary_soul>`;
56
+ const audited = input.audited === undefined
57
+ ? ""
58
+ : `\n\n<audited_seat_soul seat="${input.audited.seat}">\n${input.audited.soul}\n</audited_seat_soul>`;
59
+ return `${input.baseSystemPrompt}\n\n<notary_soul>\n${input.soul}\n</notary_soul>${audited}`;
57
60
  }
58
61
  export function createNotaryRoleRuntime(pi, dependencies, host) {
59
62
  let activation;
@@ -74,9 +77,11 @@ export function createNotaryRoleRuntime(pi, dependencies, host) {
74
77
  if (soul.length === 0)
75
78
  throw new Error("Notary soul is empty");
76
79
  const sourceRun = await dependencies.loadSourceRunLocator(path);
80
+ const auditedSoul = (await dependencies.loadAuditedSoul(sourceRun.role))?.trim();
77
81
  activation = {
78
82
  soul,
79
83
  sourceRun,
84
+ ...(auditedSoul === undefined || auditedSoul === "" ? {} : { auditedSoul }),
80
85
  ...(admitted?.ticketNumber === undefined
81
86
  ? {}
82
87
  : { ticketNumber: admitted.ticketNumber }),
@@ -96,6 +101,9 @@ export function createNotaryRoleRuntime(pi, dependencies, host) {
96
101
  systemPrompt: assembleNotaryAgentStartPrompt({
97
102
  baseSystemPrompt: event.systemPrompt,
98
103
  soul: activation.soul,
104
+ ...(activation.auditedSoul === undefined
105
+ ? {}
106
+ : { audited: { seat: activation.sourceRun.role, soul: activation.auditedSoul } }),
99
107
  }),
100
108
  readingMaterial: projectNotaryAuditedRunIdentity({
101
109
  sourceRun: activation.sourceRun,
@@ -26,6 +26,7 @@ const NOTARY_SESSION_MATERIALS = [
26
26
  "souls/notary.md",
27
27
  "souls/audit-law.md",
28
28
  "souls/ticket-law.md",
29
+ "souls/quality-law.md",
29
30
  "souls/gate-output-guide.md",
30
31
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
31
32
  ];
@@ -41,6 +42,7 @@ const AUDITOR_PUBLIC_SESSION_MATERIALS = [
41
42
  "CLAUDE.md",
42
43
  "souls/judge-auditor.md",
43
44
  "souls/doctor-auditor.md",
45
+ "souls/judge.md",
44
46
  "souls/audit-law.md",
45
47
  "souls/quality-law.md",
46
48
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
@@ -292,7 +294,7 @@ const PUBLIC_ROLE_RECORDS = [
292
294
  activationStage: "load-and-install",
293
295
  receiptStatusKey: "status",
294
296
  // #924: 公用《票面法》三席同装
295
- sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md", "resources/countersign-ticket-issue.md", "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"]
297
+ sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md", "souls/audit-law.md", "souls/quality-law.md", "resources/countersign-ticket-issue.md", "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"]
296
298
  },
297
299
  {
298
300
  role: "secretariat",
@@ -9612,7 +9612,7 @@ var init_ticket_provenance_contracts = __esm({
9612
9612
  });
9613
9613
 
9614
9614
  // src/diarist-contracts.ts
9615
- var DIARIST_OUTPUT_TOOL_NAME, DIARIST_SESSIONS_DESCRIPTION, diaristOutputSchema;
9615
+ var DIARIST_OUTPUT_TOOL_NAME, DIARIST_BOUND_ENDPOINTS, DIARIST_SESSIONS_DESCRIPTION, diaristOutputSchema;
9616
9616
  var init_diarist_contracts = __esm({
9617
9617
  "src/diarist-contracts.ts"() {
9618
9618
  "use strict";
@@ -9623,7 +9623,8 @@ var init_diarist_contracts = __esm({
9623
9623
  init_run_ticket_number();
9624
9624
  init_unknown_value();
9625
9625
  DIARIST_OUTPUT_TOOL_NAME = "ak_diarist_output";
9626
- DIARIST_SESSIONS_DESCRIPTION = "\u5BF9\u8BDD\u8FB9\u754C\u3002\u6BCF\u5377\u542B path\uFF08\u4F1A\u8BDD\u5377\u7EDD\u5BF9\u6216\u53EF\u8BFB\u8DEF\u5F84\uFF09\u4E0E ranges\uFF08\u672C\u5377\u672C\u8F6E\u5404\u533A\u95F4\uFF09\u3002\u6BCF\u6BB5\u533A\u95F4\u542B from / to\uFF1B\u8D77\u70B9\u4E0E\u7EC8\u70B9\u5404\u5199 id\uFF08\u539F\u751F id\uFF09\u6216 line\uFF08\u672C\u8F6E\u884C\u53F7\uFF09\uFF0C\u4E8C\u9009\u4E00\u3002\u7A7A\u5217\u8868\uFF1D\u672C\u8F6E\u65E0\u5BF9\u8BDD\u53EF\u5212\u3002\u7AEF\u70B9\u65E0\u6CD5\u6307\u540D\u65F6\u8D70 reask\uFF0C\u4E0D\u4E2D\u6B62\u3002";
9626
+ DIARIST_BOUND_ENDPOINTS = "\u8D77\u70B9\u4E0E\u7EC8\u70B9\u5404\u5199 id \u6216 line\uFF0C\u4E8C\u9009\u4E00\uFF1Aid\uFF1D\u4F1A\u8BDD\u5377\u91CC\u90A3\u4E00\u884C JSON \u7684 uuid \u5B57\u6BB5\u503C\uFF08\u6CA1\u6709 uuid \u53D6 id\uFF1B\u9876\u5C42\u90FD\u6CA1\u6709\u518D\u53D6 message \u6216 payload \u91CC\u7684 uuid / id\uFF09\uFF0C\u540C\u4E00 id \u51FA\u73B0\u591A\u6B21\u65F6\u53D6\u7B2C\u4E00\u6B21\u51FA\u73B0\u7684\u90A3\u4E00\u884C\uFF1Bline\uFF1D\u90A3\u4E00\u884C\u5728\u6587\u4EF6\u91CC\u4ECE 1 \u6570\u8D77\u7684\u884C\u53F7\u3002\u4E24\u7AEF\u90FD\u542B\u5728\u533A\u95F4\u5185\u3002";
9627
+ DIARIST_SESSIONS_DESCRIPTION = `\u5BF9\u8BDD\u8FB9\u754C\u3002\u6BCF\u5377\u542B path\uFF08\u4F1A\u8BDD\u5377\u7EDD\u5BF9\u6216\u53EF\u8BFB\u8DEF\u5F84\uFF09\u4E0E ranges\uFF08\u672C\u5377\u672C\u8F6E\u5404\u533A\u95F4\uFF09\u3002\u6BCF\u6BB5\u533A\u95F4\u542B from / to\uFF1B${DIARIST_BOUND_ENDPOINTS}\u533A\u95F4\u91CC\u53EA\u6709\u8BF4\u8BDD\u4EBA\u7684\u539F\u6587\u8FDB\u5F55\uFF1A\u7528\u6237\u4E0E\u52A9\u624B\u6D88\u606F\u91CC\u7684\u6587\u672C\u3001\u771F\u4EBA\u7ECF\u961F\u5217\u7684\u63D2\u8BDD\uFF1B\u601D\u8003\u3001\u5DE5\u5177\u8C03\u7528\u3001\u5DE5\u5177\u7ED3\u679C\u548C\u673A\u5668\u901A\u77E5\u4E0D\u8FDB\u5F55\uFF0C\u533A\u95F4\u53EF\u4EE5\u76F4\u63A5\u8DE8\u8FC7\u5B83\u4EEC\uFF0C\u4E0D\u5FC5\u62C6\u6BB5\u3002\u6BCF\u6B21\u4EA4\u5377\u7684\u8FB9\u754C\u7167\u6295\u5F71\u8FFD\u52A0\u8FDB\u672C\u7968\u8D77\u5C45\u5F55\uFF0C\u4E0D\u53BB\u91CD\uFF0C\u4E5F\u4E0D\u6539\u5DF2\u6709\u7684\u5F55\u3002\u7A7A\u5217\u8868\uFF1D\u672C\u8F6E\u65E0\u5BF9\u8BDD\u53EF\u5212\u3002\u7AEF\u70B9\u65E0\u6CD5\u6307\u540D\u65F6\u8D70 reask\uFF0C\u4E0D\u4E2D\u6B62\u3002`;
9627
9628
  diaristOutputSchema = withTerminatingOutputDeclarations(
9628
9629
  openToolObject(
9629
9630
  typebox_exports.Object({
@@ -9636,7 +9637,7 @@ var init_diarist_contracts = __esm({
9636
9637
  })
9637
9638
  ),
9638
9639
  reason: typebox_exports.Unknown({
9639
- description: "status \u4E3A escalate \u65F6\uFF1A\u8BA4\u4E0D\u51FA\u672C\u5EAD\u5BF9\u8C61\u7684\u539F\u56E0"
9640
+ description: "status \u4E3A escalate \u65F6\uFF1A\u4E0A\u5448\u7684\u539F\u56E0"
9640
9641
  }),
9641
9642
  sessions: typebox_exports.Optional(typebox_exports.Unknown({ description: DIARIST_SESSIONS_DESCRIPTION })),
9642
9643
  ticketSessions: typebox_exports.Unknown({
@@ -9888,6 +9889,7 @@ var init_packaged_role_registry = __esm({
9888
9889
  "souls/notary.md",
9889
9890
  "souls/audit-law.md",
9890
9891
  "souls/ticket-law.md",
9892
+ "souls/quality-law.md",
9891
9893
  "souls/gate-output-guide.md",
9892
9894
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
9893
9895
  ];
@@ -9903,6 +9905,7 @@ var init_packaged_role_registry = __esm({
9903
9905
  "CLAUDE.md",
9904
9906
  "souls/judge-auditor.md",
9905
9907
  "souls/doctor-auditor.md",
9908
+ "souls/judge.md",
9906
9909
  "souls/audit-law.md",
9907
9910
  "souls/quality-law.md",
9908
9911
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
@@ -10154,7 +10157,7 @@ var init_packaged_role_registry = __esm({
10154
10157
  activationStage: "load-and-install",
10155
10158
  receiptStatusKey: "status",
10156
10159
  // #924: 公用《票面法》三席同装
10157
- sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md", "resources/countersign-ticket-issue.md", "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"]
10160
+ sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md", "souls/audit-law.md", "souls/quality-law.md", "resources/countersign-ticket-issue.md", "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"]
10158
10161
  },
10159
10162
  {
10160
10163
  role: "secretariat",
@@ -11584,7 +11587,7 @@ var init_role_submission_declarations = __esm({
11584
11587
  },
11585
11588
  diarist: {
11586
11589
  label: "\u8D77\u5C45\u90CE\u8F93\u51FA",
11587
- description: "\u8D77\u5C45\u90CE\u4EA4\u5355\u7968 sessions \u6216\u591A\u7968\u9010\u7968 ticketSessions \u8FB9\u754C\uFF1B\u8BA4\u4E0D\u51FA\u672C\u5EAD\u5BF9\u8C61\u5219 escalate\u3002",
11590
+ description: "\u8D77\u5C45\u90CE\u4EA4\u5355\u7968 sessions \u6216\u591A\u7968\u9010\u7968 ticketSessions \u8FB9\u754C\uFF0C\u6216 escalate\u3002",
11588
11591
  promptSnippet: "\u8D77\u5C45\u90CE\u4EA4\u8FB9\u754C",
11589
11592
  parameters: diaristOutputSchema
11590
11593
  }
@@ -19021,6 +19024,7 @@ var init_auditor_soul = __esm({
19021
19024
  judge: [
19022
19025
  "CLAUDE.md",
19023
19026
  "souls/judge-auditor.md",
19027
+ "souls/judge.md",
19024
19028
  "souls/audit-law.md",
19025
19029
  "souls/quality-law.md",
19026
19030
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"
@@ -30,7 +30,7 @@ import { INSPECTOR_SOURCE_RUN_FLAG } from "./inspector-contracts.js";
30
30
  import { DIARIST_TOOL_SPEC, } from "./diarist-role.js";
31
31
  import { SECRETARIAT_OUTPUT_TOOL_SPEC, } from "./secretariat-role.js";
32
32
  import { SECRETARIAT_OUTPUT_TOOL_NAME } from "./secretariat-contracts.js";
33
- import { projectDiaristSessions, projectDiaristTicketSessions, } from "./diarist-contracts.js";
33
+ import { DIARIST_BOUND_ENDPOINTS, projectDiaristSessions, projectDiaristTicketSessions, } from "./diarist-contracts.js";
34
34
  import { commitDiaristProjection } from "./diarist.js";
35
35
  import { TicketProvenanceInputError } from "./ticket-provenance.js";
36
36
  import { GATEKEEPER_TOOL_SPEC, } from "./gatekeeper-role.js";
@@ -480,7 +480,7 @@ function readDiaristRunCoordinates(ctx) {
480
480
  };
481
481
  }
482
482
  /** Plain-language re-ask when diarist bounds cannot be used (#901 / reask-not-explode). */
483
- const DIARIST_BOUNDS_REASK = "边界无法使用。多票请逐票重交 ticketSessions,单票重交 sessions;每卷 path + ranges,每端以原生 id 或本轮行号二选一指名。";
483
+ const DIARIST_BOUNDS_REASK = `边界无法使用。多票请逐票重交 ticketSessions,单票重交 sessions;每卷 path + ranges。${DIARIST_BOUND_ENDPOINTS}`;
484
484
  /**
485
485
  * #708 / #779 / #901: 起居郎 public seat on the shared filed-officer envelope.
486
486
  * LLM judges ticket + dialogue bounds; mechanical layer reprojects the unique
@@ -1038,6 +1038,9 @@ deliveryRequestLimit) {
1038
1038
  throw new Error("Notary runtime dependencies are not configured");
1039
1039
  return dependencies.loadNotarySourceRun(path);
1040
1040
  },
1041
+ async loadAuditedSoul(role) {
1042
+ return packagedRoleMetadata(role) === undefined ? undefined : requireRoleSoul(role);
1043
+ },
1041
1044
  }, hostActions);
1042
1045
  const countersign = createCountersignRoleRuntime(roleHost, {
1043
1046
  loadSoul: () => requireRoleSoul("countersign"),
@@ -109,7 +109,7 @@ const SUBMISSION_FACE = {
109
109
  },
110
110
  diarist: {
111
111
  label: "起居郎输出",
112
- description: "起居郎交单票 sessions 或多票逐票 ticketSessions 边界;认不出本庭对象则 escalate。",
112
+ description: "起居郎交单票 sessions 或多票逐票 ticketSessions 边界,或 escalate。",
113
113
  promptSnippet: "起居郎交边界",
114
114
  parameters: diaristOutputSchema,
115
115
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akagilnc/pi-workflow-roles",
3
- "version": "0.1.5862",
3
+ "version": "0.1.5873",
4
4
  "description": "Soul-bound workflow roles for Pi",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -31,7 +31,7 @@
31
31
 
32
32
  ## 工序
33
33
 
34
- 从任务材料与 `--pr` / `--request-manifest` 材料判定目标后,用宿主 CLI 读取有评审的 PR,按各 reviewer 已记录的完成形态收集 findings,整理并交卷。未绑定 PR 时用 `gh` 等自行定位;无法确定时不猜,交给调用方明确目标。证据归属与不确定性的报告原则见 [通进司 Soul](../souls/collector.md),字段见 [交卷契约](../src/package-contracts/collector-output.ts)。
34
+ 从任务材料与 `--pr` / `--request-manifest` 材料判定目标后,用宿主 CLI 读取有评审的 PR,按各 reviewer 已记录的完成形态收集 findings,整理并交卷。未绑定 PR 时用 `gh` 等自行定位;无法确定时不猜,交给调用方明确目标。证据归属与不确定性的报告原则见通进司 Soul,字段见交卷工具的声明。
35
35
 
36
36
  ## 修正规则
37
37
 
@@ -13,7 +13,7 @@
13
13
  - 本仓相关会话卷(路径里的 `_` 在目录名里常写作 `-`;主 clone 与 worktree 可能共用或分列,自行辨认)
14
14
  - 本票票面与评论:用 `gh` 或等价方式读 GitHub issue
15
15
 
16
- 指令明确列出多张要办的票时,逐票读卷判断各自相关边界;共同对话可以同时归入相关各票,无关他票对话不得混入。单票/多票交卷字段及不可用边界的处置见 [交卷工具 schema](../src/diarist-role.ts)。
16
+ 指令明确列出多张要办的票时,逐票读卷判断各自相关边界;共同对话可以同时归入相关各票,无关他票对话不得混入。单票/多票交卷字段及不可用边界的处置见交卷工具的声明。
17
17
 
18
18
  ## 何谓本票对话
19
19
 
@@ -34,6 +34,7 @@
34
34
  - 认得出本庭对象:`status: completed` 且 `ticketNumber: N`,并交边界。
35
35
  - 真无票对象(方案/派单/处置案等):`status: completed` 且 `ticketNumber: null`(或省略)。真无票是合法结果,不入录。
36
36
  - 本庭明确要新建票、但 issue 尚未建号:不是认票失败。以 `status: completed`、`ticketNumber: null` 交出已辨明的本案对话边界;起居录先随无号 run 暂存,建号后由既有归卷流程补归该号。不要借用旁票号。
37
- - 认不出本庭对象是哪一张:`status: escalate` 并写明 `reason`。识别不了就上抛,不得省略票号假装无录,也不得猜一个号。
37
+ - 认不出本庭对象是哪一张:不得省略票号假装无录,也不得猜一个号;何时上呈依 Soul,上呈时写明 `reason`。
38
38
  - 不得从旁及的他票或任何猜测里挑一个号顶替认不出的身份。
39
39
  - 传召文自然会提轮次、决定编号、commit sha、邻票号;要办的是指令明确列出的票,不是文中出现的每一个数字。
40
+ - 召你的那一席会把它自己收到的派单原样转给你,里面要求写票、改票、判卷的话是给那一席的;你只认票、交边界,不改票面、不替它办。
package/souls/notary.md CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  **二、核旨**:受审之物是票面本身——`gh issue view N` 的现行全文,加起居录与源卷里陛下的原话。先独立做完条款表,再开给事中这一轮的判词对照;判词是待核主张,不是你的依据。
10
10
  只有一个方向:先把票面「要做什么」「怎么验」里每一条改变实际行为的条款逐条列出(一条一行,照原文,不合并、不改写),写进交卷的 clauses;再为每一条找陛下哪一句原话推得出它——填那句的 uuid(ownerUuid)和一句推导(derivation:从那句话的哪个意思到这条条款)。推不出的,ownerUuid 填 null、derivation 写「无原话」。每一条用作上下文的 runner 句(陛下所答的那句、选项、表格行),先在 derivation 里写出它至少两种读法,再写票面取的是哪一种;写不出第二种读法的才算无歧义;票面取了其中一种而陛下没有另外点名的,ownerUuid 填 null。「承接设计」「保留现有能力」「合理」「接缝归属」这类话不是推导,不能顶替 uuid。
11
- clauses 里有任何一条 ownerUuid 为 null,status 只能是 escalate,并把这些条款原文列进 decisionGate 请陛下定;有条款与所引原话的意思相抵的,continue,点名该条;全部条款都有 uuid 且推导成立,才可 converged。
11
+ clauses 里有任何一条 ownerUuid 为 null,status 只能是 escalate,并把这些条款原文列进 decisionGate 请陛下定;有条款与所引原话的意思相抵的,点名该条,再按「结论」对给事中这一轮的判词定署或封驳。
12
12
  **是否符合陛下原意**——先根据起居录对话判断陛下意图,再看受审之物 是不是陛下想要的;字面对得上、意思不对(曲解、断章、只取字面不取法意)同为病。
13
13
  **陛下原话逐句核销**——起居录里陛下对本票说过的每一句,逐句过:先写明它答的是起居录哪一句、哪一行(问句、表格行、选项),那一句描述的对象是什么,写进判词证据;再问他这句话想要什么、在担心什么,再看受审之物给没给到——不是为了凑齐引文。受审之物动作的对象比所答对象大——答的是代码代劳却删席位、删衙门、删能力、改流程——而原话没有点名该对象的,封驳。衙门与替它干活的代码是两个对象:说某机制多余、可以删,不是说撤该衙门;席位、衙门、能力的存废只认点名它本身的原话。质问句——陛下在问这张票、这条约束凭什么存在——是对受审之物的未决挑战,不是授权:没被事实或适用的法答掉的,或被摘来当「支持」的,封驳。runner 在录里已自认不成立的理由仍撑着受审之物的,同。
14
14
  **找不到陛下原话**——受审之物里方向、设计、决策一级的条款,从陛下的意思推不出、又指不出哪条过了审的法源的,即加戏。不得以「授权实质在录」放行。
@@ -32,4 +32,4 @@
32
32
 
33
33
  ## 结论
34
34
 
35
- 结论三态,裁的是票面每一条条款有没有陛下原话撑着:'converged'(署)——clauses 每条都有 ownerUuid 且推导成立;'continue'(封驳)——有条款与所引原话相抵,退签发方改;'escalate'(上呈)——有条款 ownerUuid 为 null(无原话),陛下定。
35
+ 结论三态,裁的是被审衙门这一轮的判词站不站得住(票庭是给事中,大理寺庭是大理寺),条款表是你的依据:'converged'(署)——站得住,不论它署了票还是封驳了票:它署了票,而条款表每条都有 uuid 且推导成立;或它封驳了票、退签发方改,而你也查出该改的地方。'continue'(封驳)——站不住,要被审衙门改判重交:它署了票,而条款表查出与原话相抵的条款;或它封驳的理由在原话上不成立。'escalate'(上呈)——有条款 ownerUuid 为 null(无原话),陛下定。
@@ -1,16 +1,17 @@
1
1
  /**
2
2
  * Shared audited-run identity for review-officer startup materials (#1166 / ADR 0087).
3
- * Value form is `<runId>@<席>` only — no directory path.
3
+ * Value form is `<runId>@<席>` only — no directory path. The field is named
4
+ * `auditedRun` so the reader sees it names the run under review, not itself.
4
5
  */
5
6
  import { basename } from "node:path";
6
7
 
7
8
  import { formatRunLeaf, parseRunLeaf } from "./role-run-placement.ts";
8
9
 
9
- export const AUDITED_RUN_IDENTITY_KIND = "audited-run-identity" as const;
10
+ export const AUDITED_RUN_IDENTITY_KIND = "audited-run" as const;
10
11
 
11
12
  export type AuditedRunIdentityMaterial = {
12
13
  readonly kind: typeof AUDITED_RUN_IDENTITY_KIND;
13
- readonly identity: string;
14
+ readonly auditedRun: string;
14
15
  };
15
16
 
16
17
  /** Identity leaf from a run directory basename; undefined when the leaf is not `runId@role`. */
@@ -21,7 +22,7 @@ export function auditedRunIdentityFromDirectory(runDirectory: string): string |
21
22
  }
22
23
 
23
24
  export function auditedRunIdentityMaterial(identity: string): AuditedRunIdentityMaterial {
24
- return { kind: AUDITED_RUN_IDENTITY_KIND, identity };
25
+ return { kind: AUDITED_RUN_IDENTITY_KIND, auditedRun: identity };
25
26
  }
26
27
 
27
28
  /** Identity from locator fields already in hand (notary source-run). */
@@ -43,7 +43,8 @@ function auditorSoulRelativePath(role: AuditorSoulRole): string {
43
43
  }
44
44
 
45
45
  /**
46
- * #470 auditor session materials. Judge carries audit-law + quality-law; doctor does
46
+ * #470 auditor session materials. Judge carries the audited judge Soul + audit-law +
47
+ * quality-law (verdicts cite judge.md; audit-law makes the auditor check the cited line); doctor does
47
48
  * not (御批四: 参审席 = 大理寺主会话 + 其审计席; 太医线不动).
48
49
  * Reviewer auditor roster removed with #495 S6 gate retirement.
49
50
  * #675 owner: no generic auditor.md — subject selects this table.
@@ -52,6 +53,7 @@ export const AUDITOR_SESSION_MATERIALS = {
52
53
  judge: [
53
54
  "CLAUDE.md",
54
55
  "souls/judge-auditor.md",
56
+ "souls/judge.md",
55
57
  "souls/audit-law.md",
56
58
  "souls/quality-law.md",
57
59
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md",
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Public 起居郎 (diarist) terminating receipt contracts — ADR 0075 `diarist-is-role` / #901.
3
- * Lawful explicit releases: completed (入录) | escalate (认不出本庭对象上抛).
3
+ * Lawful explicit releases: completed (入录) | escalate (无法正常署时上呈,见 Soul).
4
4
  * Machine facts about the volume come from the mechanical reproject seam, never
5
5
  * from model self-report (锚定宪法); this module owns the receipt shape only.
6
6
  *
@@ -42,7 +42,7 @@ export type DiaristOutput =
42
42
  }[];
43
43
  }
44
44
  | {
45
- /** LLM cannot tell which ticket this summons is about — escalate, never wash into 无录. */
45
+ /** LLM cannot sign this round normally (Soul) — escalate, never wash into 无录. */
46
46
  readonly status: "escalate";
47
47
  readonly reason: string;
48
48
  };
@@ -100,8 +100,11 @@ export function projectDiaristTicketSessions(
100
100
  * sessions / ticketSessions 是投影所读的边界:卷路径或端点读不出时走既有 reask,不中止本轮。
101
101
  * 声明只留字段名和语义说明,不留类型、嵌套、长度、必填。
102
102
  */
103
+ export const DIARIST_BOUND_ENDPOINTS =
104
+ "起点与终点各写 id 或 line,二选一:id=会话卷里那一行 JSON 的 uuid 字段值(没有 uuid 取 id;顶层都没有再取 message 或 payload 里的 uuid / id),同一 id 出现多次时取第一次出现的那一行;line=那一行在文件里从 1 数起的行号。两端都含在区间内。" as const;
105
+
103
106
  const DIARIST_SESSIONS_DESCRIPTION =
104
- "对话边界。每卷含 path(会话卷绝对或可读路径)与 ranges(本卷本轮各区间)。每段区间含 from / to;起点与终点各写 id(原生 id)或 line(本轮行号),二选一。空列表=本轮无对话可划。端点无法指名时走 reask,不中止。" as const;
107
+ `对话边界。每卷含 path(会话卷绝对或可读路径)与 ranges(本卷本轮各区间)。每段区间含 from / to;${DIARIST_BOUND_ENDPOINTS}区间里只有说话人的原文进录:用户与助手消息里的文本、真人经队列的插话;思考、工具调用、工具结果和机器通知不进录,区间可以直接跨过它们,不必拆段。每次交卷的边界照投影追加进本票起居录,不去重,也不改已有的录。空列表=本轮无对话可划。端点无法指名时走 reask,不中止。` as const;
105
108
 
106
109
  export const diaristOutputSchema = withTerminatingOutputDeclarations(
107
110
  openToolObject(
@@ -116,7 +119,7 @@ export const diaristOutputSchema = withTerminatingOutputDeclarations(
116
119
  }),
117
120
  ),
118
121
  reason: Type.Unknown({
119
- description: "status 为 escalate 时:认不出本庭对象的原因",
122
+ description: "status 为 escalate 时:上呈的原因",
120
123
  }),
121
124
  sessions: Type.Optional(Type.Unknown({ description: DIARIST_SESSIONS_DESCRIPTION })),
122
125
  ticketSessions: Type.Unknown({
@@ -29,6 +29,8 @@ export {
29
29
  export type NotaryRoleDependencies = {
30
30
  loadSoul(): Promise<string>;
31
31
  loadSourceRunLocator(path: string): Promise<NotarySourceRunLocator>;
32
+ /** Soul of the audited seat (the verdict under review cites it); undefined when the package has none. */
33
+ loadAuditedSoul(role: string): Promise<string | undefined>;
32
34
  };
33
35
 
34
36
  export type NotaryRoleHostActions = {
@@ -95,14 +97,18 @@ export function projectNotaryBoundFromFlags(
95
97
  };
96
98
  }
97
99
 
98
- /** Assemble systemPrompt body from base + soul only (NO embedded bound JSON).
100
+ /** Assemble systemPrompt body from base + soul + the audited seat's Soul (NO embedded bound JSON).
99
101
  * Audited-run identity travels separately as `readingMaterial`; adapters fold
100
102
  * it into the provider-visible prompt at the send boundary. */
101
103
  export function assembleNotaryAgentStartPrompt(input: {
102
104
  readonly baseSystemPrompt: string;
103
105
  readonly soul: string;
106
+ readonly audited?: { readonly seat: string; readonly soul: string };
104
107
  }): string {
105
- return `${input.baseSystemPrompt}\n\n<notary_soul>\n${input.soul}\n</notary_soul>`;
108
+ const audited = input.audited === undefined
109
+ ? ""
110
+ : `\n\n<audited_seat_soul seat="${input.audited.seat}">\n${input.audited.soul}\n</audited_seat_soul>`;
111
+ return `${input.baseSystemPrompt}\n\n<notary_soul>\n${input.soul}\n</notary_soul>${audited}`;
106
112
  }
107
113
 
108
114
  /** Envelope-admitted ticket binding (flag read owned by shared envelope). */
@@ -119,6 +125,7 @@ export function createNotaryRoleRuntime(
119
125
  | {
120
126
  soul: string;
121
127
  sourceRun: NotarySourceRunLocator;
128
+ auditedSoul?: string;
122
129
  ticketNumber?: number;
123
130
  }
124
131
  | undefined;
@@ -142,9 +149,11 @@ export function createNotaryRoleRuntime(
142
149
  const soul = (await dependencies.loadSoul()).trim();
143
150
  if (soul.length === 0) throw new Error("Notary soul is empty");
144
151
  const sourceRun = await dependencies.loadSourceRunLocator(path);
152
+ const auditedSoul = (await dependencies.loadAuditedSoul(sourceRun.role))?.trim();
145
153
  activation = {
146
154
  soul,
147
155
  sourceRun,
156
+ ...(auditedSoul === undefined || auditedSoul === "" ? {} : { auditedSoul }),
148
157
  ...(admitted?.ticketNumber === undefined
149
158
  ? {}
150
159
  : { ticketNumber: admitted.ticketNumber }),
@@ -165,6 +174,9 @@ export function createNotaryRoleRuntime(
165
174
  systemPrompt: assembleNotaryAgentStartPrompt({
166
175
  baseSystemPrompt: event.systemPrompt,
167
176
  soul: activation.soul,
177
+ ...(activation.auditedSoul === undefined
178
+ ? {}
179
+ : { audited: { seat: activation.sourceRun.role, soul: activation.auditedSoul } }),
168
180
  }),
169
181
  readingMaterial: projectNotaryAuditedRunIdentity({
170
182
  sourceRun: activation.sourceRun,
@@ -37,6 +37,7 @@ export const NOTARY_SESSION_MATERIALS = [
37
37
  "souls/notary.md",
38
38
  "souls/audit-law.md",
39
39
  "souls/ticket-law.md",
40
+ "souls/quality-law.md",
40
41
  "souls/gate-output-guide.md",
41
42
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md",
42
43
  ] as const;
@@ -61,6 +62,7 @@ export const AUDITOR_PUBLIC_SESSION_MATERIALS = [
61
62
  "CLAUDE.md",
62
63
  "souls/judge-auditor.md",
63
64
  "souls/doctor-auditor.md",
65
+ "souls/judge.md",
64
66
  "souls/audit-law.md",
65
67
  "souls/quality-law.md",
66
68
  "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md",
@@ -319,7 +321,7 @@ export const PUBLIC_ROLE_RECORDS = [
319
321
  activationStage: "load-and-install",
320
322
  receiptStatusKey: "status",
321
323
  // #924: 公用《票面法》三席同装
322
- sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md", "resources/countersign-ticket-issue.md", "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"],
324
+ sessionMaterials: ["CLAUDE.md", "souls/countersign.md", "souls/ticket-law.md", "souls/audit-law.md", "souls/quality-law.md", "resources/countersign-ticket-issue.md", "docs/adr/0057-schema-narrowing-cuts-the-required-set-not-the-declared-set.md"],
323
325
  },
324
326
  {
325
327
  role: "secretariat",
@@ -96,6 +96,7 @@ import {
96
96
  } from "./secretariat-role.ts";
97
97
  import { SECRETARIAT_OUTPUT_TOOL_NAME } from "./secretariat-contracts.ts";
98
98
  import {
99
+ DIARIST_BOUND_ENDPOINTS,
99
100
  projectDiaristSessions,
100
101
  projectDiaristTicketSessions,
101
102
  } from "./diarist-contracts.ts";
@@ -785,7 +786,7 @@ function readDiaristRunCoordinates(ctx: HostContext): {
785
786
 
786
787
  /** Plain-language re-ask when diarist bounds cannot be used (#901 / reask-not-explode). */
787
788
  const DIARIST_BOUNDS_REASK =
788
- "边界无法使用。多票请逐票重交 ticketSessions,单票重交 sessions;每卷 path + ranges,每端以原生 id 或本轮行号二选一指名。" as const;
789
+ `边界无法使用。多票请逐票重交 ticketSessions,单票重交 sessions;每卷 path + ranges。${DIARIST_BOUND_ENDPOINTS}` as const;
789
790
  /**
790
791
  * #708 / #779 / #901: 起居郎 public seat on the shared filed-officer envelope.
791
792
  * LLM judges ticket + dialogue bounds; mechanical layer reprojects the unique
@@ -1383,6 +1384,9 @@ export function createRoleRuntimeExtension(
1383
1384
  if (!dependencies.loadNotarySourceRun) throw new Error("Notary runtime dependencies are not configured");
1384
1385
  return dependencies.loadNotarySourceRun(path);
1385
1386
  },
1387
+ async loadAuditedSoul(role) {
1388
+ return packagedRoleMetadata(role) === undefined ? undefined : requireRoleSoul(role as PackagedRole);
1389
+ },
1386
1390
  }, hostActions);
1387
1391
  const countersign = createCountersignRoleRuntime(roleHost, {
1388
1392
  loadSoul: () => requireRoleSoul("countersign"),
@@ -121,7 +121,7 @@ const SUBMISSION_FACE = {
121
121
  },
122
122
  diarist: {
123
123
  label: "起居郎输出",
124
- description: "起居郎交单票 sessions 或多票逐票 ticketSessions 边界;认不出本庭对象则 escalate。",
124
+ description: "起居郎交单票 sessions 或多票逐票 ticketSessions 边界,或 escalate。",
125
125
  promptSnippet: "起居郎交边界",
126
126
  parameters: diaristOutputSchema,
127
127
  },