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.
Files changed (635) hide show
  1. {specfuse_loop-0.26.0/specfuse_loop.egg-info → specfuse_loop-0.26.1}/PKG-INFO +1 -1
  2. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/pyproject.toml +1 -1
  3. specfuse_loop-0.26.1/specfuse/loop/data/VERSION +1 -0
  4. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/loop.py +68 -1
  5. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1/specfuse_loop.egg-info}/PKG-INFO +1 -1
  6. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse_loop.egg-info/SOURCES.txt +2 -0
  7. specfuse_loop-0.26.1/tests/test_result_block_near_miss.py +54 -0
  8. specfuse_loop-0.26.1/tests/test_result_block_scalar.py +72 -0
  9. specfuse_loop-0.26.0/specfuse/loop/data/VERSION +0 -1
  10. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/LICENSE +0 -0
  11. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/NOTICE +0 -0
  12. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/README.md +0 -0
  13. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/setup.cfg +0 -0
  14. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/__init__.py +0 -0
  15. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/budget.py +0 -0
  16. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/diagnose_invoke.py +0 -0
  17. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/drafting_answers.py +0 -0
  18. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/drafting_invoke.py +0 -0
  19. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/drafting_questions.py +0 -0
  20. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/driver_command.py +0 -0
  21. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/driver_invoke.py +0 -0
  22. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/invoke.py +0 -0
  23. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/monitoring_read.py +0 -0
  24. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/__init__.py +0 -0
  25. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/answers.py +0 -0
  26. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/bugs.py +0 -0
  27. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/feature.py +0 -0
  28. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/findings_autofix.py +0 -0
  29. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/findings_diagnose.py +0 -0
  30. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/providers/triage.py +0 -0
  31. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/queue_read.py +0 -0
  32. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/repo_detect.py +0 -0
  33. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/run.py +0 -0
  34. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/severity_backfill.py +0 -0
  35. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/state.py +0 -0
  36. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/triage_invoke.py +0 -0
  37. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/agent/worktree.py +0 -0
  38. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/__init__.py +0 -0
  39. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/_filelock.py +0 -0
  40. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/_miniyaml.py +0 -0
  41. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/_wu_sections.py +0 -0
  42. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/adopt_feature.py +0 -0
  43. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/agent_policy.py +0 -0
  44. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/arm_eval.py +0 -0
  45. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/arm_sweep.py +0 -0
  46. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/arm_txn.py +0 -0
  47. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/bug_lane.py +0 -0
  48. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/bug_lane_run.py +0 -0
  49. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/bug_lane_state.py +0 -0
  50. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/build_provenance.py +0 -0
  51. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/caller_check.py +0 -0
  52. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/changelog.py +0 -0
  53. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/closing_requirements.py +0 -0
  54. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/cost.py +0 -0
  55. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/criteria_state.py +0 -0
  56. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/CHANGELOG.seed.md +0 -0
  57. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/LEARNINGS.template.md +0 -0
  58. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/concepts/adopting-auto-mode.md +0 -0
  59. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/concepts/architecture-addendum-gates-and-iterative-planning.md +0 -0
  60. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/concepts/autonomy-stop-classes.md +0 -0
  61. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/concepts/ralph-lineage.md +0 -0
  62. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/getting-started.md +0 -0
  63. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/glossary.md +0 -0
  64. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/methodology.md +0 -0
  65. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/docs/skills.md +0 -0
  66. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/gitignore.snippet +0 -0
  67. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/monitoring-secrets-checklist.md +0 -0
  68. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/monitoring.overrides.yml.example +0 -0
  69. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/monitoring.yml.example +0 -0
  70. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/roadmap.template.md +0 -0
  71. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/close-discipline.md +0 -0
  72. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/correlation-ids.md +0 -0
  73. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/design-for-diagnosis.md +0 -0
  74. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/human-output.md +0 -0
  75. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/never-touch.md +0 -0
  76. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/operator-escalation.md +0 -0
  77. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/planning-discipline.md +0 -0
  78. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/result-contract.md +0 -0
  79. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/security-boundaries.md +0 -0
  80. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules/verification-discipline.md +0 -0
  81. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/rules-local/README.md +0 -0
  82. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/driver-event.schema.json +0 -0
  83. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/event.schema.json +0 -0
  84. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/events/initiative_created.schema.json +0 -0
  85. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/events/spec_issue_resolved.schema.json +0 -0
  86. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/events/spec_issue_routed.schema.json +0 -0
  87. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/schemas/events/spec_validated.schema.json +0 -0
  88. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/templates/DECISIONS.template.md +0 -0
  89. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/templates/GATE.template.md +0 -0
  90. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/templates/LEARNINGS-pending.template.md +0 -0
  91. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/templates/PLAN.template.md +0 -0
  92. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/templates/WU.template.md +0 -0
  93. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/verification.yml.example +0 -0
  94. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/data/workflows/specfuse-monitor.yml +0 -0
  95. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/decisions_format.py +0 -0
  96. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/driver_edit.py +0 -0
  97. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/escalation.py +0 -0
  98. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/events_stats.py +0 -0
  99. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/gate_commands.py +0 -0
  100. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/gate_eval.py +0 -0
  101. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/gh_backend.py +0 -0
  102. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/gh_features.py +0 -0
  103. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/heartbeat.py +0 -0
  104. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/judge.py +0 -0
  105. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/labels.py +0 -0
  106. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/learnings_distil.py +0 -0
  107. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/learnings_query.py +0 -0
  108. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/lint_closing.py +0 -0
  109. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/lint_monitoring.py +0 -0
  110. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/lint_plan.py +0 -0
  111. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/lint_roadmap.py +0 -0
  112. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/notify.py +0 -0
  113. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/notify_escalation.py +0 -0
  114. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/notify_sla.py +0 -0
  115. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/plan_baseline.py +0 -0
  116. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/policy_proposals.py +0 -0
  117. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/policy_review.py +0 -0
  118. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/prerun.py +0 -0
  119. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/prerun_capture.py +0 -0
  120. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/promotion.py +0 -0
  121. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/rearm_migration.py +0 -0
  122. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/red_on_base.py +0 -0
  123. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/replay_spin.py +0 -0
  124. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/roadmap_archive.py +0 -0
  125. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/scaffold.py +0 -0
  126. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/triage.py +0 -0
  127. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/upgrade_merge_gate.py +0 -0
  128. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/loop/validate_event.py +0 -0
  129. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/__init__.py +0 -0
  130. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/adapters.py +0 -0
  131. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/artifact.py +0 -0
  132. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/autofix.py +0 -0
  133. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/autofix_invoke.py +0 -0
  134. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/autofix_run.py +0 -0
  135. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/autofix_state.py +0 -0
  136. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/cli.py +0 -0
  137. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/diagnose_cli.py +0 -0
  138. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/diagnosis.py +0 -0
  139. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/fingerprint.py +0 -0
  140. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/issues.py +0 -0
  141. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/providers/__init__.py +0 -0
  142. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/providers/_azure_auth.py +0 -0
  143. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/providers/azure_app_insights.py +0 -0
  144. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/providers/azure_service_bus.py +0 -0
  145. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/redaction.py +0 -0
  146. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse/monitor/schedule.py +0 -0
  147. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse_loop.egg-info/dependency_links.txt +0 -0
  148. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse_loop.egg-info/entry_points.txt +0 -0
  149. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse_loop.egg-info/requires.txt +0 -0
  150. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/specfuse_loop.egg-info/top_level.txt +0 -0
  151. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_abandon_feature_skill.py +0 -0
  152. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_abandoned_work_reported.py +0 -0
  153. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_abandoned_wu_strands_gate.py +0 -0
  154. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_adopt_feature.py +0 -0
  155. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_budget.py +0 -0
  156. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_bug_selection_dedup.py +0 -0
  157. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_default_features_root.py +0 -0
  158. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_driver_command.py +0 -0
  159. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_driver_invoke.py +0 -0
  160. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_driver_restart.py +0 -0
  161. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_escalation_on_issue.py +0 -0
  162. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_escalation_run_state.py +0 -0
  163. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_findings_seam.py +0 -0
  164. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_invoke_timeout.py +0 -0
  165. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_invoke_usage.py +0 -0
  166. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_item_worktree.py +0 -0
  167. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_lock.py +0 -0
  168. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_policy_key_ownership.py +0 -0
  169. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_policy_queue.py +0 -0
  170. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_policy_schema.py +0 -0
  171. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_policy_triage_dial.py +0 -0
  172. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_answers.py +0 -0
  173. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_bugs.py +0 -0
  174. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_feature.py +0 -0
  175. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_findings_autofix.py +0 -0
  176. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_findings_diagnose.py +0 -0
  177. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_isolation.py +0 -0
  178. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_provider_triage.py +0 -0
  179. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_queue_read.py +0 -0
  180. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_relays_driver_output.py +0 -0
  181. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_repo_detect.py +0 -0
  182. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_run.py +0 -0
  183. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_run_progress.py +0 -0
  184. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_seam.py +0 -0
  185. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_snapshot_refresh.py +0 -0
  186. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_agent_state.py +0 -0
  187. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_answer_escalation_skill.py +0 -0
  188. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_app_insights_adapters.py +0 -0
  189. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_archive_ref_reconciliation.py +0 -0
  190. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_eval.py +0 -0
  191. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_eval_lint_class.py +0 -0
  192. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_eval_wiring.py +0 -0
  193. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_gate_edits_uncommitted.py +0 -0
  194. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_sweep.py +0 -0
  195. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_sweep_gate.py +0 -0
  196. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_txn.py +0 -0
  197. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_arm_wiring.py +0 -0
  198. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_artifact_redaction.py +0 -0
  199. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attempt_note_untracked_files.py +0 -0
  200. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attempt_outcome_contract.py +0 -0
  201. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attempt_outcome_emission.py +0 -0
  202. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attention_nonwriting_guard.py +0 -0
  203. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attention_silence_section.py +0 -0
  204. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attention_skill_structure.py +0 -0
  205. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_attribution_halt_claims.py +0 -0
  206. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autoclose_deferral_visibility.py +0 -0
  207. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autoclose_gate_note.py +0 -0
  208. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autoclose_stub_states_what_passed.py +0 -0
  209. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autofix_invoke.py +0 -0
  210. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autofix_live.py +0 -0
  211. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autofix_predicate.py +0 -0
  212. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autofix_run.py +0 -0
  213. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autofix_state.py +0 -0
  214. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autosync.py +0 -0
  215. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autosync_consent.py +0 -0
  216. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autosync_firstrun.py +0 -0
  217. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autosync_no_cwd_leak.py +0 -0
  218. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_autosync_plugin.py +0 -0
  219. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_azure_credential_resolution.py +0 -0
  220. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_backend.py +0 -0
  221. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_baseline_escalation_message.py +0 -0
  222. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_baseline_persistence.py +0 -0
  223. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_baseline_probe.py +0 -0
  224. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_baseline_provenance.py +0 -0
  225. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_baseline_tree_hash_key.py +0 -0
  226. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bash_routing.py +0 -0
  227. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bats_suites_gated.py +0 -0
  228. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_binary_verdict.py +0 -0
  229. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_binding_block_advisory.py +0 -0
  230. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_binding_block_allocation.py +0 -0
  231. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_binding_block_budget.py +0 -0
  232. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_blind_run_is_not_drained.py +0 -0
  233. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bookkeeping_commit_crash_run.py +0 -0
  234. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bookkeeping_commit_hook_crash.py +0 -0
  235. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bookkeeping_no_verify.py +0 -0
  236. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_brief_covers_every_unit_escalation.py +0 -0
  237. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_ci_pending.py +0 -0
  238. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_guardrails.py +0 -0
  239. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_label_nonfatal.py +0 -0
  240. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_labels_registered.py +0 -0
  241. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_min_severity.py +0 -0
  242. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_policy_contract.py +0 -0
  243. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_pr_number_carried.py +0 -0
  244. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_preflight_and_dial.py +0 -0
  245. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_run.py +0 -0
  246. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_state.py +0 -0
  247. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_stopped_outcome_pr_number.py +0 -0
  248. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_bug_lane_test_paths.py +0 -0
  249. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_build_provenance.py +0 -0
  250. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_caller_check_ratchet.py +0 -0
  251. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_carried_green_invalidated_by_diff.py +0 -0
  252. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_carry_accounting_close_and_judge.py +0 -0
  253. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_changed_file_test_selection.py +0 -0
  254. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_changelog_append_only.py +0 -0
  255. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_changelog_collection.py +0 -0
  256. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_changelog_release_wiring.py +0 -0
  257. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_changelog_schema.py +0 -0
  258. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_ci_conclusion_wait.py +0 -0
  259. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_ci_runs_every_gate.py +0 -0
  260. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_claude_resolution.py +0 -0
  261. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_close_b_pending_learnings.py +0 -0
  262. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_close_records_feature_oracle.py +0 -0
  263. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_close_wu_self_reference.py +0 -0
  264. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_closing_deliverable_guard.py +0 -0
  265. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_closing_guard_contracts.py +0 -0
  266. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_closing_guard_prediction.py +0 -0
  267. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_closing_learnings_destination.py +0 -0
  268. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_closing_requirements.py +0 -0
  269. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_closing_sessions_on_sonnet.py +0 -0
  270. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_coauthor_trailer_allowlist.py +0 -0
  271. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_conditional_reflection.py +0 -0
  272. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_console_encoding.py +0 -0
  273. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_convergent_iteration.py +0 -0
  274. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_convergent_wu_lint.py +0 -0
  275. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_correlation_id_override.py +0 -0
  276. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_correlation_id_two_surfaces.py +0 -0
  277. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_cost_lifetime.py +0 -0
  278. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_cost_tracking.py +0 -0
  279. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_criteria_per_gate_lint.py +0 -0
  280. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_criteria_state.py +0 -0
  281. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_criteria_worklist.py +0 -0
  282. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_decision_citation_lint.py +0 -0
  283. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_decision_followups_discharged.py +0 -0
  284. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_decision_override_lint.py +0 -0
  285. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_decisions_format.py +0 -0
  286. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_default_severity_aliases.py +0 -0
  287. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_degraded_oracle.py +0 -0
  288. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_deliverable_missing_note.py +0 -0
  289. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_deliverable_presence_gate.py +0 -0
  290. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_derive_agent_policy_review_mode.py +0 -0
  291. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_derive_agent_policy_skill.py +0 -0
  292. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_derive_monitoring_discovery.py +0 -0
  293. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_derive_monitoring_skill_registration.py +0 -0
  294. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_design_for_diagnosis_rule.py +0 -0
  295. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_deterministic_refusal_repeat.py +0 -0
  296. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_diagnose_headless.py +0 -0
  297. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_diagnose_issue_skill.py +0 -0
  298. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_diagnosis.py +0 -0
  299. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_diagnosis_roundtrip_live.py +0 -0
  300. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_dispatch_model_from_fix_scope.py +0 -0
  301. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_dispatch_preamble_rules_pointer.py +0 -0
  302. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_dispatch_skeleton.py +0 -0
  303. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_dispatch_skills_index.py +0 -0
  304. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_distilled_accept_step.py +0 -0
  305. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_doctor.py +0 -0
  306. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_doctor_command_preflight.py +0 -0
  307. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_done_feature_gates.py +0 -0
  308. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_draft_feature_answers_mode.py +0 -0
  309. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_drafting_answer_gate.py +0 -0
  310. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_drafting_invoke.py +0 -0
  311. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_drafting_question_issue.py +0 -0
  312. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_drafting_questions.py +0 -0
  313. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_drafting_reply_shape.py +0 -0
  314. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_edit_detection.py +0 -0
  315. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_event_registry_covers_emitters.py +0 -0
  316. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_integration.py +0 -0
  317. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_lock.py +0 -0
  318. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_module_surface.py +0 -0
  319. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_restart_halt_surfaced.py +0 -0
  320. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_restart_halt_wiring.py +0 -0
  321. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_restart_hold.py +0 -0
  322. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_staleness_gate_summary.py +0 -0
  323. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_driver_staleness_warning.py +0 -0
  324. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_dry_run_no_branch_mutation.py +0 -0
  325. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_duration_tracking.py +0 -0
  326. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_empty_files_escalation.py +0 -0
  327. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_ensure_feature_branch.py +0 -0
  328. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_ensure_feature_branch_base.py +0 -0
  329. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_escalation_assignee_policy.py +0 -0
  330. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_escalation_contract.py +0 -0
  331. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_escalation_crash_containment.py +0 -0
  332. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_escalation_dedup_search.py +0 -0
  333. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_escalation_emit.py +0 -0
  334. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_event_gate_full_envelope.py +0 -0
  335. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_events_redaction.py +0 -0
  336. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_events_stats.py +0 -0
  337. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_extra_gates.py +0 -0
  338. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_failure_artifact_model.py +0 -0
  339. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_failure_signature_fail_prefix.py +0 -0
  340. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_failure_signature_names_the_test.py +0 -0
  341. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_failure_signature_skips_log_noise.py +0 -0
  342. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_branch_auto_sync.py +0 -0
  343. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_branch_squash_merge.py +0 -0
  344. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_branch_stale_base.py +0 -0
  345. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_id_resolution.py +0 -0
  346. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_oracle_e2e.py +0 -0
  347. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_provider_drafting_dispatch.py +0 -0
  348. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_feature_review_accumulation.py +0 -0
  349. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_filelock_portable.py +0 -0
  350. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_files_changed_auto_repair.py +0 -0
  351. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_find_pr_no_search_index.py +0 -0
  352. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fingerprint.py +0 -0
  353. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fix_bug_diff_self_check.py +0 -0
  354. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fix_bug_headless.py +0 -0
  355. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fix_bug_reads_comments.py +0 -0
  356. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fix_unit_insertion_bookkeeping.py +0 -0
  357. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fix_unit_insertion_e2e.py +0 -0
  358. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fix_unit_insertion_refused.py +0 -0
  359. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_fold_contract_documented.py +0 -0
  360. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_followups_artifact.py +0 -0
  361. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_force_full_close.py +0 -0
  362. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_frontmatter_scalar_quoting.py +0 -0
  363. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_broad_run.py +0 -0
  364. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_budget.py +0 -0
  365. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_budget_post_dispatch.py +0 -0
  366. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_commands_needs.py +0 -0
  367. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_eval.py +0 -0
  368. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_eval_calibration.py +0 -0
  369. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_eval_intermediate_wiring.py +0 -0
  370. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_eval_repo_flag.py +0 -0
  371. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_eval_terminal_wiring.py +0 -0
  372. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gate_report_verdict.py +0 -0
  373. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gh_backend.py +0 -0
  374. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gh_features.py +0 -0
  375. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_git_env_isolation.py +0 -0
  376. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_gitleaks_pinning.py +0 -0
  377. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_groom_backlog_skill.py +0 -0
  378. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_guard_refusal_failure_class.py +0 -0
  379. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_guard_refusal_failure_excerpt.py +0 -0
  380. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_guard_repair_e2e.py +0 -0
  381. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_guard_repair_prompt.py +0 -0
  382. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_hashed_denylist.py +0 -0
  383. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_hashed_denylist_ci.py +0 -0
  384. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_heartbeat.py +0 -0
  385. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_heartbeat_adapter.py +0 -0
  386. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_human_output_rule.py +0 -0
  387. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_human_work_unit.py +0 -0
  388. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_hygiene_boundary_guidance.py +0 -0
  389. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_hyphenated_gate_name.py +0 -0
  390. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_ignored_cleanup_before_probe.py +0 -0
  391. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_init_integration.py +0 -0
  392. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_installed_copy_driver_e2e.py +0 -0
  393. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_interpreter_normalization.py +0 -0
  394. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_close_path.py +0 -0
  395. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_cost.py +0 -0
  396. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_cost_fold_committed.py +0 -0
  397. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_module.py +0 -0
  398. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_path_registry.py +0 -0
  399. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_sees_dropped_produces.py +0 -0
  400. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judge_terminal_flip_state.py +0 -0
  401. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_judged_event_points_at_findings.py +0 -0
  402. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_label_description_length.py +0 -0
  403. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_label_provisioning_runner_contract.py +0 -0
  404. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_label_registry.py +0 -0
  405. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_label_registry_covers_consumers.py +0 -0
  406. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_language_aware_narrow_selection.py +0 -0
  407. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lazy_baseline_e2e.py +0 -0
  408. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_leak_findings_redaction.py +0 -0
  409. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_leak_scan.py +0 -0
  410. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_leak_scan_content.py +0 -0
  411. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_learnings_curate_vendored_promote.py +0 -0
  412. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_learnings_distil_cli.py +0 -0
  413. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_learnings_query.py +0 -0
  414. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_learnings_staging.py +0 -0
  415. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_learnings_suggest_signature_filter.py +0 -0
  416. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_learnings_weights.py +0 -0
  417. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_legacy_4wu_terminal_flips.py +0 -0
  418. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lifecycle_integration.py +0 -0
  419. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lifetime_accounting.py +0 -0
  420. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_ac_observable.py +0 -0
  421. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_bare_produces_path.py +0 -0
  422. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_boundary_consistency.py +0 -0
  423. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_boundary_extraction.py +0 -0
  424. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_close_intermediate.py +0 -0
  425. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_close_verdict_not_predecided.py +0 -0
  426. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_close_wu.py +0 -0
  427. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_closing.py +0 -0
  428. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_closing_criteria.py +0 -0
  429. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_closing_criteria_pristine.py +0 -0
  430. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_correlation_id.py +0 -0
  431. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_correlation_id_close_intermediate.py +0 -0
  432. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_covers_load_wu_invariants.py +0 -0
  433. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_feature_oracle_declared.py +0 -0
  434. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_gate_proportionality.py +0 -0
  435. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_monitoring.py +0 -0
  436. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_oracle_env.py +0 -0
  437. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_plan_contract_fields.py +0 -0
  438. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_plan_errors.py +0 -0
  439. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_plan_next_draft.py +0 -0
  440. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_plan_relative_import.py +0 -0
  441. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_plan_verdict_exempt.py +0 -0
  442. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_planning_sections.py +0 -0
  443. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_produces_driver_helper.py +0 -0
  444. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_produces_satisfiability.py +0 -0
  445. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_roadmap.py +0 -0
  446. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_sections.py +0 -0
  447. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_task_graph_yaml_selection.py +0 -0
  448. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_lint_verification_reference.py +0 -0
  449. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_live_tests_opt_in.py +0 -0
  450. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_load_bearing_close_lint.py +0 -0
  451. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_attempt_evidence.py +0 -0
  452. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_auto_archive.py +0 -0
  453. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_caveman_preamble.py +0 -0
  454. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_close_intermediate.py +0 -0
  455. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_criteria_skeleton.py +0 -0
  456. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_criteria_survival.py +0 -0
  457. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_defaults_by_type.py +0 -0
  458. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_effort.py +0 -0
  459. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_failure_note_cap.py +0 -0
  460. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_files_changed_guard.py +0 -0
  461. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_gate_budget.py +0 -0
  462. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_gate_needs.py +0 -0
  463. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_model_alias.py +0 -0
  464. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_orchestration.py +0 -0
  465. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_post_pass_invariant.py +0 -0
  466. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_reset_preserving_events.py +0 -0
  467. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_smoke_runner.py +0 -0
  468. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_unsandboxed.py +0 -0
  469. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_worklist_injection.py +0 -0
  470. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_loop_zero_token_guard.py +0 -0
  471. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_make_repo_gpgsign_isolation.py +0 -0
  472. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_marker_dual_shape.py +0 -0
  473. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_maven_failure_excerpt.py +0 -0
  474. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_max_attempts_configurable.py +0 -0
  475. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_max_open_prs.py +0 -0
  476. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_migrate_legacy.py +0 -0
  477. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_miniyaml_equivalence.py +0 -0
  478. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_miniyaml_negative.py +0 -0
  479. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitor_cli.py +0 -0
  480. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitor_issue_lifecycle.py +0 -0
  481. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitor_runner_surfaces.py +0 -0
  482. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitoring_bootstrap_artifacts.py +0 -0
  483. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitoring_cron_dialect.py +0 -0
  484. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitoring_example.py +0 -0
  485. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitoring_fenced_blocks.py +0 -0
  486. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_monitoring_seed.py +0 -0
  487. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_narrow_fallback_warning.py +0 -0
  488. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_needs_decision_outcome.py +0 -0
  489. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_no_pytest_subprocess.py +0 -0
  490. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_notify.py +0 -0
  491. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_notify_escalation.py +0 -0
  492. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_notify_sla.py +0 -0
  493. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_operator_escalation_rule.py +0 -0
  494. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_oracle_set_declared.py +0 -0
  495. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_oracle_unrunnable_attribution.py +0 -0
  496. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_per_run_item_cap_disclosure.py +0 -0
  497. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pick_feature_skill.py +0 -0
  498. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pin_honesty_and_integrity.py +0 -0
  499. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pin_marker_not_inherited.py +0 -0
  500. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pin_marker_spawn_sites.py +0 -0
  501. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_plan_baseline.py +0 -0
  502. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_planned_cost_lint.py +0 -0
  503. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_planning_cost_floor.py +0 -0
  504. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_plugin_prose_cross_refs.py +0 -0
  505. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_plugin_qualified_dispatch.py +0 -0
  506. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_policy_budgets_applied.py +0 -0
  507. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_policy_proposals.py +0 -0
  508. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_policy_review.py +0 -0
  509. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pr_checks_json_field.py +0 -0
  510. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pr_reference_in_title.py +0 -0
  511. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_pre_existing_claims_cite_evidence.py +0 -0
  512. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_prep_halt_operator_surface.py +0 -0
  513. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_prepare_feature.py +0 -0
  514. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_prepare_scaffold_sync.py +0 -0
  515. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_prerun_capture.py +0 -0
  516. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_prerun_oracles.py +0 -0
  517. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_prerun_wiring.py +0 -0
  518. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produced_document_verdict_guard.py +0 -0
  519. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_amendment_e2e.py +0 -0
  520. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_bracket_literal.py +0 -0
  521. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_bracket_wildcard.py +0 -0
  522. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_field.py +0 -0
  523. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_in_diff.py +0 -0
  524. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_justification.py +0 -0
  525. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_recursive_glob.py +0 -0
  526. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_repair_note.py +0 -0
  527. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_semantics_unified.py +0 -0
  528. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_produces_shape.py +0 -0
  529. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_progress_forward_note.py +0 -0
  530. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_progress_lines_end_to_end.py +0 -0
  531. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_promotion_ledger.py +0 -0
  532. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_provider_escalation_traces.py +0 -0
  533. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_provision_labels.py +0 -0
  534. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_queue_stalled_adapter.py +0 -0
  535. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_rearm_clears_stale_criteria_state.py +0 -0
  536. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_rearm_fold_marker.py +0 -0
  537. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_rearm_migration.py +0 -0
  538. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_reclose_carries_narrow_greens_e2e.py +0 -0
  539. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_red_baseline_never_reused.py +0 -0
  540. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_red_on_base_guardrail.py +0 -0
  541. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_red_on_base_probe.py +0 -0
  542. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_redaction_windows_home.py +0 -0
  543. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_reflection_required_signals.py +0 -0
  544. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replan_end_to_end.py +0 -0
  545. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replan_event_emission.py +0 -0
  546. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replan_note_collision.py +0 -0
  547. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replan_trigger.py +0 -0
  548. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replan_turn_contract.py +0 -0
  549. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replay_spin.py +0 -0
  550. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_replay_spin_failing_sets.py +0 -0
  551. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_required_checks.py +0 -0
  552. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_resolve_base.py +0 -0
  553. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_restart_cap_counts_progress.py +0 -0
  554. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_result_block.py +0 -0
  555. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_result_block_audience.py +0 -0
  556. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_resume_command_build.py +0 -0
  557. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_retain_on_guard_refusal_docs.py +0 -0
  558. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_add_skill.py +0 -0
  559. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_archive_cli.py +0 -0
  560. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_archive_shim.py +0 -0
  561. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_archive_skill.py +0 -0
  562. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_archive_skill_delegates.py +0 -0
  563. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_link_gate.py +0 -0
  564. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_roadmap_row_parser.py +0 -0
  565. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_ruff_verdict_lines.py +0 -0
  566. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_rule_import_convergence.py +0 -0
  567. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_run_level_failure_breaker.py +0 -0
  568. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_data_in_sync.py +0 -0
  569. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_doc_hygiene.py +0 -0
  570. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_docs.py +0 -0
  571. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_init.py +0 -0
  572. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_label_provisioning.py +0 -0
  573. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_manifest.py +0 -0
  574. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_resources.py +0 -0
  575. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_seed_sanity.py +0 -0
  576. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_skew_halts.py +0 -0
  577. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_upgrade.py +0 -0
  578. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_scaffold_wiring.py +0 -0
  579. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_schedule_dialect.py +0 -0
  580. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_seed_documents_prerun_keys.py +0 -0
  581. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_service_bus_dlq_adapter.py +0 -0
  582. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_session_env_preflight.py +0 -0
  583. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_aliases.py +0 -0
  584. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_backfill_apply.py +0 -0
  585. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_backfill_end_to_end.py +0 -0
  586. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_backfill_limit.py +0 -0
  587. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_backfill_marker.py +0 -0
  588. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_backfill_run.py +0 -0
  589. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_label_projection.py +0 -0
  590. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_reconciliation.py +0 -0
  591. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_severity_rubric.py +0 -0
  592. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_shipped_templates_parse.py +0 -0
  593. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_skill_discovery_links.py +0 -0
  594. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_skills_vendored_in_sync.py +0 -0
  595. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_spec_work_unit_rules.py +0 -0
  596. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_spinning_rearm_gate.py +0 -0
  597. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_spinning_repeat_same_failing_set.py +0 -0
  598. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_spinout_brief_end_to_end.py +0 -0
  599. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_spinout_brief_replan_option.py +0 -0
  600. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_squash_commit_hook_crash.py +0 -0
  601. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_stop_rationale_captured.py +0 -0
  602. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_stranded_halt_cause.py +0 -0
  603. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_surefire_run_level_signature.py +0 -0
  604. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_surefire_verdict_lines.py +0 -0
  605. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_template_closing_shapes.py +0 -0
  606. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_terminal_flip_ownership.py +0 -0
  607. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_terminal_flips.py +0 -0
  608. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_terminal_gate_message.py +0 -0
  609. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_tiered_verification_e2e.py +0 -0
  610. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_timeout_kill_portable.py +0 -0
  611. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage.py +0 -0
  612. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_apply.py +0 -0
  613. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_projects_severity_label.py +0 -0
  614. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_severity_classify.py +0 -0
  615. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_severity_end_to_end.py +0 -0
  616. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_severity_write.py +0 -0
  617. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_skill_contract.py +0 -0
  618. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_triage_skips_agent_escalations.py +0 -0
  619. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_tsc_verdict_lines.py +0 -0
  620. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_umbrella_version_resolution.py +0 -0
  621. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_unterminated_frontmatter.py +0 -0
  622. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_untracked_feature_folder.py +0 -0
  623. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_untracked_file_absorption.py +0 -0
  624. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_upgrade_integration.py +0 -0
  625. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_upgrade_merge_gate.py +0 -0
  626. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_validate_event.py +0 -0
  627. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_validate_event_driver_types.py +0 -0
  628. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_verdict_coupling.py +0 -0
  629. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_verify_empty_gate_set.py +0 -0
  630. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_version_consistency.py +0 -0
  631. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_version_skew.py +0 -0
  632. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_windows_gate_exec.py +0 -0
  633. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_worktree_restore.py +0 -0
  634. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_wu_execution_metadata.py +0 -0
  635. {specfuse_loop-0.26.0 → specfuse_loop-0.26.1}/tests/test_wu_template_renders_lintable.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specfuse-loop
3
- Version: 0.26.0
3
+ Version: 0.26.1
4
4
  Summary: Local-first executor for the Specfuse Plan + Work Unit gate-cycle methodology.
5
5
  Author: Specfuse contributors
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "specfuse-loop"
7
- version = "0.26.0"
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.0"
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
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: specfuse-loop
3
- Version: 0.26.0
3
+ Version: 0.26.1
4
4
  Summary: Local-first executor for the Specfuse Plan + Work Unit gate-cycle methodology.
5
5
  Author: Specfuse contributors
6
6
  License: Apache-2.0
@@ -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