@akagilnc/pi-workflow-roles 0.1.2004 → 0.1.2014

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.
@@ -9,7 +9,7 @@ import type { ComplianceDecision } from "./compliance-transport.ts";
9
9
  import { appendActiveSessionCustomEntry } from "./compliance-transport.ts";
10
10
  import { REVIEWER_CANDIDATE_ENTRY_TYPE } from "./dossier-resolution.ts";
11
11
  import { type ReviewerSpecDisposition } from "./reviewer-construction.ts";
12
- import { createReviewerDispatcher, type AcceptedReviewerDispatch, type AcceptedReviewerExecution, type ReviewerPinnedGitReader } from "./reviewer-dispatch.ts";
12
+ import { createReviewerDispatcher, type AcceptedReviewerDispatch, type AcceptedReviewerExecution, type ReviewerIssueFetcher, type ReviewerPinnedGitReader } from "./reviewer-dispatch.ts";
13
13
  import { ReviewerDispatchExecutionError, type ReviewerDispatchRunResult } from "./reviewer-agent.ts";
14
14
  import { createReviewerExecutionLedger, projectAcceptedDispatch, projectReviewerDispatchOutcome, type ReviewerExecutionRecord } from "./reviewer-execution-ledger.ts";
15
15
  import { assembleRuntimeReviewerReceipt } from "./reviewer-settlement.ts";
@@ -24,6 +24,8 @@ export type ReviewerAdmittedInputs = Readonly<{
24
24
  baseRevision: string;
25
25
  reviewScopeKeys?: readonly string[];
26
26
  authorityRefs?: readonly string[];
27
+ /** Typed #176 ticketNumber from admitted invocation (Spec self-fetch primary). */
28
+ ticketNumber?: number;
27
29
  }>;
28
30
 
29
31
  const reviewerOutputVariants = Type.Union([
@@ -35,6 +37,8 @@ export type ReviewerRoleDependencies = {
35
37
  loadSoul(): Promise<string>;
36
38
  loadCanonicalSkillBinding(name: "code-review"): Promise<AnyCanonicalSkillBinding>;
37
39
  createPinnedGitReader(): Promise<ReviewerPinnedGitReader>;
40
+ /** Injected issue-fetch capability; shared seam owns gh lifecycle. */
41
+ fetchIssue?: ReviewerIssueFetcher;
38
42
  runDispatch(execution: AcceptedReviewerExecution, options: { context: ExtensionContext; signal?: AbortSignal }): Promise<ReviewerDispatchRunResult>;
39
43
  shutdownAgent?(): Promise<void>;
40
44
  auditCompliance(options: { context: ExtensionContext; signal?: AbortSignal }): Promise<ComplianceDecision>;
@@ -86,6 +90,7 @@ export function createReviewerRoleRuntime(
86
90
  fixedBaseRevision = admitted.baseRevision;
87
91
  const reviewScopeKeys = admitted.reviewScopeKeys;
88
92
  const authorityRefs = admitted.authorityRefs;
93
+ const ticketNumber = admitted.ticketNumber;
89
94
  const loaded = await dependencies.loadCanonicalSkillBinding("code-review");
90
95
  if (loaded.name !== "code-review") throw new Error("Canonical Skill binding loader returned tdd for code-review");
91
96
  binding = loaded;
@@ -115,6 +120,8 @@ export function createReviewerRoleRuntime(
115
120
  reader,
116
121
  ...(reviewScopeKeys === undefined ? {} : { reviewScopeKeys }),
117
122
  ...(authorityRefs === undefined ? {} : { authorityRefs }),
123
+ ...(ticketNumber === undefined ? {} : { ticketNumber }),
124
+ ...(dependencies.fetchIssue === undefined ? {} : { fetchIssue: dependencies.fetchIssue }),
118
125
  decisionEvidence(decision) {
119
126
  try {
120
127
  if (decision.disposition === "accepted") {
@@ -56,6 +56,10 @@ export function assembleRuntimeReviewerReceipt(input: {
56
56
  ...(accepted.specDisposition === undefined
57
57
  ? {}
58
58
  : { specDisposition: accepted.specDisposition }),
59
+ // Self-fetch bytes + source annotation retained for audit (#343 fetch-then-store).
60
+ ...(accepted.specFetchedMaterial === undefined
61
+ ? {}
62
+ : { specFetchedMaterial: accepted.specFetchedMaterial }),
59
63
  }),
60
64
  reports,
61
65
  outcomes,
@@ -61,7 +61,7 @@ import {
61
61
  type ReviewerActivation,
62
62
  type ReviewerAdmittedInputs,
63
63
  } from "./reviewer-role.ts";
64
- import type { AcceptedReviewerExecution, ReviewerPinnedGitReader } from "./reviewer-dispatch.ts";
64
+ import type { AcceptedReviewerExecution, ReviewerIssueFetcher, ReviewerPinnedGitReader } from "./reviewer-dispatch.ts";
65
65
  import type { ReviewerDispatchRunResult } from "./reviewer-agent.ts";
66
66
  import {
67
67
  REVIEWER_VERIFICATION_BOUNDARY,
@@ -94,6 +94,13 @@ const REVIEWER_TRANSPORT_FLAGS = Object.freeze([
94
94
  type: "string" as const,
95
95
  }),
96
96
  }),
97
+ Object.freeze({
98
+ name: "ak-review-ticket-number",
99
+ definition: Object.freeze({
100
+ description: "Typed ticketNumber for Spec self-fetch primary path",
101
+ type: "string" as const,
102
+ }),
103
+ }),
97
104
  ] as const);
98
105
 
99
106
  /**
@@ -134,6 +141,13 @@ function decodeReviewerAdmittedInputs(getFlag: (name: string) => unknown): Revie
134
141
  authorityRefs = Object.freeze(parsed as string[]);
135
142
  }
136
143
 
144
+ let ticketNumber: number | undefined;
145
+ const rawTicketNumber = getFlag("ak-review-ticket-number");
146
+ // Shape-invalid flag values do not abort: omit typed candidate; branch→commit→degrade continues.
147
+ if (typeof rawTicketNumber === "string" && /^[1-9]\d*$/.test(rawTicketNumber)) {
148
+ ticketNumber = Number(rawTicketNumber);
149
+ }
150
+
137
151
  const baseRevision = getFlag("ak-review-base");
138
152
  if (typeof baseRevision !== "string" || !baseRevision.trim()) {
139
153
  throw new Error("Reviewer role requires --ak-review-base");
@@ -142,6 +156,7 @@ function decodeReviewerAdmittedInputs(getFlag: (name: string) => unknown): Revie
142
156
  baseRevision,
143
157
  ...(reviewScopeKeys === undefined ? {} : { reviewScopeKeys }),
144
158
  ...(authorityRefs === undefined ? {} : { authorityRefs }),
159
+ ...(ticketNumber === undefined ? {} : { ticketNumber }),
145
160
  });
146
161
  }
147
162
 
@@ -454,6 +469,8 @@ export type RoleRuntimeDependencies = {
454
469
  loadCoderTask?(path: string): Promise<string>;
455
470
  loadReviewerSoul?(): Promise<string>;
456
471
  createReviewerPinnedGitReader?(): Promise<ReviewerPinnedGitReader>;
472
+ /** Shared-seam issue-fetch capability for Reviewer Spec self-fetch (#343). */
473
+ createReviewerIssueFetcher?(): ReviewerIssueFetcher;
457
474
  loadCollectorSoul?(): Promise<string>;
458
475
  createCollectorTransport?(): CollectorGitHubTransport;
459
476
  loadDoctorSoul?(): Promise<string>;
@@ -892,6 +909,9 @@ export function createRoleRuntimeExtension(
892
909
  }
893
910
  return dependencies.loadCanonicalSkillBinding(name);
894
911
  },
912
+ ...(dependencies.createReviewerIssueFetcher === undefined
913
+ ? {}
914
+ : { fetchIssue: dependencies.createReviewerIssueFetcher() }),
895
915
  async runDispatch(dispatch, options) {
896
916
  if (dependencies.runReviewerDispatch === undefined) throw new Error("Reviewer runtime dependencies are not configured");
897
917
  return dependencies.runReviewerDispatch(dispatch, options);