specfuse-loop 0.18.0__tar.gz → 0.19.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.18.0/specfuse_loop.egg-info → specfuse_loop-0.19.0}/PKG-INFO +1 -1
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/pyproject.toml +1 -1
- specfuse_loop-0.19.0/specfuse/loop/data/VERSION +1 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/docs/methodology.md +22 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/verification.yml.example +54 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/loop.py +577 -55
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0/specfuse_loop.egg-info}/PKG-INFO +1 -1
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse_loop.egg-info/SOURCES.txt +9 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_feature_oracle_e2e.py +7 -1
- specfuse_loop-0.19.0/tests/test_files_changed_auto_repair.py +172 -0
- specfuse_loop-0.19.0/tests/test_guard_repair_e2e.py +259 -0
- specfuse_loop-0.19.0/tests/test_guard_repair_prompt.py +83 -0
- specfuse_loop-0.19.0/tests/test_judge_cost_fold_committed.py +158 -0
- specfuse_loop-0.19.0/tests/test_language_aware_narrow_selection.py +138 -0
- specfuse_loop-0.19.0/tests/test_maven_failure_excerpt.py +163 -0
- specfuse_loop-0.19.0/tests/test_narrow_fallback_warning.py +109 -0
- specfuse_loop-0.19.0/tests/test_produced_document_verdict_guard.py +134 -0
- specfuse_loop-0.19.0/tests/test_retain_on_guard_refusal_docs.py +65 -0
- specfuse_loop-0.18.0/specfuse/loop/data/VERSION +0 -1
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/LICENSE +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/NOTICE +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/README.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/setup.cfg +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/__init__.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/budget.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/diagnose_invoke.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/drafting_answers.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/drafting_invoke.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/drafting_questions.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/driver_command.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/driver_invoke.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/invoke.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/monitoring_read.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/providers/__init__.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/providers/answers.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/providers/bugs.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/providers/feature.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/providers/findings_autofix.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/providers/findings_diagnose.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/providers/triage.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/queue_read.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/repo_detect.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/run.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/state.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/triage_invoke.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/agent/worktree.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/__init__.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/_filelock.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/_miniyaml.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/_wu_sections.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/adopt_feature.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/agent_policy.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/arm_eval.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/arm_sweep.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/arm_txn.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/bug_lane.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/bug_lane_run.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/bug_lane_state.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/build_provenance.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/changelog.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/closing_requirements.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/cost.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/criteria_state.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/CHANGELOG.seed.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/LEARNINGS.template.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/docs/concepts/adopting-auto-mode.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/docs/concepts/architecture-addendum-gates-and-iterative-planning.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/docs/concepts/autonomy-stop-classes.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/docs/concepts/ralph-lineage.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/docs/getting-started.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/docs/glossary.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/docs/skills.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/gitignore.snippet +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/monitoring-secrets-checklist.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/monitoring.overrides.yml.example +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/monitoring.yml.example +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/roadmap.template.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/rules/close-discipline.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/rules/correlation-ids.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/rules/design-for-diagnosis.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/rules/human-output.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/rules/never-touch.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/rules/operator-escalation.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/rules/planning-discipline.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/rules/result-contract.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/rules/security-boundaries.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/rules/verification-discipline.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/rules-local/README.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/schemas/driver-event.schema.json +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/schemas/event.schema.json +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/schemas/events/initiative_created.schema.json +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/schemas/events/spec_issue_resolved.schema.json +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/schemas/events/spec_issue_routed.schema.json +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/schemas/events/spec_validated.schema.json +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/templates/DECISIONS.template.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/templates/GATE.template.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/templates/LEARNINGS-pending.template.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/templates/PLAN.template.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/templates/WU.template.md +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/data/workflows/specfuse-monitor.yml +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/decisions_format.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/driver_edit.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/escalation.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/events_stats.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/gate_commands.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/gate_eval.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/gh_backend.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/gh_features.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/heartbeat.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/judge.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/labels.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/learnings_query.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/lint_closing.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/lint_monitoring.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/lint_plan.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/lint_roadmap.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/notify.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/notify_escalation.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/notify_sla.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/plan_baseline.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/policy_proposals.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/policy_review.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/prerun.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/prerun_capture.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/promotion.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/rearm_migration.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/replay_spin.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/roadmap_archive.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/scaffold.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/triage.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/upgrade_merge_gate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/loop/validate_event.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/__init__.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/adapters.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/artifact.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/autofix.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/autofix_invoke.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/autofix_run.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/autofix_state.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/cli.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/diagnose_cli.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/diagnosis.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/fingerprint.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/issues.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/providers/__init__.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/providers/_azure_auth.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/providers/azure_app_insights.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/providers/azure_service_bus.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/redaction.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse/monitor/schedule.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse_loop.egg-info/dependency_links.txt +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse_loop.egg-info/entry_points.txt +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse_loop.egg-info/requires.txt +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/specfuse_loop.egg-info/top_level.txt +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_abandon_feature_skill.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_abandoned_work_reported.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_abandoned_wu_strands_gate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_adopt_feature.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_budget.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_bug_selection_dedup.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_default_features_root.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_driver_command.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_driver_invoke.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_driver_restart.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_escalation_on_issue.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_escalation_run_state.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_findings_seam.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_invoke_timeout.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_invoke_usage.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_item_worktree.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_lock.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_policy_key_ownership.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_policy_queue.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_policy_schema.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_policy_triage_dial.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_provider_answers.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_provider_bugs.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_provider_feature.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_provider_findings_autofix.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_provider_findings_diagnose.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_provider_isolation.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_provider_triage.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_queue_read.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_relays_driver_output.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_repo_detect.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_run.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_run_progress.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_seam.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_agent_state.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_answer_escalation_skill.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_app_insights_adapters.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_archive_ref_reconciliation.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_arm_eval.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_arm_eval_lint_class.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_arm_eval_wiring.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_arm_gate_edits_uncommitted.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_arm_sweep.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_arm_sweep_gate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_arm_txn.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_arm_wiring.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_artifact_redaction.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_attempt_note_untracked_files.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_attempt_outcome_contract.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_attempt_outcome_emission.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_attention_nonwriting_guard.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_attention_silence_section.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_attention_skill_structure.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autoclose_deferral_visibility.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autoclose_gate_note.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autoclose_stub_states_what_passed.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autofix_invoke.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autofix_live.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autofix_predicate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autofix_run.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autofix_state.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autosync.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autosync_consent.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autosync_firstrun.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autosync_no_cwd_leak.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_autosync_plugin.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_azure_credential_resolution.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_backend.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_baseline_escalation_message.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_baseline_persistence.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_baseline_probe.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_baseline_provenance.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_baseline_tree_hash_key.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bash_routing.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bats_suites_gated.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_binary_verdict.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bookkeeping_commit_crash_run.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bookkeeping_commit_hook_crash.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bookkeeping_no_verify.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bug_lane_ci_pending.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bug_lane_guardrails.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bug_lane_label_nonfatal.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bug_lane_labels_registered.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bug_lane_policy_contract.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bug_lane_pr_number_carried.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bug_lane_preflight_and_dial.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bug_lane_run.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bug_lane_state.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bug_lane_stopped_outcome_pr_number.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_bug_lane_test_paths.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_build_provenance.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_changed_file_test_selection.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_changelog_append_only.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_changelog_collection.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_changelog_release_wiring.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_changelog_schema.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_ci_conclusion_wait.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_ci_runs_every_gate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_claude_resolution.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_close_b_pending_learnings.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_close_records_feature_oracle.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_close_wu_self_reference.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_closing_deliverable_guard.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_closing_guard_contracts.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_closing_guard_prediction.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_closing_learnings_destination.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_closing_requirements.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_coauthor_trailer_allowlist.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_console_encoding.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_convergent_iteration.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_convergent_wu_lint.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_correlation_id_override.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_correlation_id_two_surfaces.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_cost_lifetime.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_cost_tracking.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_criteria_per_gate_lint.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_criteria_state.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_criteria_worklist.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_decision_citation_lint.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_decision_followups_discharged.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_decision_override_lint.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_decisions_format.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_degraded_oracle.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_deliverable_missing_note.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_deliverable_presence_gate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_derive_agent_policy_review_mode.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_derive_agent_policy_skill.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_derive_monitoring_discovery.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_derive_monitoring_skill_registration.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_design_for_diagnosis_rule.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_deterministic_refusal_repeat.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_diagnose_headless.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_diagnose_issue_skill.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_diagnosis.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_diagnosis_roundtrip_live.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_dispatch_skeleton.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_doctor.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_done_feature_gates.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_draft_feature_answers_mode.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_drafting_answer_gate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_drafting_invoke.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_drafting_question_issue.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_drafting_questions.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_drafting_reply_shape.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_driver_edit_detection.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_driver_event_registry_covers_emitters.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_driver_integration.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_driver_lock.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_driver_module_surface.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_driver_restart_halt_surfaced.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_driver_restart_halt_wiring.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_driver_restart_hold.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_driver_staleness_gate_summary.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_driver_staleness_warning.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_dry_run_no_branch_mutation.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_duration_tracking.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_empty_files_escalation.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_ensure_feature_branch.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_ensure_feature_branch_base.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_escalation_assignee_policy.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_escalation_contract.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_escalation_crash_containment.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_escalation_dedup_search.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_escalation_emit.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_event_gate_full_envelope.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_events_redaction.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_events_stats.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_extra_gates.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_failure_artifact_model.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_failure_signature_fail_prefix.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_failure_signature_skips_log_noise.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_feature_branch_auto_sync.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_feature_branch_squash_merge.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_feature_branch_stale_base.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_feature_id_resolution.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_feature_provider_drafting_dispatch.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_feature_review_accumulation.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_filelock_portable.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_find_pr_no_search_index.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_fingerprint.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_fix_bug_diff_self_check.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_fix_bug_headless.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_fix_bug_reads_comments.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_fold_contract_documented.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_followups_artifact.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_force_full_close.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_frontmatter_scalar_quoting.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gate_broad_run.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gate_budget.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gate_budget_post_dispatch.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gate_commands_needs.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gate_eval.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gate_eval_calibration.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gate_eval_intermediate_wiring.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gate_eval_repo_flag.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gate_eval_terminal_wiring.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gate_report_verdict.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gh_backend.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gh_features.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_git_env_isolation.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_gitleaks_pinning.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_groom_backlog_skill.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_guard_refusal_failure_class.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_guard_refusal_failure_excerpt.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_hashed_denylist.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_hashed_denylist_ci.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_heartbeat.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_heartbeat_adapter.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_human_output_rule.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_human_work_unit.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_hyphenated_gate_name.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_init_integration.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_installed_copy_driver_e2e.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_interpreter_normalization.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_judge_close_path.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_judge_cost.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_judge_module.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_judge_path_registry.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_label_provisioning_runner_contract.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_label_registry.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_label_registry_covers_consumers.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lazy_baseline_e2e.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_leak_findings_redaction.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_leak_scan.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_leak_scan_content.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_learnings_curate_vendored_promote.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_learnings_query.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_learnings_staging.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_learnings_suggest_signature_filter.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_legacy_4wu_terminal_flips.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lifecycle_integration.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lifetime_accounting.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_ac_observable.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_bare_produces_path.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_boundary_consistency.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_boundary_extraction.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_close_intermediate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_close_verdict_not_predecided.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_close_wu.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_closing.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_closing_criteria.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_closing_criteria_pristine.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_correlation_id.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_correlation_id_close_intermediate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_feature_oracle_declared.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_gate_proportionality.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_monitoring.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_oracle_env.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_plan_contract_fields.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_plan_errors.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_plan_next_draft.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_plan_relative_import.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_plan_verdict_exempt.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_planning_sections.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_produces_driver_helper.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_produces_satisfiability.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_roadmap.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_sections.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_task_graph_yaml_selection.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_lint_verification_reference.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_live_tests_opt_in.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_load_bearing_close_lint.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_attempt_evidence.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_auto_archive.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_caveman_preamble.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_close_intermediate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_criteria_skeleton.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_criteria_survival.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_defaults_by_type.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_effort.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_failure_note_cap.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_files_changed_guard.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_gate_budget.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_gate_needs.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_model_alias.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_orchestration.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_post_pass_invariant.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_reset_preserving_events.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_smoke_runner.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_unsandboxed.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_worklist_injection.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_loop_zero_token_guard.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_make_repo_gpgsign_isolation.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_max_attempts_configurable.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_migrate_legacy.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_miniyaml_equivalence.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_miniyaml_negative.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_monitor_cli.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_monitor_issue_lifecycle.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_monitor_runner_surfaces.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_monitoring_bootstrap_artifacts.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_monitoring_cron_dialect.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_monitoring_example.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_monitoring_fenced_blocks.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_monitoring_seed.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_no_pytest_subprocess.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_notify.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_notify_escalation.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_notify_sla.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_operator_escalation_rule.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_oracle_set_declared.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_oracle_unrunnable_attribution.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_pick_feature_skill.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_pin_honesty_and_integrity.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_pin_marker_not_inherited.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_pin_marker_spawn_sites.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_plan_baseline.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_planned_cost_lint.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_planning_cost_floor.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_policy_proposals.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_policy_review.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_pr_checks_json_field.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_pre_existing_claims_cite_evidence.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_prep_halt_operator_surface.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_prepare_feature.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_prepare_scaffold_sync.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_prerun_capture.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_prerun_oracles.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_prerun_wiring.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_produces_bracket_literal.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_produces_bracket_wildcard.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_produces_field.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_produces_in_diff.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_produces_justification.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_produces_recursive_glob.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_produces_semantics_unified.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_produces_shape.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_promotion_ledger.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_provider_escalation_traces.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_provision_labels.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_queue_stalled_adapter.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_rearm_clears_stale_criteria_state.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_rearm_fold_marker.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_rearm_migration.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_red_baseline_never_reused.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_redaction_windows_home.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_replay_spin.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_resolve_base.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_restart_cap_counts_progress.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_result_block.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_result_block_audience.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_resume_command_build.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_roadmap_add_skill.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_roadmap_archive_cli.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_roadmap_archive_shim.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_roadmap_archive_skill.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_roadmap_archive_skill_delegates.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_roadmap_link_gate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_roadmap_row_parser.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_ruff_verdict_lines.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_scaffold_data_in_sync.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_scaffold_doc_hygiene.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_scaffold_docs.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_scaffold_init.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_scaffold_label_provisioning.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_scaffold_manifest.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_scaffold_resources.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_scaffold_seed_sanity.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_scaffold_skew_halts.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_scaffold_upgrade.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_scaffold_wiring.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_schedule_dialect.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_seed_documents_prerun_keys.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_service_bus_dlq_adapter.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_session_env_preflight.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_shipped_templates_parse.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_skill_discovery_links.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_skills_vendored_in_sync.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_spinning_rearm_gate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_squash_commit_hook_crash.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_stop_rationale_captured.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_surefire_run_level_signature.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_surefire_verdict_lines.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_template_closing_shapes.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_terminal_flip_ownership.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_terminal_flips.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_terminal_gate_message.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_tiered_verification_e2e.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_timeout_kill_portable.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_triage.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_triage_apply.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_triage_skill_contract.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_triage_skips_agent_escalations.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_tsc_verdict_lines.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_umbrella_version_resolution.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_unterminated_frontmatter.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_untracked_feature_folder.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_untracked_file_absorption.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_upgrade_integration.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_upgrade_merge_gate.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_validate_event.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_validate_event_driver_types.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_verdict_coupling.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_verify_empty_gate_set.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_version_consistency.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_version_skew.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_windows_gate_exec.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_worktree_restore.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.0}/tests/test_wu_execution_metadata.py +0 -0
- {specfuse_loop-0.18.0 → specfuse_loop-0.19.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.19.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"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
0.19.0
|
|
@@ -407,6 +407,28 @@ consumer that queries only those concludes the record is empty when it is not.
|
|
|
407
407
|
A cross-repo audit reported three separate "missing diagnostic" findings that
|
|
408
408
|
were all query errors against this contract, none of which existed (#270).
|
|
409
409
|
|
|
410
|
+
**Retain-and-repair (FEAT-2026-0103).** `files_changed_mismatch`,
|
|
411
|
+
`produces_not_in_diff`, `deliverable_missing`, and `no_deliverable_files` —
|
|
412
|
+
the guard-refusal outcomes — record `tree_retained: true` in `extras` by
|
|
413
|
+
default: the driver uncommits the squash but leaves the working tree exactly
|
|
414
|
+
as the refused attempt left it, so the next attempt repairs in place instead
|
|
415
|
+
of re-authoring from scratch. Controlled by `defaults.retain_on_guard_refusal`
|
|
416
|
+
in `verification.yml` (default `true`; set `false` to restore the pre-0.18
|
|
417
|
+
discard-and-restart behaviour) — see `specfuse/loop/data/verification.yml.example`
|
|
418
|
+
for the four covered outcomes and the exact default. A `passed` outcome may
|
|
419
|
+
separately carry `auto_repaired_files_changed` in `extras`: the list of
|
|
420
|
+
declared-but-unchanged `files_changed` paths the driver dropped on the
|
|
421
|
+
WU's behalf rather than failing the attempt over.
|
|
422
|
+
|
|
423
|
+
Retention interacts with spinning detection, not around it:
|
|
424
|
+
`detect_deterministic_refusal_repeat` (#1415) escalates a WU to
|
|
425
|
+
`blocked_human` when two consecutive attempts emit an identical refusal
|
|
426
|
+
summary over an identical touched-paths set. A retained tree that the repair
|
|
427
|
+
attempt leaves untouched reproduces exactly that signature on its next
|
|
428
|
+
refusal, so a session that ignores the retained-tree brief still escalates
|
|
429
|
+
after two refusals rather than grinding to the attempt ceiling — retention
|
|
430
|
+
does not weaken the spinning guard, it feeds it a cleaner signal.
|
|
431
|
+
|
|
410
432
|
Consumers that read `attempt_outcome` events (the auto-close
|
|
411
433
|
predicate, `/gate-status`, the spinning-detector hook, close-ceremony
|
|
412
434
|
cost analysis) treat the `outcome` and `failure_class` values as an
|
|
@@ -68,6 +68,60 @@
|
|
|
68
68
|
# `narrow_command` — see `tests` below — to run a cheaper command per attempt
|
|
69
69
|
# while `command` still runs whole in the broad run; that is orthogonal to
|
|
70
70
|
# `tier` and most gates need only one or the other, not both.
|
|
71
|
+
#
|
|
72
|
+
# PER-GATE `narrow_selection` (optional, FEAT-2026-0110). Controls how a
|
|
73
|
+
# dispatched unit's own `produces:` entries are turned into the
|
|
74
|
+
# `{selected_test_modules}` a `narrow_command` substitutes — for repos whose
|
|
75
|
+
# tests are not Python modules under `tests/`. Four keys, each independently
|
|
76
|
+
# defaulted (an absent `narrow_selection` block, or an absent key within one
|
|
77
|
+
# that IS declared, resolves to the value shown):
|
|
78
|
+
# test_roots: ["tests/"] # produces: entries under one of these roots
|
|
79
|
+
# # are what gets selected; entries elsewhere are
|
|
80
|
+
# # ignored by this gate's narrow tier.
|
|
81
|
+
# format: python_module # how a selected path is turned into an item:
|
|
82
|
+
# # python_module — dotted module name
|
|
83
|
+
# # (src/foo/bar.py -> src.foo.bar)
|
|
84
|
+
# # class_name — bare file stem
|
|
85
|
+
# # (FooTest.java -> FooTest)
|
|
86
|
+
# # path — the path itself, unchanged
|
|
87
|
+
# # An unrecognized format is a CONFIGURATION
|
|
88
|
+
# # ERROR, never a silent fallback.
|
|
89
|
+
# item_template: "{module}" # each rendered item is substituted into this
|
|
90
|
+
# # template before joining; default is verbatim.
|
|
91
|
+
# separator: " " # how rendered items are joined before
|
|
92
|
+
# # replacing {selected_test_modules}.
|
|
93
|
+
# An empty selection (no produces: entry under any test_root) falls back to
|
|
94
|
+
# the gate's full `command` — fail safe, never open.
|
|
95
|
+
#
|
|
96
|
+
# Example for a Maven repo (#3281), where tests are JUnit classes under
|
|
97
|
+
# src/test/java rather than tests/, selected by class name, space-separated
|
|
98
|
+
# for `-Dtest=`:
|
|
99
|
+
# - name: tests
|
|
100
|
+
# command: "mvn -q test"
|
|
101
|
+
# narrow_command: "mvn -q test -Dtest={selected_test_modules}"
|
|
102
|
+
# narrow_selection:
|
|
103
|
+
# test_roots: ["src/test/java/"]
|
|
104
|
+
# format: class_name
|
|
105
|
+
# separator: ","
|
|
106
|
+
|
|
107
|
+
# TOP-LEVEL `defaults:` block (optional). Project-wide fallbacks a work unit's
|
|
108
|
+
# own frontmatter can override.
|
|
109
|
+
# max_attempts: 3 # attempt ceiling when a WU declares none of
|
|
110
|
+
# # its own; the constant MAX_ATTEMPTS is the
|
|
111
|
+
# # fallback when this key is also absent.
|
|
112
|
+
# retain_on_guard_refusal: true # whether a bookkeeping-guard refusal keeps
|
|
113
|
+
# # the working tree instead of uncommitting it
|
|
114
|
+
# # back to a blank slate. Covers four outcomes:
|
|
115
|
+
# # `deliverable_missing`, `no_deliverable_files`,
|
|
116
|
+
# # `produces_not_in_diff`, `files_changed_mismatch`
|
|
117
|
+
# # (FEAT-2026-0103). Defaults to true: the next
|
|
118
|
+
# # attempt repairs the retained tree in place
|
|
119
|
+
# # instead of re-authoring from scratch. Set to
|
|
120
|
+
# # false to restore the pre-0.18 discard behaviour.
|
|
121
|
+
# defaults:
|
|
122
|
+
# max_attempts: 3
|
|
123
|
+
# retain_on_guard_refusal: true
|
|
124
|
+
|
|
71
125
|
code:
|
|
72
126
|
- name: tests
|
|
73
127
|
# Run the suite UNDER `coverage run` so the `coverage` gate below can reuse
|