phase-loop-runtime 0.7.2__tar.gz → 0.7.4__tar.gz
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.
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/PKG-INFO +1 -1
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/pyproject.toml +1 -1
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/__init__.py +1 -1
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/cli.py +8 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/discovery.py +11 -5
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/events.py +19 -6
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/panel_invoker.py +129 -13
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/ratification.py +8 -6
- phase_loop_runtime-0.7.4/src/phase_loop_runtime/roadmap_authority.py +204 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/runner.py +7 -8
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/state.py +2 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/task_message_broker_client.py +17 -6
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/task_message_resolver.py +43 -12
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/train_roadmap.py +54 -8
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime.egg-info/PKG-INFO +1 -1
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime.egg-info/SOURCES.txt +3 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_branchgov_preflight.py +37 -12
- phase_loop_runtime-0.7.4/tests/test_panel_tui_liveness_188.py +191 -0
- phase_loop_runtime-0.7.4/tests/test_roadmap_authority.py +490 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_task_message_broker_cli.py +76 -2
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_task_message_resolver.py +83 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_train_invariants.py +46 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_train_roadmap.py +79 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/setup.cfg +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/console-summary.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/screenshot-standin.ppm +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/config.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/doctor.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/executor_availability.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/launcher.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/train_runner.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_backing_homebrew.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_cli_legacy.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_golden.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_advisor_twin_alias_legacy.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_autosel.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_conformance_golden.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_discovery_hygiene_legacy.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_dispatch_lock_reentrancy.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_doctor_bom.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_execgov.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_execreg_launch_registry.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_executor_availability.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_grokexec.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_launchspec_golden.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_leg_liveness_monitor.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_manifest_per_entry_164.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_context_refs_114.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_invoker_spawn.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_native_fill_183.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_streaming_verdicts.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_break_glass_rerun.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_pushflow.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_release_dispatch_operator_approval_145.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_release_pin_autotrack.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_review_leg_sandbox.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_status_read_only_62.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_unattended_release.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/tests/test_worktree_index.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "phase-loop-runtime" # PyPI dist name; NOT "agent-harness" (an unrelated third-party PyPI project)
|
|
7
|
-
version = "0.7.
|
|
7
|
+
version = "0.7.4"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -18,6 +18,7 @@ from .consiliency_scaffold import ScaffoldError, scaffold
|
|
|
18
18
|
from .docs_freshness import scan_docs_freshness
|
|
19
19
|
from .discovery import AmbiguousRoadmapError, find_plan_artifact, phase_source_bundle_diagnostic, resolve_repo, resolve_suite_command, select_roadmap
|
|
20
20
|
from .events import append_event, read_events
|
|
21
|
+
from .roadmap_authority import RoadmapAuthorityError, assert_roadmap_authorized
|
|
21
22
|
from .git_topology import collect_git_topology
|
|
22
23
|
from .handoff import handoff_metadata, write_tui_handoff
|
|
23
24
|
from .install_status import build_install_status
|
|
@@ -859,6 +860,9 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
859
860
|
file=sys.stderr,
|
|
860
861
|
)
|
|
861
862
|
return 2
|
|
863
|
+
except RoadmapAuthorityError as exc:
|
|
864
|
+
print(f"phase-loop {command}: roadmap authority refusal — {exc}", file=sys.stderr)
|
|
865
|
+
return 2
|
|
862
866
|
|
|
863
867
|
|
|
864
868
|
def _resolve_run_closeout_mode(args: argparse.Namespace, command: str) -> str:
|
|
@@ -1046,6 +1050,7 @@ def _main(parser: argparse.ArgumentParser, args: argparse.Namespace, command: st
|
|
|
1046
1050
|
_warn_roadmap_validation(select_roadmap(repo, args.roadmap))
|
|
1047
1051
|
return _evidence_audit_command(repo=repo, args=args, as_json=as_json)
|
|
1048
1052
|
if command in {"run", "resume", "dry-run"} and bool(getattr(args, "reset_capability", False)):
|
|
1053
|
+
assert_roadmap_authorized(repo, args.roadmap)
|
|
1049
1054
|
clear_degradation(repo)
|
|
1050
1055
|
|
|
1051
1056
|
if command == "execute":
|
|
@@ -1137,6 +1142,7 @@ def _main(parser: argparse.ArgumentParser, args: argparse.Namespace, command: st
|
|
|
1137
1142
|
)
|
|
1138
1143
|
return 0
|
|
1139
1144
|
if command == "migrate-handoffs":
|
|
1145
|
+
assert_roadmap_authorized(repo, args.roadmap)
|
|
1140
1146
|
records = migrate_handoffs(repo, apply=bool(getattr(args, "apply", False)))
|
|
1141
1147
|
if as_json:
|
|
1142
1148
|
print(records_to_json(records))
|
|
@@ -1145,8 +1151,10 @@ def _main(parser: argparse.ArgumentParser, args: argparse.Namespace, command: st
|
|
|
1145
1151
|
print(f"{record.status}\t{record.action}\t{record.skill_name}\t{record.source}\t{record.target}")
|
|
1146
1152
|
return 1 if any(record.action == "blocked" for record in records) else 0
|
|
1147
1153
|
if command == "migrate-events":
|
|
1154
|
+
assert_roadmap_authorized(repo, args.roadmap)
|
|
1148
1155
|
return _migrate_events_command(repo=repo, dry_run=bool(args.dry_run), backup_suffix=args.backup_suffix)
|
|
1149
1156
|
if command == "archive-state":
|
|
1157
|
+
assert_roadmap_authorized(repo, args.roadmap)
|
|
1150
1158
|
print(render_archive_result(
|
|
1151
1159
|
archive_state(repo, reason=getattr(args, "reason", None), dry_run=bool(getattr(args, "dry_run", False))),
|
|
1152
1160
|
as_json=as_json,
|
|
@@ -39,6 +39,7 @@ from .models import (
|
|
|
39
39
|
)
|
|
40
40
|
from .pipeline_adapter.flag import reconcile_git_reality_enabled
|
|
41
41
|
from .provenance import phase_sha256, roadmap_sha256
|
|
42
|
+
from .roadmap_authority import active_authorized_roadmap, assert_roadmap_authorized
|
|
42
43
|
from .runtime_paths import phase_loop_state_read_file
|
|
43
44
|
|
|
44
45
|
|
|
@@ -413,28 +414,33 @@ def select_roadmap(repo: Path, explicit: str | Path | None = None) -> Path:
|
|
|
413
414
|
path = Path(explicit).expanduser()
|
|
414
415
|
if not path.is_absolute():
|
|
415
416
|
path = repo / path
|
|
417
|
+
authorized = assert_roadmap_authorized(repo, path)
|
|
416
418
|
if not path.exists():
|
|
417
419
|
raise FileNotFoundError(f"roadmap not found: {path}")
|
|
418
|
-
return
|
|
420
|
+
return authorized
|
|
421
|
+
|
|
422
|
+
authority_roadmap = active_authorized_roadmap(repo)
|
|
423
|
+
if authority_roadmap is not None:
|
|
424
|
+
return authority_roadmap
|
|
419
425
|
|
|
420
426
|
state_roadmap = active_state_roadmap(repo)
|
|
421
427
|
if state_roadmap is not None:
|
|
422
|
-
return state_roadmap
|
|
428
|
+
return assert_roadmap_authorized(repo, state_roadmap)
|
|
423
429
|
|
|
424
430
|
manifest_roadmap = manifest_backed_roadmap(repo)
|
|
425
431
|
if manifest_roadmap is not None:
|
|
426
|
-
return manifest_roadmap
|
|
432
|
+
return assert_roadmap_authorized(repo, manifest_roadmap)
|
|
427
433
|
|
|
428
434
|
handoff = latest_handoff_roadmap(repo_identity(repo), "codex-phase-roadmap-builder")
|
|
429
435
|
if handoff is not None:
|
|
430
|
-
return handoff
|
|
436
|
+
return assert_roadmap_authorized(repo, handoff)
|
|
431
437
|
|
|
432
438
|
candidates = sorted((repo / "specs").glob("phase-plans-v*.md"))
|
|
433
439
|
if not candidates:
|
|
434
440
|
raise FileNotFoundError("no specs/phase-plans-v*.md roadmap found")
|
|
435
441
|
if len(candidates) != 1:
|
|
436
442
|
raise AmbiguousRoadmapError([c.resolve() for c in candidates])
|
|
437
|
-
return candidates[0]
|
|
443
|
+
return assert_roadmap_authorized(repo, candidates[0])
|
|
438
444
|
|
|
439
445
|
|
|
440
446
|
def active_state_roadmap(repo: Path) -> Path | None:
|
|
@@ -8,6 +8,7 @@ from pathlib import Path
|
|
|
8
8
|
from .closeout import phase_loop_closeout_diagnostic
|
|
9
9
|
from .git_topology import attach_git_topology, collect_git_topology
|
|
10
10
|
from .models import LoopEvent, WorkUnitEventMetadata
|
|
11
|
+
from .roadmap_authority import assert_roadmap_authorized
|
|
11
12
|
from .runtime_paths import ensure_phase_loop_excluded, phase_loop_event_file, phase_loop_event_read_files
|
|
12
13
|
|
|
13
14
|
|
|
@@ -20,16 +21,17 @@ def event_read_paths(repo: Path) -> tuple[Path, ...]:
|
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
def append_event(repo: Path, event: LoopEvent) -> None:
|
|
23
|
-
ensure_phase_loop_excluded(repo)
|
|
24
24
|
event = _event_with_closeout_metadata(event)
|
|
25
25
|
event = attach_git_topology(repo, event)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
append_payload(
|
|
27
|
+
repo,
|
|
28
|
+
event.to_json(),
|
|
29
|
+
roadmap=event.roadmap,
|
|
30
|
+
)
|
|
29
31
|
|
|
30
32
|
|
|
31
33
|
def append_work_unit_event(repo: Path, event: WorkUnitEventMetadata, *, roadmap: Path | None = None) -> None:
|
|
32
|
-
|
|
34
|
+
authorized_roadmap = assert_roadmap_authorized(repo, roadmap)
|
|
33
35
|
payload = event.to_json()
|
|
34
36
|
closeout = _extract_work_unit_closeout(payload)
|
|
35
37
|
if closeout is not None:
|
|
@@ -37,7 +39,7 @@ def append_work_unit_event(repo: Path, event: WorkUnitEventMetadata, *, roadmap:
|
|
|
37
39
|
payload.update(
|
|
38
40
|
{
|
|
39
41
|
"repo": str(repo),
|
|
40
|
-
"roadmap": str(roadmap or ""),
|
|
42
|
+
"roadmap": str(roadmap or authorized_roadmap or ""),
|
|
41
43
|
"phase": event.identity.phase,
|
|
42
44
|
"action": "work_unit",
|
|
43
45
|
"status": event.status,
|
|
@@ -46,6 +48,17 @@ def append_work_unit_event(repo: Path, event: WorkUnitEventMetadata, *, roadmap:
|
|
|
46
48
|
"git_topology": collect_git_topology(repo),
|
|
47
49
|
}
|
|
48
50
|
)
|
|
51
|
+
append_payload(repo, payload, roadmap=roadmap or authorized_roadmap)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def append_payload(
|
|
55
|
+
repo: Path,
|
|
56
|
+
payload: dict,
|
|
57
|
+
*,
|
|
58
|
+
roadmap: str | Path | None,
|
|
59
|
+
) -> None:
|
|
60
|
+
assert_roadmap_authorized(repo, roadmap)
|
|
61
|
+
ensure_phase_loop_excluded(repo)
|
|
49
62
|
path = event_path(repo)
|
|
50
63
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
51
64
|
_append_jsonl(path, payload)
|
{phase_loop_runtime-0.7.2 → phase_loop_runtime-0.7.4}/src/phase_loop_runtime/panel_invoker.py
RENAMED
|
@@ -1235,6 +1235,91 @@ def _run_leg_with_liveness(
|
|
|
1235
1235
|
pass
|
|
1236
1236
|
|
|
1237
1237
|
|
|
1238
|
+
# #188 — de-animation of the Claude TUI's cosmetic status line. While the model
|
|
1239
|
+
# call is in flight the TUI repaints an animated "✻ Herding… (Ns · esc to
|
|
1240
|
+
# interrupt)" line ~1x/sec (rotating whimsical verb + a per-second elapsed
|
|
1241
|
+
# counter). Those repaints are PTY output but NOT reviewer progress: a leg wedged
|
|
1242
|
+
# in ``ep_poll`` waiting on a stream that never completes keeps animating that
|
|
1243
|
+
# line forever. Treating any PTY byte as a heartbeat (the pre-#188 behavior) let
|
|
1244
|
+
# a wedged Fable leg hang ~17 min with ~2s CPU and no output. So for the TUI path
|
|
1245
|
+
# the kill clock is reset ONLY by GENUINE reviewer progress — output-file growth,
|
|
1246
|
+
# transcript growth, or SUBSTANTIVE novel de-animated terminal text — never by raw
|
|
1247
|
+
# PTY churn and never by incidental CPU (a Node CLI trickles libuv/GC CPU while
|
|
1248
|
+
# blocked, which would defeat a CPU heartbeat here just as the animation defeats a
|
|
1249
|
+
# byte heartbeat). This is exactly #188's "separate process-alive from
|
|
1250
|
+
# reviewer-heartbeat freshness"; the codex/grok/gemini ``_run_leg_with_liveness``
|
|
1251
|
+
# path keeps its stdout/stderr + CPU heartbeat (load-bearing there) untouched.
|
|
1252
|
+
_ANSI_CSI_RE = re.compile(r"\x1b\[[0-9;?]*[ -/]*[@-~]")
|
|
1253
|
+
_ANSI_OSC_RE = re.compile(r"\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)")
|
|
1254
|
+
_TUI_DIGIT_RUN_RE = re.compile(r"\d+")
|
|
1255
|
+
_TUI_NON_TOKEN_RE = re.compile(r"[^0-9a-zA-Z#]+")
|
|
1256
|
+
# A normalized visible line must be at least this long to count as substantive
|
|
1257
|
+
# novelty — filters out short glyph/one-word blips while any real review sentence
|
|
1258
|
+
# (or streamed token run) clears it easily.
|
|
1259
|
+
_TUI_PROGRESS_MIN_CHARS = 8
|
|
1260
|
+
|
|
1261
|
+
|
|
1262
|
+
def _normalize_tui_line(line: str) -> str:
|
|
1263
|
+
"""Collapse a rendered terminal line to a spinner/timer-invariant token string.
|
|
1264
|
+
|
|
1265
|
+
Digit runs → ``#`` (kills the per-second elapsed counter) and every non-alnum
|
|
1266
|
+
glyph/punctuation is dropped (kills the rotating spinner glyph + box drawing),
|
|
1267
|
+
so the animated status line maps to a FINITE set of normalized strings while
|
|
1268
|
+
genuinely-streamed review text keeps introducing novel ones.
|
|
1269
|
+
"""
|
|
1270
|
+
line = _TUI_DIGIT_RUN_RE.sub("#", line)
|
|
1271
|
+
line = _TUI_NON_TOKEN_RE.sub(" ", line)
|
|
1272
|
+
return " ".join(line.split()).strip().lower()
|
|
1273
|
+
|
|
1274
|
+
|
|
1275
|
+
def _tui_chunk_has_novel_content(chunk: bytes, seen: set[str]) -> bool:
|
|
1276
|
+
"""True iff a PTY chunk carries SUBSTANTIVE new (non-cosmetic) terminal text.
|
|
1277
|
+
|
|
1278
|
+
Strips ANSI escapes, splits on newline AND carriage-return (spinner overwrite),
|
|
1279
|
+
normalizes each visible line, and reports whether any sufficiently-long line
|
|
1280
|
+
has not been seen before. ``seen`` accumulates for the session (bounded by real
|
|
1281
|
+
novelty — a wedge's animation vocabulary is finite, so it saturates and stops
|
|
1282
|
+
resetting the kill clock).
|
|
1283
|
+
"""
|
|
1284
|
+
text = chunk.decode("utf-8", errors="replace")
|
|
1285
|
+
text = _ANSI_OSC_RE.sub("", text)
|
|
1286
|
+
text = _ANSI_CSI_RE.sub("", text)
|
|
1287
|
+
novel = False
|
|
1288
|
+
for raw in re.split(r"[\r\n]+", text):
|
|
1289
|
+
norm = _normalize_tui_line(raw)
|
|
1290
|
+
if len(norm) >= _TUI_PROGRESS_MIN_CHARS and norm not in seen:
|
|
1291
|
+
seen.add(norm)
|
|
1292
|
+
novel = True
|
|
1293
|
+
return novel
|
|
1294
|
+
|
|
1295
|
+
|
|
1296
|
+
# A single ``os.read(8192)`` can split a novel review line across two chunks; each
|
|
1297
|
+
# fragment normalizes differently (or collides with a seen/too-short form), so the
|
|
1298
|
+
# whole-line progress signal is lost. Carry the trailing PARTIAL line (bytes after
|
|
1299
|
+
# the last newline/CR) forward and prepend it to the next chunk, so novelty is only
|
|
1300
|
+
# ever evaluated on COMPLETE lines. Bounded so an unterminated over-long run (a rare
|
|
1301
|
+
# no-newline stream) is flushed rather than growing the buffer without limit.
|
|
1302
|
+
_TUI_CARRY_MAX_BYTES = 1 << 16 # 64 KiB
|
|
1303
|
+
|
|
1304
|
+
|
|
1305
|
+
def _tui_take_complete_lines(carry: bytearray, chunk: bytes) -> bytes:
|
|
1306
|
+
"""Append ``chunk`` to ``carry`` and return the bytes up to the last line
|
|
1307
|
+
terminator (complete lines, safe to scan for novelty), retaining the trailing
|
|
1308
|
+
partial line in ``carry`` for the next read. Carried at the RAW byte level so a
|
|
1309
|
+
straddling ANSI escape (never containing \\n/\\r) also reassembles intact."""
|
|
1310
|
+
carry.extend(chunk)
|
|
1311
|
+
last = max(carry.rfind(b"\n"), carry.rfind(b"\r"))
|
|
1312
|
+
if last < 0:
|
|
1313
|
+
if len(carry) >= _TUI_CARRY_MAX_BYTES:
|
|
1314
|
+
complete = bytes(carry)
|
|
1315
|
+
carry.clear()
|
|
1316
|
+
return complete
|
|
1317
|
+
return b""
|
|
1318
|
+
complete = bytes(carry[: last + 1])
|
|
1319
|
+
del carry[: last + 1]
|
|
1320
|
+
return complete
|
|
1321
|
+
|
|
1322
|
+
|
|
1238
1323
|
def _run_claude_tui_session(
|
|
1239
1324
|
*,
|
|
1240
1325
|
command: Sequence[str],
|
|
@@ -1266,8 +1351,14 @@ def _run_claude_tui_session(
|
|
|
1266
1351
|
next_transcript_check = start_monotonic + _CLAUDE_TUI_TRANSCRIPT_INTERVAL_S
|
|
1267
1352
|
transcript_salvage = ""
|
|
1268
1353
|
last_heartbeat = start_monotonic
|
|
1269
|
-
|
|
1270
|
-
|
|
1354
|
+
# #188: GENUINE-progress heartbeat state. The kill clock (``last_heartbeat``)
|
|
1355
|
+
# is reset ONLY by reviewer progress — never by cosmetic PTY animation or
|
|
1356
|
+
# incidental CPU. ``seen_tui_lines`` accumulates de-animated visible lines so a
|
|
1357
|
+
# wedged TUI's finite animation vocabulary saturates and stops resetting it.
|
|
1358
|
+
seen_tui_lines: set[str] = set()
|
|
1359
|
+
tui_carry = bytearray() # #188 CR: trailing partial line held across os.read boundaries
|
|
1360
|
+
last_review_len = 0
|
|
1361
|
+
last_transcript_len = 0
|
|
1271
1362
|
try:
|
|
1272
1363
|
master_fd, slave_fd = pty.openpty()
|
|
1273
1364
|
try:
|
|
@@ -1293,7 +1384,6 @@ def _run_claude_tui_session(
|
|
|
1293
1384
|
os.close(master_fd)
|
|
1294
1385
|
return 1, "", f"claude_tui_launch_error:{type(exc).__name__}"
|
|
1295
1386
|
|
|
1296
|
-
last_ticks = group_cpu_ticks(proc.pid)
|
|
1297
1387
|
try:
|
|
1298
1388
|
while time.monotonic() < deadline:
|
|
1299
1389
|
if master_fd is not None:
|
|
@@ -1305,7 +1395,17 @@ def _run_claude_tui_session(
|
|
|
1305
1395
|
chunk = b""
|
|
1306
1396
|
if chunk:
|
|
1307
1397
|
terminal_bytes.extend(chunk)
|
|
1308
|
-
|
|
1398
|
+
# #188: a raw PTY chunk is a heartbeat ONLY if it carries
|
|
1399
|
+
# SUBSTANTIVE novel text. The TUI's animated "thinking"
|
|
1400
|
+
# status line (rotating verb + per-second timer) repaints
|
|
1401
|
+
# forever while wedged in ep_poll; de-animation maps it to
|
|
1402
|
+
# already-seen lines so it never resets the kill clock.
|
|
1403
|
+
# #188 CR: carry the trailing partial line across read
|
|
1404
|
+
# boundaries so a novel line split by ``os.read`` is scanned
|
|
1405
|
+
# WHOLE (only complete lines are evaluated).
|
|
1406
|
+
complete = _tui_take_complete_lines(tui_carry, chunk)
|
|
1407
|
+
if complete and _tui_chunk_has_novel_content(complete, seen_tui_lines):
|
|
1408
|
+
last_heartbeat = time.monotonic()
|
|
1309
1409
|
else:
|
|
1310
1410
|
# #48: PTY EOF — the child CLI and ALL its descendants closed
|
|
1311
1411
|
# the slave side, so no further output can arrive. Without this
|
|
@@ -1341,11 +1441,20 @@ def _run_claude_tui_session(
|
|
|
1341
1441
|
except OSError:
|
|
1342
1442
|
return 1, "", "claude_tui_submit_failed"
|
|
1343
1443
|
review_text = _read_review_output(output_file)
|
|
1444
|
+
# #188: canonical review OUTPUT growing is unambiguous reviewer progress.
|
|
1445
|
+
if len(review_text) > last_review_len:
|
|
1446
|
+
last_review_len = len(review_text)
|
|
1447
|
+
last_heartbeat = now
|
|
1344
1448
|
if _completion_ok(review_text, mode):
|
|
1345
1449
|
return 0, review_text, "claude_tui_file_output"
|
|
1346
1450
|
if now >= next_transcript_check:
|
|
1347
1451
|
next_transcript_check = now + _CLAUDE_TUI_TRANSCRIPT_INTERVAL_S
|
|
1348
1452
|
transcript_text = _latest_claude_transcript_text(str(cwd), since=start_wall)
|
|
1453
|
+
# #188: the session transcript growing (tool calls, streamed
|
|
1454
|
+
# messages) is genuine progress even before a file verdict lands.
|
|
1455
|
+
if len(transcript_text) > last_transcript_len:
|
|
1456
|
+
last_transcript_len = len(transcript_text)
|
|
1457
|
+
last_heartbeat = now
|
|
1349
1458
|
if _completion_ok(transcript_text, mode):
|
|
1350
1459
|
transcript_salvage = transcript_text
|
|
1351
1460
|
if proc.poll() is not None:
|
|
@@ -1355,14 +1464,13 @@ def _run_claude_tui_session(
|
|
|
1355
1464
|
return 0, review_text, "claude_tui_file_output"
|
|
1356
1465
|
detail = "claude_tui_missing_canonical_output"
|
|
1357
1466
|
return proc.returncode or 1, review_text or transcript_text, detail
|
|
1358
|
-
#
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
# stall: PTY silent AND CPU-flat past the threshold while still running. The
|
|
1467
|
+
# #188: NO CPU heartbeat on the TUI path. Unlike the print-mode legs, a
|
|
1468
|
+
# Node CLI blocked in ep_poll still trickles libuv/GC CPU, so a CPU-advance
|
|
1469
|
+
# reset would keep a genuinely-wedged TUI alive forever (the ~2s-CPU/17-min
|
|
1470
|
+
# hang). Liveness here is reviewer progress ONLY (novel PTY text / output /
|
|
1471
|
+
# transcript growth above) — "process-alive" is deliberately NOT "leg-alive".
|
|
1472
|
+
#
|
|
1473
|
+
# stall: no GENUINE progress for the threshold while still running. The
|
|
1366
1474
|
# canonical verdict is the review FILE (checked above); nothing to nudge for a
|
|
1367
1475
|
# wedged TUI, so fail closed (rc forced non-zero, like the #48/deadline paths).
|
|
1368
1476
|
if now - last_heartbeat >= _LEG_STALL_THRESHOLD_S:
|
|
@@ -1729,7 +1837,15 @@ def _exec_claude_tui_leg(
|
|
|
1729
1837
|
mode=mode,
|
|
1730
1838
|
backstop_s=backstop_s,
|
|
1731
1839
|
)
|
|
1732
|
-
|
|
1840
|
+
# #188: a heartbeat-reclaimed (genuinely wedged) TUI leg is a TYPED stalled leg,
|
|
1841
|
+
# not a bare ERROR — surface it as DEGRADED so the panel summary names the
|
|
1842
|
+
# liveness reclaim ("process alive but no reviewer heartbeat") while the three
|
|
1843
|
+
# completed seats are preserved. A leg that produced a conforming verdict before
|
|
1844
|
+
# the reclaim still classifies OK (unchanged).
|
|
1845
|
+
status = _classify_leg(rc, review_text, log_text, mode)
|
|
1846
|
+
if log_text == "claude_tui_stalled" and status != "OK":
|
|
1847
|
+
return "DEGRADED", review_text or "claude_tui_stalled: no reviewer heartbeat (liveness reclaim)"
|
|
1848
|
+
return status, review_text or log_text
|
|
1733
1849
|
|
|
1734
1850
|
|
|
1735
1851
|
def _exec_claude_agent_view_attempt(
|
|
@@ -6,7 +6,7 @@ from pathlib import Path
|
|
|
6
6
|
from typing import Any
|
|
7
7
|
|
|
8
8
|
from ..git_topology import collect_git_topology
|
|
9
|
-
from ..
|
|
9
|
+
from ..events import append_payload
|
|
10
10
|
from ..models import utc_now
|
|
11
11
|
from .merge_policy import MergePolicy
|
|
12
12
|
|
|
@@ -21,12 +21,11 @@ def emit_ratification_passed(
|
|
|
21
21
|
ratification_gate: str,
|
|
22
22
|
merge_policy: MergePolicy,
|
|
23
23
|
audit: dict[str, Any],
|
|
24
|
+
*,
|
|
25
|
+
roadmap_path: Path | None = None,
|
|
24
26
|
) -> None:
|
|
25
27
|
repo = Path(repo_root)
|
|
26
28
|
payload = _payload(repo, roadmap_version, phase_alias, ratification_gate, merge_policy, audit)
|
|
27
|
-
ensure_phase_loop_excluded(repo)
|
|
28
|
-
event_path = phase_loop_event_file(repo)
|
|
29
|
-
event_path.parent.mkdir(parents=True, exist_ok=True)
|
|
30
29
|
event = {
|
|
31
30
|
"timestamp": utc_now(),
|
|
32
31
|
"repo": str(repo),
|
|
@@ -40,8 +39,11 @@ def emit_ratification_passed(
|
|
|
40
39
|
"payload": payload,
|
|
41
40
|
"git_topology": collect_git_topology(repo),
|
|
42
41
|
}
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
append_payload(
|
|
43
|
+
repo,
|
|
44
|
+
event,
|
|
45
|
+
roadmap=roadmap_path or repo / "specs" / f"phase-plans-{roadmap_version}.md",
|
|
46
|
+
)
|
|
45
47
|
|
|
46
48
|
trigger = repo / TRIGGER_PATH
|
|
47
49
|
trigger.parent.mkdir(parents=True, exist_ok=True)
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import hashlib
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
import stat
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
SCHEMA = "phase_loop_roadmap_authority.v1"
|
|
11
|
+
REQUIRED_MARKER = "phase_loop_roadmap_authority_required.v1\n"
|
|
12
|
+
LATCH_MARKER = "phase_loop_roadmap_authority_latched.v1\n"
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class RoadmapAuthorityError(RuntimeError):
|
|
16
|
+
pass
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def roadmap_authority_file(repo: Path) -> Path:
|
|
20
|
+
return _git_common_path(repo, "phase-loop-roadmap-authority.json")
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def roadmap_authority_required_file(repo: Path) -> Path:
|
|
24
|
+
return _git_common_path(repo, "phase-loop-roadmap-authority-required")
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def roadmap_authority_latch_file(repo: Path) -> Path:
|
|
28
|
+
return _git_common_path(repo, "phase-loop-roadmap-authority-latch")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def roadmap_authority_worktree_latch_file(repo: Path) -> Path:
|
|
32
|
+
return repo.resolve() / ".phase-loop" / "roadmap-authority-latch"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _git_common_path(repo: Path, name: str) -> Path:
|
|
36
|
+
git_entry = repo.resolve() / ".git"
|
|
37
|
+
if git_entry.is_dir():
|
|
38
|
+
common = git_entry
|
|
39
|
+
elif git_entry.is_file():
|
|
40
|
+
try:
|
|
41
|
+
line = git_entry.read_text(encoding="utf-8").strip()
|
|
42
|
+
if not line.startswith("gitdir: "):
|
|
43
|
+
raise ValueError
|
|
44
|
+
git_dir = Path(line.removeprefix("gitdir: "))
|
|
45
|
+
git_dir = git_dir if git_dir.is_absolute() else (repo / git_dir).resolve()
|
|
46
|
+
commondir = git_dir / "commondir"
|
|
47
|
+
if commondir.exists():
|
|
48
|
+
common_value = commondir.read_text(encoding="utf-8").strip()
|
|
49
|
+
common_path = Path(common_value)
|
|
50
|
+
common = common_path if common_path.is_absolute() else (git_dir / common_path).resolve()
|
|
51
|
+
else:
|
|
52
|
+
common = git_dir
|
|
53
|
+
except (OSError, UnicodeDecodeError, ValueError) as error:
|
|
54
|
+
raise RoadmapAuthorityError("roadmap authority marker path unavailable") from error
|
|
55
|
+
else:
|
|
56
|
+
common = git_entry
|
|
57
|
+
return common / name
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def active_authorized_roadmap(repo: Path) -> Path | None:
|
|
61
|
+
return assert_roadmap_authorized(repo, None)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def assert_roadmap_authorized(
|
|
65
|
+
repo: Path,
|
|
66
|
+
roadmap: str | Path | None,
|
|
67
|
+
) -> Path | None:
|
|
68
|
+
root = repo.resolve()
|
|
69
|
+
authority_path = roadmap_authority_file(root)
|
|
70
|
+
if not authority_path.exists():
|
|
71
|
+
_require_authority_not_removed(root)
|
|
72
|
+
return _resolve_roadmap(root, roadmap) if roadmap is not None and str(roadmap).strip() else None
|
|
73
|
+
_require_authority_installed(root, authority_path)
|
|
74
|
+
authority = _read_authority(authority_path)
|
|
75
|
+
if authority["status"] != "active":
|
|
76
|
+
raise RoadmapAuthorityError("roadmap authority is blocked")
|
|
77
|
+
active = _bound_path(root, authority["active_roadmap"])
|
|
78
|
+
retired = {_bound_path(root, item["path"]): item for item in authority["retired_roadmaps"]}
|
|
79
|
+
for path, item in retired.items():
|
|
80
|
+
blob = _bound_common_blob(authority_path.parent, item["common_blob"])
|
|
81
|
+
_require_control_mode(blob, 0o400)
|
|
82
|
+
if not blob.is_file() or _sha256(blob) != item["sha256"]:
|
|
83
|
+
raise RoadmapAuthorityError(f"retired roadmap digest mismatch: {path}")
|
|
84
|
+
target = active if roadmap is None or str(roadmap).strip() == "" else _resolve_roadmap(root, roadmap)
|
|
85
|
+
if target in retired:
|
|
86
|
+
raise RoadmapAuthorityError(f"roadmap retired: {target}")
|
|
87
|
+
if target != active:
|
|
88
|
+
raise RoadmapAuthorityError(f"roadmap is not active: {target}")
|
|
89
|
+
if active.is_file():
|
|
90
|
+
if _sha256(active) != authority["active_roadmap_sha256"]:
|
|
91
|
+
raise RoadmapAuthorityError(f"roadmap authority digest mismatch: {active}")
|
|
92
|
+
else:
|
|
93
|
+
raise RoadmapAuthorityError(f"roadmap authority digest mismatch: {active}")
|
|
94
|
+
return target
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _read_authority(path: Path) -> dict:
|
|
98
|
+
try:
|
|
99
|
+
value = json.loads(path.read_text(encoding="utf-8"))
|
|
100
|
+
except (OSError, UnicodeDecodeError, json.JSONDecodeError) as error:
|
|
101
|
+
raise RoadmapAuthorityError(f"invalid roadmap authority: {path}") from error
|
|
102
|
+
if not isinstance(value, dict) or set(value) != {
|
|
103
|
+
"schema",
|
|
104
|
+
"status",
|
|
105
|
+
"active_roadmap",
|
|
106
|
+
"active_roadmap_sha256",
|
|
107
|
+
"retired_roadmaps",
|
|
108
|
+
}:
|
|
109
|
+
raise RoadmapAuthorityError(f"invalid roadmap authority schema: {path}")
|
|
110
|
+
if value["schema"] != SCHEMA or value["status"] not in {"blocked", "active"} or not _digest(value["active_roadmap_sha256"]):
|
|
111
|
+
raise RoadmapAuthorityError(f"invalid roadmap authority binding: {path}")
|
|
112
|
+
retired = value["retired_roadmaps"]
|
|
113
|
+
if not isinstance(retired, list):
|
|
114
|
+
raise RoadmapAuthorityError(f"invalid retired roadmap set: {path}")
|
|
115
|
+
seen: set[str] = set()
|
|
116
|
+
for item in retired:
|
|
117
|
+
if not isinstance(item, dict) or set(item) != {"path", "sha256", "common_blob"}:
|
|
118
|
+
raise RoadmapAuthorityError(f"invalid retired roadmap binding: {path}")
|
|
119
|
+
if not isinstance(item["path"], str) or item["path"] in seen or not _digest(item["sha256"]) or not isinstance(item["common_blob"], str) or not item["common_blob"]:
|
|
120
|
+
raise RoadmapAuthorityError(f"invalid retired roadmap binding: {path}")
|
|
121
|
+
seen.add(item["path"])
|
|
122
|
+
return value
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def _require_authority_not_removed(repo: Path) -> None:
|
|
126
|
+
marker = roadmap_authority_required_file(repo)
|
|
127
|
+
latch = roadmap_authority_latch_file(repo)
|
|
128
|
+
worktree_latch = roadmap_authority_worktree_latch_file(repo)
|
|
129
|
+
if not marker.exists() and not latch.exists() and not worktree_latch.exists():
|
|
130
|
+
return
|
|
131
|
+
if worktree_latch.exists():
|
|
132
|
+
_read_control_file(worktree_latch, LATCH_MARKER, 0o400)
|
|
133
|
+
if latch.exists():
|
|
134
|
+
_read_control_file(latch, LATCH_MARKER, 0o400)
|
|
135
|
+
if marker.exists():
|
|
136
|
+
_read_control_file(marker, REQUIRED_MARKER, 0o400)
|
|
137
|
+
raise RoadmapAuthorityError("required roadmap authority is missing")
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def _require_authority_installed(repo: Path, authority: Path) -> None:
|
|
141
|
+
_require_control_mode(authority, 0o600)
|
|
142
|
+
_read_control_file(roadmap_authority_worktree_latch_file(repo), LATCH_MARKER, 0o400)
|
|
143
|
+
_read_control_file(roadmap_authority_required_file(repo), REQUIRED_MARKER, 0o400)
|
|
144
|
+
_read_control_file(roadmap_authority_latch_file(repo), LATCH_MARKER, 0o400)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _read_control_file(path: Path, expected: str, mode: int) -> None:
|
|
148
|
+
try:
|
|
149
|
+
value = path.read_text(encoding="utf-8")
|
|
150
|
+
except (OSError, UnicodeDecodeError) as error:
|
|
151
|
+
raise RoadmapAuthorityError("invalid roadmap authority required marker") from error
|
|
152
|
+
if value != expected:
|
|
153
|
+
raise RoadmapAuthorityError("invalid roadmap authority required marker")
|
|
154
|
+
_require_control_mode(path, mode)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def _require_control_mode(path: Path, mode: int) -> None:
|
|
158
|
+
try:
|
|
159
|
+
metadata = path.stat()
|
|
160
|
+
common_owner = path.parent.stat().st_uid
|
|
161
|
+
except OSError as error:
|
|
162
|
+
raise RoadmapAuthorityError("invalid roadmap authority control file") from error
|
|
163
|
+
if os.name == "nt":
|
|
164
|
+
return
|
|
165
|
+
if metadata.st_uid != common_owner or stat.S_IMODE(metadata.st_mode) != mode or metadata.st_uid != os.geteuid():
|
|
166
|
+
raise RoadmapAuthorityError("invalid roadmap authority control file")
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def _resolve_roadmap(repo: Path, roadmap: str | Path | None) -> Path:
|
|
170
|
+
if roadmap is None or str(roadmap).strip() == "":
|
|
171
|
+
raise RoadmapAuthorityError("roadmap authority requires a roadmap path")
|
|
172
|
+
path = Path(roadmap).expanduser()
|
|
173
|
+
return (path if path.is_absolute() else repo / path).resolve()
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _bound_common_blob(common: Path, value: str) -> Path:
|
|
177
|
+
path = Path(value)
|
|
178
|
+
if path.is_absolute():
|
|
179
|
+
raise RoadmapAuthorityError("retired roadmap blob escapes git common directory")
|
|
180
|
+
resolved = (common / path).resolve()
|
|
181
|
+
try:
|
|
182
|
+
resolved.relative_to(common.resolve())
|
|
183
|
+
except ValueError as error:
|
|
184
|
+
raise RoadmapAuthorityError("retired roadmap blob escapes git common directory") from error
|
|
185
|
+
return resolved
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def _bound_path(repo: Path, value: object) -> Path:
|
|
189
|
+
if not isinstance(value, str) or not value or Path(value).is_absolute():
|
|
190
|
+
raise RoadmapAuthorityError("roadmap authority paths must be repository-relative")
|
|
191
|
+
path = (repo / value).resolve()
|
|
192
|
+
try:
|
|
193
|
+
path.relative_to(repo)
|
|
194
|
+
except ValueError as error:
|
|
195
|
+
raise RoadmapAuthorityError("roadmap authority path escapes repository") from error
|
|
196
|
+
return path
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def _sha256(path: Path) -> str:
|
|
200
|
+
return hashlib.sha256(path.read_bytes()).hexdigest()
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
def _digest(value: object) -> bool:
|
|
204
|
+
return isinstance(value, str) and len(value) == 64 and all(character in "0123456789abcdef" for character in value)
|