opencode-swarm 7.173.0 → 7.174.0

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 (103) hide show
  1. package/.opencode/skills/swarm-pr-review/references/findings-persistence-contract.md +37 -0
  2. package/binaries/win32-arm64/swarm-sandbox-runner.exe +0 -0
  3. package/binaries/win32-x64/swarm-sandbox-runner.exe +0 -0
  4. package/dist/agents/critic.d.ts +44 -2
  5. package/dist/background/pr-review-contract.d.ts +24 -0
  6. package/dist/background/stage-b-gates.d.ts +29 -0
  7. package/dist/cli/{coder-settlement-f60aqxyv.js → coder-settlement-pwct8te4.js} +11 -11
  8. package/dist/cli/{config-doctor-nvw2fwrn.js → config-doctor-tnta65bf.js} +2 -2
  9. package/dist/cli/{core-z68xfzar.js → core-421gbna2.js} +3 -3
  10. package/dist/cli/{curation-policy-tx4kb30e.js → curation-policy-dw25zm05.js} +5 -5
  11. package/dist/cli/{curator-drift-047n8fjw.js → curator-drift-x3tt8apf.js} +4 -4
  12. package/dist/cli/curator-llm-factory-4e73613g.js +72 -0
  13. package/dist/cli/{curator-93a3pyvv.js → curator-yrhc4epa.js} +36 -36
  14. package/dist/cli/{evidence-summary-service-s22vfx64.js → evidence-summary-service-f4vem356.js} +15 -15
  15. package/dist/cli/{gate-evidence-kz044xwh.js → gate-evidence-t2dyfvc4.js} +6 -6
  16. package/dist/cli/guardrail-explain-hf5gawe2.js +73 -0
  17. package/dist/cli/{guardrail-log-sh9ecphn.js → guardrail-log-9dkyvdbw.js} +7 -7
  18. package/dist/cli/{guardrail-reset-m56x3djm.js → guardrail-reset-26bxnh2e.js} +36 -36
  19. package/dist/cli/{hive-promoter-1hfyd1gn.js → hive-promoter-6s6xbq5x.js} +36 -36
  20. package/dist/cli/{index-tztqvzf5.js → index-0c7y177k.js} +2 -2
  21. package/dist/cli/{index-fxac6j9v.js → index-23fwhwrb.js} +36 -36
  22. package/dist/cli/{index-m08ee28a.js → index-2qawngxn.js} +8 -8
  23. package/dist/cli/{index-fnx0jzf7.js → index-2xwavnbg.js} +1 -1
  24. package/dist/cli/{index-z35ynvj4.js → index-3yw5h3bt.js} +1 -1
  25. package/dist/cli/{index-jmn35na4.js → index-5prgmf00.js} +3 -3
  26. package/dist/cli/{index-za1kvsa0.js → index-5t71wd7j.js} +2 -2
  27. package/dist/cli/{index-dktpzjy9.js → index-6tbnev6y.js} +1 -1
  28. package/dist/cli/{index-yzwb6ja4.js → index-6v1cz898.js} +1 -1
  29. package/dist/cli/{index-z1k5dvn0.js → index-8d3qzvbb.js} +2 -2
  30. package/dist/cli/{index-bsnpv4xd.js → index-8tn4yx8b.js} +2 -2
  31. package/dist/cli/{index-8xkr8p2b.js → index-9gpf4tt4.js} +8 -8
  32. package/dist/cli/{index-ejrqyrsr.js → index-bf6w27sb.js} +3 -3
  33. package/dist/cli/{index-ndvgkxpf.js → index-c60t3sw6.js} +2 -2
  34. package/dist/cli/{index-m51cmzxt.js → index-cw1nbtvh.js} +1 -1
  35. package/dist/cli/{index-evf5r7bk.js → index-czhbsgdh.js} +1 -1
  36. package/dist/cli/{index-579nzg03.js → index-ddz0a0ew.js} +1 -1
  37. package/dist/cli/{index-3312a4k1.js → index-dfd6d64k.js} +38 -38
  38. package/dist/cli/{index-sftt3gdv.js → index-dfey3jpn.js} +2 -2
  39. package/dist/cli/{index-nrsnman7.js → index-e4g3487s.js} +3 -3
  40. package/dist/cli/{index-mq2y8qpg.js → index-fagcasf8.js} +5 -5
  41. package/dist/cli/{index-gd40ehzt.js → index-hkx8tqa4.js} +6 -6
  42. package/dist/cli/{index-njdy6w9x.js → index-jd2f7thw.js} +2567 -2138
  43. package/dist/cli/{index-0dfhahxm.js → index-jj09bfnn.js} +2 -2
  44. package/dist/cli/{index-wr4m11x4.js → index-kj7h2yfv.js} +1 -1
  45. package/dist/cli/{index-pserzhck.js → index-kyakvkpk.js} +10 -3
  46. package/dist/cli/{index-1r2avghn.js → index-m8c44754.js} +5 -3
  47. package/dist/cli/{index-43dmpa9w.js → index-mjtja1wq.js} +2 -2
  48. package/dist/cli/{index-0y9fqm5d.js → index-mmnk7nt1.js} +19 -1
  49. package/dist/cli/{index-hhws1xkc.js → index-nwew2anc.js} +1 -1
  50. package/dist/cli/{index-3n16qq3z.js → index-nxnmy2da.js} +7 -7
  51. package/dist/cli/{index-fb5rj8sk.js → index-py58gern.js} +7 -7
  52. package/dist/cli/{index-915wxcgs.js → index-qc4nvg0m.js} +4 -4
  53. package/dist/cli/{index-10vr7289.js → index-rgvg7d6k.js} +1 -1
  54. package/dist/cli/{index-mt8pbzda.js → index-rjjtn1w5.js} +12 -12
  55. package/dist/cli/{index-nztmfgvw.js → index-s6wb6sjk.js} +4 -4
  56. package/dist/cli/{index-1pnw3jkr.js → index-saw0ambb.js} +10 -7
  57. package/dist/cli/{index-e8tscab8.js → index-snd34n1y.js} +65 -10
  58. package/dist/cli/{index-btxf9k1r.js → index-v8ykb3hq.js} +11 -11
  59. package/dist/cli/{index-kdyvk541.js → index-vsvdh976.js} +2 -2
  60. package/dist/cli/{index-7gkdxs00.js → index-vwjfm0s6.js} +7 -7
  61. package/dist/cli/index.js +37 -37
  62. package/dist/cli/{knowledge-escalator-zeackj4h.js → knowledge-escalator-bra0fkfm.js} +12 -12
  63. package/dist/cli/{knowledge-events-nfcgfhq2.js → knowledge-events-v4hq7wr9.js} +10 -10
  64. package/dist/cli/{knowledge-link-f7bhq7cx.js → knowledge-link-dw12x2ns.js} +4 -4
  65. package/dist/cli/{knowledge-store-jptt6kp5.js → knowledge-store-3hx2896s.js} +5 -5
  66. package/dist/cli/{knowledge-validator-e7nten5a.js → knowledge-validator-9wj31ym5.js} +7 -7
  67. package/dist/cli/{mcp-14kyj73d.js → mcp-d7yptqpg.js} +1 -1
  68. package/dist/cli/{pending-delegations-4jget283.js → pending-delegations-8ghc75b2.js} +11 -11
  69. package/dist/cli/{pr-subscriptions-qe0j6xyr.js → pr-subscriptions-yceed093.js} +11 -11
  70. package/dist/cli/{pr-workflow-gate-2m91qcm6.js → pr-workflow-gate-sc4c4cmk.js} +42 -36
  71. package/dist/cli/{runner-58k70bnr.js → runner-k1pmc3z8.js} +5 -5
  72. package/dist/cli/{scan-cursor-myzgmzj6.js → scan-cursor-mtja4626.js} +6 -6
  73. package/dist/cli/{schema-gws3yx52.js → schema-x2nb18fg.js} +5 -1
  74. package/dist/cli/{scope-persistence-fh1d8vs0.js → scope-persistence-tafxf6yz.js} +14 -14
  75. package/dist/cli/{server-v0wfd3rk.js → server-hk378mzc.js} +36 -36
  76. package/dist/cli/{skill-generator-935cmd3p.js → skill-generator-vz5vtgk6.js} +14 -14
  77. package/dist/cli/{snapshot-coordination-init-ad8n0977.js → snapshot-coordination-init-8x5n1q8c.js} +36 -36
  78. package/dist/cli/{telemetry-zed80n86.js → telemetry-m580862y.js} +1 -1
  79. package/dist/cli/{workspace-snapshot-62be4368.js → workspace-snapshot-6aw002e8.js} +3 -3
  80. package/dist/cli/{worktree-collision-ownership-txzvv5jv.js → worktree-collision-ownership-cfx1tsaf.js} +12 -12
  81. package/dist/cli/{worktree-isolation-tv749n96.js → worktree-isolation-t3fm1c5w.js} +36 -36
  82. package/dist/config/index.d.ts +2 -2
  83. package/dist/config/schema.d.ts +22 -8
  84. package/dist/events/core-events.d.ts +2 -0
  85. package/dist/evidence/task-gate-requirements.d.ts +24 -0
  86. package/dist/gate-evidence.d.ts +12 -0
  87. package/dist/hooks/pr-workflow-gate.d.ts +22 -0
  88. package/dist/index.d.ts +8 -0
  89. package/dist/index.js +481 -469
  90. package/dist/parallel/review-router.d.ts +8 -2
  91. package/dist/pr-review/completion.d.ts +2 -1
  92. package/dist/pr-review/finding-policy.d.ts +194 -0
  93. package/dist/review/routing-enforcement.d.ts +163 -0
  94. package/dist/session/snapshot-writer.d.ts +2 -0
  95. package/dist/state.d.ts +28 -0
  96. package/dist/tools/complete-pr-workflow.d.ts +2 -1
  97. package/dist/tools/tool-metadata.d.ts +16 -16
  98. package/dist/tools/update-task-status.d.ts +0 -10
  99. package/dist/tools/write-pr-review-artifact.d.ts +7 -0
  100. package/opencode-swarm.schema.json +11 -0
  101. package/package.json +1 -1
  102. package/dist/cli/curator-llm-factory-xkhzrdkk.js +0 -72
  103. package/dist/cli/guardrail-explain-5nyr0vnx.js +0 -73
@@ -16,10 +16,16 @@ export interface SemanticRoutingResult {
16
16
  routing: ReviewRouting;
17
17
  classifications: ClassifiedChange[];
18
18
  }
19
+ /**
20
+ * One bounded budget covers the complete route computation. The AST helper
21
+ * has its own per-file guard, but that alone does not bound the surrounding
22
+ * complexity scan plus the sequence of git/AST operations.
23
+ */
24
+ export declare const REVIEW_ROUTING_TIMEOUT_MS = 10000;
19
25
  /**
20
26
  * Compute complexity metrics for a set of files
21
27
  */
22
- export declare function computeComplexity(directory: string, changedFiles: string[]): Promise<ComplexityMetrics>;
28
+ export declare function computeComplexity(directory: string, changedFiles: string[], deadline?: number): Promise<ComplexityMetrics>;
23
29
  /**
24
30
  * Determine review routing based on complexity
25
31
  */
@@ -28,7 +34,7 @@ export declare function routeReview(metrics: ComplexityMetrics): ReviewRouting;
28
34
  * Attempt AST-based semantic classification of changes.
29
35
  * Returns null if AST analysis is unavailable, times out, or exceeds bounds.
30
36
  */
31
- export declare function computeSemanticClassifications(directory: string, changedFiles: string[]): Promise<ClassifiedChange[] | null>;
37
+ export declare function computeSemanticClassifications(directory: string, changedFiles: string[], deadline?: number): Promise<ClassifiedChange[] | null>;
32
38
  /**
33
39
  * Route review based on semantic classifications.
34
40
  * High-risk categories (GUARD_REMOVED, SIGNATURE_CHANGE, API_CHANGE,
@@ -39,6 +39,7 @@ import { z } from 'zod';
39
39
  import { type LaneOutputArtifact } from '../background/lane-output-store.js';
40
40
  import { type BackgroundDelegationRecord, type BackgroundDelegationResult, type BackgroundDelegationWorkflowLaneFailureClass } from '../background/pending-delegations.js';
41
41
  import { type PrReviewBaseDimensionId, type PrReviewResultReceipt } from '../background/pr-review-contract.js';
42
+ import { type FinalPolicyFinding } from './finding-policy.js';
42
43
  /** Declared lane shape of a base dispatch, as the settlement reads it. */
43
44
  export interface PrReviewCompletionLane {
44
45
  laneId: string;
@@ -202,7 +203,7 @@ export type PrReviewReportVerdict = (typeof PR_REVIEW_REPORT_VERDICTS)[number];
202
203
  * is a forced INCOMPLETE operational report. Neither may ever APPROVE or
203
204
  * claim a full review.
204
205
  */
205
- export declare function allowedPrReviewReportVerdicts(kind: PrReviewTerminalCoverageKind): readonly PrReviewReportVerdict[];
206
+ export declare function allowedPrReviewReportVerdicts(kind: PrReviewTerminalCoverageKind, findings?: ReadonlyArray<FinalPolicyFinding>): readonly PrReviewReportVerdict[];
206
207
  export interface PrReviewTerminalCoverageSettlement {
207
208
  kind: PrReviewTerminalCoverageKind;
208
209
  coveredDimensions: PrReviewBaseDimensionId[];
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Versioned PR-review finding synthesis and terminal projection policy.
3
+ *
4
+ * This is the policy boundary between authenticated lane output and the
5
+ * terminal report/handoff projections. It intentionally has no dependency on
6
+ * the workflow gate so it can be exercised in isolation and reused by every
7
+ * settlement caller.
8
+ */
9
+ import { type CoreEventCoverage } from '../events/core-events.js';
10
+ export declare const FINDING_POLICY_VERSION: 1;
11
+ export type FindingSeverity = 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW' | 'INFO' | 'NONE';
12
+ export type FindingAction = 'route_to_reviewer' | 'route_to_critic' | 'report' | 'suppress_with_reason' | 'handoff_to_feedback';
13
+ export type FindingStatus = 'UNRESOLVED' | 'CONFIRMED' | 'DISPROVED' | 'NON_ACTIONABLE' | 'PRE_EXISTING';
14
+ export type ConfidenceLabel = 'LOW' | 'MEDIUM' | 'HIGH';
15
+ export type CriticOutcome = 'UPHELD' | 'DOWNGRADED' | 'DISPROVED' | 'NEEDS_MORE_EVIDENCE';
16
+ export interface ParsedCandidateConfidence {
17
+ label: ConfidenceLabel;
18
+ score: number;
19
+ }
20
+ /** Parse the version-1 categorical confidence vocabulary. */
21
+ export declare function parseCandidateConfidence(value: unknown): ParsedCandidateConfidence;
22
+ export interface FindingProvenance {
23
+ identity: string;
24
+ lane?: string;
25
+ [key: string]: unknown;
26
+ }
27
+ export interface FindingLocation {
28
+ file: string;
29
+ line: number;
30
+ lineEnd?: number;
31
+ }
32
+ export interface FindingCandidateInput {
33
+ finding: string;
34
+ severity: FindingSeverity | string;
35
+ action?: FindingAction | string;
36
+ confidence: ConfidenceLabel | string;
37
+ category: string;
38
+ location: FindingLocation;
39
+ provenance: FindingProvenance | FindingProvenance[];
40
+ status?: FindingStatus | string;
41
+ [key: string]: unknown;
42
+ }
43
+ export interface SynthesizedFinding {
44
+ id: string;
45
+ finding: string;
46
+ severity: FindingSeverity;
47
+ action: FindingAction;
48
+ confidence: ConfidenceLabel;
49
+ confidenceScore: number;
50
+ agreementCount: number;
51
+ category: string;
52
+ location: FindingLocation;
53
+ provenance: FindingProvenance[];
54
+ status: FindingStatus;
55
+ sourceFindingIds: string[];
56
+ }
57
+ export interface CriticSettlementRecord {
58
+ findingId: string;
59
+ terminal: boolean;
60
+ status: CriticOutcome;
61
+ finalFinding: CriticSettlementInput['finding'];
62
+ handoffFindingIds: string[];
63
+ }
64
+ export interface FindingSynthesis {
65
+ policyVersion: typeof FINDING_POLICY_VERSION;
66
+ findings: SynthesizedFinding[];
67
+ diagnostics: string[];
68
+ criticSettlements?: CriticSettlementRecord[];
69
+ }
70
+ /**
71
+ * Keep synthesis bounded independently of the JSONL byte ceiling. A review
72
+ * result may carry at most this many findings, and synthesis uses the same
73
+ * bound so a caller cannot turn the pairwise agreement pass into an
74
+ * unbounded CPU cost (issue #2491 F-017).
75
+ */
76
+ export declare const MAX_FINDING_SYNTHESIS_CANDIDATES = 256;
77
+ /** Synthesize semantically equivalent findings and independent agreement. */
78
+ export declare function synthesizePrReviewFindings(input: {
79
+ candidates: FindingCandidateInput[];
80
+ }): FindingSynthesis;
81
+ export interface FinalPolicyFinding {
82
+ id?: string;
83
+ severity: FindingSeverity | string;
84
+ action: FindingAction | string;
85
+ status: FindingStatus | string;
86
+ [key: string]: unknown;
87
+ }
88
+ export interface FinalPolicyCoverage {
89
+ kind: 'base' | 'micro';
90
+ quality: 'complete' | 'degraded' | 'partial' | 'none' | string;
91
+ provenance?: 'valid' | 'invalid' | string;
92
+ disclosed?: boolean;
93
+ }
94
+ export interface FinalFindingPolicyInput {
95
+ policyVersion: number;
96
+ finalStatus: 'COMPLETE' | 'INCOMPLETE' | string;
97
+ coverage: FinalPolicyCoverage;
98
+ findings: FinalPolicyFinding[];
99
+ }
100
+ export interface FinalFindingPolicyProjection {
101
+ policyVersion: typeof FINDING_POLICY_VERSION;
102
+ /** The registered terminal report vocabulary; no internal-only verdicts. */
103
+ permittedVerdicts: Array<'APPROVE' | 'REQUEST_CHANGES' | 'INCOMPLETE'>;
104
+ coverageDisposition: 'COMPLETE' | 'PARTIAL' | 'DEGRADED_DISCLOSED' | 'INVALID_PROVENANCE' | 'NO_COVERAGE';
105
+ blockingFindingIds: string[];
106
+ }
107
+ /** Project final finding status/action and coverage through policy v1. */
108
+ export declare function evaluateFinalFindingPolicy(input: FinalFindingPolicyInput): FinalFindingPolicyProjection;
109
+ export interface CriticSettlementInput {
110
+ finding: {
111
+ id: string;
112
+ severity: FindingSeverity | string;
113
+ action: FindingAction | string;
114
+ status: FindingStatus | string;
115
+ };
116
+ outcome: CriticOutcome;
117
+ finalSeverity?: FindingSeverity | string;
118
+ finalAction?: FindingAction | string;
119
+ }
120
+ export interface CriticSettlement {
121
+ terminal: boolean;
122
+ status: CriticOutcome;
123
+ finalFinding: CriticSettlementInput['finding'];
124
+ handoffFindingIds: string[];
125
+ }
126
+ /** Apply critic settlement; NEEDS_MORE_EVIDENCE remains explicitly open. */
127
+ export declare function settleCriticFinding(input: CriticSettlementInput): CriticSettlement;
128
+ /**
129
+ * Derive the feedback handoff set from the final ledger projection only.
130
+ * Earlier reviewer/candidate records and caller-supplied IDs are deliberately
131
+ * ignored; this keeps handoff membership tied to terminal CONFIRMED records.
132
+ */
133
+ export declare function deriveFeedbackHandoffFindingIds(records: ReadonlyArray<{
134
+ finding_id: string;
135
+ status: string;
136
+ next_action: string;
137
+ }>): string[];
138
+ export interface TerminalReceipt {
139
+ id: string;
140
+ valid: boolean;
141
+ }
142
+ export interface TerminalReadinessInput {
143
+ baseReceipt: TerminalReceipt | null;
144
+ reviewerReceipts: TerminalReceipt[];
145
+ criticReceipt: TerminalReceipt | null;
146
+ coverage: FinalPolicyCoverage;
147
+ council: {
148
+ enabled: boolean;
149
+ receipt?: TerminalReceipt | null;
150
+ };
151
+ criticSettlements?: Array<{
152
+ terminal: boolean;
153
+ status?: CriticOutcome;
154
+ }>;
155
+ }
156
+ export interface TerminalReadiness {
157
+ ready: boolean;
158
+ blockers: string[];
159
+ degradedCoverageDisclosed: boolean;
160
+ }
161
+ export declare function assessTerminalReadiness(input: TerminalReadinessInput): TerminalReadiness;
162
+ export interface ReviewOutcomeRouteReceipt {
163
+ kind: string;
164
+ version: number;
165
+ sessionId: string;
166
+ taskId: string;
167
+ [key: string]: unknown;
168
+ }
169
+ export interface PersistReviewOutcomeInput {
170
+ projectRoot: string;
171
+ routeReceipt: ReviewOutcomeRouteReceipt;
172
+ synthesis: Record<string, unknown>;
173
+ }
174
+ export interface PersistReviewOutcomeResult {
175
+ persisted: true;
176
+ evidencePath: string;
177
+ eventsPath: string;
178
+ }
179
+ /** Digest the exact JSON projection carried by finding-policy evidence. */
180
+ export declare function reviewOutcomeSynthesisDigest(synthesis: unknown): string;
181
+ /** Persist policy evidence plus canonical, identity-only audit events. */
182
+ export declare function persistReviewOutcome(input: PersistReviewOutcomeInput): Promise<PersistReviewOutcomeResult>;
183
+ export interface ReadReviewOutcomeInput {
184
+ projectRoot: string;
185
+ sessionId: string;
186
+ taskId: string;
187
+ }
188
+ export interface ReadReviewOutcomeResult {
189
+ evidence: Record<string, unknown>;
190
+ events: Array<Record<string, unknown>>;
191
+ /** Coverage of the bounded core-event audit window used for this read. */
192
+ auditCoverage: CoreEventCoverage;
193
+ }
194
+ export declare function readReviewOutcome(input: ReadReviewOutcomeInput): Promise<ReadReviewOutcomeResult>;
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Versioned semantic-review routing receipts (issue #2491).
3
+ *
4
+ * A route is an authorization input for Stage B, not an advisory message. A
5
+ * successful receipt names the exact reviewer/test-engineer identities that
6
+ * owe an independent completion. Router failures have a separate typed
7
+ * receipt; an absent or malformed success receipt never receives fail-open
8
+ * treatment.
9
+ */
10
+ import { z } from 'zod';
11
+ export declare const REVIEW_ROUTE_RECEIPT_VERSION: 1;
12
+ export declare const ReviewRouteReceiptSchema: z.ZodObject<{
13
+ kind: z.ZodLiteral<"review_route_receipt">;
14
+ version: z.ZodLiteral<1>;
15
+ sessionId: z.ZodString;
16
+ taskId: z.ZodString;
17
+ complexity: z.ZodString;
18
+ semanticRisk: z.ZodString;
19
+ required: z.ZodObject<{
20
+ reviewers: z.ZodNumber;
21
+ testEngineers: z.ZodNumber;
22
+ }, z.core.$strip>;
23
+ identities: z.ZodObject<{
24
+ reviewers: z.ZodArray<z.ZodString>;
25
+ testEngineers: z.ZodArray<z.ZodString>;
26
+ }, z.core.$strip>;
27
+ slots: z.ZodOptional<z.ZodObject<{
28
+ reviewers: z.ZodArray<z.ZodString>;
29
+ testEngineers: z.ZodArray<z.ZodString>;
30
+ }, z.core.$strip>>;
31
+ createdAt: z.ZodOptional<z.ZodString>;
32
+ mac: z.ZodOptional<z.ZodString>;
33
+ }, z.core.$strict>;
34
+ export declare const ReviewRouteRouterErrorReceiptSchema: z.ZodObject<{
35
+ kind: z.ZodLiteral<"review_route_router_error">;
36
+ version: z.ZodLiteral<1>;
37
+ code: z.ZodEnum<{
38
+ NO_CHANGED_FILES: "NO_CHANGED_FILES";
39
+ ROUTER_UNAVAILABLE: "ROUTER_UNAVAILABLE";
40
+ ROUTER_FAILED: "ROUTER_FAILED";
41
+ }>;
42
+ failOpen: z.ZodLiteral<true>;
43
+ sessionId: z.ZodOptional<z.ZodString>;
44
+ taskId: z.ZodOptional<z.ZodString>;
45
+ detail: z.ZodOptional<z.ZodString>;
46
+ createdAt: z.ZodOptional<z.ZodString>;
47
+ mac: z.ZodOptional<z.ZodString>;
48
+ }, z.core.$strict>;
49
+ declare const ReviewRoutePendingReceiptSchema: z.ZodObject<{
50
+ kind: z.ZodLiteral<"review_route_pending">;
51
+ version: z.ZodLiteral<1>;
52
+ sessionId: z.ZodString;
53
+ taskId: z.ZodString;
54
+ createdAt: z.ZodOptional<z.ZodString>;
55
+ mac: z.ZodOptional<z.ZodString>;
56
+ }, z.core.$strict>;
57
+ export type ReviewRouteReceipt = z.infer<typeof ReviewRouteReceiptSchema>;
58
+ export type ReviewRouteRouterErrorReceipt = z.infer<typeof ReviewRouteRouterErrorReceiptSchema>;
59
+ export type ReviewRouteRecord = ReviewRouteReceipt | ReviewRouteRouterErrorReceipt | ReviewRoutePendingReceipt;
60
+ export type ReviewRoutePendingReceipt = z.infer<typeof ReviewRoutePendingReceiptSchema>;
61
+ export interface BuildReviewRouteReceiptArgs {
62
+ sessionId: string;
63
+ taskId: string;
64
+ complexity: string;
65
+ semanticRisk: string;
66
+ requiredReviewers: readonly string[];
67
+ requiredTestEngineers: readonly string[];
68
+ /** Optional explicit slot IDs. If absent they are deterministic by index. */
69
+ reviewerSlots?: readonly string[];
70
+ testEngineerSlots?: readonly string[];
71
+ createdAt?: string;
72
+ }
73
+ export interface ReviewRouteEvidence {
74
+ role: 'reviewer' | 'test_engineer';
75
+ identity: string;
76
+ /** Optional exact route binding fields used by live Stage-B callers. */
77
+ sessionId?: string;
78
+ taskId?: string;
79
+ slotId?: string;
80
+ callId?: string;
81
+ childSessionId?: string;
82
+ generation?: number;
83
+ }
84
+ export interface EnforceReviewRouteReceiptArgs {
85
+ enforcementEnabled: boolean;
86
+ routeReceipt: unknown;
87
+ receipts: readonly ReviewRouteEvidence[];
88
+ sessionId?: string;
89
+ taskId?: string;
90
+ /** Live callers must provide the full call/child/generation-bound tuple. */
91
+ requireEvidenceBindings?: boolean;
92
+ /** Current live dispatch tuple, when a caller is authorizing one completion. */
93
+ expectedDispatch?: Pick<ReviewRouteEvidence, 'role' | 'identity' | 'callId' | 'childSessionId' | 'generation'>;
94
+ /**
95
+ * When false, authorize the current exact dispatch tuple without requiring
96
+ * every route slot. Callers use this admission check before publishing the
97
+ * completion; the full-route check remains the advancement barrier.
98
+ */
99
+ requireCompleteEvidence?: boolean;
100
+ }
101
+ export interface EnforceReviewRouteReceiptResult {
102
+ canAdvance: boolean;
103
+ mode?: 'enforced' | 'disabled' | 'fail_open' | 'legacy_unrouted';
104
+ reason?: string;
105
+ routerFailure?: ReviewRouteRouterErrorReceipt['code'];
106
+ }
107
+ export declare function buildReviewRouteReceipt(input: BuildReviewRouteReceiptArgs): ReviewRouteReceipt;
108
+ export declare function buildReviewRouteRouterError(input: {
109
+ code: ReviewRouteRouterErrorReceipt['code'];
110
+ sessionId: string;
111
+ taskId: string;
112
+ detail?: string;
113
+ createdAt?: string;
114
+ }): ReviewRouteRouterErrorReceipt;
115
+ export declare function buildReviewRoutePending(input: {
116
+ sessionId: string;
117
+ taskId: string;
118
+ createdAt?: string;
119
+ }): ReviewRoutePendingReceipt;
120
+ export declare function persistReviewRouteReceipt(input: {
121
+ projectRoot: string;
122
+ receipt: ReviewRouteRecord;
123
+ }): Promise<{
124
+ persisted: true;
125
+ path: string;
126
+ }>;
127
+ export declare function readReviewRouteReceipt(input: {
128
+ projectRoot: string;
129
+ sessionId: string;
130
+ taskId: string;
131
+ }): Promise<ReviewRouteRecord | null>;
132
+ /** Synchronous twin for the existing synchronous reviewer-gate predicate. */
133
+ export declare function readReviewRouteReceiptSync(input: {
134
+ projectRoot: string;
135
+ sessionId: string;
136
+ taskId: string;
137
+ }): ReviewRouteRecord | null;
138
+ /**
139
+ * Authorize Stage-B advancement from the exact route receipt. The explicit
140
+ * router error is the only enabled fail-open branch; malformed/absent records
141
+ * fail closed. Optional identity fields on evidence are checked when present
142
+ * so old callers can migrate without fabricating bindings.
143
+ */
144
+ export declare function enforceReviewRouteReceipt(input: EnforceReviewRouteReceiptArgs): EnforceReviewRouteReceiptResult;
145
+ export declare function routeReceiptPathForTask(directory: string, sessionId: string, taskId: string): string;
146
+ /**
147
+ * Read and enforce one task's persisted route using the synchronous gate
148
+ * contract. A missing receipt is intentionally a hard failure for new work;
149
+ * callers that have positively identified pre-version legacy state may opt
150
+ * into the disclosed one-release compatibility result.
151
+ */
152
+ export declare function enforcePersistedReviewRouteReceipt(input: {
153
+ projectRoot: string;
154
+ sessionId: string;
155
+ taskId: string;
156
+ receipts: readonly ReviewRouteEvidence[];
157
+ enforcementEnabled: boolean;
158
+ legacyUnrouted?: boolean;
159
+ requireEvidenceBindings?: boolean;
160
+ expectedDispatch?: EnforceReviewRouteReceiptArgs['expectedDispatch'];
161
+ requireCompleteEvidence?: boolean;
162
+ }): EnforceReviewRouteReceiptResult;
163
+ export {};
@@ -83,6 +83,8 @@ export interface SerializedAgentSession {
83
83
  sessionRehydratedAt?: number;
84
84
  /** Stage B completion tracking: per-task set of completed Stage B agents. Optional for backward compat with old snapshots. */
85
85
  stageBCompletion?: Record<string, string[]>;
86
+ /** v1 review-routing requirement markers, persisted so missing receipts fail closed after restart. */
87
+ stageBRouteRequiredTasks?: string[];
86
88
  /** Session-scoped concurrency override for max_concurrent_tasks (Issue #761) */
87
89
  maxConcurrencyOverride?: number;
88
90
  /** Session-level auto-proceed override (Phase 1) */
package/dist/state.d.ts CHANGED
@@ -13,6 +13,7 @@ import { type EnvironmentProfile } from './environment/profile.js';
13
13
  import { type TaskWorkflowMetadata } from './gate-evidence';
14
14
  import type { EscalationTracker } from './prm/escalation.js';
15
15
  import type { PatternMatch } from './prm/types.js';
16
+ import type { ReviewRouteEvidence } from './review/routing-enforcement.js';
16
17
  import { AgentRunContext } from './state/agent-run-context.js';
17
18
  export { AgentRunContext } from './state/agent-run-context.js';
18
19
  /**
@@ -244,6 +245,13 @@ export interface AgentSessionState {
244
245
  * Always populated — Stage B is unconditionally parallel.
245
246
  */
246
247
  stageBCompletion?: Map<string, Set<'reviewer' | 'test_engineer'>>;
248
+ /** Exact route-bound Stage B evidence; role presence alone is not authoritative. */
249
+ stageBRouteEvidence?: Map<string, ReviewRouteEvidence[]>;
250
+ /**
251
+ * Tasks dispatched through v1 review routing. This positive marker prevents a
252
+ * missing route receipt from being mistaken for pre-v1 legacy state.
253
+ */
254
+ stageBRouteRequiredTasks?: Set<string>;
247
255
  /** v6.71+ Council mode: per-task council verdict, recorded by delegation-gate when submit_council_verdicts resolves. */
248
256
  taskCouncilApproved?: Map<string, {
249
257
  verdict: 'APPROVE' | 'REJECT' | 'CONCERNS';
@@ -1262,6 +1270,26 @@ export declare function getTaskState(session: AgentSessionState, taskId: string)
1262
1270
  * @param agent - Which Stage B agent completed ('reviewer' or 'test_engineer')
1263
1271
  */
1264
1272
  export declare function recordStageBCompletion(session: AgentSessionState, taskId: string, agent: 'reviewer' | 'test_engineer'): void;
1273
+ /**
1274
+ * Reserve a bounded in-memory route-evidence slot and return a rollback for
1275
+ * callers that still have to publish the corresponding durable evidence.
1276
+ *
1277
+ * The reservation remains visible while the caller awaits its durable write,
1278
+ * which prevents concurrent completions from oversubscribing the 32-entry
1279
+ * projection. If that write fails, invoking the rollback restores the exact
1280
+ * prior slot (or removes a newly-added slot), so a retry is not poisoned by a
1281
+ * failed attempt.
1282
+ */
1283
+ export declare function reserveStageBRouteEvidence(session: AgentSessionState, taskId: string, evidence: ReviewRouteEvidence): (() => void) | null;
1284
+ export declare function recordStageBRouteEvidence(session: AgentSessionState, taskId: string, evidence: ReviewRouteEvidence): boolean;
1285
+ export declare function getStageBRouteEvidence(session: AgentSessionState, taskId: string): ReviewRouteEvidence[];
1286
+ export declare function clearStageBRouteEvidence(session: AgentSessionState, taskId: string): void;
1287
+ /** Mark a task as requiring the versioned review-route receipt contract. */
1288
+ export declare function markStageBRouteRequired(session: AgentSessionState, taskId: string): void;
1289
+ /** True only for a task positively marked as v1-routed in this session. */
1290
+ export declare function isStageBRouteRequired(session: AgentSessionState, taskId: string): boolean;
1291
+ /** Clear the route requirement after a task reaches its terminal state. */
1292
+ export declare function clearStageBRouteRequired(session: AgentSessionState, taskId: string): void;
1265
1293
  /**
1266
1294
  * PR 2 Stage B barrier: returns true iff both 'reviewer' and 'test_engineer' have
1267
1295
  * been recorded for the given task in this session.
@@ -1,4 +1,4 @@
1
- import { completePrWorkflow, readPrReviewTerminalCoverageForReport, readPrWorkflowGateState, settlePresumedStalePrWorkflowLanes } from '../hooks/pr-workflow-gate.js';
1
+ import { completePrWorkflow, readPrReviewFinalFindingPolicyForReport, readPrReviewTerminalCoverageForReport, readPrWorkflowGateState, settlePresumedStalePrWorkflowLanes } from '../hooks/pr-workflow-gate.js';
2
2
  import { createSwarmTool } from './create-tool.js';
3
3
  import { listPendingPrWorkflowCheckoutRestores } from './prepare-pr-workflow-checkout.js';
4
4
  export declare function executeCompletePrWorkflow(args: unknown, directory: string, context?: {
@@ -10,5 +10,6 @@ export declare const _internals: {
10
10
  listPendingPrWorkflowCheckoutRestores: typeof listPendingPrWorkflowCheckoutRestores;
11
11
  readPrWorkflowGateState: typeof readPrWorkflowGateState;
12
12
  readPrReviewTerminalCoverageForReport: typeof readPrReviewTerminalCoverageForReport;
13
+ readPrReviewFinalFindingPolicyForReport: typeof readPrReviewFinalFindingPolicyForReport;
13
14
  settlePresumedStalePrWorkflowLanes: typeof settlePresumedStalePrWorkflowLanes;
14
15
  };
@@ -35,7 +35,7 @@ export interface ToolMeta {
35
35
  export declare const TOOL_METADATA: {
36
36
  diff: {
37
37
  description: string;
38
- agents: ("coder" | "reviewer" | "test_engineer" | "critic_oversight" | "critic_finding_validator" | "architect")[];
38
+ agents: ("reviewer" | "test_engineer" | "coder" | "critic_oversight" | "critic_finding_validator" | "architect")[];
39
39
  prWorkflow: {
40
40
  modes: ("PR_REVIEW" | "PR_FEEDBACK")[];
41
41
  capability: "observe";
@@ -51,7 +51,7 @@ export declare const TOOL_METADATA: {
51
51
  };
52
52
  syntax_check: {
53
53
  description: string;
54
- agents: ("coder" | "test_engineer" | "architect")[];
54
+ agents: ("test_engineer" | "coder" | "architect")[];
55
55
  prWorkflow: {
56
56
  modes: "PR_REVIEW"[];
57
57
  capability: "validate";
@@ -67,7 +67,7 @@ export declare const TOOL_METADATA: {
67
67
  };
68
68
  imports: {
69
69
  description: string;
70
- agents: ("coder" | "reviewer" | "test_engineer" | "critic" | "critic_finding_validator" | "architect" | "sme" | "researcher" | "docs" | "docs_design" | "critic_sounding_board" | "critic_drift_verifier" | "critic_hallucination_verifier")[];
70
+ agents: ("reviewer" | "test_engineer" | "coder" | "critic" | "critic_finding_validator" | "architect" | "sme" | "researcher" | "docs" | "docs_design" | "critic_sounding_board" | "critic_drift_verifier" | "critic_hallucination_verifier")[];
71
71
  prWorkflow: {
72
72
  modes: ("PR_REVIEW" | "PR_FEEDBACK")[];
73
73
  capability: "observe";
@@ -75,7 +75,7 @@ export declare const TOOL_METADATA: {
75
75
  };
76
76
  lint: {
77
77
  description: string;
78
- agents: ("coder" | "reviewer" | "critic_finding_validator" | "architect")[];
78
+ agents: ("reviewer" | "coder" | "critic_finding_validator" | "architect")[];
79
79
  prWorkflow: {
80
80
  modes: "PR_REVIEW"[];
81
81
  capability: "validate";
@@ -99,7 +99,7 @@ export declare const TOOL_METADATA: {
99
99
  };
100
100
  build_check: {
101
101
  description: string;
102
- agents: ("coder" | "test_engineer" | "architect")[];
102
+ agents: ("test_engineer" | "coder" | "architect")[];
103
103
  };
104
104
  pre_check_batch: {
105
105
  description: string;
@@ -115,7 +115,7 @@ export declare const TOOL_METADATA: {
115
115
  };
116
116
  symbols: {
117
117
  description: string;
118
- agents: ("coder" | "reviewer" | "test_engineer" | "critic" | "critic_finding_validator" | "architect" | "sme" | "researcher" | "docs" | "docs_design" | "designer" | "critic_sounding_board" | "critic_drift_verifier" | "critic_hallucination_verifier" | "spec_writer")[];
118
+ agents: ("reviewer" | "test_engineer" | "coder" | "critic" | "critic_finding_validator" | "architect" | "sme" | "researcher" | "docs" | "docs_design" | "designer" | "critic_sounding_board" | "critic_drift_verifier" | "critic_hallucination_verifier" | "spec_writer")[];
119
119
  };
120
120
  complexity_hotspots: {
121
121
  description: string;
@@ -299,7 +299,7 @@ export declare const TOOL_METADATA: {
299
299
  };
300
300
  retrieve_summary: {
301
301
  description: string;
302
- agents: ("coder" | "reviewer" | "test_engineer" | "critic" | "critic_finding_validator" | "architect" | "sme" | "docs" | "docs_design" | "designer" | "critic_sounding_board" | "critic_drift_verifier" | "critic_hallucination_verifier" | "critic_architecture_supervisor" | "spec_writer")[];
302
+ agents: ("reviewer" | "test_engineer" | "coder" | "critic" | "critic_finding_validator" | "architect" | "sme" | "docs" | "docs_design" | "designer" | "critic_sounding_board" | "critic_drift_verifier" | "critic_hallucination_verifier" | "critic_architecture_supervisor" | "spec_writer")[];
303
303
  prWorkflow: {
304
304
  modes: ("PR_REVIEW" | "PR_FEEDBACK")[];
305
305
  capability: "observe";
@@ -315,7 +315,7 @@ export declare const TOOL_METADATA: {
315
315
  };
316
316
  extract_code_blocks: {
317
317
  description: string;
318
- agents: ("coder" | "test_engineer" | "docs" | "docs_design" | "designer" | "spec_writer")[];
318
+ agents: ("test_engineer" | "coder" | "docs" | "docs_design" | "designer" | "spec_writer")[];
319
319
  };
320
320
  phase_complete: {
321
321
  description: string;
@@ -395,7 +395,7 @@ export declare const TOOL_METADATA: {
395
395
  };
396
396
  knowledge_recall: {
397
397
  description: string;
398
- agents: ("coder" | "reviewer" | "test_engineer" | "critic" | "critic_oversight" | "critic_finding_validator" | "explorer" | "architect" | "sme" | "docs" | "docs_design" | "designer" | "critic_sounding_board" | "critic_drift_verifier" | "critic_hallucination_verifier" | "critic_architecture_supervisor" | "curator_init" | "curator_phase" | "skill_improver" | "spec_writer")[];
398
+ agents: ("reviewer" | "test_engineer" | "coder" | "critic" | "critic_oversight" | "critic_finding_validator" | "explorer" | "architect" | "sme" | "docs" | "docs_design" | "designer" | "critic_sounding_board" | "critic_drift_verifier" | "critic_hallucination_verifier" | "critic_architecture_supervisor" | "curator_init" | "curator_phase" | "skill_improver" | "spec_writer")[];
399
399
  };
400
400
  knowledge_remove: {
401
401
  description: string;
@@ -411,11 +411,11 @@ export declare const TOOL_METADATA: {
411
411
  };
412
412
  search: {
413
413
  description: string;
414
- agents: ("coder" | "reviewer" | "test_engineer" | "critic_oversight" | "critic_finding_validator" | "explorer" | "architect" | "sme" | "researcher" | "docs" | "docs_design" | "designer" | "critic_hallucination_verifier" | "skill_improver" | "spec_writer")[];
414
+ agents: ("reviewer" | "test_engineer" | "coder" | "critic_oversight" | "critic_finding_validator" | "explorer" | "architect" | "sme" | "researcher" | "docs" | "docs_design" | "designer" | "critic_hallucination_verifier" | "skill_improver" | "spec_writer")[];
415
415
  };
416
416
  ast_grep: {
417
417
  description: string;
418
- agents: ("coder" | "test_engineer" | "explorer" | "architect" | "sme" | "researcher" | "docs" | "docs_design" | "critic_hallucination_verifier" | "spec_writer")[];
418
+ agents: ("test_engineer" | "coder" | "explorer" | "architect" | "sme" | "researcher" | "docs" | "docs_design" | "critic_hallucination_verifier" | "spec_writer")[];
419
419
  };
420
420
  actionlint_scan: {
421
421
  description: string;
@@ -467,7 +467,7 @@ export declare const TOOL_METADATA: {
467
467
  };
468
468
  repo_map: {
469
469
  description: string;
470
- agents: ("coder" | "reviewer" | "test_engineer" | "critic" | "critic_oversight" | "critic_finding_validator" | "explorer" | "architect" | "critic_sounding_board" | "critic_drift_verifier" | "critic_hallucination_verifier" | "critic_architecture_supervisor")[];
470
+ agents: ("reviewer" | "test_engineer" | "coder" | "critic" | "critic_oversight" | "critic_finding_validator" | "explorer" | "architect" | "critic_sounding_board" | "critic_drift_verifier" | "critic_hallucination_verifier" | "critic_architecture_supervisor")[];
471
471
  prWorkflow: {
472
472
  modes: ("PR_REVIEW" | "PR_FEEDBACK")[];
473
473
  capability: "observe";
@@ -535,7 +535,7 @@ export declare const TOOL_METADATA: {
535
535
  };
536
536
  knowledge_receipt: {
537
537
  description: string;
538
- agents: ("coder" | "reviewer" | "test_engineer" | "critic" | "critic_finding_validator" | "architect" | "sme" | "docs" | "docs_design" | "designer" | "critic_sounding_board" | "critic_drift_verifier" | "critic_hallucination_verifier" | "critic_architecture_supervisor" | "curator_init" | "curator_phase" | "skill_improver" | "spec_writer")[];
538
+ agents: ("reviewer" | "test_engineer" | "coder" | "critic" | "critic_finding_validator" | "architect" | "sme" | "docs" | "docs_design" | "designer" | "critic_sounding_board" | "critic_drift_verifier" | "critic_hallucination_verifier" | "critic_architecture_supervisor" | "curator_init" | "curator_phase" | "skill_improver" | "spec_writer")[];
539
539
  };
540
540
  knowledge_archive: {
541
541
  description: string;
@@ -555,7 +555,7 @@ export declare const TOOL_METADATA: {
555
555
  };
556
556
  swarm_command: {
557
557
  description: string;
558
- agents: ("coder" | "reviewer" | "test_engineer" | "critic" | "critic_finding_validator" | "explorer" | "architect" | "sme" | "researcher" | "docs" | "docs_design" | "designer")[];
558
+ agents: ("reviewer" | "test_engineer" | "coder" | "critic" | "critic_finding_validator" | "explorer" | "architect" | "sme" | "researcher" | "docs" | "docs_design" | "designer")[];
559
559
  };
560
560
  dispatch_lanes: {
561
561
  description: string;
@@ -571,7 +571,7 @@ export declare const TOOL_METADATA: {
571
571
  };
572
572
  summarize_work: {
573
573
  description: string;
574
- agents: ("coder" | "test_engineer" | "explorer" | "architect" | "sme" | "researcher" | "docs" | "docs_design" | "designer")[];
574
+ agents: ("test_engineer" | "coder" | "explorer" | "architect" | "sme" | "researcher" | "docs" | "docs_design" | "designer")[];
575
575
  };
576
576
  write_architecture_supervisor_evidence: {
577
577
  description: string;
@@ -607,7 +607,7 @@ export declare const TOOL_METADATA: {
607
607
  };
608
608
  swarm_apply_patch: {
609
609
  description: string;
610
- agents: ("coder" | "test_engineer")[];
610
+ agents: ("test_engineer" | "coder")[];
611
611
  };
612
612
  external_skill_discover: {
613
613
  description: string;
@@ -84,16 +84,6 @@ export interface ReviewerGateResult {
84
84
  nextAction?: string;
85
85
  }
86
86
  declare function hasPassedDurableGateEvidence(workingDirectory: string, taskId: string): boolean;
87
- /**
88
- * Check if a task has passed required QA gates using the state machine.
89
- * Requires the task to be in 'tests_run' or 'complete' state, which means
90
- * both reviewer delegation and test_engineer runs have been recorded.
91
- * @param taskId - The task ID to check gate state for
92
- * @param workingDirectory - Optional working directory for plan.json fallback
93
- * @param stageBParallelEnabled - When true, also accept both-markers-present as passing (PR 2 barrier)
94
- * @param sessionID - Optional session ID to scope Lean Turbo bypass to the current tool-execution context
95
- * @returns ReviewerGateResult indicating whether the gate is blocked
96
- */
97
87
  export declare function checkReviewerGate(taskId: string, workingDirectory?: string, stageBParallelEnabled?: boolean, sessionID?: string, fallbackDir?: string): ReviewerGateResult;
98
88
  /**
99
89
  * Wrapper around checkReviewerGate that appends a diff-scope advisory warning.
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import type { FindingsSeverity } from '../background/candidate-contract.js';
3
3
  import { PrReviewFindingSchema } from '../background/pr-review-contract.js';
4
4
  import { assertPrReviewArtifactBoundary } from '../hooks/pr-workflow-gate.js';
5
+ import { type CriticSettlementRecord } from '../pr-review/finding-policy.js';
5
6
  import { createSwarmTool } from './create-tool.js';
6
7
  /**
7
8
  * READ shape. Deliberately tolerant of a missing `severity`: `readFindings`
@@ -22,9 +23,15 @@ export declare const _internals: {
22
23
  atomicWrite: typeof atomicWrite;
23
24
  atomicCreate: typeof atomicCreate;
24
25
  assertBoundary: typeof assertPrReviewArtifactBoundary;
26
+ assertCriticSettlements: typeof assertCriticSettlements;
25
27
  /** Exposed so the #2383 read/migration boundary is testable directly. */
26
28
  readFindings: typeof readFindings;
27
29
  };
30
+ type FindingsRecord = z.infer<typeof PrReviewFindingSchema>;
31
+ declare function assertCriticSettlements(records: readonly FindingsRecord[], existing: readonly PersistedFinding[], authoritativeCriticVerdicts: ReadonlyMap<string, {
32
+ status: string;
33
+ severity: string;
34
+ }>): CriticSettlementRecord[];
28
35
  export declare function executeWritePrReviewArtifact(args: unknown, directory: string, context?: {
29
36
  sessionID?: string;
30
37
  }): Promise<string>;