okstra 0.186.7 → 0.188.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.
- package/README.md +1 -1
- package/dist/cli-registry.d.mts +88 -1
- package/dist/cli-registry.mjs +68 -111
- package/dist/cli-registry.mjs.map +1 -1
- package/dist/commands/execute/render-bundle.mjs +0 -1
- package/dist/commands/execute/render-bundle.mjs.map +1 -1
- package/dist/commands/execute/run.mjs +8 -3
- package/dist/commands/execute/run.mjs.map +1 -1
- package/dist/commands/lifecycle/check-project.mjs +1 -14
- package/dist/commands/lifecycle/check-project.mjs.map +1 -1
- package/dist/commands/lifecycle/config.mjs +38 -40
- package/dist/commands/lifecycle/config.mjs.map +1 -1
- package/dist/commands/lifecycle/doctor.d.mts +22 -7
- package/dist/commands/lifecycle/doctor.mjs +77 -49
- package/dist/commands/lifecycle/doctor.mjs.map +1 -1
- package/dist/commands/lifecycle/install.d.mts +12 -10
- package/dist/commands/lifecycle/install.mjs +107 -40
- package/dist/commands/lifecycle/install.mjs.map +1 -1
- package/dist/commands/lifecycle/paths.mjs +8 -3
- package/dist/commands/lifecycle/paths.mjs.map +1 -1
- package/dist/commands/lifecycle/preflight.mjs +2 -1
- package/dist/commands/lifecycle/preflight.mjs.map +1 -1
- package/dist/commands/lifecycle/setup.mjs +22 -36
- package/dist/commands/lifecycle/setup.mjs.map +1 -1
- package/dist/commands/lifecycle/uninstall.d.mts +4 -2
- package/dist/commands/lifecycle/uninstall.mjs +59 -15
- package/dist/commands/lifecycle/uninstall.mjs.map +1 -1
- package/dist/commands/memory/memory.mjs +7 -1
- package/dist/commands/memory/memory.mjs.map +1 -1
- package/dist/lib/helper-scripts.d.mts +1 -1
- package/dist/lib/helper-scripts.mjs +10 -18
- package/dist/lib/helper-scripts.mjs.map +1 -1
- package/dist/lib/host-config.d.mts +72 -0
- package/dist/lib/host-config.mjs +404 -0
- package/dist/lib/host-config.mjs.map +1 -0
- package/dist/lib/host-registry-client.d.mts +2 -2
- package/dist/lib/host-registry-client.mjs +0 -3
- package/dist/lib/host-registry-client.mjs.map +1 -1
- package/dist/lib/install-assets.d.mts +1 -0
- package/dist/lib/install-assets.mjs +4 -0
- package/dist/lib/install-assets.mjs.map +1 -1
- package/dist/lib/proc.d.mts +2 -0
- package/dist/lib/proc.mjs +12 -0
- package/dist/lib/proc.mjs.map +1 -1
- package/dist/lib/python-command.d.mts +2 -0
- package/dist/lib/python-command.mjs +52 -0
- package/dist/lib/python-command.mjs.map +1 -0
- package/dist/lib/python-helper.d.mts +2 -5
- package/dist/lib/python-helper.mjs +3 -52
- package/dist/lib/python-helper.mjs.map +1 -1
- package/dist/lib/runtime-payload.d.mts +23 -0
- package/dist/lib/runtime-payload.mjs +57 -0
- package/dist/lib/runtime-payload.mjs.map +1 -0
- package/dist/lib/types.d.mts +24 -13
- package/docs/architecture/storage-model.md +21 -5
- package/docs/architecture.md +39 -38
- package/docs/cli.md +55 -76
- package/docs/coding-rules.md +295 -0
- package/docs/container.md +10 -36
- package/docs/contributor-change-matrix.md +1 -1
- package/docs/for-ai/skills/okstra-code-review.md +0 -1
- package/docs/for-ai/skills/okstra-container-build.md +8 -41
- package/docs/for-ai/skills/okstra-inspect.md +4 -4
- package/docs/for-ai/skills/okstra-manager.md +2 -2
- package/docs/for-ai/skills/okstra-rollup.md +0 -1
- package/docs/for-ai/skills/okstra-run.md +3 -3
- package/docs/for-ai/skills/okstra-user-response.md +0 -1
- package/docs/performance-improvement-plan-v2.md +1 -1
- package/docs/project-structure-overview.md +62 -62
- package/docs/task-process/README.md +3 -3
- package/docs/task-process/common-flow.md +1 -1
- package/docs/task-process/error-analysis.md +3 -3
- package/docs/task-process/implementation-planning.md +3 -1
- package/docs/task-process/release-handoff.md +1 -1
- package/package.json +3 -2
- package/runtime/BUILD.json +2 -2
- package/runtime/agents/workers/claude-worker.md +6 -11
- package/runtime/agents/workers/report-writer-worker.md +1 -1
- package/runtime/bin/lib/okstra/cli.sh +4 -0
- package/runtime/bin/lib/okstra/globals.sh +2 -0
- package/runtime/bin/lib/okstra/interactive.sh +26 -173
- package/runtime/bin/lib/okstra/project-resolver.sh +23 -61
- package/runtime/bin/lib/okstra/usage.sh +3 -3
- package/runtime/bin/okstra-compact-reminder.sh +1 -5
- package/runtime/bin/okstra-error-log.py +19 -2
- package/runtime/bin/okstra-import-check.py +26 -0
- package/runtime/bin/okstra-inject-report-index.py +5 -4
- package/runtime/bin/okstra-provider-exec.py +22 -17
- package/runtime/bin/okstra-render-final-report.py +16 -6
- package/runtime/bin/okstra-render-report-views.py +47 -22
- package/runtime/bin/okstra-report-translate.py +30 -18
- package/runtime/bin/okstra-spawn-followups.py +4 -0
- package/runtime/bin/okstra-token-usage.py +3 -0
- package/runtime/bin/okstra.sh +4 -2
- package/runtime/bin/okstra_bootstrap.py +58 -0
- package/runtime/prompts/coding-preflight/overview.md +1 -1
- package/runtime/prompts/duties/planning-worker.md +1 -1
- package/runtime/prompts/launch.template.md +35 -9
- package/runtime/prompts/lead/adapters/cmux.md +3 -3
- package/runtime/prompts/lead/convergence.md +99 -88
- package/runtime/prompts/lead/okstra-lead-contract.md +63 -12
- package/runtime/prompts/lead/plan-body-verification.md +65 -46
- package/runtime/prompts/lead/report-writer.md +35 -5
- package/runtime/prompts/lead/team-contract.md +4 -1
- package/runtime/prompts/profiles/_clarification-recommendation.md +2 -1
- package/runtime/prompts/profiles/_coding-conventions-preflight.md +1 -1
- package/runtime/prompts/profiles/_common-contract.md +3 -3
- package/runtime/prompts/profiles/_coverage-critic.md +1 -1
- package/runtime/prompts/profiles/_implementation-deliverable.md +2 -2
- package/runtime/prompts/profiles/_implementation-executor.md +3 -1
- package/runtime/prompts/profiles/_implementation-verifier.md +16 -2
- package/runtime/prompts/profiles/error-analysis.md +4 -3
- package/runtime/prompts/profiles/final-verification.md +2 -2
- package/runtime/prompts/profiles/implementation-planning.md +22 -17
- package/runtime/prompts/profiles/implementation.md +3 -2
- package/runtime/prompts/profiles/requirements-discovery.md +2 -1
- package/runtime/prompts/wizard/prompts.ko.json +29 -8
- package/runtime/python/okstra_ctl/__init__.py +6 -27
- package/runtime/python/okstra_ctl/adapters/hosts/claude-code/relay.md +4 -5
- package/runtime/python/okstra_ctl/adapters/hosts/codex/adapter.py +21 -2
- package/runtime/python/okstra_ctl/adapters/hosts/external/adapter.py +3 -12
- package/runtime/python/okstra_ctl/adapters/providers/antigravity/adapter.py +63 -22
- package/runtime/python/okstra_ctl/adapters/providers/claude/adapter.py +20 -21
- package/runtime/python/okstra_ctl/adapters/providers/codex/adapter.py +37 -20
- package/runtime/python/okstra_ctl/adapters/providers/grok/adapter.py +86 -14
- package/runtime/python/okstra_ctl/adapters/providers/kimi/adapter.py +12 -12
- package/runtime/python/okstra_ctl/adapters/runtime/cmux.py +4 -7
- package/runtime/python/okstra_ctl/agent/__init__.py +1 -0
- package/runtime/python/okstra_ctl/{agent_activity.py → agent/activity.py} +16 -2
- package/runtime/python/okstra_ctl/{agent_invocation.py → agent/invocation.py} +34 -5
- package/runtime/python/okstra_ctl/agent/prompt_cli/__init__.py +19 -0
- package/runtime/python/okstra_ctl/agent/prompt_cli/__main__.py +11 -0
- package/runtime/python/okstra_ctl/agent/prompt_cli/cli.py +228 -0
- package/runtime/python/okstra_ctl/agent/prompt_cli/dynamic_verifier.py +155 -0
- package/runtime/python/okstra_ctl/agent/prompt_cli/emit.py +66 -0
- package/runtime/python/okstra_ctl/agent/prompt_cli/inputs.py +138 -0
- package/runtime/python/okstra_ctl/agent/prompt_cli/materialize.py +605 -0
- package/runtime/python/okstra_ctl/agent/prompt_cli/results.py +197 -0
- package/runtime/python/okstra_ctl/agent/prompt_cli/run_identity.py +107 -0
- package/runtime/python/okstra_ctl/analysis_packet.py +47 -4
- package/runtime/python/okstra_ctl/approval_decisions.py +287 -10
- package/runtime/python/okstra_ctl/assignment_resolver.py +0 -12
- package/runtime/python/okstra_ctl/attempt_evidence.py +12 -24
- package/runtime/python/okstra_ctl/blocking_checks.py +251 -0
- package/runtime/python/okstra_ctl/brief_frontmatter.py +0 -7
- package/runtime/python/okstra_ctl/clarification_items/__init__.py +102 -0
- package/runtime/python/okstra_ctl/clarification_items/carry.py +224 -0
- package/runtime/python/okstra_ctl/clarification_items/dispositions.py +135 -0
- package/runtime/python/okstra_ctl/clarification_items/parsing.py +253 -0
- package/runtime/python/okstra_ctl/clarification_items/rows.py +115 -0
- package/runtime/python/okstra_ctl/clarification_items/scan.py +215 -0
- package/runtime/python/okstra_ctl/clarification_items/sidecars.py +211 -0
- package/runtime/python/okstra_ctl/cmux.py +38 -31
- package/runtime/python/okstra_ctl/code_review_target.py +163 -1
- package/runtime/python/okstra_ctl/conformance.py +23 -0
- package/runtime/python/okstra_ctl/container.py +38 -421
- package/runtime/python/okstra_ctl/context_cost.py +32 -4
- package/runtime/python/okstra_ctl/contract_graph_cli.py +7 -0
- package/runtime/python/okstra_ctl/convergence.py +107 -16
- package/runtime/python/okstra_ctl/convergence_critic_prompt.py +345 -0
- package/runtime/python/okstra_ctl/convergence_engine.py +382 -70
- package/runtime/python/okstra_ctl/convergence_store.py +5 -29
- package/runtime/python/okstra_ctl/design_prep.py +108 -12
- package/runtime/python/okstra_ctl/design_snapshot.py +11 -1
- package/runtime/python/okstra_ctl/design_surfaces.py +29 -2
- package/runtime/python/okstra_ctl/dispatch_core.py +236 -49
- package/runtime/python/okstra_ctl/dispatch_state.py +417 -41
- package/runtime/python/okstra_ctl/doctor_cli.py +48 -0
- package/runtime/python/okstra_ctl/domain/worker_exec.py +10 -5
- package/runtime/python/okstra_ctl/domain/worker_presentation.py +28 -1
- package/runtime/python/okstra_ctl/domain/worker_stream.py +52 -21
- package/runtime/python/okstra_ctl/domain/write_policy.py +219 -0
- package/runtime/python/okstra_ctl/entrypoints/hosts.py +9 -2
- package/runtime/python/okstra_ctl/error_log_core.py +1 -1
- package/runtime/python/okstra_ctl/error_report.py +14 -0
- package/runtime/python/okstra_ctl/error_zip.py +18 -2
- package/runtime/python/okstra_ctl/exact_coverage.py +5 -0
- package/runtime/python/okstra_ctl/execution_identity.py +100 -7
- package/runtime/python/okstra_ctl/execution_manifest.py +67 -20
- package/runtime/python/okstra_ctl/execution_mutation_audit.py +90 -8
- package/runtime/python/okstra_ctl/final_report_paths.py +17 -0
- package/runtime/python/okstra_ctl/final_report_schema.py +319 -17
- package/runtime/python/okstra_ctl/git_reconcile.py +22 -2
- package/runtime/python/okstra_ctl/handoff.py +24 -1
- package/runtime/python/okstra_ctl/ids.py +6 -16
- package/runtime/python/okstra_ctl/implementation_direction.py +142 -33
- package/runtime/python/okstra_ctl/implementation_options.py +32 -13
- package/runtime/python/okstra_ctl/implementation_outcome.py +5 -2
- package/runtime/python/okstra_ctl/improvement_lenses.py +0 -14
- package/runtime/python/okstra_ctl/incremental_carry.py +69 -8
- package/runtime/python/okstra_ctl/incremental_scope.py +173 -12
- package/runtime/python/okstra_ctl/index.py +2 -2
- package/runtime/python/okstra_ctl/initial_prompt_materialization.py +48 -8
- package/runtime/python/okstra_ctl/interactive_cli.py +223 -0
- package/runtime/python/okstra_ctl/json_boundary.py +10 -0
- package/runtime/python/okstra_ctl/listing.py +0 -91
- package/runtime/python/okstra_ctl/locks.py +5 -19
- package/runtime/python/okstra_ctl/log_report.py +14 -0
- package/runtime/python/okstra_ctl/manager_cli.py +22 -3
- package/runtime/python/okstra_ctl/manager_launch.py +4 -8
- package/runtime/python/okstra_ctl/material.py +2 -2
- package/runtime/python/okstra_ctl/migrate.py +23 -1
- package/runtime/python/okstra_ctl/model_cli.py +19 -5
- package/runtime/python/okstra_ctl/model_discovery.py +46 -47
- package/runtime/python/okstra_ctl/model_io/__init__.py +1 -0
- package/runtime/python/okstra_ctl/model_io/lines.py +163 -0
- package/runtime/python/okstra_ctl/model_io/references.py +370 -0
- package/runtime/python/okstra_ctl/model_io/renderers.py +498 -0
- package/runtime/python/okstra_ctl/model_io_cli.py +30 -945
- package/runtime/python/okstra_ctl/model_pool.py +10 -6
- package/runtime/python/okstra_ctl/models.py +8 -8
- package/runtime/python/okstra_ctl/mutation_recovery.py +5 -63
- package/runtime/python/okstra_ctl/next_phase.py +121 -69
- package/runtime/python/okstra_ctl/pane_reclaim.py +23 -0
- package/runtime/python/okstra_ctl/pane_title.py +11 -8
- package/runtime/python/okstra_ctl/path_hints.py +36 -11
- package/runtime/python/okstra_ctl/paths.py +76 -8
- package/runtime/python/okstra_ctl/plan_items.py +132 -16
- package/runtime/python/okstra_ctl/plan_items_cli.py +486 -36
- package/runtime/python/okstra_ctl/plan_run_root.py +1 -1
- package/runtime/python/okstra_ctl/plan_validate_cli.py +51 -0
- package/runtime/python/okstra_ctl/plan_verify_cli.py +80 -0
- package/runtime/python/okstra_ctl/prepare_error.py +20 -0
- package/runtime/python/okstra_ctl/prior_planning.py +157 -0
- package/runtime/python/okstra_ctl/profile_show.py +18 -1
- package/runtime/python/okstra_ctl/project_setup_cli.py +140 -0
- package/runtime/python/okstra_ctl/recap.py +22 -1
- package/runtime/python/okstra_ctl/reconcile.py +84 -0
- package/runtime/python/okstra_ctl/registry/host_registry.py +18 -1
- package/runtime/python/okstra_ctl/render.py +98 -32
- package/runtime/python/okstra_ctl/render_final_report.py +4 -8
- package/runtime/python/okstra_ctl/report_assembly.py +297 -7
- package/runtime/python/okstra_ctl/report_contract.py +30 -7
- package/runtime/python/okstra_ctl/report_finalize.py +213 -16
- package/runtime/python/okstra_ctl/report_html/common.py +2 -2
- package/runtime/python/okstra_ctl/report_html/render.py +8 -12
- package/runtime/python/okstra_ctl/report_language.py +8 -4
- package/runtime/python/okstra_ctl/report_narrative.py +220 -34
- package/runtime/python/okstra_ctl/report_projections.py +8 -2
- package/runtime/python/okstra_ctl/report_synthesis_packet.py +393 -1
- package/runtime/python/okstra_ctl/report_translation.py +2 -35
- package/runtime/python/okstra_ctl/report_view_artifacts.py +42 -2
- package/runtime/python/okstra_ctl/report_views.py +4 -22
- package/runtime/python/okstra_ctl/resolve_task_key.py +13 -0
- package/runtime/python/okstra_ctl/rollup.py +13 -0
- package/runtime/python/okstra_ctl/run.py +639 -138
- package/runtime/python/okstra_ctl/run_audit.py +13 -0
- package/runtime/python/okstra_ctl/run_index_row.py +0 -12
- package/runtime/python/okstra_ctl/seeding.py +21 -11
- package/runtime/python/okstra_ctl/sequence.py +1 -1
- package/runtime/python/okstra_ctl/session.py +64 -14
- package/runtime/python/okstra_ctl/set_work_status.py +18 -0
- package/runtime/python/okstra_ctl/stage_integrate.py +15 -1
- package/runtime/python/okstra_ctl/stage_ledger.py +1 -1
- package/runtime/python/okstra_ctl/stage_map.py +57 -11
- package/runtime/python/okstra_ctl/stage_map_cli.py +83 -0
- package/runtime/python/okstra_ctl/stage_map_view.py +65 -0
- package/runtime/python/okstra_ctl/stage_targets.py +3 -12
- package/runtime/python/okstra_ctl/task_list_cli.py +138 -0
- package/runtime/python/okstra_ctl/task_show_cli.py +66 -0
- package/runtime/python/okstra_ctl/task_target.py +4 -16
- package/runtime/python/okstra_ctl/team.py +49 -2
- package/runtime/python/okstra_ctl/time_report.py +17 -2
- package/runtime/python/okstra_ctl/usage_report.py +11 -0
- package/runtime/python/okstra_ctl/user_response.py +55 -218
- package/runtime/python/okstra_ctl/user_response_values.py +242 -0
- package/runtime/python/okstra_ctl/validation_contract.py +3 -0
- package/runtime/python/okstra_ctl/verdict_blocks.py +28 -8
- package/runtime/python/okstra_ctl/verification_target.py +68 -0
- package/runtime/python/okstra_ctl/wizard.py +457 -92
- package/runtime/python/okstra_ctl/worker_artifacts.py +75 -16
- package/runtime/python/okstra_ctl/worker_audit_check.py +22 -0
- package/runtime/python/okstra_ctl/worker_dispatch.py +21 -0
- package/runtime/python/okstra_ctl/worker_liveness.py +33 -0
- package/runtime/python/okstra_ctl/worker_prompt_body.py +15 -2
- package/runtime/python/okstra_ctl/worker_prompt_contract.py +98 -7
- package/runtime/python/okstra_ctl/worker_prompt_headers.py +24 -2
- package/runtime/python/okstra_ctl/worker_prompt_policy.py +18 -3
- package/runtime/python/okstra_ctl/worker_request.py +2 -1
- package/runtime/python/okstra_ctl/worker_runner.py +58 -17
- package/runtime/python/okstra_ctl/worker_state.py +16 -1
- package/runtime/python/okstra_ctl/workflow.py +18 -1
- package/runtime/python/okstra_ctl/worktree/__init__.py +92 -0
- package/runtime/python/okstra_ctl/worktree/cleanliness.py +89 -0
- package/runtime/python/okstra_ctl/worktree/decisions.py +127 -0
- package/runtime/python/okstra_ctl/worktree/git_ops.py +165 -0
- package/runtime/python/okstra_ctl/worktree/linking.py +249 -0
- package/runtime/python/okstra_ctl/worktree/naming.py +91 -0
- package/runtime/python/okstra_ctl/worktree/provision.py +385 -0
- package/runtime/python/okstra_ctl/worktree/sync_config.py +181 -0
- package/runtime/python/okstra_ctl/worktree_cli.py +75 -0
- package/runtime/python/okstra_ctl/worktree_lookup_cli.py +39 -0
- package/runtime/python/okstra_ctl/worktree_registry.py +7 -0
- package/runtime/python/okstra_ctl/worktree_status_cli.py +53 -0
- package/runtime/python/okstra_ctl/write_policy.py +90 -213
- package/runtime/python/okstra_project/__init__.py +0 -4
- package/runtime/python/okstra_project/dirs.py +2 -2
- package/runtime/python/okstra_project/phase_pointer.py +84 -0
- package/runtime/python/okstra_project/slug.py +24 -0
- package/runtime/python/okstra_project/state.py +22 -230
- package/runtime/python/okstra_token_usage/antigravity.py +50 -12
- package/runtime/python/okstra_token_usage/claude.py +9 -1
- package/runtime/python/okstra_token_usage/cli.py +3 -1
- package/runtime/python/okstra_token_usage/collect.py +171 -36
- package/runtime/python/okstra_token_usage/cursor.py +2 -0
- package/runtime/python/okstra_token_usage/grok.py +1 -5
- package/runtime/python/okstra_token_usage/paths.py +26 -0
- package/runtime/python/okstra_token_usage/pricing.py +23 -8
- package/runtime/schemas/convergence-critic-results-v1.0.schema.json +5 -0
- package/runtime/schemas/execution-manifest-v2.schema.json +10 -10
- package/runtime/schemas/final-report-v2.0.schema.json +9 -26
- package/runtime/schemas/final-report-v3.0.schema.json +173 -41
- package/runtime/schemas/report-narrative-v3.0.schema.json +3 -2
- package/runtime/skills/okstra-brief-gen/SKILL.md +35 -2
- package/runtime/skills/okstra-container-build/SKILL.md +16 -47
- package/runtime/skills/okstra-inspect/facets/history.md +1 -1
- package/runtime/skills/okstra-inspect/facets/status.md +7 -6
- package/runtime/skills/okstra-pr-gen/SKILL.md +1 -1
- package/runtime/skills/okstra-run/SKILL.md +7 -5
- package/runtime/templates/report-writer-prompt-preamble.md +3 -1
- package/runtime/templates/reports/brief.template.md +6 -2
- package/runtime/templates/reports/error-analysis-input.template.md +2 -0
- package/runtime/templates/reports/final-verification-input.template.md +2 -0
- package/runtime/templates/reports/implementation-input.template.md +7 -1
- package/runtime/templates/reports/implementation-planning-input.template.md +4 -0
- package/runtime/templates/reports/quick-input.template.md +2 -0
- package/runtime/templates/reports/release-handoff-input.template.md +6 -1
- package/runtime/templates/reports/report.js +20 -3
- package/runtime/templates/reports/schedule.template.md +2 -0
- package/runtime/templates/reports/settings.template.json +0 -10
- package/runtime/templates/reports/task-brief.template.md +3 -0
- package/runtime/templates/reports/user-response.template.md +7 -3
- package/runtime/validators/checks/fixtures-01.py +57 -0
- package/runtime/validators/checks/fixtures-02.py +565 -0
- package/runtime/validators/checks/runners-01.py +108 -0
- package/runtime/validators/checks/validate-assets-01.py +60 -0
- package/runtime/validators/checks/validate-prompt-metadata-01.py +261 -0
- package/runtime/validators/checks/validate-tasks-01.py +46 -0
- package/runtime/validators/checks/validate-tasks-02.py +85 -0
- package/runtime/validators/checks/validate-tasks-03.py +61 -0
- package/runtime/validators/checks/validate-tasks-04.py +118 -0
- package/runtime/validators/forbidden_actions.py +73 -3
- package/runtime/validators/lib/common.sh +5 -0
- package/runtime/validators/lib/fixtures.sh +7 -591
- package/runtime/validators/lib/paths.sh +13 -0
- package/runtime/validators/lib/runners.sh +6 -104
- package/runtime/validators/lib/summary.sh +1 -1
- package/runtime/validators/lib/validate-assets.sh +6 -56
- package/runtime/validators/lib/validate-prompt-metadata.sh +6 -257
- package/runtime/validators/lib/validate-tasks.sh +9 -294
- package/runtime/validators/validate-implementation-plan-stages.py +4 -4
- package/runtime/validators/validate-run.py +1363 -2643
- package/runtime/validators/validate-workflow.sh +56 -16
- package/runtime/validators/validate_improvement_report.py +2 -1
- package/runtime/validators/validate_session_conformance.py +295 -49
- package/dist/commands/execute/agent-prompt.d.mts +0 -1
- package/dist/commands/execute/agent-prompt.mjs +0 -24
- package/dist/commands/execute/agent-prompt.mjs.map +0 -1
- package/dist/commands/execute/codex-dispatch.d.mts +0 -3
- package/dist/commands/execute/codex-dispatch.mjs +0 -6
- package/dist/commands/execute/codex-dispatch.mjs.map +0 -1
- package/dist/commands/execute/codex-run.d.mts +0 -3
- package/dist/commands/execute/codex-run.mjs +0 -62
- package/dist/commands/execute/codex-run.mjs.map +0 -1
- package/dist/commands/execute/convergence.d.mts +0 -1
- package/dist/commands/execute/convergence.mjs +0 -38
- package/dist/commands/execute/convergence.mjs.map +0 -1
- package/dist/commands/execute/error-log.d.mts +0 -1
- package/dist/commands/execute/error-log.mjs +0 -18
- package/dist/commands/execute/error-log.mjs.map +0 -1
- package/dist/commands/execute/git-reconcile.d.mts +0 -1
- package/dist/commands/execute/git-reconcile.mjs +0 -30
- package/dist/commands/execute/git-reconcile.mjs.map +0 -1
- package/dist/commands/execute/handoff.d.mts +0 -1
- package/dist/commands/execute/handoff.mjs +0 -31
- package/dist/commands/execute/handoff.mjs.map +0 -1
- package/dist/commands/execute/incremental-carry.d.mts +0 -1
- package/dist/commands/execute/incremental-carry.mjs +0 -20
- package/dist/commands/execute/incremental-carry.mjs.map +0 -1
- package/dist/commands/execute/incremental-scope.d.mts +0 -1
- package/dist/commands/execute/incremental-scope.mjs +0 -29
- package/dist/commands/execute/incremental-scope.mjs.map +0 -1
- package/dist/commands/execute/integrate-stages.d.mts +0 -1
- package/dist/commands/execute/integrate-stages.mjs +0 -24
- package/dist/commands/execute/integrate-stages.mjs.map +0 -1
- package/dist/commands/execute/pane-title.d.mts +0 -1
- package/dist/commands/execute/pane-title.mjs +0 -20
- package/dist/commands/execute/pane-title.mjs.map +0 -1
- package/dist/commands/execute/plan-items.d.mts +0 -1
- package/dist/commands/execute/plan-items.mjs +0 -9
- package/dist/commands/execute/plan-items.mjs.map +0 -1
- package/dist/commands/execute/plan-validate.d.mts +0 -1
- package/dist/commands/execute/plan-validate.mjs +0 -68
- package/dist/commands/execute/plan-validate.mjs.map +0 -1
- package/dist/commands/execute/plan-verify.d.mts +0 -1
- package/dist/commands/execute/plan-verify.mjs +0 -43
- package/dist/commands/execute/plan-verify.mjs.map +0 -1
- package/dist/commands/execute/spawn-followups.d.mts +0 -1
- package/dist/commands/execute/spawn-followups.mjs +0 -22
- package/dist/commands/execute/spawn-followups.mjs.map +0 -1
- package/dist/commands/execute/team.d.mts +0 -3
- package/dist/commands/execute/team.mjs +0 -66
- package/dist/commands/execute/team.mjs.map +0 -1
- package/dist/commands/execute/token-usage.d.mts +0 -1
- package/dist/commands/execute/token-usage.mjs +0 -19
- package/dist/commands/execute/token-usage.mjs.map +0 -1
- package/dist/commands/execute/worker-audit-check.d.mts +0 -1
- package/dist/commands/execute/worker-audit-check.mjs +0 -34
- package/dist/commands/execute/worker-audit-check.mjs.map +0 -1
- package/dist/commands/execute/worker-dispatch.d.mts +0 -7
- package/dist/commands/execute/worker-dispatch.mjs +0 -64
- package/dist/commands/execute/worker-dispatch.mjs.map +0 -1
- package/dist/commands/execute/worker-state.d.mts +0 -1
- package/dist/commands/execute/worker-state.mjs +0 -28
- package/dist/commands/execute/worker-state.mjs.map +0 -1
- package/dist/commands/execute/worktree-lookup.d.mts +0 -1
- package/dist/commands/execute/worktree-lookup.mjs +0 -92
- package/dist/commands/execute/worktree-lookup.mjs.map +0 -1
- package/dist/commands/execute/worktree-status.d.mts +0 -1
- package/dist/commands/execute/worktree-status.mjs +0 -121
- package/dist/commands/execute/worktree-status.mjs.map +0 -1
- package/dist/commands/inspect/code-review.d.mts +0 -1
- package/dist/commands/inspect/code-review.mjs +0 -32
- package/dist/commands/inspect/code-review.mjs.map +0 -1
- package/dist/commands/inspect/container.d.mts +0 -1
- package/dist/commands/inspect/container.mjs +0 -25
- package/dist/commands/inspect/container.mjs.map +0 -1
- package/dist/commands/inspect/context-cost.d.mts +0 -1
- package/dist/commands/inspect/context-cost.mjs +0 -25
- package/dist/commands/inspect/context-cost.mjs.map +0 -1
- package/dist/commands/inspect/design-prep.d.mts +0 -1
- package/dist/commands/inspect/design-prep.mjs +0 -22
- package/dist/commands/inspect/design-prep.mjs.map +0 -1
- package/dist/commands/inspect/error-report.d.mts +0 -1
- package/dist/commands/inspect/error-report.mjs +0 -25
- package/dist/commands/inspect/error-report.mjs.map +0 -1
- package/dist/commands/inspect/error-zip.d.mts +0 -1
- package/dist/commands/inspect/error-zip.mjs +0 -24
- package/dist/commands/inspect/error-zip.mjs.map +0 -1
- package/dist/commands/inspect/log-report.d.mts +0 -1
- package/dist/commands/inspect/log-report.mjs +0 -26
- package/dist/commands/inspect/log-report.mjs.map +0 -1
- package/dist/commands/inspect/model-io.d.mts +0 -1
- package/dist/commands/inspect/model-io.mjs +0 -25
- package/dist/commands/inspect/model-io.mjs.map +0 -1
- package/dist/commands/inspect/profile-show.d.mts +0 -1
- package/dist/commands/inspect/profile-show.mjs +0 -28
- package/dist/commands/inspect/profile-show.mjs.map +0 -1
- package/dist/commands/inspect/recap.d.mts +0 -1
- package/dist/commands/inspect/recap.mjs +0 -30
- package/dist/commands/inspect/recap.mjs.map +0 -1
- package/dist/commands/inspect/resolve-task-key.d.mts +0 -1
- package/dist/commands/inspect/resolve-task-key.mjs +0 -24
- package/dist/commands/inspect/resolve-task-key.mjs.map +0 -1
- package/dist/commands/inspect/rollup.d.mts +0 -1
- package/dist/commands/inspect/rollup.mjs +0 -25
- package/dist/commands/inspect/rollup.mjs.map +0 -1
- package/dist/commands/inspect/run-audit.d.mts +0 -1
- package/dist/commands/inspect/run-audit.mjs +0 -25
- package/dist/commands/inspect/run-audit.mjs.map +0 -1
- package/dist/commands/inspect/set-work-status.d.mts +0 -1
- package/dist/commands/inspect/set-work-status.mjs +0 -29
- package/dist/commands/inspect/set-work-status.mjs.map +0 -1
- package/dist/commands/inspect/stage-map.d.mts +0 -1
- package/dist/commands/inspect/stage-map.mjs +0 -131
- package/dist/commands/inspect/stage-map.mjs.map +0 -1
- package/dist/commands/inspect/task-list.d.mts +0 -1
- package/dist/commands/inspect/task-list.mjs +0 -149
- package/dist/commands/inspect/task-list.mjs.map +0 -1
- package/dist/commands/inspect/task-show.d.mts +0 -1
- package/dist/commands/inspect/task-show.mjs +0 -108
- package/dist/commands/inspect/task-show.mjs.map +0 -1
- package/dist/commands/inspect/time-report.d.mts +0 -1
- package/dist/commands/inspect/time-report.mjs +0 -24
- package/dist/commands/inspect/time-report.mjs.map +0 -1
- package/dist/commands/inspect/usage-report.d.mts +0 -1
- package/dist/commands/inspect/usage-report.mjs +0 -23
- package/dist/commands/inspect/usage-report.mjs.map +0 -1
- package/dist/commands/inspect/user-response.d.mts +0 -1
- package/dist/commands/inspect/user-response.mjs +0 -35
- package/dist/commands/inspect/user-response.mjs.map +0 -1
- package/dist/commands/inspect/worker-liveness.d.mts +0 -1
- package/dist/commands/inspect/worker-liveness.mjs +0 -45
- package/dist/commands/inspect/worker-liveness.mjs.map +0 -1
- package/dist/commands/lifecycle/contract-check.d.mts +0 -1
- package/dist/commands/lifecycle/contract-check.mjs +0 -18
- package/dist/commands/lifecycle/contract-check.mjs.map +0 -1
- package/dist/commands/lifecycle/migrate.d.mts +0 -1
- package/dist/commands/lifecycle/migrate.mjs +0 -30
- package/dist/commands/lifecycle/migrate.mjs.map +0 -1
- package/dist/commands/lifecycle/model.d.mts +0 -1
- package/dist/commands/lifecycle/model.mjs +0 -22
- package/dist/commands/lifecycle/model.mjs.map +0 -1
- package/dist/commands/manager.d.mts +0 -3
- package/dist/commands/manager.mjs +0 -50
- package/dist/commands/manager.mjs.map +0 -1
- package/dist/commands/report/agent-activity.d.mts +0 -1
- package/dist/commands/report/agent-activity.mjs +0 -20
- package/dist/commands/report/agent-activity.mjs.map +0 -1
- package/dist/commands/report/approval-decision.d.mts +0 -1
- package/dist/commands/report/approval-decision.mjs +0 -21
- package/dist/commands/report/approval-decision.mjs.map +0 -1
- package/dist/commands/report/design-snapshot.d.mts +0 -1
- package/dist/commands/report/design-snapshot.mjs +0 -19
- package/dist/commands/report/design-snapshot.mjs.map +0 -1
- package/dist/commands/report/finalize.d.mts +0 -4
- package/dist/commands/report/finalize.mjs +0 -64
- package/dist/commands/report/finalize.mjs.map +0 -1
- package/dist/commands/report/inject-report-index.d.mts +0 -1
- package/dist/commands/report/inject-report-index.mjs +0 -21
- package/dist/commands/report/inject-report-index.mjs.map +0 -1
- package/dist/commands/report/render-final-report.d.mts +0 -1
- package/dist/commands/report/render-final-report.mjs +0 -23
- package/dist/commands/report/render-final-report.mjs.map +0 -1
- package/dist/commands/report/render-views.d.mts +0 -1
- package/dist/commands/report/render-views.mjs +0 -27
- package/dist/commands/report/render-views.mjs.map +0 -1
- package/dist/commands/report/translate.d.mts +0 -1
- package/dist/commands/report/translate.mjs +0 -33
- package/dist/commands/report/translate.mjs.map +0 -1
- package/runtime/bin/lib/okstra/tmux-pane.sh +0 -40
- package/runtime/bin/lib/okstra-ctl/cmd-batch.sh +0 -59
- package/runtime/bin/lib/okstra-ctl/cmd-list.sh +0 -35
- package/runtime/bin/lib/okstra-ctl/cmd-open.sh +0 -36
- package/runtime/bin/lib/okstra-ctl/cmd-projects.sh +0 -26
- package/runtime/bin/lib/okstra-ctl/cmd-reconcile.sh +0 -29
- package/runtime/bin/lib/okstra-ctl/cmd-reindex.sh +0 -38
- package/runtime/bin/lib/okstra-ctl/cmd-rerun.sh +0 -345
- package/runtime/bin/lib/okstra-ctl/cmd-show.sh +0 -27
- package/runtime/bin/lib/okstra-ctl/cmd-tail.sh +0 -92
- package/runtime/bin/lib/okstra-ctl/main.sh +0 -41
- package/runtime/bin/lib/okstra-ctl/prepare.sh +0 -31
- package/runtime/bin/lib/okstra-ctl/usage.sh +0 -23
- package/runtime/bin/okstra-central.sh +0 -152
- package/runtime/bin/okstra-incremental-carry.py +0 -10
- package/runtime/bin/okstra-incremental-scope.py +0 -10
- package/runtime/bin/okstra-team-reconcile.sh +0 -36
- package/runtime/python/okstra_ctl/agent_prompt_cli.py +0 -1156
- package/runtime/python/okstra_ctl/batch.py +0 -60
- package/runtime/python/okstra_ctl/clarification_items.py +0 -1050
- package/runtime/python/okstra_ctl/container_registry.py +0 -72
- package/runtime/python/okstra_ctl/improvement_assignment.py +0 -61
- package/runtime/python/okstra_ctl/resolver.py +0 -54
- package/runtime/python/okstra_ctl/team_reconcile.py +0 -275
- package/runtime/python/okstra_ctl/tmux.py +0 -134
- package/runtime/python/okstra_ctl/worktree.py +0 -1099
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"""찍어 낸 명세와 워커가 낸 결과를 잇는다.
|
|
2
|
+
|
|
3
|
+
materialize 가 만든 명세에 대해, 이 층은 그 뒤에 오는 것들을 다룬다 — 디스패치
|
|
4
|
+
기록, 결과 링크, 거절, 완료 표시, 검증. 전부 이미 존재하는 명세를 전제하고,
|
|
5
|
+
새 명세를 만들지 않는다.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
from datetime import datetime, timezone
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
from ..invocation import (
|
|
14
|
+
AgentModelAssignment,
|
|
15
|
+
agent_model_assignment_from_payload,
|
|
16
|
+
materialize_standalone_result,
|
|
17
|
+
publish_standalone_completion,
|
|
18
|
+
verify_standalone_completion,
|
|
19
|
+
verify_agent_invocation,
|
|
20
|
+
)
|
|
21
|
+
from ...dispatch_state import (
|
|
22
|
+
link_agent_dispatch_result,
|
|
23
|
+
record_verified_agent_dispatch,
|
|
24
|
+
abandon_agent_dispatch_attempt,
|
|
25
|
+
reject_agent_dispatch_result,
|
|
26
|
+
)
|
|
27
|
+
from .emit import _emit
|
|
28
|
+
from .inputs import (
|
|
29
|
+
AgentPromptCliError,
|
|
30
|
+
_is_relative_to,
|
|
31
|
+
_mapping,
|
|
32
|
+
_project_input,
|
|
33
|
+
_project_root,
|
|
34
|
+
_read_json_object,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _record_dispatch(args: argparse.Namespace) -> None:
|
|
39
|
+
project_root = _project_root(args.project_root)
|
|
40
|
+
record = record_verified_agent_dispatch(
|
|
41
|
+
project_root=project_root,
|
|
42
|
+
run_manifest_path=_project_input(
|
|
43
|
+
project_root, args.run_manifest, "run manifest"
|
|
44
|
+
),
|
|
45
|
+
metadata_path=_project_input(
|
|
46
|
+
project_root, args.metadata, "agent invocation metadata"
|
|
47
|
+
),
|
|
48
|
+
enforcement_mode=args.enforcement_mode,
|
|
49
|
+
)
|
|
50
|
+
_emit(record, args.json)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _reject_result(args: argparse.Namespace) -> None:
|
|
54
|
+
project_root = _project_root(args.project_root)
|
|
55
|
+
row = reject_agent_dispatch_result(
|
|
56
|
+
project_root=project_root,
|
|
57
|
+
run_manifest_path=_project_input(
|
|
58
|
+
project_root, args.run_manifest, "run manifest"
|
|
59
|
+
),
|
|
60
|
+
dispatch_id=args.dispatch_id,
|
|
61
|
+
superseded_by=args.superseded_by,
|
|
62
|
+
reason=args.reason,
|
|
63
|
+
)
|
|
64
|
+
_emit(row, args.json)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _abandon_attempt(args: argparse.Namespace) -> None:
|
|
68
|
+
project_root = _project_root(args.project_root)
|
|
69
|
+
row = abandon_agent_dispatch_attempt(
|
|
70
|
+
project_root=project_root,
|
|
71
|
+
run_manifest_path=_project_input(
|
|
72
|
+
project_root, args.run_manifest, "run manifest"
|
|
73
|
+
),
|
|
74
|
+
invocation_ref=args.invocation_ref,
|
|
75
|
+
reason=args.reason,
|
|
76
|
+
)
|
|
77
|
+
_emit(row, args.json)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _link_result(args: argparse.Namespace) -> None:
|
|
81
|
+
project_root = _project_root(args.project_root)
|
|
82
|
+
link = link_agent_dispatch_result(
|
|
83
|
+
project_root=project_root,
|
|
84
|
+
run_manifest_path=_project_input(
|
|
85
|
+
project_root, args.run_manifest, "run manifest"
|
|
86
|
+
),
|
|
87
|
+
dispatch_id=args.dispatch_id,
|
|
88
|
+
result_path=_project_input(project_root, args.result, "agent result"),
|
|
89
|
+
)
|
|
90
|
+
_emit(link, args.json)
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def _verify(args: argparse.Namespace) -> None:
|
|
94
|
+
project_root = _project_root(args.project_root)
|
|
95
|
+
metadata_path = _project_input(project_root, args.metadata, "metadata")
|
|
96
|
+
metadata = _read_json_object(metadata_path, "metadata")
|
|
97
|
+
contract_source = _mapping(metadata.get("contractSource"), "contract source")
|
|
98
|
+
mode = contract_source.get("mode")
|
|
99
|
+
expected_manifest: Path | None = None
|
|
100
|
+
expected_assignment: AgentModelAssignment | None = None
|
|
101
|
+
if mode == "run":
|
|
102
|
+
if not args.run_manifest:
|
|
103
|
+
raise AgentPromptCliError("run invocation verification requires --run-manifest")
|
|
104
|
+
expected_manifest = _project_input(project_root, args.run_manifest, "run manifest")
|
|
105
|
+
manifest = _read_json_object(expected_manifest, "run manifest")
|
|
106
|
+
assignments = _mapping(manifest.get("invocationAssignments"), "run assignments")
|
|
107
|
+
reference = metadata.get("assignmentRef")
|
|
108
|
+
if not isinstance(reference, str) or reference not in assignments:
|
|
109
|
+
raise AgentPromptCliError("assignment reference is missing from run manifest")
|
|
110
|
+
expected_assignment = agent_model_assignment_from_payload(assignments[reference])
|
|
111
|
+
elif mode == "standalone":
|
|
112
|
+
if args.run_manifest:
|
|
113
|
+
raise AgentPromptCliError("standalone invocation verification forbids --run-manifest")
|
|
114
|
+
else:
|
|
115
|
+
raise AgentPromptCliError("contract source mode is invalid")
|
|
116
|
+
errors = verify_agent_invocation(
|
|
117
|
+
metadata_path,
|
|
118
|
+
project_root=project_root,
|
|
119
|
+
expected_run_manifest_path=expected_manifest,
|
|
120
|
+
expected_assignment=expected_assignment,
|
|
121
|
+
)
|
|
122
|
+
if errors:
|
|
123
|
+
raise AgentPromptCliError("; ".join(errors))
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _materialize_result(args: argparse.Namespace) -> None:
|
|
127
|
+
project_root = _project_root(args.project_root)
|
|
128
|
+
metadata_path = _project_input(project_root, args.metadata, "metadata")
|
|
129
|
+
root = project_root / ".okstra" / "agent-invocations" / args.purpose
|
|
130
|
+
temporary_root = root / ".tmp"
|
|
131
|
+
returned_body_path = _project_input(
|
|
132
|
+
project_root,
|
|
133
|
+
args.returned_body_file,
|
|
134
|
+
"returned body",
|
|
135
|
+
)
|
|
136
|
+
if not temporary_root.is_dir() or not _is_relative_to(
|
|
137
|
+
returned_body_path,
|
|
138
|
+
temporary_root.resolve(strict=True),
|
|
139
|
+
):
|
|
140
|
+
raise AgentPromptCliError(
|
|
141
|
+
"returned body file must be inside the standalone purpose .tmp directory"
|
|
142
|
+
)
|
|
143
|
+
result = materialize_standalone_result(
|
|
144
|
+
project_root=project_root,
|
|
145
|
+
purpose=args.purpose,
|
|
146
|
+
metadata_path=metadata_path,
|
|
147
|
+
returned_body=returned_body_path.read_bytes(),
|
|
148
|
+
)
|
|
149
|
+
_emit({
|
|
150
|
+
"ok": True,
|
|
151
|
+
"purpose": result.purpose,
|
|
152
|
+
"invocationId": result.invocation_id,
|
|
153
|
+
"metadataPath": str(result.prompt_metadata_path),
|
|
154
|
+
"resultPath": str(result.result_path),
|
|
155
|
+
"resultEnvelopeDigest": result.result_envelope_digest,
|
|
156
|
+
}, args.json)
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _complete(args: argparse.Namespace) -> None:
|
|
160
|
+
project_root = _project_root(args.project_root)
|
|
161
|
+
metadata_path = _project_input(project_root, args.metadata, "metadata")
|
|
162
|
+
completion = publish_standalone_completion(
|
|
163
|
+
project_root=project_root,
|
|
164
|
+
purpose=args.purpose,
|
|
165
|
+
metadata_path=metadata_path,
|
|
166
|
+
completed_at=datetime.now(timezone.utc),
|
|
167
|
+
)
|
|
168
|
+
_emit({
|
|
169
|
+
"ok": True,
|
|
170
|
+
"purpose": args.purpose,
|
|
171
|
+
"metadataPath": str(metadata_path),
|
|
172
|
+
"completionPath": str(completion),
|
|
173
|
+
}, args.json)
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _verify_completion(args: argparse.Namespace) -> None:
|
|
177
|
+
project_root = _project_root(args.project_root)
|
|
178
|
+
completion_path = _project_input(
|
|
179
|
+
project_root,
|
|
180
|
+
args.completion,
|
|
181
|
+
"completion",
|
|
182
|
+
)
|
|
183
|
+
verified = verify_standalone_completion(
|
|
184
|
+
completion_path,
|
|
185
|
+
project_root=project_root,
|
|
186
|
+
expected_purpose=args.purpose,
|
|
187
|
+
)
|
|
188
|
+
_emit({
|
|
189
|
+
"ok": True,
|
|
190
|
+
"purpose": verified.purpose,
|
|
191
|
+
"invocationId": verified.invocation_id,
|
|
192
|
+
"metadataPath": str(verified.prompt_metadata_path),
|
|
193
|
+
"resultPath": str(verified.result_path),
|
|
194
|
+
"completionPath": str(verified.completion_path),
|
|
195
|
+
"resultEnvelopeDigest": verified.result_envelope_digest,
|
|
196
|
+
"returnedBody": verified.returned_body,
|
|
197
|
+
}, args.json)
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"""materialize 를 요청한 신원이 이 run 이 발급한 것인지 확인한다.
|
|
2
|
+
|
|
3
|
+
run manifest 는 어떤 role 이 어떤 assignment 로 실행되는지를 이미 적어 두었다.
|
|
4
|
+
CLI 인자가 그것과 어긋나면 감사 기록이 실행과 달라지므로 거절한다. 이 검사가
|
|
5
|
+
없으면 매니페스트에 없는 role 로 프롬프트를 찍어 낼 수 있다.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Any, Mapping
|
|
10
|
+
|
|
11
|
+
from ...worker_prompt_policy import (
|
|
12
|
+
CRITIC_DUTY_BY_ASSIGNMENT_SEGMENT,
|
|
13
|
+
resolve_prompt_plan_for_manifest,
|
|
14
|
+
)
|
|
15
|
+
from .inputs import AgentPromptCliError
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _validate_run_identity(
|
|
19
|
+
manifest: Mapping[str, Any],
|
|
20
|
+
*,
|
|
21
|
+
worker_id: str,
|
|
22
|
+
dispatch_kind: str,
|
|
23
|
+
assignment_ref: str,
|
|
24
|
+
audience: str,
|
|
25
|
+
) -> None:
|
|
26
|
+
expected: str
|
|
27
|
+
if assignment_ref == "lead":
|
|
28
|
+
expected = "lead"
|
|
29
|
+
if worker_id != "lead":
|
|
30
|
+
raise AgentPromptCliError("lead assignment requires worker ID 'lead'")
|
|
31
|
+
elif assignment_ref == "translator":
|
|
32
|
+
expected = "translator"
|
|
33
|
+
if worker_id != "translator":
|
|
34
|
+
raise AgentPromptCliError("translator assignment requires worker ID 'translator'")
|
|
35
|
+
elif assignment_ref.startswith("critic/"):
|
|
36
|
+
scope = assignment_ref.split("/", 1)[1]
|
|
37
|
+
expected = CRITIC_DUTY_BY_ASSIGNMENT_SEGMENT.get(scope, "")
|
|
38
|
+
if not expected or dispatch_kind != "critic":
|
|
39
|
+
raise AgentPromptCliError("critic assignment identity is invalid")
|
|
40
|
+
# provider 대조는 여기 두지 않는다. critic 의 `worker_id` 는 배정 참조의
|
|
41
|
+
# 마지막 마디(`scope` / `acceptance`)이고 provider 이름이 아니다
|
|
42
|
+
# (`render.py` 의 로스터 행이 `assignment_ref.rsplit("/", 1)[-1]` 로 만든다).
|
|
43
|
+
# 종전에 있던 `provider != worker_id` 검사는 두 어휘를 비교해서 늘 참이 되는
|
|
44
|
+
# 형태였고, 설정을 run manifest 에서 찾다 못 찾아 조용히 건너뛰었기에
|
|
45
|
+
# 드러나지 않았다. 정본에서 읽게 고치면 모든 critic 디스패치가 거부된다.
|
|
46
|
+
else:
|
|
47
|
+
try:
|
|
48
|
+
expected = resolve_prompt_plan_for_manifest(
|
|
49
|
+
manifest=manifest,
|
|
50
|
+
worker_id=worker_id,
|
|
51
|
+
dispatch_kind=dispatch_kind,
|
|
52
|
+
).duty_audience
|
|
53
|
+
except ValueError as exc:
|
|
54
|
+
raise AgentPromptCliError(str(exc)) from exc
|
|
55
|
+
if audience != expected and _manifest_issued_role_execution(
|
|
56
|
+
manifest, audience=audience, assignment_ref=assignment_ref
|
|
57
|
+
):
|
|
58
|
+
# The prompt plan names a worker's role by worker id, so on an
|
|
59
|
+
# implementation run the executor's provider resolves to the
|
|
60
|
+
# executor role no matter which role execution is being targeted.
|
|
61
|
+
# But the manifest issues one role execution per role, and a
|
|
62
|
+
# provider serving as both executor and verifier gets two — a
|
|
63
|
+
# normal roster, since the verifier contract accepts reusing the
|
|
64
|
+
# executor's model behind its own session. Refusing the second
|
|
65
|
+
# audience made a role execution okstra had itself issued
|
|
66
|
+
# undispatchable, which costs the run an independent verifier.
|
|
67
|
+
expected = audience
|
|
68
|
+
if audience != expected:
|
|
69
|
+
raise AgentPromptCliError(
|
|
70
|
+
f"audience {audience!r} does not match required audience {expected!r}"
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def _manifest_issued_role_execution(
|
|
75
|
+
manifest: Mapping[str, Any],
|
|
76
|
+
*,
|
|
77
|
+
audience: str,
|
|
78
|
+
assignment_ref: str,
|
|
79
|
+
) -> bool:
|
|
80
|
+
"""Whether this run issued a role execution for that audience's role.
|
|
81
|
+
|
|
82
|
+
Keyed on the manifest's own rows, not on what the prompt plan infers from
|
|
83
|
+
a worker id: the question is whether okstra created the execution being
|
|
84
|
+
targeted, and only the manifest answers that.
|
|
85
|
+
"""
|
|
86
|
+
from ...domain.role import RoleCatalogError, role_for_duty
|
|
87
|
+
|
|
88
|
+
try:
|
|
89
|
+
role = role_for_duty(audience)
|
|
90
|
+
except RoleCatalogError:
|
|
91
|
+
return False
|
|
92
|
+
assignments = manifest.get("invocationAssignments")
|
|
93
|
+
assignment = (
|
|
94
|
+
assignments.get(assignment_ref) if isinstance(assignments, Mapping) else None
|
|
95
|
+
)
|
|
96
|
+
provider = (
|
|
97
|
+
assignment.get("provider") if isinstance(assignment, Mapping) else None
|
|
98
|
+
)
|
|
99
|
+
if not provider:
|
|
100
|
+
return False
|
|
101
|
+
executions = manifest.get("roleExecutions")
|
|
102
|
+
return any(
|
|
103
|
+
isinstance(row, Mapping)
|
|
104
|
+
and row.get("role") == role
|
|
105
|
+
and row.get("provider") == provider
|
|
106
|
+
for row in (executions if isinstance(executions, list) else [])
|
|
107
|
+
)
|
|
@@ -67,7 +67,7 @@ WORKER_PROFILE_SECTIONS_BY_TASK_TYPE = {
|
|
|
67
67
|
"Brief consumption",
|
|
68
68
|
"Worker planning procedure",
|
|
69
69
|
"Pre-planning context exploration",
|
|
70
|
-
"Design principles applied
|
|
70
|
+
"Design principles applied to realization review",
|
|
71
71
|
),
|
|
72
72
|
"final-verification": (
|
|
73
73
|
"Worker verification procedure",
|
|
@@ -102,8 +102,17 @@ def build_analysis_packet(
|
|
|
102
102
|
fix_history_text: str = "",
|
|
103
103
|
stage_ledger_json: str = "",
|
|
104
104
|
stage_ledger_notice: str = "",
|
|
105
|
+
prior_planning_summary: str = "",
|
|
105
106
|
) -> str:
|
|
106
|
-
"""Return the primary compact input for Claude/Codex/Antigravity analysers.
|
|
107
|
+
"""Return the primary compact input for Claude/Codex/Antigravity analysers.
|
|
108
|
+
|
|
109
|
+
`fix_history_text`, `stage_ledger_json` / `stage_ledger_notice`, and
|
|
110
|
+
`prior_planning_summary` are pre-rendered by their own modules
|
|
111
|
+
(`fix_cycles`, `stage_ledger`, `prior_planning`) because each is assembled
|
|
112
|
+
from disk state this file does not own. Each arrives already narrowed, and
|
|
113
|
+
an empty string means the caller found nothing to carry — the matching
|
|
114
|
+
block is then omitted rather than rendered saying "none".
|
|
115
|
+
"""
|
|
107
116
|
brief_text = task_brief_path.read_text(encoding="utf-8")
|
|
108
117
|
profile_text = analysis_profile_path.read_text(encoding="utf-8")
|
|
109
118
|
reference_text = _read_optional(reference_expectations_path)
|
|
@@ -126,6 +135,7 @@ def build_analysis_packet(
|
|
|
126
135
|
parts.extend(_fix_history_block(fix_history_text))
|
|
127
136
|
parts.extend(_stage_ledger_block(stage_ledger_json))
|
|
128
137
|
parts.extend(_stage_ledger_unavailable_block(stage_ledger_notice))
|
|
138
|
+
parts.extend(_prior_planning_block(prior_planning_summary))
|
|
129
139
|
parts.extend(_clarification_block(clarification_text))
|
|
130
140
|
parts.extend(_directive_block(directive))
|
|
131
141
|
body = "\n".join(part.rstrip() for part in parts).rstrip() + "\n"
|
|
@@ -334,8 +344,11 @@ def _stage_ledger_block(stage_ledger_json: str) -> list[str]:
|
|
|
334
344
|
"authority is the latter.",
|
|
335
345
|
"",
|
|
336
346
|
"A `planDivergence` entry means the two plans disagree about a",
|
|
337
|
-
"completed stage
|
|
338
|
-
"
|
|
347
|
+
"completed stage, or that the plan the completed stages were built",
|
|
348
|
+
"against could not be read so that comparison never ran. Treat either",
|
|
349
|
+
"as a blocker for any new stage number and report it; do not resolve",
|
|
350
|
+
"it by choosing one of the two yourself. Completed stages built",
|
|
351
|
+
"against an earlier plan are not a divergence.",
|
|
339
352
|
"",
|
|
340
353
|
"```json",
|
|
341
354
|
stage_ledger_json.strip(),
|
|
@@ -371,6 +384,36 @@ def _stage_ledger_unavailable_block(notice: str) -> list[str]:
|
|
|
371
384
|
]
|
|
372
385
|
|
|
373
386
|
|
|
387
|
+
def _prior_planning_block(prior_planning_summary: str) -> list[str]:
|
|
388
|
+
"""직전 계획 run 의 맥락. 직전 run 이 없으면 블록 자체가 없다.
|
|
389
|
+
|
|
390
|
+
머리글이 이 블록의 용도를 스스로 말한다. 그러지 않으면 워커는 표에 실린
|
|
391
|
+
계획을 승인된 것으로 읽고 그대로 옮겨 적는다 — 이 블록이 실리는 run 은
|
|
392
|
+
직전 계획이 **승인에 도달하지 못해** 다시 도는 run 이므로 그 독해는 틀렸다.
|
|
393
|
+
"""
|
|
394
|
+
if not prior_planning_summary.strip():
|
|
395
|
+
return []
|
|
396
|
+
return [
|
|
397
|
+
"",
|
|
398
|
+
"## Prior Planning Run",
|
|
399
|
+
"",
|
|
400
|
+
"What this task's previous implementation-planning run recorded. It is",
|
|
401
|
+
"here so that stages the previous plan already settled stay textually",
|
|
402
|
+
"stable across the re-run, and so settled analysis is not derived from",
|
|
403
|
+
"the brief a second time under new `P-*` numbers.",
|
|
404
|
+
"",
|
|
405
|
+
"It is NOT an approved plan and NOT an instruction to copy. The",
|
|
406
|
+
"previous run did not reach approval — that is why this run exists —",
|
|
407
|
+
"so every line below is still open to revision. Where the brief, the",
|
|
408
|
+
"directive, or a clarification answer disagrees with it, they win, and",
|
|
409
|
+
"a stage you are changing is rewritten rather than carried. Read the",
|
|
410
|
+
"report at the path below for anything this summary leaves out.",
|
|
411
|
+
"",
|
|
412
|
+
prior_planning_summary.strip(),
|
|
413
|
+
"",
|
|
414
|
+
]
|
|
415
|
+
|
|
416
|
+
|
|
374
417
|
def _clarification_block(clarification_text: str) -> list[str]:
|
|
375
418
|
if not clarification_text.strip():
|
|
376
419
|
return []
|