@akagilnc/pi-workflow-roles 0.1.5241 → 0.1.5252

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +2 -3
  2. package/README.zh-CN.md +2 -3
  3. package/dist/acp-host/production-host.js +482 -3141
  4. package/dist/collector-config.js +0 -1
  5. package/dist/headless-host/production-host.js +590 -3249
  6. package/dist/migrate-book-topology.js +40 -107
  7. package/dist/navigator-invocation-identity.js +0 -57
  8. package/dist/package-contracts/collector-output.js +1 -90
  9. package/dist/package-contracts/terminating-tools.js +2 -2
  10. package/dist/packaged-role-registry.js +8 -11
  11. package/dist/public-cli/invocation.js +2 -22
  12. package/dist/public-cli/main.js +256 -749
  13. package/dist/public-cli/option-definitions.js +4 -19
  14. package/dist/public-cli/settlement.js +12 -138
  15. package/package.json +1 -1
  16. package/resources/collector-bot-handbook.md +4 -2
  17. package/src/collector-config.ts +0 -1
  18. package/src/collector-role.ts +40 -535
  19. package/src/collector-tool-schemas.ts +7 -117
  20. package/src/gh-api-runner.ts +102 -0
  21. package/src/navigator-invocation-identity.ts +4 -121
  22. package/src/package-contracts/collector-output.ts +15 -174
  23. package/src/package-contracts/terminating-tools.ts +0 -2
  24. package/src/packaged-role-registry.ts +7 -10
  25. package/src/public-cli/invocation.ts +3 -27
  26. package/src/public-cli/option-definitions.ts +4 -19
  27. package/src/public-cli/settlement.ts +11 -177
  28. package/src/role-runtime-dependencies.ts +0 -4
  29. package/src/role-runtime.ts +39 -103
  30. package/src/ticket-snapshot.ts +1 -1
  31. package/dist/collector-evidence.js +0 -319
  32. package/dist/collector-github.js +0 -725
  33. package/dist/collector-identity.js +0 -92
  34. package/dist/collector-ledger.js +0 -888
  35. package/dist/collector-target.js +0 -169
  36. package/src/collector-evidence.ts +0 -466
  37. package/src/collector-github.ts +0 -1032
  38. package/src/collector-handbook.ts +0 -194
  39. package/src/collector-identity.ts +0 -151
  40. package/src/collector-ledger.ts +0 -1186
  41. package/src/collector-target.ts +0 -207
@@ -69,7 +69,6 @@ import {
69
69
  parseCollectorRepository,
70
70
  type CollectorRepository,
71
71
  } from "../collector-config.ts";
72
- import { resolveCollectorTarget } from "../collector-target.ts";
73
72
  import { ownerRepoFromGitHubRemoteUrl } from "./github-remote.ts";
74
73
  import {
75
74
  FixerPacketValidationError,
@@ -231,13 +230,11 @@ export type AdmittedFixerInvocation = AdmittedRoleInvocationBase & {
231
230
 
232
231
  export type AdmittedCollectorInvocation = AdmittedRoleInvocationBase & {
233
232
  readonly role: "collector";
234
- /** Bound at admission when explicit/--pr or unique head/commit; otherwise role binds. */
233
+ /** Bound at admission when explicit --pr; otherwise the LLM locates via host CLI. */
235
234
  readonly prNumber?: number;
236
235
  readonly repository: CollectorRepository;
237
236
  readonly requestManifestPath?: string;
238
237
  readonly manifestDigest: string;
239
- /** Wait-window ms (#678 D4); default applied at role activate when omitted. */
240
- readonly waitWindowMs?: number;
241
238
  };
242
239
 
243
240
  export type AdmittedDoctorInvocation = AdmittedRoleInvocationBase & {
@@ -899,7 +896,6 @@ type SeatArgvFields = {
899
896
  prNumber?: number;
900
897
  repo?: string;
901
898
  requestManifestPath?: string;
902
- waitWindowMs?: number;
903
899
  issueNumber?: number;
904
900
  runs?: string;
905
901
  sourceRun?: string;
@@ -975,17 +971,6 @@ function assignPublicSeatOption(
975
971
  case "request-manifest":
976
972
  fields.requestManifestPath = requireOptionPath(taken.def.canonical, value);
977
973
  return;
978
- case "wait-ms": {
979
- if (value === undefined || !/^[1-9]\d*$/.test(value.trim())) {
980
- throw new CliUsageError("--wait-ms requires a positive safe-integer millisecond value");
981
- }
982
- const parsed = Number(value.trim());
983
- if (!Number.isSafeInteger(parsed) || parsed < 1) {
984
- throw new CliUsageError("--wait-ms requires a positive safe-integer millisecond value");
985
- }
986
- fields.waitWindowMs = parsed;
987
- return;
988
- }
989
974
  case "issue": {
990
975
  if (value === undefined || value.trim() === "") {
991
976
  throw new CliUsageError("doctor --issue requires a positive integer");
@@ -1100,7 +1085,6 @@ export function parsePublicSeatArgv(
1100
1085
  ...(fields.prNumber === undefined ? {} : { prNumber: fields.prNumber }),
1101
1086
  ...(fields.repo === undefined ? {} : { repo: fields.repo }),
1102
1087
  ...(fields.requestManifestPath === undefined ? {} : { requestManifestPath: fields.requestManifestPath }),
1103
- ...(fields.waitWindowMs === undefined ? {} : { waitWindowMs: fields.waitWindowMs }),
1104
1088
  ...(fields.issueNumber === undefined ? {} : { issueNumber: fields.issueNumber }),
1105
1089
  ...(fields.runs === undefined ? {} : { runs: fields.runs }),
1106
1090
  ...(fields.sourceRun === undefined ? {} : { sourceRun: fields.sourceRun }),
@@ -1485,7 +1469,6 @@ export type PublicSeatParse = {
1485
1469
  readonly prNumber?: number;
1486
1470
  readonly repo?: string;
1487
1471
  readonly requestManifestPath?: string;
1488
- readonly waitWindowMs?: number;
1489
1472
  readonly issueNumber?: number;
1490
1473
  readonly runs?: string;
1491
1474
  readonly sourceRun?: string;
@@ -1676,24 +1659,17 @@ export async function admitPublicRole(
1676
1659
  attachmentPaths,
1677
1660
  ...project,
1678
1661
  placedFields: async (placed) => {
1679
- // Task materials are frozen before target resolution (#676 A).
1680
- const target = await resolveCollectorTarget({
1681
- projectRoot,
1682
- repository,
1683
- ...(explicitPrNumber === undefined ? {} : { explicitPrNumber }),
1684
- });
1685
- const prNumber = target.kind === "bound" ? target.prNumber : undefined;
1662
+ // #1088: explicit --pr only. Unbound PR is located by the LLM via host CLI.
1686
1663
  let requestManifestPath: string | undefined;
1687
1664
  if (manifestCanonicalJson !== undefined) {
1688
1665
  requestManifestPath = join(placed.runDirectory, "request-manifest.json");
1689
1666
  await writeFile(requestManifestPath, manifestCanonicalJson, "utf8");
1690
1667
  }
1691
1668
  return {
1692
- ...(prNumber === undefined ? {} : { prNumber }),
1669
+ ...(explicitPrNumber === undefined ? {} : { prNumber: explicitPrNumber }),
1693
1670
  repository: repository.canonical,
1694
1671
  repositoryDisplay: repository.display,
1695
1672
  ...(requestManifestPath === undefined ? {} : { requestManifestPath }),
1696
- ...(parsed.waitWindowMs === undefined ? {} : { waitWindowMs: parsed.waitWindowMs }),
1697
1673
  manifestDigest,
1698
1674
  };
1699
1675
  },
@@ -524,13 +524,12 @@ const COLLECTOR_OPTIONS = [
524
524
  canonical: "--pr",
525
525
  aliases: [],
526
526
  valueMetavar: "number",
527
- // #676 D1: optional when context uniquely determines the PR; ambiguous → require explicit.
528
527
  required: false,
529
528
  repeatable: false,
530
529
  form: "option",
531
530
  description: {
532
- en: "Positive GitHub pull request number. Optional when unique branch/HEAD association binds the PR, or when the Collector role can decide the target from task materials via bind-target; multi-candidate git context or a role that cannot decide requires an explicit value.",
533
- zh: "正整数 GitHub PR 号。分支/HEAD 唯一关联可绑定时可省略;亦可由通进司从任务材料经 bind-target 判定。git 多候选或角色无法判定时必须显式提供。",
531
+ en: "Positive GitHub pull request number. Optional when the Collector role locates the PR via host CLI from task materials.",
532
+ zh: "正整数 GitHub PR 号。可选;省略时由通进司经宿主 CLI 从任务材料自行定位。",
534
533
  },
535
534
  },
536
535
  {
@@ -557,22 +556,8 @@ const COLLECTOR_OPTIONS = [
557
556
  repeatable: false,
558
557
  form: "option",
559
558
  description: {
560
- en: "Optional request manifest JSON path ({requests:[{id,body}]}). Role may also decide request bodies from handbook/field activity without this file.",
561
- zh: "可选 request manifest JSON 路径({requests:[{id,body}]})。角色亦可依手册/现场自行判定请求正文,不必依赖本文件。",
562
- },
563
- },
564
- {
565
- id: "wait-ms",
566
- owner: "collector",
567
- canonical: "--wait-ms",
568
- aliases: [],
569
- valueMetavar: "ms",
570
- required: false,
571
- repeatable: false,
572
- form: "option",
573
- description: {
574
- en: "Wait-window duration in milliseconds after the work step opens (default 600000 = 10 minutes). Does not require a code change to adjust.",
575
- zh: "工作步骤开启后的等待窗时长(毫秒;默认 600000=十分钟)。改配置即可,无需改代码。",
559
+ en: "Optional request manifest JSON path ({requests:[{id,body}]}). Parsed for semantics and passed to the Collector as materials — not a machine collection directive.",
560
+ zh: "可选 request manifest JSON 路径({requests:[{id,body}]})。按语义解析后作为材料递给通进司,不是机器代收 finding 的指令。",
576
561
  },
577
562
  },
578
563
  ] as const satisfies readonly PublicOptionDefinition[];
@@ -42,13 +42,8 @@ import {
42
42
  // COMPLIANCE_RESPONSE_ENTRY_TYPE remains for boundRetainedAuditResponse (call/result
43
43
  // interval binding on historical session bytes). Provider-stop retain authority is Sitian.
44
44
  import {
45
- COLLECTOR_BIND_TARGET_TOOL,
46
- COLLECTOR_OBSERVE_TOOL,
47
- COLLECTOR_READ_TOOL,
48
- COLLECTOR_REQUEST_TOOL,
49
- COLLECTOR_WAIT_TOOL,
50
- } from "../collector-ledger.ts";
51
- import { ENGINE_DETOUR_TOOL_NAME } from "../engine-detour.ts";
45
+ ENGINE_DETOUR_TOOL_NAME,
46
+ } from "../engine-detour.ts";
52
47
  import {
53
48
  projectEngineDetourToolUsageForPublicTerminal,
54
49
  readEngineDetourToolUsage,
@@ -61,9 +56,6 @@ import {
61
56
  JUDGE_OUTPUT_TOOL_NAME,
62
57
  type JudgeVerdict,
63
58
  } from "../package-contracts/judge-output.ts";
64
- import {
65
- COLLECTOR_OUTPUT_TOOL,
66
- } from "../package-contracts/collector-output.ts";
67
59
  import {
68
60
  CODER_OUTPUT_TOOL_NAME,
69
61
  FIXER_OUTPUT_TOOL_NAME,
@@ -80,7 +72,6 @@ import {
80
72
  import {
81
73
  packagedAuditToolName,
82
74
  packagedDurableOfficerEntry,
83
- packagedProjectsTargetBindRejection,
84
75
  packagedRoleAcceptedOutputTool,
85
76
  packagedRoleMetadata,
86
77
  packagedSkipsGateOnInfrastructureStage,
@@ -97,11 +88,7 @@ import {
97
88
  findLatestDurablePackagedRoleTerminal,
98
89
  hasNavigatorInfrastructureFailureBase,
99
90
  isAcceptedPackagedRoleTerminalResult,
100
- isReceiptSettlementBindingClear,
101
- NAVIGATOR_INVOCATION_ENTRY,
102
91
  NAVIGATOR_ROUTE_PLAYBOOK_FAILURE_ENTRY,
103
- parseInvocationMarkerIdentity,
104
- type InvocationMarkerIdentity,
105
92
  } from "../navigator-invocation-identity.ts";
106
93
  import {
107
94
  NO_RECEIPT_LIFECYCLE_ENTRY_TYPE,
@@ -1504,34 +1491,6 @@ function toolResultText(message: SessionMessage): string {
1504
1491
  .trim();
1505
1492
  }
1506
1493
 
1507
- /**
1508
- * #676 D1/J3: durable bind-target rejection on the current attempt → public no_receipt facts.
1509
- * Callers must learn they need explicit --pr without opening the session 正本.
1510
- * Authority is the latest bind-target toolResult only — a later success clears an earlier failure.
1511
- */
1512
- function extractCollectorTargetBindRejection(
1513
- entries: readonly SessionEntry[],
1514
- ): { readonly diagnostic: string; readonly code?: string } | undefined {
1515
- for (let i = entries.length - 1; i >= 0; i -= 1) {
1516
- const entry = entries[i];
1517
- if (entry?.type !== "message") continue;
1518
- const message = entry.message;
1519
- if (message?.role !== "toolResult") continue;
1520
- if (message.toolName !== COLLECTOR_BIND_TARGET_TOOL) continue;
1521
- // Latest bind result wins: success means the attempt is no longer rejected.
1522
- if (message.isError !== true) return undefined;
1523
- const diagnostic = toolResultText(message);
1524
- if (diagnostic.length === 0) return undefined;
1525
- const details = message.details;
1526
- const code =
1527
- isRecord(details) && typeof details.code === "string" && details.code.trim() !== ""
1528
- ? details.code
1529
- : undefined;
1530
- return code === undefined ? { diagnostic } : { diagnostic, code };
1531
- }
1532
- return undefined;
1533
- }
1534
-
1535
1494
  type BoundErroredToolCandidate = {
1536
1495
  candidate: unknown;
1537
1496
  diagnostic: string;
@@ -1552,14 +1511,6 @@ function boundErroredToolCandidate(
1552
1511
  : { candidate: bound.candidate, diagnostic, callIndex: bound.callIndex };
1553
1512
  }
1554
1513
 
1555
- /** Collector operational tools that fail closed via host infrastructure abort. */
1556
- const COLLECTOR_INFRASTRUCTURE_TOOLS = new Set<string>([
1557
- COLLECTOR_OBSERVE_TOOL,
1558
- COLLECTOR_READ_TOOL,
1559
- COLLECTOR_REQUEST_TOOL,
1560
- COLLECTOR_WAIT_TOOL,
1561
- ]);
1562
-
1563
1514
  /** Shared match/cause/identity knobs for session-principal infrastructure failures. */
1564
1515
  type InfrastructureFailureSpec = Readonly<{
1565
1516
  matchTool: (toolName: string) => boolean;
@@ -1567,22 +1518,11 @@ type InfrastructureFailureSpec = Readonly<{
1567
1518
  identityName: string;
1568
1519
  /**
1569
1520
  * Errored results only count as infrastructure when the durable details carry
1570
- * the typed navigator fact. ak_collector_read also rejects known correctable
1571
- * misuses (CollectorUnknownEvidenceError pointer bounces) as errored tool
1572
- * results — those must not surface as CollectorInfrastructureError.
1521
+ * the typed navigator fact.
1573
1522
  */
1574
1523
  requireInfrastructureFact?: (toolName: string) => boolean;
1575
1524
  }>;
1576
1525
 
1577
- const COLLECTOR_INFRASTRUCTURE_FAILURE_SPEC: InfrastructureFailureSpec = {
1578
- matchTool: (toolName) => COLLECTOR_INFRASTRUCTURE_TOOLS.has(toolName),
1579
- cause: "activation",
1580
- identityName: "CollectorInfrastructureError",
1581
- // read alone has a correctable rejection mode (unknown/non-openable pointers);
1582
- // only its typed infrastructure-failure fact counts as a real host failure.
1583
- requireInfrastructureFact: (toolName) => toolName === COLLECTOR_READ_TOOL,
1584
- };
1585
-
1586
1526
  const ENGINE_DETOUR_INFRASTRUCTURE_FAILURE_SPEC: InfrastructureFailureSpec = {
1587
1527
  matchTool: (toolName) => toolName === ENGINE_DETOUR_TOOL_NAME,
1588
1528
  cause: "output",
@@ -1645,33 +1585,6 @@ async function readInfrastructureToolFailure(
1645
1585
  }
1646
1586
  }
1647
1587
 
1648
- /**
1649
- * Prefer a real Collector infrastructure tool failure already on the session
1650
- * principal over a later secondary provider-stop (failure-honesty).
1651
- * Observe/request/wait host failures keep their diagnostic identity (e.g. HTTP 404).
1652
- */
1653
- export function extractCollectorInfrastructureFailure(
1654
- entries: readonly SessionEntry[],
1655
- ): ControlledFailure | undefined {
1656
- return extractInfrastructureToolFailure(
1657
- entries,
1658
- COLLECTOR_INFRASTRUCTURE_FAILURE_SPEC,
1659
- );
1660
- }
1661
-
1662
- /** Read the bound session principal for a Collector infrastructure tool failure. */
1663
- export async function readCollectorInfrastructureFailure(
1664
- sessionFile: string,
1665
- ): Promise<ControlledFailure | undefined> {
1666
- return readInfrastructureToolFailure(
1667
- sessionFile,
1668
- COLLECTOR_INFRASTRUCTURE_FAILURE_SPEC,
1669
- // Multi-attempt resume: only a current-attempt infrastructure failure
1670
- // may preempt the current failure cause (#633).
1671
- { currentAttemptOnly: true },
1672
- );
1673
- }
1674
-
1675
1588
  /**
1676
1589
  * Prefer a real engine-detour infrastructure tool failure already on the session
1677
1590
  * principal over a later secondary provider-stop (failure-honesty / #357 T2).
@@ -1713,10 +1626,6 @@ const RUNNER_FAILURE_POLICY = {
1713
1626
  read: readEngineDetourInfrastructureFailure,
1714
1627
  rank: "record-first",
1715
1628
  },
1716
- "collector-known-first": {
1717
- read: readCollectorInfrastructureFailure,
1718
- rank: "known-first",
1719
- },
1720
1629
  } as const;
1721
1630
 
1722
1631
  /**
@@ -2008,23 +1917,6 @@ export async function appendRunAttemptHistory(
2008
1917
  } catch {}
2009
1918
  }
2010
1919
 
2011
- /**
2012
- * Minimal attendance provenance against the bound marker (ADR 0043).
2013
- * Keep only invocationId + post-terminal ordering. Runtime-self-produced
2014
- * role/phase/subject/version are not re-reconciled here (ADR 0042).
2015
- */
2016
- function navigatorAttendanceCorrelatedWithBoundMarker(
2017
- details: Record<string, unknown>,
2018
- attendanceIndex: number,
2019
- terminalIndex: number,
2020
- marker: InvocationMarkerIdentity,
2021
- ): boolean {
2022
- if (attendanceIndex <= terminalIndex) return false;
2023
- // Exact current invocation token is the bound marker principal.
2024
- if (details.invocationId !== marker.invocationId) return false;
2025
- return true;
2026
- }
2027
-
2028
1920
  function parseNavigatorAttendanceDetails(
2029
1921
  details: Record<string, unknown>,
2030
1922
  ): TerminalNavigatorFact {
@@ -2303,10 +2195,9 @@ export function extractNavigatorFact(
2303
2195
  function extractNavigatorAttendanceFact(
2304
2196
  entries: readonly SessionEntry[],
2305
2197
  ): TerminalNavigatorFact {
2306
- // Affirmative attendance only. Missing / uncorrelated / unparseable is never no-advice.
2307
- // Minimal provenance: latest durable terminal + nearest preceding marker +
2308
- // invocationId + post-terminal order. Marker↔terminal cardinality belongs to
2309
- // receipt settlement (isReceiptSettlementBindingClear), not attendance extraction.
2198
+ // Affirmative attendance only. Missing / unparseable is never no-advice.
2199
+ // The shared lifecycle places the settled event on this submission's closure;
2200
+ // an unrelated attendance message cannot supply another call's result.
2310
2201
  const terminal = findLatestDurablePackagedRoleTerminal(entries);
2311
2202
  if (terminal === undefined) {
2312
2203
  return {
@@ -2316,57 +2207,12 @@ function extractNavigatorAttendanceFact(
2316
2207
  };
2317
2208
  }
2318
2209
 
2319
- let markerIndex = -1;
2320
- for (let i = terminal.index - 1; i >= 0; i -= 1) {
2210
+ for (let i = terminal.index; i < entries.length; i += 1) {
2321
2211
  const entry = entries[i];
2322
- if (entry?.type === "custom" && entry.customType === NAVIGATOR_INVOCATION_ENTRY) {
2323
- markerIndex = i;
2324
- break;
2325
- }
2326
- }
2327
- if (markerIndex < 0) {
2328
- return {
2329
- disposition: "unavailable",
2330
- source: "unknown",
2331
- reason: "Navigator attendance is uncorrelated with session invocation facts",
2332
- };
2333
- }
2334
- const marker = parseInvocationMarkerIdentity(entries[markerIndex]?.data);
2335
- if (marker === undefined) {
2336
- return {
2337
- disposition: "unavailable",
2338
- source: "unknown",
2339
- reason: "Navigator attendance is uncorrelated with session invocation facts",
2340
- };
2341
- }
2342
-
2343
- for (let i = entries.length - 1; i >= 0; i -= 1) {
2344
- const entry = entries[i];
2345
- if (entry?.type === "custom_message" && entry.customType === "ak-navigator-attendance") {
2346
- const details = entry.message?.details ?? (entry as { details?: unknown }).details;
2347
- if (!isRecord(details)) {
2348
- return {
2349
- disposition: "unavailable",
2350
- source: "unknown",
2351
- reason: "Navigator attendance is unparseable",
2352
- };
2353
- }
2354
- if (
2355
- !navigatorAttendanceCorrelatedWithBoundMarker(
2356
- details,
2357
- i,
2358
- terminal.index,
2359
- marker,
2360
- )
2361
- ) {
2362
- return {
2363
- disposition: "unavailable",
2364
- source: "unknown",
2365
- reason: "Navigator attendance is uncorrelated with session invocation facts",
2366
- };
2367
- }
2368
- return parseNavigatorAttendanceDetails(details);
2369
- }
2212
+ if (entry?.type !== "custom" || entry.customType !== "ak-role-submission-closure") continue;
2213
+ const details = isRecord(entry.data) ? entry.data.navigator : undefined;
2214
+ if (!isRecord(details)) break;
2215
+ return parseNavigatorAttendanceDetails(details);
2370
2216
  }
2371
2217
  // Absence is not successful no-advice — require affirmative typed attendance.
2372
2218
  return {
@@ -3391,18 +3237,6 @@ export async function settleFailureTerminalResult(
3391
3237
  facts.attemptPointer === `current:${admitted.runDirectory}`
3392
3238
  ) {
3393
3239
  let decisiveFacts: NoReceiptLifecycleFacts & Record<string, unknown> = facts;
3394
- // #676 D1/J3: project durable bind-target rejection onto public no_receipt facts.
3395
- if (packagedProjectsTargetBindRejection(admitted.role)) {
3396
- const bindRejection = extractCollectorTargetBindRejection(entries.slice(attemptStart));
3397
- if (bindRejection !== undefined) {
3398
- decisiveFacts = {
3399
- ...facts,
3400
- targetBindRejected: true,
3401
- targetBindDiagnostic: bindRejection.diagnostic,
3402
- ...(bindRejection.code === undefined ? {} : { targetBindCode: bindRejection.code }),
3403
- };
3404
- }
3405
- }
3406
3240
  // #478: no_receipt is still a public Terminal — project accepted gate facts.
3407
3241
  // #953: empty public terminal face — clear every reader-adoptable prior face.
3408
3242
  await clearOppositeTerminalArtifactFace(admitted.runDirectory);
@@ -1,7 +1,6 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
 
4
- import { createGhCollectorGitHubTransport } from "./collector-github.ts";
5
4
  import { loadDoctorCase } from "./doctor-evidence.ts";
6
5
  import { createNativeNavigatorSessionFactory, createNavigatorAttendance } from "./navigator-attendance.ts";
7
6
  import { loadNavigatorWorkContext } from "./navigator-work-context.ts";
@@ -41,7 +40,6 @@ export function createRoleRuntimeDependencies(packageRoot: string): RoleRuntimeD
41
40
  // packageRoot is the install root (resources/ lives there). Never resolve via
42
41
  // import.meta.url — headless/acp production-host bundles live under dist/*/
43
42
  // and would otherwise look for dist/resources/ (#962).
44
- const collectorHandbookSeedPath = join(packageRoot, "resources/collector-bot-handbook.md");
45
43
  const navigatorSessionFactory = createNativeNavigatorSessionFactory();
46
44
  return {
47
45
  packageRoot,
@@ -49,8 +47,6 @@ export function createRoleRuntimeDependencies(packageRoot: string): RoleRuntimeD
49
47
  loadRoleSoul: loadRegisteredRoleSoul,
50
48
  loadFixPacket: (path) => readFile(path, "utf8"),
51
49
  loadCoderTask: (path) => readFile(path, "utf8"),
52
- loadCollectorHandbookSeed: () => readFile(collectorHandbookSeedPath, "utf8"),
53
- createCollectorTransport: () => createGhCollectorGitHubTransport(),
54
50
  loadDoctorCase,
55
51
  loadNotarySourceRun: loadNotarySourceRunLocator,
56
52
  loadMergerInput: async (path) => JSON.parse(await readFile(path, "utf8")),