codex-workflow-v2 2.0.0-beta.11 → 2.0.0-beta.12.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 (45) hide show
  1. package/README.md +7 -6
  2. package/dist/src/alpha6/remediation.d.ts +7 -2
  3. package/dist/src/alpha6/remediation.js +361 -64
  4. package/dist/src/alpha6/remediation.js.map +1 -1
  5. package/dist/src/alpha6/review.d.ts +5 -0
  6. package/dist/src/alpha6/review.js +110 -2
  7. package/dist/src/alpha6/review.js.map +1 -1
  8. package/dist/src/cli.js +19 -1
  9. package/dist/src/cli.js.map +1 -1
  10. package/dist/src/contracts.d.ts +55 -0
  11. package/dist/src/dependency-provenance.js +5 -3
  12. package/dist/src/dependency-provenance.js.map +1 -1
  13. package/dist/src/reviewer.d.ts +26 -0
  14. package/dist/src/reviewer.js +54 -1
  15. package/dist/src/reviewer.js.map +1 -1
  16. package/dist/src/version.d.ts +1 -1
  17. package/dist/src/version.js +1 -1
  18. package/dist/src/version.js.map +1 -1
  19. package/dist/src/workflow.d.ts +4 -1
  20. package/dist/src/workflow.js +163 -71
  21. package/dist/src/workflow.js.map +1 -1
  22. package/docs/autonomy-guardrails.md +43 -34
  23. package/docs/decisions.md +5 -4
  24. package/docs/delegated-approval.md +5 -4
  25. package/docs/development-flow.md +7 -6
  26. package/docs/lifecycle/state-machine-stabilization.md +1 -1
  27. package/docs/pdf/codex-workflow-v2-architecture-ru.pdf +0 -0
  28. package/docs/pdf/codex-workflow-v2-chat-only-guide-ru.pdf +0 -0
  29. package/docs/pdf/codex-workflow-v2-technical-reference-ru.pdf +0 -0
  30. package/docs/pdf/sources/codex-workflow-v2-architecture-ru.md +21 -9
  31. package/docs/pdf/sources/codex-workflow-v2-chat-only-guide-ru.md +15 -13
  32. package/docs/pdf/sources/codex-workflow-v2-technical-reference-ru.md +39 -24
  33. package/docs/release.md +8 -1
  34. package/docs/updating-existing-project.md +25 -0
  35. package/docs/validation-report.md +90 -115
  36. package/package.json +1 -1
  37. package/plugins/codex-workflow-gateway/.codex-plugin/plugin.json +1 -1
  38. package/plugins/codex-workflow-gateway/references/protocol.md +27 -8
  39. package/plugins/codex-workflow-gateway/skills/codex-workflow-gateway/SKILL.md +23 -3
  40. package/references/state-machine.md +9 -8
  41. package/references/validation-and-review.md +11 -4
  42. package/schemas/review-result.schema.json +17 -1
  43. package/schemas/step-review-event.schema.json +15 -0
  44. package/schemas/stop-escalate-override-event.schema.json +45 -0
  45. package/scripts/generate-pdf-docs.py +2 -1
@@ -1,124 +1,99 @@
1
- # V2 beta.11 Validation Report
1
+ # V2 beta.12.1 Validation Report
2
2
 
3
- Release candidate `2.0.0-beta.11` was validated on 2026-08-24 with Node.js 24.17.0.
3
+ Release candidate `2.0.0-beta.12.1` was validated on 2026-08-27 with Node.js 24.17.0.
4
4
 
5
5
  ## Automated release evidence
6
6
 
7
7
  - `npm ci` completed from the committed lockfile with 0 reported vulnerabilities.
8
- - The final `npm run validate` passed `319/319` sequential tests with no failures, skips,
9
- cancellations, or todos. The focused Signal recovery suite passed independently (`5/5`).
10
- - `npm run pack:check` passed. The beta.11 tarball contains 269 files; package size is approximately
11
- 951 kB and unpacked size is 3.7 MB.
12
- - `npm run smoke:downstream` packed and installed the actual beta.11 tarball in an empty temporary
13
- project, then passed the packaged CLI handshake. The first sandboxed attempt was network-blocked
14
- while fetching `ajv`; the authorized network retry and the final post-`npm ci` run passed.
15
- - `npm run plugin:check`, the plugin-creator structural validator, the skill validator,
16
- `npm run docs:pdf:check`, `npm run release:check`, and `git diff --check` passed. The bundled
17
- gateway cachebuster is `0.1.0+codex.20260824113210`.
18
-
19
- ## Bounded Plan-integrity recovery evidence
20
-
21
- - Recovery becomes applicable only after the first ordinary `checks-failed` remediation for a
22
- guarded failed Step when at least one Plan check is an exact root `npm run[-script] <name>`
23
- command whose named script is absent from the root `package.json`, and that manifest is outside
24
- the Step's exact `allowedWrites` boundary.
25
- - Fresh evidence binds the Task revision, first remediation event ID/hash, current Plan and Step
26
- definition, root manifest path/hash, Git HEAD, exact check commands, missing script names, and
27
- current dirty-file set into one canonical conflict hash.
28
- - An eligible `next` advertises only `task plan-integrity-recover`. The mutation appends one
29
- schema-validated `replan-required` corrective decision and does not modify the worktree or invent
30
- a second failed execution attempt.
31
- - Existing C1 ownership remains authoritative. A claimed Worker must execute the advertised
32
- recovery and then yield its claim before the existing journaled, Human-gated corrective-replan
33
- transition can prepare replacement Plan authority.
34
- - The route fails closed when `package.json` is writable by the Step, no missing-script check
35
- matches the bounded npm-script grammar, unrelated dirty files exist, bindings drift, or
36
- persisted evidence is malformed or tampered.
37
-
38
- ## Regression coverage
39
-
40
- - Four dedicated beta.11 regressions cover the exact happy path, the in-scope-manifest exclusion,
41
- dirty-worktree rejection, and sidecar evidence tampering.
42
- - Existing remediation-mode recovery retains higher navigation priority than the new assessment;
43
- the legacy malformed-third-attempt regression passes unchanged.
44
- - The corrective-replan serialized definition SHA moved to
45
- `c601cc100790a19e6ece2a1d60fb46d1e1d52e6922e6104d84f4b6ffe7ba0225` because the decision event
46
- schema now admits the bounded ordinal-2 recovery record. Its runtime semantic fingerprint remains
47
- `bd4e7a0ddfcb6abc0c5eb107775e6aea7e08c4606dda4d945d77af8a4520710d`, and the runtime catalog hash
48
- remains `fa1d11860d4f07978c3b8e85d1f91cd3d15b17284b05f41e05d462d3bb092aed`.
49
- - The beta.10 dependency-provenance and exact Signal T04 revision-26 regressions remain green.
50
- - The read-only Milestone projection still preserves `T03 cancelled T08 replacement`, and the
51
- monotonic chat registry/title fallback regressions remain green.
52
-
53
- ## Trusted-harness release replay
54
-
55
- - A fresh disposable project installed the actual current beta.11 tarball, declared the exact
56
- `2.0.0-beta.11` dependency, and passed package handshake plus `doctor` with protocol 2 and state
57
- schema 2. Its Git checkout remained clean.
58
- - The automatic trusted harness invoked the real packaged CLI and append-only recorded Discovery
59
- bootstrap, sequential `status next` checkpoints, Project Knowledge scan/approval, and
60
- Discovery-to-Task materialization through the resulting `task plan-set` boundary.
61
- - The semantic lifecycle log validated `24/24` events with no failed or unadvertised mutation and
62
- no missing checkpoint. Its SHA-256 is
63
- `5c1d666aa3bc27c4b6687b836a565823a1f567227e93f76b2c3285217fb9a0b7`.
64
- - The matched raw result log contains 12 successful CLI results, no C1 credential fields, and has
65
- SHA-256 `a51bae7221fa0ff30bd571ca3800bf8ac44911d7746f68e5e86987b6c357ccf6`.
66
- The exercised tarball SHA-256 is
67
- `3b7ed19961ba8394625d3a481fafb196dd80be5b138635a0bd1ce084a47fc06e`.
68
- - This targeted real-agent replay validates release navigation discipline and package integration;
69
- it does not claim a second full product Milestone. Deeper P01/P04 lifecycle behavior is covered
70
- by the deterministic and integration suites listed below.
8
+ - The final `npm run validate` passed typecheck and `325/325` sequential tests with no failures,
9
+ skips, cancellations, or todos.
10
+ - Focused compatibility replay passed independently: dependency provenance plus Signal T04 and
11
+ legacy stop override tests passed `9/9`; the stop-only suite passed again after the final
12
+ observation-boundary hardening (`3/3`).
13
+ - `npm run pack:check` produced the beta.12.1 dry-run tarball with 270 files, package size 967.2 kB,
14
+ and unpacked size 3.8 MB. The sandboxed npm-cache attempt failed with `EPERM`; the authorized
15
+ retry using the same source passed.
16
+ - `npm run smoke:downstream` packed and installed the actual
17
+ `codex-workflow-v2-2.0.0-beta.12.1.tgz` in an empty temporary project and passed the packaged
18
+ handshake.
19
+ - `npm run plugin:check`, the official Codex plugin validator, the gateway skill validator,
20
+ `npm run docs:pdf:check`, exact
21
+ `RELEASE_TAG=v2.0.0-beta.12.1 npm run release:check`, and `git diff --check` passed. The official
22
+ Python validator required a temporary, isolated `PyYAML` dependency; no project or system Python
23
+ files were changed. The bundled gateway cachebuster is `0.1.0+codex.20260827132414`.
24
+
25
+ ## Task-local dependency provenance compatibility
26
+
27
+ - Recovery still requires a clean local Task branch, no Step in progress, no lease or transaction,
28
+ exact runtime/declared/locked/installed/current/base version alignment, and one unregistered HEAD
29
+ that changes exactly `package.json` and `package-lock.json`.
30
+ - The false full-file equality check against the Milestone base was removed. Candidate parent and
31
+ HEAD are instead compared after removing only `codex-workflow-v2` dependency entries. Previously
32
+ committed Task-local manifest/lock fields therefore survive unchanged.
33
+ - A replay with a Task-local processing script is accepted and retains its recorded product commit.
34
+ A script added by the dependency candidate itself is rejected as payload drift; an extra product
35
+ file and stale base version are also rejected.
36
+ - The exact Signal T04 revision-26 fixture still proves that only a verified historical Step Review
37
+ can retain its completion commit across corrective replan. Pending review is never trusted, and a
38
+ corrupt strict-review hash chain is rejected.
39
+
40
+ ## Human-confirmed beta.11 stop compatibility
41
+
42
+ - The route is available only for one historical shape under the unchanged Plan: exactly two
43
+ ordinary remediation events, one corrective third event, one matching attempt-3 `continue-fix`,
44
+ and one matching attempt-4 `stop-escalate`.
45
+ - `task stop-override-prepare` is read-only. It binds Task revision, Step, both decisions, all three
46
+ remediation events, Plan hash, Git HEAD, package version, human actor, and reason to an `SOO-*`
47
+ code. `task stop-override-apply` accepts only the same binding in a later explicit turn.
48
+ - Apply appends `stop-escalate-overrides.jsonl`; it does not edit the Task or delete/rewrite the
49
+ original corrective decision. Exact replay is idempotent.
50
+ - After apply, fresh `next` returns `task run` for the same Step and the fourth attempt actually
51
+ reaches `in_progress`; subsequent strict review remains mandatory.
52
+ - `split-required`, a stale Task revision/confirmation, conflicting duplicate, active boundary,
53
+ or tampered hash chain fails closed. Delegated approval is not part of this gate.
54
+
55
+ ## Existing lifecycle regressions retained
56
+
57
+ - A guarded Task remains in the same Task/Step and can converge after five consecutive failed
58
+ review cycles. Attempts 1-2 are ordinary; attempts 3+ are corrective diagnostics, not limits.
59
+ - Evidence-bound `route=fix` and `route=replan`, Plan-integrity recovery, corrective yield/replan,
60
+ observer byte-purity, C1 credential safety, Milestone dependency authority, atomic transactions,
61
+ and structural-replacement shutdown all remain green.
62
+ - `split-required` remains terminal. The new compatibility route does not implement P04-B, rewire
63
+ Milestone topology, adopt completed Steps, or override a semantic stop outside the exact beta.11
64
+ attempt-four policy shape.
65
+
66
+ ## Packaged and transcript evidence
67
+
68
+ - Downstream smoke validated package resolution and the packaged beta.12.1 handshake in a clean
69
+ disposable installation.
70
+ - A trusted harness then invoked the final built CLI sequentially for handshake, doctor, `status`,
71
+ and fresh `next` against this unregistered source repository. The observations remained read-only.
72
+ - `node scripts/validate-lifecycle-transcript.mjs` accepted all `8/8` post-provenance events with no
73
+ failed invocation, mutation, or missing terminal result. The log SHA-256 is
74
+ `3a12f6e604bef2fe5335c6fc244b52690b06925fb50b8fd8a20acefb672ca46d`; the temporary log remains
75
+ outside the repository.
76
+
77
+ This transcript proves release-time invocation/result discipline for the final CLI. It does not
78
+ claim a second product Milestone replay or a lifecycle mutation. The two compatibility mechanisms
79
+ are covered by deterministic repository/sidecar integration tests above.
80
+
81
+ ## beta.12.1 PDF release documentation evidence
82
+
83
+ - Three tracked Russian PDFs were deterministically regenerated from reviewable Markdown sources
84
+ under `docs/pdf/sources/`; `npm run docs:pdf:check` reported an empty stale set.
85
+ - All 25 pages were rendered and visually inspected: architecture is 7 pages, the delegated
86
+ chat-only guide is 8 pages, and the technical reference is 10 pages. No blank, clipped,
87
+ overlapping, or orphaned page was found.
88
+ - Visible titles, headers, package commands, and release gates identify beta.12.1. The content
89
+ distinguishes general continuable remediation from the narrow Human-confirmed beta.11 stop
90
+ override and documents Task-local dependency preservation without weakening candidate checks.
71
91
 
72
92
  ## Not claimed
73
93
 
74
94
  - Validation itself performs no npm publication, Git tag, push, Signal Workflow mutation, or local
75
- plugin reinstall.
76
- - The implementation and package gates prove the bounded route. A real blocked project must still
77
- install the published beta.11 package and follow its fresh project-local `handshake → doctor →
78
- status next advertised recovery` navigation.
79
-
80
- ## Post-beta.11 combined P04-A/P01-A candidate evidence
81
-
82
- This later evidence was recorded on 2026-08-24 on branch `codex/p04-task-dependencies` and was
83
- incorporated into the final beta.11 candidate.
84
-
85
- - P04-A adds the canonical Milestone dependency DAG, atomic initial Plan transaction/recovery,
86
- dependency-bound handoff/claim/start, legacy fail-closed policy, and unconditional pre-write
87
- structural replacement shutdown.
88
- - P01-A adds three versioned read-only analyzers, canonical in-event evidence/hash binding,
89
- exact pre-start and corrective source selection, and phase-aware freshness before claim/start/run.
90
- - After final source review added a pre-Git-mutation start race guard, `npm test` passed the exact
91
- final sequential `319/319` suite with zero failures, skips, cancellations, or todos. The 13/13
92
- focused P01-A suite, 84/84 affected P01/P04/Task lifecycle selection, and 4/4 beta.11
93
- late-recovery compatibility tests also passed.
94
- - `npm run typecheck`, `npm run plugin:check`, `npm run release:check`, schema validation inside
95
- the full suite, the focused packaged-handshake capability test, and `git diff --check` passed.
96
- - The changed bundled gateway uses cachebuster `0.1.0+codex.20260824113210`; it was validated but
97
- not reinstalled.
98
- - No merge, package install, tag, publication, plugin reinstall, Signal mutation, or brief status
99
- transition to `implemented` is claimed by this candidate evidence.
100
-
101
- ## beta.11 PDF release documentation evidence
102
-
103
- The Russian PDF set was regenerated and revalidated on 2026-08-24 against the combined beta.11
104
- candidate described above.
105
-
106
- - The three tracked PDF binaries now have reviewable Markdown authorities under
107
- `docs/pdf/sources/` and one deterministic ReportLab generator. `npm run docs:pdf:check`
108
- regenerated all outputs and reported an empty stale set.
109
- - All 24 pages were rendered and visually inspected: architecture is 6 pages, the delegated
110
- chat-only guide is 8 pages, and the technical reference is 10 pages. Text extraction found no
111
- empty pages. The architecture orphan-page defect found during inspection was removed, and the
112
- complete delegated Discovery prompt no longer splits its readiness checklist across pages.
113
- - The content documents beta.11 delegated Discovery, the Milestone Autonomy Contract, explicit
114
- `dependsOnTaskIds`, P04-A runnable routing and structural-replacement stop, P01-A mechanical
115
- feasibility, C1 credential boundaries, external-sealed review, Plan-integrity recovery, and the
116
- limited derived-graph role of `codebase-memory-mcp`.
117
- - `npm run pack:check` passed with an isolated writable npm cache. The 269-file dry-run tarball
118
- contains all three PDFs, all three Markdown sources, the PDF README and pinned requirement, and
119
- both generator/check scripts.
120
- - On the same beta.11 code tree, `npm run validate` passed `319/319`; `npm run typecheck`,
121
- `npm run plugin:check`, `npm run release:check`, and `git diff --check` also passed.
122
-
123
- This evidence makes the documentation package-ready for beta.11. The release action remains a
124
- separate Git/tag operation after all final gates pass on the exact candidate tree.
95
+ plugin reinstall. Tagging and remote push are separate actions after the exact candidate gates.
96
+ - Structural replacement remains intentionally disabled; beta.12.1 does not claim P04-B
97
+ materialization or completed-Step adoption.
98
+ - A real project must install the published exact beta.12.1 package, update/reinstall the bundled
99
+ gateway, and follow fresh project-local `handshake -> doctor -> status -> next` navigation.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-workflow-v2",
3
- "version": "2.0.0-beta.11",
3
+ "version": "2.0.0-beta.12.1",
4
4
  "description": "Requirements-first Codex development workflow with local state and explicit Git ownership.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "codex-workflow-gateway",
3
- "version": "0.1.0+codex.20260824113210",
3
+ "version": "0.1.0+codex.20260827132414",
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,6 @@
1
1
  # Gateway Protocol V2
2
2
 
3
- ## beta.11 coordinator projections, retained review provenance, chat registry, and Plan-integrity recovery
3
+ ## beta.12.1 compatibility transitions and continuable remediation
4
4
 
5
5
  - When fresh `next` advertises `task plan-integrity-recover`, consume its exact Task revision,
6
6
  Step, actor, and writer-token contract. This route is valid only for the Core-derived
@@ -14,6 +14,12 @@
14
14
  product commits absent from the current corrective Step are recognized only through intact passed
15
15
  strict-review plus verified reviewer-attestation chains and remain separately auditable as
16
16
  `retainedHistoricalCommits`.
17
+ Task-local manifest/lock fields from recorded history may differ from the base, but the candidate
18
+ commit must preserve them exactly while changing only the Workflow dependency entries.
19
+ - `task stop-override-prepare` is a read-only Human gate for the exact beta.11 attempt-four stop
20
+ shape. `task stop-override-apply` requires the same Task revision, Step, actor, reason, Plan, HEAD,
21
+ evidence binding, and returned `SOO-*` code in a later user turn. It appends evidence without
22
+ deleting `stop-escalate`; it never applies to `split-required`.
17
23
  - `milestone progress --id <MS-ID>` is a read-only projection and the sole source for Coordinator
18
24
  progress tables. It preserves cancelled/replacement Tasks as distinct membership rows.
19
25
  - `scripts/chat-registry.mjs` atomically allocates project-monotonic `#NNN`, builds all six title
@@ -49,6 +55,8 @@ Current capability set:
49
55
  - `corrective-plan-audit-v1`
50
56
  - `safe-update-preflight-v1`
51
57
  - `bounded-dependency-provenance-recovery-v1`
58
+ - `task-local-dependency-provenance-recovery-v1`
59
+ - `legacy-stop-escalate-override-v1`
52
60
  - `retained-reviewed-history-recovery-v1`
53
61
  - `milestone-progress-projection-v1`
54
62
  - `strict-reviewer-v1`
@@ -63,7 +71,7 @@ Current capability set:
63
71
  - `task-c1-handoff-sidecar-v1`
64
72
  - `task-mechanical-feasibility-v1`
65
73
  - `semantic-plan-risk-audit-v2`
66
- - `guarded-remediation-hard-stop-v1`
74
+ - `guarded-remediation-continuation-v1`
67
75
  - `milestone-reverse-membership-integrity-v1`
68
76
  - `task-c1-handoff-bundle-v2`
69
77
  - `alpha6-adoption-posture-v1`
@@ -169,18 +177,29 @@ one hostile counterexample, expected safe result, and exact executable evidence
169
177
  unguarded Plan. Missing, stale, `split-required`, or `stop-escalate` evidence blocks
170
178
  authorization.
171
179
 
172
- For guarded remediation, `next.correctivePlanGate` or the runtime gate blocks a third
173
- ordinary retry on the same guarded Step until a current corrective decision exists. Record it
174
- with:
180
+ For guarded remediation, the first two failed cycles are recorded as `ordinary` and later cycles as
181
+ `corrective`. This mode is diagnostic: a third or later retry remains executable and still requires
182
+ a fresh strict review. A finding defaults to `route=fix`; `route=replan` is accepted only with exact
183
+ Plan-conflict evidence and routes to ordinary `task plan-set` for implementation-Step changes.
184
+
185
+ An explicit corrective disposition can still be recorded when the actor deliberately chooses a
186
+ stop, split, or compatible historical recovery route:
175
187
 
176
188
  ```text
177
189
  codex-workflow task corrective-decision --repo <git-root> \
178
190
  --id <TASK-ID> --step <STEP-ID> --expected-revision <REVISION> --file <decision.json>
179
191
  ```
180
192
 
181
- Only `continue-fix` permits bounded continuation. `replan-required`, `split-required`, and
182
- `stop-escalate` are stop or redirection decisions. If the third corrective review fails, a
183
- fourth run is prohibited; only split or stop may be recorded.
193
+ `continue-fix` permits continuation; `replan-required`, `split-required`, and `stop-escalate` are
194
+ explicit stop or redirection decisions. They are never inferred from attempt count. Without such an
195
+ explicit decision, another failed strict review continues the same Task through its evidence-bound
196
+ `fix`/`replan` route.
197
+
198
+ One append-only compatibility exception exists for a beta.11 policy-created attempt-four stop.
199
+ Fresh `next` must advertise `task stop-override-prepare`; run it with exact human inputs, present the
200
+ complete binding, and stop. A later explicit user turn may run `task stop-override-apply` with the
201
+ same inputs and confirmation code. Any split decision, Plan/revision/HEAD drift, missing attempt-3
202
+ continue authority, lease, transaction, or journal damage blocks the route.
184
203
 
185
204
  ## Context refresh
186
205
 
@@ -50,6 +50,12 @@ 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
+ Beta.12.1 permits product-owned manifest/lock fields already present in the exact recorded Task
54
+ history to differ from the Milestone base. Core compares candidate parent to candidate HEAD after
55
+ removing only the Workflow dependency entries, so the dependency commit must preserve every such
56
+ field exactly. Do not rebase, copy the base manifest over Task-local scripts, or interpret this as
57
+ permission for product payload in the candidate commit.
58
+
53
59
  The beta.11 bounded Plan-integrity route prevents a known impossible check from consuming a second
54
60
  ordinary remediation attempt. Use `task plan-integrity-recover` only when fresh `next` advertises
55
61
  it for the exact failed Task/Step/revision. Require `state=eligible`, no blockers, one first
@@ -103,6 +109,17 @@ command shape or consuming a replacement Discovery. Never rebind, refresh, repla
103
109
  resume, cancel, or manually replace the historical Task. Continue only after a later P04-B/P05
104
110
  package explicitly advertises a topology-preserving replacement capability.
105
111
 
112
+ When beta.12.1 `next` advertises `task stop-override-prepare`, the route is limited to the exact
113
+ beta.11 attempt-four policy stop: two ordinary failures, one corrective failure, a matching
114
+ attempt-3 `continue-fix`, and a matching attempt-4 `stop-escalate` under the unchanged Plan. Invoke
115
+ prepare with the exact Task/Step/revision, explicit human actor, and user-supplied reason. It is
116
+ read-only. Show the returned binding and `SOO-*` code, then stop. Only a later explicit user turn may
117
+ invoke `task stop-override-apply` with the identical inputs and code. Never delegate the gate,
118
+ override `split-required`, edit either journal, or reuse a code after Task revision, Plan, HEAD, or
119
+ evidence changes. Successful apply preserves the original stop, appends
120
+ `stop-escalate-overrides.jsonl`, and requires fresh sequential `status` then `next` before attempt
121
+ four runs through the normal strict-review cycle.
122
+
106
123
  When `next` returns `milestone initial-assembly`, execution is unavailable. Follow only the
107
124
  advertised `linked-task-assembly.commands` (`discovery start` and `discovery materialize`) until all
108
125
  intended linked Tasks exist. The closing `milestone plan-set` option appears only after at least one
@@ -376,9 +393,12 @@ only for membership changes; any change to outcome, success signal, acceptance,
376
393
  discovery, or base branch requires the ordinary human scope-change gate. Never self-renew or
377
394
  replace the contract.
378
395
 
379
- After two failed Task reviews, follow `next.correctivePlanGate`: obtain a distinct read-only
380
- corrective Auditor result and pass it through `--corrective-audit-file`. Do not continue for
381
- replan, split, or stop decisions.
396
+ Repeated failed Task reviews remain on the same Task and do not require a separate corrective
397
+ Plan audit based only on count. Follow fresh `next`: ordinary findings default to `route=fix`;
398
+ `route=replan` is valid only with the exact Plan clause, obstruction, and minimal Plan change
399
+ retained by Core. A remediation Plan may change implementation Steps but must preserve the Task
400
+ objective, requirements, and acceptance. Explicit split or stop decisions still stop ordinary
401
+ continuation.
382
402
 
383
403
  When `next.strictStepReview.recommendedMode` is `external-sealed`, do not launch the nested local
384
404
  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
@@ -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
@@ -22,7 +22,23 @@
22
22
  "requirement": { "type": ["string", "null"] },
23
23
  "summary": { "type": "string", "minLength": 1 },
24
24
  "evidence": { "type": "string", "minLength": 1 },
25
- "requiredAction": { "type": "string", "minLength": 1 }
25
+ "requiredAction": { "type": "string", "minLength": 1 },
26
+ "route": { "enum": ["fix", "replan"] },
27
+ "planConflict": {
28
+ "anyOf": [
29
+ { "type": "null" },
30
+ {
31
+ "type": "object",
32
+ "additionalProperties": false,
33
+ "required": ["planClause", "whyFixCannotFit", "minimalPlanChange"],
34
+ "properties": {
35
+ "planClause": { "type": "string", "minLength": 1 },
36
+ "whyFixCannotFit": { "type": "string", "minLength": 1 },
37
+ "minimalPlanChange": { "type": "string", "minLength": 1 }
38
+ }
39
+ }
40
+ ]
41
+ }
26
42
  }
27
43
  }
28
44
  }
@@ -34,6 +34,21 @@
34
34
  "eventType": { "enum": ["pending", "review-recorded", "attestation-verified"] },
35
35
  "decision": { "enum": ["pending", "passed", "failed", "unverified"] },
36
36
  "reviewerAttestationHash": { "$ref": "#/$defs/nullableHash64" },
37
+ "remediationRoute": { "enum": ["fix", "replan", null] },
38
+ "planConflicts": {
39
+ "type": "array",
40
+ "items": {
41
+ "type": "object",
42
+ "additionalProperties": false,
43
+ "required": ["findingId", "planClause", "whyFixCannotFit", "minimalPlanChange"],
44
+ "properties": {
45
+ "findingId": { "type": "string", "minLength": 1 },
46
+ "planClause": { "type": "string", "minLength": 1 },
47
+ "whyFixCannotFit": { "type": "string", "minLength": 1 },
48
+ "minimalPlanChange": { "type": "string", "minLength": 1 }
49
+ }
50
+ }
51
+ },
37
52
  "previousEventHash": { "$ref": "#/$defs/nullableHash64" },
38
53
  "recordedAt": { "type": "string", "format": "date-time" },
39
54
  "eventHash": { "$ref": "#/$defs/hash64" }
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://codex-workflow.local/schemas/stop-escalate-override-event.schema.json",
4
+ "title": "Codex Workflow V2 Stop-Escalate Override Event",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "eventId", "taskId", "taskRevision", "stepId", "stopDecisionEventId",
9
+ "stopDecisionEventHash", "priorContinueDecisionEventId", "priorContinueDecisionEventHash",
10
+ "triggeringAttemptCount", "coveredEventIds", "planHash", "headCommit", "actor", "reason",
11
+ "packageVersion", "confirmationCodeBindingHash", "policy", "previousEventHash", "recordedAt", "eventHash"
12
+ ],
13
+ "properties": {
14
+ "eventId": { "type": "string", "pattern": "^SOO-[0-9A-HJKMNP-TV-Z]{26}$" },
15
+ "taskId": { "type": "string", "pattern": "^TASK-[0-9A-HJKMNP-TV-Z]{26}$" },
16
+ "taskRevision": { "type": "integer", "minimum": 1 },
17
+ "stepId": { "type": "string", "pattern": "^STEP-[0-9]{3}(?:-[A-Z0-9-]+)?$" },
18
+ "stopDecisionEventId": { "type": "string", "pattern": "^CRD-[0-9A-HJKMNP-TV-Z]{26}$" },
19
+ "stopDecisionEventHash": { "$ref": "#/$defs/hash64" },
20
+ "priorContinueDecisionEventId": { "type": "string", "pattern": "^CRD-[0-9A-HJKMNP-TV-Z]{26}$" },
21
+ "priorContinueDecisionEventHash": { "$ref": "#/$defs/hash64" },
22
+ "triggeringAttemptCount": { "const": 4 },
23
+ "coveredEventIds": {
24
+ "type": "array",
25
+ "minItems": 3,
26
+ "maxItems": 3,
27
+ "uniqueItems": true,
28
+ "items": { "type": "string", "pattern": "^RME-[0-9A-HJKMNP-TV-Z]{26}$" }
29
+ },
30
+ "planHash": { "$ref": "#/$defs/hash64" },
31
+ "headCommit": { "type": "string", "pattern": "^[a-f0-9]{40}$" },
32
+ "actor": { "type": "string", "minLength": 1 },
33
+ "reason": { "type": "string", "minLength": 1 },
34
+ "packageVersion": { "type": "string", "minLength": 1 },
35
+ "confirmationCodeBindingHash": { "$ref": "#/$defs/hash64" },
36
+ "policy": { "const": "beta11-attempt4-stop-compatibility-v1" },
37
+ "previousEventHash": { "$ref": "#/$defs/nullableHash64" },
38
+ "recordedAt": { "type": "string", "format": "date-time" },
39
+ "eventHash": { "$ref": "#/$defs/hash64" }
40
+ },
41
+ "$defs": {
42
+ "hash64": { "type": "string", "pattern": "^[a-f0-9]{64}$" },
43
+ "nullableHash64": { "type": ["string", "null"], "pattern": "^[a-f0-9]{64}$" }
44
+ }
45
+ }
@@ -44,6 +44,7 @@ SOURCE_DIR = ROOT / "docs" / "pdf" / "sources"
44
44
  OUTPUT_DIR = ROOT / "docs" / "pdf"
45
45
  PACKAGE = json.loads((ROOT / "package.json").read_text(encoding="utf-8"))
46
46
  PACKAGE_VERSION = PACKAGE["version"]
47
+ RELEASE_LABEL = PACKAGE_VERSION.rsplit("-", 1)[-1]
47
48
 
48
49
  DOCUMENTS = (
49
50
  ("codex-workflow-v2-architecture-ru.md", "codex-workflow-v2-architecture-ru.pdf"),
@@ -396,7 +397,7 @@ def draw_page(canvas_obj: canvas.Canvas, doc: SimpleDocTemplate, title: str) ->
396
397
  canvas_obj.setFont("WorkflowBody", 7)
397
398
  canvas_obj.setFillColor(MUTED)
398
399
  canvas_obj.drawString(LEFT, PAGE_HEIGHT - 10 * mm, title[:74])
399
- canvas_obj.drawRightString(PAGE_WIDTH - RIGHT, PAGE_HEIGHT - 10 * mm, f"beta.11 | {PACKAGE_VERSION}")
400
+ canvas_obj.drawRightString(PAGE_WIDTH - RIGHT, PAGE_HEIGHT - 10 * mm, f"{RELEASE_LABEL} | {PACKAGE_VERSION}")
400
401
  canvas_obj.line(LEFT, 11 * mm, PAGE_WIDTH - RIGHT, 11 * mm)
401
402
  canvas_obj.drawString(LEFT, 7 * mm, "Codex Workflow V2")
402
403
  canvas_obj.drawRightString(PAGE_WIDTH - RIGHT, 7 * mm, f"Страница {doc.page}")