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.
Files changed (117) hide show
  1. package/README.md +58 -16
  2. package/dist/reviewer-runtime-build.json +1092 -0
  3. package/dist/src/alpha6/check-support-anchor.d.ts +24 -0
  4. package/dist/src/alpha6/check-support-anchor.js +102 -0
  5. package/dist/src/alpha6/check-support-anchor.js.map +1 -0
  6. package/dist/src/alpha6/component-owner.d.ts +28 -0
  7. package/dist/src/alpha6/component-owner.js +95 -0
  8. package/dist/src/alpha6/component-owner.js.map +1 -0
  9. package/dist/src/alpha6/downstream-proof.js +4 -2
  10. package/dist/src/alpha6/downstream-proof.js.map +1 -1
  11. package/dist/src/alpha6/mechanical-feasibility.js +42 -12
  12. package/dist/src/alpha6/mechanical-feasibility.js.map +1 -1
  13. package/dist/src/alpha6/milestone.d.ts +6 -2
  14. package/dist/src/alpha6/milestone.js +164 -10
  15. package/dist/src/alpha6/milestone.js.map +1 -1
  16. package/dist/src/alpha6/npm-check-contract.d.ts +11 -0
  17. package/dist/src/alpha6/npm-check-contract.js +36 -0
  18. package/dist/src/alpha6/npm-check-contract.js.map +1 -0
  19. package/dist/src/alpha6/plan-integrity.js +157 -27
  20. package/dist/src/alpha6/plan-integrity.js.map +1 -1
  21. package/dist/src/alpha6/plan-risk.d.ts +1 -0
  22. package/dist/src/alpha6/plan-risk.js +36 -7
  23. package/dist/src/alpha6/plan-risk.js.map +1 -1
  24. package/dist/src/alpha6/remediation-cause.d.ts +13 -0
  25. package/dist/src/alpha6/remediation-cause.js +77 -0
  26. package/dist/src/alpha6/remediation-cause.js.map +1 -0
  27. package/dist/src/alpha6/remediation.d.ts +15 -4
  28. package/dist/src/alpha6/remediation.js +430 -67
  29. package/dist/src/alpha6/remediation.js.map +1 -1
  30. package/dist/src/alpha6/review.js +34 -4
  31. package/dist/src/alpha6/review.js.map +1 -1
  32. package/dist/src/artifacts.js +6 -0
  33. package/dist/src/artifacts.js.map +1 -1
  34. package/dist/src/cli-actions.d.ts +25 -0
  35. package/dist/src/cli-actions.js +109 -0
  36. package/dist/src/cli-actions.js.map +1 -0
  37. package/dist/src/cli.js +216 -258
  38. package/dist/src/cli.js.map +1 -1
  39. package/dist/src/contracts.d.ts +168 -5
  40. package/dist/src/credential-transport.d.ts +38 -0
  41. package/dist/src/credential-transport.js +156 -0
  42. package/dist/src/credential-transport.js.map +1 -0
  43. package/dist/src/dependency-provenance.d.ts +23 -2
  44. package/dist/src/dependency-provenance.js +221 -34
  45. package/dist/src/dependency-provenance.js.map +1 -1
  46. package/dist/src/domain/completed-step-carryover.d.ts +13 -0
  47. package/dist/src/domain/completed-step-carryover.js +71 -0
  48. package/dist/src/domain/completed-step-carryover.js.map +1 -0
  49. package/dist/src/domain/validation.d.ts +9 -1
  50. package/dist/src/domain/validation.js +86 -0
  51. package/dist/src/domain/validation.js.map +1 -1
  52. package/dist/src/gateway-handshake.d.ts +11 -0
  53. package/dist/src/gateway-handshake.js +92 -0
  54. package/dist/src/gateway-handshake.js.map +1 -0
  55. package/dist/src/index.d.ts +2 -0
  56. package/dist/src/index.js +2 -0
  57. package/dist/src/index.js.map +1 -1
  58. package/dist/src/lifecycle/corrective-replan-binding-manifest.d.ts +5 -0
  59. package/dist/src/lifecycle/corrective-replan-binding-manifest.js +9 -0
  60. package/dist/src/lifecycle/corrective-replan-binding-manifest.js.map +1 -1
  61. package/dist/src/lifecycle/corrective-replan.js +1 -1
  62. package/dist/src/lifecycle/corrective-replan.js.map +1 -1
  63. package/dist/src/lifecycle/semantic-registry.js +1 -1
  64. package/dist/src/observation.js +1 -2
  65. package/dist/src/observation.js.map +1 -1
  66. package/dist/src/observed-routes.d.ts +114 -0
  67. package/dist/src/observed-routes.js +545 -0
  68. package/dist/src/observed-routes.js.map +1 -0
  69. package/dist/src/operational-contract.d.ts +26 -0
  70. package/dist/src/operational-contract.js +94 -0
  71. package/dist/src/operational-contract.js.map +1 -0
  72. package/dist/src/reviewer.d.ts +218 -8
  73. package/dist/src/reviewer.js +927 -25
  74. package/dist/src/reviewer.js.map +1 -1
  75. package/dist/src/state/corrective-replan-executor.js +21 -16
  76. package/dist/src/state/corrective-replan-executor.js.map +1 -1
  77. package/dist/src/state/corrective-replan-public.js +35 -10
  78. package/dist/src/state/corrective-replan-public.js.map +1 -1
  79. package/dist/src/state/corrective-replan-transaction.js +12 -4
  80. package/dist/src/state/corrective-replan-transaction.js.map +1 -1
  81. package/dist/src/state/corrective-yield-transaction.js +11 -2
  82. package/dist/src/state/corrective-yield-transaction.js.map +1 -1
  83. package/dist/src/state/lock.d.ts +1 -0
  84. package/dist/src/state/lock.js +24 -0
  85. package/dist/src/state/lock.js.map +1 -1
  86. package/dist/src/version.d.ts +1 -1
  87. package/dist/src/version.js +1 -1
  88. package/dist/src/workflow.d.ts +65 -4
  89. package/dist/src/workflow.js +1710 -155
  90. package/dist/src/workflow.js.map +1 -1
  91. package/docs/autonomy-guardrails.md +41 -14
  92. package/docs/delegated-approval.md +6 -1
  93. package/docs/development-flow.md +42 -12
  94. package/docs/pdf/codex-workflow-v2-architecture-ru.pdf +0 -0
  95. package/docs/pdf/codex-workflow-v2-chat-only-guide-ru.pdf +0 -0
  96. package/docs/pdf/codex-workflow-v2-technical-reference-ru.pdf +0 -0
  97. package/docs/pdf/sources/codex-workflow-v2-architecture-ru.md +189 -22
  98. package/docs/pdf/sources/codex-workflow-v2-chat-only-guide-ru.md +154 -26
  99. package/docs/pdf/sources/codex-workflow-v2-technical-reference-ru.md +333 -52
  100. package/docs/problem-briefs/01-pre-implementation-integrity.md +11 -7
  101. package/docs/problem-briefs/04-task-dependency-and-structural-replacement-integrity.md +13 -6
  102. package/docs/problem-briefs/README.md +11 -11
  103. package/docs/release.md +92 -9
  104. package/docs/updating-existing-project.md +227 -0
  105. package/docs/validation-report.md +177 -99
  106. package/package.json +12 -3
  107. package/plugins/codex-workflow-gateway/skills/codex-workflow-gateway/SKILL.md +42 -1
  108. package/schemas/authorization-event.schema.json +10 -3
  109. package/schemas/corrective-decision-event.schema.json +164 -9
  110. package/schemas/corrective-replan-credentials.private.schema.json +4 -2
  111. package/schemas/milestone-scope-change-event.schema.json +25 -1
  112. package/schemas/plan-risk-audit-event.schema.json +1 -0
  113. package/schemas/remediation-event.schema.json +17 -1
  114. package/schemas/review-result.schema.json +1 -0
  115. package/schemas/step-review-event.schema.json +15 -0
  116. package/schemas/task.schema.json +61 -1
  117. 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 !== 1
32
- || remediations[0]?.attemptOrdinal !== 1
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 missing = step.checks.flatMap((command) => {
40
- const match = NPM_RUN_CHECK.exec(command.trim());
41
- if (!match)
42
- return [];
43
- const script = match[1];
44
- return manifest.scripts.has(script) ? [] : [{ command: command.trim(), script }];
45
- });
46
- if (missing.length === 0 || pathAllowed(ROOT_MANIFEST, step.allowedWrites)) {
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 evidenceBase = {
74
- kind: 'missing-npm-script-outside-allowed-writes',
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
- remediationEventId: remediation.eventId,
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
- missingScripts: [...new Set(missing.map((entry) => entry.script))].sort(),
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: 'codex-workflow/plan-integrity-conflict/v1',
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 Set(), hash: null, blocker: null };
218
+ return { scripts: new Map(), hash: null, blocker: null };
108
219
  const stat = lstatSync(file);
109
220
  if (!stat.isFile()) {
110
- return { scripts: new Set(), hash: null, blocker: 'Root package.json is not a regular file.' };
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 Set(), hash, blocker: null };
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 Set(), hash, blocker: 'Root package.json scripts field is malformed.' };
230
+ return { scripts: new Map(), hash, blocker: 'Root package.json scripts field is malformed.' };
120
231
  }
121
- return { scripts: new Set(Object.keys(parsed.scripts)), hash, blocker: null };
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 Set(), hash, blocker: 'Root package.json is not valid JSON.' };
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
- const prepared = buildPlanRiskAuditEvent(store, task, input, now.toISOString(), now.getTime());
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
- return appendCurrentPlanRiskAudit(store, reboundTask, {
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) {