phase-loop-runtime 0.3.0__tar.gz → 0.4.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.3.0 → phase_loop_runtime-0.4.0}/PKG-INFO +49 -2
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/README.md +47 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/pyproject.toml +12 -2
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/__init__.py +2 -1
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/runtime-boundary.md +1 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/CONTRACTS.md +61 -4
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/cli.py +27 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/closeout.py +2 -2
- phase_loop_runtime-0.4.0/src/phase_loop_runtime/conformance.py +94 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/consiliency_ingest.py +36 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/discovery.py +2 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/models.py +102 -1
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/panel_invoker.py +320 -23
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/release_guard.py +1 -7
- phase_loop_runtime-0.4.0/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +54 -0
- phase_loop_runtime-0.4.0/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +54 -0
- phase_loop_runtime-0.4.0/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +51 -0
- phase_loop_runtime-0.4.0/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +51 -0
- phase_loop_runtime-0.4.0/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +51 -0
- phase_loop_runtime-0.4.0/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +51 -0
- phase_loop_runtime-0.4.0/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +51 -0
- phase_loop_runtime-0.4.0/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +51 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime.egg-info/PKG-INFO +49 -2
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime.egg-info/SOURCES.txt +2 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime.egg-info/requires.txt +1 -1
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_backcompat.py +6 -2
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_backing_homebrew.py +2 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_consiliency_ingest.py +116 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_docs_audit.py +18 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_governed_review.py +57 -0
- phase_loop_runtime-0.4.0/tests/test_panel_context_refs_114.py +373 -0
- phase_loop_runtime-0.4.0/tests/test_panel_invoker.py +159 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_panel_invoker_spawn.py +53 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_models.py +85 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_pipeline_bundle.py +34 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_runtime_boundary.py +1 -0
- phase_loop_runtime-0.3.0/src/phase_loop_runtime/skills_bundle/claude-advisor-board/SKILL.md +0 -46
- phase_loop_runtime-0.3.0/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/SKILL.md +0 -46
- phase_loop_runtime-0.3.0/src/phase_loop_runtime/skills_bundle/codex-advisor-board/SKILL.md +0 -46
- phase_loop_runtime-0.3.0/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/SKILL.md +0 -46
- phase_loop_runtime-0.3.0/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/SKILL.md +0 -46
- phase_loop_runtime-0.3.0/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/SKILL.md +0 -46
- phase_loop_runtime-0.3.0/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/SKILL.md +0 -46
- phase_loop_runtime-0.3.0/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/SKILL.md +0 -46
- phase_loop_runtime-0.3.0/tests/test_panel_invoker.py +0 -72
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/MANIFEST.in +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/protocol/protocol.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/setup.cfg +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/extraction-readiness.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/granular-execution-policy.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-capability-matrix.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-skill-matrix.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/harness-substrate-manifest.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/pi-loop-control.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/protocol.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/spec-discovery-roots.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-governed-pipeline.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-portal-projection.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-regenesis.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/phase-loop/substrate-soak-report.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_contract_docs/runtime/verification-evidence-contract.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/commands.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-mixed-signals/mixed.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-provider-timeout/timeout-note.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-redacted-summary/redacted-summary.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-small-sample/sample.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/edge.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/borderline/borderline-threshold-edge/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-a.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-b.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-duplicate-png/shot-c.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/claimed-results.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-missing-references/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-subtle-low-variance/metrics.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/findings.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-templated-prose/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/scores.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-fake/fake-uniform-scores/summary.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/bundle-check.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-adoption-bundle/operator-note.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/events-sample.jsonl +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-handoff-ledger/receipt.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/evidence.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-runner-diff/summary.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/matrix.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-test-matrix/notes.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.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.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/_test_fixtures/evidence-audit-calibration/known-real/real-ui-screenshot-standin/manifest.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.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.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/adoption_bundle.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/__init__.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/backing.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/backing_omnigent.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/config.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/events.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/fixtures/advisor-boards.example.toml +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/fixtures.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/harness_mapping.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/matrix.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/observability.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/presets.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/registries.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/resolver.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/schema.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/standin.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/advisor_board/validation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/agent_runtime_provider.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/baml_modular.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/baml_src/dotfiles_adoption_manifest.baml +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/baml_src/dotfiles_c4_document.baml +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/baml_src/dotfiles_plan_manifest.baml +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/baml_src/dotfiles_runtime_projection.baml +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/baml_src/dotfiles_task_catalog.baml +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/baml_src/emit_phase_closeout.baml +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/baml_src/evaluate_suspected_fake_evidence.baml +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/baml_src/verification_evidence.baml +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/broker.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/build_bundle.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/capability_registry.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/classifier.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/claude_agent_view.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/closeout_classifier.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/closeout_validation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/closeout_validators.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/consiliency_gates.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/consiliency_layout.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/cross_repo_channel.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/dispatch_lock.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/docs_audit.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/docs_freshness.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/docs_surfaces.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/dotfiles_profile_plugin.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/events.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/events_migration.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/evidence_audit.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/evidence_audit_config.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/fleet_map.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/fleet_metrics.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/gate_posture.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/git_discipline.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/git_ops.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/git_topology.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/governed_bundle.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/governed_premerge.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/governed_review.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/handoff.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/handoff_path.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/injection.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/install_status.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/lane_scheduler.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/launcher.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/lease_store.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/maintenance.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/migrate_handoffs.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/observability.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/pipeline_adapter/__init__.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/pipeline_adapter/branch_ops.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/pipeline_adapter/flag.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/pipeline_adapter/markers.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/pipeline_adapter/merge_policy.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/pipeline_adapter/ratification.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/pipeline_adapter/sibling_matcher.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/plan_ir.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/plan_manifest.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/planner_validation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/profiles.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/prompts.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/provenance.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/publishing.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/py.typed +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/reconcile.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/redaction.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/reflection_sync.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/render.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/repo_validation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/review_summary.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/roadmap_lint.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/route_log.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/route_policy/__init__.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/route_policy/fixtures/route_selection.golden.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/runner.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/runtime_paths.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/runtime_projection.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/runtime_resources.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/schema_export.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/schemas/phase_loop_closeout.schema.json +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skill_install.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skill_inventory.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skill_paths.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skill_sources_plugin.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-run-train/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/claude-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-run-train/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/codex-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-run-train/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/gemini-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-board/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-advisor-panel/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/allocate_worktree_name.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/audit_lane_file_touches.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/cleanup_lane_worktrees.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/parent_tree_leakage_check.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/post_merge_import_smoke.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/pre_merge_destructiveness_check.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/resolve_branch_from_sha.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/state.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/sweep_stale_worktrees.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/team_teardown.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-execute-phase/scripts/verify_harness.sh +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-loop/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/parallelization-heuristics.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/references/roadmap-template.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-phase-roadmap-builder/scripts/validate_roadmap.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-detailed/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/assets/review_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-plan-phase/scripts/validate_plan_doc.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-run-train/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-run-train/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-editor/assets/editor_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-skill-improvement-planner/assets/aggregator_prompt.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/README.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/SKILL.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/skills_bundle/opencode-task-contextualizer/references/task-templates.md +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/state.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/state_degradation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/state_ops.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/train_ledger.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/train_roadmap.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/train_runner.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/verification_evidence.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/worker_pool.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/worktree_index.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime.egg-info/dependency_links.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime.egg-info/entry_points.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime.egg-info/top_level.txt +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_advisory_mode.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_alias_install.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_backing_omnigent.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_concurrency.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_config.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_golden.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_ingestion.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_integration.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_matrix.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_observability.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_presets.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_registries.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_resolver.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_advisor_board_schema.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_agent_runtime_provider_cs08.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_branchgov_preflight.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_cli_train_status_45.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_closeout_break_glass_cli.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_closeout_classifier.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_closeout_convergence_fixes.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_closeout_exception_vocab.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_closeout_validator_hook.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_closeout_verification_gate.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_codex_effort_max_clamp_49.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_consiliency_dual_layout.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_consiliency_gates.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_consiliency_scaffold.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_coordinator_wave_loop.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_dispatch_lock_cross_roadmap.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_dispatch_lock_helper.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_dispatch_lock_same_roadmap.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_doc_delta_validator.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_docs_freshness.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_dotfiles_tree.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_execute_phase_handoff_mode.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_execution_policy_tiering.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_export_schema.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_fleet_map.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_fleet_metrics.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_fleet_metrics_export.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_gate_a_wheel_isolation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_gate_posture.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_git_discipline.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_governed_disjointness_model_first.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_governed_e2e.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_governed_gate_crfixes.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_governed_planning_gate.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_governed_premerge.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_governed_premerge_live.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_hotfix_lane.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_injection_skill_failloud.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_lane_ir_override.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_launcher_liveness.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_lease_store.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_lease_store_conformance.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_ledger_serialization.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_model_class_policy.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_observability_alerting.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_panel_advisory_mode_63.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_panel_invoker_timeout_argv.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_panel_leg_auth_preflight_64.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_panel_per_leg_model_66.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_panel_tui_eof_48.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_panel_verdict_summary.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_parallel_dispatch_backcompat.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_parallel_dispatch_cli.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_adoption_bundle.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_adoption_bundle_cli.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_baml_dependency.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_baml_end_to_end.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_baml_injection.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_baml_modular.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_baml_prompt_taxonomy.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_baml_runner_closeout.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_baml_schema_export.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_baml_schema_source.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_branch_divergence_event.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_build_bundle.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_classifier.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_claude_agent_view_adapter.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_claude_agent_view_lifecycle.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_claude_channel_hooks.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_claude_channel_mcp.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_claude_channel_security.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_claude_channel_session_launch.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_claude_channel_sidecar.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_claude_channel_smoke_suite.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_claude_route_selection.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_cli.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_cli_plugin_load.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_closeout_control_only.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_closeout_event.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_closeout_evidence_audit.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_closeout_hardening.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_closeout_owned_dirty_fallback.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_closeout_schema.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_closeout_validation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_collaborator_citation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_collaborator_docs.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_collaborator_rollback.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_def4_writer_namespacing.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_dirty_path_classify_phase_owned_tests.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_dirty_path_classify_previous_phase_owned.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_discovery.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_docs.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_dotfiles_schemas.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_dotfiles_sources.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_downstream_governed_pipeline.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_downstream_instruction_scope_readme.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_downstream_portal.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_downstream_regenesis.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_drift_audit.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_dry_run_then_run.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_events_migration.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_evidence_audit.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_evidence_audit_runner.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_evidence_audit_tier2.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_evidence_audit_tier3.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_evidence_audit_tuning.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_execution_policy.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_executor_degradation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_full_phase_mode.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_handoff.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_handoff_migration.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_init.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_injection.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_install_status.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_lane_harnesses.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_lane_ir.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_lane_ir_fixtures.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_lane_scheduler.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_launcher.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_ledger_debug.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_ledger_dedup.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_live_adapters.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_maintenance.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_metrics.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_migration_regressions.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_mixedrun_dispatch.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_mixedrun_matrix.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_mixedrun_observability.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_native_flags.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_parallel_plan_safe.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_pi_executor.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_pipeline_boundaries.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_pipeline_bridge.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_pipeline_closeout.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_pipeline_freshness.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_pipeline_mode.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_plan_doc_skip.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_plan_manifest.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_planner_redispatch_when_plan_current.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_planner_validation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_policy.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_protocol_contract.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_provenance.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_reconcile.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_reconcile_blocker_self_clear.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_reconcile_recovery_mode.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_reconcile_to_status_planned_recovery.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_reducers.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_repair_skipped_when_blocker_cleared.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_roadmap_amendments.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_roadmap_validate.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_rotation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_runner.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_runner_closeout_validation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_runtime_decouple.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_runtime_package_data.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_runtime_projection.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_schema_flow.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_skill_baml_closeout.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_skill_bridge_contract.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_skill_contract.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_skill_execute_contract.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_skill_install.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_skill_planner_contract.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_smoke_blockers.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_smoke_exhaustion.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_smoke_reentry.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_spurious_completion_rejection.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_start_gate_phase_status.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_start_gate_refuses_cross_phase_dirty.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_state.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_status_transition_events_emitted.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_substrate_soak_docs.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_substrate_soak_governed.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_substrate_soak_portal.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_terminal_summary_mirrors_baml_closeout.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_v22_e2e.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_v22_principles.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_v45_found_contracts.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_v45_reconcile.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_v45_sched.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_v45_schedharden.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_wave_runner.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_work_unit_observability.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_work_unit_runner.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_work_unit_state.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_loop_worktrees.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_owned_dirty_relaxation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_phase_worktree_executor.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_pipeline_adapter_branch_ops_create.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_pipeline_adapter_branch_ops_rebase_conflict.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_pipeline_adapter_branch_ops_refuse_default.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_pipeline_adapter_flag.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_pipeline_adapter_markers.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_pipeline_adapter_merge_policy_parse.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_pipeline_adapter_ratification_event_payload.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_pipeline_adapter_ratification_runner.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_pipeline_adapter_ratification_skipped_standalone.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_pipeline_adapter_standalone_regression.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_pkg_layout_freeze.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_plan_ir_iter_waves.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_preflight_verification.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_publishing.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_reconcile_manifest_dedup_46.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_reconcile_verification_log.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_reflection_sync.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_repo_validation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_review_summary.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_route_log.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_route_policy_conformance.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_routing_invariants.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_runtime_state_mirror_agreement.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_sibling_matcher_patterns.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_skill_bundle_pinned.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_skill_install_body_expansion.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_skill_plan_manifest_write.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_skill_sources_seam.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_skills_bundle_drift.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_skills_canon_parity.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_skills_src_claude_literal_lint.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_spec_conformance_gate.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_sync_skills_apply_failloud.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_train_e2e.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_train_invariants.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_train_merge.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_train_order_only_deps_47.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_train_roadmap.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_train_runner.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_v34_parallel_dispatch_soak.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_validate_plan_doc_docs_lane.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_verification_evidence.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_verification_evidence_validator.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_visual_evidence_validator.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_workerpool_failure_isolation.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_workerpool_parallel.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/tests/test_workerpool_worktree_alloc.py +0 -0
- {phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.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.4.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.7,>=0.6.
|
|
21
|
+
Requires-Dist: consiliency-contract<0.7,>=0.6.5
|
|
22
22
|
Requires-Dist: jsonschema<5,>=4
|
|
23
23
|
Requires-Dist: tomli<3,>=2; python_version < "3.11"
|
|
24
24
|
|
|
@@ -104,3 +104,50 @@ The closeout verdict is runner-authoritative: when the runner rejects a child's
|
|
|
104
104
|
closeout, the persisted `terminal-summary.json` reflects the runner's blocking verdict
|
|
105
105
|
(the child's self-reported `complete`/`passed` is not overlaid back), preventing a
|
|
106
106
|
stale "complete" summary from reconcile-skipping the work on the next run.
|
|
107
|
+
|
|
108
|
+
## Conformance library (one library, two roles)
|
|
109
|
+
|
|
110
|
+
`phase_loop_runtime.conformance` is the named, stable, importable surface for the
|
|
111
|
+
deterministic `.consiliency/` conformance evaluator. It is a re-export (not a
|
|
112
|
+
re-implementation) of the same function the actor already runs, so an **external
|
|
113
|
+
CR-fence** — in gp CI, a git-host pre-merge check, anywhere — can import and run
|
|
114
|
+
the identical check:
|
|
115
|
+
|
|
116
|
+
```python
|
|
117
|
+
from phase_loop_runtime.conformance import scan_consiliency_gates
|
|
118
|
+
|
|
119
|
+
verdict = scan_consiliency_gates("/path/to/repo") # {"status": "passed" | "warn" | "blocked" | "skipped", "gates": {...}, ...}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
The surface also exposes the pure cores (`evaluate_git_discipline`,
|
|
123
|
+
`self_heal_partition`, `evaluate_governance_scope`) for consumers that already
|
|
124
|
+
hold the injected facts.
|
|
125
|
+
|
|
126
|
+
**Two roles, one library.** This is meant to be mounted BOTH as the actor-side
|
|
127
|
+
self-check (a pre-PR sanity pass the author runs locally) AND as the
|
|
128
|
+
authoritative CR-fence (the real validator). The actor-side result is **never
|
|
129
|
+
authoritative** — the fence always re-runs the check itself. Because it is the
|
|
130
|
+
same function versioned with the same vendored `consiliency_contract`, the honest
|
|
131
|
+
actor sees exactly the verdict the fence will; a stale or dishonest actor result
|
|
132
|
+
simply does not matter.
|
|
133
|
+
|
|
134
|
+
**Scope.** This surface asserts the L0 **shape + governance** tier only. The
|
|
135
|
+
cert-schema tier and authority/provenance verification are explicitly out of
|
|
136
|
+
scope (delegated downstream / to gp).
|
|
137
|
+
|
|
138
|
+
### `consiliency-ingest --check-only`
|
|
139
|
+
|
|
140
|
+
`--check-only` decouples "run the check" from "is this repo adopted". It is
|
|
141
|
+
strictly read-only (never shapes; ignores `--adopt`). It makes the exit code
|
|
142
|
+
verdict-significant so a pre-PR actor is never misled into reading a no-op — or a
|
|
143
|
+
failing verify — as a pass:
|
|
144
|
+
|
|
145
|
+
| Repo state | mode | exit |
|
|
146
|
+
|---|---|---|
|
|
147
|
+
| adopted, verify clean (or `warn`) | `verify` | `0` |
|
|
148
|
+
| adopted, gate scan `blocked` | `verify` | `1` |
|
|
149
|
+
| un-adopted (no `.consiliency/manifest`) | `not-adopted` | `3` |
|
|
150
|
+
| usage error | — | `2` |
|
|
151
|
+
|
|
152
|
+
The plain (non-`--check-only`) path is unchanged — it keeps the silent green
|
|
153
|
+
`skipped` no-op on an un-adopted repo and its existing exit `0`.
|
|
@@ -80,3 +80,50 @@ The closeout verdict is runner-authoritative: when the runner rejects a child's
|
|
|
80
80
|
closeout, the persisted `terminal-summary.json` reflects the runner's blocking verdict
|
|
81
81
|
(the child's self-reported `complete`/`passed` is not overlaid back), preventing a
|
|
82
82
|
stale "complete" summary from reconcile-skipping the work on the next run.
|
|
83
|
+
|
|
84
|
+
## Conformance library (one library, two roles)
|
|
85
|
+
|
|
86
|
+
`phase_loop_runtime.conformance` is the named, stable, importable surface for the
|
|
87
|
+
deterministic `.consiliency/` conformance evaluator. It is a re-export (not a
|
|
88
|
+
re-implementation) of the same function the actor already runs, so an **external
|
|
89
|
+
CR-fence** — in gp CI, a git-host pre-merge check, anywhere — can import and run
|
|
90
|
+
the identical check:
|
|
91
|
+
|
|
92
|
+
```python
|
|
93
|
+
from phase_loop_runtime.conformance import scan_consiliency_gates
|
|
94
|
+
|
|
95
|
+
verdict = scan_consiliency_gates("/path/to/repo") # {"status": "passed" | "warn" | "blocked" | "skipped", "gates": {...}, ...}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
The surface also exposes the pure cores (`evaluate_git_discipline`,
|
|
99
|
+
`self_heal_partition`, `evaluate_governance_scope`) for consumers that already
|
|
100
|
+
hold the injected facts.
|
|
101
|
+
|
|
102
|
+
**Two roles, one library.** This is meant to be mounted BOTH as the actor-side
|
|
103
|
+
self-check (a pre-PR sanity pass the author runs locally) AND as the
|
|
104
|
+
authoritative CR-fence (the real validator). The actor-side result is **never
|
|
105
|
+
authoritative** — the fence always re-runs the check itself. Because it is the
|
|
106
|
+
same function versioned with the same vendored `consiliency_contract`, the honest
|
|
107
|
+
actor sees exactly the verdict the fence will; a stale or dishonest actor result
|
|
108
|
+
simply does not matter.
|
|
109
|
+
|
|
110
|
+
**Scope.** This surface asserts the L0 **shape + governance** tier only. The
|
|
111
|
+
cert-schema tier and authority/provenance verification are explicitly out of
|
|
112
|
+
scope (delegated downstream / to gp).
|
|
113
|
+
|
|
114
|
+
### `consiliency-ingest --check-only`
|
|
115
|
+
|
|
116
|
+
`--check-only` decouples "run the check" from "is this repo adopted". It is
|
|
117
|
+
strictly read-only (never shapes; ignores `--adopt`). It makes the exit code
|
|
118
|
+
verdict-significant so a pre-PR actor is never misled into reading a no-op — or a
|
|
119
|
+
failing verify — as a pass:
|
|
120
|
+
|
|
121
|
+
| Repo state | mode | exit |
|
|
122
|
+
|---|---|---|
|
|
123
|
+
| adopted, verify clean (or `warn`) | `verify` | `0` |
|
|
124
|
+
| adopted, gate scan `blocked` | `verify` | `1` |
|
|
125
|
+
| un-adopted (no `.consiliency/manifest`) | `not-adopted` | `3` |
|
|
126
|
+
| usage error | — | `2` |
|
|
127
|
+
|
|
128
|
+
The plain (non-`--check-only`) path is unchanged — it keeps the silent green
|
|
129
|
+
`skipped` no-op on an un-adopted repo and its existing exit `0`.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "phase-loop-runtime" # PyPI dist name; NOT "agent-harness" (an unrelated third-party PyPI project)
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.4.0"
|
|
8
8
|
description = "Harness-neutral phase-loop orchestration runtime and CLI"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -32,7 +32,17 @@ dependencies = [
|
|
|
32
32
|
# < 0.6.2 stays safe; the floor guarantees the teeth are present. Warn-default remains;
|
|
33
33
|
# human_required is never set. (0.6.0 shipped self-inconsistent version refs -> fixed in
|
|
34
34
|
# 0.6.1, contract PR #18.)
|
|
35
|
-
|
|
35
|
+
#
|
|
36
|
+
# PIN (PSCAT-PL, roadmap Phase 2B): floor at 0.6.5 -- ships the
|
|
37
|
+
# `protected_source_categories` registry that OWNS the coarse
|
|
38
|
+
# protected_source_category vocabulary (the six pre-existing buckets +
|
|
39
|
+
# `governance_contracts`). phase-loop reads that registry via
|
|
40
|
+
# `consiliency_contract.load_registry` and validates against it as the SoT
|
|
41
|
+
# (models.py `protected_source_categories()`), replacing the hardcoded enum.
|
|
42
|
+
# Registry-present is authoritative; the runtime still degrades to the legacy
|
|
43
|
+
# six-tuple if a caller runs an older contract (no hard crash), but this floor
|
|
44
|
+
# guarantees the contract-owned vocabulary (incl. governance_contracts) is live.
|
|
45
|
+
"consiliency-contract>=0.6.5,<0.7",
|
|
36
46
|
"jsonschema>=4,<5",
|
|
37
47
|
# Advisor Board config loader (ABDREG) parses advisor-boards.toml. tomllib is
|
|
38
48
|
# stdlib on 3.11+; on the 3.10 requires-python floor it is absent, so pull in
|
|
@@ -129,6 +129,7 @@ roots. See `docs/phase-loop/spec-discovery-roots.md`.
|
|
|
129
129
|
The following modules under `phase_loop_runtime.*` are considered public:
|
|
130
130
|
|
|
131
131
|
- `phase_loop_runtime.cli`: CLI entrypoint and parser definition.
|
|
132
|
+
- `phase_loop_runtime.conformance`: Named conformance-check surface (the six L0 consiliency gates) for actor-side self-check and the CR-fence.
|
|
132
133
|
- `phase_loop_runtime.discovery`: Roadmap and repository resolution.
|
|
133
134
|
- `phase_loop_runtime.handoff`: TUI handoff generation and metadata.
|
|
134
135
|
- `phase_loop_runtime.models`: Core data models, schemas, and literals.
|
|
@@ -264,11 +264,14 @@ building `artifact: str` forces the caller to hold the whole (20k+ token) bundle
|
|
|
264
264
|
its own context. `artifact_ref` / `brief_ref` promote that to by-reference ingestion:
|
|
265
265
|
the caller passes a PATH and the runtime reads it.
|
|
266
266
|
|
|
267
|
-
- **Entry points.** `invoke_panel
|
|
268
|
-
|
|
267
|
+
- **Entry points.** `invoke_panel` and `invoke_board` accept keyword-only
|
|
268
|
+
`artifact_ref: str | Sequence[str] | None` and `brief_ref: str | None`
|
|
269
269
|
(default-valued additive extensions to the frozen signatures — back-compat, like
|
|
270
|
-
`models` / `max_concurrency`).
|
|
271
|
-
|
|
270
|
+
`models` / `max_concurrency`). `invoke_panel_request` consumes
|
|
271
|
+
`PanelRequest.artifact_ref` but deliberately does not define `PanelRequest.brief_ref`
|
|
272
|
+
in this contract; callers that need a custom brief use the direct `invoke_panel` or
|
|
273
|
+
`invoke_board` entry point. The artifact is resolved at the TOP of the entry point
|
|
274
|
+
so timeout scaling, staging, and metadata all see the resolved content.
|
|
272
275
|
- **`_resolve_artifact(artifact, artifact_ref)`.** `artifact_ref is None` →
|
|
273
276
|
`artifact or ""` (today's bytes, verbatim). A single path (a bare string OR a
|
|
274
277
|
one-element sequence) returns the file content VERBATIM — no header — so
|
|
@@ -298,6 +301,60 @@ the caller passes a PATH and the runtime reads it.
|
|
|
298
301
|
`_exec_leg`; Proof B injects `spawn=`) is untouched;
|
|
299
302
|
`tests/test_advisor_board_ingestion.py` proves the new path is byte-transparent.
|
|
300
303
|
|
|
304
|
+
## CTXFREEZE — Context references and panel reliability (#114)
|
|
305
|
+
|
|
306
|
+
CTXFREEZE freezes the #114 public contract for downstream implementation and
|
|
307
|
+
documentation phases. It does not claim that `artifact_ref` or `brief_ref` are true
|
|
308
|
+
non-inlining modes: both are read-file-and-inline conveniences that keep bytes out
|
|
309
|
+
of the caller context but still stage raw contents for each leg.
|
|
310
|
+
|
|
311
|
+
- **Ingestion modes and precedence.** `artifact` is inline text. `artifact_ref` is a
|
|
312
|
+
file path, or ordered path sequence, whose contents replace `artifact` when both
|
|
313
|
+
are supplied. `brief_ref` is a file path used only by `invoke_panel` and
|
|
314
|
+
`invoke_board`; it replaces the generated review/advisory instruction file.
|
|
315
|
+
`context_refs` is the only true by-reference mode. `invoke_panel_request` threads
|
|
316
|
+
`PanelRequest.artifact_ref`, `PanelRequest.context_refs`,
|
|
317
|
+
`PanelRequest.context_refs_soft_warn`, and `PanelRequest.timeout_seconds_by_leg`;
|
|
318
|
+
`PanelRequest.brief_ref` is explicitly out of contract for this phase.
|
|
319
|
+
- **True by-reference manifest.** `context_refs` appends a deterministic manifest to
|
|
320
|
+
the already-resolved artifact. Each entry is emitted in caller order and contains a
|
|
321
|
+
JSON-escaped absolute path, byte count, streamed SHA-256 digest, untrusted MIME
|
|
322
|
+
guess, untrusted extension hint, and optional best-effort PDF page count. Raw file
|
|
323
|
+
contents are not written into `review-bundle.md`, prompt text, or the manifest.
|
|
324
|
+
- **Metadata sensitivity.** Absolute pathnames and hashes can disclose sensitive
|
|
325
|
+
project names, customer names, filenames, document structure, and content
|
|
326
|
+
fingerprints even when raw bytes are not inlined. Callers should treat the
|
|
327
|
+
manifest as metadata-bearing, not private-by-construction.
|
|
328
|
+
- **Filesystem boundary.** Paths are interpreted relative to the current process
|
|
329
|
+
working directory when relative and are reported as `Path.resolve()` absolute
|
|
330
|
+
paths. Entries must be regular files at validation time; missing paths,
|
|
331
|
+
directories, devices, and other non-regular files fail closed by default. Symlinks
|
|
332
|
+
are followed only if their resolved target is a regular file under normal OS path
|
|
333
|
+
resolution. The runtime opens the file once to stream size/hash metadata and, for
|
|
334
|
+
PDF-looking files only, may reopen a bounded prefix for page counting; CTXIMPL owns
|
|
335
|
+
any stronger root jail or TOCTOU hardening.
|
|
336
|
+
- **Provider and backing limits.** `context_refs` assumes the selected provider and
|
|
337
|
+
backing can access the same local filesystem path from the leg runtime. Remote,
|
|
338
|
+
sandboxed, or service-backed harnesses may not have local file access even when
|
|
339
|
+
the manifest validates on the caller host.
|
|
340
|
+
- **Soft-warning opt-in.** Missing or unreadable `context_refs` raise `ValueError`
|
|
341
|
+
unless `context_refs_soft_warn=True`. Soft warning logs a warning and emits a
|
|
342
|
+
`MISSING` or `UNREADABLE` entry. The manifest instruction text remains strict:
|
|
343
|
+
a leg must not infer, guess, or fabricate unavailable contents.
|
|
344
|
+
- **Output-boundary claim.** The frozen privacy claim is runtime non-inlining only:
|
|
345
|
+
referenced contents are absent from the staged bundle and prompt produced by this
|
|
346
|
+
runtime path. This is not a global DLP guarantee for provider logs, human-visible
|
|
347
|
+
outputs, handoffs, screenshots, shell commands, or tools the leg chooses to run
|
|
348
|
+
after reading a referenced file. A leg may disclose file contents after it
|
|
349
|
+
intentionally inspects a referenced path unless an output policy forbids that
|
|
350
|
+
disclosure.
|
|
351
|
+
- **Reliability names.** Direct entry points accept `timeouts_by_leg`; `PanelRequest`
|
|
352
|
+
uses `timeout_seconds_by_leg`. Both feed the same per-leg override. Unset legs keep
|
|
353
|
+
input-scaled defaults. The codex and gemini CLI legs retry one fast soft-empty or
|
|
354
|
+
transient-stall result once, guarded by elapsed-time fraction; hard subprocess
|
|
355
|
+
timeouts return timeout status without retry. CTXRELY owns any follow-on reliability
|
|
356
|
+
split beyond these frozen names and retry/timeout invariants.
|
|
357
|
+
|
|
301
358
|
## ABDMODE — Purpose-derived default mode + advisory prompt hygiene · `panel_invoker.py` (#107)
|
|
302
359
|
|
|
303
360
|
A board's PURPOSE now selects its default panel MODE automatically, so a domain
|
|
@@ -414,6 +414,16 @@ def build_parser() -> argparse.ArgumentParser:
|
|
|
414
414
|
action="store_true",
|
|
415
415
|
help="Consent to shape an unmanaged repo (no-op without this flag when no manifest exists yet).",
|
|
416
416
|
)
|
|
417
|
+
sub.add_argument(
|
|
418
|
+
"--check-only",
|
|
419
|
+
action="store_true",
|
|
420
|
+
help=(
|
|
421
|
+
"Run the conformance check only; never shape (ignores --adopt). "
|
|
422
|
+
"On an adopted repo this is the verify pass. On an UN-ADOPTED repo "
|
|
423
|
+
"it emits an explicit 'not adopted / nothing to verify' signal and "
|
|
424
|
+
"exits non-zero (3), so a no-op is never mistaken for a pass."
|
|
425
|
+
),
|
|
426
|
+
)
|
|
417
427
|
sub.add_argument(
|
|
418
428
|
"--archetype",
|
|
419
429
|
action="append",
|
|
@@ -1634,6 +1644,7 @@ def _consiliency_ingest_command(*, repo: Path, args: argparse.Namespace, as_json
|
|
|
1634
1644
|
archetypes = tuple(dict.fromkeys(getattr(args, "archetype", None) or ()))
|
|
1635
1645
|
modifiers = tuple(dict.fromkeys(getattr(args, "modifier", None) or ()))
|
|
1636
1646
|
baseline_only = bool(getattr(args, "baseline_only", False))
|
|
1647
|
+
check_only = bool(getattr(args, "check_only", False))
|
|
1637
1648
|
if baseline_only and (archetypes or modifiers):
|
|
1638
1649
|
print("phase-loop consiliency-ingest: --baseline-only is mutually exclusive with --archetype/--modifier", file=sys.stderr)
|
|
1639
1650
|
return 2
|
|
@@ -1641,6 +1652,7 @@ def _consiliency_ingest_command(*, repo: Path, args: argparse.Namespace, as_json
|
|
|
1641
1652
|
result = ingest(
|
|
1642
1653
|
repo,
|
|
1643
1654
|
adopt=bool(getattr(args, "adopt", False)),
|
|
1655
|
+
check_only=check_only,
|
|
1644
1656
|
mode="baseline-only" if baseline_only else "archetyped",
|
|
1645
1657
|
archetypes=archetypes,
|
|
1646
1658
|
modifiers=modifiers,
|
|
@@ -1658,6 +1670,8 @@ def _consiliency_ingest_command(*, repo: Path, args: argparse.Namespace, as_json
|
|
|
1658
1670
|
print(f"phase-loop consiliency-ingest: {result.mode} {result.manifest_path}")
|
|
1659
1671
|
if result.mode == "skipped":
|
|
1660
1672
|
print(" no .consiliency/manifest and --adopt was not passed; repo left untouched")
|
|
1673
|
+
if result.mode == "not-adopted":
|
|
1674
|
+
print(" NOT ADOPTED: no .consiliency/manifest -- nothing to verify (a no-op is not a pass)")
|
|
1661
1675
|
if result.mode == "shape":
|
|
1662
1676
|
created = (result.scaffold or {}).get("created_paths", [])
|
|
1663
1677
|
print(f" scaffolded {len(created)} doc(s); proposed governed_set entries: {len(result.governed_set)}")
|
|
@@ -1665,6 +1679,19 @@ def _consiliency_ingest_command(*, repo: Path, args: argparse.Namespace, as_json
|
|
|
1665
1679
|
print(f" gate scan: {result.gate_scan.get('status')}")
|
|
1666
1680
|
for finding in result.findings:
|
|
1667
1681
|
print(f" finding: {finding.get('code')} ({finding.get('path')})")
|
|
1682
|
+
# --check-only makes the exit code verdict-significant, so a pre-PR actor is
|
|
1683
|
+
# never misled into reading a no-op OR a failing verify as a pass:
|
|
1684
|
+
# 3 -> not adopted / nothing to verify (distinct from a pass)
|
|
1685
|
+
# 1 -> adopted but the gate scan is BLOCKED (a real conformance failure)
|
|
1686
|
+
# 0 -> adopted + verify clean (warn stays 0: soft by default)
|
|
1687
|
+
# 2 remains the usage-error code. The plain (non --check-only) path is
|
|
1688
|
+
# UNCHANGED -- it keeps returning 0 exactly as before (see report note on
|
|
1689
|
+
# the pre-existing blocked->0 gap on the plain command).
|
|
1690
|
+
if check_only:
|
|
1691
|
+
if result.mode == "not-adopted":
|
|
1692
|
+
return 3
|
|
1693
|
+
if result.gate_scan is not None and result.gate_scan.get("status") == "blocked":
|
|
1694
|
+
return 1
|
|
1668
1695
|
return 0
|
|
1669
1696
|
|
|
1670
1697
|
|
|
@@ -15,9 +15,9 @@ from .closeout_validators import (
|
|
|
15
15
|
from .models import (
|
|
16
16
|
PIPELINE_CLOSEOUT_OUTCOMES,
|
|
17
17
|
PIPELINE_CLOSEOUT_SCHEMA,
|
|
18
|
-
PIPELINE_PROTECTED_SOURCE_CATEGORIES,
|
|
19
18
|
PIPELINE_PROTECTED_SOURCE_LEGACY_ROLES,
|
|
20
19
|
PIPELINE_PROTECTED_SOURCE_ROLES,
|
|
20
|
+
protected_source_categories,
|
|
21
21
|
SPEC_DELTA_CLOSEOUT_SCHEMA,
|
|
22
22
|
SPEC_DELTA_DECISIONS,
|
|
23
23
|
DirtyPathClassification,
|
|
@@ -625,7 +625,7 @@ def phase_loop_closeout_diagnostic(payload: Mapping[str, Any] | None) -> dict[st
|
|
|
625
625
|
return {"kind": "malformed_closeout", "message": "closeout source_bundle.protected_sources entries must be objects"}
|
|
626
626
|
category = item.get("category")
|
|
627
627
|
role = item.get("role")
|
|
628
|
-
if category not in
|
|
628
|
+
if category not in protected_source_categories():
|
|
629
629
|
return {"kind": "malformed_closeout", "message": "closeout source_bundle protected source has invalid category"}
|
|
630
630
|
if role is not None and role not in PIPELINE_PROTECTED_SOURCE_ROLES and role not in PIPELINE_PROTECTED_SOURCE_LEGACY_ROLES:
|
|
631
631
|
return {"kind": "malformed_closeout", "message": "closeout source_bundle protected source has invalid role"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"""``phase_loop_runtime.conformance`` -- the named, stable conformance surface.
|
|
2
|
+
|
|
3
|
+
ONE LIBRARY, TWO ROLES. This module is the first-class public re-export of the
|
|
4
|
+
deterministic, consent-gated ``.consiliency/`` conformance evaluator that already
|
|
5
|
+
runs inside agent-harness. It exists so an EXTERNAL consumer -- a CR-fence in gp
|
|
6
|
+
CI, a git-host pre-merge check, anywhere -- can::
|
|
7
|
+
|
|
8
|
+
from phase_loop_runtime.conformance import scan_consiliency_gates
|
|
9
|
+
|
|
10
|
+
verdict = scan_consiliency_gates("/path/to/repo")
|
|
11
|
+
if verdict["status"] == "blocked":
|
|
12
|
+
...
|
|
13
|
+
|
|
14
|
+
and run the *identical* function the actor runs against its own working tree.
|
|
15
|
+
Nothing here is re-implemented: every name is re-exported unchanged from the
|
|
16
|
+
module it already lives in, so the actor-side self-check (the "mock") and the
|
|
17
|
+
authoritative CR-fence (the "real validator") are provably the same code.
|
|
18
|
+
|
|
19
|
+
DUAL MOUNT -- ACTOR RESULT IS NEVER AUTHORITATIVE.
|
|
20
|
+
This library is intended to be mounted BOTH as the actor-side self-check
|
|
21
|
+
(a pre-PR sanity pass the author runs locally) AND as the authoritative
|
|
22
|
+
CR-fence (the real validator, run by the reviewing side / gp). The
|
|
23
|
+
actor-side result is advisory only -- a courtesy so the author is not
|
|
24
|
+
surprised. It is NEVER trusted as proof: **the fence always re-runs the
|
|
25
|
+
check itself.** Because it is the same function, the honest actor sees the
|
|
26
|
+
same verdict the fence will; a dishonest or stale actor result simply does
|
|
27
|
+
not matter, since the fence recomputes from the repo.
|
|
28
|
+
|
|
29
|
+
Consequently this library is meant to be VERSIONED WITH THE CONTRACT it
|
|
30
|
+
reads (the vendored ``consiliency_contract`` registries are the SoT for
|
|
31
|
+
every gate). Pin actor and fence to the same contract version and they
|
|
32
|
+
evaluate byte-for-byte the same policy. (This is a note, not machinery:
|
|
33
|
+
nothing here enforces a pin -- it is a deployment discipline for callers.)
|
|
34
|
+
|
|
35
|
+
SCOPE -- SHAPE / GOVERNANCE TIER ONLY.
|
|
36
|
+
What this surface covers is the L0 SHAPE + GOVERNANCE tier:
|
|
37
|
+
|
|
38
|
+
* :func:`scan_consiliency_gates` -- the deterministic, consent-gated
|
|
39
|
+
evaluator that runs the six L0 gates (presence, layout_validity,
|
|
40
|
+
version_skew, git_discipline, local_integrity, spec_conformance) against
|
|
41
|
+
the vendored contract. Input: a repo path (+ optional ``env`` for the
|
|
42
|
+
gate-mode opt-in). Output: the per-gate findings plus an overall
|
|
43
|
+
``status`` verdict. Read-only; a repo with no ``.consiliency/manifest.json``
|
|
44
|
+
is a pure no-op (``status: "skipped"``, ``consent: false``).
|
|
45
|
+
* :func:`evaluate_git_discipline` / :func:`self_heal_partition` /
|
|
46
|
+
:func:`evaluate_governance_scope` -- the PURE cores. They take injected
|
|
47
|
+
facts (git ref facts, adoption profile, subject) and no repo/runner
|
|
48
|
+
coupling, so a consumer that already has the facts can drive them
|
|
49
|
+
directly.
|
|
50
|
+
|
|
51
|
+
EXPLICITLY OUT OF SCOPE (delegated downstream / to gp): the cert-schema
|
|
52
|
+
tier, and authority / provenance verification. This surface asserts only
|
|
53
|
+
the *shape* and *governance* of a repo's ``.consiliency/`` layout -- it does
|
|
54
|
+
NOT mint, sign, or verify a conformance certificate, and it does not verify
|
|
55
|
+
canon/provenance of the underlying artifacts. Those higher rungs
|
|
56
|
+
(``realized-edge-observed``+ in the maturity ladder) pass through as
|
|
57
|
+
accepted claims here and are verified by a canon-backed verifier
|
|
58
|
+
downstream, not by this library.
|
|
59
|
+
|
|
60
|
+
STABILITY.
|
|
61
|
+
The names re-exported here are the stable public surface. Prefer importing
|
|
62
|
+
from ``phase_loop_runtime.conformance`` (this submodule) rather than reaching
|
|
63
|
+
into ``consiliency_gates`` / ``git_discipline`` / ``consiliency_ingest``
|
|
64
|
+
directly -- those are the private implementation homes and may move; this
|
|
65
|
+
module is the contract.
|
|
66
|
+
"""
|
|
67
|
+
from __future__ import annotations
|
|
68
|
+
|
|
69
|
+
# Re-exports (identical functions -- NOT re-implementations). The evaluator and
|
|
70
|
+
# its pure cores live in three implementation modules; this module is the single
|
|
71
|
+
# named door onto them.
|
|
72
|
+
from .consiliency_gates import (
|
|
73
|
+
CONSILIENCY_GATES_ENV,
|
|
74
|
+
CONSILIENCY_GATES_MODES,
|
|
75
|
+
DEFAULT_CONSILIENCY_GATES_MODE,
|
|
76
|
+
resolve_consiliency_gates_mode,
|
|
77
|
+
scan_consiliency_gates,
|
|
78
|
+
)
|
|
79
|
+
from .consiliency_ingest import evaluate_governance_scope
|
|
80
|
+
from .git_discipline import evaluate_git_discipline, self_heal_partition
|
|
81
|
+
|
|
82
|
+
__all__ = [
|
|
83
|
+
# The evaluator (the "one library" both roles mount).
|
|
84
|
+
"scan_consiliency_gates",
|
|
85
|
+
# Gate-mode helpers (so a consumer can inspect / set the block-opt-in).
|
|
86
|
+
"resolve_consiliency_gates_mode",
|
|
87
|
+
"CONSILIENCY_GATES_ENV",
|
|
88
|
+
"CONSILIENCY_GATES_MODES",
|
|
89
|
+
"DEFAULT_CONSILIENCY_GATES_MODE",
|
|
90
|
+
# The pure cores (injected facts, no runner coupling).
|
|
91
|
+
"evaluate_git_discipline",
|
|
92
|
+
"self_heal_partition",
|
|
93
|
+
"evaluate_governance_scope",
|
|
94
|
+
]
|
{phase_loop_runtime-0.3.0 → phase_loop_runtime-0.4.0}/src/phase_loop_runtime/consiliency_ingest.py
RENAMED
|
@@ -278,6 +278,7 @@ def ingest(
|
|
|
278
278
|
repo: str | Path,
|
|
279
279
|
*,
|
|
280
280
|
adopt: bool = False,
|
|
281
|
+
check_only: bool = False,
|
|
281
282
|
mode: str = "baseline-only",
|
|
282
283
|
archetypes: tuple[str, ...] = (),
|
|
283
284
|
modifiers: tuple[str, ...] = (),
|
|
@@ -285,12 +286,47 @@ def ingest(
|
|
|
285
286
|
display_name: str | None = None,
|
|
286
287
|
dry_run: bool = False,
|
|
287
288
|
) -> IngestResult:
|
|
289
|
+
"""Brownfield ingestion. See the module docstring for the SHAPE/VERIFY split.
|
|
290
|
+
|
|
291
|
+
``check_only`` DECOUPLES "run the conformance check" from "is this repo
|
|
292
|
+
adopted". It is strictly read-only -- it NEVER shapes, so it ignores
|
|
293
|
+
``adopt``. On an adopted repo it is exactly the VERIFY pass. On an
|
|
294
|
+
un-adopted repo (no ``.consiliency/manifest``) it does NOT return the silent
|
|
295
|
+
green ``skipped`` no-op that a plain (non-check) unflagged pass returns;
|
|
296
|
+
instead it returns an explicit, honest ``mode == "not-adopted"`` result so a
|
|
297
|
+
pre-PR actor is not misled into reading a no-op as a pass. Because
|
|
298
|
+
``check_only`` makes the outcome verdict-significant, the CLI maps its exit
|
|
299
|
+
code accordingly (see ``_consiliency_ingest_command``): ``3`` = not adopted /
|
|
300
|
+
nothing to verify, ``1`` = adopted but the gate scan is ``blocked``, ``0`` =
|
|
301
|
+
adopted + verify clean. This function itself only returns the
|
|
302
|
+
:class:`IngestResult`; the exit mapping lives in the CLI.
|
|
303
|
+
"""
|
|
288
304
|
repo = Path(repo)
|
|
289
305
|
existing = find_consiliency_manifest(repo)
|
|
290
306
|
if existing is not None:
|
|
291
307
|
return _verify(repo, existing_manifest_path=existing, dry_run=dry_run)
|
|
292
308
|
|
|
293
309
|
target_manifest_path = manifest_path(repo)
|
|
310
|
+
if check_only:
|
|
311
|
+
# Honest not-adopted signal: there is genuinely nothing to verify, and
|
|
312
|
+
# saying so out loud is the point -- a no-op is NOT a pass.
|
|
313
|
+
return IngestResult(
|
|
314
|
+
repo=repo, mode="not-adopted", dry_run=dry_run, adopted=False,
|
|
315
|
+
manifest_path=target_manifest_path, scaffold=None, gate_scan=None,
|
|
316
|
+
governed_set=(), document_labels=(),
|
|
317
|
+
findings=(
|
|
318
|
+
{
|
|
319
|
+
"code": "adoption.not_adopted",
|
|
320
|
+
"severity": "info",
|
|
321
|
+
"message": (
|
|
322
|
+
"No .consiliency/manifest present: this repo is NOT ADOPTED, "
|
|
323
|
+
"so there is nothing to verify. --check-only reports this "
|
|
324
|
+
"explicitly (distinct from a passing verify) so a no-op is "
|
|
325
|
+
"never mistaken for a pass."
|
|
326
|
+
),
|
|
327
|
+
},
|
|
328
|
+
),
|
|
329
|
+
)
|
|
294
330
|
if not adopt:
|
|
295
331
|
return IngestResult(
|
|
296
332
|
repo=repo, mode="skipped", dry_run=dry_run, adopted=False,
|
|
@@ -1462,6 +1462,8 @@ def _read_phase_source_bundle(
|
|
|
1462
1462
|
category=str(entry.get("category", "")),
|
|
1463
1463
|
sha256=str(entry["sha256"]) if entry.get("sha256") is not None else None,
|
|
1464
1464
|
role=str(entry["role"]) if entry.get("role") is not None else None,
|
|
1465
|
+
# PSCAT-PL: accept the optional free-form producer subtype.
|
|
1466
|
+
subtype=str(entry["subtype"]) if entry.get("subtype") is not None else None,
|
|
1465
1467
|
)
|
|
1466
1468
|
except ValueError as exc:
|
|
1467
1469
|
return None, PipelineMetadataDiagnostic(
|
|
@@ -168,6 +168,18 @@ DIRTY_PATH_CLASSIFICATIONS = (
|
|
|
168
168
|
"unowned",
|
|
169
169
|
)
|
|
170
170
|
PIPELINE_MODE_LITERALS = ("standalone", "pipeline_optional", "pipeline_required")
|
|
171
|
+
# LEGACY FALLBACK ONLY. The canonical protected_source_category vocabulary is
|
|
172
|
+
# owned by the contract SoT (consiliency-contract >= 0.6.5,
|
|
173
|
+
# `core/registries/protected-source-categories.json`, registry name
|
|
174
|
+
# `protected_source_categories`). When the installed contract ships that
|
|
175
|
+
# registry, its `coarse_categories` enum is AUTHORITATIVE and is what
|
|
176
|
+
# `PipelineProtectedSource` validates against -- see
|
|
177
|
+
# `protected_source_categories()` below. This tuple is retained only as the
|
|
178
|
+
# contract-absent degrade path (older contract with no registry): the six
|
|
179
|
+
# pre-existing coarse buckets the loop has always accepted. The registry is a
|
|
180
|
+
# strict superset (same six + `governance_contracts`), so a category valid under
|
|
181
|
+
# the fallback is never rejected under the registry. This is migration glue, not
|
|
182
|
+
# a permanent shim -- registry-present is the SoT.
|
|
171
183
|
PIPELINE_PROTECTED_SOURCE_CATEGORIES = (
|
|
172
184
|
"specs",
|
|
173
185
|
"diagrams",
|
|
@@ -353,6 +365,87 @@ def require_literal(value: str, allowed: tuple[str, ...], label: str) -> str:
|
|
|
353
365
|
return value
|
|
354
366
|
|
|
355
367
|
|
|
368
|
+
# --- protected_source_category vocabulary: sourced from the contract SoT -------
|
|
369
|
+
#
|
|
370
|
+
# The coarse `protected_source_category` enum is owned by consiliency-contract
|
|
371
|
+
# (>= 0.6.5), registry `protected_source_categories`. We read it through the same
|
|
372
|
+
# `consiliency_contract.load_registry` loader the git-discipline / consiliency
|
|
373
|
+
# gates use, mirroring the lazy-cached `available()` / contract-absent degrade
|
|
374
|
+
# pattern in `gate_posture.py`. When the registry is present it is AUTHORITATIVE;
|
|
375
|
+
# when the installed contract predates it (no registry / load error) we degrade
|
|
376
|
+
# to the legacy six-tuple rather than hard-crashing at import time.
|
|
377
|
+
_PROTECTED_CATEGORY_CACHE: tuple[str, ...] | None = None
|
|
378
|
+
_PROTECTED_CATEGORY_REGISTRY_PRESENT = False
|
|
379
|
+
_PROTECTED_CATEGORY_LOADED = False
|
|
380
|
+
_PROTECTED_FINE_SUBTYPES_CACHE: tuple[str, ...] = ()
|
|
381
|
+
|
|
382
|
+
|
|
383
|
+
def _load_protected_source_registry() -> None:
|
|
384
|
+
global _PROTECTED_CATEGORY_CACHE, _PROTECTED_CATEGORY_REGISTRY_PRESENT
|
|
385
|
+
global _PROTECTED_CATEGORY_LOADED, _PROTECTED_FINE_SUBTYPES_CACHE
|
|
386
|
+
if _PROTECTED_CATEGORY_LOADED:
|
|
387
|
+
return
|
|
388
|
+
coarse: tuple[str, ...] | None = None
|
|
389
|
+
fine: tuple[str, ...] = ()
|
|
390
|
+
try:
|
|
391
|
+
from consiliency_contract import load_registry
|
|
392
|
+
|
|
393
|
+
reg = load_registry("protected_source_categories")
|
|
394
|
+
entries = reg.get("coarse_categories") if isinstance(reg, dict) else None
|
|
395
|
+
if isinstance(entries, list):
|
|
396
|
+
ids = tuple(
|
|
397
|
+
str(item["id"])
|
|
398
|
+
for item in entries
|
|
399
|
+
if isinstance(item, dict) and item.get("id")
|
|
400
|
+
)
|
|
401
|
+
if ids:
|
|
402
|
+
coarse = ids
|
|
403
|
+
raw_fine = reg.get("fine_subtypes") if isinstance(reg, dict) else None
|
|
404
|
+
if isinstance(raw_fine, list):
|
|
405
|
+
fine = tuple(str(x) for x in raw_fine if isinstance(x, str))
|
|
406
|
+
except Exception:
|
|
407
|
+
# Installed contract predates the registry (< 0.6.5) or read failed:
|
|
408
|
+
# degrade to the legacy tuple. Not a hard crash -- see gate_posture.py.
|
|
409
|
+
coarse = None
|
|
410
|
+
_PROTECTED_CATEGORY_REGISTRY_PRESENT = coarse is not None
|
|
411
|
+
_PROTECTED_CATEGORY_CACHE = coarse if coarse is not None else PIPELINE_PROTECTED_SOURCE_CATEGORIES
|
|
412
|
+
_PROTECTED_FINE_SUBTYPES_CACHE = fine
|
|
413
|
+
_PROTECTED_CATEGORY_LOADED = True
|
|
414
|
+
|
|
415
|
+
|
|
416
|
+
def _reset_protected_source_registry_cache() -> None:
|
|
417
|
+
"""Test-only: clear the memoized registry read (present/absent isolation)."""
|
|
418
|
+
global _PROTECTED_CATEGORY_CACHE, _PROTECTED_CATEGORY_REGISTRY_PRESENT
|
|
419
|
+
global _PROTECTED_CATEGORY_LOADED, _PROTECTED_FINE_SUBTYPES_CACHE
|
|
420
|
+
_PROTECTED_CATEGORY_CACHE = None
|
|
421
|
+
_PROTECTED_CATEGORY_REGISTRY_PRESENT = False
|
|
422
|
+
_PROTECTED_CATEGORY_LOADED = False
|
|
423
|
+
_PROTECTED_FINE_SUBTYPES_CACHE = ()
|
|
424
|
+
|
|
425
|
+
|
|
426
|
+
def protected_source_categories() -> tuple[str, ...]:
|
|
427
|
+
"""The authoritative coarse `protected_source_category` enum.
|
|
428
|
+
|
|
429
|
+
Prefers the distributed contract registry (>= 0.6.5); falls back to the
|
|
430
|
+
legacy six-tuple when the contract lacks the registry.
|
|
431
|
+
"""
|
|
432
|
+
_load_protected_source_registry()
|
|
433
|
+
assert _PROTECTED_CATEGORY_CACHE is not None # set by loader
|
|
434
|
+
return _PROTECTED_CATEGORY_CACHE
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def protected_source_category_registry_available() -> bool:
|
|
438
|
+
"""True when the installed contract ships the coarse-category registry."""
|
|
439
|
+
_load_protected_source_registry()
|
|
440
|
+
return _PROTECTED_CATEGORY_REGISTRY_PRESENT
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
def protected_source_fine_subtypes() -> tuple[str, ...]:
|
|
444
|
+
"""Registered fine `subtype` names (soft/warn signal only, never a gate)."""
|
|
445
|
+
_load_protected_source_registry()
|
|
446
|
+
return _PROTECTED_FINE_SUBTYPES_CACHE
|
|
447
|
+
|
|
448
|
+
|
|
356
449
|
@dataclass(frozen=True)
|
|
357
450
|
class ModelSelection:
|
|
358
451
|
profile: str
|
|
@@ -691,11 +784,19 @@ class PipelineProtectedSource:
|
|
|
691
784
|
category: str
|
|
692
785
|
sha256: str | None = None
|
|
693
786
|
role: str | None = None
|
|
787
|
+
# PSCAT-PL: the producer's OPTIONAL fine governance granularity, carried
|
|
788
|
+
# alongside the coarse `category`. Free-form by contract design (the fine
|
|
789
|
+
# vocabulary is deliberately NOT re-coupled across repos) -- accepted as any
|
|
790
|
+
# string and never enum-gated. `protected_source_fine_subtypes()` is a soft
|
|
791
|
+
# reference set for tooling only, never a hard reject.
|
|
792
|
+
subtype: str | None = None
|
|
694
793
|
|
|
695
794
|
def __post_init__(self) -> None:
|
|
696
795
|
if not self.path.strip():
|
|
697
796
|
raise ValueError("protected source path must not be empty")
|
|
698
|
-
|
|
797
|
+
# Validate the coarse category against the contract-owned enum
|
|
798
|
+
# (registry-authoritative >= 0.6.5; legacy six-tuple when absent).
|
|
799
|
+
require_literal(self.category, protected_source_categories(), "protected source category")
|
|
699
800
|
if self.role is not None and self.role not in PIPELINE_PROTECTED_SOURCE_LEGACY_ROLES:
|
|
700
801
|
require_literal(self.role, PIPELINE_PROTECTED_SOURCE_ROLES, "protected source role")
|
|
701
802
|
|