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.
- package/README.md +47 -13
- package/dist/src/alpha6/handoff.d.ts +4 -3
- package/dist/src/alpha6/handoff.js +58 -3
- package/dist/src/alpha6/handoff.js.map +1 -1
- package/dist/src/alpha6/mechanical-feasibility.d.ts +7 -0
- package/dist/src/alpha6/mechanical-feasibility.js +303 -0
- package/dist/src/alpha6/mechanical-feasibility.js.map +1 -0
- package/dist/src/alpha6/milestone.d.ts +25 -2
- package/dist/src/alpha6/milestone.js +359 -32
- package/dist/src/alpha6/milestone.js.map +1 -1
- package/dist/src/alpha6/plan-integrity.d.ts +14 -0
- package/dist/src/alpha6/plan-integrity.js +127 -0
- package/dist/src/alpha6/plan-integrity.js.map +1 -0
- package/dist/src/alpha6/remediation.d.ts +3 -2
- package/dist/src/alpha6/remediation.js +168 -55
- package/dist/src/alpha6/remediation.js.map +1 -1
- package/dist/src/alpha6/review.d.ts +5 -0
- package/dist/src/alpha6/review.js +110 -2
- package/dist/src/alpha6/review.js.map +1 -1
- package/dist/src/cli.js +14 -2
- package/dist/src/cli.js.map +1 -1
- package/dist/src/contracts.d.ts +82 -1
- package/dist/src/git.d.ts +1 -1
- package/dist/src/git.js +8 -1
- package/dist/src/git.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/lifecycle/corrective-replan.js +8 -3
- package/dist/src/lifecycle/corrective-replan.js.map +1 -1
- package/dist/src/reviewer.d.ts +26 -0
- package/dist/src/reviewer.js +54 -1
- package/dist/src/reviewer.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/src/workflow.d.ts +5 -0
- package/dist/src/workflow.js +449 -148
- package/dist/src/workflow.js.map +1 -1
- package/docs/autonomy-guardrails.md +42 -33
- package/docs/beta11-plan-integrity-recovery-brief.md +38 -0
- package/docs/decisions.md +5 -4
- package/docs/delegated-approval.md +5 -4
- package/docs/development-flow.md +38 -12
- package/docs/lifecycle/state-machine-stabilization.md +2 -2
- package/docs/pdf/README.md +24 -0
- package/docs/pdf/codex-workflow-v2-architecture-ru.pdf +0 -0
- package/docs/pdf/codex-workflow-v2-chat-only-guide-ru.pdf +0 -0
- package/docs/pdf/codex-workflow-v2-technical-reference-ru.pdf +0 -0
- package/docs/pdf/requirements.txt +1 -0
- package/docs/pdf/sources/codex-workflow-v2-architecture-ru.md +235 -0
- package/docs/pdf/sources/codex-workflow-v2-chat-only-guide-ru.md +334 -0
- package/docs/pdf/sources/codex-workflow-v2-technical-reference-ru.md +414 -0
- package/docs/problem-briefs/01-pre-implementation-integrity.md +478 -0
- package/docs/problem-briefs/02-minimal-step-integrity.md +411 -0
- package/docs/problem-briefs/03-minimal-agent-context-integrity.md +358 -0
- package/docs/problem-briefs/04-task-dependency-and-structural-replacement-integrity.md +566 -0
- package/docs/problem-briefs/BRIEF-TEMPLATE.md +56 -0
- package/docs/problem-briefs/README.md +120 -0
- package/docs/problem-briefs/evidence/p01-mechanical-feasibility-corpus.md +90 -0
- package/docs/problem-briefs/evidence/signal-v4-pre-m3-replay.md +246 -0
- package/docs/release.md +17 -6
- package/docs/split-required-recovery.md +19 -26
- package/docs/validation-report.md +83 -70
- package/package.json +5 -1
- package/plugins/codex-workflow-gateway/.codex-plugin/plugin.json +1 -1
- package/plugins/codex-workflow-gateway/references/protocol.md +31 -9
- package/plugins/codex-workflow-gateway/skills/codex-workflow-gateway/SKILL.md +23 -6
- package/references/state-machine.md +18 -13
- package/references/validation-and-review.md +11 -4
- package/schemas/authorization-event.schema.json +64 -1
- package/schemas/corrective-decision-event.schema.json +48 -3
- package/schemas/milestone-scope-change-event.schema.json +6 -1
- package/schemas/milestone.schema.json +6 -1
- package/schemas/review-result.schema.json +17 -1
- package/schemas/step-review-event.schema.json +15 -0
- package/schemas/task-handoff-event.schema.json +18 -2
- package/scripts/generate-pdf-docs.py +513 -0
- package/scripts/run-pdf-docs.mjs +62 -0
|
@@ -1,85 +1,98 @@
|
|
|
1
|
-
# V2 beta.
|
|
1
|
+
# V2 beta.12 Validation Report
|
|
2
2
|
|
|
3
|
-
Release candidate `2.0.0-beta.
|
|
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
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
- `npm run pack:check` passed
|
|
11
|
-
package size is
|
|
12
|
-
- `npm run smoke:downstream` packed and installed the actual beta.
|
|
13
|
-
then passed the packaged CLI handshake. The first sandboxed attempt was network-blocked
|
|
14
|
-
fetching `ajv`; the authorized network retry passed.
|
|
15
|
-
- `npm run plugin:check`, the plugin
|
|
16
|
-
`npm run release:check`, and `git diff --check` passed. The bundled
|
|
17
|
-
`0.1.0+codex.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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 → 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.
|
|
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.
|
|
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.
|
|
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
|
-
- `
|
|
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-
|
|
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,
|
|
156
|
-
|
|
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
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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.
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
366
|
-
|
|
367
|
-
replan,
|
|
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,
|
|
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.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
requires
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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.
|
|
82
|
-
|
|
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,
|
|
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
|
|
95
|
-
is eligible only for an `active` Milestone with `required` disposition
|
|
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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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":
|
|
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
|
-
"
|
|
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
|
}
|