phase-loop-runtime 0.2.0__tar.gz → 0.3.0__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.2.0 → phase_loop_runtime-0.3.0}/PKG-INFO +2 -2
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/pyproject.toml +12 -7
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/__init__.py +1 -1
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +69 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_gates.py +170 -11
- phase_loop_runtime-0.3.0/src/phase_loop_runtime/gate_posture.py +135 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/panel_invoker.py +226 -8
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +11 -3
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +11 -3
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +11 -3
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +11 -3
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +11 -3
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +11 -3
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +11 -3
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +11 -3
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/PKG-INFO +2 -2
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/SOURCES.txt +5 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/requires.txt +1 -1
- phase_loop_runtime-0.3.0/tests/test_advisor_board_advisory_mode.py +177 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_backcompat.py +6 -4
- phase_loop_runtime-0.3.0/tests/test_advisor_board_ingestion.py +249 -0
- phase_loop_runtime-0.3.0/tests/test_gate_posture.py +113 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_git_discipline.py +14 -6
- phase_loop_runtime-0.3.0/tests/test_spec_conformance_gate.py +202 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/setup.cfg +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/console-summary.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/screenshot-standin.ppm +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/config.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/cli.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/launcher.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runner.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/train_runner.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_backing_homebrew.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_golden.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_invoker_spawn.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/tests/test_worktree_index.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: phase-loop-runtime
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Harness-neutral phase-loop orchestration runtime and CLI
|
|
5
5
|
Author: ViperJuice
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -18,7 +18,7 @@ Description-Content-Type: text/markdown
|
|
|
18
18
|
Requires-Dist: baml-py<0.223,>=0.222
|
|
19
19
|
Requires-Dist: pydantic<3,>=2
|
|
20
20
|
Requires-Dist: PyYAML<7,>=6
|
|
21
|
-
Requires-Dist: consiliency-contract<0.
|
|
21
|
+
Requires-Dist: consiliency-contract<0.7,>=0.6.3
|
|
22
22
|
Requires-Dist: jsonschema<5,>=4
|
|
23
23
|
Requires-Dist: tomli<3,>=2; python_version < "3.11"
|
|
24
24
|
|
|
@@ -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
|
+
version = "0.3.0"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -22,12 +22,17 @@ dependencies = [
|
|
|
22
22
|
"baml-py>=0.222,<0.223",
|
|
23
23
|
"pydantic>=2,<3",
|
|
24
24
|
"PyYAML>=6,<7",
|
|
25
|
-
#
|
|
26
|
-
#
|
|
27
|
-
#
|
|
28
|
-
#
|
|
29
|
-
#
|
|
30
|
-
|
|
25
|
+
# PIN (spec-integration v0.3.0): floor at 0.6.3 -- ships the `gate_posture_registry`
|
|
26
|
+
# AND the manifest-schema `gate_posture_overrides` key (0.6.3) that makes the dial
|
|
27
|
+
# OPERABLE (a repo can declare per-repo posture overrides without failing layout_validity),
|
|
28
|
+
# alongside `pipeline_ref_classes` + `git_discipline_protocol`. This
|
|
29
|
+
# ACTIVATES the git-discipline guardrail AND the posture dial (per-finding-class
|
|
30
|
+
# enforcement with non-retractable floors). The dial degrades gracefully on an older
|
|
31
|
+
# contract (gate_posture.available() False -> legacy per-gate behavior preserved), so
|
|
32
|
+
# < 0.6.2 stays safe; the floor guarantees the teeth are present. Warn-default remains;
|
|
33
|
+
# human_required is never set. (0.6.0 shipped self-inconsistent version refs -> fixed in
|
|
34
|
+
# 0.6.1, contract PR #18.)
|
|
35
|
+
"consiliency-contract>=0.6.3,<0.7",
|
|
31
36
|
"jsonschema>=4,<5",
|
|
32
37
|
# Advisor Board config loader (ABDREG) parses advisor-boards.toml. tomllib is
|
|
33
38
|
# stdlib on 3.11+; on the 3.10 requires-python floor it is absent, so pull in
|
|
@@ -255,3 +255,72 @@ the golden proves byte-identity):
|
|
|
255
255
|
`claude` seats) now runs two concurrent same-lane CLI/PTY sessions — a scenario this
|
|
256
256
|
fan-out newly enables and nothing yet tests. The `default` board has one claude seat,
|
|
257
257
|
so it is unaffected.
|
|
258
|
+
|
|
259
|
+
## ABDREF — "Reference, don't inline" ingestion · `panel_invoker._resolve_artifact` / `_resolve_brief`
|
|
260
|
+
|
|
261
|
+
The leg prompt was already lean (it stages `review-bundle.md` and instructs the leg
|
|
262
|
+
to READ the file); the remaining inline path was the caller→runtime boundary, where
|
|
263
|
+
building `artifact: str` forces the caller to hold the whole (20k+ token) bundle in
|
|
264
|
+
its own context. `artifact_ref` / `brief_ref` promote that to by-reference ingestion:
|
|
265
|
+
the caller passes a PATH and the runtime reads it.
|
|
266
|
+
|
|
267
|
+
- **Entry points.** `invoke_panel`, `invoke_board`, and `invoke_panel_request` accept
|
|
268
|
+
keyword-only `artifact_ref: str | Sequence[str] | None` and `brief_ref: str | None`
|
|
269
|
+
(default-valued additive extensions to the frozen signatures — back-compat, like
|
|
270
|
+
`models` / `max_concurrency`). The artifact is resolved at the TOP of the entry
|
|
271
|
+
point so timeout scaling, staging, and metadata all see the resolved content.
|
|
272
|
+
- **`_resolve_artifact(artifact, artifact_ref)`.** `artifact_ref is None` →
|
|
273
|
+
`artifact or ""` (today's bytes, verbatim). A single path (a bare string OR a
|
|
274
|
+
one-element sequence) returns the file content VERBATIM — no header — so
|
|
275
|
+
`artifact_ref=P` is byte-identical to `artifact=<contents of P>`. Multiple paths
|
|
276
|
+
concatenate deterministically in the given order, each under a `## {filename}`
|
|
277
|
+
header, joined by a blank line. `artifact_ref` WINS when both it and `artifact` are
|
|
278
|
+
supplied. A `str` is checked BEFORE the `Sequence` branch (a string is itself an
|
|
279
|
+
iterable of characters).
|
|
280
|
+
- **`_resolve_brief(mode, brief_ref)`.** `brief_ref` file when set, else
|
|
281
|
+
`_mode_instructions(mode)` — staged as `review-instructions.md`. Threaded through
|
|
282
|
+
`_default_spawn` / `_default_spawn_via_provider` (omitted-when-`None`, so the
|
|
283
|
+
default path's `_default_spawn` call stays byte-identical).
|
|
284
|
+
- **Fail-closed.** A missing `artifact_ref` / `brief_ref` path raises `ValueError`
|
|
285
|
+
NAMING the path — never a silent-empty bundle that would read as a real (empty)
|
|
286
|
+
review.
|
|
287
|
+
- **Inline-size guard (`_maybe_warn_inline_size`, `_MAX_INLINE_ARTIFACT_BYTES = 16 KB`).**
|
|
288
|
+
An INLINE (not-from-ref) artifact over the threshold logs ONE steering warning
|
|
289
|
+
pointing to `artifact_ref` — **WARN, never refuse, never mutate** (refusing would
|
|
290
|
+
break existing callers). A from-ref artifact is never warned.
|
|
291
|
+
- **Crash-residual scratch GC (`_gc_stale_panel_scratch`).** Best-effort, age-gated
|
|
292
|
+
(`max_age_s = 24h`) sweep of `pl-panel-*` dirs, called at the top of
|
|
293
|
+
`_default_spawn`. Reclaims dirs leaked when a run is KILLED before the per-run
|
|
294
|
+
`finally: rmtree` (timeout/crash); a concurrent run's fresh dir is never touched,
|
|
295
|
+
and a GC failure can NEVER affect the run (fully swallowed).
|
|
296
|
+
- **Golden byte-identity preserved.** No ref ⇒ identical staged bytes ⇒ identical
|
|
297
|
+
per-leg argv / env / timeout. `tests/test_advisor_board_golden.py` (Proof A hits
|
|
298
|
+
`_exec_leg`; Proof B injects `spawn=`) is untouched;
|
|
299
|
+
`tests/test_advisor_board_ingestion.py` proves the new path is byte-transparent.
|
|
300
|
+
|
|
301
|
+
## ABDMODE — Purpose-derived default mode + advisory prompt hygiene · `panel_invoker.py` (#107)
|
|
302
|
+
|
|
303
|
+
A board's PURPOSE now selects its default panel MODE automatically, so a domain
|
|
304
|
+
board (esp. the legal boards) runs in the right posture instead of being hard
|
|
305
|
+
code-review-gated. `tests/test_advisor_board_advisory_mode.py`.
|
|
306
|
+
|
|
307
|
+
- **`_mode_for_purpose(purpose) -> str`.** Code-review-class purposes
|
|
308
|
+
(`code-review`, `premerge-review`) → `"review"` (the strict pre-merge gate:
|
|
309
|
+
bundle is untrusted material to accept/reject, a conforming AGREE / PARTIALLY
|
|
310
|
+
AGREE / DISAGREE verdict is REQUIRED). The known domain purposes (`legal-review`,
|
|
311
|
+
`legal-strategy-review`, `legal-brainstorm`, `brainstorm`, `doc-edit`, `general`)
|
|
312
|
+
→ `"advisory"` (analysis / recommendation, no verdict — substantial prose is a
|
|
313
|
+
real leg). An UNKNOWN purpose → `"review"` (back-compat safe default: a strict
|
|
314
|
+
gate never silently loosens on an unrecognized board).
|
|
315
|
+
- **`invoke_board(mode=None)` derives, a caller-passed `mode` overrides.**
|
|
316
|
+
`invoke_board` defaults `mode` to `None`; when `None` it derives
|
|
317
|
+
`_mode_for_purpose(board.purpose)`. `invoke_panel` KEEPS its legacy
|
|
318
|
+
`mode="review"` default (no board / no purpose). `DEFAULT_BOARD.purpose` is
|
|
319
|
+
`premerge-review` → derives `"review"` → **the golden byte-identity holds** —
|
|
320
|
+
`invoke_board(DEFAULT_BOARD)` stays byte-identical to the legacy review path.
|
|
321
|
+
- **Mode-aware prompt hygiene (`_render_leg_prompt`, `_ADVISORY_INSTRUCTIONS`).**
|
|
322
|
+
The REVIEW framing is **byte-for-byte unchanged** (the golden asserts the exact
|
|
323
|
+
prompt/argv). The ADVISORY framing DROPS the code-review-gate posture — no
|
|
324
|
+
"authoritative", no "untrusted material under review", no accept/reject — while
|
|
325
|
+
KEEPING the instructions/material SEPARATION (injection-safe: the brief is your
|
|
326
|
+
task, the bundle is only material, never authoritative instructions).
|
{phase_loop_runtime-0.2.0 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_gates.py
RENAMED
|
@@ -62,7 +62,28 @@ CONSILIENCY_GATES_ENV = "PHASE_LOOP_CONSILIENCY_GATES"
|
|
|
62
62
|
CONSILIENCY_GATES_MODES: tuple[str, ...] = ("off", "warn", "hard")
|
|
63
63
|
DEFAULT_CONSILIENCY_GATES_MODE = "warn"
|
|
64
64
|
|
|
65
|
-
_GATE_NAMES = ("presence", "local_integrity", "layout_validity", "version_skew", "git_discipline")
|
|
65
|
+
_GATE_NAMES = ("presence", "local_integrity", "layout_validity", "version_skew", "git_discipline", "spec_conformance")
|
|
66
|
+
|
|
67
|
+
# spec_conformance (HGATE) — the generic conformance ladder + default bar. Advisory
|
|
68
|
+
# panel (Fable + Codex 5.5 + Gemini 3.1 Pro, unanimous) set the default PASS bar at
|
|
69
|
+
# `hash-checked`+ ("bar B"): it's the lowest rung where the claim is checkable by the
|
|
70
|
+
# existing local_integrity digest machinery, so a self-asserted `hash-checked` obligates
|
|
71
|
+
# a recorded digest rather than being a free claim. `presence-only` is an INFO-grade
|
|
72
|
+
# soft warn (declared but not digest-anchored); `present-nonconforming`/`foreign`/
|
|
73
|
+
# `unmanaged` are loud. The per-archetype/per-doc conformance floor as CONTRACT REGISTRY
|
|
74
|
+
# DATA is the deferred ratchet (do NOT hardcode org policy here). These labels mirror the
|
|
75
|
+
# contract `maturity-labels` registry; `certified` is a deprecated alias of `parity-certified`.
|
|
76
|
+
_SPEC_PROJECTION_CLASSES = ("proj-S", "proj-code")
|
|
77
|
+
_CONFORMANCE_LADDER = { # conforming rungs, low -> high
|
|
78
|
+
"presence-only": 0,
|
|
79
|
+
"hash-checked": 1,
|
|
80
|
+
"realized-edge-observed": 2,
|
|
81
|
+
"parity-certified": 3,
|
|
82
|
+
"authority-certified": 4,
|
|
83
|
+
}
|
|
84
|
+
_CONFORMANCE_ALIASES = {"certified": "parity-certified"} # deprecated alias, ranked as parity-certified
|
|
85
|
+
_NONCONFORMING_LABELS = frozenset({"present-nonconforming", "foreign", "unmanaged"})
|
|
86
|
+
_CONFORMANCE_FLOOR = "hash-checked" # bar B: the generic default PASS floor
|
|
66
87
|
|
|
67
88
|
|
|
68
89
|
def resolve_consiliency_gates_mode(env: Mapping[str, str] | None = None) -> str:
|
|
@@ -117,7 +138,8 @@ def scan_consiliency_gates(
|
|
|
117
138
|
"local_integrity": _gate_local_integrity(repo_path, manifest, mode=mode),
|
|
118
139
|
"layout_validity": _gate_layout_validity(repo_path, manifest, mode=mode),
|
|
119
140
|
"version_skew": _gate_version_skew(manifest, mode=mode),
|
|
120
|
-
"git_discipline": _gate_git_discipline(repo_path, mode=mode),
|
|
141
|
+
"git_discipline": _gate_git_discipline(repo_path, manifest, mode=mode),
|
|
142
|
+
"spec_conformance": _gate_spec_conformance(manifest, mode=mode),
|
|
121
143
|
}
|
|
122
144
|
if any(g["status"] == "blocked" for g in gates.values()):
|
|
123
145
|
overall = "blocked"
|
|
@@ -142,6 +164,50 @@ def _gate_status(findings: list[dict[str, Any]], *, mode: str, capped_warn: bool
|
|
|
142
164
|
return "warn"
|
|
143
165
|
|
|
144
166
|
|
|
167
|
+
_SEVERITY = {"note": 0, "warn": 1, "blocked": 2}
|
|
168
|
+
_SEVERITY_STATUS = {0: "passed", 1: "warn", 2: "blocked"}
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def _apply_posture(
|
|
172
|
+
findings: list[dict[str, Any]], *, manifest: Mapping[str, Any] | None, mode: str,
|
|
173
|
+
legacy_capped_all: bool = False, legacy_capped_codes: frozenset[str] = frozenset(),
|
|
174
|
+
) -> dict[str, Any]:
|
|
175
|
+
"""Retractable teeth -- resolve each finding's posture from the contract registry and
|
|
176
|
+
derive the gate status. `observe` findings are RECORDED (as notes) but never escalate
|
|
177
|
+
past `passed`; `warn` -> warn; `enforce` -> warn unless the operator opted into `hard`
|
|
178
|
+
-> blocked. Any per-repo override that LOWERS a class below its default adds the
|
|
179
|
+
non-retractable `posture_retracted` finding -- fired from the manifest overrides, so
|
|
180
|
+
de-fanging is visible even on an otherwise-clean scan.
|
|
181
|
+
|
|
182
|
+
Contract < 0.6.2 fallback preserves each gate's PRIOR severity: `legacy_capped_all`
|
|
183
|
+
caps every finding at warn (version_skew's normative phase0 const), `legacy_capped_codes`
|
|
184
|
+
caps just those codes (spec_conformance's info tier); everything else follows mode."""
|
|
185
|
+
from . import gate_posture as gp
|
|
186
|
+
|
|
187
|
+
if not gp.available():
|
|
188
|
+
if not findings:
|
|
189
|
+
return {"status": "passed", "findings": findings}
|
|
190
|
+
worst = 0
|
|
191
|
+
for f in findings:
|
|
192
|
+
capped = legacy_capped_all or str(f.get("code") or "") in legacy_capped_codes
|
|
193
|
+
worst = max(worst, _SEVERITY["warn" if (capped or mode != "hard") else "blocked"])
|
|
194
|
+
return {"status": _SEVERITY_STATUS[worst], "findings": findings}
|
|
195
|
+
|
|
196
|
+
out: list[dict[str, Any]] = []
|
|
197
|
+
worst = 0
|
|
198
|
+
for f in findings:
|
|
199
|
+
res = gp.resolve_posture(str(f.get("code") or ""), manifest=manifest)
|
|
200
|
+
worst = max(worst, _SEVERITY.get(gp.posture_status(res["posture"], mode=mode), 1))
|
|
201
|
+
out.append({**f, "posture": res["posture"]})
|
|
202
|
+
retracted = gp.retracting_overrides(manifest)
|
|
203
|
+
if retracted:
|
|
204
|
+
r = gp.resolve_posture("posture_retracted", manifest=manifest)
|
|
205
|
+
worst = max(worst, _SEVERITY.get(gp.posture_status(r["posture"], mode=mode), 1))
|
|
206
|
+
out.append({"code": "posture_retracted", "posture": r["posture"], "retracted_classes": retracted,
|
|
207
|
+
"message": "per-repo posture override lowered: " + ", ".join(retracted)})
|
|
208
|
+
return {"status": _SEVERITY_STATUS[worst], "findings": out}
|
|
209
|
+
|
|
210
|
+
|
|
145
211
|
def _declared_archetypes_modifiers(manifest: Mapping[str, Any]) -> tuple[str, tuple[str, ...], tuple[str, ...]]:
|
|
146
212
|
declaration = dict(manifest.get("declaration") or {})
|
|
147
213
|
decl_mode = str(declaration.get("mode") or "baseline-only")
|
|
@@ -178,6 +244,84 @@ def _gate_presence(repo: Path, manifest: Mapping[str, Any], *, mode: str) -> dic
|
|
|
178
244
|
return {"status": _gate_status(findings, mode=mode), "maturity": "presence-only", "findings": findings}
|
|
179
245
|
|
|
180
246
|
|
|
247
|
+
def _gate_spec_conformance(manifest: Mapping[str, Any], *, mode: str) -> dict[str, Any]:
|
|
248
|
+
"""HGATE: warn when a DECLARED spec-projection (proj-S/proj-code) sits below the
|
|
249
|
+
conformance bar. Structural — reads declared maturity, no byte/digest verification
|
|
250
|
+
(that is local_integrity's job for hash-checked, and a future canon-backed verifier's
|
|
251
|
+
for higher rungs). Full no-op when the repo declares no spec-projections (OPA-style
|
|
252
|
+
optional layer). Two-tier: `present-nonconforming`/`foreign`/`unmanaged` are loud
|
|
253
|
+
(may block under hard mode); a below-bar non-sanctioned `presence-only` is an
|
|
254
|
+
info-grade soft warn that NEVER blocks (so honest early adopters are nudged, not
|
|
255
|
+
punished).
|
|
256
|
+
|
|
257
|
+
HONESTY -- this gate is FORWARD INFRASTRUCTURE, dormant on schema-valid manifests
|
|
258
|
+
with today's contract data: (a) every proj-S/proj-code required-doc row is
|
|
259
|
+
`l0_stub_allowed` at a `presence-only` floor, so the info + below-floor branches
|
|
260
|
+
are dead until the per-archetype conformance ratchet raises floors (deferred to
|
|
261
|
+
contract-registry data); (b) the manifest schema's maturity enum is only
|
|
262
|
+
{presence-only, hash-checked, realized-edge-observed}, so the non-conforming labels
|
|
263
|
+
that drive the loud branches are schema-INVALID and already caught by
|
|
264
|
+
layout_validity. So today it fires nothing layout_validity does not; it activates
|
|
265
|
+
without code change when the schema enum + the ratchet expand. Known ceiling:
|
|
266
|
+
`hash-checked` is the only rung the harness can locally verify (via local_integrity,
|
|
267
|
+
and only for `path`-backed docs -- `ref`-backed hash-checked is not yet digest-
|
|
268
|
+
checked); `realized-edge-observed`+ pass as accepted claims, verified downstream by
|
|
269
|
+
a canon-backed verifier, not here."""
|
|
270
|
+
decl_mode, archetypes, modifiers = _declared_archetypes_modifiers(manifest)
|
|
271
|
+
try:
|
|
272
|
+
rows = compose_required_documents(mode=decl_mode, archetypes=archetypes, modifiers=modifiers)
|
|
273
|
+
except ValueError:
|
|
274
|
+
# A malformed declaration is presence/layout's finding, not conformance's.
|
|
275
|
+
return {"status": "passed", "maturity": "presence-only", "findings": [],
|
|
276
|
+
"note": "declaration invalid; deferred to presence/layout gates"}
|
|
277
|
+
proj_rows = {r.id: r for r in rows if r.doc_class in _SPEC_PROJECTION_CLASSES}
|
|
278
|
+
docs_by_id = {d.get("id"): d for d in manifest.get("documents", []) if isinstance(d, Mapping)}
|
|
279
|
+
declared = [(pid, proj_rows[pid], docs_by_id[pid]) for pid in sorted(proj_rows) if pid in docs_by_id]
|
|
280
|
+
if not declared:
|
|
281
|
+
return {"status": "passed", "maturity": "presence-only", "findings": [],
|
|
282
|
+
"note": "no spec-projection documents declared; conformance gate is a no-op"}
|
|
283
|
+
|
|
284
|
+
bar_rank = _CONFORMANCE_LADDER[_CONFORMANCE_FLOOR]
|
|
285
|
+
loud: list[dict[str, Any]] = []
|
|
286
|
+
info: list[dict[str, Any]] = []
|
|
287
|
+
for pid, row, entry in declared:
|
|
288
|
+
raw = str(entry.get("maturity") or "").strip()
|
|
289
|
+
label = _CONFORMANCE_ALIASES.get(raw, raw)
|
|
290
|
+
floor_rank = _CONFORMANCE_LADDER.get(_CONFORMANCE_ALIASES.get(row.maturity_floor, row.maturity_floor), 0)
|
|
291
|
+
if not raw:
|
|
292
|
+
loud.append({"code": "spec_maturity_missing", "doc_id": pid,
|
|
293
|
+
"message": f"spec-projection '{pid}' declares no maturity"})
|
|
294
|
+
elif label == "present-nonconforming":
|
|
295
|
+
loud.append({"code": "spec_nonconforming", "doc_id": pid, "maturity": raw,
|
|
296
|
+
"message": f"spec-projection '{pid}' is 'present-nonconforming' -- the projection asserts the code does NOT match spec"})
|
|
297
|
+
elif label in _NONCONFORMING_LABELS: # foreign / unmanaged -- governance-status, NOT a non-conformance assertion
|
|
298
|
+
loud.append({"code": "spec_ungoverned", "doc_id": pid, "maturity": raw,
|
|
299
|
+
"message": f"spec-projection '{pid}' declares governance status '{raw}' (not this repo's, or ungoverned) -- outside the conformance ladder"})
|
|
300
|
+
elif label not in _CONFORMANCE_LADDER:
|
|
301
|
+
loud.append({"code": "spec_maturity_unknown", "doc_id": pid, "maturity": raw,
|
|
302
|
+
"message": f"spec-projection '{pid}' declares an unrecognized maturity '{raw}'"})
|
|
303
|
+
elif _CONFORMANCE_LADDER[label] < floor_rank:
|
|
304
|
+
# Below the doc's OWN contract-declared maturity_floor -- a real regression.
|
|
305
|
+
loud.append({"code": "spec_below_declared_floor", "doc_id": pid, "maturity": raw, "floor": row.maturity_floor,
|
|
306
|
+
"message": f"spec-projection '{pid}' is '{raw}' but the contract floor for it is '{row.maturity_floor}'"})
|
|
307
|
+
elif _CONFORMANCE_LADDER[label] < bar_rank and not row.l0_stub_allowed:
|
|
308
|
+
# Below the generic conformance bar AND not a contract-sanctioned L0 stub -> info nudge.
|
|
309
|
+
info.append({"code": "spec_below_conformance_bar", "doc_id": pid, "maturity": raw,
|
|
310
|
+
"message": f"spec-projection '{pid}' is '{raw}'; the conformance bar is '{_CONFORMANCE_FLOOR}'+ (declared but not digest-anchored). Informational -- pass requires {_CONFORMANCE_FLOOR}+ unless it is a sanctioned L0 stub or local policy overrides."})
|
|
311
|
+
# else: at/above its contract floor and (hash-checked+ OR a sanctioned L0 stub) -> conforming
|
|
312
|
+
|
|
313
|
+
# Retractable teeth: the contract's posture registry (not a hardcoded loud/info split)
|
|
314
|
+
# now drives severity per finding-class -- spec_nonconforming/etc default to `warn`
|
|
315
|
+
# (advisory, may be raised to enforce per-repo), spec_below_conformance_bar to `observe`
|
|
316
|
+
# (a recorded note). This gate does NO digest work itself, so it reports its own
|
|
317
|
+
# maturity as presence-only (honest); hash-checked is the bar, not a verified claim.
|
|
318
|
+
# legacy_capped_codes: preserve the pre-registry info tier -- spec_below_conformance_bar
|
|
319
|
+
# never blocked even under hard, so cap it in the < 0.6.2 fallback.
|
|
320
|
+
result = _apply_posture(loud + info, manifest=manifest, mode=mode,
|
|
321
|
+
legacy_capped_codes=frozenset({"spec_below_conformance_bar"}))
|
|
322
|
+
return {"status": result["status"], "maturity": "presence-only", "findings": result["findings"]}
|
|
323
|
+
|
|
324
|
+
|
|
181
325
|
def _git_show(repo: Path, path: str) -> bytes | None:
|
|
182
326
|
try:
|
|
183
327
|
return subprocess.check_output(
|
|
@@ -222,10 +366,14 @@ def _gate_local_integrity(repo: Path, manifest: Mapping[str, Any], *, mode: str)
|
|
|
222
366
|
checked_any = True
|
|
223
367
|
if recorded != digest:
|
|
224
368
|
findings.append({"code": "hash_drift", "doc_id": doc_id, "path": path, "expected": recorded, "actual": digest})
|
|
369
|
+
# Retractable teeth: hash_drift is an audit-chain invariant floored at `warn` in the
|
|
370
|
+
# registry (warns, does not hard-block by default; can be raised to enforce). Migrated
|
|
371
|
+
# onto the dial so the contract data matches live behavior (CR: Codex/Gemini/Fable).
|
|
372
|
+
posture = _apply_posture(findings, manifest=manifest, mode=mode)
|
|
225
373
|
return {
|
|
226
|
-
"status":
|
|
374
|
+
"status": posture["status"],
|
|
227
375
|
"maturity": "hash-checked" if checked_any else "presence-only",
|
|
228
|
-
"findings": findings,
|
|
376
|
+
"findings": posture["findings"],
|
|
229
377
|
}
|
|
230
378
|
|
|
231
379
|
|
|
@@ -264,7 +412,7 @@ def _gate_layout_validity(repo: Path, manifest: Mapping[str, Any], *, mode: str)
|
|
|
264
412
|
return {"status": _gate_status(findings, mode=mode), "maturity": "presence-only", "findings": findings}
|
|
265
413
|
|
|
266
414
|
|
|
267
|
-
def _gate_git_discipline(repo: Path, *, mode: str) -> dict[str, Any]:
|
|
415
|
+
def _gate_git_discipline(repo: Path, manifest: Mapping[str, Any] | None, *, mode: str) -> dict[str, Any]:
|
|
268
416
|
"""Slice-G git-discipline guardrail: classify the repo's refs against the
|
|
269
417
|
neutral contract's ``pipeline_ref_classes`` registry and check the
|
|
270
418
|
write-footprint / branch-naming invariants. Consumes the contract, does not
|
|
@@ -296,7 +444,13 @@ def _gate_git_discipline(repo: Path, *, mode: str) -> dict[str, Any]:
|
|
|
296
444
|
registry=registry,
|
|
297
445
|
protocol=protocol,
|
|
298
446
|
)
|
|
299
|
-
|
|
447
|
+
# Retractable teeth: per-finding-class posture from the contract registry replaces the
|
|
448
|
+
# uniform _gate_status -- pipeline_branch_naming_drift softens to `observe` (a note),
|
|
449
|
+
# write_footprint_violation holds at its `warn` floor, and never_delete_human_refs is
|
|
450
|
+
# `enforce` and NON-RETRACTABLE. Legacy uniform behavior survives when the contract
|
|
451
|
+
# predates the posture registry (< 0.6.2).
|
|
452
|
+
result = _apply_posture(findings, manifest=manifest, mode=mode)
|
|
453
|
+
return {"status": result["status"], "maturity": "presence-only", "findings": result["findings"]}
|
|
300
454
|
|
|
301
455
|
|
|
302
456
|
_RANGE_RE = re.compile(r"^>=\s*([0-9.]+)\s*<\s*([0-9.]+)$")
|
|
@@ -361,14 +515,19 @@ def _gate_version_skew(manifest: Mapping[str, Any], *, mode: str) -> dict[str, A
|
|
|
361
515
|
)
|
|
362
516
|
else:
|
|
363
517
|
compatibility = "compatible"
|
|
364
|
-
# Normative: version-skew stays warn-only at Phase 0
|
|
365
|
-
#
|
|
366
|
-
#
|
|
518
|
+
# Normative: version-skew stays warn-only at Phase 0. The `version_skew` finding class
|
|
519
|
+
# carries max_posture=warn in the contract posture registry, so the cap is now contract
|
|
520
|
+
# DATA (retractable teeth) rather than the hardcoded capped_warn flag -- the legacy
|
|
521
|
+
# cap survives (fallback) when the contract predates the registry.
|
|
522
|
+
# legacy_capped_all: the version-skew phase0 severity is a normative const `warn`, so
|
|
523
|
+
# the < 0.6.2 fallback must cap at warn (never block under hard) -- preserving the old
|
|
524
|
+
# capped_warn=True behavior.
|
|
525
|
+
posture = _apply_posture(findings, manifest=manifest, mode=mode, legacy_capped_all=True)
|
|
367
526
|
return {
|
|
368
|
-
"status":
|
|
527
|
+
"status": posture["status"],
|
|
369
528
|
"maturity": "realized-edge-observed",
|
|
370
529
|
"compatibility": compatibility,
|
|
371
530
|
"installed_contract_version": installed_version,
|
|
372
531
|
"repo_contract_version": repo_version or None,
|
|
373
|
-
"findings": findings,
|
|
532
|
+
"findings": posture["findings"],
|
|
374
533
|
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"""Retractable teeth -- gate enforcement posture resolution.
|
|
2
|
+
|
|
3
|
+
Reads the merge-gated ``gate_posture_registry`` (consiliency-contract >= 0.6.2) and
|
|
4
|
+
resolves the *effective* posture for a finding class from three layers -- the contract
|
|
5
|
+
``default_posture``, then a per-repo ``.consiliency/manifest.json`` override -- clamped
|
|
6
|
+
to the class's non-retractable ``min_posture`` FLOOR and optional ``max_posture`` cap.
|
|
7
|
+
|
|
8
|
+
Posture rungs: ``observe`` < ``warn`` < ``enforce``. A per-repo override may RAISE any
|
|
9
|
+
class freely but may LOWER it only to (never below) its floor -- ``invariant`` classes
|
|
10
|
+
(never-delete-human-refs, write-footprint, hash-drift) carry a real floor; ``advisory``
|
|
11
|
+
classes retract freely to ``observe``. The operator's ``PHASE_LOOP_CONSILIENCY_GATES``
|
|
12
|
+
= off | warn | hard remains the MASTER switch: ``enforce`` blocks ONLY under ``hard``;
|
|
13
|
+
``human_required`` is NEVER set at any posture. A per-repo *downward* move is surfaced
|
|
14
|
+
via the non-retractable ``posture_retracted`` note so de-fanging is always fleet-visible.
|
|
15
|
+
|
|
16
|
+
Contract-absent degrade: if the installed contract predates the registry (< 0.6.2),
|
|
17
|
+
:func:`available` is False and callers keep their legacy status logic unchanged.
|
|
18
|
+
|
|
19
|
+
Design ratified by advisory panel (Fable + Codex 5.5 + Gemini 3.1 Pro, unanimous).
|
|
20
|
+
"""
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from typing import Any, Mapping
|
|
24
|
+
|
|
25
|
+
_RUNG = {"observe": 0, "warn": 1, "enforce": 2}
|
|
26
|
+
# Optional per-repo overrides live under this manifest key: {finding_code: posture}.
|
|
27
|
+
MANIFEST_OVERRIDE_KEY = "gate_posture_overrides"
|
|
28
|
+
_DEFAULT_UNLISTED = {"category": "advisory", "default_posture": "warn", "min_posture": "observe"}
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _rank(posture: str) -> int:
|
|
32
|
+
return _RUNG.get(posture, _RUNG["warn"])
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
_REGISTRY_CACHE: dict[str, Any] | None = None
|
|
36
|
+
_REGISTRY_LOADED = False
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _registry() -> dict[str, Any] | None:
|
|
40
|
+
global _REGISTRY_CACHE, _REGISTRY_LOADED
|
|
41
|
+
if _REGISTRY_LOADED:
|
|
42
|
+
return _REGISTRY_CACHE
|
|
43
|
+
try:
|
|
44
|
+
from consiliency_contract import load_registry
|
|
45
|
+
|
|
46
|
+
reg = load_registry("gate_posture_registry")
|
|
47
|
+
_REGISTRY_CACHE = reg if isinstance(reg, Mapping) else None
|
|
48
|
+
except Exception:
|
|
49
|
+
_REGISTRY_CACHE = None # contract predates the registry (< 0.6.2)
|
|
50
|
+
_REGISTRY_LOADED = True
|
|
51
|
+
return _REGISTRY_CACHE
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def available() -> bool:
|
|
55
|
+
"""True when the installed contract ships the posture registry (>= 0.6.2)."""
|
|
56
|
+
return _registry() is not None
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _class_entry(reg: Mapping[str, Any], code: str) -> Mapping[str, Any]:
|
|
60
|
+
for fc in reg.get("finding_classes", []):
|
|
61
|
+
if isinstance(fc, Mapping) and fc.get("code") == code:
|
|
62
|
+
return fc
|
|
63
|
+
unlisted = reg.get("default_unlisted")
|
|
64
|
+
return unlisted if isinstance(unlisted, Mapping) else _DEFAULT_UNLISTED
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _overrides(manifest: Mapping[str, Any] | None) -> dict[str, str]:
|
|
68
|
+
if isinstance(manifest, Mapping):
|
|
69
|
+
raw = manifest.get(MANIFEST_OVERRIDE_KEY)
|
|
70
|
+
if isinstance(raw, Mapping):
|
|
71
|
+
return {str(k): str(v) for k, v in raw.items()}
|
|
72
|
+
return {}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def resolve_posture(code: str, *, manifest: Mapping[str, Any] | None = None) -> dict[str, Any]:
|
|
76
|
+
"""Resolve the effective posture for a finding ``code``.
|
|
77
|
+
|
|
78
|
+
Returns a dict with the effective ``posture`` plus provenance (``default``, ``floor``,
|
|
79
|
+
``cap``, ``requested`` per-repo value, ``retracted`` = a real downward move below the
|
|
80
|
+
default, ``clamped_to_floor`` = an override that tried to go below the floor and was
|
|
81
|
+
denied, ``category``). ``available`` is False when the contract lacks the registry.
|
|
82
|
+
"""
|
|
83
|
+
reg = _registry()
|
|
84
|
+
if reg is None:
|
|
85
|
+
return {"posture": "warn", "default": "warn", "floor": "observe", "cap": None,
|
|
86
|
+
"requested": None, "retracted": False, "clamped_to_floor": False,
|
|
87
|
+
"category": "advisory", "available": False}
|
|
88
|
+
entry = _class_entry(reg, code)
|
|
89
|
+
default = str(entry.get("default_posture", "warn"))
|
|
90
|
+
floor = str(entry.get("min_posture", "observe"))
|
|
91
|
+
cap = entry.get("max_posture")
|
|
92
|
+
cap = str(cap) if cap in _RUNG else None
|
|
93
|
+
|
|
94
|
+
requested = _overrides(manifest).get(code)
|
|
95
|
+
chosen = requested if requested in _RUNG else default
|
|
96
|
+
|
|
97
|
+
effective = chosen
|
|
98
|
+
clamped_to_floor = requested in _RUNG and _rank(requested) < _rank(floor)
|
|
99
|
+
if cap and _rank(effective) > _rank(cap):
|
|
100
|
+
effective = cap
|
|
101
|
+
if _rank(effective) < _rank(floor):
|
|
102
|
+
# NON-RETRACTABLE floor: a repo can never weaken below it -- and the floor wins
|
|
103
|
+
# even over a mis-configured max_posture < min_posture registry entry.
|
|
104
|
+
effective = floor
|
|
105
|
+
|
|
106
|
+
# `retracted` reflects an ACTUAL downward move of the effective posture below the
|
|
107
|
+
# default -- a floor-clamped attempt (effective unchanged) is NOT a retraction; it is
|
|
108
|
+
# surfaced via `clamped_to_floor` instead.
|
|
109
|
+
retracted = requested in _RUNG and _rank(effective) < _rank(default)
|
|
110
|
+
return {"posture": effective, "default": default, "floor": floor, "cap": cap,
|
|
111
|
+
"requested": requested, "retracted": bool(retracted),
|
|
112
|
+
"clamped_to_floor": bool(clamped_to_floor),
|
|
113
|
+
"category": str(entry.get("category", "advisory")), "available": True}
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def retracting_overrides(manifest: Mapping[str, Any] | None) -> list[str]:
|
|
117
|
+
"""The finding codes whose per-repo override LOWERS the effective posture below its
|
|
118
|
+
default -- de-fanging that must be surfaced even when that class fired no finding this
|
|
119
|
+
scan. A floor-clamped attempt (effective unchanged) is not counted (see resolve_posture)."""
|
|
120
|
+
if _registry() is None:
|
|
121
|
+
return []
|
|
122
|
+
out = [code for code in _overrides(manifest) if resolve_posture(code, manifest=manifest)["retracted"]]
|
|
123
|
+
return sorted(set(out))
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def posture_status(posture: str, *, mode: str) -> str:
|
|
127
|
+
"""Map a resolved posture + operator mode to a gate-status contribution:
|
|
128
|
+
``observe`` -> ``note`` (recorded, never warns/blocks); ``warn`` -> ``warn``;
|
|
129
|
+
``enforce`` -> ``warn`` unless the operator opted into ``hard`` -> ``blocked``.
|
|
130
|
+
``human_required`` is never implied at any rung."""
|
|
131
|
+
if posture == "observe":
|
|
132
|
+
return "note"
|
|
133
|
+
if posture == "enforce" and mode == "hard":
|
|
134
|
+
return "blocked"
|
|
135
|
+
return "warn"
|