codex-workflow-v2 2.0.0-beta.12 → 2.0.0-beta.12.10

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 (62) hide show
  1. package/README.md +65 -5
  2. package/dist/src/alpha6/downstream-proof.d.ts +68 -0
  3. package/dist/src/alpha6/downstream-proof.js +604 -0
  4. package/dist/src/alpha6/downstream-proof.js.map +1 -0
  5. package/dist/src/alpha6/milestone.d.ts +6 -2
  6. package/dist/src/alpha6/milestone.js +164 -10
  7. package/dist/src/alpha6/milestone.js.map +1 -1
  8. package/dist/src/alpha6/plan-risk.js +2 -2
  9. package/dist/src/alpha6/plan-risk.js.map +1 -1
  10. package/dist/src/alpha6/remediation.d.ts +8 -3
  11. package/dist/src/alpha6/remediation.js +374 -9
  12. package/dist/src/alpha6/remediation.js.map +1 -1
  13. package/dist/src/alpha6/review.d.ts +6 -0
  14. package/dist/src/alpha6/review.js +12 -0
  15. package/dist/src/alpha6/review.js.map +1 -1
  16. package/dist/src/alpha7/corrective-recovery.d.ts +8 -1
  17. package/dist/src/alpha7/corrective-recovery.js +406 -26
  18. package/dist/src/alpha7/corrective-recovery.js.map +1 -1
  19. package/dist/src/cli.js +135 -5
  20. package/dist/src/cli.js.map +1 -1
  21. package/dist/src/contracts.d.ts +154 -3
  22. package/dist/src/dependency-provenance.d.ts +9 -2
  23. package/dist/src/dependency-provenance.js +70 -8
  24. package/dist/src/dependency-provenance.js.map +1 -1
  25. package/dist/src/git.d.ts +1 -1
  26. package/dist/src/git.js +6 -2
  27. package/dist/src/git.js.map +1 -1
  28. package/dist/src/historical-step-provenance.d.ts +20 -0
  29. package/dist/src/historical-step-provenance.js +111 -0
  30. package/dist/src/historical-step-provenance.js.map +1 -0
  31. package/dist/src/state/corrective-replan-executor.js +5 -0
  32. package/dist/src/state/corrective-replan-executor.js.map +1 -1
  33. package/dist/src/version.d.ts +1 -1
  34. package/dist/src/version.js +1 -1
  35. package/dist/src/version.js.map +1 -1
  36. package/dist/src/workflow.d.ts +40 -2
  37. package/dist/src/workflow.js +1440 -65
  38. package/dist/src/workflow.js.map +1 -1
  39. package/docs/autonomy-guardrails.md +91 -1
  40. package/docs/decisions.md +14 -0
  41. package/docs/delegated-approval.md +6 -1
  42. package/docs/development-flow.md +60 -5
  43. package/docs/pdf/codex-workflow-v2-architecture-ru.pdf +0 -0
  44. package/docs/pdf/codex-workflow-v2-chat-only-guide-ru.pdf +0 -0
  45. package/docs/pdf/codex-workflow-v2-technical-reference-ru.pdf +0 -0
  46. package/docs/pdf/sources/codex-workflow-v2-architecture-ru.md +97 -7
  47. package/docs/pdf/sources/codex-workflow-v2-chat-only-guide-ru.md +68 -9
  48. package/docs/pdf/sources/codex-workflow-v2-technical-reference-ru.md +150 -33
  49. package/docs/release.md +51 -8
  50. package/docs/updating-existing-project.md +155 -2
  51. package/docs/validation-report.md +101 -94
  52. package/package.json +7 -2
  53. package/plugins/codex-workflow-gateway/.codex-plugin/plugin.json +1 -1
  54. package/plugins/codex-workflow-gateway/references/protocol.md +69 -1
  55. package/plugins/codex-workflow-gateway/skills/codex-workflow-gateway/SKILL.md +156 -1
  56. package/schemas/authorization-event.schema.json +8 -1
  57. package/schemas/downstream-proof-invalidation-event.schema.json +71 -0
  58. package/schemas/downstream-proof-replan-recovery-event.schema.json +61 -0
  59. package/schemas/milestone-scope-change-event.schema.json +25 -1
  60. package/schemas/stop-escalate-override-event.schema.json +45 -0
  61. package/schemas/task.schema.json +104 -0
  62. package/scripts/generate-pdf-docs.py +13 -2
@@ -0,0 +1,604 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { existsSync, lstatSync, readFileSync, readlinkSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { WorkflowError } from '../errors.js';
5
+ import { pathAllowed } from '../domain/validation.js';
6
+ import { changedFiles, currentBranch, headCommit, } from '../repository.js';
7
+ import { validateTaskHistory } from '../git.js';
8
+ import { createUlid } from '../ulid.js';
9
+ import { PACKAGE_VERSION } from '../version.js';
10
+ import { prepareSidecarAppend } from './store-sidecars.js';
11
+ const SIDECAR = 'downstream-proof-invalidations.jsonl';
12
+ const REPLAN_RECOVERY_SIDECAR = 'downstream-proof-replan-recoveries.jsonl';
13
+ const HASH_64 = /^[a-f0-9]{64}$/;
14
+ const GIT_HASH = /^[a-f0-9]{40}$/;
15
+ const EVENT_ID = /^DPI-[0-9A-HJKMNP-TV-Z]{26}$/;
16
+ const REPLAN_EVENT_ID = /^DPR-[0-9A-HJKMNP-TV-Z]{26}$/;
17
+ export function assessDownstreamProofRecovery(store, repositoryRoot, task, options = {}) {
18
+ readDownstreamProofInvalidations(store, task);
19
+ const activeStep = task.steps.find((step) => step.status === 'in_progress') ?? null;
20
+ if (task.status !== 'in_progress' || !activeStep)
21
+ return emptyAssessment();
22
+ const dirtyFiles = changedFiles(repositoryRoot).sort();
23
+ let dirtyWorktreeHash = null;
24
+ try {
25
+ dirtyWorktreeHash = hashDirtyWorktree(repositoryRoot, dirtyFiles);
26
+ }
27
+ catch (error) {
28
+ return {
29
+ ...emptyAssessment(),
30
+ applicable: true,
31
+ activeStepId: activeStep.id,
32
+ dirtyFiles,
33
+ blockers: [error instanceof Error ? error.message : String(error)],
34
+ };
35
+ }
36
+ const outsideActiveStepFiles = dirtyFiles.filter((file) => !pathAllowed(file, activeStep.allowedWrites));
37
+ if (outsideActiveStepFiles.length === 0) {
38
+ return {
39
+ ...emptyAssessment(),
40
+ activeStepId: activeStep.id,
41
+ dirtyFiles,
42
+ dirtyWorktreeHash,
43
+ };
44
+ }
45
+ const blockers = [];
46
+ if (task.workspaceOwner !== 'local') {
47
+ blockers.push('Recovery requires a local Task workspace because the dirty file set is repository-local evidence.');
48
+ }
49
+ if (!task.taskBranch || currentBranch(repositoryRoot) !== task.taskBranch) {
50
+ blockers.push(`Current branch must equal the recorded Task branch ${task.taskBranch ?? '<missing>'}.`);
51
+ }
52
+ if (!task.planHash)
53
+ blockers.push('Task has no current Plan hash.');
54
+ if (activeStep.evidence !== null) {
55
+ blockers.push(`Active Step ${activeStep.id} already has completion evidence and must use strict-review recovery.`);
56
+ }
57
+ const predecessorIds = transitivePredecessors(task, activeStep.id, blockers);
58
+ const seedIds = new Set();
59
+ for (const file of outsideActiveStepFiles) {
60
+ const owners = task.steps.filter((step) => step.status === 'completed'
61
+ && predecessorIds.has(step.id)
62
+ && pathAllowed(file, step.allowedWrites));
63
+ if (owners.length === 0) {
64
+ blockers.push(`${file} is outside ${activeStep.id} and is not owned by a completed transitive predecessor.`);
65
+ continue;
66
+ }
67
+ for (const owner of owners)
68
+ seedIds.add(owner.id);
69
+ }
70
+ const invalidatedIds = completedDependentClosure(task, seedIds, predecessorIds);
71
+ const invalidatedSteps = task.steps
72
+ .filter((step) => invalidatedIds.has(step.id))
73
+ .map((step) => {
74
+ if (!step.evidence) {
75
+ blockers.push(`Completed predecessor ${step.id} has no completion evidence.`);
76
+ }
77
+ return {
78
+ stepId: step.id,
79
+ evidenceCommit: step.evidence?.commitSha ?? '',
80
+ triggerFiles: outsideActiveStepFiles.filter((file) => pathAllowed(file, step.allowedWrites)),
81
+ };
82
+ });
83
+ if (invalidatedSteps.length === 0)
84
+ blockers.push('No completed predecessor completion authority can be invalidated.');
85
+ try {
86
+ validateTaskHistory(repositoryRoot, task, options.historyBoundary);
87
+ }
88
+ catch (error) {
89
+ blockers.push(error instanceof Error ? error.message : String(error));
90
+ }
91
+ return {
92
+ applicable: true,
93
+ eligible: blockers.length === 0,
94
+ activeStepId: activeStep.id,
95
+ dirtyFiles,
96
+ outsideActiveStepFiles,
97
+ invalidatedSteps,
98
+ preservedHeadCommit: options.preservedHeadCommit ?? headCommit(repositoryRoot),
99
+ dirtyWorktreeHash,
100
+ blockers,
101
+ };
102
+ }
103
+ export function prepareDownstreamProofInvalidation(store, resultTask, assessment, input, now) {
104
+ if (!assessment.applicable || !assessment.eligible || !assessment.activeStepId || !assessment.preservedHeadCommit) {
105
+ throw new WorkflowError('TRANSITION_BLOCKED', 'Downstream proof recovery assessment is not eligible.', {
106
+ blockers: assessment.blockers,
107
+ });
108
+ }
109
+ const actor = normalizeRequired(input.actor, 'Recovery actor');
110
+ const reason = normalizeRequired(input.reason, 'Recovery reason');
111
+ if (!resultTask.planHash)
112
+ throw new WorkflowError('STATE_CORRUPT', 'Recovered Task has no Plan hash.');
113
+ if (resultTask.revision !== input.previousTaskRevision + 1) {
114
+ throw new WorkflowError('STATE_CONFLICT', 'Recovered Task revision does not advance exactly once.');
115
+ }
116
+ const events = readDownstreamProofInvalidations(store, resultTask);
117
+ const prepared = prepareSidecarAppend(events, {
118
+ eventId: `DPI-${createUlid(now.getTime())}`,
119
+ recordedAt: now.toISOString(),
120
+ taskId: resultTask.id,
121
+ previousTaskRevision: input.previousTaskRevision,
122
+ resultTaskRevision: resultTask.revision,
123
+ planHash: resultTask.planHash,
124
+ activeStepId: assessment.activeStepId,
125
+ invalidatedSteps: assessment.invalidatedSteps.map((step) => ({
126
+ stepId: step.stepId,
127
+ evidenceCommit: step.evidenceCommit,
128
+ triggerFiles: [...step.triggerFiles],
129
+ })),
130
+ dirtyFiles: [...assessment.dirtyFiles],
131
+ dirtyWorktreeHash: assessment.dirtyWorktreeHash,
132
+ preservedHeadCommit: assessment.preservedHeadCommit,
133
+ actor,
134
+ reason,
135
+ packageVersion: PACKAGE_VERSION,
136
+ }, {
137
+ validateEvent: (event) => validateInvalidationEvent(event, resultTask),
138
+ });
139
+ return { event: prepared.event, postimage: prepared.content };
140
+ }
141
+ export function readDownstreamProofInvalidations(store, task) {
142
+ return store.readSidecarEvents(store.taskRoot(task.projectId, task.id), SIDECAR, { validateEvent: (event) => validateInvalidationEvent(event, task) });
143
+ }
144
+ export function downstreamProofInvalidationSidecar() {
145
+ return SIDECAR;
146
+ }
147
+ export function assessDownstreamProofReplanRecovery(store, repositoryRoot, task, options = {}) {
148
+ const invalidations = readDownstreamProofInvalidations(store, task);
149
+ const recoveries = readDownstreamProofReplanRecoveries(store, task);
150
+ const invalidation = invalidations.at(-1) ?? null;
151
+ const rebind = task.knowledgeRebinds.at(-1) ?? null;
152
+ if (invalidation && recoveries.some((event) => event.invalidationEventId === invalidation.eventId
153
+ && event.resultTaskRevision <= task.revision)) {
154
+ return emptyReplanAssessment();
155
+ }
156
+ if (!invalidation || !rebind
157
+ || rebind.previousPlanHash !== invalidation.planHash
158
+ || rebind.reboundPlanHash !== task.planHash
159
+ || Date.parse(rebind.recordedAt) <= Date.parse(invalidation.recordedAt)) {
160
+ return emptyReplanAssessment();
161
+ }
162
+ const blockers = [];
163
+ const dirtyFiles = changedFiles(repositoryRoot).sort();
164
+ let dirtyWorktreeHash = null;
165
+ try {
166
+ dirtyWorktreeHash = hashDirtyWorktree(repositoryRoot, dirtyFiles);
167
+ }
168
+ catch (error) {
169
+ blockers.push(error instanceof Error ? error.message : String(error));
170
+ }
171
+ const sourceBinding = [...(task.dependencyProvenanceRecoveries ?? [])]
172
+ .reverse()
173
+ .map((record) => record.activeDownstreamProof)
174
+ .find((binding) => binding
175
+ && binding.planHash === invalidation.planHash
176
+ && binding.activeStepId === invalidation.activeStepId
177
+ && JSON.stringify([...binding.dirtyFiles].sort()) === JSON.stringify(invalidation.dirtyFiles)
178
+ && JSON.stringify([...binding.invalidatedStepIds].sort())
179
+ === JSON.stringify(invalidation.invalidatedSteps.map((step) => step.stepId).sort()))
180
+ ?? null;
181
+ if (!sourceBinding) {
182
+ blockers.push('No dependency provenance record preserves the exact active downstream-proof dirty-set binding.');
183
+ }
184
+ else if (dirtyWorktreeHash !== sourceBinding.dirtyWorktreeHash) {
185
+ blockers.push('Dirty file content changed after the downstream-proof invalidation boundary.');
186
+ }
187
+ if (JSON.stringify(dirtyFiles) !== JSON.stringify(invalidation.dirtyFiles)) {
188
+ blockers.push('Dirty files changed after the downstream-proof invalidation boundary.');
189
+ }
190
+ const registeredCompatibility = [...(task.dependencyProvenanceRecoveries ?? [])]
191
+ .reverse()
192
+ .find((record) => record.downstreamProofReplan?.invalidationEventId === invalidation.eventId
193
+ && record.downstreamProofReplan.reboundPlanHash === task.planHash) ?? null;
194
+ const sourceHead = options.preservedHeadCommit
195
+ ?? registeredCompatibility?.parentCommitSha
196
+ ?? headCommit(repositoryRoot);
197
+ if (sourceHead !== invalidation.preservedHeadCommit) {
198
+ blockers.push('The recovery history boundary no longer matches the downstream-proof preserved HEAD.');
199
+ }
200
+ if (task.workspaceOwner !== 'local')
201
+ blockers.push('Recovery requires the recorded local Task workspace.');
202
+ if (!task.taskBranch || currentBranch(repositoryRoot) !== task.taskBranch) {
203
+ blockers.push('Current branch must equal the recorded Task branch.');
204
+ }
205
+ if (task.status !== 'awaiting_execution_authorization') {
206
+ blockers.push('The legacy stranded Task must still be awaiting execution authorization.');
207
+ }
208
+ if (!task.planHash || task.planHash !== rebind.reboundPlanHash) {
209
+ blockers.push('The current Plan must be the exact mechanically rebound legacy Plan.');
210
+ }
211
+ if (task.knowledgeMapRevision !== rebind.toKnowledgeMapRevision
212
+ || task.knowledgeMapHash !== rebind.toKnowledgeMapHash) {
213
+ blockers.push('The current Project Knowledge binding must match the legacy rebind record.');
214
+ }
215
+ for (const invalidated of invalidation.invalidatedSteps) {
216
+ const step = task.steps.find((candidate) => candidate.id === invalidated.stepId);
217
+ if (!step || step.status !== 'planned' || step.evidence !== null
218
+ || !(task.invalidatedStepCommits ?? []).includes(invalidated.evidenceCommit)) {
219
+ blockers.push(`Invalidated predecessor ${invalidated.stepId} no longer has the preserved planned/no-evidence posture.`);
220
+ }
221
+ }
222
+ const activeStep = task.steps.find((step) => step.id === invalidation.activeStepId);
223
+ if (!activeStep || activeStep.status !== 'blocked' || activeStep.evidence !== null) {
224
+ blockers.push(`Former proof Step ${invalidation.activeStepId} no longer has the preserved blocked/no-evidence posture.`);
225
+ }
226
+ if (task.authorizations.some((authorization) => authorization.kind === 'execution'
227
+ && authorization.decision === 'approved'
228
+ && authorization.planHash === task.planHash)) {
229
+ blockers.push('The rebound Plan has already received execution authorization.');
230
+ }
231
+ if (options.currentPlanRiskAuditExists) {
232
+ blockers.push('The rebound Plan already has a recorded current Plan Risk Audit.');
233
+ }
234
+ const expectedRevision = invalidation.resultTaskRevision + (registeredCompatibility ? 2 : 1);
235
+ if (task.revision !== expectedRevision) {
236
+ blockers.push('Task revision contains changes beyond the exact invalidation, accidental rebind, and optional dependency registration sequence.');
237
+ }
238
+ if (registeredCompatibility) {
239
+ if (registeredCompatibility.commitSha !== headCommit(repositoryRoot)
240
+ || registeredCompatibility.downstreamProofReplan?.dirtyWorktreeHash !== dirtyWorktreeHash) {
241
+ blockers.push('The registered dependency compatibility record does not bind the current HEAD and dirty worktree.');
242
+ }
243
+ }
244
+ else if (!options.historyBoundary && headCommit(repositoryRoot) !== invalidation.preservedHeadCommit) {
245
+ blockers.push('Unregistered Git history exists after the downstream-proof invalidation boundary.');
246
+ }
247
+ try {
248
+ validateTaskHistory(repositoryRoot, task, options.historyBoundary);
249
+ }
250
+ catch (error) {
251
+ blockers.push(error instanceof Error ? error.message : String(error));
252
+ }
253
+ const compatibility = sourceBinding && dirtyWorktreeHash
254
+ ? {
255
+ invalidationEventId: invalidation.eventId,
256
+ activeStepId: invalidation.activeStepId,
257
+ sourcePlanHash: invalidation.planHash,
258
+ reboundPlanHash: rebind.reboundPlanHash,
259
+ knowledgeRebindRecordedAt: rebind.recordedAt,
260
+ dirtyFiles: [...invalidation.dirtyFiles],
261
+ dirtyWorktreeHash,
262
+ invalidatedStepIds: invalidation.invalidatedSteps.map((step) => step.stepId).sort(),
263
+ }
264
+ : null;
265
+ return {
266
+ applicable: true,
267
+ eligible: blockers.length === 0 && compatibility !== null,
268
+ invalidation,
269
+ rebind,
270
+ compatibility,
271
+ dependencyRecoveryCommit: registeredCompatibility?.commitSha ?? null,
272
+ blockers,
273
+ };
274
+ }
275
+ export function prepareDownstreamProofReplanRecovery(store, resultTask, assessment, input, now) {
276
+ if (!assessment.eligible || !assessment.invalidation || !assessment.rebind || !assessment.compatibility) {
277
+ throw new WorkflowError('TRANSITION_BLOCKED', 'Downstream-proof replan compatibility assessment is not eligible.');
278
+ }
279
+ const actor = normalizeRequired(input.actor, 'Recovery actor');
280
+ const reason = normalizeRequired(input.reason, 'Recovery reason');
281
+ const events = readDownstreamProofReplanRecoveries(store, resultTask);
282
+ const prepared = prepareSidecarAppend(events, {
283
+ eventId: `DPR-${createUlid(now.getTime())}`,
284
+ recordedAt: now.toISOString(),
285
+ taskId: resultTask.id,
286
+ previousTaskRevision: input.previousTaskRevision,
287
+ resultTaskRevision: resultTask.revision,
288
+ invalidationEventId: assessment.invalidation.eventId,
289
+ invalidationPlanHash: assessment.invalidation.planHash,
290
+ reboundPlanHash: assessment.rebind.reboundPlanHash,
291
+ knowledgeRebindRecordedAt: assessment.rebind.recordedAt,
292
+ dirtyFiles: [...assessment.compatibility.dirtyFiles],
293
+ dirtyWorktreeHash: assessment.compatibility.dirtyWorktreeHash,
294
+ preservedHeadCommit: headCommit(resultTask.repositoryRoot),
295
+ dependencyRecoveryCommit: assessment.dependencyRecoveryCommit,
296
+ actor,
297
+ reason,
298
+ packageVersion: PACKAGE_VERSION,
299
+ }, {
300
+ validateEvent: (event) => validateReplanRecoveryEvent(event, resultTask),
301
+ });
302
+ return { event: prepared.event, postimage: prepared.content };
303
+ }
304
+ export function readDownstreamProofReplanRecoveries(store, task) {
305
+ return store.readSidecarEvents(store.taskRoot(task.projectId, task.id), REPLAN_RECOVERY_SIDECAR, { validateEvent: (event) => validateReplanRecoveryEvent(event, task) });
306
+ }
307
+ export function downstreamProofReplanRecoverySidecar() {
308
+ return REPLAN_RECOVERY_SIDECAR;
309
+ }
310
+ export function assessDownstreamProofCarryover(store, repositoryRoot, task, stepId) {
311
+ const invalidation = readDownstreamProofInvalidations(store, task).at(-1) ?? null;
312
+ if (!invalidation || !task.planHash || task.planHash === invalidation.planHash) {
313
+ return {
314
+ applicable: false,
315
+ eligible: false,
316
+ dirtyFiles: [],
317
+ dirtyWorktreeHash: null,
318
+ invalidationEventId: null,
319
+ blockers: [],
320
+ };
321
+ }
322
+ const recovery = [...readDownstreamProofReplanRecoveries(store, task)]
323
+ .reverse()
324
+ .find((event) => event.invalidationEventId === invalidation.eventId) ?? null;
325
+ const sourceBinding = [...(task.dependencyProvenanceRecoveries ?? [])]
326
+ .reverse()
327
+ .map((record) => record.activeDownstreamProof)
328
+ .find((binding) => binding?.planHash === invalidation.planHash
329
+ && JSON.stringify([...binding.dirtyFiles].sort()) === JSON.stringify(invalidation.dirtyFiles)) ?? null;
330
+ const expectedDirtyHash = recovery?.dirtyWorktreeHash
331
+ ?? invalidation.dirtyWorktreeHash
332
+ ?? sourceBinding?.dirtyWorktreeHash
333
+ ?? null;
334
+ const expectedHead = recovery?.preservedHeadCommit ?? invalidation.preservedHeadCommit;
335
+ const dirtyFiles = changedFiles(repositoryRoot).sort();
336
+ let dirtyWorktreeHash = null;
337
+ const blockers = [];
338
+ try {
339
+ dirtyWorktreeHash = hashDirtyWorktree(repositoryRoot, dirtyFiles);
340
+ }
341
+ catch (error) {
342
+ blockers.push(error instanceof Error ? error.message : String(error));
343
+ }
344
+ const step = task.steps.find((candidate) => candidate.id === stepId) ?? null;
345
+ if (!step || step.status !== 'planned' || step.evidence !== null) {
346
+ blockers.push('The replacement carryover Step must be planned and have no completion evidence.');
347
+ }
348
+ if (task.steps.some((candidate) => candidate.status === 'in_progress' || candidate.evidence !== null)) {
349
+ blockers.push('No replacement Plan Step may already be running or completed.');
350
+ }
351
+ if (JSON.stringify(dirtyFiles) !== JSON.stringify(invalidation.dirtyFiles)) {
352
+ blockers.push('Dirty files changed after downstream-proof recovery.');
353
+ }
354
+ if (!expectedDirtyHash) {
355
+ blockers.push('No hash-bound downstream-proof dirty-worktree evidence is available.');
356
+ }
357
+ else if (dirtyWorktreeHash !== expectedDirtyHash) {
358
+ blockers.push('Dirty file content changed after downstream-proof recovery.');
359
+ }
360
+ if (step && dirtyFiles.some((file) => !pathAllowed(file, step.allowedWrites))) {
361
+ blockers.push('The replacement Step does not own the complete preserved dirty set.');
362
+ }
363
+ if (headCommit(repositoryRoot) !== expectedHead) {
364
+ blockers.push('Git HEAD changed after downstream-proof recovery.');
365
+ }
366
+ if (task.workspaceOwner !== 'local' || !task.taskBranch || currentBranch(repositoryRoot) !== task.taskBranch) {
367
+ blockers.push('Carryover execution requires the unchanged recorded local Task branch.');
368
+ }
369
+ try {
370
+ validateTaskHistory(repositoryRoot, task);
371
+ }
372
+ catch (error) {
373
+ blockers.push(error instanceof Error ? error.message : String(error));
374
+ }
375
+ return {
376
+ applicable: true,
377
+ eligible: blockers.length === 0,
378
+ dirtyFiles,
379
+ dirtyWorktreeHash,
380
+ invalidationEventId: invalidation.eventId,
381
+ blockers,
382
+ };
383
+ }
384
+ function emptyReplanAssessment() {
385
+ return {
386
+ applicable: false,
387
+ eligible: false,
388
+ invalidation: null,
389
+ rebind: null,
390
+ compatibility: null,
391
+ dependencyRecoveryCommit: null,
392
+ blockers: [],
393
+ };
394
+ }
395
+ function emptyAssessment() {
396
+ return {
397
+ applicable: false,
398
+ eligible: false,
399
+ activeStepId: null,
400
+ dirtyFiles: [],
401
+ outsideActiveStepFiles: [],
402
+ invalidatedSteps: [],
403
+ preservedHeadCommit: null,
404
+ dirtyWorktreeHash: null,
405
+ blockers: [],
406
+ };
407
+ }
408
+ export function hashDirtyWorktree(repositoryRoot, dirtyFiles) {
409
+ const hash = createHash('sha256');
410
+ for (const file of [...dirtyFiles].sort()) {
411
+ const absolute = path.resolve(repositoryRoot, file);
412
+ const relative = path.relative(repositoryRoot, absolute);
413
+ if (!relative || relative.startsWith('..') || path.isAbsolute(relative)) {
414
+ throw new WorkflowError('GIT_PRECONDITION_FAILED', `Dirty path escapes the repository boundary: ${file}`);
415
+ }
416
+ hash.update(`path\0${file}\0`);
417
+ if (!existsSync(absolute)) {
418
+ hash.update('deleted\0');
419
+ continue;
420
+ }
421
+ const stat = lstatSync(absolute);
422
+ if (stat.isSymbolicLink()) {
423
+ hash.update(`symlink\0${readlinkSync(absolute)}\0`);
424
+ }
425
+ else if (stat.isFile()) {
426
+ hash.update('file\0');
427
+ hash.update(readFileSync(absolute));
428
+ hash.update('\0');
429
+ }
430
+ else {
431
+ throw new WorkflowError('GIT_PRECONDITION_FAILED', `Dirty path is not a regular file or symlink: ${file}`);
432
+ }
433
+ }
434
+ return hash.digest('hex');
435
+ }
436
+ function transitivePredecessors(task, stepId, blockers) {
437
+ const byId = new Map(task.steps.map((step) => [step.id, step]));
438
+ const result = new Set();
439
+ const visiting = new Set();
440
+ const visit = (candidateId) => {
441
+ if (result.has(candidateId))
442
+ return;
443
+ if (visiting.has(candidateId)) {
444
+ blockers.push(`Step dependency cycle reaches ${candidateId}.`);
445
+ return;
446
+ }
447
+ const candidate = byId.get(candidateId);
448
+ if (!candidate) {
449
+ blockers.push(`Step dependency references missing Step ${candidateId}.`);
450
+ return;
451
+ }
452
+ visiting.add(candidateId);
453
+ for (const dependency of candidate.dependencies) {
454
+ visit(dependency);
455
+ result.add(dependency);
456
+ }
457
+ visiting.delete(candidateId);
458
+ };
459
+ visit(stepId);
460
+ result.delete(stepId);
461
+ return result;
462
+ }
463
+ function completedDependentClosure(task, seedIds, predecessorIds) {
464
+ const result = new Set(seedIds);
465
+ let changed = true;
466
+ while (changed) {
467
+ changed = false;
468
+ for (const step of task.steps) {
469
+ if (step.status !== 'completed' || !predecessorIds.has(step.id) || result.has(step.id))
470
+ continue;
471
+ if (step.dependencies.some((dependency) => result.has(dependency))) {
472
+ result.add(step.id);
473
+ changed = true;
474
+ }
475
+ }
476
+ }
477
+ return result;
478
+ }
479
+ function validateInvalidationEvent(event, task) {
480
+ const requiredKeys = [
481
+ 'activeStepId', 'actor', 'dirtyFiles', 'eventHash', 'eventId', 'invalidatedSteps', 'packageVersion',
482
+ 'planHash', 'preservedHeadCommit', 'previousEventHash', 'previousTaskRevision', 'reason', 'recordedAt',
483
+ 'resultTaskRevision', 'taskId',
484
+ ];
485
+ const actualKeys = Object.keys(event).sort();
486
+ const expectedLegacyKeys = [...requiredKeys].sort();
487
+ const expectedCurrentKeys = [...requiredKeys, 'dirtyWorktreeHash'].sort();
488
+ if (!event || typeof event !== 'object' || Array.isArray(event)
489
+ || (JSON.stringify(actualKeys) !== JSON.stringify(expectedLegacyKeys)
490
+ && JSON.stringify(actualKeys) !== JSON.stringify(expectedCurrentKeys))) {
491
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream proof invalidation event contains unexpected fields.');
492
+ }
493
+ if (typeof event.eventId !== 'string' || !EVENT_ID.test(event.eventId)) {
494
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream proof invalidation eventId is invalid.');
495
+ }
496
+ if (event.taskId !== task.id)
497
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream proof invalidation Task identity mismatch.');
498
+ if (!Number.isInteger(event.previousTaskRevision) || event.previousTaskRevision < 1
499
+ || event.resultTaskRevision !== event.previousTaskRevision + 1
500
+ || event.resultTaskRevision > task.revision) {
501
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream proof invalidation revision binding is invalid.');
502
+ }
503
+ if (typeof event.planHash !== 'string' || !HASH_64.test(event.planHash)) {
504
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream proof invalidation planHash is invalid.');
505
+ }
506
+ if (typeof event.preservedHeadCommit !== 'string' || !GIT_HASH.test(event.preservedHeadCommit)) {
507
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream proof invalidation preservedHeadCommit is invalid.');
508
+ }
509
+ for (const [value, label] of [
510
+ [event.activeStepId, 'activeStepId'],
511
+ [event.actor, 'actor'],
512
+ [event.reason, 'reason'],
513
+ [event.packageVersion, 'packageVersion'],
514
+ ]) {
515
+ if (typeof value !== 'string' || !value.trim()) {
516
+ throw new WorkflowError('STATE_CORRUPT', `Downstream proof invalidation ${label} is required.`);
517
+ }
518
+ }
519
+ if (!Array.isArray(event.dirtyFiles) || event.dirtyFiles.length === 0
520
+ || event.dirtyFiles.some((file) => typeof file !== 'string' || !file.trim())
521
+ || new Set(event.dirtyFiles).size !== event.dirtyFiles.length
522
+ || JSON.stringify(event.dirtyFiles) !== JSON.stringify([...event.dirtyFiles].sort())) {
523
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream proof invalidation dirtyFiles are invalid.');
524
+ }
525
+ if (event.dirtyWorktreeHash !== undefined
526
+ && (typeof event.dirtyWorktreeHash !== 'string' || !HASH_64.test(event.dirtyWorktreeHash))) {
527
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream proof invalidation dirtyWorktreeHash is invalid.');
528
+ }
529
+ if (!Array.isArray(event.invalidatedSteps) || event.invalidatedSteps.length === 0) {
530
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream proof invalidation must identify invalidated Steps.');
531
+ }
532
+ const stepIds = new Set();
533
+ for (const step of event.invalidatedSteps) {
534
+ if (!step || typeof step !== 'object' || Array.isArray(step)
535
+ || JSON.stringify(Object.keys(step).sort()) !== JSON.stringify(['evidenceCommit', 'stepId', 'triggerFiles'])) {
536
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream proof invalidated Step contains unexpected fields.');
537
+ }
538
+ if (typeof step.stepId !== 'string' || !step.stepId.trim() || stepIds.has(step.stepId)
539
+ || typeof step.evidenceCommit !== 'string' || !GIT_HASH.test(step.evidenceCommit)
540
+ || !(task.invalidatedStepCommits ?? []).includes(step.evidenceCommit)
541
+ || !Array.isArray(step.triggerFiles)
542
+ || new Set(step.triggerFiles).size !== step.triggerFiles.length
543
+ || step.triggerFiles.some((file) => typeof file !== 'string' || !event.dirtyFiles.includes(file))) {
544
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream proof invalidated Step evidence is invalid.');
545
+ }
546
+ stepIds.add(step.stepId);
547
+ }
548
+ }
549
+ function validateReplanRecoveryEvent(event, task) {
550
+ const expectedKeys = [
551
+ 'actor', 'dependencyRecoveryCommit', 'dirtyFiles', 'dirtyWorktreeHash', 'eventHash', 'eventId',
552
+ 'invalidationEventId', 'invalidationPlanHash', 'knowledgeRebindRecordedAt', 'packageVersion',
553
+ 'preservedHeadCommit', 'previousEventHash', 'previousTaskRevision', 'reason', 'reboundPlanHash',
554
+ 'recordedAt', 'resultTaskRevision', 'taskId',
555
+ ];
556
+ if (!event || typeof event !== 'object' || Array.isArray(event)
557
+ || JSON.stringify(Object.keys(event).sort()) !== JSON.stringify(expectedKeys.sort())) {
558
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream-proof replan recovery event contains unexpected fields.');
559
+ }
560
+ if (typeof event.eventId !== 'string' || !REPLAN_EVENT_ID.test(event.eventId)) {
561
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream-proof replan recovery eventId is invalid.');
562
+ }
563
+ if (event.taskId !== task.id
564
+ || !Number.isInteger(event.previousTaskRevision)
565
+ || event.previousTaskRevision < 1
566
+ || event.resultTaskRevision !== event.previousTaskRevision + 1
567
+ || event.resultTaskRevision > task.revision) {
568
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream-proof replan recovery Task/revision binding is invalid.');
569
+ }
570
+ if (typeof event.invalidationEventId !== 'string' || !EVENT_ID.test(event.invalidationEventId)
571
+ || typeof event.invalidationPlanHash !== 'string' || !HASH_64.test(event.invalidationPlanHash)
572
+ || typeof event.reboundPlanHash !== 'string' || !HASH_64.test(event.reboundPlanHash)
573
+ || typeof event.dirtyWorktreeHash !== 'string' || !HASH_64.test(event.dirtyWorktreeHash)
574
+ || typeof event.preservedHeadCommit !== 'string' || !GIT_HASH.test(event.preservedHeadCommit)
575
+ || (event.dependencyRecoveryCommit !== null
576
+ && (typeof event.dependencyRecoveryCommit !== 'string' || !GIT_HASH.test(event.dependencyRecoveryCommit)))) {
577
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream-proof replan recovery hash binding is invalid.');
578
+ }
579
+ if (!Number.isFinite(Date.parse(event.knowledgeRebindRecordedAt))) {
580
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream-proof replan recovery knowledge rebind timestamp is invalid.');
581
+ }
582
+ if (!Array.isArray(event.dirtyFiles) || event.dirtyFiles.length === 0
583
+ || event.dirtyFiles.some((file) => typeof file !== 'string' || !file.trim())
584
+ || new Set(event.dirtyFiles).size !== event.dirtyFiles.length
585
+ || JSON.stringify(event.dirtyFiles) !== JSON.stringify([...event.dirtyFiles].sort())) {
586
+ throw new WorkflowError('STATE_CORRUPT', 'Downstream-proof replan recovery dirtyFiles are invalid.');
587
+ }
588
+ for (const [value, label] of [
589
+ [event.actor, 'actor'],
590
+ [event.reason, 'reason'],
591
+ [event.packageVersion, 'packageVersion'],
592
+ ]) {
593
+ if (typeof value !== 'string' || !value.trim()) {
594
+ throw new WorkflowError('STATE_CORRUPT', `Downstream-proof replan recovery ${label} is required.`);
595
+ }
596
+ }
597
+ }
598
+ function normalizeRequired(value, label) {
599
+ if (typeof value !== 'string' || !value.trim()) {
600
+ throw new WorkflowError('INVALID_ARGUMENT', `${label} is required.`);
601
+ }
602
+ return value.trim();
603
+ }
604
+ //# sourceMappingURL=downstream-proof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downstream-proof.js","sourceRoot":"","sources":["../../../src/alpha6/downstream-proof.ts"],"names":[],"mappings":"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"}