specfuse-loop 0.23.1__tar.gz → 0.23.3__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.
- {specfuse_loop-0.23.1/specfuse_loop.egg-info → specfuse_loop-0.23.3}/PKG-INFO +1 -1
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/pyproject.toml +1 -1
- specfuse_loop-0.23.3/specfuse/loop/data/VERSION +1 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/loop.py +1 -1
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/red_on_base.py +39 -5
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3/specfuse_loop.egg-info}/PKG-INFO +1 -1
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_red_on_base_probe.py +112 -0
- specfuse_loop-0.23.1/specfuse/loop/data/VERSION +0 -1
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/LICENSE +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/NOTICE +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/README.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/setup.cfg +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/__init__.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/budget.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/diagnose_invoke.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/drafting_answers.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/drafting_invoke.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/drafting_questions.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/driver_command.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/driver_invoke.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/invoke.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/monitoring_read.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/providers/__init__.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/providers/answers.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/providers/bugs.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/providers/feature.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/providers/findings_autofix.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/providers/findings_diagnose.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/providers/triage.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/queue_read.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/repo_detect.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/run.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/severity_backfill.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/state.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/triage_invoke.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/agent/worktree.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/__init__.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/_filelock.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/_miniyaml.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/_wu_sections.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/adopt_feature.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/agent_policy.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/arm_eval.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/arm_sweep.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/arm_txn.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/bug_lane.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/bug_lane_run.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/bug_lane_state.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/build_provenance.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/caller_check.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/changelog.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/closing_requirements.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/cost.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/criteria_state.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/CHANGELOG.seed.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/LEARNINGS.template.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/docs/concepts/adopting-auto-mode.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/docs/concepts/architecture-addendum-gates-and-iterative-planning.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/docs/concepts/autonomy-stop-classes.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/docs/concepts/ralph-lineage.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/docs/getting-started.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/docs/glossary.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/docs/methodology.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/docs/skills.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/gitignore.snippet +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/monitoring-secrets-checklist.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/monitoring.overrides.yml.example +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/monitoring.yml.example +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/roadmap.template.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/close-discipline.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/correlation-ids.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/design-for-diagnosis.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/human-output.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/never-touch.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/operator-escalation.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/planning-discipline.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/result-contract.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/security-boundaries.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/verification-discipline.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules-local/README.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/schemas/driver-event.schema.json +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/schemas/event.schema.json +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/schemas/events/initiative_created.schema.json +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/schemas/events/spec_issue_resolved.schema.json +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/schemas/events/spec_issue_routed.schema.json +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/schemas/events/spec_validated.schema.json +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/templates/DECISIONS.template.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/templates/GATE.template.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/templates/LEARNINGS-pending.template.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/templates/PLAN.template.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/templates/WU.template.md +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/verification.yml.example +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/workflows/specfuse-monitor.yml +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/decisions_format.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/driver_edit.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/escalation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/events_stats.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/gate_commands.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/gate_eval.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/gh_backend.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/gh_features.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/heartbeat.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/judge.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/labels.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/learnings_distil.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/learnings_query.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/lint_closing.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/lint_monitoring.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/lint_plan.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/lint_roadmap.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/notify.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/notify_escalation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/notify_sla.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/plan_baseline.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/policy_proposals.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/policy_review.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/prerun.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/prerun_capture.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/promotion.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/rearm_migration.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/replay_spin.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/roadmap_archive.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/scaffold.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/triage.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/upgrade_merge_gate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/validate_event.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/__init__.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/adapters.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/artifact.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/autofix.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/autofix_invoke.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/autofix_run.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/autofix_state.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/cli.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/diagnose_cli.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/diagnosis.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/fingerprint.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/issues.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/providers/__init__.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/providers/_azure_auth.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/providers/azure_app_insights.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/providers/azure_service_bus.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/redaction.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/schedule.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse_loop.egg-info/SOURCES.txt +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse_loop.egg-info/dependency_links.txt +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse_loop.egg-info/entry_points.txt +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse_loop.egg-info/requires.txt +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse_loop.egg-info/top_level.txt +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_abandon_feature_skill.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_abandoned_work_reported.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_abandoned_wu_strands_gate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_adopt_feature.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_budget.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_bug_selection_dedup.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_default_features_root.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_driver_command.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_driver_invoke.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_driver_restart.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_escalation_on_issue.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_escalation_run_state.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_findings_seam.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_invoke_timeout.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_invoke_usage.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_item_worktree.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_lock.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_policy_key_ownership.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_policy_queue.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_policy_schema.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_policy_triage_dial.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_provider_answers.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_provider_bugs.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_provider_feature.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_provider_findings_autofix.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_provider_findings_diagnose.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_provider_isolation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_provider_triage.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_queue_read.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_relays_driver_output.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_repo_detect.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_run.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_run_progress.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_seam.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_snapshot_refresh.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_agent_state.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_answer_escalation_skill.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_app_insights_adapters.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_archive_ref_reconciliation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_arm_eval.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_arm_eval_lint_class.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_arm_eval_wiring.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_arm_gate_edits_uncommitted.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_arm_sweep.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_arm_sweep_gate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_arm_txn.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_arm_wiring.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_artifact_redaction.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_attempt_note_untracked_files.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_attempt_outcome_contract.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_attempt_outcome_emission.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_attention_nonwriting_guard.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_attention_silence_section.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_attention_skill_structure.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_attribution_halt_claims.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autoclose_deferral_visibility.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autoclose_gate_note.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autoclose_stub_states_what_passed.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autofix_invoke.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autofix_live.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autofix_predicate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autofix_run.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autofix_state.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autosync.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autosync_consent.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autosync_firstrun.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autosync_no_cwd_leak.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_autosync_plugin.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_azure_credential_resolution.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_backend.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_baseline_escalation_message.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_baseline_persistence.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_baseline_probe.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_baseline_provenance.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_baseline_tree_hash_key.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bash_routing.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bats_suites_gated.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_binary_verdict.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_binding_block_advisory.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_binding_block_allocation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_binding_block_budget.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bookkeeping_commit_crash_run.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bookkeeping_commit_hook_crash.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bookkeeping_no_verify.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_brief_covers_every_unit_escalation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bug_lane_ci_pending.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bug_lane_guardrails.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bug_lane_label_nonfatal.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bug_lane_labels_registered.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bug_lane_min_severity.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bug_lane_policy_contract.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bug_lane_pr_number_carried.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bug_lane_preflight_and_dial.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bug_lane_run.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bug_lane_state.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bug_lane_stopped_outcome_pr_number.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_bug_lane_test_paths.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_build_provenance.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_caller_check_ratchet.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_changed_file_test_selection.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_changelog_append_only.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_changelog_collection.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_changelog_release_wiring.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_changelog_schema.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_ci_conclusion_wait.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_ci_runs_every_gate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_claude_resolution.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_close_b_pending_learnings.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_close_records_feature_oracle.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_close_wu_self_reference.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_closing_deliverable_guard.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_closing_guard_contracts.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_closing_guard_prediction.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_closing_learnings_destination.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_closing_requirements.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_coauthor_trailer_allowlist.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_conditional_reflection.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_console_encoding.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_convergent_iteration.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_convergent_wu_lint.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_correlation_id_override.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_correlation_id_two_surfaces.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_cost_lifetime.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_cost_tracking.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_criteria_per_gate_lint.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_criteria_state.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_criteria_worklist.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_decision_citation_lint.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_decision_followups_discharged.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_decision_override_lint.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_decisions_format.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_default_severity_aliases.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_degraded_oracle.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_deliverable_missing_note.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_deliverable_presence_gate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_derive_agent_policy_review_mode.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_derive_agent_policy_skill.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_derive_monitoring_discovery.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_derive_monitoring_skill_registration.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_design_for_diagnosis_rule.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_deterministic_refusal_repeat.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_diagnose_headless.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_diagnose_issue_skill.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_diagnosis.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_diagnosis_roundtrip_live.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_dispatch_model_from_fix_scope.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_dispatch_skeleton.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_distilled_accept_step.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_doctor.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_doctor_command_preflight.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_done_feature_gates.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_draft_feature_answers_mode.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_drafting_answer_gate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_drafting_invoke.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_drafting_question_issue.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_drafting_questions.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_drafting_reply_shape.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_driver_edit_detection.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_driver_event_registry_covers_emitters.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_driver_integration.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_driver_lock.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_driver_module_surface.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_driver_restart_halt_surfaced.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_driver_restart_halt_wiring.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_driver_restart_hold.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_driver_staleness_gate_summary.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_driver_staleness_warning.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_dry_run_no_branch_mutation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_duration_tracking.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_empty_files_escalation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_ensure_feature_branch.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_ensure_feature_branch_base.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_escalation_assignee_policy.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_escalation_contract.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_escalation_crash_containment.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_escalation_dedup_search.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_escalation_emit.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_event_gate_full_envelope.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_events_redaction.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_events_stats.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_extra_gates.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_failure_artifact_model.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_failure_signature_fail_prefix.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_failure_signature_skips_log_noise.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_feature_branch_auto_sync.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_feature_branch_squash_merge.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_feature_branch_stale_base.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_feature_id_resolution.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_feature_oracle_e2e.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_feature_provider_drafting_dispatch.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_feature_review_accumulation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_filelock_portable.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_files_changed_auto_repair.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_find_pr_no_search_index.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_fingerprint.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_fix_bug_diff_self_check.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_fix_bug_headless.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_fix_bug_reads_comments.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_fold_contract_documented.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_followups_artifact.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_force_full_close.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_frontmatter_scalar_quoting.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gate_broad_run.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gate_budget.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gate_budget_post_dispatch.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gate_commands_needs.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gate_eval.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gate_eval_calibration.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gate_eval_intermediate_wiring.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gate_eval_repo_flag.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gate_eval_terminal_wiring.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gate_report_verdict.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gh_backend.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gh_features.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_git_env_isolation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_gitleaks_pinning.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_groom_backlog_skill.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_guard_refusal_failure_class.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_guard_refusal_failure_excerpt.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_guard_repair_e2e.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_guard_repair_prompt.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_hashed_denylist.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_hashed_denylist_ci.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_heartbeat.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_heartbeat_adapter.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_human_output_rule.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_human_work_unit.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_hygiene_boundary_guidance.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_hyphenated_gate_name.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_ignored_cleanup_before_probe.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_init_integration.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_installed_copy_driver_e2e.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_interpreter_normalization.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_judge_close_path.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_judge_cost.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_judge_cost_fold_committed.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_judge_module.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_judge_path_registry.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_judge_terminal_flip_state.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_label_description_length.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_label_provisioning_runner_contract.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_label_registry.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_label_registry_covers_consumers.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_language_aware_narrow_selection.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lazy_baseline_e2e.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_leak_findings_redaction.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_leak_scan.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_leak_scan_content.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_learnings_curate_vendored_promote.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_learnings_distil_cli.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_learnings_query.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_learnings_staging.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_learnings_suggest_signature_filter.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_learnings_weights.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_legacy_4wu_terminal_flips.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lifecycle_integration.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lifetime_accounting.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_ac_observable.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_bare_produces_path.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_boundary_consistency.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_boundary_extraction.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_close_intermediate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_close_verdict_not_predecided.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_close_wu.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_closing.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_closing_criteria.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_closing_criteria_pristine.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_correlation_id.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_correlation_id_close_intermediate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_covers_load_wu_invariants.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_feature_oracle_declared.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_gate_proportionality.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_monitoring.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_oracle_env.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_plan_contract_fields.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_plan_errors.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_plan_next_draft.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_plan_relative_import.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_plan_verdict_exempt.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_planning_sections.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_produces_driver_helper.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_produces_satisfiability.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_roadmap.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_sections.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_task_graph_yaml_selection.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_lint_verification_reference.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_live_tests_opt_in.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_load_bearing_close_lint.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_attempt_evidence.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_auto_archive.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_caveman_preamble.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_close_intermediate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_criteria_skeleton.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_criteria_survival.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_defaults_by_type.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_effort.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_failure_note_cap.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_files_changed_guard.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_gate_budget.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_gate_needs.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_model_alias.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_orchestration.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_post_pass_invariant.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_reset_preserving_events.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_smoke_runner.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_unsandboxed.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_worklist_injection.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_loop_zero_token_guard.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_make_repo_gpgsign_isolation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_marker_dual_shape.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_maven_failure_excerpt.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_max_attempts_configurable.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_max_open_prs.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_migrate_legacy.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_miniyaml_equivalence.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_miniyaml_negative.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_monitor_cli.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_monitor_issue_lifecycle.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_monitor_runner_surfaces.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_monitoring_bootstrap_artifacts.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_monitoring_cron_dialect.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_monitoring_example.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_monitoring_fenced_blocks.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_monitoring_seed.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_narrow_fallback_warning.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_needs_decision_outcome.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_no_pytest_subprocess.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_notify.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_notify_escalation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_notify_sla.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_operator_escalation_rule.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_oracle_set_declared.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_oracle_unrunnable_attribution.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_per_run_item_cap_disclosure.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_pick_feature_skill.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_pin_honesty_and_integrity.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_pin_marker_not_inherited.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_pin_marker_spawn_sites.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_plan_baseline.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_planned_cost_lint.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_planning_cost_floor.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_plugin_prose_cross_refs.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_plugin_qualified_dispatch.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_policy_budgets_applied.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_policy_proposals.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_policy_review.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_pr_checks_json_field.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_pr_reference_in_title.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_pre_existing_claims_cite_evidence.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_prep_halt_operator_surface.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_prepare_feature.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_prepare_scaffold_sync.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_prerun_capture.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_prerun_oracles.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_prerun_wiring.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_produced_document_verdict_guard.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_produces_bracket_literal.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_produces_bracket_wildcard.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_produces_field.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_produces_in_diff.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_produces_justification.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_produces_recursive_glob.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_produces_semantics_unified.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_produces_shape.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_progress_forward_note.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_progress_lines_end_to_end.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_promotion_ledger.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_provider_escalation_traces.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_provision_labels.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_queue_stalled_adapter.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_rearm_clears_stale_criteria_state.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_rearm_fold_marker.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_rearm_migration.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_red_baseline_never_reused.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_red_on_base_guardrail.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_redaction_windows_home.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_reflection_required_signals.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_replan_end_to_end.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_replan_event_emission.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_replan_note_collision.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_replan_trigger.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_replan_turn_contract.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_replay_spin.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_required_checks.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_resolve_base.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_restart_cap_counts_progress.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_result_block.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_result_block_audience.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_resume_command_build.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_retain_on_guard_refusal_docs.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_roadmap_add_skill.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_roadmap_archive_cli.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_roadmap_archive_shim.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_roadmap_archive_skill.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_roadmap_archive_skill_delegates.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_roadmap_link_gate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_roadmap_row_parser.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_ruff_verdict_lines.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_rule_import_convergence.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_run_level_failure_breaker.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_scaffold_data_in_sync.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_scaffold_doc_hygiene.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_scaffold_docs.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_scaffold_init.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_scaffold_label_provisioning.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_scaffold_manifest.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_scaffold_resources.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_scaffold_seed_sanity.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_scaffold_skew_halts.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_scaffold_upgrade.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_scaffold_wiring.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_schedule_dialect.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_seed_documents_prerun_keys.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_service_bus_dlq_adapter.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_session_env_preflight.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_severity_aliases.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_severity_backfill_apply.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_severity_backfill_end_to_end.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_severity_backfill_limit.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_severity_backfill_marker.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_severity_backfill_run.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_severity_label_projection.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_severity_reconciliation.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_severity_rubric.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_shipped_templates_parse.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_skill_discovery_links.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_skills_vendored_in_sync.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_spinning_rearm_gate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_spinout_brief_end_to_end.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_spinout_brief_replan_option.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_squash_commit_hook_crash.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_stop_rationale_captured.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_stranded_halt_cause.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_surefire_run_level_signature.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_surefire_verdict_lines.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_template_closing_shapes.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_terminal_flip_ownership.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_terminal_flips.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_terminal_gate_message.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_tiered_verification_e2e.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_timeout_kill_portable.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_triage.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_triage_apply.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_triage_severity_classify.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_triage_severity_end_to_end.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_triage_severity_write.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_triage_skill_contract.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_triage_skips_agent_escalations.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_tsc_verdict_lines.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_umbrella_version_resolution.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_unterminated_frontmatter.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_untracked_feature_folder.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_untracked_file_absorption.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_upgrade_integration.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_upgrade_merge_gate.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_validate_event.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_validate_event_driver_types.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_verdict_coupling.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_verify_empty_gate_set.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_version_consistency.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_version_skew.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_windows_gate_exec.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_worktree_restore.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_wu_execution_metadata.py +0 -0
- {specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/tests/test_wu_template_renders_lintable.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "specfuse-loop"
|
|
7
|
-
version = "0.23.
|
|
7
|
+
version = "0.23.3"
|
|
8
8
|
description = "Local-first executor for the Specfuse Plan + Work Unit gate-cycle methodology."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.23.3
|
|
@@ -125,7 +125,7 @@ SPECFUSE_DIR = Path(".specfuse")
|
|
|
125
125
|
REPO_ROOT = SPECFUSE_DIR.parent
|
|
126
126
|
FEATURES_DIR = SPECFUSE_DIR / "features"
|
|
127
127
|
VERIFICATION_PATH = SPECFUSE_DIR / "verification.yml"
|
|
128
|
-
DRIVER_VERSION = "0.23.
|
|
128
|
+
DRIVER_VERSION = "0.23.3"
|
|
129
129
|
# Oldest scaffold layout this driver can drive. init.sh stamps the scaffold's own
|
|
130
130
|
# version into `.specfuse/VERSION`; check_scaffold_version() fails loud at startup if
|
|
131
131
|
# the consumer's scaffold is older than this, pointing at `specfuse upgrade`. Bump
|
|
@@ -27,6 +27,13 @@ Three deliberate constraints:
|
|
|
27
27
|
* **Never guess the command.** The operator declares it. A guessed command that
|
|
28
28
|
silently matched no tests would exit non-zero, read as "red on base", and
|
|
29
29
|
wave every PR through -- strictly worse than the gap it was meant to close.
|
|
30
|
+
* **Run it through a shell.** Operator-authored commands use pipes, `||`, `$(...)`
|
|
31
|
+
and inline environment overrides, exactly as the gate commands in
|
|
32
|
+
`verification.yml` do -- `_run_gate_set` runs those with `shell=True` for the
|
|
33
|
+
same stated reason. A first cut of this module used `shlex.split` and no
|
|
34
|
+
shell, which could not express the command of the very repository it was
|
|
35
|
+
built for: every merge would have declined `red_on_base_unverified` while
|
|
36
|
+
looking configured.
|
|
30
37
|
* **Fail closed.** Every unknown returns `None`, which the guardrail reads as
|
|
31
38
|
unverified and declines. An unverifiable claim is not a satisfied one.
|
|
32
39
|
|
|
@@ -45,6 +52,12 @@ from pathlib import Path
|
|
|
45
52
|
from typing import Any, Callable, Optional
|
|
46
53
|
|
|
47
54
|
|
|
55
|
+
#: POSIX reserves these for the shell's own failure to run the command: 126 is
|
|
56
|
+
#: "found but not executable", 127 is "not found". Neither says anything about
|
|
57
|
+
#: the test, so neither may be read as a verdict on it (#3403).
|
|
58
|
+
_COULD_NOT_EXECUTE = frozenset({126, 127})
|
|
59
|
+
|
|
60
|
+
|
|
48
61
|
def select_test_files(changed_files: Any, test_paths: Any) -> list:
|
|
49
62
|
"""The changed files that live under a declared test root.
|
|
50
63
|
|
|
@@ -77,9 +90,16 @@ def test_was_red_on_base(
|
|
|
77
90
|
"""`True` if *test_files* fail at *base_sha*, `False` if they pass, else `None`.
|
|
78
91
|
|
|
79
92
|
`command_template` is the operator's own command with a `{tests}`
|
|
80
|
-
placeholder
|
|
81
|
-
|
|
82
|
-
|
|
93
|
+
placeholder, run through `sh -c` so pipes, `||` and `$(...)` all work --
|
|
94
|
+
a Maven repository needs `$(...)` just to turn the changed file paths into
|
|
95
|
+
the class names `-Dtest=` accepts. Absent, this returns `None` and the
|
|
96
|
+
merge declines: see the module docstring on why guessing is worse than the
|
|
97
|
+
gap.
|
|
98
|
+
|
|
99
|
+
`sh -c` rather than `subprocess(shell=True)` so the command still arrives
|
|
100
|
+
through the injected runner as an argv, which is what makes this testable
|
|
101
|
+
without executing anything. It also means the template is POSIX shell; a
|
|
102
|
+
Windows runner would need its own spelling, and none is invented here.
|
|
83
103
|
|
|
84
104
|
`None` means "could not establish", never "fine". A worktree that will not
|
|
85
105
|
create, a runner that raises, no declared command and no test file in the
|
|
@@ -103,14 +123,28 @@ def test_was_red_on_base(
|
|
|
103
123
|
return None
|
|
104
124
|
|
|
105
125
|
try:
|
|
106
|
-
rendered = command_template.replace(
|
|
126
|
+
rendered = command_template.replace(
|
|
127
|
+
"{tests}", " ".join(shlex.quote(p) for p in files))
|
|
107
128
|
try:
|
|
108
|
-
result = runner(
|
|
129
|
+
result = runner(["sh", "-c", rendered], cwd=str(root), check=False)
|
|
109
130
|
except Exception: # noqa: BLE001 - same reason as above
|
|
110
131
|
return None
|
|
111
132
|
code = getattr(result, "returncode", None)
|
|
112
133
|
if not isinstance(code, int):
|
|
113
134
|
return None
|
|
135
|
+
if code in _COULD_NOT_EXECUTE:
|
|
136
|
+
# The shell could not run the command at all. That is "the check
|
|
137
|
+
# never ran", not "the test failed" -- and the difference is the
|
|
138
|
+
# whole point of keeping those two declining reasons apart.
|
|
139
|
+
#
|
|
140
|
+
# Measured: an operator whose command is a committed script hits
|
|
141
|
+
# this on every PR whose merge base predates that script. The
|
|
142
|
+
# worktree is the BASE tree, so the script is simply absent there,
|
|
143
|
+
# `sh` exits 127, and reading that as red would let the merge
|
|
144
|
+
# through on the strength of a command that never ran. Fail-open,
|
|
145
|
+
# in the one guardrail whose entire job is to be harder to satisfy
|
|
146
|
+
# than the others.
|
|
147
|
+
return None
|
|
114
148
|
# Non-zero at the base is the proof we want: the test the PR adds does
|
|
115
149
|
# not hold on the tree the fix was written against.
|
|
116
150
|
return code != 0
|
|
@@ -178,5 +178,117 @@ class TheProbe(unittest.TestCase):
|
|
|
178
178
|
self.assertNotIn("reset", argv)
|
|
179
179
|
|
|
180
180
|
|
|
181
|
+
class TheCommandGetsAShell(unittest.TestCase):
|
|
182
|
+
"""Operator commands use shell features; the probe must provide them.
|
|
183
|
+
|
|
184
|
+
The first cut of this module ran `shlex.split(rendered)` with no shell. It
|
|
185
|
+
passed every test above, because none of them used a shell feature — and it
|
|
186
|
+
could not express the command of the repository it was built for. A Maven
|
|
187
|
+
project needs `$(...)` just to turn changed file paths into the class names
|
|
188
|
+
`-Dtest=` accepts, so turning the guardrail on there would have declined
|
|
189
|
+
every merge as `red_on_base_unverified` while looking configured.
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
def _tmp(self) -> Path:
|
|
193
|
+
tmp = TemporaryDirectory()
|
|
194
|
+
self.addCleanup(tmp.cleanup)
|
|
195
|
+
return Path(tmp.name)
|
|
196
|
+
|
|
197
|
+
def _capture(self, template):
|
|
198
|
+
seen = {}
|
|
199
|
+
|
|
200
|
+
def runner(argv, **kw):
|
|
201
|
+
if argv[:2] == ["git", "worktree"]:
|
|
202
|
+
return SimpleNamespace(returncode=0, stdout="", stderr="")
|
|
203
|
+
seen["argv"] = list(argv)
|
|
204
|
+
return SimpleNamespace(returncode=1, stdout="", stderr="")
|
|
205
|
+
|
|
206
|
+
test_was_red_on_base(
|
|
207
|
+
runner, base_sha="abc123", test_files=["src/test/java/FooTest.java"],
|
|
208
|
+
command_template=template, worktree_root=self._tmp(),
|
|
209
|
+
)
|
|
210
|
+
return seen["argv"]
|
|
211
|
+
|
|
212
|
+
def test_the_command_is_handed_to_a_shell(self):
|
|
213
|
+
argv = self._capture("pytest {tests}")
|
|
214
|
+
|
|
215
|
+
self.assertEqual(["sh", "-c"], argv[:2])
|
|
216
|
+
self.assertEqual(3, len(argv), "the whole command is one shell string")
|
|
217
|
+
|
|
218
|
+
def test_shell_syntax_survives_intact(self):
|
|
219
|
+
template = (
|
|
220
|
+
'./mvnw test -Dtest=$(echo "{tests}" | sed -E "s@.*/([^/]+)\\.java@\\1@")'
|
|
221
|
+
' || { echo failed; exit 1; }'
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
argv = self._capture(template)
|
|
225
|
+
|
|
226
|
+
self.assertIn("$(", argv[2])
|
|
227
|
+
self.assertIn("||", argv[2])
|
|
228
|
+
self.assertIn("|", argv[2])
|
|
229
|
+
|
|
230
|
+
def test_a_path_needing_quoting_is_quoted(self):
|
|
231
|
+
seen = {}
|
|
232
|
+
|
|
233
|
+
def runner(argv, **kw):
|
|
234
|
+
if argv[:2] == ["git", "worktree"]:
|
|
235
|
+
return SimpleNamespace(returncode=0, stdout="", stderr="")
|
|
236
|
+
seen["argv"] = list(argv)
|
|
237
|
+
return SimpleNamespace(returncode=1, stdout="", stderr="")
|
|
238
|
+
|
|
239
|
+
test_was_red_on_base(
|
|
240
|
+
runner, base_sha="abc", test_files=["tests/a b.py", "tests/c;d.py"],
|
|
241
|
+
command_template="pytest {tests}", worktree_root=self._tmp(),
|
|
242
|
+
)
|
|
243
|
+
|
|
244
|
+
# Unquoted, `a b.py` would become two arguments and `c;d.py` would end
|
|
245
|
+
# the command — a path the repository controls must not be able to do
|
|
246
|
+
# either.
|
|
247
|
+
self.assertIn("'tests/a b.py'", seen["argv"][2])
|
|
248
|
+
self.assertIn("'tests/c;d.py'", seen["argv"][2])
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class ACommandThatCannotRunIsUnverified(unittest.TestCase):
|
|
252
|
+
"""127 is the shell saying it could not run the command, not a verdict.
|
|
253
|
+
|
|
254
|
+
Reading it as "red on base" is fail-OPEN, in the one guardrail whose whole
|
|
255
|
+
job is to be harder to satisfy than the other six.
|
|
256
|
+
|
|
257
|
+
Measured on a real repository: the operator's command was a committed
|
|
258
|
+
script, the probe's worktree is the BASE tree, and on every PR whose merge
|
|
259
|
+
base predates that script the file is simply absent. `sh` exits 127 and the
|
|
260
|
+
merge proceeded on the strength of a command that never ran.
|
|
261
|
+
"""
|
|
262
|
+
|
|
263
|
+
def _tmp(self) -> Path:
|
|
264
|
+
tmp = TemporaryDirectory()
|
|
265
|
+
self.addCleanup(tmp.cleanup)
|
|
266
|
+
return Path(tmp.name)
|
|
267
|
+
|
|
268
|
+
def _verdict_for(self, exit_code):
|
|
269
|
+
def runner(argv, **kw):
|
|
270
|
+
if argv[:2] == ["git", "worktree"]:
|
|
271
|
+
return SimpleNamespace(returncode=0, stdout="", stderr="")
|
|
272
|
+
return SimpleNamespace(returncode=exit_code, stdout="", stderr="")
|
|
273
|
+
|
|
274
|
+
return test_was_red_on_base(
|
|
275
|
+
runner, base_sha="abc123", test_files=["tests/test_a.py"],
|
|
276
|
+
command_template="./scripts/probe.sh {tests}",
|
|
277
|
+
worktree_root=self._tmp(),
|
|
278
|
+
)
|
|
279
|
+
|
|
280
|
+
def test_command_not_found_is_unverified(self):
|
|
281
|
+
self.assertIsNone(self._verdict_for(127))
|
|
282
|
+
|
|
283
|
+
def test_command_not_executable_is_unverified(self):
|
|
284
|
+
self.assertIsNone(self._verdict_for(126))
|
|
285
|
+
|
|
286
|
+
def test_an_ordinary_test_failure_is_still_red(self):
|
|
287
|
+
self.assertIs(True, self._verdict_for(1))
|
|
288
|
+
|
|
289
|
+
def test_a_pass_is_still_not_red(self):
|
|
290
|
+
self.assertIs(False, self._verdict_for(0))
|
|
291
|
+
|
|
292
|
+
|
|
181
293
|
if __name__ == "__main__": # pragma: no cover
|
|
182
294
|
unittest.main()
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.23.1
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/docs/concepts/adopting-auto-mode.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/docs/concepts/ralph-lineage.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/monitoring-secrets-checklist.md
RENAMED
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/monitoring.overrides.yml.example
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/design-for-diagnosis.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/operator-escalation.md
RENAMED
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/planning-discipline.md
RENAMED
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/security-boundaries.md
RENAMED
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/rules/verification-discipline.md
RENAMED
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/schemas/driver-event.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/templates/DECISIONS.template.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/loop/data/workflows/specfuse-monitor.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/providers/azure_app_insights.py
RENAMED
|
File without changes
|
{specfuse_loop-0.23.1 → specfuse_loop-0.23.3}/specfuse/monitor/providers/azure_service_bus.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|