okstra 0.200.1 → 0.201.0

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 (95) hide show
  1. package/README.md +4 -2
  2. package/dist/cli-registry.mjs +6 -0
  3. package/dist/cli-registry.mjs.map +1 -1
  4. package/docs/cli.md +14 -3
  5. package/package.json +1 -1
  6. package/runtime/BUILD.json +2 -2
  7. package/runtime/agents/workers/report-writer-worker.md +7 -3
  8. package/runtime/bin/okstra-spawn-followups.py +2 -2
  9. package/runtime/prompts/duties/technical-verification-worker.md +44 -0
  10. package/runtime/prompts/launch.template.md +7 -1
  11. package/runtime/prompts/lead/okstra-lead-contract.md +7 -2
  12. package/runtime/prompts/lead/plan-body-verification.md +3 -1
  13. package/runtime/prompts/lead/report-writer.md +8 -2
  14. package/runtime/prompts/lead/team-contract.md +6 -0
  15. package/runtime/prompts/profiles/_implementation-verifier.md +7 -1
  16. package/runtime/prompts/profiles/final-verification.md +5 -0
  17. package/runtime/prompts/profiles/forbidden-actions.json +6 -0
  18. package/runtime/prompts/profiles/implementation-option-selection.md +7 -1
  19. package/runtime/prompts/profiles/implementation-planning.md +1 -0
  20. package/runtime/prompts/profiles/technical-verification.md +53 -0
  21. package/runtime/prompts/wizard/prompts.ko.json +2 -1
  22. package/runtime/python/okstra_ctl/adapters/hosts/claude-code/relay.md +4 -4
  23. package/runtime/python/okstra_ctl/adapters/hosts/codex/relay.md +2 -0
  24. package/runtime/python/okstra_ctl/adapters/providers/zai/adapter.py +36 -5
  25. package/runtime/python/okstra_ctl/agent/invocation.py +14 -6
  26. package/runtime/python/okstra_ctl/agent/prompt_cli/cli.py +4 -3
  27. package/runtime/python/okstra_ctl/agent/prompt_cli/corrections.py +83 -22
  28. package/runtime/python/okstra_ctl/agent/prompt_cli/materialize.py +44 -2
  29. package/runtime/python/okstra_ctl/conformance.py +2 -20
  30. package/runtime/python/okstra_ctl/dispatch_core.py +25 -5
  31. package/runtime/python/okstra_ctl/dispatch_state.py +2 -0
  32. package/runtime/python/okstra_ctl/domain/provider.py +0 -1
  33. package/runtime/python/okstra_ctl/domain/role.py +1 -0
  34. package/runtime/python/okstra_ctl/execution_mutation_audit.py +6 -1
  35. package/runtime/python/okstra_ctl/implementation_direction.py +64 -7
  36. package/runtime/python/okstra_ctl/implementation_options.py +58 -45
  37. package/runtime/python/okstra_ctl/model_pool.py +2 -5
  38. package/runtime/python/okstra_ctl/next_phase.py +3 -0
  39. package/runtime/python/okstra_ctl/plan_items.py +15 -0
  40. package/runtime/python/okstra_ctl/plan_items_cli.py +9 -3
  41. package/runtime/python/okstra_ctl/qa_commands.py +30 -0
  42. package/runtime/python/okstra_ctl/registry/provider_registry.py +11 -8
  43. package/runtime/python/okstra_ctl/render.py +3 -0
  44. package/runtime/python/okstra_ctl/render_final_report.py +1 -0
  45. package/runtime/python/okstra_ctl/report_assembly.py +8 -2
  46. package/runtime/python/okstra_ctl/report_contract.py +3 -0
  47. package/runtime/python/okstra_ctl/report_corrections.py +209 -93
  48. package/runtime/python/okstra_ctl/report_finalize.py +25 -8
  49. package/runtime/python/okstra_ctl/report_html/router.py +2 -0
  50. package/runtime/python/okstra_ctl/report_html/view_models/technical_verification.py +21 -0
  51. package/runtime/python/okstra_ctl/report_projections.py +4 -3
  52. package/runtime/python/okstra_ctl/report_synthesis_packet.py +178 -26
  53. package/runtime/python/okstra_ctl/run.py +82 -0
  54. package/runtime/python/okstra_ctl/team.py +4 -1
  55. package/runtime/python/okstra_ctl/technical_verification.py +195 -0
  56. package/runtime/python/okstra_ctl/usage_identity.py +54 -0
  57. package/runtime/python/okstra_ctl/usage_report.py +22 -8
  58. package/runtime/python/okstra_ctl/verification_target.py +74 -0
  59. package/runtime/python/okstra_ctl/wizard/__init__.py +1 -1
  60. package/runtime/python/okstra_ctl/wizard/cli.py +2 -1
  61. package/runtime/python/okstra_ctl/wizard/confirmation.py +38 -2
  62. package/runtime/python/okstra_ctl/wizard/engine.py +3 -0
  63. package/runtime/python/okstra_ctl/wizard/ids.py +1 -0
  64. package/runtime/python/okstra_ctl/wizard/outcome.py +63 -0
  65. package/runtime/python/okstra_ctl/wizard/picker_navigation.py +2 -2
  66. package/runtime/python/okstra_ctl/wizard/registry.py +1 -1
  67. package/runtime/python/okstra_ctl/wizard/render.py +8 -55
  68. package/runtime/python/okstra_ctl/wizard/roles.py +11 -7
  69. package/runtime/python/okstra_ctl/wizard/sources.py +28 -2
  70. package/runtime/python/okstra_ctl/wizard/state.py +13 -6
  71. package/runtime/python/okstra_ctl/wizard/steps_plan.py +8 -0
  72. package/runtime/python/okstra_ctl/worker_liveness.py +52 -39
  73. package/runtime/python/okstra_ctl/worker_prompt_policy.py +2 -0
  74. package/runtime/python/okstra_ctl/workflow.py +8 -0
  75. package/runtime/python/okstra_ctl/write_policy.py +23 -0
  76. package/runtime/python/okstra_token_usage/blocks.py +50 -1
  77. package/runtime/python/okstra_token_usage/claude.py +42 -21
  78. package/runtime/python/okstra_token_usage/codex.py +17 -0
  79. package/runtime/python/okstra_token_usage/collect.py +299 -162
  80. package/runtime/python/okstra_token_usage/cursor.py +2 -3
  81. package/runtime/python/okstra_token_usage/report.py +35 -30
  82. package/runtime/python/okstra_token_usage/task_totals.py +3 -12
  83. package/runtime/schemas/final-report-v2.0.schema.json +298 -7
  84. package/runtime/schemas/final-report-v3.0.schema.json +298 -7
  85. package/runtime/schemas/report-narrative-v3.0.schema.json +1 -0
  86. package/runtime/schemas/report-writer-corrections-v1.0.schema.json +30 -3
  87. package/runtime/skills/okstra-run/SKILL.md +10 -2
  88. package/runtime/skills/okstra-setup/SKILL.md +42 -7
  89. package/runtime/templates/report-writer-prompt-preamble.md +7 -3
  90. package/runtime/templates/reports/html/i18n/en.json +11 -0
  91. package/runtime/templates/reports/html/i18n/ko.json +11 -0
  92. package/runtime/templates/reports/html/tasks/implementation-option-selection.template.html +7 -3
  93. package/runtime/templates/reports/html/tasks/technical-verification.template.html +35 -0
  94. package/runtime/templates/reports/md/tasks/technical-verification.template.md +5 -0
  95. package/runtime/validators/validate-run.py +9 -4
package/README.md CHANGED
@@ -47,7 +47,7 @@ Grok and Kimi can now lead through their registered host adapters. Their worker
47
47
 
48
48
  `okstra run <host-id-or-alias>` resolves the requested adapter from the host registry and checks its `spawn-process` readiness before starting it. The installed `okstra-run` skill instead uses `current-session`: it declares only the semantic functions the live harness can actually perform (`plain_text_input`, plus any available native single-select, multi-select, or grouped-question function) and reuses the current lead session. User-installed adapters are discovered only from `~/.okstra/adapters/hosts/<id>/` and `~/.okstra/adapters/providers/<id>/`; project-local executable adapter code is ignored.
49
49
 
50
- Z.ai GLM workers reuse the installed Claude Code executable with process-local Z.ai connection settings. Set `ZAI_API_KEY` in the environment that launches Okstra, then select `zai/glm-5.3` or `zai/glm-5.3-flash` for a worker role. Claude configuration files remain unchanged. See [GLM worker setup](docs/cli.md#zai-glm-workers) for isolation and accounting details.
50
+ Z.ai GLM workers reuse the installed Claude Code executable with process-local Z.ai connection settings. Set `ZAI_API_KEY` once in `~/.env` or in the environment that launches Okstra, then select `zai/glm-5.3` or `zai/glm-5.3-flash` for a worker role. Claude configuration files remain unchanged. See [GLM worker setup](docs/cli.md#zai-glm-workers) for isolation and accounting details.
51
51
 
52
52
  The next direct-CLI candidates are Mistral Vibe and Qwen Code. DeepSeek V4 and MiniMax M2.7 remain API-adapter candidates because their current official coding-agent execution surfaces do not fit Okstra's wrapper contract as directly. Model catalog entries and account availability are distinct; GLM authorization is checked when its CLI process calls Z.ai.
53
53
 
@@ -80,6 +80,8 @@ okstra/ npm package = repo root
80
80
 
81
81
  The package requires Node.js 22 or newer. TypeScript sources under `src/` compile to `dist/**/*.mjs` before `tools/build.mjs` rebuilds `runtime/` from `scripts/`, `skills/`, `agents/`, `prompts/`, `schemas/`, `templates/`, and `validators/`. `bin/okstra` executes `dist/`; the npm package ships the compiled CLI, runtime payload, documentation, and README.
82
82
 
83
+ Development and CI use Node.js 24 LTS and Python 3.14, selected by `.nvmrc` and `.python-version`. Both publishing workflows read the same Node.js version file. With nvm installed, run `nvm install` and `nvm use`; configure your Python version manager so `python3 --version` reports 3.14.x before running `npm run check`. These development versions do not change the package's minimum requirements of Node.js 22 and Python 3.10.
84
+
83
85
  <a id="user-machine-layout-after-install"></a>
84
86
  ### 2.2 User-machine layout after install
85
87
 
@@ -215,7 +217,7 @@ To start a task outside a Claude Code session:
215
217
  --project-id <id> \
216
218
  --task-group <group> \
217
219
  --task-id <id> \
218
- --task-type <requirements-discovery|improvement-discovery|project-analysis|change-impact-analysis|error-analysis|implementation-option-selection|implementation-planning|implementation|final-verification|release-handoff> \
220
+ --task-type <requirements-discovery|improvement-discovery|project-analysis|change-impact-analysis|error-analysis|technical-verification|implementation-option-selection|implementation-planning|implementation|final-verification|release-handoff> \
219
221
  --base-ref <branch|tag|sha> \
220
222
  --task-brief ./brief.md
221
223
  ```
@@ -226,6 +226,12 @@ export const COMMAND_REGISTRY = [
226
226
  category: "introspection",
227
227
  summary: ["Report whether pending workers are still alive (read-only)"],
228
228
  },
229
+ {
230
+ name: "verification-target",
231
+ python: { target: { module: "okstra_ctl.verification_target" } },
232
+ category: "introspection",
233
+ summary: ["Check the recorded worktree, commit and source fingerprint without executing verification commands"],
234
+ },
229
235
  {
230
236
  name: "error-report",
231
237
  python: { target: { module: "okstra_ctl.error_report" } },
@@ -1 +1 @@
1
- {"version":3,"file":"cli-registry.mjs","sourceRoot":"","sources":["../src/cli-registry.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli-registry.mjs","sourceRoot":"","sources":["../src/cli-registry.mts"],"names":[],"mappings":"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"}
package/docs/cli.md CHANGED
@@ -134,6 +134,14 @@ The lifecycle task types run in this order:
134
134
  | `final-verification` | Verify acceptance and classify any cause, direction, or plan defect. | `release-handoff`, `error-analysis`, `implementation-option-selection`, or `implementation-planning` |
135
135
  | `release-handoff` | Perform only the user-selected delivery action. | done or follow-up |
136
136
 
137
+ #### `--task-type technical-verification`
138
+
139
+ `technical-verification` is an optional experiment phase outside the normal phase sequence. It tests explicitly classified unresolved technical facts from the same task's implementation-option-selection report. Supply that report's `.data.json` through `--clarification-response`; no selected direction is needed. Unresolved user decisions still block entry, and candidates with safety blockers are excluded.
140
+
141
+ The run freezes source identity and fact IDs under `state/technical-verification-input-<seq>.json`. Workers write plans, source copies, dependency changes and command logs only under `runs/technical-verification/experiments/<seq>/<worker-id>/`. Results distinguish supported, refuted, inconclusive and not-run facts. Report assembly checks the frozen identities and retained command evidence before publication.
142
+
143
+ The only next phase is `implementation-option-selection`. Carry the verification report into that comparison with `--clarification-response`; the wizard recommends it when it refers to the current comparison report. Fresh independent feasibility votes decide candidate validity. Experimental evidence does not approve adoption or expand a pilot into production rollout.
144
+
137
145
  #### `--task-type improvement-discovery`
138
146
 
139
147
  `improvement-discovery` is a sidetrack entry point outside `PHASE_SEQUENCE`. It uses multi-worker consensus to find improvement candidates within the codebase scope and lens allowlist.
@@ -783,7 +791,9 @@ It then displays `Continue? [y/yes]:`. Any response other than `y` or `yes` exit
783
791
 
784
792
  ## Z.ai GLM workers
785
793
 
786
- Z.ai is a worker provider (`zai`) that uses the existing `claude` executable. Install Claude Code, provide `ZAI_API_KEY` in the environment inherited by Okstra, and select `zai/glm-5.3` or `zai/glm-5.3-flash` in a role-model step. For explicit launch arguments, use `--role-model analyser=zai/glm-5.3`. These models support worker roles; this integration does not provide a Z.ai lead host.
794
+ Z.ai is a worker provider (`zai`) that uses the existing `claude` executable. Install Claude Code, provide `ZAI_API_KEY` once in `~/.env` or in the environment inherited by Okstra, and select `zai/glm-5.3` or `zai/glm-5.3-flash` in a role-model step. For explicit launch arguments, use `--role-model analyser=zai/glm-5.3`. These models support worker roles; this integration does not provide a Z.ai lead host.
795
+
796
+ A nonempty process `ZAI_API_KEY` takes precedence. Otherwise each GLM worker reads `ZAI_API_KEY` from the current user's `~/.env`, independently of its project or working directory. This also applies to workers opened in separate terminal panes. Only that key is selected; other file entries are not imported into the environment. Supported entries are single-line `ZAI_API_KEY=value` assignments with optional `export`, single or double quotes, and trailing comments. Shell commands and variable substitutions are never evaluated. If the key appears more than once, the last assignment wins. An unreadable file or malformed matching assignment fails with an error that omits its contents. No project `.env` is read.
787
797
 
788
798
  Each GLM child process uses `https://api.z.ai/api/anthropic` and its own model/authentication environment. Okstra does not edit `~/.claude/settings.json`. GLM runs with `--setting-sources ""` so user, project, and local settings cannot override those connection values; settings-based hooks and integrations are consequently not inherited for GLM workers. The regular Claude provider keeps its existing settings behavior.
789
799
 
@@ -841,7 +851,8 @@ The `okstra` Node CLI (`bin/okstra`) provides both installer/admin commands and
841
851
  | `okstra rollup [--task-group <group>] [--project-root <dir>] [--cwd <dir>] [--text\|--json]` | Read-only backend for the okstra-rollup skill. `--text` emits ordered fixed labels for model use. The default and `--json` preserve the full machine JSON contract and exit codes. Omitting `--task-group` targets the whole project catalog. |
842
852
  | `okstra usage-report [--days <positive-int>] [--project-root <dir>] [--cwd <dir>] [--text\|--json]` | Read-only backend for the okstra-usage skill. `--text` emits ordered fixed labels for model use. The default and `--json` preserve the full machine JSON contract and exit codes. Defaults to the current project's last 30 days. |
843
853
  | `okstra worker-state transition --team-state <path> --worker <id> --status <in-progress\|completed\|timeout\|error\|not-run> [--reason <text>] [--model <execution-value>]` | Atomically update one persisted worker row. `in-progress` records the authoritative `startedAt` and clears `endedAt`; terminal states record `endedAt`; `timeout`, `error`, and `not-run` require a reason. Dispatch adapters use this same transition path, so CLI-backed and in-process orchestration share the status timestamp contract |
844
- | `okstra worker-liveness [--team-state <path> --worker <id>]… [--max-idle <seconds>] [--launch-grace <seconds>] [--stall-confirm <seconds>] [--json]` | Judge whether pending workers are still alive so the lead's poll ends a stalled wait early instead of paying the full deadline. The selector repeats; each `--team-state` must have a paired `--worker`. The worker row's `livenessMode` picks the probe: `audit-heartbeat` reads its `auditSidecarPath` and reports `stalled` when the `- PROGRESS:` heartbeat is past the idle budget; `wrapper-status` reads its `promptPath` and reports `did-not-launch` when neither the wrapper `.log` nor `.status.json` appears. Both graces start at the persisted `startedAt`, never at an artifact mtime — the audit sidecar is reused on re-dispatch, so a heartbeat older than this dispatch counts as no signal yet rather than a stall. A heartbeat budget breach is confirmed before it is reported: the probe re-reads the sidecar after `--stall-confirm` seconds (default: half that stage's budget; `0` disables) and reports `stalled` only when the newest heartbeat has not advanced, so a worker inside one long uninterruptible tool call is not judged dead for being slow. Healthy probes report `live`. It only judges—it never kills or re-dispatches. Exit 1 on an unhealthy verdict, so a poll loop can branch without parsing JSON. The heartbeat line shape and budget come from the `okstra_ctl.worker_heartbeat` SSOT shared with the Phase 7 audit (`validators/validate_session_conformance.py`) |
854
+ | `okstra worker-liveness [--team-state <path> --worker <id>]… [--max-idle <seconds>] [--launch-grace <seconds>] [--stall-confirm <seconds>] [--json]` | Judge whether pending workers are still alive so the lead's poll ends a stalled wait early instead of paying the full deadline. Prefer paired `--team-state <path> --dispatch-id <id>` options for identified attempts; do not mix them with `--worker`. Worker-name selection is retained only when the dispatch is unambiguous. Each retry starts a new wait for its own id. A selector error is a monitoring-input defect, not a failed worker. The worker row's `livenessMode` picks the probe: `audit-heartbeat` reads its `auditSidecarPath` and reports `stalled` when the `- PROGRESS:` heartbeat is past the idle budget; `wrapper-status` reads its `promptPath` and reports `did-not-launch` when neither the wrapper `.log` nor `.status.json` appears. Both graces start at the persisted `startedAt`, never at an artifact mtime — the audit sidecar is reused on re-dispatch, so a heartbeat older than this dispatch counts as no signal yet rather than a stall. A heartbeat budget breach is confirmed before it is reported: the probe re-reads the sidecar after `--stall-confirm` seconds (default: half that stage's budget; `0` disables) and reports `stalled` only when the newest heartbeat has not advanced, so a worker inside one long uninterruptible tool call is not judged dead for being slow. Healthy probes report `live`. It only judges—it never kills or re-dispatches. Exit 1 on an unhealthy verdict, so a poll loop can branch without parsing JSON. The heartbeat line shape and budget come from the `okstra_ctl.worker_heartbeat` SSOT shared with the Phase 7 audit (`validators/validate_session_conformance.py`) |
855
+ | `okstra verification-target --project-root <dir> --run-manifest <path> --expected-head <commit> --command <declared-command> [--baseline <json>]` | Read-only target observation for implementation and final verification. Reads the active run's worktree, checks the commit and rejects checkout-changing command syntax without executing the command. Save the JSON before the check; compare it with `--baseline` afterwards. Changed source fingerprints, commands, worktrees or commits invalidate reuse. A successful observation does not prove the declared command was executed. Exit 1 on a target or input error. |
845
856
  | `okstra worker-audit-check --run-dir <runs/<task-type>/> --task-type <type> --seq <nnn> [--worker <id>]` | Apply the Phase 7 worker audit-sidecar rules mid-run, while the worker session is still alive. For each of this run's `worker-results/<worker>-<task-type>-<seq>.md` it checks that the file carries no `## 0. Reading Confirmation` heading, that the matching audit sidecar exists, and — for prompts carrying the required-v1 evidence-ledger marker — that every backticked `path:line` citation has an Evidence read row in that sidecar. `--worker` scopes it to the role that just returned. `--seq` accepts a bare number and zero-pads it to three digits, so `--seq 1` and `--seq 001` select the same run. Emits `{ok, inspected, inspectedFiles[], failures[], blocking[], advisory[], runImpact}` and exits 2 when `failures[]` (= `blocking` + `advisory`) is non-empty — and also when the selector matched no result file at all, in which case the payload carries `selectorError` and empty `failures[]`: nothing was judged, which is not a pass. Exit 2 means "fix it now", not "the run fails": only `blocking` rows (no audit sidecar) fail the run at Phase 7, while `advisory` rows (a citation with no matching Evidence read row) never fail the run and are only repairable while the worker session is alive — do not reject or re-dispatch a result over an advisory row alone. The rules come from the `okstra_ctl.worker_audit_ledger` SSOT shared with `validate-run.py`, so an early pass and the Phase 7 pass cannot disagree. Run it right after collecting a result: the same failure at Phase 7 leaves only a retroactive edit, which breaks the audit chain, or a failed run |
846
857
  | `okstra log-report [--project-root <dir>] [--cwd <dir>] [--top <N>] [--json]` | Read-only inventory of wrapper transcript `.log` files and their sibling prompt `.md` files. Each ranked entry preserves `path` / `sizeBytes` for compatibility and also reports `transcriptPath`, `transcriptBytes`, `promptPath`, `promptBytes`, and `transcriptToPromptRatio`; totals distinguish prompt bytes from transcript bytes and count paired files. Ranking remains transcript-size descending |
847
858
  | `okstra recap <assemble\|record\|note> (<task-root\|task-key> \| --task-group <group>) …` | Backend for the okstra-inspect `recap` facet. `assemble` is read-only: for a task it prints a JSON summary of phase transitions across its runs; with `--task-group` it prints the group's start order (briefs in ordinal order, each `done` / `in progress` / `not started` from the catalog's task-manifests, memory entries only for tasks the catalog does not know) and every recorded task's latest conclusion from `group-context.md`'s Task Memory. `okstra model-io recap-input --task-group <group>` is the fixed-text projection of the same join. `record --kind <summary\|qa> --mode <artifact\|code> --answer <text> [--question <text>] [--citation <path:line> …]` appends one line to `<task-root>/recap/recap-log.jsonl`, or with `--task-group` to `.okstra/tasks/<group>/.recap/recap-log.jsonl`, and never mutates other artifacts. `note` is task-only. `note --kind <verification-evidence\|decision-draft\|analysis-note> --slug <topic> --purpose <text> --scope-note <text> (--body <markdown>\|--body-file <path>)` writes an agent-authored note to `<task-root>/notes/` and prints its path plus the `--clarification-response` argument for feeding it into a later run |
@@ -865,7 +876,7 @@ The `okstra` Node CLI (`bin/okstra`) provides both installer/admin commands and
865
876
  | `okstra worker-dispatch --project-root <dir> --run-manifest <path> [--workers <csv>] [--dry-run]` | Provider-neutral deterministic dispatcher for `runner=cli-wrapper` assignments. It verifies each adjacent invocation specification against the immutable run manifest immediately before process creation and records `core-pre-dispatch`; native-session rows stay with the host. The default selects CLI analysis assignments only. Phase 6 uses explicit `--workers report-writer`, and a mixed analysis/report batch is rejected. `--dry-run` performs the same verification and resolution without starting a provider process. |
866
877
  | `okstra codex-dispatch --project-root <dir> --run-manifest <path> [--workers <csv>] [--dry-run]` | Compatibility alias for `okstra worker-dispatch`; it no longer selects a Codex-only transport-agent path. |
867
878
  | `okstra agent-prompt jobs --project-root <dir> --run-manifest <path> --dispatch-kind <kind> --metadata <path> [--metadata <path>] --out <path> [--json]` | Generate an immutable v2 jobs file from verified invocation metadata. Reads canonical identity, role, five digests, and actual result anchors; validates the full batch through the dispatch consumer before publishing. Rejects mixed runs or dispatch kinds, duplicate attempts, and translator input (use canonical `worker-dispatch --workers translator`). Reuses identical output; preserves differing output and requests a new `--out` path. Does not launch workers. |
868
- | `okstra agent-prompt materialize\|check-corrections\|apply-corrections\|verify\|record-dispatch\|link-result\|reject-result\|abandon-attempt\|materialize-result\|complete\|verify-completion` | Internal invocation-contract CLI. `materialize` composes model assignment, functional duty, and task instructions; `verify` rejects identity, path, snapshot, assignment, source, or digest drift. Every run-branch report-writer prompt gets its `## Output` section (narrative, pointer record, reading audit) rendered by okstra, and an instruction body that writes a `## Output` or `## Corrections` heading is refused. A corrective report-writer round — the narrative at `reportNarrativePath` already exists and its structure parses, value defects included — must pass `--corrections <ledger>` (`schemas/report-writer-corrections-v1.0.schema.json`: `replace` / `remove` / `rewrite` entries keyed by the validator's field-path grammar, `baseNarrativePath` naming a preserved copy of the attempt): the ledger is applied to that base and checked against the writer-owned schema and the task's semantic validator before dispatch, every defect is reported at once, and okstra renders the prompt's `## Corrections` section from it; a report-writer materialization without a ledger over such a narrative is refused before any prompt is written, while a narrative whose structure does not parse (line grammar, unknown top-level field) is re-authored without one. `check-corrections --run-manifest <path> --corrections <ledger> [--json]` runs the same check without materializing (exit 1 lists the defects; `mechanical: true` means every entry is a `replace` or `remove` that passed). `apply-corrections` with the same arguments applies such a mechanical ledger without a writer round: it writes the corrected narrative to `reportNarrativePath` and records a `lead-correction-applied` activity row (`evidenceRefs` = ledger path + correction ids) through the run's activity contract; it refuses a ledger with `rewrite` entries or any defect, a base that is the live narrative, a run without `activityContractVersion` 1, and a ledger already applied. Run-backed calls resolve `assignmentRef` from the manifest, enforce `authorizedPaths`, and reject real-path or symbolic-link escape. `record-dispatch` records a verified host-native specification before dispatch and `link-result` binds the accepted result; one result path belongs to one dispatch, so a corrective round retires the first attempt with `reject-result --dispatch-id <first> --superseded-by <corrective> --reason <text>` before the new link is accepted — the rejected row stays in `agentResultLinks` carrying `supersededBy` and `rejectionReason` rather than being deleted. The corrective dispatch is a new invocation: an invocation whose last attempt finished with a mutation takes no further attempt (`execution_manifest._validate_next_attempt` lets only `failed-no-mutation` be followed), so a retry attempt of the rejected invocation itself is refused by the manifest, and `reject-result` does not make it possible. `abandon-attempt --invocation-ref <ref> --reason <text>` closes a started attempt whose worker died without producing a result — the one case neither `link-result` (which needs the result file) nor the dispatch-failure path covers — so a retry can follow it instead of the run having to be re-rendered. It refuses any attempt whose `writePolicy.sourcePolicy.mode` is not `source-readonly`: closing an attempt records `failed-no-mutation`, which is true by policy for a read-only worker and a guess for a mutating one. Standalone calls are identified by `(purpose, invocationId)` under `.okstra/agent-invocations/<purpose>/`; they publish a canonical result envelope and publish the completion marker last. Consumers use only the `returnedBody` from `verify-completion`. Metadata contains exactly `catalogDigest`, `assignmentDigest`, `dutyDigest`, `instructionDigest`, and `promptDigest`; JSON inputs use UTF-8, sorted keys, compact separators, and no non-finite values, while duty files use versioned sorted-name/byte framing. Instruction sources use `{kind: project\|runtime, path: <relative POSIX path>}` and never persist an installed absolute runtime path. A published prompt is immutable, so re-running `materialize` with an edited instruction file fails as `existing_invocation_conflict`; `--replace-undispatched` is the one exit, for a call that failed a pre-dispatch gate and therefore ran nowhere — it covers a differing prompt and a differing metadata alike, since the two are published together and describe one call. It republishes prompt and metadata together, and it is verified rather than trusted — a row in `agentDispatches` or `workerDispatches` naming this `invocationId` refuses the replacement and names the dispatch that used it. |
879
+ | `okstra agent-prompt materialize\|check-corrections\|apply-corrections\|verify\|record-dispatch\|link-result\|reject-result\|abandon-attempt\|materialize-result\|complete\|verify-completion` | Internal invocation-contract CLI. `materialize` composes model assignment, functional duty, and task instructions; `verify` rejects identity, path, snapshot, assignment, source, or digest drift. Every run-branch report-writer prompt gets its `## Output` section (narrative, pointer record, reading audit) rendered by okstra, and an instruction body that writes a `## Output` or `## Corrections` heading is refused. A corrective report-writer round — the narrative at `reportNarrativePath` already exists and its structure parses, value defects included — must pass `--corrections <ledger>` (`schemas/report-writer-corrections-v1.0.schema.json`: `replace` / `remove` / `add` / `move` / `rewrite` entries keyed by the validator's field-path grammar, `baseNarrativePath` naming a preserved copy of the attempt, and optional `baseNarrativeSha256` binding that version): the ledger is applied to that base and checked against the writer-owned schema and the task's semantic validator before dispatch, every defect is reported at once, and okstra renders the prompt's `## Corrections` section from it; a report-writer materialization without a ledger over such a narrative is refused before any prompt is written, while a narrative whose structure does not parse (line grammar, unknown top-level field) is re-authored without one. `check-corrections --run-manifest <path> --corrections <ledger> [--json]` runs the same check without materializing (exit 1 lists the defects; `mechanical: true` means every entry is a validated `replace`, `remove`, `add`, or `move`, including derived planning step counts). `apply-corrections` with the same arguments applies such a mechanical ledger without a writer round: it writes the corrected narrative to `reportNarrativePath` and records a `lead-correction-applied` activity row (`evidenceRefs` = ledger path + correction ids) through the run's activity contract; `--rewrite-results <file>` also accepts hash-bound replacement values for exactly the requested rewrite ids. Correction-only materialization sends those target fields, evidence, and constraints instead of the initial instructions and complete synthesis packet; the runtime merges the submitted values and checks the complete narrative before writing. It refuses unresolved `rewrite` entries or any defect, a stale live narrative, a base that is the live narrative, a run without `activityContractVersion` 1, and a ledger already applied. An empty ledger can preflight the initial writer result and derive `stageMap[].stepCount` from matching execution rows without another writer call. Run-backed calls resolve `assignmentRef` from the manifest, enforce `authorizedPaths`, and reject real-path or symbolic-link escape. `record-dispatch` records a verified host-native specification before dispatch and `link-result` binds the accepted result; one result path belongs to one dispatch, so a corrective round retires the first attempt with `reject-result --dispatch-id <first> --superseded-by <corrective> --reason <text>` before the new link is accepted — the rejected row stays in `agentResultLinks` carrying `supersededBy` and `rejectionReason` rather than being deleted. The corrective dispatch is a new invocation: an invocation whose last attempt finished with a mutation takes no further attempt (`execution_manifest._validate_next_attempt` lets only `failed-no-mutation` be followed), so a retry attempt of the rejected invocation itself is refused by the manifest, and `reject-result` does not make it possible. `abandon-attempt --invocation-ref <ref> --reason <text>` closes a started attempt whose worker died without producing a result — the one case neither `link-result` (which needs the result file) nor the dispatch-failure path covers — so a retry can follow it instead of the run having to be re-rendered. It refuses any attempt whose `writePolicy.sourcePolicy.mode` is not `source-readonly`: closing an attempt records `failed-no-mutation`, which is true by policy for a read-only worker and a guess for a mutating one. Standalone calls are identified by `(purpose, invocationId)` under `.okstra/agent-invocations/<purpose>/`; they publish a canonical result envelope and publish the completion marker last. Consumers use only the `returnedBody` from `verify-completion`. Metadata contains exactly `catalogDigest`, `assignmentDigest`, `dutyDigest`, `instructionDigest`, and `promptDigest`; JSON inputs use UTF-8, sorted keys, compact separators, and no non-finite values, while duty files use versioned sorted-name/byte framing. Instruction sources use `{kind: project\|runtime, path: <relative POSIX path>}` and never persist an installed absolute runtime path. A published prompt is immutable, so re-running `materialize` with an edited instruction file fails as `existing_invocation_conflict`; `--replace-undispatched` is the one exit, for a call that failed a pre-dispatch gate and therefore ran nowhere — it covers a differing prompt and a differing metadata alike, since the two are published together and describe one call. It republishes prompt and metadata together, and it is verified rather than trusted — a row in `agentDispatches` or `workerDispatches` naming this `invocationId` refuses the replacement and names the dispatch that used it. |
869
880
  | `okstra team dispatch --project-root <dir> --run-manifest <path> [--workers <csv>] [--jobs-file <path>] [--dry-run]` / `okstra team await --project-root <dir> --run-manifest <path> [--json]` / `okstra team teardown --project-root <dir> --run-manifest <path> [--dry-run] [--json]` | Read a `leadRuntime=external` run manifest and dispatch, await, or tear down pane-backed workers. Default dispatch excludes report writer; Phase 6 selects it explicitly, and mixed analysis/report jobs are rejected. If a pane cannot be opened, gracefully degrade to the CLI wrapper and record the fallback in `workerDispatches[].degradedFrom` |
870
881
  | `okstra agent-activity append --project-root <dir> --run-manifest <path> --kind <kind> --agent <assigned-id> (--summary <text>\|--summary-file <markdown>) --outcome <outcome> [--plan-item-id <current-id>]… [--command <text> --command-cwd <dir> --command-exit-code <n> --command-output-file <markdown>] [--request-ref <returned-ref>]` | Append one structured activity after checking the agent against this run's role assignments and every plan item against its current convergence state. Python returns an `activityRequestRef`; supply only that returned value with `--request-ref` to retry idempotently. A new call without it remains a distinct activity even with identical contents. Legacy JSON command records remain automation compatibility only. |
871
882
  | `okstra agent-activity project --project-root <dir> --run-manifest <path> --data <data.json>` | Project this run's canonical activity events into `agentActivity[]`. The command preserves event order, rejects duplicate or decreasing activity IDs, and replaces no other report field. A historical manifest without `activityContractVersion: 1` returns an empty projection and leaves data.json unchanged. Normal Phase 7 execution reaches this behavior through `report-finalize`; use the standalone command only for diagnostics. |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "okstra",
3
- "version": "0.200.1",
3
+ "version": "0.201.0",
4
4
  "description": "Host-aware multi-provider cross-verification orchestrator runtime and agent skills.",
5
5
  "license": "MIT",
6
6
  "author": "devonshin",
@@ -1,5 +1,5 @@
1
1
  {
2
- "package": "0.200.1",
3
- "builtAt": "2026-09-13T00:15:52.944Z",
2
+ "package": "0.201.0",
3
+ "builtAt": "2026-09-13T22:07:32.212Z",
4
4
  "repoRoot": "/home/runner/work/okstra/okstra"
5
5
  }
@@ -12,7 +12,9 @@ The final prompt's `report-writer` duty contract and the selected report-writer
12
12
 
13
13
  Write only the report narrative Markdown at `**Result Path:**`, the pointer at `**Worker Result Path:**`, and the audit sidecar. You must not write or patch `final-report-*.data.json`, the approval decision ledger, activity ledger, team state, convergence state, or design-preparation input.
14
14
 
15
- Read every dispatched input end-to-end. Full context is available to write the plan and explanation; reading an artifact does not grant authority to reproduce or repair its machine metadata.
15
+ A correction-only prompt may additionally name a replacements JSON output. In that mode, the supplied `apply-corrections` command owns the narrative update.
16
+
17
+ For initial synthesis, read every range in the synthesis packet's Read Index once, in order. Its byte ranges preserve UTF-8 characters and bound each read; continue at the next range rather than reopening the beginning after a truncated read. Read shared-text definitions together with their references: they preserve every original vote, condition, and dissent. The sibling JSON retains frozen originals for a targeted source check. Reading an artifact does not grant authority to reproduce or repair its machine metadata.
16
18
 
17
19
  The narrative must not contain `designPreparation`, `designSurfaceCoverage`, `executionStatus`, `executionRoles`, `tokenUsage`, `crossVerification`, `approvalContext`, `clarificationItems`, `agentActivity`, or `planBodyVerification`. Do not invent a future round, gate result, activity identifier, resolution, or usage value.
18
20
 
@@ -26,8 +28,10 @@ The narrative must not contain `designPreparation`, `designSurfaceCoverage`, `ex
26
28
 
27
29
  The narrative is not free-form Markdown. After the line `# OKSTRA Report Narrative`, every line is one of `- **Field Name**`, `- Item <N>`, or `> value`; blank lines are ignored and **everything else is rejected** — headings (`#`, `##`, `###`), column-0 pipe tables, code fences, bare paragraphs, JSON, YAML, JSON Pointer. Put such text inside a `> ` value instead.
28
30
 
29
- Only these top-level names are allowed: `Analysis Common`, `Change Impact Analysis`, `End State Coverage`, `Error Analysis`, `Feature Analysis`, `Final Verdict`, `Final Verification`, `Follow Up Tasks`, `Human Summary`, `Implementation`, `Implementation Option Selection`, `Implementation Planning`, `Improvement Discovery`, `Project Analysis`, `Rationale`, `Recommended Next Steps`, `Release Handoff`, `Requirements Discovery`, `Summary`, `Ticket Coverage`, `Verdict Card`. A section title from a lead procedure document is not a field name. On a refusal, read the allowed names the parser lists for that position instead of guessing again.
31
+ Only these top-level names are allowed: `Analysis Common`, `Change Impact Analysis`, `End State Coverage`, `Error Analysis`, `Feature Analysis`, `Final Verdict`, `Final Verification`, `Follow Up Tasks`, `Human Summary`, `Implementation`, `Implementation Option Selection`, `Implementation Planning`, `Improvement Discovery`, `Project Analysis`, `Rationale`, `Recommended Next Steps`, `Release Handoff`, `Requirements Discovery`, `Summary`, `Technical Verification`, `Ticket Coverage`, `Verdict Card`. A section title from a lead procedure document is not a field name. On a refusal, read the allowed names the parser lists for that position instead of guessing again.
32
+
33
+ A `## Corrections` section uses the prompt's correction-only reading and output contract. Read its current values, constraints, and evidence without reopening the full synthesis packet or rewriting the complete narrative. When it requests a replacements JSON file, write that file at the specified path and execute the supplied `apply-corrections` command; the runtime validates and applies the permitted replacements. Keep the pointer and audit sidecar current. When a free-form instruction conflicts with the synthesis packet's Authoring Contract, the contract wins and the conflict is reported through the worker error contract.
30
34
 
31
- A `## Corrections` section in the prompt is okstra-validated: apply it verbatim and change nothing else. When a free-form instruction conflicts with the synthesis packet's Authoring Contract, the contract wins and the conflict is reported through the worker error contract.
35
+ Apply only the supplied correction ids and change nothing else.
32
36
 
33
37
  Report assembly validates every owner input and publishes the final record once. An assembly error naming another owner must be returned to that owner, not repaired in the narrative.
@@ -56,13 +56,13 @@ prefer_colocated_modules(__file__, "okstra_ctl/next_phase.py")
56
56
  from okstra_ctl import next_phase # noqa: E402
57
57
  from okstra_ctl.final_report_paths import final_report_markdown_path # noqa: E402
58
58
  from okstra_ctl.paths import task_manifest_file # noqa: E402
59
- from okstra_ctl.workflow import PHASE_SEQUENCE # noqa: E402
59
+ from okstra_ctl.workflow import PHASE_RULES # noqa: E402
60
60
  from okstra_project.dirs import tasks_root # noqa: E402
61
61
 
62
62
 
63
63
  SLUG_RE = re.compile(r"[^a-zA-Z0-9-]+")
64
64
 
65
- ALLOWED_TASK_TYPES = set(PHASE_SEQUENCE)
65
+ ALLOWED_TASK_TYPES = set(PHASE_RULES)
66
66
  ALLOWED_ORIGINS = {
67
67
  "phase-continuation",
68
68
  "out-of-plan",
@@ -0,0 +1,44 @@
1
+ ---
2
+ id: technical-verification-worker
3
+ version: 1
4
+ kind: role
5
+ appliesTo: technical-verification-worker
6
+ ---
7
+
8
+ # Technical Verification Worker Duty Contract
9
+
10
+ ## Responsibility
11
+
12
+ Test the frozen unresolved facts and report experimental evidence for a new implementation comparison.
13
+
14
+ ## Required conduct
15
+
16
+ Read the technical-verification profile and frozen input. Write a falsifiable plan before executing each probe. Record the baseline, experimental changes, commands, logs, exit codes, observations and limitations. Preserve each fact's identity.
17
+
18
+ ## Decision principles
19
+
20
+ Choose the smallest probe that can distinguish the competing outcomes. Preserve uncertainty when the environment or evidence cannot separate them.
21
+
22
+ ## Authority and boundaries
23
+
24
+ Create source copies and run scoped installation, build and behavioral experiments only in your assigned run-local experiment directory. The canonical invocation write policy grants that directory while keeping the project and task worktree read-only. Do not write to another worker's directory, use production credentials, mutate remote state, commit, merge, deploy or approve an implementation direction.
25
+
26
+ ## Evidence standard
27
+
28
+ Separate supported, refuted, inconclusive and unrun facts. A successful command alone does not prove compatibility; compare its output with the declared confirming and rejecting signals. Cite retained logs and report environmental failures separately.
29
+
30
+ ## Collaboration contract
31
+
32
+ Run independent probes and preserve contrary observations. Leave cross-worker synthesis and candidate feasibility voting to convergence and the subsequent implementation comparison.
33
+
34
+ ## Completion criteria
35
+
36
+ Every assigned fact has an explicit result and limitations. Observed results have retained command evidence. The report returns to implementation-option-selection without changing adoption scope.
37
+
38
+ ## Forbidden conduct
39
+
40
+ Do not fabricate measurements, suppress failed probes, infer compatibility from peer ranges alone, or change the source comparison to make a candidate valid.
41
+
42
+ ## Blocked-state reporting
43
+
44
+ Record the unavailable environment or input, attempted commands, affected facts and the material needed to continue. Keep unavailable probes inconclusive or not-run.
@@ -46,6 +46,7 @@ Progress, remaining work, and recommendation
46
46
  At each phase or implementation-stage boundary, at task completion, and before a controlled session pause or handoff, give a concise update in the resolved Report Language. Identify the task and the phase or stage, then include these three items (translate the labels):
47
47
 
48
48
  - Progress: what this boundary actually completed, the result of checks already run, and links to the relevant persisted evidence. Distinguish a completed phase from a completed task; a dispatched worker is still in progress.
49
+ - Name the completed operation and its artifact or observed result. Do not use "experiment preparation complete" as a substitute for stating whether you wrote an experiment command, collected inputs, or prepared worker assignments. Distinguish prepared, dispatched, started, and completed work using recorded evidence. When execution is blocked, state the attempted operation, the actual tool error or rejection, and what has not run; do not present preparation as a verification result.
49
50
  - Remaining work: unfinished work in the current task, open approval or input blockers with their IDs, and any registered follow-up tasks. Say explicitly when none remains in the verified scope; when state is unavailable, say unknown rather than inventing completion or a backlog.
50
51
  - Recommendation: the next concrete action and why it comes next. After finalization, use `nextCommand` and `nextRecommendedPhase.rationale` from the result under the routing rules below, including `nextInGroup` when present. Before finalization, use the active run's recorded stage queue and recovery or resume information; do not reuse an earlier run's pointer or invent a resume command.
51
52
 
@@ -53,6 +54,8 @@ During an authorized continuous run, put the update beside the existing progress
53
54
 
54
55
  Prompt delivery is checked by `tests/contract/test_next_phase_authoring_delivery.py::test_lead_closeout_names_a_command_the_user_can_run`; this is guidance for the lead's prose, not runtime validation of the emitted message.
55
56
 
57
+ Before asking again about provider data transfer, read the user's actual authorization in the conversation or carried confirmation record and compare its recipients and material with this dispatch. Reuse authorization that covers the same scope; a retry, translation, or technical experiment does not by itself require renewed consent. Name and ask only about a missing or expanded scope. Model selection alone is not blanket consent. Keep host execution permission separate: submit existing authorization evidence through the host's permitted approval mechanism, and report an actual rejection with its stated reason rather than inventing a new data-transfer gate. This is lead guidance; it does not override host approval decisions.
58
+
56
59
  After Phase 7 persistence, the last user-facing message of this run is the next command. A status dump is not a close. A prohibition (`do not start implementation`) is not a next action. This applies to every task type.
57
60
 
58
61
  **Read the pointer from the `report-finalize` result — do not re-derive it.** Its top-level `nextRecommendedPhase` object (`phase`, `status`, `rationale`) is the value every row below branches on, and the same three values are repeated on stderr as `next phase status:` / `next phase:` / `next phase rationale:`. You did not write that object and you cannot recompute it: you author your task type's routing field, and Phase 7 projects the pointer from it plus the approval state — for `implementation-planning` there is no routing field at all. If the result carries `nextRecommendedPhaseError`, say in one line that the pointer could not be read, then close on the `validate-run` row below. The same result also carries `nextCommand` — `{command, note}`, the table below already applied to this run. When `command` is non-empty it is the close; when it is empty the `note` says what to do with the `rationale` instead.
@@ -73,7 +76,9 @@ For every other task type:
73
76
  - Pointer `status: pending` with a `rationale` → the user's own input is what comes next. Quote the `rationale` and issue the command it names. Do not re-run the phase that just completed, and do not send the user to `/okstra-inspect`: a finished phase has nothing to inspect, and re-running it discards the result the user is being asked to act on.
74
77
  - Otherwise → `/okstra-inspect status` for this task.
75
78
 
76
- Name every file in this reply as a markdown link `[<what it is>](<path>)`, path inside the parentheses so the user can open it. `reportPaths.markdown` in the `report-finalize` result already carries this run's report, report record, and team state that way. Commands stay in backticks.
79
+ For file links in progress updates and closeout, use a short descriptive label in the Report Language, such as `[<선택 언어> 보고서 열기](<actual-report-path>)`, replacing `<선택 언어>` with the run's selected report language name. Put each link on its own line. Keep the complete destination on one source line without inserted newlines or spaces; never abbreviate the destination or repeat the long path beside the label. Use the verified destination from `reportPaths.markdown` or the launch prompt's run paths, changing only the display label. Commands stay in backticks.
80
+
81
+ Some terminal hosts expand Markdown links into visible paths. If that happens, provide a copyable file-opening command for the verified host OS in a code block, on one source line with the actual path safely shell-quoted (for example, `open` on macOS). Do not execute it unless asked. Do not promise that Markdown prevents visual wrapping, or create a shortened copy or symlink merely for display. This is presentation guidance, not runtime validation of the emitted message.
77
82
 
78
83
  **Enforced:** `scripts/okstra_ctl/report_finalize.py` `closeout_command` applies this table to the run and returns the selected row as the result's `nextCommand`; the close is read from that value, not re-derived.
79
84
 
@@ -95,6 +100,7 @@ Do not end the turn after the validator result. Task-qualified report paths and
95
100
 
96
101
  - Task manifest: `{{TASK_MANIFEST_RELATIVE_PATH}}`
97
102
  - Run manifest: `{{RUN_MANIFEST_RELATIVE_PATH}}`
103
+ - User authorization evidence: `userAuthorization` in that run manifest preserves the displayed confirmation, submitted response, and selected input scope. Read it during intake and before requesting execution permission for workers, including the translator inside `report-finalize`. Cite the recorded response and exact recipient/material scope in the host tool justification. This record is a relayed user response, not an independent host permission grant. If absent, do not reconstruct approval from current defaults or model selection; use an actual earlier user response or ask only for the missing scope. New recipients or material require a scope comparison before dispatch.
98
104
  - Active run context: `{{ACTIVE_RUN_CONTEXT_RELATIVE_PATH}}`
99
105
  - Analysis packet: `{{ANALYSIS_PACKET_RELATIVE_PATH}}`
100
106
 
@@ -106,6 +106,10 @@ User-utterance interpretation rule:
106
106
 
107
107
  At each phase or implementation-stage boundary, at task completion, and before a controlled session pause or handoff, follow the launch prompt's "Progress, remaining work, and recommendation" guidance. Include the result and evidence, unfinished work and blockers, and the next action with its reason. During an authorized continuous run, deliver this update beside the checkpoint and continue; do not turn the update into an approval gate. The same guidance applies to the final reply after persistence below.
108
108
 
109
+ Apply the launch prompt's file-link presentation guidance to these updates as well: short localized labels, one link per line, an intact verified destination, and a copyable file-opening command when the terminal expands links. Keep file links separate from the raw progress checkpoint line.
110
+
111
+ Follow the launch prompt's operation-level progress guidance: name the actual prepared artifact or executed check, distinguish preparation from execution and results, and cite the observed error when blocked. Apply its existing-authorization guidance before asking about provider data transfer again; reuse approval for the same recipients and material while respecting separate host execution permission.
112
+
109
113
  A single okstra run frequently spans 30–120 minutes with multi-minute silent windows while workers run; without progress signals the user cannot distinguish "still working" from "hung". Lead MUST emit a single short progress line at each checkpoint below — plain user-facing text in a separate brief message (not buried inside a tool call), one line per checkpoint, format: `PROGRESS: <phase-id> <verb-phrase>`. Emit the line raw — the literal `PROGRESS:` token must begin the line. Do NOT wrap it in inline-code backticks (`` `PROGRESS: ...` ``) or a ```` ``` ```` code fence; markdown wrapping is what the post-hoc conformance validator scrapes around, and raw emit keeps the signal unambiguous.
110
114
 
111
115
  Record each checkpoint with `okstra lead-progress append --project-root <dir> --run-manifest <path> --phase <phase-id>`, then emit the `progressLine` it prints as the user-facing line. The command resolves `leadEventsPath` from the run manifest and writes the checkpoint there — on a host whose adapter declares `sessionAccounting: artifact-only` that ledger is the only place the post-hoc validator can read it, so a conversation line alone leaves no trace and the run is reported as missing the checkpoint. Pass `--worker <role>` on the per-worker checkpoints (it rewrites a phase-specific functional label into the roster role team-state records), `--field NAME=VALUE` for the remaining `key=value` tokens in the order the line carries them, and `--detail <text>` where the line ends in a verb phrase; the wording listed below is the default for the fixed-prose checkpoints.
@@ -130,7 +134,7 @@ Required checkpoints:
130
134
  - `PROGRESS: phase-2-prompts preparing <N> worker prompts` — at the start of Phase 2, before any `Write` to the assigned prompt paths.
131
135
  - `PROGRESS: phase-3-team-create <adapter-specific-status>` — after selected-adapter setup is recorded in team-state. The stable phase id is retained for artifact compatibility.
132
136
  - `PROGRESS: phase-4-dispatch worker=<role> model=<model>` — once per worker, immediately before `dispatch_worker`. `<role>` is the **roster** role, exactly as team-state's `workers[].role` records it (`Claude worker`, `Codex worker`) — the checkpoint is matched against that entry, so a phase-specific functional label (`Claude verifier`, `Codex executor`) names no roster worker and fails the check. Only `claude-worker`-style hyphenation of the same roster role is also accepted.
133
- - `PROGRESS: phase-5-poll pending=<n> done=<m>` — emitted on each wakeup while the pending set is non-empty.
137
+ - `PROGRESS: phase-5-poll pending=<n> done=<m>` — emitted when entering the wait and when the pending attempts or terminal outcomes change. A host wait returning without a worker state change does not create a new checkpoint.
134
138
  - `PROGRESS: phase-5-collect worker=<role> status=<terminal-status>` — once per worker, immediately after the result file is verified. `<role>` is the roster role, same rule as `phase-4-dispatch` above.
135
139
  - `PROGRESS: phase-5-stage stage=<N> title=<title> steps=<count>` — `implementation` only, immediately before the Executor's `phase-4-dispatch` line, after parsing the approved plan's Stage Map and this run's `**Stage for this implementation run:**` anchor. `<title>` is the stage's Stage Map title and `<count>` is its `stepwiseExecution` row count, both read from the approved plan — this is the line that tells the user WHICH plan stage this run executes. The numbering keeps the line sorted where the work happens — the stage runs in Phase 5.
136
140
  - `PROGRESS: phase-5-stage-complete stage=<N> steps=<done>/<count>` — `implementation` only, immediately after the Executor result is verified and its `### Stage Carry Evidence` block is parsed, before the verifier dispatch. `<done>` counts the block's `stepResults[]` rows whose `status` is `done` — read from the emitted block, never recomputed from git. Omitted when the Executor ends without carry evidence (`FAIL` or a non-result); the user then learns the outcome from `phase-5-collect status=<terminal-status>`.
@@ -503,6 +507,7 @@ After persistence, reply briefly in the resolved Report Language. **Lead this re
503
507
 
504
508
  Pick the next action from this table; the first matching row wins:
505
509
 
510
+ - Inside an already authorized continuous task, report the boundary and continue the confirmed stage queue or authorized ready phase. Do not ask the user to invoke the same workflow again solely because one run ended. A recorded wizard receipt remains limited to its original scope; cite broader authorization separately and preserve actual approval and host-permission boundaries.
506
511
  - Phase 7 failure with `recovery.mode: same-run` → continue correcting the owner inputs and execute `recovery.resumeCommand` in this run. Preserve user approvals and model choices. Read the report-writer recovery procedure before correcting its narrative. Do not close by asking the user to restart the phase for repairable artifact errors. If the only failure is `validate-run` and a blocked pointer targets an earlier phase, `recovery.mode: phase-reentry` preserves that target in `nextCommand`. Other validator findings are advisories, printed as `validate-run: advisory — <finding>`; follow the matching pointer row when the run passed.
507
512
 
508
513
  - Open `blocks: approval` rows, or a `blocked-by-disagreement` gate whose approval rows carry no progress disposition (`okstra_ctl.run._blocking_gate_survives_user_decision`) → `/okstra-user-response` (name the `C-NNN` ids). Do not start implementation until those answers exist. An `accept-risk` / `select` / `answer` already recorded is not an open blocker. A report published with those rows open is not a failed run — the answers are the missing input, and a planning re-run without them reproduces the same block.
@@ -522,7 +527,7 @@ When the host native picker is available and two of those rows could apply, ask
522
527
 
523
528
  **Cite run-artifact paths, do not assemble them.** The `report-finalize` result's `reportPaths` carries this run's `humanReport`, `reportRecord`, `teamState`, and `renderFullCopy` command, each already rooted at the project (`.okstra/tasks/<task-group>/<task-id>/runs/...`). Every other run-artifact path the reply cites — the resume command among them — comes from the launch prompt's `## Manifests` / `## Run Paths` lists, which are rooted the same way. A path you compose from a `runs/<task-type>/...` pattern instead is identical across every task of that task-type, so it names no task and does not resolve from the project root either.
524
529
 
525
- **Write every file you name to the user as a markdown link** `[<what it is>](<path>)`, the path inside the parentheses. The host renders the reply as markdown, so that is the only form the user can click; a path in backticks or bare prose is text they have to copy out and open by hand. `reportPaths.markdown` already carries this run's report, report record, and team state in that form — paste those strings. Apply the same shape to every other file the reply names (a worker result, the errors log, a brief), using the project-rooted path from the launch prompt's `## Manifests` / `## Run Paths`. Commands stay in backticks; only files become links.
530
+ Write file references as Markdown links with short labels in the Report Language, following the launch prompt's file-link presentation guidance. `reportPaths.markdown` supplies verified destinations for the report, report record, and team state; preserve those destinations and shorten only their display labels. Put each link on its own line without repeating the path in prose or inserting a line break inside the destination. Apply the same format to worker results, error logs, and briefs, using the project-rooted paths from `## Manifests` / `## Run Paths`. If the terminal expands links into long paths, offer the host-appropriate copyable file-opening command described in the launch prompt. Markdown alone does not guarantee clickable links in every terminal.
526
531
 
527
532
  **Enforced:** `scripts/okstra_ctl/report_finalize.py` `_closeout_report_paths` builds the task-qualified paths and `closeout_command` builds the close, so neither is re-derived; `validators/validate_session_conformance.py` `_check_progress_checkpoints` requires the `phase-7-persist` checkpoint this phase opens with.
528
533
 
@@ -49,7 +49,7 @@ Plan-body verification is configured under `convergence.planBodyVerification` in
49
49
  | `enabled` | `true` | If `false`, the round is skipped and the approval gate is not blocked by this round (legacy behaviour). |
50
50
  | `maxRounds` | `1` | Upper bound. Plan-body verification is consistency / completeness checking, not fact checking — additional rounds rarely help. Range 1–3. |
51
51
  | `selfFixMaxRounds` | `1` | Fixed limit, not configurable: one automatic report-writer rewrite at most. Skip when nothing is fixable. `plan_items_cli._record_self_fixes`, `validate-run._validate_self_fix_grouping`, and session activity validation enforce the limit. |
52
- | `gating` | `true` | If `true` (default), `majority-disagree` blocks approval. If `false`, the round is advisory-only and never blocks approval. Prepare emits `true` because the plan does not exist yet. After the report-writer draft, `okstra plan-items prepare` (and `seed`) flip it to `false` when `designPreparation.mode` is `no-design-inputs` and the Stage Map has exactly one row. That path keeps extraction and one analyser verification round and does not run the self-fix loop or a sweep batch. Critic corrections are exempt from the analyser round limit and need not concern an even split. Record their actual round numbers and preserve completed history; they are not planner rewrites. Two-or-more stages, a PREP item, or non-empty `designPreparation.items` keep `gating=true`. `--no-plan-verification` is the separate manual opt-out (`enabled=false`). **Enforced:** `okstra_ctl.plan_items.advisory_plan_body_gating`, `validators/validate-run.py` `_validate_advisory_plan_body_gating`. "never blocks approval" is enforced by the `gating is False` early return in `_recompute_plan_body_gate`, `_gate_blocking_causes`, `_validate_plan_body_clarification_matching`, and `_validate_self_fix_before_clarification` — an advisory round neither demands a `blocks=approval` row nor an exhausted self-fix budget. |
52
+ | `gating` | `true` | If `true` (default), `majority-disagree` blocks approval. If `false`, the round is advisory-only until an objective verification defect requires repair. Prepare emits `true` because the plan does not exist yet. After the report-writer draft, `okstra plan-items prepare` (and `seed`) flip it to `false` when `designPreparation.mode` is `no-design-inputs` and the Stage Map has exactly one row. That path keeps extraction and one analyser verification round and does not run the self-fix loop or a sweep batch while it remains advisory. `apply-verdicts` and `complete-round` promote it to `gating=true` when `requires_plan_repair` finds factual `b`/`c`/`e` defects or factual `f` requirement-coverage defects. Explicit `claimKind: judgement` and rollback items retain advisory treatment. Correct the affected items using the existing bounded self-fix and re-verification procedure; do not carry an unexecutable check into implementation as accepted evidence. Environment-only `UNVERIFIABLE` remains a non-result, not a factual code rejection. Critic corrections are exempt from the analyser round limit and need not concern an even split. Record their actual round numbers and preserve completed history; they are not planner rewrites. Two-or-more stages, a PREP item, or non-empty `designPreparation.items` keep `gating=true`. `--no-plan-verification` is the separate manual opt-out (`enabled=false`). **Enforced:** `okstra_ctl.plan_items.advisory_plan_body_gating`, `validators/validate-run.py` `_validate_advisory_plan_body_gating`. The remaining advisory exemption is enforced by the `gating is False and not requires_plan_repair(pbv)` condition in `_recompute_plan_body_gate`, `_gate_blocking_causes`, `_validate_plan_body_clarification_matching`, and `_validate_self_fix_before_clarification` — an advisory round neither demands a `blocks=approval` row nor an exhausted self-fix budget. |
53
53
 
54
54
  Default values are emitted into the manifest by `scripts/okstra_ctl/render.py` (`_build_convergence_block`). The ctx knob `OKSTRA_PLAN_VERIFICATION=false` flips `planBodyVerification.enabled` to false. `gating=false` is not that opt-out: extraction and one round still run.
55
55
 
@@ -318,6 +318,8 @@ Plan-body verification only supports **lightweight mode** (defined in [convergen
318
318
 
319
319
  Exception for `P-Req-*`: verifiers still MUST NOT re-open the original task brief for this round, but they MUST compare the requirement text embedded in the `Requirement Coverage` row with the cited Option / Stage / Step in the draft plan. A row is not sound merely because it says `covered`; the cited plan item must actually satisfy the row's stated requirement. A `documented-deviation` never earns automatic `AGREE`: verify all four parts independently — the original requirement, the concrete alternative in `coveredBy`, every `decisionRefs` target, and the `approvalDisposition`. `accepted` requires a referenced user-confirmed clarification; `blocked C-NNN` requires that same-report clarification to be open and block approval.
320
320
 
321
+ For selected-direction `P-Req-*` rows, `status: externally-tracked` explicitly assigns external responsibility through `crossProjectDependencyRefs`. Verify that each reference resolves to a unique, complete `crossProjectDependencies` row and that its required work and verification signal satisfy the requirement. External-only rows need no local stage/step/file references; mixed rows retain their real local references. Do not classify absence of local references as kind `f` when the external mapping is valid. This is planned responsibility, not proof of implementation or deployment. Dangling or incomplete references are rejected by `implementation_direction._coverage_reference_errors`; semantic adequacy remains the verifier judgement.
322
+
321
323
  ## Adversarial plan-body posture
322
324
 
323
325
  When `config.adversarial == true` (the default for `implementation-planning`; see [convergence](./convergence.md) §"Configuration"), the plan-body round runs with an **adversarial posture**. The classification rules and gate arithmetic in §"Round protocol" are UNCHANGED — `majority-disagree` blocks approval, and that class now includes a blocking-kind minority dissent so a 2-AGREE / 1-DISAGREE on `b` / `c` / `e` is not passed silently. Advisory `dissent-isolated` (`DISAGREE(d)`, `P-Rb-*`) still does not block. Adversarial mode changes only *how each verifier evaluates an item*:
@@ -81,13 +81,19 @@ The pointer record contains the narrative and audit paths. Completion never depe
81
81
 
82
82
  ### Corrective report-writer dispatch (ledger required)
83
83
 
84
+ After each readable writer result, preserve the narrative and run `check-corrections` with a ledger whose `corrections` is initially empty. This checks the complete writer-owned schema and, for planning, the existing Stage Map checks before another writer call. It derives `stageMap[].stepCount` from the unique matching stage's execution rows; the returned corrections show the calculated values. An empty ledger with no derived corrections needs no apply call. Missing declarations, ambiguous stage identities, invalid exemptions, and other semantic defects remain errors. The dispatcher still treats a readable narrative as a produced artifact; this check does not trigger a full regeneration. Enforcement: `run_corrections_check`, `report_corrections.check_corrections`, and `collect_data_validation_errors` in `validators/validate-implementation-plan-stages.py`.
85
+
86
+ Use `add` with an exact `replacement` for a missing field or an array append, and `move` with `fromPath` for an existing object field whose destination is absent. The checker refuses overwritten destinations, machine-owned fields, and array moves. Include `baseNarrativeSha256` from the check output to bind a later application to that preserved version. Add field-specific `evidenceRefs` and the necessary `context` to the ledger; correction materialization consumes these instead of the initial instruction body.
87
+
88
+ For `rewrite`, the materialized correction-only prompt supplies target values, constraints, evidence references, and the base hash. The writer returns JSON replacement values for exactly those ids and runs the generated `apply-corrections --rewrite-results` command. The runtime merges the values, preserves unrelated fields, and checks the complete result before writing the narrative. It records the supplied replacement file in the correction activity evidence. The writer then produces the normal pointer and reading audit. Do not ask a correction-only writer to read the complete synthesis packet or reproduce the complete narrative.
89
+
84
90
  This section adds report-specific checks to [okstra-lead-contract](./okstra-lead-contract.md) "Worker instruction quality gate"; it does not limit that common gate to report-writer calls. A follow-up dispatch that revises a narrative which already exists and whose structure parses is a corrective dispatch, and its instruction is a corrections ledger, not prose:
85
91
 
86
92
  1. Preserve the attempt: copy the current narrative to `worker-results/report-writer-narrative-a<N>-<task-type>-<seq>.md`. The ledger's `baseNarrativePath` names that copy, never the live `reportNarrativePath` — the correction overwrites the live file, and the copy is what the writer (or `apply-corrections`) reads.
87
93
  2. The ledger lives at `runs/<task-type>/state/report-writer-corrections-<task-type>-<seq>-a<N>.json` (schema `schemas/report-writer-corrections-v1.0.schema.json`) and holds one entry per defect: `replace` with the exact replacement value (add `current` when you want it checked), `remove` for an item or optional field, `rewrite` with a `rule` when the writer has to re-author prose. Paths use the validator's grammar (`implementationOptionSelection.rankedOptions[1].coverageSummary.coveragePercent`), so a report-assembly refusal can be copied into the ledger verbatim. Never write an indirect instruction such as `use the schema value`, `use the valid status`, or `fix the enum`: a `replacement` is the literal, and a `rule` names the required outcome. You do not copy allowed enum literals by hand — okstra attaches each `rewrite`'s schema constraint from the frozen schema.
88
94
  3. Run `okstra agent-prompt check-corrections --project-root <root> --run-manifest <path> --corrections <ledger>` until it reports no defect. It applies the ledger to a scratch copy of the base narrative and validates the complete proposed narrative against the writer-owned value schema and the task's semantic validator, listing every defect at once. Validating only the edited field is insufficient because one replacement can select a different schema branch, which is why the check covers the whole narrative.
89
- 4. When the check reports `mechanical: true` (every entry is a `replace` or `remove`), run `okstra agent-prompt apply-corrections` with the same arguments: okstra writes the corrected narrative to `reportNarrativePath` and records a `lead-correction-applied` activity row naming the ledger and its correction ids. No writer dispatch, `record-dispatch`, or `link-result` follows; the roster row's result already exists.
90
- 5. Otherwise materialize the writer prompt with the same `--corrections <ledger>` under a new invocation id and prompt path (retire the first attempt's link with `reject-result` as [plan-body-verification](./plan-body-verification.md) describes). okstra renders `## Corrections` (each entry with its label path, current value, replacement or rule, schema constraint, and reason) and `## Output`; the instruction body carries only context.
95
+ 4. When the check reports `mechanical: true` and has corrections, run `okstra agent-prompt apply-corrections` with the same arguments: okstra writes the corrected narrative to `reportNarrativePath` and records a `lead-correction-applied` activity row naming the ledger and its correction ids. This includes validated `replace`, `remove`, `add`, `move`, and derived step counts. No writer dispatch, `record-dispatch`, or `link-result` follows; the roster row's result already exists.
96
+ 5. Otherwise materialize the writer prompt with the same `--corrections <ledger>` under a new invocation id and prompt path (retire the first attempt's link with `reject-result` as [plan-body-verification](./plan-body-verification.md) describes). okstra renders the correction-only field values, evidence, schema constraints, replacement-file contract, application command, and output paths. Put context in the ledger; the initial instruction body is not sent to the correction writer.
91
97
 
92
98
  A report-writer materialization without `--corrections` whose narrative already exists and parses is refused before any prompt is written — free-form corrections cannot be checked before the writer runs, and four of six re-runs in the 2026-09-03 measurement were lead instructions that contradicted the authoring contract. Only a narrative whose structure does not parse (line grammar, an unknown top-level field) is re-authored, not corrected: that dispatch needs no ledger, and its body quotes the parser's message. Because re-authoring overwrites the live file in place, okstra copies the existing narrative to `worker-results/<narrative-name>.pre-<invocation-id>.md` at materialization and renders a `## Previous Attempt` section naming that copy (**Enforced:** `_preserve_reauthored_narrative` in `scripts/okstra_ctl/agent/prompt_cli/materialize.py`); the 2026-09-09 dev-10642 run lost a 579-line attempt to a failed in-place re-indent command with no copy to fall back on. A narrative that breaks the line grammar is not a produced artifact: the dispatcher settles that attempt as `required worker artifact is unusable: narrative does not parse: …` and retries it inside the same batch, so you see the parser's message at collection, not at Phase 7 assembly (**Enforced:** `okstra_ctl.dispatch_state.unusable_result_defect`, read by `missing_completion_paths` and the `team await` record path). The synthesis packet's Authoring Contract carries the line grammar itself (`report_narrative.NARRATIVE_GRAMMAR_INSTRUCTIONS`), so a writer that reads only the packet still sees it. Value defects — an id outside its pattern, a value outside its enum, a missing required field — leave the structure readable and are exactly what the ledger fixes; the a3 attempt of the 2026-09-03 run carried twenty `SC-` ids that assembly refused and was still a corrective base.
93
99
 
@@ -129,8 +129,14 @@ Terminal statuses that can be recorded for a worker:
129
129
  4. A process exit, spawn acknowledgement, pane creation, or Result Path alone is insufficient when the backend contract requires additional status/audit artifacts.
130
130
  5. Apply the single shared retry budget through `redispatch_worker`; after the second failure, record the terminal status and proceed with reduced confidence.
131
131
 
132
+ Keep one active runtime wait for the pending batch. `team await` reconciles wrapper completion and retries inside that process; its progress output names changed pending attempts, with `--heartbeat-seconds` limiting how frequently a changed summary is printed. Unchanged attempts produce no repeated summary. Enforcement: `dispatch_core.await_dispatches` and `tests/run/test_team_await_dead_wrapper.py`.
133
+
134
+ Host guidance: use a completion notification or blocking wait for the same handle when the current host provides it. If the host yields before completion, resume that handle with its supported wait interval. A transport timeout with no changed worker state does not call for another `team await`, a log reread, a liveness command, or a lead progress record. Worker deadlines and liveness remain inside the existing runtime wait. Host callbacks and model wakeups are controlled by the host; this guidance does not claim the runtime can suppress them.
135
+
132
136
  ### Mid-run liveness probes
133
137
 
138
+ For dispatches carrying `dispatchId`, select the exact attempt with `okstra worker-liveness --team-state <path> --dispatch-id <id>` (repeat both options for a batch). Take the id from the dispatch result; do not choose the last row by worker name. `--worker` remains for unambiguous legacy records. After a retry, start a new wait with the retry's id. A selector error is a monitoring-input defect, not a worker failure and not a reason to spend a launch retry. The probe refuses ambiguous legacy records and result paths shared by concurrent attempts; completed previous attempts may share their result destination.
139
+
134
140
  Between wakes, `okstra worker-liveness` is the **only** sanctioned way to ask whether a pending worker is still alive. Do NOT hand-roll a polling script, an `ls` / `stat` loop, or any ad-hoc file-existence check: a lead that writes its own probe owns that probe's bugs, and those bugs surface as *worker* failures — a shell quoting slip silently turns the probe into a no-op that reports health it never measured, and a stall test written against an artifact's absolute mtime declares a freshly launched worker dead on its first iteration, because the audit sidecar it inherits from the previous dispatch has not been touched yet.
135
141
 
136
142
  **Waiting is part of the probe, not something you build around it.** `--wait` polls until every named worker's persisted `resultPath` lands (exit 0), one worker probes unhealthy (exit 1), or `--timeout` passes (exit 2):
@@ -15,12 +15,18 @@ at Phase 5, BEFORE constructing the verifier worker dispatch prompts.
15
15
 
16
16
  ## Verifier QA duties (independent re-run mandate)
17
17
 
18
- `okstra_ctl.qa_commands.find_unfrozen_installs` rejects unfrozen npm/pnpm/yarn/bun installs in both the plan preflight and the verifier command log. If an approved command conflicts with these restrictions or cannot run in the provisioned worktree, report the exact checklist row and route to `implementation-planning`; do not substitute a command during verification.
18
+ `okstra_ctl.qa_commands.find_unfrozen_installs` rejects unfrozen npm/pnpm/yarn/bun installs in both the plan preflight and the verifier command log. If an approved command conflicts with these restrictions, report the exact checklist row. A stale checkout prefix is an execution-target defect: have the lead correct the owning command input within this run, preserve the test and expected result, then rerun that check. Revisit planning only when the test definition or implementation direction changes; do not substitute a different test during verification.
19
19
 
20
20
  Every verifier acts as a QA gate, not just a diff reviewer. Trusting the executor's reported evidence is forbidden — verifiers MUST reproduce it themselves from the same worktree path the executor used.
21
21
 
22
22
  **Enforced:** `_validate_verifier_reran_independently` in `validators/validate-run.py` fails an empty `independentValidationRerun`. What you wrote in it is not pattern-matched — the wording check that used to reject phrasings citing the executor is gone, because it fired on reports that had reproduced the run and merely said so. Write the command you ran and its outcome; the Discrepancy rule below is what makes you name the divergence.
23
23
 
24
+ ### Record the verification target
25
+
26
+ Before each declared check, run `okstra verification-target --project-root <project-root> --run-manifest <run-manifest> --expected-head <executor-head> --command <exact-declared-command>` and preserve its JSON output under this run's artifact directory. This tool reads the active run's recorded worktree and checks its HEAD and source fingerprint; it never executes the command. Execute the declared command through the host's authorized tool with that worktree as its separate working-directory argument. Repeat the target check with `--baseline <saved-json>` after execution. Include both target-check results and the actual command outcome in `readOnlyCommandLog`.
27
+
28
+ A target mismatch or changed fingerprint invalidates this check's evidence. Record it as an execution-target problem, preserve the source, and rerun only the affected verification after the lead resolves it. An unavailable environment or a check that never ran is not a code rejection. A matching target fingerprint proves source stability at the two observations; it does not prove the command ran or that the test covers the requirement. Keep the independent command outcome and coverage assessment.
29
+
24
30
  ### Two-tier command lookup (NO auto-detection)
25
31
 
26
32
  Verifier obtains the QA command set from exactly two declared sources, in order — there is **no fallback to guessing tools from manifest files**.
@@ -101,3 +101,8 @@ roles:
101
101
  - **source code edits, follow-up bug fixes, or scope expansion** — this run renders a verdict only; defects detected here become inputs to a new `error-analysis`, `implementation-option-selection`, or `implementation-planning` run according to whether the cause, direction, or detailed plan is invalid
102
102
  - read-only execution of pre-existing test or validation commands is permitted, but any command that mutates source, schema, or deployment state is forbidden
103
103
  - this run records detected issues and ends — the shared anti-escalation rule forbids in-run fixes regardless of user phrasing
104
+
105
+
106
+ ## Verification target observations
107
+
108
+ Use `okstra verification-target --project-root <project-root> --run-manifest <run-manifest> --expected-head <verification-head> --command <declared-command>` before a verification command, save the JSON under this run's artifact directory, and repeat with `--baseline <saved-json>` afterwards. Execute the command through the authorized host tool using the recorded worktree as its working directory. The target tool does not execute commands. A mismatch invalidates the affected evidence and calls for target recovery; it does not by itself establish a source-code defect. Preserve the actual command output separately.
@@ -89,5 +89,11 @@
89
89
  "unknown": [
90
90
  "any action that belongs to a different lifecycle phase",
91
91
  "source code edits or state-mutating commands unless this task type explicitly authorises them"
92
+ ],
93
+ "technical-verification": [
94
+ "source edits or installs in the project checkout, task worktree, or another worker's experiment copy",
95
+ "production credentials, remote writes, deployments, migrations, publishing, commits or merging experiments into product branches",
96
+ "marking candidates feasible, selecting a direction, approving a plan, or declaring task acceptance",
97
+ "starting another lifecycle phase inside this run; return the evidence to implementation-option-selection"
92
98
  ]
93
99
  }
@@ -49,7 +49,7 @@ roles:
49
49
  - Map every displayed candidate or preselected direction to the stable brief end-state IDs it satisfies, preserves, or leaves unresolved.
50
50
  - **Close the vote gaps before you conclude `blocked`.** Round 1 runs the designers in parallel, so each one votes only on the candidates it proposed and the merged set ends up with a different hole per analyser. A candidate that is otherwise sound then fails the every-analyser clause and drops out of the ranking — three such candidates blocked a run whose comparison had in fact converged (2026-09-10, dev-10629-4: IO-001, IO-002 and IO-003 each held two `feasible` votes and each was missing a different designer). Run `okstra option-votes gaps --task-manifest <taskManifestPath> --narrative <report writer narrative>` before assembly. For each analyser it names, dispatch one vote-completion assignment asking for that analyser's own feasibility verdict, rationale, and counterevidence on the named candidate — no new candidate, so the run stays in `candidate-comparison` mode. The command reports no gap when a vote cannot settle the block (safety blockers, unresolved feasibility facts, too few feasible verdicts); that is the honest `blocked`.
51
51
  - Clarification request policy (phase-specific addenda — shared policy is in `_common-contract.md`):
52
- - **A blocked run must leave an answer channel.** `routing: blocked` is this phase's only end state with no destination, and its usual cause is `unresolvedFeasibilityFacts` an undecided value, a missing payload contract, an unconfirmed reporter intent. Those are the user's to settle, and the only channel that reaches them is `clarificationItems[]`. Before assembly, open one `Kind=decision, Blocks=next-phase` row per answerable fact. A fact left in `humanSummary.blockers`, `selectionGuidance`, or a follow-up task reaches no answer channel: `okstra user-response` shows the user zero questions on a run that is waiting for their answer. **Enforced:** `scripts/okstra_ctl/implementation_options.py` `validate_blocked_answer_channel` fails a `blocked` report whose candidates carry unresolved facts while no clarification row is open. A block with no unresolved facts every analyser's result missing, for instance has nothing for the user to answer and is exempt.
52
+ - Classify every `unresolvedFeasibilityFacts` entry with `resolutionKind`: `user-decision` requires nonempty `clarificationRefs` naming the actual C-NNN records for that fact; `technical-verification` requires source review, design evidence, or experiments and does not require a user question. Preserve `fact`, `whyItMatters`, and `evidence`. Reuse answered questions and their recorded dispositions; never reopen one merely to save the report. An unrelated open question does not satisfy a missing reference. Historical unclassified entries remain readable, but blocked report reassembly requires the writer to classify them explicitly. Enforced by `validate_blocked_answer_channel` in `scripts/okstra_ctl/implementation_options.py`, called by report assembly and `validate-run.py`. Saving preserves `routing: blocked` and does not make a candidate valid. In `humanSummary.actions`, `verdictCard.nextStep`, and selection guidance, distinguish pending user decisions from remaining technical verification; after the pilot route is answered, carry the selected route and remove the old answer-waiting instruction.
53
53
  {{INCLUDE:_clarification-recommendation.md}}
54
54
  - Cross-verification mode:
55
55
  - Phase 5.5 convergence runs in adversarial mode (`convergence.adversarial=true`).
@@ -57,3 +57,9 @@ roles:
57
57
  - source or configuration edits, tests, builds, migrations, deployments, or other state-mutating commands
58
58
  - detailed implementation planning, file-change specifications, stage maps, execution commands, or user approval
59
59
  - starting `implementation-planning` or any other lifecycle phase inside this run
60
+
61
+ ## Technical evidence loop
62
+
63
+ When no candidate is valid and explicit eligible technical facts remain, route to `technical-verification` to collect experimental evidence. Keep `rankedOptions` empty and `recommendedOptionId` null. `validate_blocked_answer_channel` rejects this route while user decisions remain unresolved or no safe, explicitly classified technical fact is available. Historical blocked reports can be supplied explicitly without rewriting their verdict.
64
+
65
+ When `--clarification-response` carries a technical-verification report, read its source comparison, experiment plans, results and logs. Check that the tested environment matches current code, then author fresh feasibility votes. Do not directly convert a supported result into a feasible candidate, remove unrelated uncertainties or treat a failed or unrun probe as compatibility proof. Preserve the user's pilot scope and any deferred production rollout.