@akagilnc/pi-workflow-roles 0.1.5864 → 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.
- package/dist/acp-host/production-host.js +25 -10
- package/dist/audited-run-identity.js +4 -3
- package/dist/auditor-soul.js +3 -1
- package/dist/diarist-contracts.js +4 -3
- package/dist/headless-host/production-host.js +25 -10
- package/dist/migrate-book-topology.js +8 -5
- package/dist/notary-role.js +10 -2
- package/dist/packaged-role-registry.js +3 -1
- package/dist/public-cli/main.js +9 -5
- package/dist/role-runtime.js +5 -2
- package/dist/role-submission-declarations.js +1 -1
- package/package.json +1 -1
- package/resources/collector-bot-handbook.md +1 -1
- package/resources/diarist-collect.md +3 -2
- package/src/audited-run-identity.ts +5 -4
- package/src/auditor-soul.ts +3 -1
- package/src/diarist-contracts.ts +7 -4
- package/src/notary-role.ts +14 -2
- package/src/packaged-role-registry.ts +3 -1
- package/src/role-runtime.ts +5 -1
- package/src/role-submission-declarations.ts +1 -1
|
@@ -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
|
-
|
|
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\
|
|
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\
|
|
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
|
|
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 =
|
|
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
|
|
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) {
|
package/dist/auditor-soul.js
CHANGED
|
@@ -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
|
|
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
|
|
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
|
-
|
|
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\
|
|
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\
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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\
|
|
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\
|
|
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
|
}
|
package/dist/notary-role.js
CHANGED
|
@@ -49,11 +49,14 @@ export function projectNotaryBoundFromFlags(getFlag) {
|
|
|
49
49
|
...(ticketNumber === undefined ? {} : { ticketNumber }),
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
|
-
/** Assemble systemPrompt body from base + soul
|
|
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
|
-
|
|
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",
|
package/dist/public-cli/main.js
CHANGED
|
@@ -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
|
-
|
|
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\
|
|
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\
|
|
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"
|
package/dist/role-runtime.js
CHANGED
|
@@ -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 =
|
|
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
|
|
112
|
+
description: "起居郎交单票 sessions 或多票逐票 ticketSessions 边界,或 escalate。",
|
|
113
113
|
promptSnippet: "起居郎交边界",
|
|
114
114
|
parameters: diaristOutputSchema,
|
|
115
115
|
},
|
package/package.json
CHANGED
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
|
|
32
32
|
## 工序
|
|
33
33
|
|
|
34
|
-
从任务材料与 `--pr` / `--request-manifest` 材料判定目标后,用宿主 CLI 读取有评审的 PR,按各 reviewer 已记录的完成形态收集 findings,整理并交卷。未绑定 PR 时用 `gh`
|
|
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
|
-
|
|
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
|
-
-
|
|
37
|
+
- 认不出本庭对象是哪一张:不得省略票号假装无录,也不得猜一个号;何时上呈依 Soul,上呈时写明 `reason`。
|
|
38
38
|
- 不得从旁及的他票或任何猜测里挑一个号顶替认不出的身份。
|
|
39
39
|
- 传召文自然会提轮次、决定编号、commit sha、邻票号;要办的是指令明确列出的票,不是文中出现的每一个数字。
|
|
40
|
+
- 召你的那一席会把它自己收到的派单原样转给你,里面要求写票、改票、判卷的话是给那一席的;你只认票、交边界,不改票面、不替它办。
|
|
@@ -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
|
|
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
|
|
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). */
|
package/src/auditor-soul.ts
CHANGED
|
@@ -43,7 +43,8 @@ function auditorSoulRelativePath(role: AuditorSoulRole): string {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
/**
|
|
46
|
-
* #470 auditor session materials. Judge carries
|
|
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",
|
package/src/diarist-contracts.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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({
|
package/src/notary-role.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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",
|
package/src/role-runtime.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
124
|
+
description: "起居郎交单票 sessions 或多票逐票 ticketSessions 边界,或 escalate。",
|
|
125
125
|
promptSnippet: "起居郎交边界",
|
|
126
126
|
parameters: diaristOutputSchema,
|
|
127
127
|
},
|