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

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 (78) hide show
  1. package/README.md +47 -13
  2. package/dist/src/alpha6/handoff.d.ts +4 -3
  3. package/dist/src/alpha6/handoff.js +58 -3
  4. package/dist/src/alpha6/handoff.js.map +1 -1
  5. package/dist/src/alpha6/mechanical-feasibility.d.ts +7 -0
  6. package/dist/src/alpha6/mechanical-feasibility.js +303 -0
  7. package/dist/src/alpha6/mechanical-feasibility.js.map +1 -0
  8. package/dist/src/alpha6/milestone.d.ts +25 -2
  9. package/dist/src/alpha6/milestone.js +359 -32
  10. package/dist/src/alpha6/milestone.js.map +1 -1
  11. package/dist/src/alpha6/plan-integrity.d.ts +14 -0
  12. package/dist/src/alpha6/plan-integrity.js +127 -0
  13. package/dist/src/alpha6/plan-integrity.js.map +1 -0
  14. package/dist/src/alpha6/remediation.d.ts +3 -2
  15. package/dist/src/alpha6/remediation.js +168 -55
  16. package/dist/src/alpha6/remediation.js.map +1 -1
  17. package/dist/src/alpha6/review.d.ts +5 -0
  18. package/dist/src/alpha6/review.js +110 -2
  19. package/dist/src/alpha6/review.js.map +1 -1
  20. package/dist/src/cli.js +14 -2
  21. package/dist/src/cli.js.map +1 -1
  22. package/dist/src/contracts.d.ts +82 -1
  23. package/dist/src/git.d.ts +1 -1
  24. package/dist/src/git.js +8 -1
  25. package/dist/src/git.js.map +1 -1
  26. package/dist/src/index.d.ts +1 -0
  27. package/dist/src/index.js +1 -0
  28. package/dist/src/index.js.map +1 -1
  29. package/dist/src/lifecycle/corrective-replan.js +8 -3
  30. package/dist/src/lifecycle/corrective-replan.js.map +1 -1
  31. package/dist/src/reviewer.d.ts +26 -0
  32. package/dist/src/reviewer.js +54 -1
  33. package/dist/src/reviewer.js.map +1 -1
  34. package/dist/src/version.d.ts +1 -1
  35. package/dist/src/version.js +1 -1
  36. package/dist/src/workflow.d.ts +5 -0
  37. package/dist/src/workflow.js +449 -148
  38. package/dist/src/workflow.js.map +1 -1
  39. package/docs/autonomy-guardrails.md +42 -33
  40. package/docs/beta11-plan-integrity-recovery-brief.md +38 -0
  41. package/docs/decisions.md +5 -4
  42. package/docs/delegated-approval.md +5 -4
  43. package/docs/development-flow.md +38 -12
  44. package/docs/lifecycle/state-machine-stabilization.md +2 -2
  45. package/docs/pdf/README.md +24 -0
  46. package/docs/pdf/codex-workflow-v2-architecture-ru.pdf +0 -0
  47. package/docs/pdf/codex-workflow-v2-chat-only-guide-ru.pdf +0 -0
  48. package/docs/pdf/codex-workflow-v2-technical-reference-ru.pdf +0 -0
  49. package/docs/pdf/requirements.txt +1 -0
  50. package/docs/pdf/sources/codex-workflow-v2-architecture-ru.md +235 -0
  51. package/docs/pdf/sources/codex-workflow-v2-chat-only-guide-ru.md +334 -0
  52. package/docs/pdf/sources/codex-workflow-v2-technical-reference-ru.md +414 -0
  53. package/docs/problem-briefs/01-pre-implementation-integrity.md +478 -0
  54. package/docs/problem-briefs/02-minimal-step-integrity.md +411 -0
  55. package/docs/problem-briefs/03-minimal-agent-context-integrity.md +358 -0
  56. package/docs/problem-briefs/04-task-dependency-and-structural-replacement-integrity.md +566 -0
  57. package/docs/problem-briefs/BRIEF-TEMPLATE.md +56 -0
  58. package/docs/problem-briefs/README.md +120 -0
  59. package/docs/problem-briefs/evidence/p01-mechanical-feasibility-corpus.md +90 -0
  60. package/docs/problem-briefs/evidence/signal-v4-pre-m3-replay.md +246 -0
  61. package/docs/release.md +17 -6
  62. package/docs/split-required-recovery.md +19 -26
  63. package/docs/validation-report.md +83 -70
  64. package/package.json +5 -1
  65. package/plugins/codex-workflow-gateway/.codex-plugin/plugin.json +1 -1
  66. package/plugins/codex-workflow-gateway/references/protocol.md +31 -9
  67. package/plugins/codex-workflow-gateway/skills/codex-workflow-gateway/SKILL.md +23 -6
  68. package/references/state-machine.md +18 -13
  69. package/references/validation-and-review.md +11 -4
  70. package/schemas/authorization-event.schema.json +64 -1
  71. package/schemas/corrective-decision-event.schema.json +48 -3
  72. package/schemas/milestone-scope-change-event.schema.json +6 -1
  73. package/schemas/milestone.schema.json +6 -1
  74. package/schemas/review-result.schema.json +17 -1
  75. package/schemas/step-review-event.schema.json +15 -0
  76. package/schemas/task-handoff-event.schema.json +18 -2
  77. package/scripts/generate-pdf-docs.py +513 -0
  78. package/scripts/run-pdf-docs.mjs +62 -0
@@ -1,85 +1,98 @@
1
- # V2 beta.10 Validation Report
1
+ # V2 beta.12 Validation Report
2
2
 
3
- Release candidate `2.0.0-beta.10` was validated on 2026-08-22 with Node.js 24.17.0.
3
+ Release candidate `2.0.0-beta.12` was validated on 2026-08-27 with Node.js 24.17.0.
4
4
 
5
5
  ## Automated release evidence
6
6
 
7
- - `npm run validate` passed `297/297` sequential tests with no failures, skips,
8
- cancellations, or todos. The exact Signal recovery tests also passed independently through
9
- `npm run test:signal-t04-recovery` (`5/5`).
10
- - `npm run pack:check` passed with an isolated temporary npm cache. The tarball contains 247 files;
11
- package size is 1.0 MB and unpacked size is 3.6 MB.
12
- - `npm run smoke:downstream` packed and installed the actual beta.10 tarball in an empty project,
13
- then passed the packaged CLI handshake. The first sandboxed attempt was network-blocked while
14
- fetching `ajv`; the authorized network retry passed.
15
- - `npm run plugin:check`, the plugin-creator structural validator, the skill validator,
16
- `npm run release:check`, and `git diff --check` passed. The bundled plugin source cachebuster is
17
- `0.1.0+codex.20260822140058`; the packaged installer produced and read back personal installation
18
- `0.1.0+codex.20260822140239` with the beta.10 recovery instructions present in source and cache.
7
+ - `npm ci` completed from the committed lockfile with 0 reported vulnerabilities.
8
+ - The final `npm run validate` passed `321/321` sequential tests with no failures, skips,
9
+ cancellations, or todos. The focused Signal T04 recovery suite passed independently (`5/5`).
10
+ - `npm run pack:check` passed outside the filesystem-restricted sandbox. The beta.12 tarball
11
+ contains 269 files; package size is 955.6 kB and unpacked size is 3.7 MB.
12
+ - `npm run smoke:downstream` packed and installed the actual beta.12 tarball in an empty temporary
13
+ project, then passed the packaged CLI handshake. The first sandboxed attempt was network-blocked
14
+ while fetching pinned `ajv`; the authorized network retry passed.
15
+ - `npm run plugin:check`, the official Codex plugin validator, `npm run docs:pdf:check`, exact
16
+ `RELEASE_TAG=v2.0.0-beta.12 npm run release:check`, and `git diff --check` passed. The bundled
17
+ gateway cachebuster is `0.1.0+codex.20260827003726`.
19
18
 
20
- ## beta.10 retained-review recovery evidence
19
+ The first full post-version-bump validation exposed three failures before the Signal T04 runtime
20
+ scenario began: a historical read-only snapshot truthfully targeted beta.11, while its replay
21
+ assertion incorrectly required the current package version. The fix keeps the snapshot immutable at
22
+ `2.0.0-beta.11`, binds the synthetic replay dependency to current `PACKAGE_VERSION`, and makes the
23
+ release check verify both identities separately. The focused suite then passed `5/5`, and the final
24
+ complete suite passed `321/321`.
21
25
 
22
- - Recovery still requires one clean local Task branch whose final unregistered HEAD changes exactly
23
- `package.json` and `package-lock.json`, with runtime, manifest, lock, installed package, current
24
- branch, and Task base branch all aligned to beta.10. Running Steps, leases, transactions, Core
25
- operations, product changes in the candidate, and base payload drift fail closed.
26
- - A product commit removed from the current Step by corrective replan is now admissible only when
27
- Core derives it from the globally validated strict-review sidecars: an intact
28
- `pending → review-recorded → attestation-verified` chain, `passed` decision, exact completion
29
- commit, and verified reviewer isolation. Pending review and a corrupted event-hash chain fail
30
- closed in dedicated regressions.
31
- - The dependency candidate is recorded in `systemCommits`. Historical reviewed product commits are
32
- recorded separately in `dependencyProvenanceRecoveries[].retainedHistoricalCommits`; they are not
33
- relabelled as Workflow system commits. Normal Git-history validation consumes both provenance
34
- classes after recovery.
35
- - The release check pins the exact sanitized Signal fixture: project
36
- `b06d0f18f790f4521a23c770`, Milestone `MS-01M0HVCBC9DM3XQAR82T4550DA`, Task
37
- `TASK-01M0HVK4YDJ3W9X0N72TYNV8WK` revision 26, status
38
- `awaiting_execution_authorization`, planned Step with null current evidence, recorded system
39
- commits `d6cce722…` and `198de88…`, and retained passed-review commit `acdfc803…`.
26
+ ## Continuable remediation and review-routing evidence
40
27
 
41
- ## Isolated exact Signal replay
28
+ - A guarded Task remains in the same Task/Step and reaches a passing strict review after five
29
+ consecutive failed review cycles. Attempts 1–2 are ordinary; attempts 3+ are corrective
30
+ diagnostics but remain executable and review-gated.
31
+ - Attempt count no longer selects a terminal lifecycle transition. It is retained as diagnostic
32
+ history only; explicit `split-required` and `stop-escalate` remain the stop authorities.
33
+ - A failed review defaults to `route=fix` (or an omitted route) and continues the same Task/Step.
34
+ `route=replan` is valid only with exact `planClause`, `whyFixCannotFit`, and `minimalPlanChange`
35
+ evidence.
36
+ - Replan returns to ordinary `task plan-set`; objective, requirements, and acceptance remain
37
+ immutable, while only implementation Steps may change. The replacement Plan still passes the
38
+ normal Plan Risk Audit and execution-authorization gates.
39
+ - Failed-review routing evidence is hash-chained in the public Step Review event schema. Drift,
40
+ malformed evidence, unrelated Knowledge changes, forged actors, and corrupt chains remain
41
+ fail-closed.
42
42
 
43
- - The real Signal Git branch and Workflow state were copied to temporary isolated state plus two
44
- temporary Git worktrees. The replay modelled the actual installed transition
45
- `2.0.0-beta.7 → 2.0.0-beta.10`; it did not assume beta.9.
46
- - With an exact dependency-only candidate over `acdfc803…`, read-only preflight returned
47
- `eligible=true`, no blockers, Task revision 26, and exactly one retained historical commit:
48
- `acdfc80345d2d4cd9d42af17da246701c42f0969`.
49
- - Fresh `next` advertised only `update dependency-provenance-recover`. Recovery advanced the copied
50
- Task `26 → 27`, preserved current corrective Plan/Step posture, appended the dependency candidate
51
- to `systemCommits`, and persisted `acdfc803…` under `retainedHistoricalCommits`.
52
- - Sequential post-recovery `status → next` returned the normal actionable route
53
- `task context-refresh`, because manifest/lock changed the derived Knowledge inputs. It did not
54
- return `doctor` or another dependency recovery.
55
- - Temporary worktrees, branches, tarball, and copied Workflow state were deleted. Direct readback
56
- then confirmed the real Signal repository remained clean at `acdfc803…` and the real Task remained
57
- revision 26 with no dependency-provenance recovery record.
43
+ ## Retained dependency, feasibility, and recovery evidence
58
44
 
59
- ## Progress, replacement, and chat evidence
45
+ - P04-A retains the canonical Milestone dependency DAG, atomic initial Plan transaction/recovery,
46
+ dependency-bound handoff/claim/start, legacy fail-closed policy, and unconditional structural
47
+ replacement shutdown.
48
+ - P01-A retains three versioned read-only analyzers, canonical in-event evidence/hash binding,
49
+ exact pre-start and corrective source selection, and phase-aware freshness before claim/start/run.
50
+ - The exact Signal T04 revision-26 fixture still proves that only a verified historical Step Review
51
+ can retain its completion commit across corrective replan. Pending review is never trusted, and a
52
+ corrupt strict-review hash chain is rejected.
53
+ - Bounded beta.11 `task plan-integrity-recover` compatibility remains green for its exact first
54
+ ordinary checks-failed case. It does not edit the Plan, package manifest, or worktree and still
55
+ fails closed for writable-manifest scope, unrelated dirty files, binding drift, or tampering.
56
+ - Read-only Milestone progress still preserves `T03 cancelled → T08 replacement`; project-monotonic
57
+ chat allocation and deterministic long-title fallback/readback remain green.
60
58
 
61
- - The full suite retains the read-only Milestone progress projection and exact regression
62
- `T03 cancelled → T08 replacement`, including stable membership/Step ordinals.
63
- - Automated chat-registry coverage still proves project-monotonic `#NNN`, all compact title
64
- families, long Cyrillic readback/fallback, multiple review attempts, and atomic allocation.
65
- - The beta.9 live App E2E evidence remains valid for the unchanged title/registry implementation:
66
- Tasks `01a02928-0436-7af2-a1b9-a969226d50d9`,
67
- `01a02928-3d39-7673-8e08-6d4ed0f8d554`, and
68
- `01a02928-58a0-7e03-b487-f8877b7f76d8` exercised Task, Step Review A1, and Step Review A2 with
69
- exact deterministic fallback and readback before archival.
59
+ ## Packaged real-agent lifecycle replay
70
60
 
71
- ## External App-runtime limitation retained
61
+ - A fresh disposable Git project installed the locally packed beta.12 tarball, declared the exact
62
+ `2.0.0-beta.12` dependency, and passed packaged `gateway handshake` plus `doctor` with protocol 2,
63
+ state schema 2, current dependency identity, and a clean checkout.
64
+ - The trusted harness invoked the real packaged CLI sequentially for handshake, doctor, direct first
65
+ Discovery bootstrap, `status`, and fresh `next`. The resulting navigation advertised
66
+ `project-memory scan`.
67
+ - `node scripts/validate-lifecycle-transcript.mjs` accepted all `10/10` post-provenance events with
68
+ no failed invocation, unadvertised mutation, or missing checkpoint. The semantic log SHA-256 is
69
+ `ab4ef10ad00e2fd9f54810ec5d0bbfb4106e1b211b3a185869d8a46787a5062d`; the raw packaged-result
70
+ log SHA-256 is `e693a839604c7ba2055f99e43c49c5ab63ac0cf6e790adc901db5dd8eb0ffae9`.
71
+ - Credential-marker inspection found no writer, claim, delegation, bearer, or secret material, and
72
+ the disposable product checkout remained clean. Logs and external workflow state stayed outside
73
+ this repository.
72
74
 
73
- Plugin CLI installation and cache readback passed. A currently open Codex task can still retain the
74
- skill path injected when that task started; loading the new personal plugin version requires a new
75
- Codex task. This is an App runtime/catalog lifetime boundary, not a package or Workflow-state
76
- failure.
75
+ This replay validates package resolution, clean bootstrap, one real mutation, and mandatory
76
+ post-mutation navigation discipline. It does not claim a second full product Milestone replay;
77
+ deeper remediation, P01-A, and P04-A behavior is covered by deterministic and integration tests.
78
+
79
+ ## beta.12 PDF release documentation evidence
80
+
81
+ - Three tracked Russian PDFs were deterministically regenerated from reviewable Markdown sources
82
+ under `docs/pdf/sources/`; `npm run docs:pdf:check` reported an empty stale set.
83
+ - All 24 pages were rendered and visually inspected: architecture is 6 pages, the delegated
84
+ chat-only guide is 8 pages, and the technical reference is 10 pages. No blank, clipped, or orphaned
85
+ page was found.
86
+ - Visible titles, headers, package commands, and release gates identify beta.12. The content covers
87
+ continuable remediation, evidence-bound fix/replan routing, Milestone dependency authority,
88
+ P01-A mechanical feasibility, C1 credentials, external-sealed review, Plan-integrity compatibility,
89
+ structural-replacement shutdown, and the limited derived-graph role of `codebase-memory-mcp`.
77
90
 
78
91
  ## Not claimed
79
92
 
80
- - No npm publication, Git tag, push, or release commit was performed by validation.
81
- - No real Signal Workflow mutation, package update, branch change, or manual external-state edit was
82
- performed.
83
- - The isolated replay proves the exact recovery path before publication; a real Signal update must
84
- still install the published beta.10 package and follow fresh project-local `handshake → doctor →
85
- statusnextpreflightadvertised recovery`.
93
+ - Validation itself performs no npm publication, Git tag, push, Signal Workflow mutation, or local
94
+ plugin reinstall. Tagging and remote push are separate actions after the exact candidate gates.
95
+ - Structural replacement remains intentionally disabled; beta.12 does not claim P04-B replacement
96
+ materialization or completed-Step adoption.
97
+ - A real project must install the published exact beta.12 package, update/reinstall the bundled
98
+ gateway, and follow fresh project-local `handshake doctorstatusnext` navigation.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-workflow-v2",
3
- "version": "2.0.0-beta.10",
3
+ "version": "2.0.0-beta.12",
4
4
  "description": "Requirements-first Codex development workflow with local state and explicit Git ownership.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -34,6 +34,8 @@
34
34
  "references",
35
35
  "plugins",
36
36
  "docs",
37
+ "scripts/generate-pdf-docs.py",
38
+ "scripts/run-pdf-docs.mjs",
37
39
  "README.md"
38
40
  ],
39
41
  "scripts": {
@@ -46,6 +48,8 @@
46
48
  "pack:check": "npm run build && npm pack --dry-run",
47
49
  "smoke:downstream": "npm run build && node scripts/downstream-smoke.mjs",
48
50
  "plugin:check": "node scripts/validate-plugin.mjs",
51
+ "docs:pdf": "node scripts/run-pdf-docs.mjs",
52
+ "docs:pdf:check": "node scripts/run-pdf-docs.mjs --check",
49
53
  "release:check": "node scripts/release-check.mjs",
50
54
  "publish:release": "node scripts/publish.mjs"
51
55
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-workflow-gateway",
3
- "version": "0.1.0+codex.20260822140058",
3
+ "version": "0.1.0+codex.20260827003726",
4
4
  "description": "Thin personal Codex gateway for exact project-local Codex Workflow V2 packages and codebase-memory-mcp.",
5
5
  "author": {
6
6
  "name": "Codex Workflow Maintainers"
@@ -1,6 +1,12 @@
1
1
  # Gateway Protocol V2
2
2
 
3
- ## beta.10 coordinator projections, retained review provenance, and chat registry
3
+ ## beta.12 continuable remediation, coordinator projections, and retained recovery compatibility
4
+
5
+ - When fresh `next` advertises `task plan-integrity-recover`, consume its exact Task revision,
6
+ Step, actor, and writer-token contract. This route is valid only for the Core-derived
7
+ first-failure missing-root-npm-script evidence and must be followed by fresh `status -> next`.
8
+ It records a replan posture without changing Plan or product files; corrective yield and the
9
+ existing state-bound corrective-replan Human gate remain mandatory.
4
10
 
5
11
  - `update dependency-provenance-preflight --id <TASK-ID>` is read-only. The matching
6
12
  `update dependency-provenance-recover --id <TASK-ID> --expected-revision <N> --actor <ACTOR>
@@ -38,7 +44,7 @@ Current capability set:
38
44
  - `delegated-approval-v1`
39
45
  - `task-knowledge-rebind-v1`
40
46
  - `task-context-refresh-v1`
41
- - `terminal-task-replacement-transaction-v1`
47
+ - `structural-task-replacement-disabled-v1`
42
48
  - `project-composite-transaction-journal-v1`
43
49
  - `corrective-plan-audit-v1`
44
50
  - `safe-update-preflight-v1`
@@ -52,9 +58,12 @@ Current capability set:
52
58
  - `step-remediation-circuit-breaker-sidecar-v1`
53
59
  - `milestone-scope-change-sidecar-v1`
54
60
  - `milestone-membership-integrity-v1`
61
+ - `milestone-task-dependency-dag-v1`
62
+ - `milestone-initial-plan-transaction-v1`
55
63
  - `task-c1-handoff-sidecar-v1`
64
+ - `task-mechanical-feasibility-v1`
56
65
  - `semantic-plan-risk-audit-v2`
57
- - `guarded-remediation-hard-stop-v1`
66
+ - `guarded-remediation-continuation-v1`
58
67
  - `milestone-reverse-membership-integrity-v1`
59
68
  - `task-c1-handoff-bundle-v2`
60
69
  - `alpha6-adoption-posture-v1`
@@ -62,10 +71,18 @@ Current capability set:
62
71
  - `milestone-initial-assembly-v1`
63
72
  - `milestone-initial-assembly-navigation-v2`
64
73
  - `milestone-autonomy-contract-v1`
74
+ - `milestone-autonomy-content-refresh-v1`
65
75
  - `milestone-autonomous-membership-evolution-v1`
66
76
  - `task-c1-derived-worker-actor-v1`
67
77
  - `guarded-corrective-auditor-routing-v1`
78
+ - `corrective-decision-context-recovery-v1`
79
+ - `remediation-mode-recovery-v1`
68
80
  - `plan-proof-obligations-v1`
81
+ - `bounded-plan-integrity-recovery-v1`
82
+ - `corrective-yield-journal-v1`
83
+ - `corrective-replan-journal-v1`
84
+ - `corrective-replan-human-gate-v1`
85
+ - `corrective-replan-protocol-v2`
69
86
 
70
87
  Protocol `1` and schema `2` remain valid only because alpha.7 is additive. The gateway must
71
88
  not claim compatibility if canonical entity shapes or non-additive command semantics change.
@@ -152,18 +169,23 @@ one hostile counterexample, expected safe result, and exact executable evidence
152
169
  unguarded Plan. Missing, stale, `split-required`, or `stop-escalate` evidence blocks
153
170
  authorization.
154
171
 
155
- For guarded remediation, `next.correctivePlanGate` or the runtime gate blocks a third
156
- ordinary retry on the same guarded Step until a current corrective decision exists. Record it
157
- with:
172
+ For guarded remediation, the first two failed cycles are recorded as `ordinary` and later cycles as
173
+ `corrective`. This mode is diagnostic: a third or later retry remains executable and still requires
174
+ a fresh strict review. A finding defaults to `route=fix`; `route=replan` is accepted only with exact
175
+ Plan-conflict evidence and routes to ordinary `task plan-set` for implementation-Step changes.
176
+
177
+ An explicit corrective disposition can still be recorded when the actor deliberately chooses a
178
+ stop, split, or compatible historical recovery route:
158
179
 
159
180
  ```text
160
181
  codex-workflow task corrective-decision --repo <git-root> \
161
182
  --id <TASK-ID> --step <STEP-ID> --expected-revision <REVISION> --file <decision.json>
162
183
  ```
163
184
 
164
- Only `continue-fix` permits bounded continuation. `replan-required`, `split-required`, and
165
- `stop-escalate` are stop or redirection decisions. If the third corrective review fails, a
166
- fourth run is prohibited; only split or stop may be recorded.
185
+ `continue-fix` permits continuation; `replan-required`, `split-required`, and `stop-escalate` are
186
+ explicit stop or redirection decisions. They are never inferred from attempt count. Without such an
187
+ explicit decision, another failed strict review continues the same Task through its evidence-bound
188
+ `fix`/`replan` route.
167
189
 
168
190
  ## Context refresh
169
191
 
@@ -50,6 +50,17 @@ pending/corrupt transaction. After success run sequential `status` then `next` a
50
50
  returned lifecycle action; Knowledge reconciliation or atomic Task context refresh may legitimately
51
51
  be next because the dependency files changed.
52
52
 
53
+ The beta.11 bounded Plan-integrity route prevents a known impossible check from consuming a second
54
+ ordinary remediation attempt. Use `task plan-integrity-recover` only when fresh `next` advertises
55
+ it for the exact failed Task/Step/revision. Require `state=eligible`, no blockers, one first
56
+ `checks-failed` remediation, an exact missing root npm script, `package.json` outside the Step's
57
+ `allowedWrites`, and a dirty-file set confined to that Step. Pass the exact returned actor and the
58
+ active writer token when the C1 contract requires it. The recovery records only a bound early
59
+ `replan-required` decision: it does not edit the Plan or worktree. Then follow fresh `next` through
60
+ `task corrective-yield` and the existing Human-confirmed corrective-replan flow. Never repeat
61
+ `task run` merely to manufacture the second failure, and never invoke this recovery for a generic
62
+ test failure, a writable manifest, or unconfined changes.
63
+
53
64
  If any step fails, report the concrete diagnostic. Do not load workflow
54
65
  semantics from this skill.
55
66
 
@@ -85,9 +96,12 @@ Autonomy Grant. Never infer eligibility from the Plan yourself; if Core returns
85
96
  `contextRefreshBlocked.unsafeDifferences`, use the ordinary visible Knowledge Map flow.
86
97
 
87
98
  When `next` reports terminal `split-required`, follow `docs/split-required-recovery.md` from the
88
- installed package. The only valid continuation is the exact `task replacement-materialize`
89
- transition (or creation of its one ready Discovery when requested). Never rebind, refresh, replan,
90
- authorize, or resume the historical Task, and never emulate the membership changes manually.
99
+ installed package. P04-A returns `doctor` with blocked action `task replacement-materialize`,
100
+ diagnostic `STRUCTURAL_REPLACEMENT_REQUIRED`, and
101
+ `replacementGate.structuralReplacementAvailable=false`. Stop without invoking the retained
102
+ command shape or consuming a replacement Discovery. Never rebind, refresh, replan, authorize,
103
+ resume, cancel, or manually replace the historical Task. Continue only after a later P04-B/P05
104
+ package explicitly advertises a topology-preserving replacement capability.
91
105
 
92
106
  When `next` returns `milestone initial-assembly`, execution is unavailable. Follow only the
93
107
  advertised `linked-task-assembly.commands` (`discovery start` and `discovery materialize`) until all
@@ -362,9 +376,12 @@ only for membership changes; any change to outcome, success signal, acceptance,
362
376
  discovery, or base branch requires the ordinary human scope-change gate. Never self-renew or
363
377
  replace the contract.
364
378
 
365
- After two failed Task reviews, follow `next.correctivePlanGate`: obtain a distinct read-only
366
- corrective Auditor result and pass it through `--corrective-audit-file`. Do not continue for
367
- replan, split, or stop decisions.
379
+ Repeated failed Task reviews remain on the same Task and do not require a separate corrective
380
+ Plan audit based only on count. Follow fresh `next`: ordinary findings default to `route=fix`;
381
+ `route=replan` is valid only with the exact Plan clause, obstruction, and minimal Plan change
382
+ retained by Core. A remediation Plan may change implementation Steps but must preserve the Task
383
+ objective, requirements, and acceptance. Explicit split or stop decisions still stop ordinary
384
+ continuation.
368
385
 
369
386
  When `next.strictStepReview.recommendedMode` is `external-sealed`, do not launch the nested local
370
387
  reviewer from inside a Codex App sandbox. Run the advertised read-only `task step-review-packet`,
@@ -37,16 +37,17 @@ bindings, supersedes execution authorization, and returns the Task to
37
37
  `awaiting_execution_authorization`. It cannot run while a Step is `in_progress` or while the
38
38
  Task is `blocked`; unrelated blocks must be resolved through their owning transition.
39
39
 
40
- For guarded remediation, two ordinary remediation attempts are allowed. Corrective posture is
40
+ For guarded remediation, the first two attempts use mode `ordinary`; later attempts use mode
41
+ `corrective`. Corrective posture is
41
42
  derived from the guarded Step, current Plan Risk Audit, remediation history, and
42
43
  corrective-decision history rather than from `Task.status` alone, so the same gate survives
43
- content-only Knowledge refresh, Task Knowledge rebind, and later reauthorization. A third
44
- ordinary retry is blocked until a current corrective decision exists for the same Step and
45
- Plan binding. `continue-fix` allows exactly the third corrective attempt; `replan-required`
46
- requires an actual new Plan posture before execution; `split-required` and `stop-escalate`
47
- stop ordinary execution. A failed third corrective attempt is a hard stop: `next` must
48
- report the stop without throwing, no fourth run is allowed, and no new `continue-fix` or
49
- `replan-required` decision is accepted.
44
+ content-only Knowledge refresh, Task Knowledge rebind, and later reauthorization. Attempt count
45
+ does not block execution: every new completion still requires exact strict-review evidence, while
46
+ the same Task may continue until review passes. A failed finding defaults to `route=fix`.
47
+ `route=replan` requires exact Plan-conflict evidence and routes to `task plan-set`; it may change
48
+ implementation Steps but not the Task objective, requirements, or acceptance. Explicit
49
+ `replan-required`, `split-required`, and `stop-escalate` decisions retain their redirect/stop
50
+ semantics and outrank ordinary continuation.
50
51
 
51
52
  Milestone authorization is bound to its Plan and membership revision. Plan amendments
52
53
  supersede authorization. Milestone validation and acceptance are bound to the current base
@@ -78,20 +79,24 @@ the grant's Milestone. Every added source must match the Plan, and removals, can
78
79
  wildcard or directory targets, existing source category/scope/authority changes, gaps, and
79
80
  conflicts fail closed before any state write. `next` exposes the composite option only when the
80
81
  full predicate passes and otherwise reports concrete unsafe differences. Both update paths journal
81
- `state.json`, `plan.json`, and `scope-change-events.jsonl` together. Membership integrity is validated
82
- before scheduling, Task start, Milestone validation, scope change, and repository `next`.
82
+ `state.json`, `plan.json`, and `scope-change-events.jsonl` together. Initial Plan publication uses
83
+ the same recovery journal for `state.json` and `plan.json`. Membership and dependency integrity is
84
+ validated before scheduling, handoff, claim (before lease acquisition), Task start, Milestone
85
+ validation, scope change, and repository `next`.
83
86
  The same guard scans in reverse and blocks every live Task whose `milestoneId` is absent from
84
87
  the Milestone's required/waived/cancelled classification.
85
88
 
86
89
  `C1` coordination is machine-bound but local: `task handoff-prepare` returns a one-time claim
87
90
  token and prompt bound to a stable handoff ID, revision, context hashes, Milestone positions,
88
- delegate/grant, expected next action, and expiry. `task claim` validates those bindings and
91
+ Milestone revision, membership revision, Milestone Plan hash, delegate/grant, expected next action,
92
+ and expiry. `task claim` validates those bindings and
89
93
  activates claimant-only mutation; terminal `task handback-create` returns result, evidence,
90
94
  review, knowledge, limitation, and recommended-next bindings. Milestone Tasks must be claimed
91
95
  before start. If no target is supplied, Core derives `agent:worker:<task-id>`. No part of this
92
96
  contract requires or proves a physically separate Codex thread.
93
97
 
94
- Repository-level scheduling respects current Milestone membership. An unstarted linked Task
95
- is eligible only for an `active` Milestone with `required` disposition. Historical unstarted
98
+ Repository-level scheduling respects current Milestone membership and its canonical dependency
99
+ DAG. A linked Task is eligible only for an `active` Milestone with `required` disposition after
100
+ all required predecessors are `merged`. Historical unstarted
96
101
  Tasks from `waived`, `cancelled`, accepted, or cancelled Milestone paths cannot shadow the
97
102
  Milestone/repository transition returned by `next`.
@@ -13,10 +13,17 @@ upgrade, concurrent state includes deterministic races, restart/replay claims in
13
13
  windows, and provider integrations include failure injection plus hidden-default checks.
14
14
  Happy-path green tests do not replace this evidence.
15
15
 
16
- After two failed independent reviews, another corrective Plan requires a distinct Auditor.
17
- The Auditor covers every latest finding and records `continue-fix`, `replan-required`,
18
- `split-required`, or `stop-escalate`. Only `continue-fix` may be passed to `task plan-set`
19
- through `--corrective-audit-file`; the other decisions stop implementation.
16
+ Failed review does not impose a Task-lifecycle attempt limit. The first two guarded remediation
17
+ events are recorded as `ordinary`; later events are `corrective`, remain executable, and each
18
+ requires another fresh strict review. A failed-review finding defaults to `route=fix`. It may use
19
+ `route=replan` only with exact `planClause`, `whyFixCannotFit`, and `minimalPlanChange` evidence;
20
+ Core then routes to ordinary `task plan-set`, where only implementation Steps may change. Task
21
+ objective, requirements, and acceptance remain immutable during remediation.
22
+
23
+ The explicit corrective-decision journal remains available for intentional `continue-fix`,
24
+ `replan-required`, `split-required`, and `stop-escalate` dispositions and for compatible historical
25
+ recovery. It is not an attempt-count gate. Explicit split and stop decisions still stop or redirect
26
+ execution; repeated review failure alone does not create either decision.
20
27
 
21
28
  The strict path is `task review-launch`. It starts an ephemeral Codex process with user
22
29
  configuration and rules ignored, a read-only sandbox, structured output, and an attempted
@@ -20,7 +20,8 @@
20
20
  "headCommit": { "$ref": "#/$defs/nullableHash" },
21
21
  "reason": { "type": "string" },
22
22
  "authorizationMode": { "enum": ["human", "delegated"] },
23
- "delegation": { "$ref": "#/$defs/delegation" }
23
+ "delegation": { "$ref": "#/$defs/delegation" },
24
+ "mechanicalFeasibility": { "$ref": "#/$defs/mechanicalFeasibility" }
24
25
  },
25
26
  "allOf": [
26
27
  {
@@ -50,6 +51,68 @@
50
51
  ]
51
52
  }
52
53
  }
54
+ },
55
+ "mechanicalFeasibility": {
56
+ "type": "object",
57
+ "additionalProperties": false,
58
+ "required": [
59
+ "schemaVersion", "taskId", "evaluatedTaskRevision", "briefHash", "planHash",
60
+ "sourceKind", "sourceBranch", "evaluatedHead", "baseCommit", "analyzerSetHash",
61
+ "analyzerInputHash", "analyzers", "findings", "decision"
62
+ ],
63
+ "properties": {
64
+ "schemaVersion": { "const": 1 },
65
+ "taskId": { "type": "string", "pattern": "^TASK-[0-9A-HJKMNP-TV-Z]{26}$" },
66
+ "evaluatedTaskRevision": { "type": "integer", "minimum": 1 },
67
+ "briefHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
68
+ "planHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
69
+ "sourceKind": { "enum": ["pre-start-base", "corrective-task-workspace"] },
70
+ "sourceBranch": { "type": "string", "minLength": 1 },
71
+ "evaluatedHead": { "type": "string", "pattern": "^[a-f0-9]{40,64}$" },
72
+ "baseCommit": { "$ref": "#/$defs/nullableHash" },
73
+ "analyzerSetHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
74
+ "analyzerInputHash": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
75
+ "analyzers": {
76
+ "type": "array",
77
+ "minItems": 3,
78
+ "maxItems": 3,
79
+ "items": { "$ref": "#/$defs/mechanicalAnalyzer" }
80
+ },
81
+ "findings": {
82
+ "type": "array",
83
+ "items": { "$ref": "#/$defs/mechanicalFinding" }
84
+ },
85
+ "decision": { "enum": ["clear", "blocked"] }
86
+ }
87
+ },
88
+ "mechanicalAnalyzer": {
89
+ "type": "object",
90
+ "additionalProperties": false,
91
+ "required": ["analyzerId", "analyzerVersion"],
92
+ "properties": {
93
+ "analyzerId": {
94
+ "enum": ["wf2.root-npm-script", "wf2.exact-output-path", "wf2.exact-predecessor-path"]
95
+ },
96
+ "analyzerVersion": { "const": 1 }
97
+ }
98
+ },
99
+ "mechanicalFinding": {
100
+ "type": "object",
101
+ "additionalProperties": false,
102
+ "required": [
103
+ "analyzerId", "analyzerVersion", "result", "stepId", "subject", "evidence", "reasonCode"
104
+ ],
105
+ "properties": {
106
+ "analyzerId": {
107
+ "enum": ["wf2.root-npm-script", "wf2.exact-output-path", "wf2.exact-predecessor-path"]
108
+ },
109
+ "analyzerVersion": { "const": 1 },
110
+ "result": { "enum": ["pass", "blocked", "unverified"] },
111
+ "stepId": { "type": "string", "pattern": "^STEP-[0-9]{3}(?:-[A-Z0-9-]+)?$" },
112
+ "subject": { "type": "string" },
113
+ "evidence": { "type": "string", "minLength": 1 },
114
+ "reasonCode": { "type": "string", "pattern": "^[A-Z0-9_]+$" }
115
+ }
53
116
  }
54
117
  }
55
118
  }
@@ -22,7 +22,7 @@
22
22
  "eventId": { "type": "string", "minLength": 1 },
23
23
  "taskId": { "$ref": "#/$defs/taskId" },
24
24
  "stepId": { "$ref": "#/$defs/stepId" },
25
- "triggeringAttemptCount": { "type": "integer", "minimum": 3 },
25
+ "triggeringAttemptCount": { "type": "integer", "minimum": 2 },
26
26
  "decision": {
27
27
  "enum": ["continue-fix", "replan-required", "split-required", "stop-escalate"]
28
28
  },
@@ -38,18 +38,63 @@
38
38
  "items": { "type": "string", "minLength": 1 }
39
39
  },
40
40
  "planHash": { "$ref": "#/$defs/hash64" },
41
+ "recoveryBasis": { "const": "plan-integrity" },
42
+ "planIntegrityEvidence": { "$ref": "#/$defs/planIntegrityEvidence" },
41
43
  "previousEventHash": { "$ref": "#/$defs/nullableHash64" },
42
44
  "recordedAt": { "type": "string", "format": "date-time" },
43
45
  "eventHash": { "$ref": "#/$defs/hash64" }
44
46
  },
45
- "anyOf": [
47
+ "allOf": [
48
+ {
49
+ "if": { "properties": { "triggeringAttemptCount": { "const": 2 } }, "required": ["triggeringAttemptCount"] },
50
+ "then": {
51
+ "required": ["recoveryBasis", "planIntegrityEvidence"],
52
+ "properties": { "decision": { "const": "replan-required" } }
53
+ },
54
+ "else": {
55
+ "not": { "anyOf": [{ "required": ["recoveryBasis"] }, { "required": ["planIntegrityEvidence"] }] }
56
+ }
57
+ },
58
+ {
59
+ "anyOf": [
46
60
  { "properties": { "coveredFindingIds": { "minItems": 1 } } },
47
61
  { "properties": { "coveredEventIds": { "minItems": 1 } } }
62
+ ]
63
+ }
48
64
  ],
49
65
  "$defs": {
50
66
  "taskId": { "type": "string", "pattern": "^TASK-[0-9A-HJKMNP-TV-Z]{26}$" },
51
67
  "stepId": { "type": "string", "pattern": "^STEP-[0-9]{3}(?:-[A-Z0-9-]+)?$" },
52
68
  "hash64": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
53
- "nullableHash64": { "type": ["string", "null"], "pattern": "^[a-f0-9]{64}$" }
69
+ "nullableHash64": { "type": ["string", "null"], "pattern": "^[a-f0-9]{64}$" },
70
+ "gitOid": { "type": "string", "pattern": "^[a-f0-9]{40,64}$" },
71
+ "stringList": {
72
+ "type": "array",
73
+ "uniqueItems": true,
74
+ "items": { "type": "string", "minLength": 1 }
75
+ },
76
+ "planIntegrityEvidence": {
77
+ "type": "object",
78
+ "additionalProperties": false,
79
+ "required": [
80
+ "kind", "taskRevision", "remediationEventId", "remediationEventHash",
81
+ "manifestPath", "manifestHash", "gitHead", "stepDefinitionHash",
82
+ "missingScripts", "checkCommands", "changedFiles", "conflictHash"
83
+ ],
84
+ "properties": {
85
+ "kind": { "const": "missing-npm-script-outside-allowed-writes" },
86
+ "taskRevision": { "type": "integer", "minimum": 1 },
87
+ "remediationEventId": { "type": "string", "minLength": 1 },
88
+ "remediationEventHash": { "$ref": "#/$defs/hash64" },
89
+ "manifestPath": { "const": "package.json" },
90
+ "manifestHash": { "$ref": "#/$defs/nullableHash64" },
91
+ "gitHead": { "$ref": "#/$defs/gitOid" },
92
+ "stepDefinitionHash": { "$ref": "#/$defs/hash64" },
93
+ "missingScripts": { "$ref": "#/$defs/stringList", "minItems": 1 },
94
+ "checkCommands": { "$ref": "#/$defs/stringList", "minItems": 1 },
95
+ "changedFiles": { "$ref": "#/$defs/stringList" },
96
+ "conflictHash": { "$ref": "#/$defs/hash64" }
97
+ }
98
+ }
54
99
  }
55
100
  }
@@ -50,7 +50,12 @@
50
50
  "properties": {
51
51
  "taskId": { "$ref": "#/$defs/taskId" },
52
52
  "disposition": { "enum": ["required", "waived", "cancelled"] },
53
- "reason": { "type": "string" }
53
+ "reason": { "type": "string" },
54
+ "dependsOnTaskIds": {
55
+ "type": "array",
56
+ "uniqueItems": true,
57
+ "items": { "$ref": "#/$defs/taskId" }
58
+ }
54
59
  }
55
60
  },
56
61
  "scopeSnapshot": {
@@ -51,7 +51,12 @@
51
51
  "properties": {
52
52
  "taskId": { "$ref": "#/$defs/taskId" },
53
53
  "disposition": { "enum": ["required", "waived", "cancelled"] },
54
- "reason": { "type": "string" }
54
+ "reason": { "type": "string" },
55
+ "dependsOnTaskIds": {
56
+ "type": "array",
57
+ "uniqueItems": true,
58
+ "items": { "$ref": "#/$defs/taskId" }
59
+ }
55
60
  }
56
61
  }
57
62
  }