codex-orchestrator 0.1.45 → 0.1.47
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/CHANGELOG.md +28 -0
- package/dist/src/runner/acceptance-proof-loop.d.ts +1 -46
- package/dist/src/runner/acceptance-proof-loop.d.ts.map +1 -1
- package/dist/src/runner/acceptance-proof-loop.js +22 -202
- package/dist/src/runner/acceptance-proof-loop.js.map +1 -1
- package/dist/src/runner/auto-visual-proof-command.d.ts +1 -1
- package/dist/src/runner/auto-visual-proof-command.d.ts.map +1 -1
- package/dist/src/runner/auto-visual-proof-command.js +21 -2
- package/dist/src/runner/auto-visual-proof-command.js.map +1 -1
- package/dist/src/runner/completion-report.d.ts +6 -1
- package/dist/src/runner/completion-report.d.ts.map +1 -1
- package/dist/src/runner/completion-report.js +26 -1
- package/dist/src/runner/completion-report.js.map +1 -1
- package/dist/src/runner/handoff-evidence.d.ts.map +1 -1
- package/dist/src/runner/handoff-evidence.js +13 -8
- package/dist/src/runner/handoff-evidence.js.map +1 -1
- package/dist/src/runner/local-execution-session.d.ts.map +1 -1
- package/dist/src/runner/local-execution-session.js +19 -5
- package/dist/src/runner/local-execution-session.js.map +1 -1
- package/dist/src/runner/prompt.d.ts.map +1 -1
- package/dist/src/runner/prompt.js +6 -3
- package/dist/src/runner/prompt.js.map +1 -1
- package/dist/src/runner/proof-routing.d.ts +73 -0
- package/dist/src/runner/proof-routing.d.ts.map +1 -0
- package/dist/src/runner/proof-routing.js +182 -0
- package/dist/src/runner/proof-routing.js.map +1 -0
- package/dist/src/runner/proof-strategy.d.ts +9 -0
- package/dist/src/runner/proof-strategy.d.ts.map +1 -1
- package/dist/src/runner/proof-strategy.js +7 -0
- package/dist/src/runner/proof-strategy.js.map +1 -1
- package/dist/src/runner/review-gate-policy.d.ts +1 -37
- package/dist/src/runner/review-gate-policy.d.ts.map +1 -1
- package/dist/src/runner/review-gate-policy.js +55 -24
- package/dist/src/runner/review-gate-policy.js.map +1 -1
- package/dist/src/runner/review-gates.d.ts.map +1 -1
- package/dist/src/runner/review-gates.js +46 -1
- package/dist/src/runner/review-gates.js.map +1 -1
- package/dist/src/runner/visual-proof-runner.d.ts.map +1 -1
- package/dist/src/runner/visual-proof-runner.js +2 -1
- package/dist/src/runner/visual-proof-runner.js.map +1 -1
- package/docs/deep-dive.md +33 -7
- package/package.json +1 -1
- package/prompts/workflows/issue-tree-orchestration.md +1 -1
- package/prompts/workflows/scoped-implementation.md +2 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { CodexOrchestratorConfig } from '../config/schema.js';
|
|
2
|
+
import type { GitHubIssue } from '../github/issues.js';
|
|
3
|
+
import type { ProofPlan, ProofPlanMode } from './completion-report.js';
|
|
4
|
+
import { resolveAcceptanceProofStrategy } from './proof-strategy.js';
|
|
5
|
+
export type VisualProofDispatchTarget = 'browser' | 'mobile' | 'none';
|
|
6
|
+
export type ProofRoutingAction = 'skip' | 'dispatch' | 'allow-non-visual' | 'error';
|
|
7
|
+
export interface ProofRoutingDecision {
|
|
8
|
+
applies: boolean;
|
|
9
|
+
desirable: boolean;
|
|
10
|
+
dispatchTarget: VisualProofDispatchTarget;
|
|
11
|
+
proofStrategy: ReturnType<typeof resolveAcceptanceProofStrategy>['strategy'];
|
|
12
|
+
action: ProofRoutingAction;
|
|
13
|
+
reason: string;
|
|
14
|
+
}
|
|
15
|
+
export declare function decideProofRouting(input: {
|
|
16
|
+
config: CodexOrchestratorConfig;
|
|
17
|
+
issue: GitHubIssue;
|
|
18
|
+
changedFiles: string[];
|
|
19
|
+
}): ProofRoutingDecision;
|
|
20
|
+
export declare function shouldApplyVisualProofGate(input: {
|
|
21
|
+
config: CodexOrchestratorConfig;
|
|
22
|
+
issue: GitHubIssue;
|
|
23
|
+
changedFiles: string[];
|
|
24
|
+
}): boolean;
|
|
25
|
+
export declare function classifyVisualProofDispatchTarget(input: {
|
|
26
|
+
config: CodexOrchestratorConfig;
|
|
27
|
+
issue: GitHubIssue;
|
|
28
|
+
changedFiles: string[];
|
|
29
|
+
}): VisualProofDispatchTarget;
|
|
30
|
+
export declare function isVisualProofDesirable(input: {
|
|
31
|
+
config: CodexOrchestratorConfig;
|
|
32
|
+
issue: GitHubIssue;
|
|
33
|
+
changedFiles: string[];
|
|
34
|
+
}): boolean;
|
|
35
|
+
export declare function runnerVisualProofPolicy(config: CodexOrchestratorConfig): {
|
|
36
|
+
commandTemplate?: string;
|
|
37
|
+
artifactDir: string;
|
|
38
|
+
envPassthrough: string[];
|
|
39
|
+
timeoutMs?: number;
|
|
40
|
+
minScreenshotArtifacts: number;
|
|
41
|
+
requireWhenDesirable: boolean;
|
|
42
|
+
blockOnMissingProof: boolean;
|
|
43
|
+
browserProof: {
|
|
44
|
+
scenarioPath?: string;
|
|
45
|
+
baseUrl?: string;
|
|
46
|
+
strictConsoleErrors: boolean;
|
|
47
|
+
strictNetworkFailures: boolean;
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
export declare function acceptanceProofApplies(input: {
|
|
51
|
+
config: CodexOrchestratorConfig;
|
|
52
|
+
issue: GitHubIssue;
|
|
53
|
+
changedFiles: string[];
|
|
54
|
+
}, proofStrategy: ReturnType<typeof resolveAcceptanceProofStrategy>['strategy'], desirable: boolean): boolean;
|
|
55
|
+
export declare function proofStrategyDispatchTarget(input: {
|
|
56
|
+
config: CodexOrchestratorConfig;
|
|
57
|
+
issue: GitHubIssue;
|
|
58
|
+
changedFiles: string[];
|
|
59
|
+
}, proofStrategy: ReturnType<typeof resolveAcceptanceProofStrategy>['strategy']): VisualProofDispatchTarget;
|
|
60
|
+
export declare function changedFilesVisualDispatchTarget(input: {
|
|
61
|
+
config: CodexOrchestratorConfig;
|
|
62
|
+
issue: GitHubIssue;
|
|
63
|
+
changedFiles: string[];
|
|
64
|
+
}): VisualProofDispatchTarget;
|
|
65
|
+
export declare function proofPlanDispatchTarget(proofPlan: ProofPlan): VisualProofDispatchTarget;
|
|
66
|
+
export declare function isNonVisualProofMode(mode: ProofPlanMode): boolean;
|
|
67
|
+
export declare function visualStrategyDowngradeBlocker(target: Exclude<VisualProofDispatchTarget, 'none'>): string;
|
|
68
|
+
export declare function visualProofDesirable(input: {
|
|
69
|
+
config: CodexOrchestratorConfig;
|
|
70
|
+
issue: GitHubIssue;
|
|
71
|
+
changedFiles: string[];
|
|
72
|
+
}, proofStrategy: ReturnType<typeof resolveAcceptanceProofStrategy>['strategy']): boolean;
|
|
73
|
+
//# sourceMappingURL=proof-routing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-routing.d.ts","sourceRoot":"","sources":["../../../src/runner/proof-routing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { globMatches } from '../path-policy.js';
|
|
2
|
+
import { resolveAcceptanceProofStrategy } from './proof-strategy.js';
|
|
3
|
+
export function decideProofRouting(input) {
|
|
4
|
+
const proofStrategy = resolveAcceptanceProofStrategy({ config: input.config, issue: input.issue }).strategy;
|
|
5
|
+
const dispatchTarget = proofStrategyDispatchTarget(input, proofStrategy);
|
|
6
|
+
const desirable = visualProofDesirable(input, proofStrategy);
|
|
7
|
+
const applies = acceptanceProofApplies(input, proofStrategy, desirable);
|
|
8
|
+
if (proofStrategy === 'none' || proofStrategy === 'non-visual-smoke') {
|
|
9
|
+
return {
|
|
10
|
+
applies,
|
|
11
|
+
desirable,
|
|
12
|
+
dispatchTarget,
|
|
13
|
+
proofStrategy,
|
|
14
|
+
action: 'skip',
|
|
15
|
+
reason: 'proof strategy disables browser/mobile visual proof',
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
if (dispatchTarget === 'browser' || dispatchTarget === 'mobile') {
|
|
19
|
+
return {
|
|
20
|
+
applies,
|
|
21
|
+
desirable,
|
|
22
|
+
dispatchTarget,
|
|
23
|
+
proofStrategy,
|
|
24
|
+
action: 'dispatch',
|
|
25
|
+
reason: `${dispatchTarget} proof target matched`,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (applies && !desirable) {
|
|
29
|
+
return {
|
|
30
|
+
applies: true,
|
|
31
|
+
desirable,
|
|
32
|
+
dispatchTarget,
|
|
33
|
+
proofStrategy,
|
|
34
|
+
action: 'allow-non-visual',
|
|
35
|
+
reason: 'acceptance proof applies without browser or mobile dispatch',
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (applies || desirable) {
|
|
39
|
+
return {
|
|
40
|
+
applies,
|
|
41
|
+
desirable,
|
|
42
|
+
dispatchTarget,
|
|
43
|
+
proofStrategy,
|
|
44
|
+
action: 'error',
|
|
45
|
+
reason: 'visual proof is desirable but no browser or mobile dispatch target matched',
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
applies: false,
|
|
50
|
+
desirable,
|
|
51
|
+
dispatchTarget,
|
|
52
|
+
proofStrategy,
|
|
53
|
+
action: 'error',
|
|
54
|
+
reason: 'proof routing did not match issue text or changed paths',
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
export function shouldApplyVisualProofGate(input) {
|
|
58
|
+
return decideProofRouting(input).applies;
|
|
59
|
+
}
|
|
60
|
+
export function classifyVisualProofDispatchTarget(input) {
|
|
61
|
+
return decideProofRouting(input).dispatchTarget;
|
|
62
|
+
}
|
|
63
|
+
export function isVisualProofDesirable(input) {
|
|
64
|
+
return decideProofRouting(input).desirable;
|
|
65
|
+
}
|
|
66
|
+
export function runnerVisualProofPolicy(config) {
|
|
67
|
+
const visualProof = config.reviewGates.visualProof;
|
|
68
|
+
const acceptanceProof = config.reviewGates.acceptanceProof;
|
|
69
|
+
const commandTemplate = acceptanceProof.runnerValidationCommand?.trim();
|
|
70
|
+
return {
|
|
71
|
+
commandTemplate: commandTemplate || undefined,
|
|
72
|
+
artifactDir: acceptanceProof.artifactDir,
|
|
73
|
+
envPassthrough: acceptanceProof.envPassthrough ?? [],
|
|
74
|
+
timeoutMs: acceptanceProof.runnerTimeoutMs,
|
|
75
|
+
minScreenshotArtifacts: visualProof.minScreenshotArtifacts,
|
|
76
|
+
requireWhenDesirable: visualProof.requireWhenDesirable ?? false,
|
|
77
|
+
blockOnMissingProof: true,
|
|
78
|
+
browserProof: {
|
|
79
|
+
strictConsoleErrors: acceptanceProof.browserProof?.strictConsoleErrors ?? false,
|
|
80
|
+
strictNetworkFailures: acceptanceProof.browserProof?.strictNetworkFailures ?? false,
|
|
81
|
+
scenarioPath: acceptanceProof.browserProof?.scenarioPath,
|
|
82
|
+
baseUrl: acceptanceProof.browserProof?.baseUrl,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export function acceptanceProofApplies(input, proofStrategy, desirable) {
|
|
87
|
+
const acceptanceProof = input.config.reviewGates.acceptanceProof;
|
|
88
|
+
if (!acceptanceProof.enabled) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
if (proofStrategy === 'none' || proofStrategy === 'non-visual-smoke') {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
if (proofStrategy === 'browser-visual' || proofStrategy === 'mobile-visual' || proofStrategy === 'visual') {
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
const issueText = `${input.issue.title}\n${input.issue.body}`;
|
|
98
|
+
const internalRunnerProofOnlyChange = input.changedFiles.length > 0
|
|
99
|
+
&& input.changedFiles.every(isInternalRunnerProofPath);
|
|
100
|
+
const issueNeedsAcceptanceProof = !internalRunnerProofOnlyChange
|
|
101
|
+
&& acceptanceProof.issueTextPatterns.some((pattern) => regexMatches(pattern, issueText));
|
|
102
|
+
const changedAcceptanceProofFiles = input.changedFiles.some((path) => acceptanceProof.changedPathGlobs.some((pattern) => globMatches(pattern, path)));
|
|
103
|
+
return issueNeedsAcceptanceProof || changedAcceptanceProofFiles || desirable;
|
|
104
|
+
}
|
|
105
|
+
export function proofStrategyDispatchTarget(input, proofStrategy) {
|
|
106
|
+
if (proofStrategy === 'none' || proofStrategy === 'non-visual-smoke') {
|
|
107
|
+
return 'none';
|
|
108
|
+
}
|
|
109
|
+
if (proofStrategy === 'browser-visual') {
|
|
110
|
+
return 'browser';
|
|
111
|
+
}
|
|
112
|
+
if (proofStrategy === 'mobile-visual') {
|
|
113
|
+
return 'mobile';
|
|
114
|
+
}
|
|
115
|
+
return changedFilesVisualDispatchTarget(input);
|
|
116
|
+
}
|
|
117
|
+
export function changedFilesVisualDispatchTarget(input) {
|
|
118
|
+
const normalizedFiles = input.changedFiles.map((path) => path.replaceAll('\\', '/').replace(/^\.\//u, ''));
|
|
119
|
+
const issueText = `${input.issue.title}\n${input.issue.body}`;
|
|
120
|
+
if (normalizedFiles.some(isMobileProofPath) || normalizedFiles.some((path) => isFlutterEntrypoint(path) && isMobileIssueText(issueText))) {
|
|
121
|
+
return 'mobile';
|
|
122
|
+
}
|
|
123
|
+
if (normalizedFiles.some((path) => input.config.reviewGates.visualProof.changedPathGlobs.some((pattern) => globMatches(pattern, path)))) {
|
|
124
|
+
return 'browser';
|
|
125
|
+
}
|
|
126
|
+
return 'none';
|
|
127
|
+
}
|
|
128
|
+
export function proofPlanDispatchTarget(proofPlan) {
|
|
129
|
+
if (proofPlan.mode === 'browser-visual') {
|
|
130
|
+
return 'browser';
|
|
131
|
+
}
|
|
132
|
+
if (proofPlan.mode === 'mobile-visual') {
|
|
133
|
+
return 'mobile';
|
|
134
|
+
}
|
|
135
|
+
return 'none';
|
|
136
|
+
}
|
|
137
|
+
export function isNonVisualProofMode(mode) {
|
|
138
|
+
return mode === 'non-visual-smoke' || mode === 'cli' || mode === 'api' || mode === 'worker';
|
|
139
|
+
}
|
|
140
|
+
export function visualStrategyDowngradeBlocker(target) {
|
|
141
|
+
return `Invalid proofPlan: non-visual proof cannot satisfy ${target} visual strategy`;
|
|
142
|
+
}
|
|
143
|
+
export function visualProofDesirable(input, proofStrategy) {
|
|
144
|
+
const visualProof = input.config.reviewGates.visualProof;
|
|
145
|
+
if (!visualProof.enabled) {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
const issueText = `${input.issue.title}\n${input.issue.body}`;
|
|
149
|
+
const command = runnerVisualProofPolicy(input.config).commandTemplate;
|
|
150
|
+
if (proofStrategy === 'none' || proofStrategy === 'non-visual-smoke') {
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
if (proofStrategy === 'browser-visual' || proofStrategy === 'mobile-visual' || proofStrategy === 'visual') {
|
|
154
|
+
return Boolean(command);
|
|
155
|
+
}
|
|
156
|
+
const internalRunnerProofOnlyChange = input.changedFiles.length > 0
|
|
157
|
+
&& input.changedFiles.every(isInternalRunnerProofPath);
|
|
158
|
+
const issueNeedsVisualProof = visualProof.enabled
|
|
159
|
+
&& !internalRunnerProofOnlyChange
|
|
160
|
+
&& visualProof.issueTextPatterns.some((pattern) => regexMatches(pattern, issueText));
|
|
161
|
+
const changedProofFiles = input.changedFiles.filter((path) => visualProof.changedPathGlobs.some((pattern) => globMatches(pattern, path)));
|
|
162
|
+
return issueNeedsVisualProof || changedProofFiles.length > 0;
|
|
163
|
+
}
|
|
164
|
+
function isInternalRunnerProofPath(path) {
|
|
165
|
+
return /^src\/runner\/(?:acceptance-proof|proof-routing|visual-proof-runner)\.ts$/u.test(path)
|
|
166
|
+
|| /^test\/(?:acceptance-proof|visual-proof-runner)\.test\.ts$/u.test(path);
|
|
167
|
+
}
|
|
168
|
+
function isMobileProofPath(path) {
|
|
169
|
+
return /^(?:android|ios)\//u.test(path)
|
|
170
|
+
|| /\.(?:xcodeproj|xcworkspace)\//u.test(path)
|
|
171
|
+
|| /(?:^|\/)(?:build\.gradle|build\.gradle\.kts|gradlew|gradlew\.bat)$/u.test(path);
|
|
172
|
+
}
|
|
173
|
+
function isFlutterEntrypoint(path) {
|
|
174
|
+
return path === 'pubspec.yaml' || /^lib\/.+\.dart$/u.test(path);
|
|
175
|
+
}
|
|
176
|
+
function isMobileIssueText(text) {
|
|
177
|
+
return /\b(?:android|ios|iphone|ipad|flutter|mobile|emulator|apk|aab|dart)\b/iu.test(text);
|
|
178
|
+
}
|
|
179
|
+
function regexMatches(pattern, text) {
|
|
180
|
+
return new RegExp(pattern, 'iu').test(text);
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=proof-routing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proof-routing.js","sourceRoot":"","sources":["../../../src/runner/proof-routing.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,9 +4,18 @@ export interface ResolvedProofStrategy {
|
|
|
4
4
|
strategy: AcceptanceProofStrategy;
|
|
5
5
|
source: 'issue contract' | 'config default';
|
|
6
6
|
}
|
|
7
|
+
export type AcceptanceProofRequirement = Exclude<AcceptanceProofStrategy, 'auto'>;
|
|
8
|
+
export interface ResolvedAcceptanceProofRequirement {
|
|
9
|
+
mode: AcceptanceProofRequirement | null;
|
|
10
|
+
source: ResolvedProofStrategy['source'];
|
|
11
|
+
}
|
|
7
12
|
export declare function resolveAcceptanceProofStrategy(input: {
|
|
8
13
|
config: CodexOrchestratorConfig;
|
|
9
14
|
issue: GitHubIssue;
|
|
10
15
|
}): ResolvedProofStrategy;
|
|
16
|
+
export declare function resolveAcceptanceProofRequirement(input: {
|
|
17
|
+
config: CodexOrchestratorConfig;
|
|
18
|
+
issue: GitHubIssue;
|
|
19
|
+
}): ResolvedAcceptanceProofRequirement;
|
|
11
20
|
export declare function parseIssueProofStrategy(text: string): AcceptanceProofStrategy | undefined;
|
|
12
21
|
//# sourceMappingURL=proof-strategy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proof-strategy.d.ts","sourceRoot":"","sources":["../../../src/runner/proof-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,uBAAuB,EAAE,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC5H,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,uBAAuB,CAAC;IAClC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;CAC7C;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACpD,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,WAAW,CAAC;CACpB,GAAG,qBAAqB,CASxB;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAQzF"}
|
|
1
|
+
{"version":3,"file":"proof-strategy.d.ts","sourceRoot":"","sources":["../../../src/runner/proof-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,uBAAuB,EAAE,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC5H,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,uBAAuB,CAAC;IAClC,MAAM,EAAE,gBAAgB,GAAG,gBAAgB,CAAC;CAC7C;AAED,MAAM,MAAM,0BAA0B,GAAG,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;AAElF,MAAM,WAAW,kCAAkC;IACjD,IAAI,EAAE,0BAA0B,GAAG,IAAI,CAAC;IACxC,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;CACzC;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE;IACpD,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,WAAW,CAAC;CACpB,GAAG,qBAAqB,CASxB;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,WAAW,CAAC;CACpB,GAAG,kCAAkC,CAMrC;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,uBAAuB,GAAG,SAAS,CAQzF"}
|
|
@@ -9,6 +9,13 @@ export function resolveAcceptanceProofStrategy(input) {
|
|
|
9
9
|
source: 'config default',
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
|
+
export function resolveAcceptanceProofRequirement(input) {
|
|
13
|
+
const resolved = resolveAcceptanceProofStrategy(input);
|
|
14
|
+
return {
|
|
15
|
+
mode: resolved.strategy === 'auto' ? null : resolved.strategy,
|
|
16
|
+
source: resolved.source,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
12
19
|
export function parseIssueProofStrategy(text) {
|
|
13
20
|
const match = text.match(/(?:^|\n)\s*(?:[-*]\s*)?(?:\*\*)?(?:proof\s*strategy|proofStrategy)(?:\*\*)?\s*:\s*([a-z-]+)\s*(?:\n|$)/iu);
|
|
14
21
|
const value = match?.[1]?.toLowerCase();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proof-strategy.js","sourceRoot":"","sources":["../../../src/runner/proof-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAA8D,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"proof-strategy.js","sourceRoot":"","sources":["../../../src/runner/proof-strategy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAA8D,MAAM,qBAAqB,CAAC;AAe5H,MAAM,UAAU,8BAA8B,CAAC,KAG9C;IACC,MAAM,QAAQ,GAAG,uBAAuB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACtF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC1D,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,aAAa;QAChE,MAAM,EAAE,gBAAgB;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iCAAiC,CAAC,KAGjD;IACC,MAAM,QAAQ,GAAG,8BAA8B,CAAC,KAAK,CAAC,CAAC;IACvD,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ;QAC7D,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACtB,0GAA0G,CAC3G,CAAC;IACF,MAAM,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IACxC,OAAO,yBAAyB,CAAC,QAAQ,CAAC,KAAgC,CAAC;QACzE,CAAC,CAAC,KAAgC;QAClC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
|
|
@@ -1,49 +1,13 @@
|
|
|
1
1
|
import type { CodexOrchestratorConfig } from '../config/schema.js';
|
|
2
2
|
import type { GitHubIssue } from '../github/issues.js';
|
|
3
|
-
import { type ProofRoutingDecision, type VisualProofDispatchTarget } from './acceptance-proof-loop.js';
|
|
4
3
|
import type { RunnerValidationLine } from './handoff-evidence.js';
|
|
5
4
|
export declare function buildVisualProofPromptLines(config: CodexOrchestratorConfig, issue: GitHubIssue): string[];
|
|
6
5
|
export declare function buildQualityGatePromptLines(config: CodexOrchestratorConfig): string[];
|
|
7
|
-
export
|
|
8
|
-
config: CodexOrchestratorConfig;
|
|
9
|
-
issue: GitHubIssue;
|
|
10
|
-
changedFiles: string[];
|
|
11
|
-
}): boolean;
|
|
12
|
-
export type { ProofRoutingAction, ProofRoutingDecision, VisualProofDispatchTarget } from './acceptance-proof-loop.js';
|
|
13
|
-
export declare function decideProofRouting(input: {
|
|
14
|
-
config: CodexOrchestratorConfig;
|
|
15
|
-
issue: GitHubIssue;
|
|
16
|
-
changedFiles: string[];
|
|
17
|
-
}): ProofRoutingDecision;
|
|
18
|
-
export declare function classifyVisualProofDispatchTarget(input: {
|
|
19
|
-
config: CodexOrchestratorConfig;
|
|
20
|
-
issue: GitHubIssue;
|
|
21
|
-
changedFiles: string[];
|
|
22
|
-
}): VisualProofDispatchTarget;
|
|
23
|
-
export declare function isVisualProofDesirable(input: {
|
|
24
|
-
config: CodexOrchestratorConfig;
|
|
25
|
-
issue: GitHubIssue;
|
|
26
|
-
changedFiles: string[];
|
|
27
|
-
}): boolean;
|
|
6
|
+
export { classifyVisualProofDispatchTarget, decideProofRouting, isVisualProofDesirable, runnerVisualProofPolicy, shouldApplyVisualProofGate, type ProofRoutingAction, type ProofRoutingDecision, type VisualProofDispatchTarget, } from './proof-routing.js';
|
|
28
7
|
export declare function hasPassedValidation(validation: RunnerValidationLine[], patterns: string[]): boolean;
|
|
29
8
|
export declare function hasPassedTddValidation(validation: RunnerValidationLine[], patterns: string[]): boolean;
|
|
30
9
|
export declare function validationText(line: RunnerValidationLine): string;
|
|
31
10
|
export declare function isStrongVisualValidation(line: RunnerValidationLine): boolean;
|
|
32
11
|
export declare function isRunnerVisualValidation(line: RunnerValidationLine): boolean;
|
|
33
12
|
export declare function regexMatches(pattern: string, text: string): boolean;
|
|
34
|
-
export declare function runnerVisualProofPolicy(config: CodexOrchestratorConfig): {
|
|
35
|
-
commandTemplate?: string;
|
|
36
|
-
artifactDir: string;
|
|
37
|
-
envPassthrough: string[];
|
|
38
|
-
timeoutMs?: number;
|
|
39
|
-
minScreenshotArtifacts: number;
|
|
40
|
-
requireWhenDesirable: boolean;
|
|
41
|
-
blockOnMissingProof: boolean;
|
|
42
|
-
browserProof: {
|
|
43
|
-
scenarioPath?: string;
|
|
44
|
-
baseUrl?: string;
|
|
45
|
-
strictConsoleErrors: boolean;
|
|
46
|
-
strictNetworkFailures: boolean;
|
|
47
|
-
};
|
|
48
|
-
};
|
|
49
13
|
//# sourceMappingURL=review-gate-policy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-gate-policy.d.ts","sourceRoot":"","sources":["../../../src/runner/review-gate-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"review-gate-policy.d.ts","sourceRoot":"","sources":["../../../src/runner/review-gate-policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAQvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAGlE,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,uBAAuB,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,EAAE,CAoFzG;AA4FD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,uBAAuB,GAAG,MAAM,EAAE,CAerF;AAED,OAAO,EACL,iCAAiC,EACjC,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,0BAA0B,EAC1B,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,yBAAyB,GAC/B,MAAM,oBAAoB,CAAC;AAE5B,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,oBAAoB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAInG;AAED,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,oBAAoB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAoBtG;AAaD,wBAAgB,cAAc,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAEjE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAE5E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAE5E;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { uiEvidenceFailureDimensions } from './acceptance-proof.js';
|
|
2
|
-
import {
|
|
2
|
+
import { decideProofRouting, runnerVisualProofPolicy, } from './proof-routing.js';
|
|
3
3
|
import { resolveAcceptanceProofStrategy } from './proof-strategy.js';
|
|
4
4
|
export function buildVisualProofPromptLines(config, issue) {
|
|
5
5
|
const acceptanceProof = config.reviewGates.acceptanceProof;
|
|
@@ -9,6 +9,35 @@ export function buildVisualProofPromptLines(config, issue) {
|
|
|
9
9
|
const routing = decideProofRouting({ config, issue, changedFiles: [] });
|
|
10
10
|
const issueNumber = issue.number;
|
|
11
11
|
const strategyLines = proofStrategyPromptLines(proofStrategy);
|
|
12
|
+
if (proofStrategy.strategy === 'auto') {
|
|
13
|
+
const autoLines = [
|
|
14
|
+
...strategyLines,
|
|
15
|
+
'Path and issue-text matches make Acceptance Proof applicable but do not select its proof mode.',
|
|
16
|
+
'Choose the narrowest proofPlan mode from the acceptance behavior: use browser/mobile visual proof only for rendered or device-visible behavior, and use CLI/API/worker/non-visual smoke evidence for non-visual behavior.',
|
|
17
|
+
`Save any proof artifacts under ${policy.artifactDir}/issue-${issueNumber}/ and map proofPlan.validationCommands or proofPlan.requiredArtifacts to the concrete evidence.`,
|
|
18
|
+
'Do not create browser/mobile routing markers, placeholder UI files, screenshot scenarios, or visual-proof shims merely because changed files live in a frontend or mobile directory.',
|
|
19
|
+
];
|
|
20
|
+
if (!command) {
|
|
21
|
+
return [
|
|
22
|
+
...autoLines,
|
|
23
|
+
'If proofPlan selects browser-visual or mobile-visual, prepare the corresponding Proof Report uiEvidence contract and runner-owned browser or device proof inputs.',
|
|
24
|
+
'For browser visual proof, prefer a Playwright-based proof script; for mobile visual proof, use runner-owned device-backed proof.',
|
|
25
|
+
...androidMobileProofPromptLines(),
|
|
26
|
+
...iosMobileProofPromptLines(),
|
|
27
|
+
];
|
|
28
|
+
}
|
|
29
|
+
return [
|
|
30
|
+
...autoLines,
|
|
31
|
+
...runnerOwnedVisualProofCommandPromptLines({
|
|
32
|
+
acceptanceProof,
|
|
33
|
+
artifactDir: policy.artifactDir,
|
|
34
|
+
command,
|
|
35
|
+
envNames: policy.envPassthrough,
|
|
36
|
+
issueNumber,
|
|
37
|
+
conditional: true,
|
|
38
|
+
}),
|
|
39
|
+
];
|
|
40
|
+
}
|
|
12
41
|
if (routing.proofStrategy === 'non-visual-smoke') {
|
|
13
42
|
return [
|
|
14
43
|
...strategyLines,
|
|
@@ -44,16 +73,32 @@ export function buildVisualProofPromptLines(config, issue) {
|
|
|
44
73
|
'If acceptance proof is not possible in this environment, state that explicitly in skippedChecks along with the concrete reason (missing dependencies, missing credentials, dev server cannot start, etc.).',
|
|
45
74
|
];
|
|
46
75
|
}
|
|
47
|
-
const envNames = policy.envPassthrough;
|
|
48
|
-
const loginEnvLine = envNames.length > 0
|
|
49
|
-
? `The runner acceptance proof command will receive these project environment variables when they exist: ${envNames.join(', ')}. Use them for login if authentication is required; never hardcode credentials.`
|
|
50
|
-
: 'If authentication is required, make the acceptance proof script read credentials from environment variables configured in reviewGates.acceptanceProof.envPassthrough; never hardcode credentials.';
|
|
51
76
|
return [
|
|
52
77
|
...strategyLines,
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
78
|
+
...runnerOwnedVisualProofCommandPromptLines({
|
|
79
|
+
acceptanceProof,
|
|
80
|
+
artifactDir: policy.artifactDir,
|
|
81
|
+
command,
|
|
82
|
+
envNames: policy.envPassthrough,
|
|
83
|
+
issueNumber,
|
|
84
|
+
conditional: false,
|
|
85
|
+
}),
|
|
86
|
+
];
|
|
87
|
+
}
|
|
88
|
+
function runnerOwnedVisualProofCommandPromptLines(input) {
|
|
89
|
+
const executionLine = input.conditional
|
|
90
|
+
? `If proofPlan selects browser-visual or mobile-visual, the runner will execute this configured acceptance proof command outside the child Codex sandbox: ${input.command}.`
|
|
91
|
+
: `After your run, the runner will execute this visual proof command outside the child Codex sandbox as the configured acceptance proof command: ${input.command}.`;
|
|
92
|
+
const loginEnvLine = input.envNames.length > 0
|
|
93
|
+
? `The runner acceptance proof command will receive these project environment variables when they exist: ${input.envNames.join(', ')}. Use them for login if authentication is required; never hardcode credentials.`
|
|
94
|
+
: 'If authentication is required, make the acceptance proof script read credentials from environment variables configured in reviewGates.acceptanceProof.envPassthrough; never hardcode credentials.';
|
|
95
|
+
return [
|
|
96
|
+
`For acceptance proof, prepare proof artifacts under ${input.artifactDir}/issue-${input.issueNumber}/ and include them as screenshot, ui-dump, log, smoke-output, or other artifacts when you create them.`,
|
|
97
|
+
executionLine,
|
|
98
|
+
input.conditional
|
|
99
|
+
? 'Prepare runner-owned browser or mobile proof inputs only when the selected proofPlan is visual; otherwise map concrete non-visual evidence in the completion report.'
|
|
100
|
+
: 'Prepare any project files this command needs, but do not execute this runner-owned command yourself or start long-lived browser/dev-server proof loops from child Codex.',
|
|
101
|
+
`Proof script repair is allowed only in these proof-owned paths: ${input.acceptanceProof.proofOwnedPathGlobs.join(', ')}.`,
|
|
57
102
|
'Product-code changes made during the proof phase are blockers; route missing behavior back through implementation instead.',
|
|
58
103
|
'Every required acceptance criterion must map to high-confidence artifact evidence before Draft PR Handoff.',
|
|
59
104
|
'For visual/UI work, screenshots and UI dumps require a Proof Report uiEvidence contract with workflowScope, viewportCoverage, artifactFreshness, layoutReview, copyReview, and sourceInputs.',
|
|
@@ -133,18 +178,7 @@ export function buildQualityGatePromptLines(config) {
|
|
|
133
178
|
`Run cleanup-review before code-review when the runtime change touches at least ${quality.cleanupReview.runtimeFileThreshold} runtime files, and report it as a passed validation line.`,
|
|
134
179
|
];
|
|
135
180
|
}
|
|
136
|
-
export
|
|
137
|
-
return planShouldApplyVisualProofGate(input);
|
|
138
|
-
}
|
|
139
|
-
export function decideProofRouting(input) {
|
|
140
|
-
return planProofRouting(input);
|
|
141
|
-
}
|
|
142
|
-
export function classifyVisualProofDispatchTarget(input) {
|
|
143
|
-
return planVisualProofDispatchTarget(input);
|
|
144
|
-
}
|
|
145
|
-
export function isVisualProofDesirable(input) {
|
|
146
|
-
return planVisualProofDesirable(input);
|
|
147
|
-
}
|
|
181
|
+
export { classifyVisualProofDispatchTarget, decideProofRouting, isVisualProofDesirable, runnerVisualProofPolicy, shouldApplyVisualProofGate, } from './proof-routing.js';
|
|
148
182
|
export function hasPassedValidation(validation, patterns) {
|
|
149
183
|
return validation.some((line) => line.status === 'passed' && patterns.some((pattern) => regexMatches(pattern, validationText(line))));
|
|
150
184
|
}
|
|
@@ -187,9 +221,6 @@ export function isRunnerVisualValidation(line) {
|
|
|
187
221
|
export function regexMatches(pattern, text) {
|
|
188
222
|
return new RegExp(pattern, 'iu').test(text);
|
|
189
223
|
}
|
|
190
|
-
export function runnerVisualProofPolicy(config) {
|
|
191
|
-
return planRunnerVisualProofPolicy(config);
|
|
192
|
-
}
|
|
193
224
|
function hasTddRedEvidence(text) {
|
|
194
225
|
return /\bred\s*:/iu.test(text)
|
|
195
226
|
|| /\bred\b[\s\S]{0,160}\bfail(?:ed|ing)?\b/iu.test(text)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-gate-policy.js","sourceRoot":"","sources":["../../../src/runner/review-gate-policy.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"review-gate-policy.js","sourceRoot":"","sources":["../../../src/runner/review-gate-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review-gates.d.ts","sourceRoot":"","sources":["../../../src/runner/review-gates.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"review-gates.d.ts","sourceRoot":"","sources":["../../../src/runner/review-gates.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAOvD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAcxD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,uBAAuB,CAAC;IAChC,KAAK,EAAE,WAAW,CAAC;IACnB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,UAAU,EAAE,oBAAoB,EAAE,CAAC;IACnC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAErE,wBAAgB,6BAA6B,CAAC,KAAK,EAAE;IACnD,MAAM,EAAE,uBAAuB,CAAC;IAChC,MAAM,EAAE,wBAAwB,CAAC;CAClC,GAAG,gBAAgB,CAMnB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,GAAG,gBAAgB,CA8F5E"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { acceptsScreenshotArtifactPath, classifyChangedPaths, globMatches, isRunnerVisualProofCodeArtifactPath, } from '../path-policy.js';
|
|
4
|
+
import { isNonVisualProofMode } from './proof-routing.js';
|
|
4
5
|
import { hasPassedTddValidation, hasPassedValidation, isVisualProofDesirable, isRunnerVisualValidation, isStrongVisualValidation, runnerVisualProofPolicy, shouldApplyVisualProofGate, } from './review-gate-policy.js';
|
|
5
6
|
export { shouldApplyVisualProofGate } from './review-gate-policy.js';
|
|
6
7
|
export function evaluateParentRiskRoutingGate(input) {
|
|
@@ -22,6 +23,10 @@ export function evaluateReviewGates(input) {
|
|
|
22
23
|
if (input.config.reviewGates.riskRouting.mode === 'block') {
|
|
23
24
|
blockers.push(...riskRoutingFindings.map((finding) => runnerBlocker('risk-routing-policy', `Risk routing gate requires: ${finding}.`)));
|
|
24
25
|
}
|
|
26
|
+
const proofMode = input.report.proofPlan.mode;
|
|
27
|
+
if (proofMode === 'none' || isNonVisualProofMode(proofMode)) {
|
|
28
|
+
return reviewGateResult(reasons, warnings, blockers);
|
|
29
|
+
}
|
|
25
30
|
const visualProofDesirable = isVisualProofDesirable(input);
|
|
26
31
|
const visualProofGateApplies = shouldApplyVisualProofGate(input);
|
|
27
32
|
if (!visualProofDesirable && !visualProofGateApplies) {
|
|
@@ -103,7 +108,8 @@ function evaluateScopedRiskRoutingGate(input) {
|
|
|
103
108
|
requireNonEmptyEvidence(findings, reviewHandoff.implementedContract, 'implementedContract must describe the delivered contract');
|
|
104
109
|
requireNonEmptyEvidence(findings, reviewHandoff.proofByAcceptanceCriteria, 'proofByAcceptanceCriteria must map proof to acceptance criteria');
|
|
105
110
|
requireNonEmptyEvidence(findings, reviewHandoff.reviewFocus, 'reviewFocus must identify review targets');
|
|
106
|
-
requireNonEmptyEvidence(findings, reviewHandoff.
|
|
111
|
+
requireNonEmptyEvidence(findings, reviewHandoff.agentVerifiedChecks ?? [], 'agentVerifiedChecks must identify checks completed by the agent');
|
|
112
|
+
findings.push(...evaluateMaintainerOnlyChecks(reviewHandoff));
|
|
107
113
|
}
|
|
108
114
|
if (reviewHandoff.riskLevel === 'low') {
|
|
109
115
|
if (!riskRouting.allowedLowRiskFlows.includes(reviewHandoff.flowUsed)) {
|
|
@@ -123,6 +129,45 @@ function evaluateScopedRiskRoutingGate(input) {
|
|
|
123
129
|
}
|
|
124
130
|
return findings;
|
|
125
131
|
}
|
|
132
|
+
function evaluateMaintainerOnlyChecks(reviewHandoff) {
|
|
133
|
+
const findings = [];
|
|
134
|
+
(reviewHandoff.maintainerOnlyChecks ?? []).forEach((item, index) => {
|
|
135
|
+
if (item.check.trim().length === 0) {
|
|
136
|
+
findings.push(`maintainerOnlyChecks[${index}].check must be non-empty`);
|
|
137
|
+
}
|
|
138
|
+
if (item.reasonAgentCouldNotVerify.trim().length === 0) {
|
|
139
|
+
findings.push(`maintainerOnlyChecks[${index}].reasonAgentCouldNotVerify must explain the human-only blocker`);
|
|
140
|
+
}
|
|
141
|
+
if (looksAgentVerifiableMaintainerCheck(item.check, item.reasonAgentCouldNotVerify)) {
|
|
142
|
+
findings.push(`maintainerOnlyChecks[${index}] looks agent-verifiable; put commands, code searches, import checks, and fallback-path confirmations in validation, proofByAcceptanceCriteria, or agentVerifiedChecks`);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
return findings;
|
|
146
|
+
}
|
|
147
|
+
function looksAgentVerifiableMaintainerCheck(check, reason) {
|
|
148
|
+
const normalizedCheck = normalizeEvidenceText(check);
|
|
149
|
+
const normalizedReason = normalizeEvidenceText(reason);
|
|
150
|
+
const commandLike = /(?:^|\b)(?:run|rerun|execute)\s+(?:npm|pnpm|yarn|node|npx|jest|vitest|tsc|typecheck|rg|grep|git|curl)\b/u
|
|
151
|
+
.test(normalizedCheck)
|
|
152
|
+
|| /\b(?:npm|pnpm|yarn|node|npx|jest|vitest|typecheck|rg|grep|git diff|git status)\b/u.test(normalizedCheck);
|
|
153
|
+
if (commandLike) {
|
|
154
|
+
return true;
|
|
155
|
+
}
|
|
156
|
+
const sourceInspectionLike = /^(?:confirm|check|verify|inspect)\b.*\b(?:import|imports|path|paths|fallback|only|code|client|test|spec|typecheck|appears)\b/u
|
|
157
|
+
.test(normalizedCheck);
|
|
158
|
+
if (!sourceInspectionLike) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
return !hasConcreteHumanOnlyReason(normalizedReason);
|
|
162
|
+
}
|
|
163
|
+
function hasConcreteHumanOnlyReason(reason) {
|
|
164
|
+
return /\b(?:product|business|legal|security policy|approval|credential|credentials|secret|external|account|permission|production|deploy|release|live provider|inaccessible|no access|manual device|customer|stakeholder|ux judgment)\b/u
|
|
165
|
+
.test(reason)
|
|
166
|
+
|| /outside repository evidence/u.test(reason);
|
|
167
|
+
}
|
|
168
|
+
function normalizeEvidenceText(value) {
|
|
169
|
+
return value.toLowerCase().replace(/\s+/gu, ' ').trim();
|
|
170
|
+
}
|
|
126
171
|
function evaluateParentRiskRoutingFindings(input) {
|
|
127
172
|
const riskRouting = input.config.reviewGates.riskRouting;
|
|
128
173
|
if (!riskRouting.enabled) {
|