specfuse-loop 0.26.0__tar.gz → 0.26.1__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.26.0/specfuse_loop.egg-info → specfuse_loop-0.26.1}/PKG-INFO +1 -1
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/pyproject.toml +1 -1
- specfuse_loop-0.26.1/specfuse/loop/data/VERSION +1 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/loop.py +68 -1
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1/specfuse_loop.egg-info}/PKG-INFO +1 -1
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse_loop.egg-info/SOURCES.txt +2 -0
- specfuse_loop-0.26.1/tests/test_result_block_near_miss.py +54 -0
- specfuse_loop-0.26.1/tests/test_result_block_scalar.py +72 -0
- specfuse_loop-0.26.0/specfuse/loop/data/VERSION +0 -1
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/LICENSE +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/NOTICE +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/README.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/setup.cfg +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/__init__.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/budget.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/diagnose_invoke.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/drafting_answers.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/drafting_invoke.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/drafting_questions.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/driver_command.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/driver_invoke.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/invoke.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/monitoring_read.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/__init__.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/answers.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/bugs.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/feature.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/findings_autofix.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/findings_diagnose.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/triage.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/queue_read.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/repo_detect.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/run.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/severity_backfill.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/state.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/triage_invoke.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/worktree.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/__init__.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/_filelock.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/_miniyaml.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/_wu_sections.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/adopt_feature.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/agent_policy.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/arm_eval.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/arm_sweep.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/arm_txn.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/bug_lane.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/bug_lane_run.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/bug_lane_state.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/build_provenance.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/caller_check.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/changelog.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/closing_requirements.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/cost.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/criteria_state.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/CHANGELOG.seed.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/LEARNINGS.template.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/concepts/adopting-auto-mode.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/concepts/architecture-addendum-gates-and-iterative-planning.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/concepts/autonomy-stop-classes.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/concepts/ralph-lineage.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/getting-started.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/glossary.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/methodology.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/skills.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/gitignore.snippet +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/monitoring-secrets-checklist.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/monitoring.overrides.yml.example +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/monitoring.yml.example +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/roadmap.template.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/close-discipline.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/correlation-ids.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/design-for-diagnosis.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/human-output.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/never-touch.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/operator-escalation.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/planning-discipline.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/result-contract.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/security-boundaries.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/verification-discipline.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules-local/README.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/driver-event.schema.json +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/event.schema.json +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/events/initiative_created.schema.json +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/events/spec_issue_resolved.schema.json +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/events/spec_issue_routed.schema.json +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/events/spec_validated.schema.json +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/templates/DECISIONS.template.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/templates/GATE.template.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/templates/LEARNINGS-pending.template.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/templates/PLAN.template.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/templates/WU.template.md +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/verification.yml.example +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/workflows/specfuse-monitor.yml +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/decisions_format.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/driver_edit.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/escalation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/events_stats.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/gate_commands.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/gate_eval.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/gh_backend.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/gh_features.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/heartbeat.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/judge.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/labels.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/learnings_distil.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/learnings_query.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/lint_closing.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/lint_monitoring.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/lint_plan.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/lint_roadmap.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/notify.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/notify_escalation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/notify_sla.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/plan_baseline.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/policy_proposals.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/policy_review.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/prerun.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/prerun_capture.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/promotion.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/rearm_migration.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/red_on_base.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/replay_spin.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/roadmap_archive.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/scaffold.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/triage.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/upgrade_merge_gate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/validate_event.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/__init__.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/adapters.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/artifact.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/autofix.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/autofix_invoke.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/autofix_run.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/autofix_state.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/cli.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/diagnose_cli.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/diagnosis.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/fingerprint.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/issues.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/providers/__init__.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/providers/_azure_auth.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/providers/azure_app_insights.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/providers/azure_service_bus.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/redaction.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/schedule.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse_loop.egg-info/dependency_links.txt +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse_loop.egg-info/entry_points.txt +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse_loop.egg-info/requires.txt +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse_loop.egg-info/top_level.txt +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_abandon_feature_skill.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_abandoned_work_reported.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_abandoned_wu_strands_gate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_adopt_feature.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_budget.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_bug_selection_dedup.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_default_features_root.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_driver_command.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_driver_invoke.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_driver_restart.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_escalation_on_issue.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_escalation_run_state.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_findings_seam.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_invoke_timeout.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_invoke_usage.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_item_worktree.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_lock.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_policy_key_ownership.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_policy_queue.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_policy_schema.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_policy_triage_dial.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_answers.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_bugs.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_feature.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_findings_autofix.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_findings_diagnose.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_isolation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_triage.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_queue_read.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_relays_driver_output.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_repo_detect.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_run.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_run_progress.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_seam.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_snapshot_refresh.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_state.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_answer_escalation_skill.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_app_insights_adapters.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_archive_ref_reconciliation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_eval.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_eval_lint_class.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_eval_wiring.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_gate_edits_uncommitted.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_sweep.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_sweep_gate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_txn.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_wiring.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_artifact_redaction.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attempt_note_untracked_files.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attempt_outcome_contract.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attempt_outcome_emission.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attention_nonwriting_guard.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attention_silence_section.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attention_skill_structure.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attribution_halt_claims.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autoclose_deferral_visibility.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autoclose_gate_note.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autoclose_stub_states_what_passed.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autofix_invoke.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autofix_live.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autofix_predicate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autofix_run.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autofix_state.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autosync.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autosync_consent.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autosync_firstrun.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autosync_no_cwd_leak.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autosync_plugin.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_azure_credential_resolution.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_backend.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_baseline_escalation_message.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_baseline_persistence.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_baseline_probe.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_baseline_provenance.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_baseline_tree_hash_key.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bash_routing.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bats_suites_gated.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_binary_verdict.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_binding_block_advisory.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_binding_block_allocation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_binding_block_budget.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_blind_run_is_not_drained.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bookkeeping_commit_crash_run.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bookkeeping_commit_hook_crash.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bookkeeping_no_verify.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_brief_covers_every_unit_escalation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_ci_pending.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_guardrails.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_label_nonfatal.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_labels_registered.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_min_severity.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_policy_contract.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_pr_number_carried.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_preflight_and_dial.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_run.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_state.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_stopped_outcome_pr_number.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_test_paths.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_build_provenance.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_caller_check_ratchet.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_carried_green_invalidated_by_diff.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_carry_accounting_close_and_judge.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_changed_file_test_selection.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_changelog_append_only.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_changelog_collection.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_changelog_release_wiring.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_changelog_schema.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_ci_conclusion_wait.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_ci_runs_every_gate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_claude_resolution.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_close_b_pending_learnings.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_close_records_feature_oracle.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_close_wu_self_reference.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_closing_deliverable_guard.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_closing_guard_contracts.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_closing_guard_prediction.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_closing_learnings_destination.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_closing_requirements.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_closing_sessions_on_sonnet.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_coauthor_trailer_allowlist.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_conditional_reflection.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_console_encoding.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_convergent_iteration.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_convergent_wu_lint.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_correlation_id_override.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_correlation_id_two_surfaces.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_cost_lifetime.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_cost_tracking.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_criteria_per_gate_lint.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_criteria_state.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_criteria_worklist.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_decision_citation_lint.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_decision_followups_discharged.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_decision_override_lint.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_decisions_format.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_default_severity_aliases.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_degraded_oracle.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_deliverable_missing_note.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_deliverable_presence_gate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_derive_agent_policy_review_mode.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_derive_agent_policy_skill.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_derive_monitoring_discovery.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_derive_monitoring_skill_registration.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_design_for_diagnosis_rule.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_deterministic_refusal_repeat.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_diagnose_headless.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_diagnose_issue_skill.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_diagnosis.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_diagnosis_roundtrip_live.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_dispatch_model_from_fix_scope.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_dispatch_preamble_rules_pointer.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_dispatch_skeleton.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_dispatch_skills_index.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_distilled_accept_step.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_doctor.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_doctor_command_preflight.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_done_feature_gates.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_draft_feature_answers_mode.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_drafting_answer_gate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_drafting_invoke.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_drafting_question_issue.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_drafting_questions.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_drafting_reply_shape.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_edit_detection.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_event_registry_covers_emitters.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_integration.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_lock.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_module_surface.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_restart_halt_surfaced.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_restart_halt_wiring.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_restart_hold.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_staleness_gate_summary.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_staleness_warning.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_dry_run_no_branch_mutation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_duration_tracking.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_empty_files_escalation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_ensure_feature_branch.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_ensure_feature_branch_base.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_escalation_assignee_policy.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_escalation_contract.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_escalation_crash_containment.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_escalation_dedup_search.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_escalation_emit.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_event_gate_full_envelope.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_events_redaction.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_events_stats.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_extra_gates.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_failure_artifact_model.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_failure_signature_fail_prefix.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_failure_signature_names_the_test.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_failure_signature_skips_log_noise.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_branch_auto_sync.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_branch_squash_merge.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_branch_stale_base.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_id_resolution.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_oracle_e2e.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_provider_drafting_dispatch.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_review_accumulation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_filelock_portable.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_files_changed_auto_repair.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_find_pr_no_search_index.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fingerprint.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fix_bug_diff_self_check.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fix_bug_headless.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fix_bug_reads_comments.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fix_unit_insertion_bookkeeping.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fix_unit_insertion_e2e.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fix_unit_insertion_refused.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fold_contract_documented.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_followups_artifact.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_force_full_close.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_frontmatter_scalar_quoting.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_broad_run.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_budget.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_budget_post_dispatch.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_commands_needs.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_eval.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_eval_calibration.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_eval_intermediate_wiring.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_eval_repo_flag.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_eval_terminal_wiring.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_report_verdict.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gh_backend.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gh_features.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_git_env_isolation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gitleaks_pinning.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_groom_backlog_skill.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_guard_refusal_failure_class.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_guard_refusal_failure_excerpt.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_guard_repair_e2e.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_guard_repair_prompt.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_hashed_denylist.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_hashed_denylist_ci.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_heartbeat.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_heartbeat_adapter.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_human_output_rule.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_human_work_unit.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_hygiene_boundary_guidance.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_hyphenated_gate_name.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_ignored_cleanup_before_probe.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_init_integration.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_installed_copy_driver_e2e.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_interpreter_normalization.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_close_path.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_cost.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_cost_fold_committed.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_module.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_path_registry.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_sees_dropped_produces.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_terminal_flip_state.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judged_event_points_at_findings.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_label_description_length.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_label_provisioning_runner_contract.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_label_registry.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_label_registry_covers_consumers.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_language_aware_narrow_selection.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lazy_baseline_e2e.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_leak_findings_redaction.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_leak_scan.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_leak_scan_content.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_learnings_curate_vendored_promote.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_learnings_distil_cli.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_learnings_query.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_learnings_staging.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_learnings_suggest_signature_filter.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_learnings_weights.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_legacy_4wu_terminal_flips.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lifecycle_integration.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lifetime_accounting.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_ac_observable.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_bare_produces_path.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_boundary_consistency.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_boundary_extraction.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_close_intermediate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_close_verdict_not_predecided.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_close_wu.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_closing.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_closing_criteria.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_closing_criteria_pristine.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_correlation_id.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_correlation_id_close_intermediate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_covers_load_wu_invariants.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_feature_oracle_declared.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_gate_proportionality.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_monitoring.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_oracle_env.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_plan_contract_fields.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_plan_errors.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_plan_next_draft.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_plan_relative_import.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_plan_verdict_exempt.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_planning_sections.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_produces_driver_helper.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_produces_satisfiability.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_roadmap.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_sections.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_task_graph_yaml_selection.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_verification_reference.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_live_tests_opt_in.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_load_bearing_close_lint.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_attempt_evidence.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_auto_archive.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_caveman_preamble.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_close_intermediate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_criteria_skeleton.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_criteria_survival.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_defaults_by_type.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_effort.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_failure_note_cap.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_files_changed_guard.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_gate_budget.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_gate_needs.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_model_alias.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_orchestration.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_post_pass_invariant.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_reset_preserving_events.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_smoke_runner.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_unsandboxed.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_worklist_injection.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_zero_token_guard.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_make_repo_gpgsign_isolation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_marker_dual_shape.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_maven_failure_excerpt.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_max_attempts_configurable.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_max_open_prs.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_migrate_legacy.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_miniyaml_equivalence.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_miniyaml_negative.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitor_cli.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitor_issue_lifecycle.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitor_runner_surfaces.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitoring_bootstrap_artifacts.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitoring_cron_dialect.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitoring_example.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitoring_fenced_blocks.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitoring_seed.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_narrow_fallback_warning.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_needs_decision_outcome.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_no_pytest_subprocess.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_notify.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_notify_escalation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_notify_sla.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_operator_escalation_rule.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_oracle_set_declared.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_oracle_unrunnable_attribution.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_per_run_item_cap_disclosure.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pick_feature_skill.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pin_honesty_and_integrity.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pin_marker_not_inherited.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pin_marker_spawn_sites.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_plan_baseline.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_planned_cost_lint.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_planning_cost_floor.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_plugin_prose_cross_refs.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_plugin_qualified_dispatch.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_policy_budgets_applied.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_policy_proposals.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_policy_review.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pr_checks_json_field.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pr_reference_in_title.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pre_existing_claims_cite_evidence.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_prep_halt_operator_surface.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_prepare_feature.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_prepare_scaffold_sync.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_prerun_capture.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_prerun_oracles.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_prerun_wiring.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produced_document_verdict_guard.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_amendment_e2e.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_bracket_literal.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_bracket_wildcard.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_field.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_in_diff.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_justification.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_recursive_glob.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_repair_note.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_semantics_unified.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_shape.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_progress_forward_note.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_progress_lines_end_to_end.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_promotion_ledger.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_provider_escalation_traces.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_provision_labels.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_queue_stalled_adapter.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_rearm_clears_stale_criteria_state.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_rearm_fold_marker.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_rearm_migration.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_reclose_carries_narrow_greens_e2e.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_red_baseline_never_reused.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_red_on_base_guardrail.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_red_on_base_probe.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_redaction_windows_home.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_reflection_required_signals.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replan_end_to_end.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replan_event_emission.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replan_note_collision.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replan_trigger.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replan_turn_contract.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replay_spin.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replay_spin_failing_sets.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_required_checks.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_resolve_base.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_restart_cap_counts_progress.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_result_block.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_result_block_audience.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_resume_command_build.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_retain_on_guard_refusal_docs.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_add_skill.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_archive_cli.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_archive_shim.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_archive_skill.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_archive_skill_delegates.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_link_gate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_row_parser.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_ruff_verdict_lines.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_rule_import_convergence.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_run_level_failure_breaker.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_data_in_sync.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_doc_hygiene.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_docs.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_init.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_label_provisioning.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_manifest.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_resources.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_seed_sanity.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_skew_halts.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_upgrade.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_wiring.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_schedule_dialect.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_seed_documents_prerun_keys.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_service_bus_dlq_adapter.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_session_env_preflight.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_aliases.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_backfill_apply.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_backfill_end_to_end.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_backfill_limit.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_backfill_marker.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_backfill_run.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_label_projection.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_reconciliation.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_rubric.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_shipped_templates_parse.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_skill_discovery_links.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_skills_vendored_in_sync.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_spec_work_unit_rules.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_spinning_rearm_gate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_spinning_repeat_same_failing_set.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_spinout_brief_end_to_end.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_spinout_brief_replan_option.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_squash_commit_hook_crash.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_stop_rationale_captured.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_stranded_halt_cause.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_surefire_run_level_signature.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_surefire_verdict_lines.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_template_closing_shapes.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_terminal_flip_ownership.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_terminal_flips.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_terminal_gate_message.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_tiered_verification_e2e.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_timeout_kill_portable.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_apply.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_projects_severity_label.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_severity_classify.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_severity_end_to_end.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_severity_write.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_skill_contract.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_skips_agent_escalations.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_tsc_verdict_lines.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_umbrella_version_resolution.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_unterminated_frontmatter.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_untracked_feature_folder.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_untracked_file_absorption.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_upgrade_integration.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_upgrade_merge_gate.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_validate_event.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_validate_event_driver_types.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_verdict_coupling.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_verify_empty_gate_set.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_version_consistency.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_version_skew.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_windows_gate_exec.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_worktree_restore.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_wu_execution_metadata.py +0 -0
- {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/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.26.
|
|
7
|
+
version = "0.26.1"
|
|
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.26.1
|
|
@@ -127,7 +127,7 @@ SPECFUSE_DIR = Path(".specfuse")
|
|
|
127
127
|
REPO_ROOT = SPECFUSE_DIR.parent
|
|
128
128
|
FEATURES_DIR = SPECFUSE_DIR / "features"
|
|
129
129
|
VERIFICATION_PATH = SPECFUSE_DIR / "verification.yml"
|
|
130
|
-
DRIVER_VERSION = "0.26.
|
|
130
|
+
DRIVER_VERSION = "0.26.1"
|
|
131
131
|
# Oldest scaffold layout this driver can drive. init.sh stamps the scaffold's own
|
|
132
132
|
# version into `.specfuse/VERSION`; check_scaffold_version() fails loud at startup if
|
|
133
133
|
# the consumer's scaffold is older than this, pointing at `specfuse upgrade`. Bump
|
|
@@ -6008,6 +6008,11 @@ def is_zero_token_attempt(usage: dict | None) -> bool:
|
|
|
6008
6008
|
|
|
6009
6009
|
|
|
6010
6010
|
RESULT_BLOCK_RE = re.compile(r"```result\s*\n(.*?)\n```", re.DOTALL)
|
|
6011
|
+
# #3442: a near-miss the contract does not name but agents do emit — any fence
|
|
6012
|
+
# whose first line is `RESULT` (FEAT-2026-0116/T01). Consulted only when no
|
|
6013
|
+
# proper ```result block exists, so a quoted example never overrides one.
|
|
6014
|
+
NEAR_MISS_RESULT_BLOCK_RE = re.compile(
|
|
6015
|
+
r"```[^\n`]*\n[ \t]*RESULT:?[ \t]*\n(.*?)\n```", re.DOTALL | re.IGNORECASE)
|
|
6011
6016
|
|
|
6012
6017
|
|
|
6013
6018
|
def parse_result_block(stdout: str) -> dict | None:
|
|
@@ -6023,11 +6028,21 @@ def parse_result_block(stdout: str) -> dict | None:
|
|
|
6023
6028
|
if not stdout:
|
|
6024
6029
|
return None
|
|
6025
6030
|
matches = list(RESULT_BLOCK_RE.finditer(stdout))
|
|
6031
|
+
if not matches:
|
|
6032
|
+
matches = list(NEAR_MISS_RESULT_BLOCK_RE.finditer(stdout))
|
|
6026
6033
|
if not matches:
|
|
6027
6034
|
return None
|
|
6028
6035
|
body = matches[-1].group(1) # LAST result block — agents may discuss before it
|
|
6029
6036
|
try:
|
|
6030
6037
|
parsed = _miniyaml.parse(body)
|
|
6038
|
+
except _miniyaml.MiniYAMLError:
|
|
6039
|
+
# #3436: the commonest "malformed" RESULT is a well-formed one using a
|
|
6040
|
+
# YAML block scalar (`blocked_reason: |`), which the strict subset
|
|
6041
|
+
# rejects on purpose for config. Retry with a RESULT-only lenient read
|
|
6042
|
+
# before degrading, so an honest multi-line block is not mistaken for
|
|
6043
|
+
# a silent `complete`. Only the parser's own documented-subset error
|
|
6044
|
+
# takes this path; any other exception still degrades to None below.
|
|
6045
|
+
return _lenient_result_parse(body)
|
|
6031
6046
|
except Exception: # noqa: BLE001 - intentional: see comment below
|
|
6032
6047
|
# Broad catch is deliberate AND scoped to this site only. The agent's
|
|
6033
6048
|
# stdout is the least-trusted input in the system (free-form LLM text
|
|
@@ -6046,6 +6061,55 @@ def parse_result_block(stdout: str) -> dict | None:
|
|
|
6046
6061
|
return parsed if isinstance(parsed, dict) else None
|
|
6047
6062
|
|
|
6048
6063
|
|
|
6064
|
+
_LENIENT_KEY_RE = re.compile(r"^([A-Za-z_][A-Za-z0-9_]*):(?:\s+(.*))?$")
|
|
6065
|
+
|
|
6066
|
+
|
|
6067
|
+
def _lenient_result_parse(body: str) -> dict | None:
|
|
6068
|
+
"""Best-effort read of a RESULT block the strict mini-YAML parser refused (#3436).
|
|
6069
|
+
|
|
6070
|
+
Understands only what agents actually emit at the top level: `key: value`
|
|
6071
|
+
scalars (quotes stripped), `key: |` / `key: >` block scalars (literal keeps
|
|
6072
|
+
line breaks, folded joins with spaces), and `key:` followed by indented
|
|
6073
|
+
`- item` scalar lines. Anything nested deeper is skipped rather than
|
|
6074
|
+
guessed. Returns None unless a `status` field was read, so a block that is
|
|
6075
|
+
genuinely unreadable still degrades to verify() as before. Used only for
|
|
6076
|
+
agent stdout, never for operator-authored config.
|
|
6077
|
+
"""
|
|
6078
|
+
lines = body.splitlines()
|
|
6079
|
+
out: dict = {}
|
|
6080
|
+
i = 0
|
|
6081
|
+
while i < len(lines):
|
|
6082
|
+
m = _LENIENT_KEY_RE.match(lines[i])
|
|
6083
|
+
if not m:
|
|
6084
|
+
i += 1
|
|
6085
|
+
continue
|
|
6086
|
+
key, rhs = m.group(1), (m.group(2) or "").strip()
|
|
6087
|
+
i += 1
|
|
6088
|
+
child: list[str] = []
|
|
6089
|
+
while i < len(lines) and (not lines[i].strip() or lines[i][:1] in (" ", "\t")):
|
|
6090
|
+
child.append(lines[i])
|
|
6091
|
+
i += 1
|
|
6092
|
+
while child and not child[-1].strip():
|
|
6093
|
+
child.pop()
|
|
6094
|
+
if rhs[:1] in ("|", ">"):
|
|
6095
|
+
indents = [len(c) - len(c.lstrip()) for c in child if c.strip()]
|
|
6096
|
+
cut = min(indents) if indents else 0
|
|
6097
|
+
text = [c[cut:] if c.strip() else "" for c in child]
|
|
6098
|
+
out[key] = ("\n".join(text) if rhs[0] == "|"
|
|
6099
|
+
else " ".join(s.strip() for s in text if s.strip()))
|
|
6100
|
+
elif rhs:
|
|
6101
|
+
out[key] = rhs.strip("\"'")
|
|
6102
|
+
elif child and all(c.lstrip().startswith("- ") for c in child if c.strip()
|
|
6103
|
+
and len(c) - len(c.lstrip()) == min(
|
|
6104
|
+
len(x) - len(x.lstrip()) for x in child if x.strip())):
|
|
6105
|
+
base = min(len(x) - len(x.lstrip()) for x in child if x.strip())
|
|
6106
|
+
items = [c.strip()[2:].strip().strip("\"'") for c in child
|
|
6107
|
+
if c.strip() and len(c) - len(c.lstrip()) == base]
|
|
6108
|
+
if all(":" not in it for it in items):
|
|
6109
|
+
out[key] = items
|
|
6110
|
+
return out if "status" in out else None
|
|
6111
|
+
|
|
6112
|
+
|
|
6049
6113
|
PROGRESS_FILENAME = "PROGRESS.md"
|
|
6050
6114
|
|
|
6051
6115
|
|
|
@@ -6193,6 +6257,9 @@ def agent_reported_blocked(stdout: str) -> tuple[bool, str | None]:
|
|
|
6193
6257
|
if not parsed or parsed.get("status") != "blocked":
|
|
6194
6258
|
return False, None
|
|
6195
6259
|
reason = parsed.get("blocked_reason")
|
|
6260
|
+
if reason is None:
|
|
6261
|
+
# #3442: agents also write `reason:`; the contract's key still wins.
|
|
6262
|
+
reason = parsed.get("reason")
|
|
6196
6263
|
return True, (str(reason) if reason is not None else None)
|
|
6197
6264
|
|
|
6198
6265
|
|
|
@@ -548,6 +548,8 @@ tests/test_resolve_base.py
|
|
|
548
548
|
tests/test_restart_cap_counts_progress.py
|
|
549
549
|
tests/test_result_block.py
|
|
550
550
|
tests/test_result_block_audience.py
|
|
551
|
+
tests/test_result_block_near_miss.py
|
|
552
|
+
tests/test_result_block_scalar.py
|
|
551
553
|
tests/test_resume_command_build.py
|
|
552
554
|
tests/test_retain_on_guard_refusal_docs.py
|
|
553
555
|
tests/test_roadmap_add_skill.py
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# Copyright 2026 Specfuse Contributors
|
|
2
|
+
# Licensed under the Apache License, Version 2.0. See LICENSE.
|
|
3
|
+
"""A near-miss RESULT block is still read (#3442).
|
|
4
|
+
|
|
5
|
+
FEAT-2026-0116/T01, attempt 1, ended with a legitimate block in a bare fence
|
|
6
|
+
whose first line was `RESULT`, and named the reason `reason:` rather than
|
|
7
|
+
`blocked_reason:`. RESULT_BLOCK_RE found no ```result block, so the attempt was
|
|
8
|
+
read as complete and verified against a tree the session had left untouched.
|
|
9
|
+
"""
|
|
10
|
+
import unittest
|
|
11
|
+
|
|
12
|
+
from tests._loop_loader import load_loop
|
|
13
|
+
|
|
14
|
+
loop = load_loop()
|
|
15
|
+
|
|
16
|
+
_T01_RESULT = """Confirmed: the pinned test asserts the run-level summary. Escalation trigger fires. Stop, no code edits.
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
RESULT
|
|
20
|
+
status: blocked
|
|
21
|
+
reason: "Acceptance criterion 4 pins tests.test_surefire_run_level_signature.TestSurefireRunLevelSignature.test_signature_is_the_run_level_error_summary, which asserts a run-level summary line is the signature. Escalation trigger matched verbatim."
|
|
22
|
+
files_touched: []
|
|
23
|
+
tests_run: "python3 -m unittest tests.test_surefire_run_level_signature -v -b"
|
|
24
|
+
tests_result: pass (baseline, unmodified, confirms the conflict, not a fix)
|
|
25
|
+
```
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class NearMissResultIsRead(unittest.TestCase):
|
|
30
|
+
def test_bare_fence_led_by_RESULT_with_reason_alias_reads_as_blocked(self):
|
|
31
|
+
blocked, reason = loop.agent_reported_blocked(_T01_RESULT)
|
|
32
|
+
self.assertTrue(blocked)
|
|
33
|
+
self.assertIn("Acceptance criterion 4 pins", reason)
|
|
34
|
+
|
|
35
|
+
def test_reason_alias_inside_a_proper_result_fence(self):
|
|
36
|
+
out = "```result\nstatus: blocked\nreason: the plan contradicts itself\n```\n"
|
|
37
|
+
self.assertEqual(loop.agent_reported_blocked(out), (True, "the plan contradicts itself"))
|
|
38
|
+
|
|
39
|
+
def test_blocked_reason_wins_over_reason_when_both_are_present(self):
|
|
40
|
+
out = "```result\nstatus: blocked\nblocked_reason: the real one\nreason: other\n```\n"
|
|
41
|
+
self.assertEqual(loop.agent_reported_blocked(out), (True, "the real one"))
|
|
42
|
+
|
|
43
|
+
def test_a_proper_result_fence_takes_precedence_over_a_near_miss(self):
|
|
44
|
+
out = ("```result\nstatus: complete\nsummary: done\n```\n\n"
|
|
45
|
+
"```\nRESULT\nstatus: blocked\nreason: quoted example\n```\n")
|
|
46
|
+
self.assertEqual(loop.parse_result_block(out)["status"], "complete")
|
|
47
|
+
|
|
48
|
+
def test_a_plain_code_fence_is_not_a_result(self):
|
|
49
|
+
out = "Here is the diff:\n\n```\nstatus: blocked\nreason: not a result\n```\n"
|
|
50
|
+
self.assertIsNone(loop.parse_result_block(out))
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
if __name__ == "__main__":
|
|
54
|
+
unittest.main()
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Copyright 2026 Specfuse Contributors
|
|
2
|
+
# Licensed under the Apache License, Version 2.0. See LICENSE.
|
|
3
|
+
"""A RESULT block whose fields use YAML block scalars still parses (#3436).
|
|
4
|
+
|
|
5
|
+
FEAT-2026-0115/T02 ended two sessions with a legitimate `status: blocked` whose
|
|
6
|
+
`blocked_reason` was a `|` block scalar. The strict mini-YAML parser rejects
|
|
7
|
+
block scalars by design (operator config must fail loudly), so
|
|
8
|
+
`parse_result_block` returned None, `agent_reported_blocked` returned
|
|
9
|
+
(False, None), and the driver ran verify() on an attempt that had written
|
|
10
|
+
nothing and escalated it as a spin.
|
|
11
|
+
"""
|
|
12
|
+
import unittest
|
|
13
|
+
|
|
14
|
+
from tests._loop_loader import load_loop
|
|
15
|
+
|
|
16
|
+
loop = load_loop()
|
|
17
|
+
|
|
18
|
+
_T02_RESULT = """Confirmed genuine escalation match. No edits made.
|
|
19
|
+
|
|
20
|
+
```result
|
|
21
|
+
status: blocked
|
|
22
|
+
summary: Investigated evaluate_fix_unit_insertion's two required calls; both hit the WU's own named escalation triggers before any code could be written — no edits made.
|
|
23
|
+
blocked_reason: |
|
|
24
|
+
Both escalation triggers in the WU body are real, verified by reading the
|
|
25
|
+
called modules, not guessed:
|
|
26
|
+
|
|
27
|
+
1. lint_plan_next_draft(feature_dir, just_closed_gate) has no per-unit
|
|
28
|
+
check separable from its review-file check.
|
|
29
|
+
2. evaluate_arm_predicate has no parameter for a projected graph.
|
|
30
|
+
```
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class BlockScalarResultParses(unittest.TestCase):
|
|
35
|
+
def test_literal_block_scalar_blocked_reason_reads_as_blocked(self):
|
|
36
|
+
blocked, reason = loop.agent_reported_blocked(_T02_RESULT)
|
|
37
|
+
self.assertTrue(blocked)
|
|
38
|
+
self.assertIn("Both escalation triggers in the WU body are real", reason)
|
|
39
|
+
self.assertIn("1. lint_plan_next_draft(feature_dir, just_closed_gate)", reason)
|
|
40
|
+
self.assertIn("\n\n", reason, "the literal scalar keeps its blank line")
|
|
41
|
+
|
|
42
|
+
def test_parsed_block_carries_every_top_level_field(self):
|
|
43
|
+
parsed = loop.parse_result_block(_T02_RESULT)
|
|
44
|
+
self.assertIsNotNone(parsed)
|
|
45
|
+
self.assertEqual(parsed["status"], "blocked")
|
|
46
|
+
self.assertTrue(parsed["summary"].startswith("Investigated evaluate_fix_unit_insertion"))
|
|
47
|
+
|
|
48
|
+
def test_folded_block_scalar_joins_lines_with_spaces(self):
|
|
49
|
+
out = "```result\nstatus: blocked\nblocked_reason: >\n one line\n continued here\n```\n"
|
|
50
|
+
blocked, reason = loop.agent_reported_blocked(out)
|
|
51
|
+
self.assertTrue(blocked)
|
|
52
|
+
self.assertEqual(reason.strip(), "one line continued here")
|
|
53
|
+
|
|
54
|
+
def test_list_field_beside_a_block_scalar_survives(self):
|
|
55
|
+
out = ("```result\nstatus: complete\nsummary: |\n did the thing\n"
|
|
56
|
+
"files_changed:\n - src/a.py\n - tests/test_a.py\n```\n")
|
|
57
|
+
parsed = loop.parse_result_block(out)
|
|
58
|
+
self.assertEqual(parsed["status"], "complete")
|
|
59
|
+
self.assertEqual(parsed["files_changed"], ["src/a.py", "tests/test_a.py"])
|
|
60
|
+
self.assertEqual(parsed["summary"].strip(), "did the thing")
|
|
61
|
+
|
|
62
|
+
def test_a_block_without_a_status_still_degrades_to_none(self):
|
|
63
|
+
out = "```result\nsummary: |\n no status here\n```\n"
|
|
64
|
+
self.assertIsNone(loop.parse_result_block(out))
|
|
65
|
+
|
|
66
|
+
def test_a_well_formed_block_parses_exactly_as_before(self):
|
|
67
|
+
out = "```result\nstatus: blocked\nblocked_reason: one line\n```\n"
|
|
68
|
+
self.assertEqual(loop.agent_reported_blocked(out), (True, "one line"))
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
if __name__ == "__main__":
|
|
72
|
+
unittest.main()
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
0.26.0
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/concepts/adopting-auto-mode.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/concepts/ralph-lineage.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/monitoring-secrets-checklist.md
RENAMED
|
File without changes
|
{specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/monitoring.overrides.yml.example
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/design-for-diagnosis.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/operator-escalation.md
RENAMED
|
File without changes
|
{specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/planning-discipline.md
RENAMED
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/security-boundaries.md
RENAMED
|
File without changes
|
{specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/verification-discipline.md
RENAMED
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/driver-event.schema.json
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/templates/DECISIONS.template.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/workflows/specfuse-monitor.yml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|