phase-loop-runtime 0.2.1__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.1 → phase_loop_runtime-0.3.0}/PKG-INFO +2 -2
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/pyproject.toml +12 -7
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/__init__.py +1 -1
- {phase_loop_runtime-0.2.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/PKG-INFO +2 -2
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/SOURCES.txt +3 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/requires.txt +1 -1
- phase_loop_runtime-0.3.0/tests/test_gate_posture.py +113 -0
- {phase_loop_runtime-0.2.1 → 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.1 → phase_loop_runtime-0.3.0}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/setup.cfg +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/config.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/cli.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/discovery.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/launcher.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/models.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/panel_invoker.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/release_guard.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runner.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → 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.1 → 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.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.2.1 → 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.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/train_runner.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_backcompat.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_backing_homebrew.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_golden.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_consiliency_ingest.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_docs_audit.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_governed_review.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_invoker.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_invoker_spawn.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_models.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_bundle.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_boundary.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.2.1 → 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
|
{phase_loop_runtime-0.2.1 → 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"
|
{phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/PKG-INFO
RENAMED
|
@@ -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
|
|
{phase_loop_runtime-0.2.1 → phase_loop_runtime-0.3.0}/src/phase_loop_runtime.egg-info/SOURCES.txt
RENAMED
|
@@ -37,6 +37,7 @@ src/phase_loop_runtime/evidence_audit_config.py
|
|
|
37
37
|
src/phase_loop_runtime/fleet_map.py
|
|
38
38
|
src/phase_loop_runtime/fleet_metrics.py
|
|
39
39
|
src/phase_loop_runtime/fleet_metrics_export.py
|
|
40
|
+
src/phase_loop_runtime/gate_posture.py
|
|
40
41
|
src/phase_loop_runtime/git_discipline.py
|
|
41
42
|
src/phase_loop_runtime/git_ops.py
|
|
42
43
|
src/phase_loop_runtime/git_topology.py
|
|
@@ -417,6 +418,7 @@ tests/test_fleet_map.py
|
|
|
417
418
|
tests/test_fleet_metrics.py
|
|
418
419
|
tests/test_fleet_metrics_export.py
|
|
419
420
|
tests/test_gate_a_wheel_isolation.py
|
|
421
|
+
tests/test_gate_posture.py
|
|
420
422
|
tests/test_git_discipline.py
|
|
421
423
|
tests/test_governed_disjointness_model_first.py
|
|
422
424
|
tests/test_governed_e2e.py
|
|
@@ -614,6 +616,7 @@ tests/test_skill_sources_seam.py
|
|
|
614
616
|
tests/test_skills_bundle_drift.py
|
|
615
617
|
tests/test_skills_canon_parity.py
|
|
616
618
|
tests/test_skills_src_claude_literal_lint.py
|
|
619
|
+
tests/test_spec_conformance_gate.py
|
|
617
620
|
tests/test_sync_skills_apply_failloud.py
|
|
618
621
|
tests/test_train_e2e.py
|
|
619
622
|
tests/test_train_invariants.py
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"""Retractable teeth -- posture resolution (floors, clamps, caps, retraction visibility)."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
import unittest
|
|
5
|
+
|
|
6
|
+
from phase_loop_runtime import gate_posture as gp
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class GatePostureResolveTest(unittest.TestCase):
|
|
10
|
+
def test_registry_available_on_0_6_2(self):
|
|
11
|
+
self.assertTrue(gp.available())
|
|
12
|
+
|
|
13
|
+
def test_invariant_default_is_its_floor_and_cannot_be_retracted(self):
|
|
14
|
+
# never_delete_human_refs: default enforce, floor enforce -> non-retractable.
|
|
15
|
+
base = gp.resolve_posture("never_delete_human_refs")
|
|
16
|
+
self.assertEqual(base["posture"], "enforce")
|
|
17
|
+
self.assertEqual(base["floor"], "enforce")
|
|
18
|
+
# a repo tries to silence it -> denied, clamped back to the floor
|
|
19
|
+
m = {gp.MANIFEST_OVERRIDE_KEY: {"never_delete_human_refs": "observe"}}
|
|
20
|
+
r = gp.resolve_posture("never_delete_human_refs", manifest=m)
|
|
21
|
+
self.assertEqual(r["posture"], "enforce")
|
|
22
|
+
self.assertTrue(r["clamped_to_floor"])
|
|
23
|
+
|
|
24
|
+
def test_write_footprint_floored_at_warn(self):
|
|
25
|
+
m = {gp.MANIFEST_OVERRIDE_KEY: {"write_footprint_violation": "observe"}}
|
|
26
|
+
r = gp.resolve_posture("write_footprint_violation", manifest=m)
|
|
27
|
+
self.assertEqual(r["posture"], "warn") # cannot drop below the warn floor
|
|
28
|
+
self.assertTrue(r["clamped_to_floor"])
|
|
29
|
+
|
|
30
|
+
def test_advisory_retracts_freely_and_is_flagged_retracted(self):
|
|
31
|
+
# spec_nonconforming: advisory, default warn, floor observe.
|
|
32
|
+
m = {gp.MANIFEST_OVERRIDE_KEY: {"spec_nonconforming": "observe"}}
|
|
33
|
+
r = gp.resolve_posture("spec_nonconforming", manifest=m)
|
|
34
|
+
self.assertEqual(r["posture"], "observe") # retract honored
|
|
35
|
+
self.assertTrue(r["retracted"]) # ...but recorded as a downward move
|
|
36
|
+
self.assertFalse(r["clamped_to_floor"])
|
|
37
|
+
|
|
38
|
+
def test_repo_may_raise_freely(self):
|
|
39
|
+
m = {gp.MANIFEST_OVERRIDE_KEY: {"pipeline_branch_naming_drift": "enforce"}}
|
|
40
|
+
r = gp.resolve_posture("pipeline_branch_naming_drift", manifest=m)
|
|
41
|
+
self.assertEqual(r["posture"], "enforce")
|
|
42
|
+
self.assertFalse(r["retracted"])
|
|
43
|
+
|
|
44
|
+
def test_version_skew_capped_at_warn(self):
|
|
45
|
+
# even an explicit raise to enforce is capped by max_posture.
|
|
46
|
+
m = {gp.MANIFEST_OVERRIDE_KEY: {"version_skew": "enforce"}}
|
|
47
|
+
r = gp.resolve_posture("version_skew", manifest=m)
|
|
48
|
+
self.assertEqual(r["posture"], "warn")
|
|
49
|
+
self.assertEqual(r["cap"], "warn")
|
|
50
|
+
|
|
51
|
+
def test_unlisted_code_uses_advisory_default(self):
|
|
52
|
+
r = gp.resolve_posture("some_brand_new_finding")
|
|
53
|
+
self.assertEqual(r["posture"], "warn")
|
|
54
|
+
self.assertEqual(r["category"], "advisory")
|
|
55
|
+
|
|
56
|
+
def test_clamped_invariant_is_not_flagged_retracted(self):
|
|
57
|
+
# CR fix: a floor-clamped attempt (effective unchanged) is clamped_to_floor, NOT retracted.
|
|
58
|
+
m = {gp.MANIFEST_OVERRIDE_KEY: {"never_delete_human_refs": "observe"}}
|
|
59
|
+
r = gp.resolve_posture("never_delete_human_refs", manifest=m)
|
|
60
|
+
self.assertEqual(r["posture"], "enforce")
|
|
61
|
+
self.assertFalse(r["retracted"])
|
|
62
|
+
self.assertTrue(r["clamped_to_floor"])
|
|
63
|
+
|
|
64
|
+
def test_retracting_overrides_lists_only_real_downward_moves(self):
|
|
65
|
+
# CR fix: de-fanging visible on clean scans -- retracting_overrides scans the manifest,
|
|
66
|
+
# counting only overrides that ACTUALLY lower a class (clamped invariants excluded).
|
|
67
|
+
m = {gp.MANIFEST_OVERRIDE_KEY: {
|
|
68
|
+
"spec_nonconforming": "observe", # real down-move (advisory)
|
|
69
|
+
"never_delete_human_refs": "observe", # clamped -> not counted
|
|
70
|
+
"pipeline_branch_naming_drift": "enforce"}} # a raise -> not counted
|
|
71
|
+
self.assertEqual(gp.retracting_overrides(m), ["spec_nonconforming"])
|
|
72
|
+
|
|
73
|
+
def test_max_posture_never_undercuts_the_floor(self):
|
|
74
|
+
# CR fix: floor wins even over a (hypothetical) mis-set max<min; version_skew has
|
|
75
|
+
# floor observe + cap warn, so a raise-to-enforce lands at the warn cap, not below.
|
|
76
|
+
m = {gp.MANIFEST_OVERRIDE_KEY: {"version_skew": "enforce"}}
|
|
77
|
+
self.assertEqual(gp.resolve_posture("version_skew", manifest=m)["posture"], "warn")
|
|
78
|
+
|
|
79
|
+
def test_posture_status_mapping(self):
|
|
80
|
+
self.assertEqual(gp.posture_status("observe", mode="warn"), "note")
|
|
81
|
+
self.assertEqual(gp.posture_status("observe", mode="hard"), "note")
|
|
82
|
+
self.assertEqual(gp.posture_status("warn", mode="warn"), "warn")
|
|
83
|
+
self.assertEqual(gp.posture_status("warn", mode="hard"), "warn")
|
|
84
|
+
self.assertEqual(gp.posture_status("enforce", mode="warn"), "warn") # master switch not thrown
|
|
85
|
+
self.assertEqual(gp.posture_status("enforce", mode="hard"), "blocked") # opted into hard
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class ApplyPostureFallbackTest(unittest.TestCase):
|
|
89
|
+
"""CR regression guard: on a contract < 0.6.2 (registry absent) the fallback must
|
|
90
|
+
preserve each gate's PRIOR severity, not uniformly block under hard."""
|
|
91
|
+
|
|
92
|
+
def _apply(self, findings, *, mode, **kw):
|
|
93
|
+
from unittest import mock
|
|
94
|
+
from phase_loop_runtime import consiliency_gates as cg
|
|
95
|
+
with mock.patch.object(gp, "available", return_value=False):
|
|
96
|
+
return cg._apply_posture(findings, manifest=None, mode=mode, **kw)
|
|
97
|
+
|
|
98
|
+
def test_version_skew_fallback_stays_warn_under_hard(self):
|
|
99
|
+
r = self._apply([{"code": "version_skew"}], mode="hard", legacy_capped_all=True)
|
|
100
|
+
self.assertEqual(r["status"], "warn") # NOT blocked -- normative phase0 const
|
|
101
|
+
|
|
102
|
+
def test_spec_info_fallback_stays_warn_under_hard(self):
|
|
103
|
+
r = self._apply([{"code": "spec_below_conformance_bar"}], mode="hard",
|
|
104
|
+
legacy_capped_codes=frozenset({"spec_below_conformance_bar"}))
|
|
105
|
+
self.assertEqual(r["status"], "warn") # info tier never blocks, even in fallback
|
|
106
|
+
|
|
107
|
+
def test_uncapped_finding_still_blocks_under_hard_in_fallback(self):
|
|
108
|
+
r = self._apply([{"code": "some_finding"}], mode="hard")
|
|
109
|
+
self.assertEqual(r["status"], "blocked") # legacy uniform behavior preserved
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
if __name__ == "__main__":
|
|
113
|
+
unittest.main()
|
|
@@ -186,12 +186,20 @@ class GateSeverityTest(unittest.TestCase):
|
|
|
186
186
|
gd.load_protocol = self._orig_proto
|
|
187
187
|
gd.gather_repo_ref_facts = self._orig_facts
|
|
188
188
|
|
|
189
|
-
def
|
|
189
|
+
def test_write_footprint_warns_by_default_and_blocks_on_enforce_opt_in(self):
|
|
190
|
+
# Retractable teeth: write_footprint_violation is an invariant FLOORED at warn --
|
|
191
|
+
# it warns by default (even under hard, forgiving), can't be silenced below warn,
|
|
192
|
+
# and blocks under hard only when a repo/fleet raises it to `enforce`.
|
|
190
193
|
self._patch("consiliency/pipeline/v0.4", ["src/app.py"])
|
|
191
|
-
warn = _gate_git_discipline(Path("/nonexistent"), mode="warn")
|
|
192
|
-
hard = _gate_git_discipline(Path("/nonexistent"), mode="hard")
|
|
194
|
+
warn = _gate_git_discipline(Path("/nonexistent"), None, mode="warn")
|
|
195
|
+
hard = _gate_git_discipline(Path("/nonexistent"), None, mode="hard")
|
|
193
196
|
self.assertEqual(warn["status"], "warn")
|
|
194
|
-
self.assertEqual(hard["status"], "
|
|
197
|
+
self.assertEqual(hard["status"], "warn") # forgiving default: warns, does not block
|
|
198
|
+
enforce = {"gate_posture_overrides": {"write_footprint_violation": "enforce"}}
|
|
199
|
+
self.assertEqual(_gate_git_discipline(Path("/nonexistent"), enforce, mode="hard")["status"], "blocked")
|
|
200
|
+
# ...but it can never be silenced below its warn floor:
|
|
201
|
+
silence = {"gate_posture_overrides": {"write_footprint_violation": "observe"}}
|
|
202
|
+
self.assertEqual(_gate_git_discipline(Path("/nonexistent"), silence, mode="warn")["status"], "warn")
|
|
195
203
|
self.assertTrue(warn["findings"])
|
|
196
204
|
# The gate never emits a human_required signal.
|
|
197
205
|
self.assertNotIn("human_required", warn)
|
|
@@ -200,7 +208,7 @@ class GateSeverityTest(unittest.TestCase):
|
|
|
200
208
|
|
|
201
209
|
def test_clean_pipeline_branch_passes(self):
|
|
202
210
|
self._patch("consiliency/pipeline/v0.4", [".consiliency/manifest.json"])
|
|
203
|
-
result = _gate_git_discipline(Path("/nonexistent"), mode="hard")
|
|
211
|
+
result = _gate_git_discipline(Path("/nonexistent"), None, mode="hard")
|
|
204
212
|
self.assertEqual(result["status"], "passed")
|
|
205
213
|
|
|
206
214
|
|
|
@@ -214,7 +222,7 @@ class ContractAbsentDegradeTest(unittest.TestCase):
|
|
|
214
222
|
|
|
215
223
|
def test_gate_degrades_to_passed_not_warn(self):
|
|
216
224
|
# Neutral no-op even in hard mode -- must NOT flip governed scans to warn.
|
|
217
|
-
result = _gate_git_discipline(Path("/nonexistent"), mode="hard")
|
|
225
|
+
result = _gate_git_discipline(Path("/nonexistent"), None, mode="hard")
|
|
218
226
|
self.assertEqual(result["status"], "passed")
|
|
219
227
|
self.assertIn("latent", result["note"])
|
|
220
228
|
|