okstra 0.136.0 → 0.137.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 (36) hide show
  1. package/docs/architecture/storage-model.md +1 -1
  2. package/docs/contributor-change-matrix.md +1 -1
  3. package/docs/project-structure-overview.md +8 -3
  4. package/package.json +2 -3
  5. package/runtime/BUILD.json +2 -2
  6. package/runtime/bin/lib/okstra-ctl/cmd-rerun.sh +1 -1
  7. package/runtime/bin/okstra-spawn-followups.py +4 -9
  8. package/runtime/prompts/lead/plan-body-verification.md +2 -2
  9. package/runtime/python/okstra_ctl/codex_dispatch.py +56 -331
  10. package/runtime/python/okstra_ctl/consumers.py +7 -5
  11. package/runtime/python/okstra_ctl/context_cost.py +4 -4
  12. package/runtime/python/okstra_ctl/dispatch_core.py +54 -175
  13. package/runtime/python/okstra_ctl/dispatch_state.py +231 -0
  14. package/runtime/python/okstra_ctl/error_report.py +2 -7
  15. package/runtime/python/okstra_ctl/implementation_outcome.py +12 -23
  16. package/runtime/python/okstra_ctl/implementation_stage.py +7 -2
  17. package/runtime/python/okstra_ctl/path_hints.py +3 -3
  18. package/runtime/python/okstra_ctl/paths.py +17 -2
  19. package/runtime/python/okstra_ctl/recap.py +5 -12
  20. package/runtime/python/okstra_ctl/render.py +9 -15
  21. package/runtime/python/okstra_ctl/report_finalize.py +8 -4
  22. package/runtime/python/okstra_ctl/report_language.py +83 -0
  23. package/runtime/python/okstra_ctl/run.py +222 -239
  24. package/runtime/python/okstra_ctl/set_work_status.py +2 -1
  25. package/runtime/python/okstra_ctl/stage_targets.py +98 -55
  26. package/runtime/python/okstra_ctl/time_report.py +4 -9
  27. package/runtime/python/okstra_ctl/wizard.py +45 -47
  28. package/runtime/python/okstra_ctl/work_categories.py +2 -2
  29. package/runtime/python/okstra_ctl/worker_prompt_body.py +82 -0
  30. package/runtime/python/okstra_ctl/worker_prompt_contract.py +0 -13
  31. package/runtime/python/okstra_ctl/worker_prompt_headers.py +7 -0
  32. package/runtime/python/okstra_project/__init__.py +4 -0
  33. package/runtime/python/okstra_project/dirs.py +7 -0
  34. package/runtime/python/okstra_project/state.py +78 -8
  35. package/runtime/validators/validate-run.py +3 -21
  36. package/src/commands/inspect/stage-map.mjs +12 -19
@@ -236,7 +236,7 @@ Main contents:
236
236
  This document is only a quick summary and is not the source of truth.
237
237
  Always use `task-manifest.json` when checking canonical metadata.
238
238
 
239
- The rendered `task-index.md` is an English-literal artifact. The headings, field labels, and `## Notes` footnote of the template (`templates/project-docs/task-index.template.md`) ship as English literals regardless of the `reportLanguage` setting, matching the okstra-schedule-gen schedule contract. The docs-publication pipeline's Hangul check (`npm run docs:validate`) enforces this contract.
239
+ The rendered `task-index.md` is an English-literal artifact. The headings, field labels, and `## Notes` footnote of the template (`templates/project-docs/task-index.template.md`) ship as English literals regardless of the `reportLanguage` setting, matching the okstra-schedule-gen schedule contract. `tests/contract/test_docs_runtime_contract.py` enforces this contract.
240
240
 
241
241
  ## Run manifest contract
242
242
 
@@ -11,6 +11,6 @@ Use this matrix before changing high-risk repo contracts. Update the source file
11
11
  | Add phase | `scripts/okstra_ctl/workflow.py`, `prompts/profiles/`, `validators/`, `tests/` | workflow and validation contract tests |
12
12
  | Change worker roster | `prompts/profiles/*.md`, `scripts/okstra_ctl/workers.py`, `tests/contract/test_repo_contracts.py` | worker roster contract tests |
13
13
  | Change report section | `schemas/final-report-v1.0.schema.json`, `templates/reports/final-report.template.md`, `scripts/okstra_ctl/render_final_report.py`, `validators/validate-run.py` | final-report schema, renderer, and validator tests |
14
- | Change Markdown publication policy | `config/docs-publication.json`, `tools/docs_publication/`, affected public Markdown paths | `tests/docs_publication/`, `tests/contract/test_repo_contracts.py` |
14
+ | Maintain Korean review mirrors | `config/korean-sources.json`, `tools/korean-sources/`, `.agents/skills/sync-korean-sources/`, `.claude/skills/sync-korean-sources/` | `tests-js/korean-sources-*.test.mjs` |
15
15
 
16
16
  `runtime/` is build output. Never edit it directly; change source files and rebuild the runtime payload instead.
@@ -55,6 +55,10 @@ okstra/
55
55
  │ ├── lib/okstra/ Bash helpers for okstra.sh
56
56
  │ └── lib/okstra-ctl/ Bash control-center subcommands
57
57
  ├── skills/ Claude Code skills (13); `_fragments/` holds shared marker blocks
58
+ ├── .agents/skills/ Codex repo-local maintainer skills
59
+ ├── .claude/skills/ Claude Code project-only mirror-sync surface
60
+ ├── .claude/settings.json Claude Code project-only mirror-sync surface
61
+ ├── .codex/hooks.json Codex project lifecycle hooks
58
62
  ├── agents/ lead SKILL.md + worker agent specs
59
63
  ├── prompts/ launch template, phase profiles, wizard prompt JSON
60
64
  ├── schemas/ JSON schema for final-report data.json
@@ -62,8 +66,8 @@ okstra/
62
66
  ├── validators/ run / brief / schedule / view validators
63
67
  ├── tools/build.mjs source → runtime sync
64
68
  ├── tools/sync-skill-fragments.mjs expand shared fragment blocks into skills/*/SKILL.md
65
- ├── tools/docs_publication/ public-manual publication pipeline (build-time only; not shipped)
66
- ├── config/docs-publication.json publication inventory: every tracked Markdown path + classification
69
+ ├── tools/korean-sources/ maintainer-only Korean mirror sync engine
70
+ ├── config/korean-sources.json configured English Markdown source roots
67
71
  ├── runtime/ generated install payload; do not edit directly
68
72
  ├── tests/ pytest unit suite
69
73
  ├── tests-e2e/ Bash end-to-end scenarios
@@ -289,6 +293,7 @@ Important modules:
289
293
  | `team_reconcile.py` | stale team-member reconciliation at run-end teardown |
290
294
  | `worker_prompt_headers.py` | shared rendering of phase-aware worker prompt anchors (`worker_prompt_headers`): coding-preflight only for implementation and compact target identity for final-verification |
291
295
  | `worker_prompt_body.py` | provider-neutral initial analysis body/input renderer shared by Codex and external/team dispatch paths |
296
+ | `report_language.py` | report-writer `**Report Language:**` resolution (`resolve_report_language`) — precedence project config → global config → task-brief inference, shared by both dispatchers so the stamped language does not depend on which dispatch path ran |
292
297
  | `worker_prompt_policy.py` | `PromptPlan` generating SSOT — resolves functional audience, equality group, packet-only input, coding-preflight eligibility, required headers, and size limits without consulting provider/model identity |
293
298
  | `worker_prompt_contract.py` | deterministic cross-task initial-prompt validator and normalized cross-worker equality SSOT, reused by dispatch adapters and the Phase 7 persisted-artifact validator |
294
299
  | `convergence_engine.py` | pure `ConvergenceEngine` reducer — seeds Round 0 working state, plans roster-aware rounds, applies structured outcomes and one critic-gap batch, finalizes schema v1.3, and validates replayable state without dispatch or filesystem ownership |
@@ -558,7 +563,7 @@ When changing code, keep these docs in sync:
558
563
  - New report field/section: update schema, template, report-writer worker, validator tests, this file's report model if user-visible.
559
564
  - New phase/profile behavior: update `prompts/profiles/*`, `docs/architecture.md`, `docs/cli.md`, and `README.md` if user-facing.
560
565
 
561
- `README.md`, `docs/cli.md`, `docs/architecture.md`, `docs/architecture/storage-model.md`, `docs/container.md`, and `docs/performance-improvement-plan-v2.md` are `translated` outputs in `config/docs-publication.json` do **not** hand-edit them. Author the Korean source under the maintainer's Git-ignored `.project-docs/ko-source/`, then run the publication pipeline (`python3 -m tools.docs_publication prepare|validate|apply|record`), which keeps the source/output hashes in `.project-docs/doc-publishing/state.json` in step. Files classified `pending` including this one, `CHANGES.md`, and `CHANGELOG.md` — are edited directly.
566
+ Edit English canonical Markdown sources directly. After changing a path registered in `config/korean-sources.json`, process the local Korean mirror queue with `$sync-korean-sources` or `/sync-korean-sources`. `.project-docs/ko-sources/**` is maintainer-local only: it is neither published nor committed.
562
567
 
563
568
  ---
564
569
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "okstra",
3
- "version": "0.136.0",
3
+ "version": "0.137.0",
4
4
  "description": "Multi-agent cross-verification orchestrator runtime + Claude Code skills.",
5
5
  "license": "MIT",
6
6
  "author": "devonshin",
@@ -35,10 +35,9 @@
35
35
  "scripts": {
36
36
  "build": "node tools/build.mjs",
37
37
  "prepack": "node tools/build.mjs",
38
- "docs:validate": "python3 -m tools.docs_publication validate --repo .",
39
38
  "test:js": "node --test tests-js/*.test.mjs",
40
39
  "test:py": "python3 -m pytest tests/",
41
40
  "test:workflow": "bash validators/validate-workflow.sh",
42
- "check": "npm run docs:validate && npm run build && npm run test:js && npm run test:py && npm run test:workflow"
41
+ "check": "npm run build && npm run test:js && npm run test:py && npm run test:workflow"
43
42
  }
44
43
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "package": "0.136.0",
3
- "builtAt": "2026-07-25T16:28:08.933Z",
2
+ "package": "0.137.0",
3
+ "builtAt": "2026-07-26T18:44:34.234Z",
4
4
  "repoRoot": "/home/runner/work/okstra/okstra"
5
5
  }
@@ -151,7 +151,7 @@ batch_reserved = {}
151
151
  for original in targets:
152
152
  row = find_row_by_run_id(home, original)
153
153
  # implementation 은 stage 격리 task-type 이다. 한 run = 런타임에 live
154
- # registry/consumers 상태로 auto-resolve 되는 단일 stage(_resolve_effective_stages)
154
+ # registry/consumers 상태로 auto-resolve 되는 단일 stage(stage_targets.resolve_effective_stages)
155
155
  # 이므로, cmd-rerun 은 spawn 전에 어느 stage-<N> 가 선택될지 알 수 없어
156
156
  # runs/implementation/stage-<N> 경로도 per-stage run_seq 도 예측할 수 없다.
157
157
  # OKSTRA_RUN_SEQ_OVERRIDE(run 전체에 단일 seq) 는 per-stage seq 카운터와
@@ -51,19 +51,14 @@ from pathlib import Path
51
51
  sys.path.insert(0, str(Path(__file__).resolve().parent))
52
52
 
53
53
  from okstra_ctl.final_report_paths import final_report_markdown_path # noqa: E402
54
+ from okstra_ctl.paths import task_manifest_file # noqa: E402
55
+ from okstra_ctl.workflow import PHASE_SEQUENCE # noqa: E402
54
56
  from okstra_project.dirs import tasks_root # noqa: E402
55
57
 
56
58
 
57
59
  SLUG_RE = re.compile(r"[^a-zA-Z0-9-]+")
58
60
 
59
- ALLOWED_TASK_TYPES = {
60
- "requirements-discovery",
61
- "error-analysis",
62
- "implementation-planning",
63
- "implementation",
64
- "final-verification",
65
- "release-handoff",
66
- }
61
+ ALLOWED_TASK_TYPES = set(PHASE_SEQUENCE)
67
62
  ALLOWED_ORIGINS = {
68
63
  "phase-continuation",
69
64
  "out-of-plan",
@@ -193,7 +188,7 @@ def _spawn_one(
193
188
  "routingStatus": "follow-up-spawned",
194
189
  },
195
190
  }
196
- _write_manifest(task_root / "task-manifest.json", manifest_payload)
191
+ _write_manifest(task_manifest_file(task_root), manifest_payload)
197
192
 
198
193
  brief_path = task_root / "instruction-set" / "task-brief.md"
199
194
  brief_path.parent.mkdir(parents=True, exist_ok=True)
@@ -244,7 +244,7 @@ Plan-body verification stays **lightweight** even under this posture — the `ve
244
244
 
245
245
  Required prompt anchor headers are identical to finding convergence (see [convergence](./convergence.md) §"Required reverify-prompt anchor headers"). The prompt body changes from F-* listing to P-* listing:
246
246
 
247
- ```
247
+ ````
248
248
  You are <worker-role> performing plan-body verification for <task-key> (round 1).
249
249
 
250
250
  ## Instructions
@@ -342,7 +342,7 @@ rerun a free-form requirements analysis. Every DISAGREE includes Fixability.
342
342
  **Fixability** (DISAGREE only): planner-fixable | needs-user-input. Fixability is not applicable for `UNVERIFIABLE`.
343
343
  **Note**: <the falsification candidate considered and why it is excluded; required even for AGREE>
344
344
  **Explanation**: <2-3 sentences applying the disposition-specific rule>
345
- ```
345
+ ````
346
346
 
347
347
  When `config.adversarial == true`, the lead prepends the adversarial framing from §"Adversarial plan-body posture" to the `## Instructions` block: the burden of proof is on the plan, the verifier opens and confirms every accessible cited path / command, and evidence that was opened but is insufficient yields the applicable `DISAGREE(<kind>)` rather than `AGREE`. Inability to inspect because of capability, credential, network, or service state yields `UNVERIFIABLE`, not DISAGREE. The verdict tokens, breakage kinds (a–f), classification, and the majority gate threshold are unchanged. This prepended framing supersedes the template's "Judge solely from plan internal consistency" instruction for the adversarial round.
348
348