phase-loop-runtime 0.7.1__tar.gz → 0.7.2__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.1 → phase_loop_runtime-0.7.2}/PKG-INFO +1 -1
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/pyproject.toml +1 -1
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/__init__.py +1 -1
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/cli.py +61 -0
- phase_loop_runtime-0.7.2/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +34 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/panel_invoker.py +175 -32
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +7 -2
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +7 -2
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +8 -7
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +8 -7
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/task_message_broker_client.py +2 -2
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/task_message_resolver.py +28 -4
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime.egg-info/PKG-INFO +1 -1
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime.egg-info/SOURCES.txt +1 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_backing_homebrew.py +2 -2
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_leg_liveness_monitor.py +1 -1
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_panel_invoker_spawn.py +53 -20
- phase_loop_runtime-0.7.2/tests/test_panel_native_fill_183.py +327 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_task_message_broker_cli.py +38 -12
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_task_message_resolver.py +43 -1
- phase_loop_runtime-0.7.1/src/phase_loop_runtime/deploy/phase-loop-task-message-broker.service +0 -29
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/setup.cfg +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/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.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/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.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/composition.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/config.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/__init__.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/outside_agent_core.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/outside_agent_imports.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/outside_agent_pin.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/outside_agent_real.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/outside_agent_schema.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/conformance/outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/default_executor_resolver.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/doctor.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/executor_availability.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/harness_env_signatures.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/launcher.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/runner.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.golden.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/schemas/phase-loop-doctor.v1.schema.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/prune_merged_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/train_runner.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime.egg-info/requires.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_cli_legacy.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_composition.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_golden.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_advisor_twin_alias_legacy.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_autosel.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_certificate_tier.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_conformance_golden.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_discovery_hygiene_legacy.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_dispatch_lock_reentrancy.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_doctor_bom.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_execgov.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_execreg_launch_registry.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_executor_availability.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_git_grounded_projection.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_grokexec.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_launchspec_golden.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_manifest_per_entry_164.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_model_id_source_guard.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_advisory.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_advisory_cli.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_advisory_fixtures.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_authority_boundary.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_contract_drift.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_contract_imports.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_contract_pin.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_core_api.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_provenance.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_real_ci.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_real_cli.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_real_output.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_real_runtime.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_redaction.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_release_surface.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_schema_validation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_outside_agent_vectors.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_panel_context_refs_114.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_panel_streaming_verdicts.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_break_glass_rerun.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_concurrent_phase_dispatch.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_dry_run_closeout_guard.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_issue_84_explicit_phase.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_repair_precondition_planned_closeout.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_proc_cpu.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_prune_merged_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_pushflow.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_ratification_policy.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_release_dispatch_operator_approval_145.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_release_pin_autotrack.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_review_leg_sandbox.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_status_read_only_62.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_sweep_fleet_worktrees_script.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_task_message_broker.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_unattended_release.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/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.2"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -1360,6 +1360,19 @@ def _main(parser: argparse.ArgumentParser, args: argparse.Namespace, command: st
|
|
|
1360
1360
|
return _run_returncode(snapshot, results)
|
|
1361
1361
|
|
|
1362
1362
|
|
|
1363
|
+
def _native_agent_request_json(leg: object) -> dict | None:
|
|
1364
|
+
"""Serialize a leg's ``needs_native_agent`` request (ABDNATIVE / #183) to a
|
|
1365
|
+
JSON-safe dict, or ``None`` when the seat is not deferred to a native Agent.
|
|
1366
|
+
|
|
1367
|
+
Structural (``getattr`` + ``to_dict``) so it does not force a ``panel_invoker``
|
|
1368
|
+
import onto the bare CLI path."""
|
|
1369
|
+
request = getattr(leg, "needs_native_agent", None)
|
|
1370
|
+
if request is None:
|
|
1371
|
+
return None
|
|
1372
|
+
to_dict = getattr(request, "to_dict", None)
|
|
1373
|
+
return to_dict() if callable(to_dict) else None
|
|
1374
|
+
|
|
1375
|
+
|
|
1363
1376
|
def _advisor_board_command(*, args: argparse.Namespace) -> int:
|
|
1364
1377
|
"""LEGACY (CLEANSHIP P7): run the 4-vendor advisor board as the RUNNABLE
|
|
1365
1378
|
agent-facing default. Composes availability-aware seats via
|
|
@@ -1419,10 +1432,43 @@ def _advisor_board_command(*, args: argparse.Namespace) -> int:
|
|
|
1419
1432
|
# expected non-OK), the board is below its independence floor → exit nonzero.
|
|
1420
1433
|
usable = usable_count >= FLOOR_SEATS
|
|
1421
1434
|
exit_code = 0 if usable else 1
|
|
1435
|
+
# #183 / ABDNATIVE: LOUD requested-vs-delivered shortfall. A floor-satisfying
|
|
1436
|
+
# board can still be SHORT an explicitly-requested seat (the claude/Fable seat
|
|
1437
|
+
# deferred to a native Agent), and a bare `usable:true` masks that. Report
|
|
1438
|
+
# requested (every composed seat), delivered (usable OK+text), and — the
|
|
1439
|
+
# affordance — the seats a native harness can FILL itself (each carries the
|
|
1440
|
+
# typed `needs_native_agent` request). Exit stays floor-based (unchanged): the
|
|
1441
|
+
# shortfall is a REPORTING signal, not a gate flip.
|
|
1442
|
+
# CR F3: derive unfilled seats PER-LEG (`not leg.usable`), never by seat_key
|
|
1443
|
+
# membership. Seats are collision-aware LABELS (schema permits byte-identical
|
|
1444
|
+
# seats with the SAME key), so a key-set difference would let a duplicate key —
|
|
1445
|
+
# one seat OK, its twin failed — hide the failed twin: requested=2/delivered=1
|
|
1446
|
+
# but zero unfilled reported = a silent drop. Per-leg is positional and exact.
|
|
1447
|
+
requested_seats = len(board.seats)
|
|
1448
|
+
unfilled_legs = [leg for leg in result.legs if not leg.usable]
|
|
1449
|
+
fillable_legs = [leg for leg in unfilled_legs if leg.needs_native_agent is not None]
|
|
1450
|
+
shortfall = {
|
|
1451
|
+
"requested_seats": requested_seats,
|
|
1452
|
+
"delivered_seats": usable_count,
|
|
1453
|
+
"unfilled_seats": [
|
|
1454
|
+
{
|
|
1455
|
+
"seat_key": leg.seat_key,
|
|
1456
|
+
"leg": leg.leg,
|
|
1457
|
+
"status": leg.status,
|
|
1458
|
+
"needs_native_agent": _native_agent_request_json(leg),
|
|
1459
|
+
}
|
|
1460
|
+
for leg in unfilled_legs
|
|
1461
|
+
],
|
|
1462
|
+
"natively_fillable_seats": len(fillable_legs),
|
|
1463
|
+
}
|
|
1422
1464
|
if bool(getattr(args, "json", False)):
|
|
1423
1465
|
payload = {
|
|
1424
1466
|
"board": board.name,
|
|
1425
1467
|
"usable": usable,
|
|
1468
|
+
# Requested-vs-delivered so a Bash-invoking harness sees a dropped seat.
|
|
1469
|
+
"requested_seats": requested_seats,
|
|
1470
|
+
"delivered_seats": usable_count,
|
|
1471
|
+
"shortfall": shortfall,
|
|
1426
1472
|
"independence": {
|
|
1427
1473
|
"level": independence.level,
|
|
1428
1474
|
"distinct_vendors": independence.distinct_vendors,
|
|
@@ -1438,6 +1484,9 @@ def _advisor_board_command(*, args: argparse.Namespace) -> int:
|
|
|
1438
1484
|
"status": leg.status,
|
|
1439
1485
|
"detail": leg.detail,
|
|
1440
1486
|
"text": leg.text,
|
|
1487
|
+
# ABDNATIVE (#183): a deferred claude/Fable seat carries the
|
|
1488
|
+
# typed native-fill request the harness must run; None otherwise.
|
|
1489
|
+
"needs_native_agent": _native_agent_request_json(leg),
|
|
1441
1490
|
}
|
|
1442
1491
|
for leg in result.legs
|
|
1443
1492
|
],
|
|
@@ -1460,6 +1509,18 @@ def _advisor_board_command(*, args: argparse.Namespace) -> int:
|
|
|
1460
1509
|
# The statuses/verdicts are ADVISORY evidence — the operator reconciles them; a
|
|
1461
1510
|
# non-OK leg (DEGRADED/UNAVAILABLE/…) is a gap to fill, not a passed review.
|
|
1462
1511
|
print("advisor-board: verdicts are advisory — reconcile the legs; check each leg status.")
|
|
1512
|
+
# #183: surface the requested-vs-delivered shortfall LOUDLY (stderr) so a
|
|
1513
|
+
# floor-satisfying board is never mistaken for the full requested board, and
|
|
1514
|
+
# name the seats a native harness can fill itself.
|
|
1515
|
+
if unfilled_legs:
|
|
1516
|
+
print(
|
|
1517
|
+
f"advisor-board: delivered {usable_count}/{requested_seats} requested seats — "
|
|
1518
|
+
f"{len(unfilled_legs)} unfilled ({len(fillable_legs)} natively fillable):",
|
|
1519
|
+
file=sys.stderr,
|
|
1520
|
+
)
|
|
1521
|
+
for leg in unfilled_legs:
|
|
1522
|
+
fill = " → run a native Fable Agent to fill this seat" if leg.needs_native_agent else ""
|
|
1523
|
+
print(f"advisor-board: [{leg.status}] {leg.seat_key}{fill}", file=sys.stderr)
|
|
1463
1524
|
if not usable:
|
|
1464
1525
|
print(
|
|
1465
1526
|
f"advisor-board: only {usable_count} usable review leg(s) < floor {FLOOR_SEATS} "
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
[Unit]
|
|
2
|
+
Description=Phase-loop task-message source broker
|
|
3
|
+
After=network-online.target
|
|
4
|
+
Wants=network-online.target
|
|
5
|
+
|
|
6
|
+
[Service]
|
|
7
|
+
Type=simple
|
|
8
|
+
User=viperjuice
|
|
9
|
+
Group=viperjuice
|
|
10
|
+
EnvironmentFile=/etc/phase-loop/task-message-broker.env
|
|
11
|
+
ExecStart=/opt/phase-loop-task-message-broker/bin/phase-loop task-message-broker-serve --host 127.0.0.1 --port 18765 --control-socket /home/viperjuice/.codex/app-server-control/app-server-control.sock --authority codex-app-server://claw.taile09692.ts.net --token-sha256 ${TASK_MESSAGE_TOKEN_SHA256} --agent-harness-sha ${AGENT_HARNESS_SHA}
|
|
12
|
+
Restart=on-failure
|
|
13
|
+
RestartSec=2
|
|
14
|
+
UMask=0077
|
|
15
|
+
NoNewPrivileges=yes
|
|
16
|
+
PrivateDevices=yes
|
|
17
|
+
PrivateTmp=yes
|
|
18
|
+
ProtectHome=tmpfs
|
|
19
|
+
BindReadOnlyPaths=/home/viperjuice/.codex/app-server-control/app-server-control.sock
|
|
20
|
+
ProtectSystem=strict
|
|
21
|
+
InaccessiblePaths=/proc
|
|
22
|
+
ProtectControlGroups=yes
|
|
23
|
+
ProtectKernelModules=yes
|
|
24
|
+
ProtectKernelTunables=yes
|
|
25
|
+
LockPersonality=yes
|
|
26
|
+
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6
|
|
27
|
+
RestrictRealtime=yes
|
|
28
|
+
RestrictSUIDSGID=yes
|
|
29
|
+
SystemCallArchitectures=native
|
|
30
|
+
IPAddressDeny=any
|
|
31
|
+
IPAddressAllow=localhost
|
|
32
|
+
|
|
33
|
+
[Install]
|
|
34
|
+
WantedBy=multi-user.target
|
{phase_loop_runtime-0.7.1 → phase_loop_runtime-0.7.2}/src/phase_loop_runtime/panel_invoker.py
RENAMED
|
@@ -196,6 +196,15 @@ class PanelLegResult:
|
|
|
196
196
|
# default 3-leg board stay byte-for-byte identical (one seat per vendor ==
|
|
197
197
|
# seat_key == leg). ABDHOME wires the per-seat spawn; this freezes the identity.
|
|
198
198
|
seat_key: str | None = None
|
|
199
|
+
# ABDNATIVE (#183 companion, Bug 2): the typed native-fill request is exposed by
|
|
200
|
+
# the ``needs_native_agent`` PROPERTY below and stored in the non-field
|
|
201
|
+
# ``_needs_native_agent`` attribute (attached via ``attach_native_agent_request``
|
|
202
|
+
# / ``object.__setattr__``). It is DELIBERATELY NOT a dataclass field (CR F2):
|
|
203
|
+
# ``dataclasses.asdict`` and any field-walking serializer (golden,
|
|
204
|
+
# AdvisorBoardEvent) enumerate ``fields()`` only, so the affordance is
|
|
205
|
+
# structurally UNABLE to leak into the (status, text) golden surface. The
|
|
206
|
+
# property reads a default of ``None`` so a plain leg (none attached) is never
|
|
207
|
+
# an AttributeError.
|
|
199
208
|
|
|
200
209
|
def __post_init__(self) -> None:
|
|
201
210
|
object.__setattr__(self, "status", normalize_leg_status(self.status))
|
|
@@ -206,6 +215,21 @@ class PanelLegResult:
|
|
|
206
215
|
def usable(self) -> bool:
|
|
207
216
|
return self.status == "OK" and bool(self.text.strip())
|
|
208
217
|
|
|
218
|
+
@property
|
|
219
|
+
def needs_native_agent(self) -> "NativeAgentLegRequest | None":
|
|
220
|
+
return getattr(self, "_needs_native_agent", None)
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def attach_native_agent_request(
|
|
224
|
+
leg: PanelLegResult, request: "NativeAgentLegRequest"
|
|
225
|
+
) -> PanelLegResult:
|
|
226
|
+
"""Attach a native-fill request to a (frozen) ``PanelLegResult`` post-creation
|
|
227
|
+
(CR F2): stored in the NON-field ``_needs_native_agent`` so ``asdict``/golden
|
|
228
|
+
serializers never see it; read back via the ``needs_native_agent`` property.
|
|
229
|
+
Returns ``leg`` for call-site convenience."""
|
|
230
|
+
object.__setattr__(leg, "_needs_native_agent", request)
|
|
231
|
+
return leg
|
|
232
|
+
|
|
209
233
|
|
|
210
234
|
@dataclass(frozen=True)
|
|
211
235
|
class PanelResult:
|
|
@@ -215,6 +239,16 @@ class PanelResult:
|
|
|
215
239
|
def usable_legs(self) -> tuple[PanelLegResult, ...]:
|
|
216
240
|
return tuple(leg for leg in self.legs if leg.usable)
|
|
217
241
|
|
|
242
|
+
@property
|
|
243
|
+
def native_fill_requests(self) -> tuple["NativeAgentLegRequest", ...]:
|
|
244
|
+
"""ABDNATIVE (#183 companion): the deferred seats a driving host can fill
|
|
245
|
+
natively (each carries seat_key/model/effort/lens + the review contract).
|
|
246
|
+
A non-empty result means the board is SHORT those seats until they are
|
|
247
|
+
filled — the loud requested-vs-delivered signal the caller must not miss."""
|
|
248
|
+
return tuple(
|
|
249
|
+
leg.needs_native_agent for leg in self.legs if leg.needs_native_agent is not None
|
|
250
|
+
)
|
|
251
|
+
|
|
218
252
|
|
|
219
253
|
def available_panel_legs(probe: Callable[[str], bool] | None = None) -> tuple[str, ...]:
|
|
220
254
|
"""Metadata-only liveness preflight: which panel legs have their CLI present.
|
|
@@ -1400,12 +1434,18 @@ def _normalize_claude_agent_state(value: object) -> str:
|
|
|
1400
1434
|
# under_claude_code — we are INSIDE a Claude Code session; the driving
|
|
1401
1435
|
# session supplies the leg as its own NATIVE Agent
|
|
1402
1436
|
# (Task tool). Spawning a second Claude TUI here is
|
|
1403
|
-
# the wrong route.
|
|
1404
|
-
#
|
|
1405
|
-
#
|
|
1406
|
-
#
|
|
1407
|
-
#
|
|
1408
|
-
#
|
|
1437
|
+
# the wrong route. This is the RUNTIME-EMITTED defer
|
|
1438
|
+
# code (the only case `_exec_claude_tui_leg` defers).
|
|
1439
|
+
# native_adapter_required — an AFFORDANCE/fallback for a host that fulfills the
|
|
1440
|
+
# leg via its OWN sub-agent adapter instead of the
|
|
1441
|
+
# runtime's self-PTY TUI (see native_agent_leg_request()).
|
|
1442
|
+
# #183: the runtime NO LONGER defers a headless / no-tty
|
|
1443
|
+
# NON-Claude host by default — `_run_claude_tui_session`
|
|
1444
|
+
# self-allocates its own PTY, so the leg RUNS there. This
|
|
1445
|
+
# code is produced only by a standalone
|
|
1446
|
+
# `native_agent_leg_request(env=<non-Claude>)` call, for
|
|
1447
|
+
# a host that cannot drive the TUI or prefers its own
|
|
1448
|
+
# agent (e.g. the Codex Desktop tool shell).
|
|
1409
1449
|
_CLAUDE_LEG_DEFERRED_UNDER_CLAUDE_CODE = "under_claude_code"
|
|
1410
1450
|
_CLAUDE_LEG_DEFERRED_NATIVE_ADAPTER = "native_adapter_required"
|
|
1411
1451
|
|
|
@@ -1416,10 +1456,10 @@ _CLAUDE_LEG_DEFERRED_REASONS: dict[str, str] = {
|
|
|
1416
1456
|
"runtime must not spawn a second Claude TUI here."
|
|
1417
1457
|
),
|
|
1418
1458
|
_CLAUDE_LEG_DEFERRED_NATIVE_ADAPTER: (
|
|
1419
|
-
"claude leg
|
|
1420
|
-
"
|
|
1421
|
-
"
|
|
1422
|
-
"native_agent_leg_request()."
|
|
1459
|
+
"claude leg available as an AFFORDANCE for this headless / no-tty host: "
|
|
1460
|
+
"#183 the runtime runs the self-PTY TUI here by default, but a host that "
|
|
1461
|
+
"cannot drive a TUI (or prefers its own agent) may fulfill the leg via its "
|
|
1462
|
+
"native sub-agent adapter — see native_agent_leg_request()."
|
|
1423
1463
|
),
|
|
1424
1464
|
}
|
|
1425
1465
|
|
|
@@ -1465,6 +1505,17 @@ class NativeAgentLegRequest:
|
|
|
1465
1505
|
caller's inputs (:func:`native_agent_leg_request`) and is NEVER threaded
|
|
1466
1506
|
through the governed ``(status, text)`` spawn boundary — keeping the panel /
|
|
1467
1507
|
advisor-board golden byte-identical (#92 A4).
|
|
1508
|
+
|
|
1509
|
+
ABDNATIVE (#183 companion, Bug 2): when the board attaches this to a deferred
|
|
1510
|
+
leg in the ``PanelResult`` (``PanelLegResult.needs_native_agent``), it carries
|
|
1511
|
+
the SEAT cognition the driver must reproduce — ``seat_key`` / ``effort`` /
|
|
1512
|
+
``lens`` (the model is already here) — plus the ``artifact_ref`` the board was
|
|
1513
|
+
given and the effective ``brief_ref`` (so the native fill reviews under the SAME
|
|
1514
|
+
acceptance brief as the runtime legs — the ``instructions`` field already carries
|
|
1515
|
+
the resolved brief text). These are optional (``None``) so the pure standalone
|
|
1516
|
+
builder and its existing callers are byte-unchanged; ``to_dict`` OMITS every
|
|
1517
|
+
``None`` optional key, so a bare #125 builder call serializes to exactly the
|
|
1518
|
+
original 8-key shape (byte-compat).
|
|
1468
1519
|
"""
|
|
1469
1520
|
|
|
1470
1521
|
leg: str
|
|
@@ -1475,10 +1526,25 @@ class NativeAgentLegRequest:
|
|
|
1475
1526
|
instructions: str
|
|
1476
1527
|
verdict_required: bool
|
|
1477
1528
|
verdict_contract: str
|
|
1529
|
+
# ABDNATIVE seat cognition (set when surfaced on a board result; None for the
|
|
1530
|
+
# pure standalone builder call). ``seat_key``/``effort``/``lens`` tell the
|
|
1531
|
+
# driver exactly which cognition to reproduce; ``artifact_ref`` names the
|
|
1532
|
+
# material the board reviewed; ``brief_ref`` names the effective review brief
|
|
1533
|
+
# (the driver usually already holds artifact + brief).
|
|
1534
|
+
seat_key: str | None = None
|
|
1535
|
+
effort: str | None = None
|
|
1536
|
+
lens: str | None = None
|
|
1537
|
+
artifact_ref: str | None = None
|
|
1538
|
+
brief_ref: str | None = None
|
|
1478
1539
|
|
|
1479
1540
|
def to_dict(self) -> dict[str, object]:
|
|
1480
|
-
"""JSON-serializable form for a host driver to consume across a tool boundary.
|
|
1481
|
-
|
|
1541
|
+
"""JSON-serializable form for a host driver to consume across a tool boundary.
|
|
1542
|
+
|
|
1543
|
+
Byte-compat (CR F1): the eight base keys are always present; each ADDITIVE
|
|
1544
|
+
optional key is emitted ONLY when set, so a bare ``native_agent_leg_request``
|
|
1545
|
+
call (all optionals ``None``) serializes to the exact original 8-key shape
|
|
1546
|
+
that #125's callers depend on."""
|
|
1547
|
+
out: dict[str, object] = {
|
|
1482
1548
|
"leg": self.leg,
|
|
1483
1549
|
"model": self.model,
|
|
1484
1550
|
"mode": self.mode,
|
|
@@ -1488,6 +1554,11 @@ class NativeAgentLegRequest:
|
|
|
1488
1554
|
"verdict_required": self.verdict_required,
|
|
1489
1555
|
"verdict_contract": self.verdict_contract,
|
|
1490
1556
|
}
|
|
1557
|
+
for key in ("seat_key", "effort", "lens", "artifact_ref", "brief_ref"):
|
|
1558
|
+
value = getattr(self, key)
|
|
1559
|
+
if value is not None:
|
|
1560
|
+
out[key] = value
|
|
1561
|
+
return out
|
|
1491
1562
|
|
|
1492
1563
|
|
|
1493
1564
|
# The terminal-verdict contract a native-fulfilled review leg must satisfy so its
|
|
@@ -1510,6 +1581,12 @@ def native_agent_leg_request(
|
|
|
1510
1581
|
mode: str = "review",
|
|
1511
1582
|
env: Mapping[str, str] | None = None,
|
|
1512
1583
|
model: str | None = None,
|
|
1584
|
+
seat_key: str | None = None,
|
|
1585
|
+
effort: str | None = None,
|
|
1586
|
+
lens: str | None = None,
|
|
1587
|
+
artifact_ref: str | None = None,
|
|
1588
|
+
brief_ref: str | None = None,
|
|
1589
|
+
instructions: str | None = None,
|
|
1513
1590
|
) -> NativeAgentLegRequest:
|
|
1514
1591
|
"""Build the structured request a host driver fulfills for a deferred leg (#125).
|
|
1515
1592
|
|
|
@@ -1518,6 +1595,15 @@ def native_agent_leg_request(
|
|
|
1518
1595
|
``UNAVAILABLE`` for this leg). ``mode`` selects the review vs advisory brief +
|
|
1519
1596
|
verdict contract; ``env`` selects the deferred-reason code (under Claude Code
|
|
1520
1597
|
vs native-adapter-required); ``model`` defaults to the seat's canonical model.
|
|
1598
|
+
|
|
1599
|
+
ABDNATIVE (#183 companion): the board passes the deferred seat's cognition
|
|
1600
|
+
(``seat_key`` / ``effort`` / ``lens``), the reviewed ``artifact_ref``, and the
|
|
1601
|
+
effective ``brief_ref`` so the surfaced request fully specifies the native fill.
|
|
1602
|
+
``instructions`` (CR F5) OVERRIDES the default ``_mode_instructions(mode)`` with
|
|
1603
|
+
the RESOLVED effective brief — so a board invoked with a custom ``brief_ref``
|
|
1604
|
+
hands the native seat the SAME acceptance brief as the runtime legs, not the
|
|
1605
|
+
default. All default ``None`` — the bare standalone call is byte-unchanged
|
|
1606
|
+
(#125 callers/tests unaffected).
|
|
1521
1607
|
"""
|
|
1522
1608
|
reason, detail = _claude_leg_deferred_reason(env)
|
|
1523
1609
|
verdict_required = mode != "advisory"
|
|
@@ -1527,11 +1613,16 @@ def native_agent_leg_request(
|
|
|
1527
1613
|
mode=mode,
|
|
1528
1614
|
reason=reason,
|
|
1529
1615
|
detail=detail,
|
|
1530
|
-
instructions=_mode_instructions(mode),
|
|
1616
|
+
instructions=instructions if instructions is not None else _mode_instructions(mode),
|
|
1531
1617
|
verdict_required=verdict_required,
|
|
1532
1618
|
verdict_contract=(
|
|
1533
1619
|
_REVIEW_VERDICT_CONTRACT if verdict_required else _ADVISORY_VERDICT_CONTRACT
|
|
1534
1620
|
),
|
|
1621
|
+
seat_key=seat_key,
|
|
1622
|
+
effort=effort,
|
|
1623
|
+
lens=lens,
|
|
1624
|
+
artifact_ref=artifact_ref,
|
|
1625
|
+
brief_ref=brief_ref,
|
|
1535
1626
|
)
|
|
1536
1627
|
|
|
1537
1628
|
|
|
@@ -1547,8 +1638,12 @@ def _tui_capable(
|
|
|
1547
1638
|
env: Mapping[str, str] | None = None,
|
|
1548
1639
|
isatty: Callable[[], bool] | None = None,
|
|
1549
1640
|
) -> bool:
|
|
1550
|
-
"""
|
|
1551
|
-
|
|
1641
|
+
"""True iff the PARENT has a usable controlling terminal AND we are not under
|
|
1642
|
+
Claude Code. Retained as a capability predicate, but as of #183 it is NO LONGER
|
|
1643
|
+
the gate for running the claude TUI leg: ``_exec_claude_tui_leg`` gates on
|
|
1644
|
+
``_under_claude_code`` alone, because ``_run_claude_tui_session`` self-allocates
|
|
1645
|
+
its own PTY and never needs the parent's tty. Kept for callers/tests that
|
|
1646
|
+
genuinely want to know whether the parent is terminal-attached."""
|
|
1552
1647
|
if _under_claude_code(env):
|
|
1553
1648
|
return False
|
|
1554
1649
|
check = isatty if isatty is not None else (lambda: sys.stdin.isatty() and sys.stdout.isatty())
|
|
@@ -1584,28 +1679,43 @@ def _exec_claude_tui_leg(
|
|
|
1584
1679
|
``resolve_seat_env`` result so per-seat effort + active env scrubbing reach the
|
|
1585
1680
|
real launch.
|
|
1586
1681
|
"""
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
#
|
|
1598
|
-
#
|
|
1599
|
-
#
|
|
1600
|
-
#
|
|
1601
|
-
#
|
|
1602
|
-
#
|
|
1682
|
+
# CR F4: the under-Claude-Code deferral MUST come BEFORE the local-CLI support
|
|
1683
|
+
# check. Inside Claude Code the driving session fulfills the leg as its own
|
|
1684
|
+
# native Task Agent (its authed session), which does NOT depend on a standalone
|
|
1685
|
+
# `claude` CLI being installed/current on the host. Checking support first would
|
|
1686
|
+
# return `UNAVAILABLE` + a NON-empty support detail on a Claude-Code host that
|
|
1687
|
+
# lacks the local CLI — and `_run_seat`'s deferral signature is UNAVAILABLE +
|
|
1688
|
+
# EMPTY text, so the native-fill request would never be attached: a silent drop.
|
|
1689
|
+
# Defer first (empty text, native request emitted), THEN check local support for
|
|
1690
|
+
# the run path.
|
|
1691
|
+
if _under_claude_code(env):
|
|
1692
|
+
# #92: INSIDE Claude Code, do NOT spawn a SECOND Claude TUI we cannot
|
|
1693
|
+
# drive. Degrade cleanly with the existing UNAVAILABLE status and EMPTY
|
|
1694
|
+
# review text — the empty text is load-bearing (A4): an UNAVAILABLE leg
|
|
1695
|
+
# with empty text becomes a non-gating `panel_leg_degraded` warn, never a
|
|
1696
|
+
# block, and `usable` (status=="OK") never counts it as an AGREE. The
|
|
1697
|
+
# driving Claude Code session supplies this leg natively (a Task Agent) —
|
|
1698
|
+
# see the `needs_native_agent` request the board attaches at the
|
|
1699
|
+
# invoke_board layer (ABDNATIVE / #183).
|
|
1700
|
+
#
|
|
1701
|
+
# #183 (owner-confirmed reconciliation): a merely non-TTY parent is NOT a
|
|
1702
|
+
# defer reason. `_run_claude_tui_session` SELF-ALLOCATES its own PTY
|
|
1703
|
+
# (pty.openpty), so a headless NON-Claude caller (e.g. Codex Desktop) with
|
|
1704
|
+
# valid Claude Max OAuth runs the leg RIGHT HERE — the old `_tui_capable`
|
|
1705
|
+
# parent-tty gate over-blocked that case. `native_adapter_required` is now
|
|
1706
|
+
# an AFFORDANCE/fallback (via native_agent_leg_request()) for a host that
|
|
1707
|
+
# cannot drive the TUI or prefers its own sub-agent, NOT the default that
|
|
1708
|
+
# silently dropped the seat.
|
|
1603
1709
|
reason_code, reason_detail = _claude_leg_deferred_reason(env)
|
|
1604
1710
|
logging.getLogger(__name__).warning(
|
|
1605
1711
|
"advisor-panel claude leg deferred [%s]: %s", reason_code, reason_detail
|
|
1606
1712
|
)
|
|
1607
1713
|
return "UNAVAILABLE", ""
|
|
1608
1714
|
|
|
1715
|
+
supported, support_detail = _claude_code_support_status()
|
|
1716
|
+
if not supported:
|
|
1717
|
+
return "UNAVAILABLE", support_detail
|
|
1718
|
+
|
|
1609
1719
|
env = _subscription_env() if env is None else dict(env)
|
|
1610
1720
|
output_file = out_dir / "panel-claude.txt"
|
|
1611
1721
|
prompt = _render_claude_tui_prompt(artifact, review_dir, output_file, mode)
|
|
@@ -2701,7 +2811,40 @@ def invoke_board(
|
|
|
2701
2811
|
status = "DEGRADED"
|
|
2702
2812
|
if status == "OK" and not str(text).strip():
|
|
2703
2813
|
status = "EMPTY"
|
|
2704
|
-
|
|
2814
|
+
# ABDNATIVE (#183 companion, Bug 2): when the claude/Fable seat DEFERS (the
|
|
2815
|
+
# runtime cannot drive the leg here: #92 under Claude Code, or a headless
|
|
2816
|
+
# host), surface a typed native-fill request ON THE RESULT so a driving
|
|
2817
|
+
# harness sees "YOUR seat to fill" — not a log line + a bare UNAVAILABLE.
|
|
2818
|
+
# The deferral signature is UNAVAILABLE with EMPTY text (the #92 A4
|
|
2819
|
+
# invariant); the support-missing UNAVAILABLE carries a non-empty detail and
|
|
2820
|
+
# is a genuine "no claude here", not a fillable seat. Reuse the shipped #125
|
|
2821
|
+
# builder; pass the seat cognition + reviewed artifact + the EFFECTIVE brief
|
|
2822
|
+
# (CR F5: the native seat must review under the SAME acceptance contract as
|
|
2823
|
+
# the runtime legs — `_resolve_brief` gives the exact `review-instructions.md`
|
|
2824
|
+
# the other seats got). None for every other leg (golden byte-identity holds).
|
|
2825
|
+
result = PanelLegResult(leg=leg, status=status, text=str(text), seat_key=seat.seat_key)
|
|
2826
|
+
if leg == "claude" and status == "UNAVAILABLE" and not str(text).strip():
|
|
2827
|
+
try:
|
|
2828
|
+
effective_instructions = _resolve_brief(mode, brief_ref)
|
|
2829
|
+
except (ValueError, OSError):
|
|
2830
|
+
# brief_ref was already validated on the run path that reached the
|
|
2831
|
+
# defer; fall back to the mode brief rather than crash the seat.
|
|
2832
|
+
effective_instructions = _mode_instructions(mode)
|
|
2833
|
+
request = native_agent_leg_request(
|
|
2834
|
+
leg=leg,
|
|
2835
|
+
mode=mode,
|
|
2836
|
+
env=env_source,
|
|
2837
|
+
model=seat.model,
|
|
2838
|
+
seat_key=seat.seat_key,
|
|
2839
|
+
effort=seat.effort,
|
|
2840
|
+
lens=seat.lens,
|
|
2841
|
+
artifact_ref=str(artifact_ref) if isinstance(artifact_ref, str) else None,
|
|
2842
|
+
brief_ref=str(brief_ref) if isinstance(brief_ref, str) else None,
|
|
2843
|
+
instructions=effective_instructions,
|
|
2844
|
+
)
|
|
2845
|
+
# CR F2: attach post-creation (non-field) so asdict/golden can't see it.
|
|
2846
|
+
attach_native_agent_request(result, request)
|
|
2847
|
+
return result
|
|
2705
2848
|
|
|
2706
2849
|
# Fan the seats out concurrently (parallel by default; max_concurrency=1 →
|
|
2707
2850
|
# sequential); results come back in SEAT ORDER (positional re-key + golden
|
|
@@ -39,7 +39,9 @@ Legs fan out concurrently, so panel wall-clock ≈ max(leg), not sum. Each leg's
|
|
|
39
39
|
|
|
40
40
|
## Use
|
|
41
41
|
|
|
42
|
-
**On a Harness Code host, run the claude/Fable leg as a NATIVE Agent, not the runtime TUI.** When you are *inside* Harness Code, the runtime runs the non-<harness> board legs (`grok`, `codex`, `gemini` — whichever are available AND authenticated) and returns the `claude` leg as `UNAVAILABLE` ("deferred to native Agent") by design — it must not spawn a second Harness TUI. Supply the <harness> leg yourself with the Task tool (a Fable
|
|
42
|
+
**On a Harness Code host, run the claude/Fable leg as a NATIVE Agent, not the runtime TUI.** When you are *inside* Harness Code, the runtime runs the non-<harness> board legs (`grok`, `codex`, `gemini` — whichever are available AND authenticated) and returns the `claude` leg as `UNAVAILABLE` ("deferred to native Agent") by design — it must not spawn a second Harness TUI. Supply the <harness> leg yourself with the Task tool (a Fable review Agent given the same `review-instructions.md` + `review-bundle.md`), require it to end with `AGREE`/`PARTIALLY AGREE`/`DISAGREE`, and reconcile it with ALL the runtime legs (do NOT drop `grok` — the board is 4-vendor, not the old 3-leg panel). A `UNAVAILABLE` <harness> leg is a *gap to fill*, not an acceptable board short a seat.
|
|
43
|
+
|
|
44
|
+
**Fill the deferred seat from the typed request — do not silently run a degraded board.** A deferred seat now carries a machine-readable `needs_native_agent` request on the RESULT (`result.legs[i].needs_native_agent`, also `result.native_fill_requests`, and per-leg + under `shortfall` in `advisor-board --json`). It packages `{seat_key, model, effort, lens, reason, instructions, verdict_contract, artifact_ref}` — everything you need to fill the seat, so filling is the obvious next step, not prose to decode. When a seat has `needs_native_agent`, the DEFAULT action is: run a native Fable review Agent with the Task tool (`model: fable`, at the request's `lens` and `effort`), give it the staged `review-instructions.md` + `review-bundle.md` (the `artifact_ref` names the material), require the `verdict_contract` terminal verdict, and reconcile that verdict with the runtime legs in your own context. The runtime does NOT merge the native verdict back for you — the result marks the gap; you fill it. Under-running the board (accepting the shortfall) is allowed only as an EXPLICIT, provenance-tagged choice — record which requested seats you left unfilled and why — never a silent 3-of-4. The requested-vs-delivered shortfall (`requested_seats` / `delivered_seats` / `natively_fillable_seats`) is the loud signal that you are short a seat.
|
|
43
45
|
|
|
44
46
|
1. Prefer the repo's governed phase-loop path when reviewing phase execution or pre-merge work.
|
|
45
47
|
2. For a standalone smoke or diagnostic, run `phase-loop advisor-board <artifact>` (or, in-process, compose with `compose_review_board` and pass the material's path via `artifact_ref` to `phase_loop_runtime.panel_invoker.invoke_board`).
|
|
@@ -59,6 +61,9 @@ board = compose_review_board()
|
|
|
59
61
|
result = invoke_board(board, "", artifact_ref="path/to/bundle.md")
|
|
60
62
|
for leg in result.legs:
|
|
61
63
|
print(leg.seat_key, leg.status)
|
|
64
|
+
if leg.needs_native_agent: # deferred seat → fill with a native Fable Task Agent
|
|
65
|
+
req = leg.needs_native_agent
|
|
66
|
+
print(" fill natively:", req.model, req.effort, req.lens, req.reason)
|
|
62
67
|
```
|
|
63
68
|
|
|
64
|
-
Under Harness Code, expect the `claude` leg to report `UNAVAILABLE` (deferred to the native Agent) — the runtime does not spawn a Harness TUI here.
|
|
69
|
+
Under Harness Code, expect the `claude` leg to report `UNAVAILABLE` (deferred to the native Agent) and carry a `needs_native_agent` request — the runtime does not spawn a Harness TUI here. Fill the seat with a native Fable Task Agent (`model: fable`, at `req.lens` / `req.effort`), then reconcile its verdict with ALL the runtime legs (`grok` + `codex` + `gemini`, whichever are up and authed) — the board is 4-vendor, so do not drop `grok`. Leaving the seat unfilled is an explicit, provenance-tagged choice, never a silent short-a-seat board.
|
|
@@ -39,7 +39,9 @@ Legs fan out concurrently, so panel wall-clock ≈ max(leg), not sum. Each leg's
|
|
|
39
39
|
|
|
40
40
|
## Use
|
|
41
41
|
|
|
42
|
-
**On a Harness Code host, run the claude/Fable leg as a NATIVE Agent, not the runtime TUI.** When you are *inside* Harness Code, the runtime runs the non-<harness> board legs (`grok`, `codex`, `gemini` — whichever are available AND authenticated) and returns the `claude` leg as `UNAVAILABLE` ("deferred to native Agent") by design — it must not spawn a second Harness TUI. Supply the <harness> leg yourself with the Task tool (a Fable
|
|
42
|
+
**On a Harness Code host, run the claude/Fable leg as a NATIVE Agent, not the runtime TUI.** When you are *inside* Harness Code, the runtime runs the non-<harness> board legs (`grok`, `codex`, `gemini` — whichever are available AND authenticated) and returns the `claude` leg as `UNAVAILABLE` ("deferred to native Agent") by design — it must not spawn a second Harness TUI. Supply the <harness> leg yourself with the Task tool (a Fable review Agent given the same `review-instructions.md` + `review-bundle.md`), require it to end with `AGREE`/`PARTIALLY AGREE`/`DISAGREE`, and reconcile it with ALL the runtime legs (do NOT drop `grok` — the board is 4-vendor, not the old 3-leg panel). A `UNAVAILABLE` <harness> leg is a *gap to fill*, not an acceptable board short a seat.
|
|
43
|
+
|
|
44
|
+
**Fill the deferred seat from the typed request — do not silently run a degraded board.** A deferred seat now carries a machine-readable `needs_native_agent` request on the RESULT (`result.legs[i].needs_native_agent`, also `result.native_fill_requests`, and per-leg + under `shortfall` in `advisor-board --json`). It packages `{seat_key, model, effort, lens, reason, instructions, verdict_contract, artifact_ref}` — everything you need to fill the seat, so filling is the obvious next step, not prose to decode. When a seat has `needs_native_agent`, the DEFAULT action is: run a native Fable review Agent with the Task tool (`model: fable`, at the request's `lens` and `effort`), give it the staged `review-instructions.md` + `review-bundle.md` (the `artifact_ref` names the material), require the `verdict_contract` terminal verdict, and reconcile that verdict with the runtime legs in your own context. The runtime does NOT merge the native verdict back for you — the result marks the gap; you fill it. Under-running the board (accepting the shortfall) is allowed only as an EXPLICIT, provenance-tagged choice — record which requested seats you left unfilled and why — never a silent 3-of-4. The requested-vs-delivered shortfall (`requested_seats` / `delivered_seats` / `natively_fillable_seats`) is the loud signal that you are short a seat.
|
|
43
45
|
|
|
44
46
|
1. Prefer the repo's governed phase-loop path when reviewing phase execution or pre-merge work.
|
|
45
47
|
2. For a standalone smoke or diagnostic, run `phase-loop advisor-board <artifact>` (or, in-process, compose with `compose_review_board` and pass the material's path via `artifact_ref` to `phase_loop_runtime.panel_invoker.invoke_board`).
|
|
@@ -59,6 +61,9 @@ board = compose_review_board()
|
|
|
59
61
|
result = invoke_board(board, "", artifact_ref="path/to/bundle.md")
|
|
60
62
|
for leg in result.legs:
|
|
61
63
|
print(leg.seat_key, leg.status)
|
|
64
|
+
if leg.needs_native_agent: # deferred seat → fill with a native Fable Task Agent
|
|
65
|
+
req = leg.needs_native_agent
|
|
66
|
+
print(" fill natively:", req.model, req.effort, req.lens, req.reason)
|
|
62
67
|
```
|
|
63
68
|
|
|
64
|
-
Under Harness Code, expect the `claude` leg to report `UNAVAILABLE` (deferred to the native Agent) — the runtime does not spawn a Harness TUI here.
|
|
69
|
+
Under Harness Code, expect the `claude` leg to report `UNAVAILABLE` (deferred to the native Agent) and carry a `needs_native_agent` request — the runtime does not spawn a Harness TUI here. Fill the seat with a native Fable Task Agent (`model: fable`, at `req.lens` / `req.effort`), then reconcile its verdict with ALL the runtime legs (`grok` + `codex` + `gemini`, whichever are up and authed) — the board is 4-vendor, so do not drop `grok`. Leaving the seat unfilled is an explicit, provenance-tagged choice, never a silent short-a-seat board.
|
|
@@ -44,22 +44,23 @@ Legs fan out concurrently, so panel wall-clock ≈ max(leg), not sum. Each leg's
|
|
|
44
44
|
3. Require every leg to end with `AGREE`, `PARTIALLY AGREE`, or `DISAGREE`.
|
|
45
45
|
4. Treat `EMPTY`, `TIMEOUT`, `ERROR`, `DEGRADED`, and `UNAVAILABLE` as structured evidence, not successful reviews.
|
|
46
46
|
5. Keep provider API keys out of the environment; the runtime strips known API-key variables and uses local subscription CLIs.
|
|
47
|
-
6.
|
|
47
|
+
6. On a Claude Code host the runtime DEFERS the `claude` leg (`UNAVAILABLE`, empty text) so you supply it as a native `Task` Agent (#92); on a headless NON-Claude host (e.g. Harness Desktop) the runtime now RUNS the leg itself through a self-allocated PTY (#183), so it is NOT deferred there. See "Fulfilling the deferred claude leg natively" below for the Claude-Code defer and the native-adapter fallback.
|
|
48
48
|
|
|
49
|
-
## Fulfilling The Deferred Claude Leg Natively (#125)
|
|
49
|
+
## Fulfilling The Deferred Claude Leg Natively (#125 / #183)
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
The runtime defers the `claude` leg (`status="UNAVAILABLE"`, empty text — never counted as an AGREE, recorded as a non-gating `panel_leg_degraded` warn) ONLY when it cannot drive a Claude TUI here. Two machine-branchable reason codes:
|
|
52
52
|
|
|
53
|
-
- `under_claude_code` — you are running INSIDE a Claude Code session (`CLAUDECODE=1`). The driving Claude Code session supplies the leg as its own native `Task` Agent.
|
|
54
|
-
- `native_adapter_required` — a headless / no-tty host such as the **Harness Desktop** tool shell (`CLAUDECODE` unset, stdin/stdout not a tty).
|
|
53
|
+
- `under_claude_code` — you are running INSIDE a Claude Code session (`CLAUDECODE=1`). The driving Claude Code session supplies the leg as its own native `Task` Agent. This is the case the RUNTIME actually defers.
|
|
54
|
+
- `native_adapter_required` — an AFFORDANCE / fallback (#183). On a headless / no-tty host such as the **Harness Desktop** tool shell (`CLAUDECODE` unset, stdin/stdout not a tty) the runtime now RUNS the self-PTY TUI itself, so the leg is NOT deferred by default. Use this path only when the runtime cannot run the TUI (no Claude support on the host) or you PREFER to fulfill the leg through your own native sub-agent adapter (`multi_agent_v1.spawn_agent`).
|
|
55
55
|
|
|
56
|
-
Do NOT accept
|
|
56
|
+
Do NOT accept a short board silently. When the leg IS deferred (under Claude Code), or when you deliberately opt into the native-adapter fallback, ask the runtime for the structured request instead of parsing the log line, then fulfill it natively:
|
|
57
57
|
|
|
58
58
|
```python
|
|
59
59
|
from phase_loop_runtime.panel_invoker import native_agent_leg_request
|
|
60
60
|
|
|
61
61
|
req = native_agent_leg_request(mode="review") # env defaults to os.environ
|
|
62
|
-
# req.reason == "native_adapter_required" on a
|
|
62
|
+
# req.reason == "native_adapter_required" on a non-Claude host (affordance),
|
|
63
|
+
# "under_claude_code" inside a Claude Code session.
|
|
63
64
|
# spawn a Harness native sub-agent seeded with the SAME review bundle you passed the
|
|
64
65
|
# board, plus req.instructions (the review brief) and req.verdict_contract, on
|
|
65
66
|
# req.model (Fable by default). req.to_dict() is JSON for the tool boundary.
|
|
@@ -44,22 +44,23 @@ Legs fan out concurrently, so panel wall-clock ≈ max(leg), not sum. Each leg's
|
|
|
44
44
|
3. Require every leg to end with `AGREE`, `PARTIALLY AGREE`, or `DISAGREE`.
|
|
45
45
|
4. Treat `EMPTY`, `TIMEOUT`, `ERROR`, `DEGRADED`, and `UNAVAILABLE` as structured evidence, not successful reviews.
|
|
46
46
|
5. Keep provider API keys out of the environment; the runtime strips known API-key variables and uses local subscription CLIs.
|
|
47
|
-
6.
|
|
47
|
+
6. On a Claude Code host the runtime DEFERS the `claude` leg (`UNAVAILABLE`, empty text) so you supply it as a native `Task` Agent (#92); on a headless NON-Claude host (e.g. Harness Desktop) the runtime now RUNS the leg itself through a self-allocated PTY (#183), so it is NOT deferred there. See "Fulfilling the deferred claude leg natively" below for the Claude-Code defer and the native-adapter fallback.
|
|
48
48
|
|
|
49
|
-
## Fulfilling The Deferred Claude Leg Natively (#125)
|
|
49
|
+
## Fulfilling The Deferred Claude Leg Natively (#125 / #183)
|
|
50
50
|
|
|
51
|
-
|
|
51
|
+
The runtime defers the `claude` leg (`status="UNAVAILABLE"`, empty text — never counted as an AGREE, recorded as a non-gating `panel_leg_degraded` warn) ONLY when it cannot drive a Claude TUI here. Two machine-branchable reason codes:
|
|
52
52
|
|
|
53
|
-
- `under_claude_code` — you are running INSIDE a Claude Code session (`CLAUDECODE=1`). The driving Claude Code session supplies the leg as its own native `Task` Agent.
|
|
54
|
-
- `native_adapter_required` — a headless / no-tty host such as the **Harness Desktop** tool shell (`CLAUDECODE` unset, stdin/stdout not a tty).
|
|
53
|
+
- `under_claude_code` — you are running INSIDE a Claude Code session (`CLAUDECODE=1`). The driving Claude Code session supplies the leg as its own native `Task` Agent. This is the case the RUNTIME actually defers.
|
|
54
|
+
- `native_adapter_required` — an AFFORDANCE / fallback (#183). On a headless / no-tty host such as the **Harness Desktop** tool shell (`CLAUDECODE` unset, stdin/stdout not a tty) the runtime now RUNS the self-PTY TUI itself, so the leg is NOT deferred by default. Use this path only when the runtime cannot run the TUI (no Claude support on the host) or you PREFER to fulfill the leg through your own native sub-agent adapter (`multi_agent_v1.spawn_agent`).
|
|
55
55
|
|
|
56
|
-
Do NOT accept
|
|
56
|
+
Do NOT accept a short board silently. When the leg IS deferred (under Claude Code), or when you deliberately opt into the native-adapter fallback, ask the runtime for the structured request instead of parsing the log line, then fulfill it natively:
|
|
57
57
|
|
|
58
58
|
```python
|
|
59
59
|
from phase_loop_runtime.panel_invoker import native_agent_leg_request
|
|
60
60
|
|
|
61
61
|
req = native_agent_leg_request(mode="review") # env defaults to os.environ
|
|
62
|
-
# req.reason == "native_adapter_required" on a
|
|
62
|
+
# req.reason == "native_adapter_required" on a non-Claude host (affordance),
|
|
63
|
+
# "under_claude_code" inside a Claude Code session.
|
|
63
64
|
# spawn a Harness native sub-agent seeded with the SAME review bundle you passed the
|
|
64
65
|
# board, plus req.instructions (the review brief) and req.verdict_contract, on
|
|
65
66
|
# req.model (Fable by default). req.to_dict() is JSON for the tool boundary.
|
|
@@ -16,7 +16,7 @@ from urllib.request import HTTPRedirectHandler, Request, build_opener
|
|
|
16
16
|
import rfc8785
|
|
17
17
|
|
|
18
18
|
from .task_message_broker import decode_strict_json
|
|
19
|
-
from .task_message_resolver import
|
|
19
|
+
from .task_message_resolver import APPROVAL_CONTRACT_VERSIONS, FAILURE_CODES, TaskMessageResolverError
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
COMMIT_SHA = re.compile(r"[0-9a-f]{40}")
|
|
@@ -256,7 +256,7 @@ class TaskMessageBrokerClient:
|
|
|
256
256
|
return False
|
|
257
257
|
return (
|
|
258
258
|
isinstance(approval_document, dict)
|
|
259
|
-
and approval_document.get("contract_version")
|
|
259
|
+
and approval_document.get("contract_version") in APPROVAL_CONTRACT_VERSIONS
|
|
260
260
|
and approval_document.get("authorized") is True
|
|
261
261
|
and approval_document.get("source_thread_id") == thread_id
|
|
262
262
|
and approval_document.get("source_message_id") == message_id
|