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.
- package/.opencode/skills/swarm-pr-review/references/findings-persistence-contract.md +37 -0
- package/binaries/win32-arm64/swarm-sandbox-runner.exe +0 -0
- package/binaries/win32-x64/swarm-sandbox-runner.exe +0 -0
- package/dist/agents/critic.d.ts +44 -2
- package/dist/background/pr-review-contract.d.ts +24 -0
- package/dist/background/stage-b-gates.d.ts +29 -0
- package/dist/cli/{coder-settlement-f60aqxyv.js → coder-settlement-pwct8te4.js} +11 -11
- package/dist/cli/{config-doctor-nvw2fwrn.js → config-doctor-tnta65bf.js} +2 -2
- package/dist/cli/{core-z68xfzar.js → core-421gbna2.js} +3 -3
- package/dist/cli/{curation-policy-tx4kb30e.js → curation-policy-dw25zm05.js} +5 -5
- package/dist/cli/{curator-drift-047n8fjw.js → curator-drift-x3tt8apf.js} +4 -4
- package/dist/cli/curator-llm-factory-4e73613g.js +72 -0
- package/dist/cli/{curator-93a3pyvv.js → curator-yrhc4epa.js} +36 -36
- package/dist/cli/{evidence-summary-service-s22vfx64.js → evidence-summary-service-f4vem356.js} +15 -15
- package/dist/cli/{gate-evidence-kz044xwh.js → gate-evidence-t2dyfvc4.js} +6 -6
- package/dist/cli/guardrail-explain-hf5gawe2.js +73 -0
- package/dist/cli/{guardrail-log-sh9ecphn.js → guardrail-log-9dkyvdbw.js} +7 -7
- package/dist/cli/{guardrail-reset-m56x3djm.js → guardrail-reset-26bxnh2e.js} +36 -36
- package/dist/cli/{hive-promoter-1hfyd1gn.js → hive-promoter-6s6xbq5x.js} +36 -36
- package/dist/cli/{index-tztqvzf5.js → index-0c7y177k.js} +2 -2
- package/dist/cli/{index-fxac6j9v.js → index-23fwhwrb.js} +36 -36
- package/dist/cli/{index-m08ee28a.js → index-2qawngxn.js} +8 -8
- package/dist/cli/{index-fnx0jzf7.js → index-2xwavnbg.js} +1 -1
- package/dist/cli/{index-z35ynvj4.js → index-3yw5h3bt.js} +1 -1
- package/dist/cli/{index-jmn35na4.js → index-5prgmf00.js} +3 -3
- package/dist/cli/{index-za1kvsa0.js → index-5t71wd7j.js} +2 -2
- package/dist/cli/{index-dktpzjy9.js → index-6tbnev6y.js} +1 -1
- package/dist/cli/{index-yzwb6ja4.js → index-6v1cz898.js} +1 -1
- package/dist/cli/{index-z1k5dvn0.js → index-8d3qzvbb.js} +2 -2
- package/dist/cli/{index-bsnpv4xd.js → index-8tn4yx8b.js} +2 -2
- package/dist/cli/{index-8xkr8p2b.js → index-9gpf4tt4.js} +8 -8
- package/dist/cli/{index-ejrqyrsr.js → index-bf6w27sb.js} +3 -3
- package/dist/cli/{index-ndvgkxpf.js → index-c60t3sw6.js} +2 -2
- package/dist/cli/{index-m51cmzxt.js → index-cw1nbtvh.js} +1 -1
- package/dist/cli/{index-evf5r7bk.js → index-czhbsgdh.js} +1 -1
- package/dist/cli/{index-579nzg03.js → index-ddz0a0ew.js} +1 -1
- package/dist/cli/{index-3312a4k1.js → index-dfd6d64k.js} +38 -38
- package/dist/cli/{index-sftt3gdv.js → index-dfey3jpn.js} +2 -2
- package/dist/cli/{index-nrsnman7.js → index-e4g3487s.js} +3 -3
- package/dist/cli/{index-mq2y8qpg.js → index-fagcasf8.js} +5 -5
- package/dist/cli/{index-gd40ehzt.js → index-hkx8tqa4.js} +6 -6
- package/dist/cli/{index-njdy6w9x.js → index-jd2f7thw.js} +2567 -2138
- package/dist/cli/{index-0dfhahxm.js → index-jj09bfnn.js} +2 -2
- package/dist/cli/{index-wr4m11x4.js → index-kj7h2yfv.js} +1 -1
- package/dist/cli/{index-pserzhck.js → index-kyakvkpk.js} +10 -3
- package/dist/cli/{index-1r2avghn.js → index-m8c44754.js} +5 -3
- package/dist/cli/{index-43dmpa9w.js → index-mjtja1wq.js} +2 -2
- package/dist/cli/{index-0y9fqm5d.js → index-mmnk7nt1.js} +19 -1
- package/dist/cli/{index-hhws1xkc.js → index-nwew2anc.js} +1 -1
- package/dist/cli/{index-3n16qq3z.js → index-nxnmy2da.js} +7 -7
- package/dist/cli/{index-fb5rj8sk.js → index-py58gern.js} +7 -7
- package/dist/cli/{index-915wxcgs.js → index-qc4nvg0m.js} +4 -4
- package/dist/cli/{index-10vr7289.js → index-rgvg7d6k.js} +1 -1
- package/dist/cli/{index-mt8pbzda.js → index-rjjtn1w5.js} +12 -12
- package/dist/cli/{index-nztmfgvw.js → index-s6wb6sjk.js} +4 -4
- package/dist/cli/{index-1pnw3jkr.js → index-saw0ambb.js} +10 -7
- package/dist/cli/{index-e8tscab8.js → index-snd34n1y.js} +65 -10
- package/dist/cli/{index-btxf9k1r.js → index-v8ykb3hq.js} +11 -11
- package/dist/cli/{index-kdyvk541.js → index-vsvdh976.js} +2 -2
- package/dist/cli/{index-7gkdxs00.js → index-vwjfm0s6.js} +7 -7
- package/dist/cli/index.js +37 -37
- package/dist/cli/{knowledge-escalator-zeackj4h.js → knowledge-escalator-bra0fkfm.js} +12 -12
- package/dist/cli/{knowledge-events-nfcgfhq2.js → knowledge-events-v4hq7wr9.js} +10 -10
- package/dist/cli/{knowledge-link-f7bhq7cx.js → knowledge-link-dw12x2ns.js} +4 -4
- package/dist/cli/{knowledge-store-jptt6kp5.js → knowledge-store-3hx2896s.js} +5 -5
- package/dist/cli/{knowledge-validator-e7nten5a.js → knowledge-validator-9wj31ym5.js} +7 -7
- package/dist/cli/{mcp-14kyj73d.js → mcp-d7yptqpg.js} +1 -1
- package/dist/cli/{pending-delegations-4jget283.js → pending-delegations-8ghc75b2.js} +11 -11
- package/dist/cli/{pr-subscriptions-qe0j6xyr.js → pr-subscriptions-yceed093.js} +11 -11
- package/dist/cli/{pr-workflow-gate-2m91qcm6.js → pr-workflow-gate-sc4c4cmk.js} +42 -36
- package/dist/cli/{runner-58k70bnr.js → runner-k1pmc3z8.js} +5 -5
- package/dist/cli/{scan-cursor-myzgmzj6.js → scan-cursor-mtja4626.js} +6 -6
- package/dist/cli/{schema-gws3yx52.js → schema-x2nb18fg.js} +5 -1
- package/dist/cli/{scope-persistence-fh1d8vs0.js → scope-persistence-tafxf6yz.js} +14 -14
- package/dist/cli/{server-v0wfd3rk.js → server-hk378mzc.js} +36 -36
- package/dist/cli/{skill-generator-935cmd3p.js → skill-generator-vz5vtgk6.js} +14 -14
- package/dist/cli/{snapshot-coordination-init-ad8n0977.js → snapshot-coordination-init-8x5n1q8c.js} +36 -36
- package/dist/cli/{telemetry-zed80n86.js → telemetry-m580862y.js} +1 -1
- package/dist/cli/{workspace-snapshot-62be4368.js → workspace-snapshot-6aw002e8.js} +3 -3
- package/dist/cli/{worktree-collision-ownership-txzvv5jv.js → worktree-collision-ownership-cfx1tsaf.js} +12 -12
- package/dist/cli/{worktree-isolation-tv749n96.js → worktree-isolation-t3fm1c5w.js} +36 -36
- package/dist/config/index.d.ts +2 -2
- package/dist/config/schema.d.ts +22 -8
- package/dist/events/core-events.d.ts +2 -0
- package/dist/evidence/task-gate-requirements.d.ts +24 -0
- package/dist/gate-evidence.d.ts +12 -0
- package/dist/hooks/pr-workflow-gate.d.ts +22 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +481 -469
- package/dist/parallel/review-router.d.ts +8 -2
- package/dist/pr-review/completion.d.ts +2 -1
- package/dist/pr-review/finding-policy.d.ts +194 -0
- package/dist/review/routing-enforcement.d.ts +163 -0
- package/dist/session/snapshot-writer.d.ts +2 -0
- package/dist/state.d.ts +28 -0
- package/dist/tools/complete-pr-workflow.d.ts +2 -1
- package/dist/tools/tool-metadata.d.ts +16 -16
- package/dist/tools/update-task-status.d.ts +0 -10
- package/dist/tools/write-pr-review-artifact.d.ts +7 -0
- package/opencode-swarm.schema.json +11 -0
- package/package.json +1 -1
- package/dist/cli/curator-llm-factory-xkhzrdkk.js +0 -72
- 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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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: ("
|
|
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>;
|