codex-workflow-v2 2.0.0-beta.12.9 → 2.0.0-beta.13.1
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/README.md +58 -16
- package/dist/reviewer-runtime-build.json +1092 -0
- package/dist/src/alpha6/check-support-anchor.d.ts +24 -0
- package/dist/src/alpha6/check-support-anchor.js +102 -0
- package/dist/src/alpha6/check-support-anchor.js.map +1 -0
- package/dist/src/alpha6/component-owner.d.ts +28 -0
- package/dist/src/alpha6/component-owner.js +95 -0
- package/dist/src/alpha6/component-owner.js.map +1 -0
- package/dist/src/alpha6/downstream-proof.js +4 -2
- package/dist/src/alpha6/downstream-proof.js.map +1 -1
- package/dist/src/alpha6/mechanical-feasibility.js +42 -12
- package/dist/src/alpha6/mechanical-feasibility.js.map +1 -1
- package/dist/src/alpha6/milestone.d.ts +6 -2
- package/dist/src/alpha6/milestone.js +164 -10
- package/dist/src/alpha6/milestone.js.map +1 -1
- package/dist/src/alpha6/npm-check-contract.d.ts +11 -0
- package/dist/src/alpha6/npm-check-contract.js +36 -0
- package/dist/src/alpha6/npm-check-contract.js.map +1 -0
- package/dist/src/alpha6/plan-integrity.js +157 -27
- package/dist/src/alpha6/plan-integrity.js.map +1 -1
- package/dist/src/alpha6/plan-risk.d.ts +1 -0
- package/dist/src/alpha6/plan-risk.js +36 -7
- package/dist/src/alpha6/plan-risk.js.map +1 -1
- package/dist/src/alpha6/remediation-cause.d.ts +13 -0
- package/dist/src/alpha6/remediation-cause.js +77 -0
- package/dist/src/alpha6/remediation-cause.js.map +1 -0
- package/dist/src/alpha6/remediation.d.ts +15 -4
- package/dist/src/alpha6/remediation.js +430 -67
- package/dist/src/alpha6/remediation.js.map +1 -1
- package/dist/src/alpha6/review.js +34 -4
- package/dist/src/alpha6/review.js.map +1 -1
- package/dist/src/artifacts.js +6 -0
- package/dist/src/artifacts.js.map +1 -1
- package/dist/src/cli-actions.d.ts +25 -0
- package/dist/src/cli-actions.js +109 -0
- package/dist/src/cli-actions.js.map +1 -0
- package/dist/src/cli.js +216 -258
- package/dist/src/cli.js.map +1 -1
- package/dist/src/contracts.d.ts +168 -5
- package/dist/src/credential-transport.d.ts +38 -0
- package/dist/src/credential-transport.js +156 -0
- package/dist/src/credential-transport.js.map +1 -0
- package/dist/src/dependency-provenance.d.ts +23 -2
- package/dist/src/dependency-provenance.js +221 -34
- package/dist/src/dependency-provenance.js.map +1 -1
- package/dist/src/domain/completed-step-carryover.d.ts +13 -0
- package/dist/src/domain/completed-step-carryover.js +71 -0
- package/dist/src/domain/completed-step-carryover.js.map +1 -0
- package/dist/src/domain/validation.d.ts +9 -1
- package/dist/src/domain/validation.js +86 -0
- package/dist/src/domain/validation.js.map +1 -1
- package/dist/src/gateway-handshake.d.ts +11 -0
- package/dist/src/gateway-handshake.js +92 -0
- package/dist/src/gateway-handshake.js.map +1 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +2 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/lifecycle/corrective-replan-binding-manifest.d.ts +5 -0
- package/dist/src/lifecycle/corrective-replan-binding-manifest.js +9 -0
- package/dist/src/lifecycle/corrective-replan-binding-manifest.js.map +1 -1
- package/dist/src/lifecycle/corrective-replan.js +1 -1
- package/dist/src/lifecycle/corrective-replan.js.map +1 -1
- package/dist/src/lifecycle/semantic-registry.js +1 -1
- package/dist/src/observation.js +1 -2
- package/dist/src/observation.js.map +1 -1
- package/dist/src/observed-routes.d.ts +114 -0
- package/dist/src/observed-routes.js +545 -0
- package/dist/src/observed-routes.js.map +1 -0
- package/dist/src/operational-contract.d.ts +26 -0
- package/dist/src/operational-contract.js +94 -0
- package/dist/src/operational-contract.js.map +1 -0
- package/dist/src/reviewer.d.ts +218 -8
- package/dist/src/reviewer.js +927 -25
- package/dist/src/reviewer.js.map +1 -1
- package/dist/src/state/corrective-replan-executor.js +21 -16
- package/dist/src/state/corrective-replan-executor.js.map +1 -1
- package/dist/src/state/corrective-replan-public.js +35 -10
- package/dist/src/state/corrective-replan-public.js.map +1 -1
- package/dist/src/state/corrective-replan-transaction.js +12 -4
- package/dist/src/state/corrective-replan-transaction.js.map +1 -1
- package/dist/src/state/corrective-yield-transaction.js +11 -2
- package/dist/src/state/corrective-yield-transaction.js.map +1 -1
- package/dist/src/state/lock.d.ts +1 -0
- package/dist/src/state/lock.js +24 -0
- package/dist/src/state/lock.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/workflow.d.ts +65 -4
- package/dist/src/workflow.js +1710 -155
- package/dist/src/workflow.js.map +1 -1
- package/docs/autonomy-guardrails.md +41 -14
- package/docs/delegated-approval.md +6 -1
- package/docs/development-flow.md +42 -12
- package/docs/pdf/codex-workflow-v2-architecture-ru.pdf +0 -0
- package/docs/pdf/codex-workflow-v2-chat-only-guide-ru.pdf +0 -0
- package/docs/pdf/codex-workflow-v2-technical-reference-ru.pdf +0 -0
- package/docs/pdf/sources/codex-workflow-v2-architecture-ru.md +189 -22
- package/docs/pdf/sources/codex-workflow-v2-chat-only-guide-ru.md +154 -26
- package/docs/pdf/sources/codex-workflow-v2-technical-reference-ru.md +333 -52
- package/docs/problem-briefs/01-pre-implementation-integrity.md +11 -7
- package/docs/problem-briefs/04-task-dependency-and-structural-replacement-integrity.md +13 -6
- package/docs/problem-briefs/README.md +11 -11
- package/docs/release.md +92 -9
- package/docs/updating-existing-project.md +227 -0
- package/docs/validation-report.md +177 -99
- package/package.json +12 -3
- package/plugins/codex-workflow-gateway/skills/codex-workflow-gateway/SKILL.md +42 -1
- package/schemas/authorization-event.schema.json +10 -3
- package/schemas/corrective-decision-event.schema.json +164 -9
- package/schemas/corrective-replan-credentials.private.schema.json +4 -2
- package/schemas/milestone-scope-change-event.schema.json +25 -1
- package/schemas/plan-risk-audit-event.schema.json +1 -0
- package/schemas/remediation-event.schema.json +17 -1
- package/schemas/review-result.schema.json +1 -0
- package/schemas/step-review-event.schema.json +15 -0
- package/schemas/task.schema.json +61 -1
- package/schemas/transition-definition.schema.json +8 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ParsedNpmRunCheck {
|
|
2
|
+
script: string;
|
|
3
|
+
forwardedArguments: string[];
|
|
4
|
+
}
|
|
5
|
+
export interface RequiredSelectorContract {
|
|
6
|
+
runnerPath: string;
|
|
7
|
+
selectors: readonly ['--base', '--head', '--files'];
|
|
8
|
+
}
|
|
9
|
+
export declare function parseNpmRunCheck(command: string): ParsedNpmRunCheck | null;
|
|
10
|
+
export declare function inspectRequiredSelectorContract(scriptCommand: string, readRunner: (runnerPath: string) => string | null): RequiredSelectorContract | null;
|
|
11
|
+
export declare function hasRequiredSelector(arguments_: readonly string[]): boolean;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
const NPM_RUN_CHECK = /^npm\s+run(?:-script)?\s+([A-Za-z0-9._:-]+)(?:\s+--\s+(.+))?$/;
|
|
3
|
+
const SAFE_FORWARD_ARG = /^--[A-Za-z0-9._:-]+=[^\s]+$/;
|
|
4
|
+
const NODE_AFFECTED_SCRIPT = /^node\s+([A-Za-z0-9._/-]+\.(?:cjs|js|mjs))\s+affected$/;
|
|
5
|
+
const SELECTOR = /^(?:--base|--head|--files)=.+$/;
|
|
6
|
+
export function parseNpmRunCheck(command) {
|
|
7
|
+
const match = NPM_RUN_CHECK.exec(command.trim());
|
|
8
|
+
if (!match)
|
|
9
|
+
return null;
|
|
10
|
+
const forwardedArguments = match[2]?.trim().split(/\s+/).filter(Boolean) ?? [];
|
|
11
|
+
if (forwardedArguments.some((argument) => !SAFE_FORWARD_ARG.test(argument)))
|
|
12
|
+
return null;
|
|
13
|
+
return { script: match[1], forwardedArguments };
|
|
14
|
+
}
|
|
15
|
+
export function inspectRequiredSelectorContract(scriptCommand, readRunner) {
|
|
16
|
+
const match = NODE_AFFECTED_SCRIPT.exec(scriptCommand.trim());
|
|
17
|
+
if (!match)
|
|
18
|
+
return null;
|
|
19
|
+
const runnerPath = match[1];
|
|
20
|
+
if (path.posix.isAbsolute(runnerPath)
|
|
21
|
+
|| runnerPath.split('/').some((segment) => segment === '.' || segment === '..'))
|
|
22
|
+
return null;
|
|
23
|
+
const source = readRunner(runnerPath);
|
|
24
|
+
if (!source
|
|
25
|
+
|| !source.includes('process.argv.slice(3)')
|
|
26
|
+
|| !source.includes('--base')
|
|
27
|
+
|| !source.includes('--head')
|
|
28
|
+
|| !source.includes('--files')
|
|
29
|
+
|| !source.includes('Affected mode requires'))
|
|
30
|
+
return null;
|
|
31
|
+
return { runnerPath, selectors: ['--base', '--head', '--files'] };
|
|
32
|
+
}
|
|
33
|
+
export function hasRequiredSelector(arguments_) {
|
|
34
|
+
return arguments_.some((argument) => SELECTOR.test(argument));
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=npm-check-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-check-contract.js","sourceRoot":"","sources":["../../../src/alpha6/npm-check-contract.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,aAAa,GAAG,+DAA+D,CAAC;AACtF,MAAM,gBAAgB,GAAG,6BAA6B,CAAC;AACvD,MAAM,oBAAoB,GAAG,wDAAwD,CAAC;AACtF,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AAYlD,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,kBAAkB,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAC/E,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACzF,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,kBAAkB,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,aAAqB,EACrB,UAAiD;IAEjD,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IAC7B,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC;WAChC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/F,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,IAAI,CAAC,MAAM;WACN,CAAC,MAAM,CAAC,QAAQ,CAAC,uBAAuB,CAAC;WACzC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;WAC1B,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;WAC1B,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC;WAC3B,CAAC,MAAM,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAA6B;IAC/D,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { createHash } from 'node:crypto';
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
2
3
|
import { existsSync, lstatSync, readFileSync } from 'node:fs';
|
|
3
4
|
import path from 'node:path';
|
|
4
5
|
import { pathAllowed } from '../domain/validation.js';
|
|
5
6
|
import { WorkflowError } from '../errors.js';
|
|
6
7
|
import { hashCanonical } from '../lifecycle/fingerprint.js';
|
|
7
8
|
import { changedFiles, headCommit } from '../repository.js';
|
|
9
|
+
import { hasRequiredSelector, inspectRequiredSelectorContract, parseNpmRunCheck, } from './npm-check-contract.js';
|
|
10
|
+
import { inspectCheckSupportAnchors } from './check-support-anchor.js';
|
|
11
|
+
import { inspectFailedCheckComponentOwners, semanticBoundaryHash } from './component-owner.js';
|
|
8
12
|
import { readCorrectiveDecisionEvents, readRemediationEvents, } from './remediation.js';
|
|
9
13
|
const ROOT_MANIFEST = 'package.json';
|
|
10
14
|
const TASK_ID = /^TASK-[0-9A-HJKMNP-TV-Z]{26}$/;
|
|
11
|
-
const NPM_RUN_CHECK = /^npm\s+run(?:-script)?\s+([A-Za-z0-9._:-]+)(?:\s+--(?:\s+.*)?)?$/;
|
|
12
15
|
export function defaultPlanIntegrityRecoveryActor(taskId) {
|
|
13
16
|
if (!TASK_ID.test(taskId)) {
|
|
14
17
|
throw new WorkflowError('INVALID_ARGUMENT', `Cannot derive a Plan-integrity recovery actor from invalid Task ID ${taskId}.`);
|
|
@@ -28,22 +31,82 @@ export function assessPlanIntegrityRecovery(store, repositoryRoot, task, stepId)
|
|
|
28
31
|
}
|
|
29
32
|
const remediations = readRemediationEvents(store, task).filter((event) => event.stepId === stepId);
|
|
30
33
|
const decisions = readCorrectiveDecisionEvents(store, task).filter((event) => event.stepId === stepId);
|
|
31
|
-
if (remediations.length
|
|
32
|
-
|| remediations
|
|
33
|
-
|| remediations[0]?.mode !== 'ordinary'
|
|
34
|
-
|| remediations[0]?.failureKind !== 'checks-failed'
|
|
34
|
+
if (remediations.length === 0
|
|
35
|
+
|| remediations.some((event, index) => event.attemptOrdinal !== index + 1 || event.failureKind !== 'checks-failed')
|
|
35
36
|
|| decisions.length !== 0) {
|
|
36
37
|
return { ...base, applicable: false, eligible: false, blockers: [], evidence: null };
|
|
37
38
|
}
|
|
38
39
|
const manifest = inspectRootManifest(repositoryRoot);
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
const runnerBlockers = [];
|
|
41
|
+
const conflicts = [];
|
|
42
|
+
for (const command of step.checks) {
|
|
43
|
+
const invocation = parseNpmRunCheck(command);
|
|
44
|
+
if (!invocation)
|
|
45
|
+
continue;
|
|
46
|
+
const scriptCommand = manifest.scripts.get(invocation.script) ?? null;
|
|
47
|
+
if (scriptCommand === null) {
|
|
48
|
+
if (pathAllowed(ROOT_MANIFEST, step.allowedWrites))
|
|
49
|
+
continue;
|
|
50
|
+
conflicts.push({
|
|
51
|
+
reasonCode: 'MISSING_NPM_SCRIPT',
|
|
52
|
+
script: invocation.script,
|
|
53
|
+
command: command.trim(),
|
|
54
|
+
scriptCommand: null,
|
|
55
|
+
runnerPath: null,
|
|
56
|
+
runnerHash: null,
|
|
57
|
+
});
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const runnerInspections = new Map();
|
|
61
|
+
const selectorContract = inspectRequiredSelectorContract(scriptCommand, (runnerPath) => {
|
|
62
|
+
const inspection = inspectRepositoryFile(repositoryRoot, runnerPath);
|
|
63
|
+
runnerInspections.set(runnerPath, inspection);
|
|
64
|
+
return inspection.content;
|
|
65
|
+
});
|
|
66
|
+
if (!selectorContract || hasRequiredSelector(invocation.forwardedArguments))
|
|
67
|
+
continue;
|
|
68
|
+
const runnerInspection = runnerInspections.get(selectorContract.runnerPath) ?? null;
|
|
69
|
+
if (runnerInspection?.blocker)
|
|
70
|
+
runnerBlockers.push(runnerInspection.blocker);
|
|
71
|
+
if (pathAllowed(ROOT_MANIFEST, step.allowedWrites)
|
|
72
|
+
|| pathAllowed(selectorContract.runnerPath, step.allowedWrites))
|
|
73
|
+
continue;
|
|
74
|
+
conflicts.push({
|
|
75
|
+
reasonCode: 'REQUIRED_SELECTOR_MISSING',
|
|
76
|
+
script: invocation.script,
|
|
77
|
+
command: command.trim(),
|
|
78
|
+
scriptCommand,
|
|
79
|
+
runnerPath: selectorContract.runnerPath,
|
|
80
|
+
runnerHash: runnerInspection?.hash ?? null,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
conflicts.sort((left, right) => left.command.localeCompare(right.command) || left.reasonCode.localeCompare(right.reasonCode));
|
|
84
|
+
const supportConflicts = conflicts.length === 0
|
|
85
|
+
? inspectCheckSupportAnchors({
|
|
86
|
+
step,
|
|
87
|
+
scripts: manifest.scripts,
|
|
88
|
+
readFile: (relativePath) => {
|
|
89
|
+
const inspected = inspectRepositoryFile(repositoryRoot, relativePath);
|
|
90
|
+
return { content: inspected.content, hash: inspected.hash };
|
|
91
|
+
},
|
|
92
|
+
pathExists: (relativePath) => gitPathExists(repositoryRoot, headCommit(repositoryRoot), relativePath),
|
|
93
|
+
}).map((conflict) => ({
|
|
94
|
+
...conflict,
|
|
95
|
+
expectedOutputPaths: [...conflict.expectedOutputPaths],
|
|
96
|
+
anchoredMigrationNames: [...conflict.anchoredMigrationNames],
|
|
97
|
+
}))
|
|
98
|
+
: [];
|
|
99
|
+
const componentOwnerConflicts = conflicts.length === 0 && supportConflicts.length === 0
|
|
100
|
+
? inspectFailedCheckComponentOwners({
|
|
101
|
+
step,
|
|
102
|
+
scripts: manifest.scripts,
|
|
103
|
+
readFile: (relativePath) => {
|
|
104
|
+
const inspected = inspectRepositoryFile(repositoryRoot, relativePath);
|
|
105
|
+
return { content: inspected.content, hash: inspected.hash };
|
|
106
|
+
},
|
|
107
|
+
}).map(({ causeFingerprint: _causeFingerprint, ...conflict }) => conflict)
|
|
108
|
+
: [];
|
|
109
|
+
if (conflicts.length === 0 && supportConflicts.length === 0 && componentOwnerConflicts.length === 0) {
|
|
47
110
|
return { ...base, applicable: false, eligible: false, blockers: [], evidence: null };
|
|
48
111
|
}
|
|
49
112
|
const files = [...changedFiles(repositoryRoot)].sort();
|
|
@@ -51,14 +114,20 @@ export function assessPlanIntegrityRecovery(store, repositoryRoot, task, stepId)
|
|
|
51
114
|
const forbiddenChanges = files.filter((file) => pathAllowed(file, step.forbiddenScope));
|
|
52
115
|
const blockers = [
|
|
53
116
|
...(manifest.blocker ? [manifest.blocker] : []),
|
|
117
|
+
...runnerBlockers,
|
|
54
118
|
...(outsideAllowedWrites.length > 0
|
|
55
119
|
? [`Changed files outside ${stepId} allowedWrites: ${outsideAllowedWrites.join(', ')}`]
|
|
56
120
|
: []),
|
|
57
121
|
...(forbiddenChanges.length > 0
|
|
58
122
|
? [`Changed files intersect ${stepId} forbiddenScope: ${forbiddenChanges.join(', ')}`]
|
|
59
123
|
: []),
|
|
124
|
+
...supportConflicts.flatMap((conflict) => pathAllowed(conflict.supportPath, step.forbiddenScope)
|
|
125
|
+
? [`Check-support authority ${conflict.supportPath} intersects ${stepId} forbiddenScope.`]
|
|
126
|
+
: []),
|
|
127
|
+
...componentOwnerConflicts.flatMap((conflict) => pathAllowed(conflict.ownerPath, step.forbiddenScope)
|
|
128
|
+
? [`Component owner ${conflict.ownerPath} intersects ${stepId} forbiddenScope.`]
|
|
129
|
+
: []),
|
|
60
130
|
];
|
|
61
|
-
const remediation = remediations[0];
|
|
62
131
|
const stepDefinitionHash = hashCanonical({
|
|
63
132
|
id: step.id,
|
|
64
133
|
title: step.title,
|
|
@@ -70,23 +139,52 @@ export function assessPlanIntegrityRecovery(store, repositoryRoot, task, stepId)
|
|
|
70
139
|
forbiddenScope: step.forbiddenScope,
|
|
71
140
|
checks: step.checks,
|
|
72
141
|
});
|
|
73
|
-
const
|
|
74
|
-
|
|
142
|
+
const remediationBindings = remediations.map((event) => ({
|
|
143
|
+
eventId: event.eventId,
|
|
144
|
+
eventHash: event.eventHash,
|
|
145
|
+
attemptOrdinal: event.attemptOrdinal,
|
|
146
|
+
}));
|
|
147
|
+
const evidenceBase = supportConflicts.length > 0 ? {
|
|
148
|
+
kind: 'check-support-anchor-outside-allowed-writes',
|
|
149
|
+
taskRevision: task.revision,
|
|
150
|
+
remediationEvents: remediationBindings,
|
|
151
|
+
manifestPath: ROOT_MANIFEST,
|
|
152
|
+
manifestHash: manifest.hash,
|
|
153
|
+
gitHead: headCommit(repositoryRoot),
|
|
154
|
+
stepDefinitionHash,
|
|
155
|
+
conflicts: supportConflicts,
|
|
156
|
+
scopeExtensions: [...new Set(supportConflicts.map((conflict) => conflict.supportPath))].sort(),
|
|
157
|
+
changedFiles: files,
|
|
158
|
+
} : componentOwnerConflicts.length > 0 ? {
|
|
159
|
+
kind: 'failed-check-component-owner-outside-allowed-writes',
|
|
160
|
+
taskRevision: task.revision,
|
|
161
|
+
remediationEvents: remediationBindings,
|
|
162
|
+
gitHead: headCommit(repositoryRoot),
|
|
163
|
+
stepDefinitionHash,
|
|
164
|
+
semanticBoundaryHash: semanticBoundaryHash(task),
|
|
165
|
+
failedCheckCauseFingerprint: step.failurePause.failedChecks.find((failure) => componentOwnerConflicts.some((conflict) => conflict.command === failure.command)).causeFingerprint,
|
|
166
|
+
conflicts: componentOwnerConflicts,
|
|
167
|
+
scopeExtensions: [...new Set(componentOwnerConflicts.map((conflict) => conflict.ownerPath))].sort(),
|
|
168
|
+
changedFiles: files,
|
|
169
|
+
} : {
|
|
170
|
+
kind: 'non-executable-npm-check-outside-allowed-writes',
|
|
75
171
|
taskRevision: task.revision,
|
|
76
|
-
|
|
77
|
-
remediationEventHash: remediation.eventHash,
|
|
172
|
+
remediationEvents: remediationBindings,
|
|
78
173
|
manifestPath: ROOT_MANIFEST,
|
|
79
174
|
manifestHash: manifest.hash,
|
|
80
175
|
gitHead: headCommit(repositoryRoot),
|
|
81
176
|
stepDefinitionHash,
|
|
82
|
-
|
|
83
|
-
checkCommands: [...new Set(missing.map((entry) => entry.command))].sort(),
|
|
177
|
+
conflicts,
|
|
84
178
|
changedFiles: files,
|
|
85
179
|
};
|
|
86
180
|
const evidence = {
|
|
87
181
|
...evidenceBase,
|
|
88
182
|
conflictHash: hashCanonical({
|
|
89
|
-
domain:
|
|
183
|
+
domain: supportConflicts.length > 0
|
|
184
|
+
? 'codex-workflow/plan-integrity-conflict/v3'
|
|
185
|
+
: componentOwnerConflicts.length > 0
|
|
186
|
+
? 'codex-workflow/plan-integrity-conflict/v4'
|
|
187
|
+
: 'codex-workflow/plan-integrity-conflict/v2',
|
|
90
188
|
taskId: task.id,
|
|
91
189
|
planHash: task.planHash,
|
|
92
190
|
stepId,
|
|
@@ -101,27 +199,59 @@ export function assessPlanIntegrityRecovery(store, repositoryRoot, task, stepId)
|
|
|
101
199
|
evidence,
|
|
102
200
|
};
|
|
103
201
|
}
|
|
202
|
+
function gitPathExists(repositoryRoot, commit, relativePath) {
|
|
203
|
+
const result = spawnSync('git', ['-C', repositoryRoot, 'cat-file', '-e', `${commit}:${relativePath}`], {
|
|
204
|
+
encoding: 'utf8',
|
|
205
|
+
});
|
|
206
|
+
if (result.status === 0)
|
|
207
|
+
return true;
|
|
208
|
+
if (result.status === 128)
|
|
209
|
+
return false;
|
|
210
|
+
throw new WorkflowError('COMMAND_FAILED', `Unable to inspect ${relativePath} at ${commit}.`, {
|
|
211
|
+
stderr: result.stderr.trim(),
|
|
212
|
+
exitCode: result.status,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
104
215
|
function inspectRootManifest(repositoryRoot) {
|
|
105
216
|
const file = path.join(repositoryRoot, ROOT_MANIFEST);
|
|
106
217
|
if (!existsSync(file))
|
|
107
|
-
return { scripts: new
|
|
218
|
+
return { scripts: new Map(), hash: null, blocker: null };
|
|
108
219
|
const stat = lstatSync(file);
|
|
109
220
|
if (!stat.isFile()) {
|
|
110
|
-
return { scripts: new
|
|
221
|
+
return { scripts: new Map(), hash: null, blocker: 'Root package.json is not a regular file.' };
|
|
111
222
|
}
|
|
112
223
|
const bytes = readFileSync(file);
|
|
113
224
|
const hash = createHash('sha256').update(bytes).digest('hex');
|
|
114
225
|
try {
|
|
115
226
|
const parsed = JSON.parse(bytes.toString('utf8'));
|
|
116
227
|
if (parsed.scripts === undefined)
|
|
117
|
-
return { scripts: new
|
|
228
|
+
return { scripts: new Map(), hash, blocker: null };
|
|
118
229
|
if (!parsed.scripts || typeof parsed.scripts !== 'object' || Array.isArray(parsed.scripts)) {
|
|
119
|
-
return { scripts: new
|
|
230
|
+
return { scripts: new Map(), hash, blocker: 'Root package.json scripts field is malformed.' };
|
|
120
231
|
}
|
|
121
|
-
return {
|
|
232
|
+
return {
|
|
233
|
+
scripts: new Map(Object.entries(parsed.scripts)
|
|
234
|
+
.filter((entry) => typeof entry[1] === 'string')),
|
|
235
|
+
hash,
|
|
236
|
+
blocker: null,
|
|
237
|
+
};
|
|
122
238
|
}
|
|
123
239
|
catch {
|
|
124
|
-
return { scripts: new
|
|
240
|
+
return { scripts: new Map(), hash, blocker: 'Root package.json is not valid JSON.' };
|
|
125
241
|
}
|
|
126
242
|
}
|
|
243
|
+
function inspectRepositoryFile(repositoryRoot, relativePath) {
|
|
244
|
+
const file = path.join(repositoryRoot, relativePath);
|
|
245
|
+
if (!existsSync(file))
|
|
246
|
+
return { content: null, hash: null, blocker: `${relativePath} is missing.` };
|
|
247
|
+
const stat = lstatSync(file);
|
|
248
|
+
if (!stat.isFile())
|
|
249
|
+
return { content: null, hash: null, blocker: `${relativePath} is not a regular file.` };
|
|
250
|
+
const bytes = readFileSync(file);
|
|
251
|
+
return {
|
|
252
|
+
content: bytes.toString('utf8'),
|
|
253
|
+
hash: createHash('sha256').update(bytes).digest('hex'),
|
|
254
|
+
blocker: null,
|
|
255
|
+
};
|
|
256
|
+
}
|
|
127
257
|
//# sourceMappingURL=plan-integrity.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan-integrity.js","sourceRoot":"","sources":["../../../src/alpha6/plan-integrity.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plan-integrity.js","sourceRoot":"","sources":["../../../src/alpha6/plan-integrity.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AdoptionPostureEvent, PlanRiskAuditDecision, PlanRiskAuditEvent, PlanRiskAuditStepClassification, TaskState } from '../contracts.js';
|
|
2
2
|
import type { FileStateStore } from '../state/store.js';
|
|
3
|
+
export declare const STRUCTURAL_PRODUCTION_EDGE_AUTHORITY: "required-v1";
|
|
3
4
|
export interface PlanRiskAuditBoundary {
|
|
4
5
|
scope: 'current-task-steps' | 'legacy-remaining-scope';
|
|
5
6
|
postureEventType: AdoptionPostureEvent['eventType'];
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync } from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { WorkflowError } from '../errors.js';
|
|
4
|
+
import { validateStructuralProductionEdgeAuthority } from '../domain/validation.js';
|
|
4
5
|
import { assertHash64, canonicalJsonStringify, sha256Hex } from './store-sidecars.js';
|
|
5
6
|
import { createUlid } from '../ulid.js';
|
|
6
7
|
const PLAN_RISK_AUDIT_SIDECAR = 'plan-risk-audits.jsonl';
|
|
@@ -47,6 +48,7 @@ const GUARDED_RISK_CATEGORY_ORDER = [
|
|
|
47
48
|
];
|
|
48
49
|
const GUARDED_RISK_CATEGORY_SET = new Set(GUARDED_RISK_CATEGORY_ORDER);
|
|
49
50
|
const GUARDED_RISK_CATEGORY_INDEX = new Map(GUARDED_RISK_CATEGORY_ORDER.map((category, index) => [category, index]));
|
|
51
|
+
export const STRUCTURAL_PRODUCTION_EDGE_AUTHORITY = 'required-v1';
|
|
50
52
|
export function validatePlanRiskAuditCandidate(store, task, input) {
|
|
51
53
|
const boundary = readPlanRiskAuditBoundary(store, task);
|
|
52
54
|
if (!boundary) {
|
|
@@ -115,6 +117,9 @@ export function readCurrentPlanRiskAudit(store, task, options = {}) {
|
|
|
115
117
|
};
|
|
116
118
|
}
|
|
117
119
|
export function buildPlanRiskAuditEvent(store, task, input, recordedAt, now = Date.now()) {
|
|
120
|
+
return buildPlanRiskAuditEventWithAuthority(store, task, input, recordedAt, now, true);
|
|
121
|
+
}
|
|
122
|
+
function buildPlanRiskAuditEventWithAuthority(store, task, input, recordedAt, now, bindStructuralProductionEdgeAuthority) {
|
|
118
123
|
const boundary = readPlanRiskAuditBoundary(store, task);
|
|
119
124
|
if (!boundary) {
|
|
120
125
|
throw new WorkflowError('TRANSITION_BLOCKED', 'Plan Risk Audit recording requires an active adoption posture boundary.', { taskId: task.id, sidecar: ADOPTION_POSTURE_SIDECAR });
|
|
@@ -152,6 +157,9 @@ export function buildPlanRiskAuditEvent(store, task, input, recordedAt, now = Da
|
|
|
152
157
|
value: input.decision,
|
|
153
158
|
}),
|
|
154
159
|
splitRationale: normalizeOptionalNonEmptyString(input.splitRationale, 'Plan Risk Audit splitRationale'),
|
|
160
|
+
...(bindStructuralProductionEdgeAuthority
|
|
161
|
+
? { structuralProductionEdgeAuthority: STRUCTURAL_PRODUCTION_EDGE_AUTHORITY }
|
|
162
|
+
: {}),
|
|
155
163
|
stepClassifications: normalizePlanRiskClassifications(input.stepClassifications, 'INVALID_ARGUMENT', {
|
|
156
164
|
taskId: task.id,
|
|
157
165
|
}),
|
|
@@ -159,7 +167,7 @@ export function buildPlanRiskAuditEvent(store, task, input, recordedAt, now = Da
|
|
|
159
167
|
validatePlanRiskAuditPayload(task, event, boundary.expectedStepIds, 'INVALID_ARGUMENT', {
|
|
160
168
|
taskId: task.id,
|
|
161
169
|
expectedStepIds: boundary.expectedStepIds,
|
|
162
|
-
});
|
|
170
|
+
}, true, bindStructuralProductionEdgeAuthority);
|
|
163
171
|
return {
|
|
164
172
|
boundary,
|
|
165
173
|
entityRoot,
|
|
@@ -167,7 +175,10 @@ export function buildPlanRiskAuditEvent(store, task, input, recordedAt, now = Da
|
|
|
167
175
|
};
|
|
168
176
|
}
|
|
169
177
|
export function appendCurrentPlanRiskAudit(store, task, input, now) {
|
|
170
|
-
|
|
178
|
+
return appendPlanRiskAuditWithAuthority(store, task, input, now, true);
|
|
179
|
+
}
|
|
180
|
+
function appendPlanRiskAuditWithAuthority(store, task, input, now, bindStructuralProductionEdgeAuthority) {
|
|
181
|
+
const prepared = buildPlanRiskAuditEventWithAuthority(store, task, input, now.toISOString(), now.getTime(), bindStructuralProductionEdgeAuthority);
|
|
171
182
|
const existingEvents = readPlanRiskAuditEvents(store, task);
|
|
172
183
|
assertPlanRiskAuditAppendAllowed(task, prepared.boundary, existingEvents);
|
|
173
184
|
return store.appendSidecarEvent(prepared.entityRoot, PLAN_RISK_AUDIT_SIDECAR, prepared.event, {
|
|
@@ -182,7 +193,12 @@ export function validateCorrectiveReplanRiskAuditPayload(task, event, expectedSt
|
|
|
182
193
|
}
|
|
183
194
|
export function appendReboundPlanRiskAudit(store, sourceTask, reboundTask, sourceAudit, now) {
|
|
184
195
|
assertReboundPlanRiskAuditAllowed(store, sourceTask, reboundTask, sourceAudit);
|
|
185
|
-
|
|
196
|
+
const sourceHasStructuralProductionEdgeAuthority = sourceAudit.audit.structuralProductionEdgeAuthority !== undefined
|
|
197
|
+
|| Object.hasOwn(sourceTask, 'requiresProductionEdges')
|
|
198
|
+
|| Object.hasOwn(sourceTask, 'productionEdges')
|
|
199
|
+
|| Object.hasOwn(reboundTask, 'requiresProductionEdges')
|
|
200
|
+
|| Object.hasOwn(reboundTask, 'productionEdges');
|
|
201
|
+
return appendPlanRiskAuditWithAuthority(store, reboundTask, {
|
|
186
202
|
planner: sourceAudit.audit.planner,
|
|
187
203
|
auditor: sourceAudit.audit.auditor,
|
|
188
204
|
summary: `${sourceAudit.audit.summary} Rebound automatically after content-only Task context refresh.`,
|
|
@@ -197,7 +213,7 @@ export function appendReboundPlanRiskAudit(store, sourceTask, reboundTask, sourc
|
|
|
197
213
|
? { proofObligations: classification.proofObligations.map((obligation) => ({ ...obligation })) }
|
|
198
214
|
: {}),
|
|
199
215
|
})),
|
|
200
|
-
}, now);
|
|
216
|
+
}, now, sourceHasStructuralProductionEdgeAuthority);
|
|
201
217
|
}
|
|
202
218
|
function readCurrentAdoptionPosture(store, projectId) {
|
|
203
219
|
const sidecarFile = path.join(store.projectRoot(projectId), ADOPTION_POSTURE_SIDECAR);
|
|
@@ -467,13 +483,16 @@ function validateAdoptionBaseline(task, baseline, currentTaskStepIds, posture) {
|
|
|
467
483
|
}
|
|
468
484
|
}
|
|
469
485
|
function validateStoredPlanRiskAuditEvent(event, task, file, line) {
|
|
486
|
+
const hasStructuralAuthorityBoundary = event.planHash === task.planHash && (event.structuralProductionEdgeAuthority !== undefined
|
|
487
|
+
|| Object.hasOwn(task, 'requiresProductionEdges')
|
|
488
|
+
|| Object.hasOwn(task, 'productionEdges'));
|
|
470
489
|
validatePlanRiskAuditPayload(task, event, null, 'STATE_CORRUPT', {
|
|
471
490
|
file,
|
|
472
491
|
line,
|
|
473
492
|
eventId: event.eventId,
|
|
474
|
-
}, false);
|
|
493
|
+
}, false, hasStructuralAuthorityBoundary);
|
|
475
494
|
}
|
|
476
|
-
function validatePlanRiskAuditPayload(task, event, expectedStepIds, errorCode, details, requireCurrentStepChecks = true) {
|
|
495
|
+
function validatePlanRiskAuditPayload(task, event, expectedStepIds, errorCode, details, requireCurrentStepChecks = true, requireStructuralProductionEdgeAuthority = true) {
|
|
477
496
|
if (event.taskId !== task.id) {
|
|
478
497
|
throw new WorkflowError(errorCode, 'Plan Risk Audit task binding does not match its task root.', {
|
|
479
498
|
...details,
|
|
@@ -499,10 +518,20 @@ function validatePlanRiskAuditPayload(task, event, expectedStepIds, errorCode, d
|
|
|
499
518
|
normalizeNonEmptyString(event.summary, 'Plan Risk Audit summary', { code: errorCode, ...details });
|
|
500
519
|
normalizePlanRiskDecision(event.decision, errorCode, details);
|
|
501
520
|
normalizeOptionalNonEmptyString(event.splitRationale, 'Plan Risk Audit splitRationale', { code: errorCode, ...details });
|
|
521
|
+
if (event.structuralProductionEdgeAuthority !== undefined
|
|
522
|
+
&& event.structuralProductionEdgeAuthority !== STRUCTURAL_PRODUCTION_EDGE_AUTHORITY) {
|
|
523
|
+
throw new WorkflowError(errorCode, 'Plan Risk Audit structural production-edge authority marker is invalid.', {
|
|
524
|
+
...details,
|
|
525
|
+
structuralProductionEdgeAuthority: event.structuralProductionEdgeAuthority,
|
|
526
|
+
});
|
|
527
|
+
}
|
|
502
528
|
if (!Array.isArray(event.stepClassifications)) {
|
|
503
529
|
throw new WorkflowError(errorCode, 'Plan Risk Audit stepClassifications must be an array.', details);
|
|
504
530
|
}
|
|
505
531
|
validateStepClassificationSet(task, event.stepClassifications, event.decision, event.splitRationale, expectedStepIds, errorCode, details, requireCurrentStepChecks);
|
|
532
|
+
if (requireStructuralProductionEdgeAuthority) {
|
|
533
|
+
validateStructuralProductionEdgeAuthority(task, event.stepClassifications);
|
|
534
|
+
}
|
|
506
535
|
}
|
|
507
536
|
function validateStepClassificationSet(task, classifications, decision, splitRationale, expectedStepIds, errorCode, details, requireCurrentStepChecks = true) {
|
|
508
537
|
const currentTaskStepIds = new Set(task.steps.map((step) => step.id));
|
|
@@ -771,7 +800,7 @@ function buildTaskStepDefinitionHashes(task) {
|
|
|
771
800
|
return new Map(task.steps.map((step) => [step.id, sha256Hex(canonicalJsonStringify(stripTaskStepRuntime(step)))]));
|
|
772
801
|
}
|
|
773
802
|
function stripTaskStepRuntime(step) {
|
|
774
|
-
const { status: _status, evidence: _evidence, ...definition } = step;
|
|
803
|
+
const { status: _status, evidence: _evidence, failurePause: _failurePause, ...definition } = step;
|
|
775
804
|
return definition;
|
|
776
805
|
}
|
|
777
806
|
function assertRecordableTask(task) {
|