specfuse-loop 0.20.1__tar.gz → 0.22.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.
- {specfuse_loop-0.20.1/specfuse_loop.egg-info → specfuse_loop-0.22.0}/PKG-INFO +1 -1
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/pyproject.toml +2 -1
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/drafting_invoke.py +19 -4
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/providers/bugs.py +77 -15
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/providers/triage.py +26 -2
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/run.py +296 -3
- specfuse_loop-0.22.0/specfuse/agent/severity_backfill.py +257 -0
- specfuse_loop-0.22.0/specfuse/agent/triage_invoke.py +129 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/agent_policy.py +284 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/bug_lane_run.py +34 -5
- specfuse_loop-0.22.0/specfuse/loop/data/VERSION +1 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/docs/methodology.md +6 -4
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/rules/correlation-ids.md +1 -1
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/labels.py +183 -19
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/lint_plan.py +71 -7
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/loop.py +19 -37
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/scaffold.py +184 -1
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/triage.py +140 -12
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/autofix_invoke.py +41 -3
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0/specfuse_loop.egg-info}/PKG-INFO +1 -1
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse_loop.egg-info/SOURCES.txt +23 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse_loop.egg-info/entry_points.txt +1 -0
- specfuse_loop-0.22.0/tests/test_agent_snapshot_refresh.py +279 -0
- specfuse_loop-0.22.0/tests/test_bug_lane_min_severity.py +99 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_build_provenance.py +1 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_caller_check_ratchet.py +3 -1
- specfuse_loop-0.22.0/tests/test_default_severity_aliases.py +205 -0
- specfuse_loop-0.22.0/tests/test_doctor_command_preflight.py +153 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_boundary_consistency.py +28 -2
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_boundary_extraction.py +1 -1
- specfuse_loop-0.22.0/tests/test_lint_covers_load_wu_invariants.py +122 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_produces_satisfiability.py +12 -2
- specfuse_loop-0.22.0/tests/test_marker_dual_shape.py +192 -0
- specfuse_loop-0.22.0/tests/test_max_open_prs.py +237 -0
- specfuse_loop-0.22.0/tests/test_plugin_qualified_dispatch.py +83 -0
- specfuse_loop-0.22.0/tests/test_policy_budgets_applied.py +94 -0
- specfuse_loop-0.22.0/tests/test_pr_reference_in_title.py +79 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_produces_bracket_literal.py +20 -3
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_produces_bracket_wildcard.py +20 -3
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_produces_in_diff.py +31 -11
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_produces_justification.py +1 -1
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_produces_recursive_glob.py +23 -3
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_produces_semantics_unified.py +26 -6
- specfuse_loop-0.22.0/tests/test_rule_import_convergence.py +90 -0
- specfuse_loop-0.22.0/tests/test_run_level_failure_breaker.py +212 -0
- specfuse_loop-0.22.0/tests/test_severity_aliases.py +277 -0
- specfuse_loop-0.22.0/tests/test_severity_backfill_apply.py +142 -0
- specfuse_loop-0.22.0/tests/test_severity_backfill_end_to_end.py +86 -0
- specfuse_loop-0.22.0/tests/test_severity_backfill_limit.py +122 -0
- specfuse_loop-0.22.0/tests/test_severity_backfill_marker.py +164 -0
- specfuse_loop-0.22.0/tests/test_severity_backfill_run.py +226 -0
- specfuse_loop-0.22.0/tests/test_severity_rubric.py +194 -0
- specfuse_loop-0.22.0/tests/test_triage_severity_classify.py +105 -0
- specfuse_loop-0.22.0/tests/test_triage_severity_end_to_end.py +239 -0
- specfuse_loop-0.22.0/tests/test_triage_severity_write.py +146 -0
- specfuse_loop-0.20.1/specfuse/agent/triage_invoke.py +0 -70
- specfuse_loop-0.20.1/specfuse/loop/data/VERSION +0 -1
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/LICENSE +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/NOTICE +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/README.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/setup.cfg +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/__init__.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/budget.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/diagnose_invoke.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/drafting_answers.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/drafting_questions.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/driver_command.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/driver_invoke.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/invoke.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/monitoring_read.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/providers/__init__.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/providers/answers.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/providers/feature.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/providers/findings_autofix.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/providers/findings_diagnose.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/queue_read.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/repo_detect.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/state.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/agent/worktree.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/__init__.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/_filelock.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/_miniyaml.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/_wu_sections.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/adopt_feature.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/arm_eval.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/arm_sweep.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/arm_txn.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/bug_lane.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/bug_lane_state.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/build_provenance.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/caller_check.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/changelog.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/closing_requirements.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/cost.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/criteria_state.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/CHANGELOG.seed.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/LEARNINGS.template.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/docs/concepts/adopting-auto-mode.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/docs/concepts/architecture-addendum-gates-and-iterative-planning.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/docs/concepts/autonomy-stop-classes.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/docs/concepts/ralph-lineage.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/docs/getting-started.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/docs/glossary.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/docs/skills.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/gitignore.snippet +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/monitoring-secrets-checklist.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/monitoring.overrides.yml.example +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/monitoring.yml.example +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/roadmap.template.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/rules/close-discipline.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/rules/design-for-diagnosis.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/rules/human-output.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/rules/never-touch.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/rules/operator-escalation.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/rules/planning-discipline.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/rules/result-contract.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/rules/security-boundaries.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/rules/verification-discipline.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/rules-local/README.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/schemas/driver-event.schema.json +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/schemas/event.schema.json +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/schemas/events/initiative_created.schema.json +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/schemas/events/spec_issue_resolved.schema.json +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/schemas/events/spec_issue_routed.schema.json +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/schemas/events/spec_validated.schema.json +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/templates/DECISIONS.template.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/templates/GATE.template.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/templates/LEARNINGS-pending.template.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/templates/PLAN.template.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/templates/WU.template.md +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/verification.yml.example +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/data/workflows/specfuse-monitor.yml +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/decisions_format.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/driver_edit.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/escalation.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/events_stats.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/gate_commands.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/gate_eval.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/gh_backend.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/gh_features.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/heartbeat.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/judge.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/learnings_distil.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/learnings_query.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/lint_closing.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/lint_monitoring.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/lint_roadmap.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/notify.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/notify_escalation.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/notify_sla.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/plan_baseline.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/policy_proposals.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/policy_review.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/prerun.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/prerun_capture.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/promotion.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/rearm_migration.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/replay_spin.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/roadmap_archive.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/upgrade_merge_gate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/loop/validate_event.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/__init__.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/adapters.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/artifact.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/autofix.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/autofix_run.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/autofix_state.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/cli.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/diagnose_cli.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/diagnosis.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/fingerprint.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/issues.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/providers/__init__.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/providers/_azure_auth.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/providers/azure_app_insights.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/providers/azure_service_bus.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/redaction.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse/monitor/schedule.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse_loop.egg-info/dependency_links.txt +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse_loop.egg-info/requires.txt +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/specfuse_loop.egg-info/top_level.txt +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_abandon_feature_skill.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_abandoned_work_reported.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_abandoned_wu_strands_gate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_adopt_feature.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_budget.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_bug_selection_dedup.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_default_features_root.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_driver_command.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_driver_invoke.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_driver_restart.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_escalation_on_issue.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_escalation_run_state.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_findings_seam.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_invoke_timeout.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_invoke_usage.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_item_worktree.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_lock.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_policy_key_ownership.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_policy_queue.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_policy_schema.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_policy_triage_dial.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_provider_answers.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_provider_bugs.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_provider_feature.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_provider_findings_autofix.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_provider_findings_diagnose.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_provider_isolation.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_provider_triage.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_queue_read.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_relays_driver_output.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_repo_detect.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_run.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_run_progress.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_seam.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_agent_state.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_answer_escalation_skill.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_app_insights_adapters.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_archive_ref_reconciliation.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_arm_eval.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_arm_eval_lint_class.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_arm_eval_wiring.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_arm_gate_edits_uncommitted.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_arm_sweep.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_arm_sweep_gate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_arm_txn.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_arm_wiring.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_artifact_redaction.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_attempt_note_untracked_files.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_attempt_outcome_contract.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_attempt_outcome_emission.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_attention_nonwriting_guard.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_attention_silence_section.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_attention_skill_structure.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autoclose_deferral_visibility.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autoclose_gate_note.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autoclose_stub_states_what_passed.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autofix_invoke.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autofix_live.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autofix_predicate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autofix_run.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autofix_state.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autosync.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autosync_consent.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autosync_firstrun.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autosync_no_cwd_leak.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_autosync_plugin.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_azure_credential_resolution.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_backend.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_baseline_escalation_message.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_baseline_persistence.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_baseline_probe.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_baseline_provenance.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_baseline_tree_hash_key.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bash_routing.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bats_suites_gated.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_binary_verdict.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_binding_block_advisory.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_binding_block_allocation.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_binding_block_budget.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bookkeeping_commit_crash_run.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bookkeeping_commit_hook_crash.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bookkeeping_no_verify.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_brief_covers_every_unit_escalation.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bug_lane_ci_pending.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bug_lane_guardrails.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bug_lane_label_nonfatal.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bug_lane_labels_registered.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bug_lane_policy_contract.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bug_lane_pr_number_carried.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bug_lane_preflight_and_dial.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bug_lane_run.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bug_lane_state.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bug_lane_stopped_outcome_pr_number.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_bug_lane_test_paths.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_changed_file_test_selection.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_changelog_append_only.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_changelog_collection.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_changelog_release_wiring.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_changelog_schema.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_ci_conclusion_wait.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_ci_runs_every_gate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_claude_resolution.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_close_b_pending_learnings.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_close_records_feature_oracle.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_close_wu_self_reference.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_closing_deliverable_guard.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_closing_guard_contracts.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_closing_guard_prediction.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_closing_learnings_destination.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_closing_requirements.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_coauthor_trailer_allowlist.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_conditional_reflection.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_console_encoding.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_convergent_iteration.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_convergent_wu_lint.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_correlation_id_override.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_correlation_id_two_surfaces.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_cost_lifetime.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_cost_tracking.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_criteria_per_gate_lint.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_criteria_state.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_criteria_worklist.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_decision_citation_lint.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_decision_followups_discharged.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_decision_override_lint.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_decisions_format.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_degraded_oracle.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_deliverable_missing_note.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_deliverable_presence_gate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_derive_agent_policy_review_mode.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_derive_agent_policy_skill.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_derive_monitoring_discovery.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_derive_monitoring_skill_registration.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_design_for_diagnosis_rule.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_deterministic_refusal_repeat.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_diagnose_headless.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_diagnose_issue_skill.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_diagnosis.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_diagnosis_roundtrip_live.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_dispatch_skeleton.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_distilled_accept_step.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_doctor.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_done_feature_gates.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_draft_feature_answers_mode.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_drafting_answer_gate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_drafting_invoke.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_drafting_question_issue.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_drafting_questions.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_drafting_reply_shape.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_driver_edit_detection.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_driver_event_registry_covers_emitters.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_driver_integration.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_driver_lock.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_driver_module_surface.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_driver_restart_halt_surfaced.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_driver_restart_halt_wiring.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_driver_restart_hold.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_driver_staleness_gate_summary.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_driver_staleness_warning.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_dry_run_no_branch_mutation.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_duration_tracking.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_empty_files_escalation.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_ensure_feature_branch.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_ensure_feature_branch_base.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_escalation_assignee_policy.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_escalation_contract.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_escalation_crash_containment.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_escalation_dedup_search.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_escalation_emit.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_event_gate_full_envelope.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_events_redaction.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_events_stats.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_extra_gates.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_failure_artifact_model.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_failure_signature_fail_prefix.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_failure_signature_skips_log_noise.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_feature_branch_auto_sync.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_feature_branch_squash_merge.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_feature_branch_stale_base.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_feature_id_resolution.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_feature_oracle_e2e.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_feature_provider_drafting_dispatch.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_feature_review_accumulation.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_filelock_portable.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_files_changed_auto_repair.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_find_pr_no_search_index.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_fingerprint.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_fix_bug_diff_self_check.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_fix_bug_headless.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_fix_bug_reads_comments.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_fold_contract_documented.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_followups_artifact.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_force_full_close.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_frontmatter_scalar_quoting.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gate_broad_run.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gate_budget.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gate_budget_post_dispatch.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gate_commands_needs.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gate_eval.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gate_eval_calibration.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gate_eval_intermediate_wiring.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gate_eval_repo_flag.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gate_eval_terminal_wiring.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gate_report_verdict.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gh_backend.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gh_features.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_git_env_isolation.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_gitleaks_pinning.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_groom_backlog_skill.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_guard_refusal_failure_class.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_guard_refusal_failure_excerpt.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_guard_repair_e2e.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_guard_repair_prompt.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_hashed_denylist.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_hashed_denylist_ci.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_heartbeat.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_heartbeat_adapter.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_human_output_rule.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_human_work_unit.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_hyphenated_gate_name.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_init_integration.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_installed_copy_driver_e2e.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_interpreter_normalization.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_judge_close_path.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_judge_cost.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_judge_cost_fold_committed.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_judge_module.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_judge_path_registry.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_judge_terminal_flip_state.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_label_provisioning_runner_contract.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_label_registry.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_label_registry_covers_consumers.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_language_aware_narrow_selection.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lazy_baseline_e2e.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_leak_findings_redaction.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_leak_scan.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_leak_scan_content.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_learnings_curate_vendored_promote.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_learnings_distil_cli.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_learnings_query.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_learnings_staging.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_learnings_suggest_signature_filter.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_learnings_weights.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_legacy_4wu_terminal_flips.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lifecycle_integration.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lifetime_accounting.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_ac_observable.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_bare_produces_path.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_close_intermediate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_close_verdict_not_predecided.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_close_wu.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_closing.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_closing_criteria.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_closing_criteria_pristine.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_correlation_id.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_correlation_id_close_intermediate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_feature_oracle_declared.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_gate_proportionality.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_monitoring.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_oracle_env.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_plan_contract_fields.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_plan_errors.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_plan_next_draft.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_plan_relative_import.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_plan_verdict_exempt.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_planning_sections.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_produces_driver_helper.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_roadmap.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_sections.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_task_graph_yaml_selection.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_lint_verification_reference.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_live_tests_opt_in.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_load_bearing_close_lint.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_attempt_evidence.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_auto_archive.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_caveman_preamble.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_close_intermediate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_criteria_skeleton.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_criteria_survival.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_defaults_by_type.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_effort.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_failure_note_cap.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_files_changed_guard.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_gate_budget.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_gate_needs.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_model_alias.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_orchestration.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_post_pass_invariant.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_reset_preserving_events.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_smoke_runner.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_unsandboxed.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_worklist_injection.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_loop_zero_token_guard.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_make_repo_gpgsign_isolation.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_maven_failure_excerpt.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_max_attempts_configurable.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_migrate_legacy.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_miniyaml_equivalence.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_miniyaml_negative.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_monitor_cli.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_monitor_issue_lifecycle.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_monitor_runner_surfaces.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_monitoring_bootstrap_artifacts.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_monitoring_cron_dialect.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_monitoring_example.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_monitoring_fenced_blocks.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_monitoring_seed.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_narrow_fallback_warning.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_no_pytest_subprocess.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_notify.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_notify_escalation.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_notify_sla.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_operator_escalation_rule.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_oracle_set_declared.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_oracle_unrunnable_attribution.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_pick_feature_skill.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_pin_honesty_and_integrity.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_pin_marker_not_inherited.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_pin_marker_spawn_sites.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_plan_baseline.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_planned_cost_lint.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_planning_cost_floor.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_policy_proposals.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_policy_review.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_pr_checks_json_field.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_pre_existing_claims_cite_evidence.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_prep_halt_operator_surface.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_prepare_feature.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_prepare_scaffold_sync.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_prerun_capture.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_prerun_oracles.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_prerun_wiring.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_produced_document_verdict_guard.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_produces_field.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_produces_shape.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_progress_forward_note.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_progress_lines_end_to_end.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_promotion_ledger.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_provider_escalation_traces.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_provision_labels.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_queue_stalled_adapter.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_rearm_clears_stale_criteria_state.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_rearm_fold_marker.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_rearm_migration.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_red_baseline_never_reused.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_redaction_windows_home.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_reflection_required_signals.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_replan_end_to_end.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_replan_event_emission.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_replan_note_collision.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_replan_trigger.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_replan_turn_contract.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_replay_spin.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_resolve_base.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_restart_cap_counts_progress.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_result_block.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_result_block_audience.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_resume_command_build.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_retain_on_guard_refusal_docs.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_roadmap_add_skill.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_roadmap_archive_cli.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_roadmap_archive_shim.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_roadmap_archive_skill.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_roadmap_archive_skill_delegates.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_roadmap_link_gate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_roadmap_row_parser.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_ruff_verdict_lines.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_scaffold_data_in_sync.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_scaffold_doc_hygiene.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_scaffold_docs.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_scaffold_init.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_scaffold_label_provisioning.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_scaffold_manifest.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_scaffold_resources.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_scaffold_seed_sanity.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_scaffold_skew_halts.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_scaffold_upgrade.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_scaffold_wiring.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_schedule_dialect.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_seed_documents_prerun_keys.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_service_bus_dlq_adapter.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_session_env_preflight.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_shipped_templates_parse.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_skill_discovery_links.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_skills_vendored_in_sync.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_spinning_rearm_gate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_spinout_brief_end_to_end.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_spinout_brief_replan_option.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_squash_commit_hook_crash.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_stop_rationale_captured.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_stranded_halt_cause.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_surefire_run_level_signature.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_surefire_verdict_lines.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_template_closing_shapes.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_terminal_flip_ownership.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_terminal_flips.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_terminal_gate_message.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_tiered_verification_e2e.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_timeout_kill_portable.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_triage.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_triage_apply.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_triage_skill_contract.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_triage_skips_agent_escalations.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_tsc_verdict_lines.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_umbrella_version_resolution.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_unterminated_frontmatter.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_untracked_feature_folder.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_untracked_file_absorption.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_upgrade_integration.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_upgrade_merge_gate.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_validate_event.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_validate_event_driver_types.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_verdict_coupling.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_verify_empty_gate_set.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_version_consistency.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_version_skew.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_windows_gate_exec.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_worktree_restore.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/tests/test_wu_execution_metadata.py +0 -0
- {specfuse_loop-0.20.1 → specfuse_loop-0.22.0}/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.
|
|
7
|
+
version = "0.22.0"
|
|
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"
|
|
@@ -76,6 +76,7 @@ specfuse-monitor-lint = "specfuse.loop.lint_monitoring:main"
|
|
|
76
76
|
specfuse-monitor = "specfuse.monitor.cli:main"
|
|
77
77
|
specfuse-stats = "specfuse.loop.events_stats:main"
|
|
78
78
|
specfuse-agent = "specfuse.agent.run:main"
|
|
79
|
+
specfuse-backfill-severity = "specfuse.agent.severity_backfill:main"
|
|
79
80
|
|
|
80
81
|
[tool.setuptools.packages.find]
|
|
81
82
|
# Ship ONLY the specfuse namespace package. Without this scope, setuptools'
|
|
@@ -27,10 +27,24 @@ from specfuse.agent.drafting_answers import AnswerGateResult, OUTCOME_FALLBACK
|
|
|
27
27
|
from specfuse.agent.invoke import build_claude_argv
|
|
28
28
|
from specfuse.loop.loop import parse_result_block
|
|
29
29
|
|
|
30
|
-
__all__ = (
|
|
30
|
+
__all__ = (
|
|
31
|
+
"DraftingInvokeError",
|
|
32
|
+
"DEFAULT_COMMAND",
|
|
33
|
+
"build_invocation",
|
|
34
|
+
"read_result",
|
|
35
|
+
)
|
|
31
36
|
|
|
32
37
|
_DEFAULT_WORKING_DIR = "."
|
|
33
38
|
|
|
39
|
+
#: The slash command this lane dispatches. The skill ships in the
|
|
40
|
+
#: `specfuse@specfuse` plugin, where it is addressed `/specfuse:draft-feature`;
|
|
41
|
+
#: the bare `/draft-feature` resolves only in a repository carrying its own
|
|
42
|
+
#: project-level `.claude/skills/draft-feature/`. Same defect, same lane shape
|
|
43
|
+
#: as `autofix_invoke.DEFAULT_COMMAND` -- see #3342, where the bare spelling
|
|
44
|
+
#: made every dispatched item fail with `Unknown command`. A caller whose
|
|
45
|
+
#: project-level copy is the one that resolves passes `command=`.
|
|
46
|
+
DEFAULT_COMMAND = "/specfuse:draft-feature"
|
|
47
|
+
|
|
34
48
|
|
|
35
49
|
class DraftingInvokeError(Exception):
|
|
36
50
|
"""Raised when a gate result cannot be turned into a drafting session,
|
|
@@ -44,9 +58,10 @@ def build_invocation(
|
|
|
44
58
|
working_dir: str = _DEFAULT_WORKING_DIR,
|
|
45
59
|
model: str = "sonnet",
|
|
46
60
|
effort: str = "medium",
|
|
61
|
+
command: str = DEFAULT_COMMAND,
|
|
47
62
|
):
|
|
48
|
-
"""Build argv and prompt text for a headless `/draft-feature`
|
|
49
|
-
against one `draft_ready` answer gate result.
|
|
63
|
+
"""Build argv and prompt text for a headless `/specfuse:draft-feature`
|
|
64
|
+
session against one `draft_ready` answer gate result.
|
|
50
65
|
|
|
51
66
|
Returns a `(argv, prompt)` tuple; runs nothing. Raises
|
|
52
67
|
`DraftingInvokeError` if `gate_result.outcome` is `OUTCOME_FALLBACK` --
|
|
@@ -76,7 +91,7 @@ def build_invocation(
|
|
|
76
91
|
assumption_lines = "(none -- every question was answered)"
|
|
77
92
|
|
|
78
93
|
prompt = (
|
|
79
|
-
f"
|
|
94
|
+
f"{command} {feature_id}\n\n"
|
|
80
95
|
f"Working directory: {working_dir}\n\n"
|
|
81
96
|
"The interview's answer gate has already run and returned "
|
|
82
97
|
"draft_ready. Every question's effective answer -- given or "
|
|
@@ -27,7 +27,13 @@ from specfuse.agent.run import (
|
|
|
27
27
|
_default_runner,
|
|
28
28
|
)
|
|
29
29
|
from specfuse.agent.state import AgentSnapshot
|
|
30
|
-
from specfuse.loop.agent_policy import
|
|
30
|
+
from specfuse.loop.agent_policy import (
|
|
31
|
+
bug_lane_ci_wait_seconds,
|
|
32
|
+
meets_severity_floor,
|
|
33
|
+
read_severity_label,
|
|
34
|
+
resolve_min_severity,
|
|
35
|
+
resolve_severity_aliases,
|
|
36
|
+
)
|
|
31
37
|
from specfuse.loop.bug_lane import REASON_CI_PENDING
|
|
32
38
|
from specfuse.loop.bug_lane_run import (
|
|
33
39
|
OUTCOME_AUTOMERGE_OFF,
|
|
@@ -85,7 +91,10 @@ def _has_open_pr(snapshot: AgentSnapshot, issue_number: int) -> bool:
|
|
|
85
91
|
lane's "which PR fixes this issue" are the same question, and two copies
|
|
86
92
|
of the answer is how they drift.
|
|
87
93
|
"""
|
|
88
|
-
return any(
|
|
94
|
+
return any(
|
|
95
|
+
pr_closes_issue(pr.body or "", issue_number, title=pr.title or "")
|
|
96
|
+
for pr in snapshot.prs
|
|
97
|
+
)
|
|
89
98
|
|
|
90
99
|
|
|
91
100
|
def _pr_ref(pr_number: Optional[int]) -> str:
|
|
@@ -275,8 +284,46 @@ def _rationale_block(rationale: str) -> str:
|
|
|
275
284
|
|
|
276
285
|
|
|
277
286
|
def _fix_bug_stopped_payload(
|
|
278
|
-
issue_number: int, outcome: str, rationale: str = ""
|
|
287
|
+
issue_number: int, outcome: str, rationale: str = "",
|
|
288
|
+
*, outcome_named: bool = True,
|
|
279
289
|
) -> EscalationPayload:
|
|
290
|
+
"""The halt brief for a `/fix-bug` session that stopped without a PR.
|
|
291
|
+
|
|
292
|
+
`outcome_named` is whether the session actually said one of the outcome
|
|
293
|
+
words (#3343). When it did not, `classify_outcome` failed closed to
|
|
294
|
+
`could_not_proceed` and **nothing about a refusal is established** — the
|
|
295
|
+
session may never have started. Defaults True so a caller predating this
|
|
296
|
+
keeps today's text rather than silently getting the weaker claim.
|
|
297
|
+
"""
|
|
298
|
+
if outcome_named:
|
|
299
|
+
why_not_auto = (
|
|
300
|
+
"`/fix-bug`'s own refusal or precondition check stopped the run "
|
|
301
|
+
"before a PR existed; the bug lane never reached a guardrail or "
|
|
302
|
+
"merge decision on this path."
|
|
303
|
+
)
|
|
304
|
+
recommendation = (
|
|
305
|
+
"Read `/fix-bug`'s own reasoning first -- a `refused` outcome "
|
|
306
|
+
"usually means the fix is feature-scoped, which points at "
|
|
307
|
+
"promoting rather than forcing a bug-sized fix. Re-running the "
|
|
308
|
+
"lane unchanged will reach the same outcome."
|
|
309
|
+
)
|
|
310
|
+
else:
|
|
311
|
+
why_not_auto = (
|
|
312
|
+
"The session produced **no outcome marker at all**, so nothing "
|
|
313
|
+
"about this issue is established -- `classify_outcome` fails "
|
|
314
|
+
"closed to `could_not_proceed` for output naming no outcome, "
|
|
315
|
+
"which covers both a real refusal and a session that never "
|
|
316
|
+
"started. Its output above is the evidence for which happened. "
|
|
317
|
+
"Do not read this as `/fix-bug` having judged the issue."
|
|
318
|
+
)
|
|
319
|
+
recommendation = (
|
|
320
|
+
"Check the runner's own setup before touching this issue -- a "
|
|
321
|
+
"session that named no outcome usually did not run at all (a "
|
|
322
|
+
"command that does not resolve, a missing binary, an auth "
|
|
323
|
+
"failure), and that cause is identical for every issue in the "
|
|
324
|
+
"queue. Promoting this to a feature on the strength of this "
|
|
325
|
+
"escalation would be acting on a judgement nobody made."
|
|
326
|
+
)
|
|
280
327
|
return EscalationPayload(
|
|
281
328
|
target_issue=issue_number,
|
|
282
329
|
done_so_far=(
|
|
@@ -292,11 +339,7 @@ def _fix_bug_stopped_payload(
|
|
|
292
339
|
"Whether a human should fix this bug directly, promote it to a "
|
|
293
340
|
"feature, or close it."
|
|
294
341
|
),
|
|
295
|
-
why_not_auto=
|
|
296
|
-
"`/fix-bug`'s own refusal or precondition check stopped the run "
|
|
297
|
-
"before a PR existed; the bug lane never reached a guardrail or "
|
|
298
|
-
"merge decision on this path."
|
|
299
|
-
),
|
|
342
|
+
why_not_auto=why_not_auto,
|
|
300
343
|
options=[
|
|
301
344
|
("Fix it by hand", "unblocks the issue directly", "costs a human's time"),
|
|
302
345
|
(
|
|
@@ -310,12 +353,7 @@ def _fix_bug_stopped_payload(
|
|
|
310
353
|
"loses whatever the report was pointing at",
|
|
311
354
|
),
|
|
312
355
|
],
|
|
313
|
-
recommendation=
|
|
314
|
-
"Read `/fix-bug`'s own reasoning first -- a `refused` outcome "
|
|
315
|
-
"usually means the fix is feature-scoped, which points at "
|
|
316
|
-
"promoting rather than forcing a bug-sized fix. Re-running the "
|
|
317
|
-
"lane unchanged will reach the same outcome."
|
|
318
|
-
),
|
|
356
|
+
recommendation=recommendation,
|
|
319
357
|
category="blocked-wu",
|
|
320
358
|
)
|
|
321
359
|
|
|
@@ -615,15 +653,30 @@ class BugsProvider:
|
|
|
615
653
|
working_dir: str = ".",
|
|
616
654
|
policy_path: Any = None,
|
|
617
655
|
now: Optional[float] = None,
|
|
656
|
+
report: Optional[Callable[[str], None]] = None,
|
|
618
657
|
):
|
|
619
658
|
self._repo = repo
|
|
620
659
|
self._runner = runner
|
|
621
660
|
self._working_dir = working_dir
|
|
622
661
|
self._policy_path = policy_path
|
|
623
662
|
self._now = now
|
|
663
|
+
# Optional so every existing construction site keeps working; a
|
|
664
|
+
# severity skip with nowhere to report is dropped rather than raising
|
|
665
|
+
# (#3339). run() passes its own reporter.
|
|
666
|
+
self._report = report or (lambda _message: None)
|
|
624
667
|
|
|
625
668
|
def advertise(self, snapshot: AgentSnapshot) -> Sequence[ActionItem]:
|
|
626
669
|
items = []
|
|
670
|
+
# #3339: `rules.bugs.min_severity` was validated and read by nothing, so
|
|
671
|
+
# a declared floor did not stop `/fix-bug` dispatching on minor issues.
|
|
672
|
+
# Resolved once per advertise rather than per issue -- the policy does
|
|
673
|
+
# not change mid-pass, and re-reading it per issue would make an empty
|
|
674
|
+
# lane cost one file read per open issue.
|
|
675
|
+
floor = resolve_min_severity(self._policy_path)
|
|
676
|
+
# #3349: what this repo's own `severity:*` labels mean, when they are
|
|
677
|
+
# not spelled the way `SEVERITY_ORDER` spells them. Resolved beside the
|
|
678
|
+
# floor and for the same reason -- the policy does not change mid-pass.
|
|
679
|
+
aliases = resolve_severity_aliases(self._policy_path)
|
|
627
680
|
for issue in snapshot.issues:
|
|
628
681
|
if issue.triage_category != "bug":
|
|
629
682
|
continue
|
|
@@ -631,6 +684,14 @@ class BugsProvider:
|
|
|
631
684
|
continue
|
|
632
685
|
if _has_open_pr(snapshot, issue.number):
|
|
633
686
|
continue
|
|
687
|
+
severity, via = read_severity_label(issue.labels, aliases)
|
|
688
|
+
ok, why = meets_severity_floor(severity, floor, via=via)
|
|
689
|
+
if not ok:
|
|
690
|
+
# Reported, not silent: with a floor set and nothing labelled,
|
|
691
|
+
# the lane advertises nothing, and an operator needs to see why
|
|
692
|
+
# rather than conclude the lane is broken.
|
|
693
|
+
self._report(f"bug #{issue.number} skipped — {why}")
|
|
694
|
+
continue
|
|
634
695
|
items.append(
|
|
635
696
|
ActionItem(
|
|
636
697
|
item_id=f"{_ITEM_ID_PREFIX}{issue.number}",
|
|
@@ -702,7 +763,8 @@ class BugsProvider:
|
|
|
702
763
|
detail = f"{detail} — {commits} committed on `{wip_ref}`, unpushed"
|
|
703
764
|
else:
|
|
704
765
|
escalation = _fix_bug_stopped_payload(
|
|
705
|
-
issue_number, result.outcome, result.stop_rationale
|
|
766
|
+
issue_number, result.outcome, result.stop_rationale,
|
|
767
|
+
outcome_named=result.outcome_named,
|
|
706
768
|
)
|
|
707
769
|
elif result.outcome == OUTCOME_AUTOMERGE_OFF:
|
|
708
770
|
escalation = _automerge_off_payload(issue_number, result.pr_number)
|
|
@@ -38,12 +38,18 @@ from specfuse.agent.run import (
|
|
|
38
38
|
)
|
|
39
39
|
from specfuse.agent.invoke import run_claude, usage_spend
|
|
40
40
|
from specfuse.agent.state import AgentSnapshot
|
|
41
|
-
from specfuse.agent.triage_invoke import build_invocation, classify_result
|
|
41
|
+
from specfuse.agent.triage_invoke import build_invocation, classify_result, classify_severity
|
|
42
42
|
from specfuse.loop.escalation import CATEGORY_LABELS
|
|
43
|
+
from specfuse.loop.labels import read_severity_rubric
|
|
43
44
|
from specfuse.loop.triage import CATEGORIES, apply_triage, list_untriaged
|
|
44
45
|
|
|
45
46
|
_ITEM_ID_PREFIX = "triage-"
|
|
46
47
|
|
|
48
|
+
#: Sentinel distinguishing "not fetched yet this run" from "fetched, empty
|
|
49
|
+
#: rubric" -- `read_severity_rubric` legitimately returns `{}` on the
|
|
50
|
+
#: degradation path (FEAT-2026-0113/T06), so `None`/`{}` can't do double duty.
|
|
51
|
+
_RUBRIC_UNSET = object()
|
|
52
|
+
|
|
47
53
|
|
|
48
54
|
def _triage_options() -> list:
|
|
49
55
|
"""The two routes open on any triage halt: hand-triage, or leave it."""
|
|
@@ -181,9 +187,22 @@ class TriageProvider:
|
|
|
181
187
|
self._policy_path = policy_path
|
|
182
188
|
self._rows: dict = {}
|
|
183
189
|
self._auto = False
|
|
190
|
+
self._rubric: Any = _RUBRIC_UNSET
|
|
191
|
+
|
|
192
|
+
def _rubric_for_run(self) -> dict:
|
|
193
|
+
"""The repository's severity rubric, read at most once per run
|
|
194
|
+
(FEAT-2026-0113/T06 criterion 3) -- fetched lazily on the first
|
|
195
|
+
`execute()` call after an `advertise()`, so a run that classifies
|
|
196
|
+
nothing issues no `gh label list` at all."""
|
|
197
|
+
if self._rubric is _RUBRIC_UNSET:
|
|
198
|
+
self._rubric = read_severity_rubric(
|
|
199
|
+
self._working_dir, runner=self._runner, repo=self._repo
|
|
200
|
+
)
|
|
201
|
+
return self._rubric
|
|
184
202
|
|
|
185
203
|
def advertise(self, snapshot: AgentSnapshot) -> Sequence[ActionItem]:
|
|
186
204
|
self._auto = snapshot.triage_auto
|
|
205
|
+
self._rubric = _RUBRIC_UNSET
|
|
187
206
|
rows = list_untriaged(self._runner, self._repo)
|
|
188
207
|
|
|
189
208
|
self._rows = {}
|
|
@@ -249,7 +268,10 @@ class TriageProvider:
|
|
|
249
268
|
),
|
|
250
269
|
)
|
|
251
270
|
|
|
252
|
-
|
|
271
|
+
rubric = self._rubric_for_run()
|
|
272
|
+
argv, prompt = build_invocation(
|
|
273
|
+
number, title, body, self._repo, self._working_dir, rubric=rubric
|
|
274
|
+
)
|
|
253
275
|
invoked = run_claude(argv, prompt, runner=self._runner)
|
|
254
276
|
spend = usage_spend(invoked.usage)
|
|
255
277
|
classification = classify_result(invoked.text)
|
|
@@ -305,12 +327,14 @@ class TriageProvider:
|
|
|
305
327
|
),
|
|
306
328
|
)
|
|
307
329
|
|
|
330
|
+
severity = classify_severity(invoked.text, rubric)
|
|
308
331
|
decisions = [
|
|
309
332
|
{
|
|
310
333
|
"number": number,
|
|
311
334
|
"body": body,
|
|
312
335
|
"category": category,
|
|
313
336
|
"confidence": confidence,
|
|
337
|
+
"severity": severity,
|
|
314
338
|
}
|
|
315
339
|
]
|
|
316
340
|
results = apply_triage(self._runner, self._repo, decisions, auto=self._auto)
|