loop-engineer 0.8.0__tar.gz → 0.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/.claude-plugin/plugin.json +17 -3
  2. loop_engineer-0.9.0/.github/dependabot.yml +16 -0
  3. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/.github/workflows/ci.yml +24 -9
  4. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/.github/workflows/publish.yml +7 -4
  5. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/.gitignore +9 -8
  6. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/CHANGELOG.md +62 -0
  7. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/CONTRIBUTING.md +15 -2
  8. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/PKG-INFO +37 -11
  9. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/README.md +34 -10
  10. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/action.yml +1 -1
  11. loop_engineer-0.9.0/docs/adr/0001-proof-kernel-and-runtime.md +104 -0
  12. loop_engineer-0.9.0/docs/gap-reports/scoreboard.md +296 -0
  13. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/gap-reports/superpowers.md +5 -4
  14. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/superpowers/plans/2026-07-08-v0.8.0-composes-the-field.md +1 -1
  15. loop_engineer-0.9.0/docs/superpowers/plans/2026-07-09-st5-harness-scoreboard.md +39 -0
  16. loop_engineer-0.9.0/docs/superpowers/specs/2026-07-09-st5-harness-scoreboard-design.md +104 -0
  17. loop_engineer-0.9.0/examples/agent-os-run/README.md +52 -0
  18. loop_engineer-0.9.0/examples/agent-os-run/agent-os/product/mission.md +23 -0
  19. loop_engineer-0.9.0/examples/agent-os-run/agent-os/product/roadmap.md +16 -0
  20. loop_engineer-0.9.0/examples/agent-os-run/agent-os/specs/2026-07-09-1030-csv-dedupe/plan.md +31 -0
  21. loop_engineer-0.9.0/examples/agent-os-run/agent-os/specs/2026-07-09-1030-csv-dedupe/references.md +23 -0
  22. loop_engineer-0.9.0/examples/agent-os-run/agent-os/specs/2026-07-09-1030-csv-dedupe/shape.md +32 -0
  23. loop_engineer-0.9.0/examples/agent-os-run/agent-os/specs/2026-07-09-1030-csv-dedupe/standards.md +25 -0
  24. loop_engineer-0.9.0/examples/agent-os-run/agent-os/standards/backend/data-imports.md +16 -0
  25. loop_engineer-0.9.0/examples/agent-os-run/agent-os/standards/index.yml +5 -0
  26. loop_engineer-0.9.0/examples/bmad-run/README.md +39 -0
  27. loop_engineer-0.9.0/examples/bmad-run/_bmad/bmm/config.yaml +15 -0
  28. loop_engineer-0.9.0/examples/bmad-run/_bmad-output/implementation-artifacts/1-1-deduplicate-csv-rows.md +83 -0
  29. loop_engineer-0.9.0/examples/bmad-run/_bmad-output/implementation-artifacts/epic-1-retro-2026-07-09.md +54 -0
  30. loop_engineer-0.9.0/examples/bmad-run/_bmad-output/implementation-artifacts/sprint-status.yaml +38 -0
  31. loop_engineer-0.9.0/examples/bmad-run/_bmad-output/planning-artifacts/epics.md +48 -0
  32. loop_engineer-0.9.0/examples/bmad-run/_bmad-output/planning-artifacts/prd.md +48 -0
  33. loop_engineer-0.9.0/examples/bmad-run/src/import_contacts.py +55 -0
  34. loop_engineer-0.9.0/examples/bmad-run/tests/test_import_contacts.py +59 -0
  35. loop_engineer-0.9.0/examples/ccpm-run/.claude/epics/csv-dedupe/1235-analysis.md +51 -0
  36. loop_engineer-0.9.0/examples/ccpm-run/.claude/epics/csv-dedupe/1235.md +43 -0
  37. loop_engineer-0.9.0/examples/ccpm-run/.claude/epics/csv-dedupe/epic.md +79 -0
  38. loop_engineer-0.9.0/examples/ccpm-run/.claude/epics/csv-dedupe/execution-status.md +16 -0
  39. loop_engineer-0.9.0/examples/ccpm-run/.claude/epics/csv-dedupe/github-mapping.md +7 -0
  40. loop_engineer-0.9.0/examples/ccpm-run/.claude/epics/csv-dedupe/updates/1235/progress.md +30 -0
  41. loop_engineer-0.9.0/examples/ccpm-run/.claude/epics/csv-dedupe/updates/1235/stream-A.md +18 -0
  42. loop_engineer-0.9.0/examples/ccpm-run/.claude/prds/csv-dedupe.md +63 -0
  43. loop_engineer-0.9.0/examples/ccpm-run/README.md +45 -0
  44. loop_engineer-0.9.0/examples/coverage-repair/.loop/approvals/.gitkeep +0 -0
  45. loop_engineer-0.9.0/examples/coverage-repair/.loop/artifacts/holdout-run.txt +49 -0
  46. loop_engineer-0.9.0/examples/coverage-repair/.loop/artifacts/holdout-verdict.json +26 -0
  47. loop_engineer-0.9.0/examples/coverage-repair/.loop/artifacts/verify-T1.json +8 -0
  48. loop_engineer-0.9.0/examples/coverage-repair/.loop/artifacts/verify-T2-iter1.json +8 -0
  49. loop_engineer-0.9.0/examples/coverage-repair/.loop/artifacts/verify-T2.json +8 -0
  50. loop_engineer-0.9.0/examples/coverage-repair/.loop/checkpoints/.gitkeep +0 -0
  51. loop_engineer-0.9.0/examples/coverage-repair/.loop/manifest.yaml +53 -0
  52. loop_engineer-0.9.0/examples/coverage-repair/.loop/memory/.gitkeep +0 -0
  53. loop_engineer-0.9.0/examples/coverage-repair/.loop/repair/iter-002.json +12 -0
  54. loop_engineer-0.9.0/examples/coverage-repair/.loop/state.json +14 -0
  55. loop_engineer-0.9.0/examples/evidence/invalid/absolute-uri.json +10 -0
  56. loop_engineer-0.9.0/examples/evidence/invalid/bad-sha256-pattern.json +10 -0
  57. loop_engineer-0.9.0/examples/evidence/invalid/missing-required-field.json +9 -0
  58. loop_engineer-0.9.0/examples/evidence/invalid/scheme-uri.json +10 -0
  59. loop_engineer-0.9.0/examples/evidence/valid-evidence.json +22 -0
  60. loop_engineer-0.9.0/examples/flaky-test-triage/.loop/artifacts/holdout-verdict.json +21 -0
  61. loop_engineer-0.9.0/examples/flaky-test-triage/.loop/artifacts/verify-T1-iter1.json +8 -0
  62. loop_engineer-0.9.0/examples/flaky-test-triage/.loop/artifacts/verify-T1.json +9 -0
  63. loop_engineer-0.9.0/examples/flaky-test-triage/.loop/manifest.yaml +53 -0
  64. loop_engineer-0.9.0/examples/flaky-test-triage/.loop/repair/iter-002.json +12 -0
  65. loop_engineer-0.9.0/examples/flaky-test-triage/.loop/state.json +14 -0
  66. loop_engineer-0.9.0/examples/flaky-test-triage/.loop/terminal_state.json +14 -0
  67. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/langgraph-emit/graph_example.py +0 -6
  68. loop_engineer-0.9.0/examples/naive-loop/.loop/state.json +5 -0
  69. loop_engineer-0.9.0/examples/openspec-run/README.md +46 -0
  70. loop_engineer-0.9.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/.openspec.yaml +2 -0
  71. loop_engineer-0.9.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/design.md +49 -0
  72. loop_engineer-0.9.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/proposal.md +31 -0
  73. loop_engineer-0.9.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/specs/csv-dedupe/spec.md +37 -0
  74. loop_engineer-0.9.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/tasks.md +25 -0
  75. loop_engineer-0.9.0/examples/openspec-run/openspec/config.yaml +22 -0
  76. loop_engineer-0.9.0/examples/openspec-run/openspec/specs/csv-dedupe/spec.md +41 -0
  77. loop_engineer-0.9.0/examples/plans/coverage-repair.plan.json +32 -0
  78. loop_engineer-0.9.0/examples/plans/invalid/cyclic-dependency.plan.json +11 -0
  79. loop_engineer-0.9.0/examples/plans/invalid/missing-goal.plan.json +6 -0
  80. loop_engineer-0.9.0/examples/prp-run/.claude/PRPs/plans/completed/csv-dedupe.plan.md +98 -0
  81. loop_engineer-0.9.0/examples/prp-run/.claude/PRPs/prds/csv-dedupe.prd.md +65 -0
  82. loop_engineer-0.9.0/examples/prp-run/.claude/PRPs/reports/csv-dedupe-report.md +86 -0
  83. loop_engineer-0.9.0/examples/prp-run/.claude/PRPs/reviews/pr-42-cycle-0.verdict.json +4 -0
  84. loop_engineer-0.9.0/examples/prp-run/.claude/PRPs/reviews/pr-42-review.md +95 -0
  85. loop_engineer-0.9.0/examples/prp-run/.claude/prp-loop.run.log +10 -0
  86. loop_engineer-0.9.0/examples/prp-run/.claude/prp-loop.state.json +30 -0
  87. loop_engineer-0.9.0/examples/prp-run/README.md +43 -0
  88. loop_engineer-0.9.0/examples/ruflo-run/.claude-flow/metrics/swarm-activity.json +18 -0
  89. loop_engineer-0.9.0/examples/ruflo-run/.claude-flow/metrics/v3-progress.json +26 -0
  90. loop_engineer-0.9.0/examples/ruflo-run/.claude-flow/security/audit-status.json +8 -0
  91. loop_engineer-0.9.0/examples/ruflo-run/.hive-mind/sessions/hive-mind-prompt-swarm-2026-07-09.txt +46 -0
  92. loop_engineer-0.9.0/examples/ruflo-run/.mcp.json +17 -0
  93. loop_engineer-0.9.0/examples/ruflo-run/.swarm/memory-export.json +78 -0
  94. loop_engineer-0.9.0/examples/ruflo-run/README.md +46 -0
  95. loop_engineer-0.9.0/examples/spec-kit-run/.specify/feature.json +1 -0
  96. loop_engineer-0.9.0/examples/spec-kit-run/.specify/memory/constitution.md +35 -0
  97. loop_engineer-0.9.0/examples/spec-kit-run/README.md +27 -0
  98. loop_engineer-0.9.0/examples/spec-kit-run/specs/001-csv-dedupe/checklists/requirements.md +32 -0
  99. loop_engineer-0.9.0/examples/spec-kit-run/specs/001-csv-dedupe/plan.md +71 -0
  100. loop_engineer-0.9.0/examples/spec-kit-run/specs/001-csv-dedupe/quickstart.md +38 -0
  101. loop_engineer-0.9.0/examples/spec-kit-run/specs/001-csv-dedupe/research.md +32 -0
  102. loop_engineer-0.9.0/examples/spec-kit-run/specs/001-csv-dedupe/spec.md +74 -0
  103. loop_engineer-0.9.0/examples/spec-kit-run/specs/001-csv-dedupe/tasks.md +74 -0
  104. loop_engineer-0.9.0/examples/task-master-run/.taskmaster/config.json +32 -0
  105. loop_engineer-0.9.0/examples/task-master-run/.taskmaster/docs/prd.txt +42 -0
  106. loop_engineer-0.9.0/examples/task-master-run/.taskmaster/reports/task-complexity-report.json +37 -0
  107. loop_engineer-0.9.0/examples/task-master-run/.taskmaster/state.json +9 -0
  108. loop_engineer-0.9.0/examples/task-master-run/.taskmaster/tasks/task_001.txt +17 -0
  109. loop_engineer-0.9.0/examples/task-master-run/.taskmaster/tasks/tasks.json +73 -0
  110. loop_engineer-0.9.0/examples/task-master-run/.taskmaster/templates/example_prd.txt +32 -0
  111. loop_engineer-0.9.0/examples/task-master-run/CLAUDE.md +57 -0
  112. loop_engineer-0.9.0/examples/task-master-run/README.md +38 -0
  113. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/temporal-certify/workflow_example.py +0 -6
  114. loop_engineer-0.9.0/loop/__init__.py +30 -0
  115. loop_engineer-0.9.0/loop/__main__.py +379 -0
  116. loop_engineer-0.9.0/loop/architect.py +39 -0
  117. loop_engineer-0.9.0/loop/completion.py +73 -0
  118. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/loop/contract.py +203 -21
  119. loop_engineer-0.9.0/loop/emit.py +399 -0
  120. loop_engineer-0.9.0/loop/events.py +307 -0
  121. loop_engineer-0.9.0/loop/evidence.py +194 -0
  122. loop_engineer-0.9.0/loop/foreign.py +381 -0
  123. loop_engineer-0.9.0/loop/fsm.py +67 -0
  124. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/loop/integrations.py +63 -9
  125. loop_engineer-0.9.0/loop/plan.py +267 -0
  126. loop_engineer-0.9.0/loop/reducer.py +183 -0
  127. loop_engineer-0.9.0/loop/runcontrol.py +112 -0
  128. loop_engineer-0.9.0/loop/runner.py +245 -0
  129. loop_engineer-0.9.0/loop/runtime.py +223 -0
  130. loop_engineer-0.9.0/loop/simulate.py +120 -0
  131. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/pyproject.toml +3 -1
  132. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/reference/repo-os-contract.md +237 -3
  133. loop_engineer-0.9.0/schemas/event.schema.json +33 -0
  134. loop_engineer-0.9.0/schemas/evidence.schema.json +46 -0
  135. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/schemas/manifest.schema.json +1 -0
  136. loop_engineer-0.9.0/schemas/plan.schema.json +23 -0
  137. loop_engineer-0.9.0/schemas/state.schema.json +103 -0
  138. loop_engineer-0.9.0/schemas/terminal.schema.json +90 -0
  139. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/metrics.py +2 -2
  140. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/runtime_monitor.py +14 -3
  141. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/self_eval.py +20 -6
  142. loop_engineer-0.9.0/scripts/test_adversarial_kernel.py +264 -0
  143. loop_engineer-0.9.0/scripts/test_adversarial_process.py +207 -0
  144. loop_engineer-0.9.0/scripts/test_ci_release_mode.py +27 -0
  145. loop_engineer-0.9.0/scripts/test_completion_policy.py +118 -0
  146. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_conformance.py +1 -1
  147. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_docs_version.py +3 -2
  148. loop_engineer-0.9.0/scripts/test_doctor_eventstore.py +166 -0
  149. loop_engineer-0.9.0/scripts/test_emit.py +358 -0
  150. loop_engineer-0.9.0/scripts/test_eventstore.py +296 -0
  151. loop_engineer-0.9.0/scripts/test_evidence.py +234 -0
  152. loop_engineer-0.9.0/scripts/test_foreign_inspect.py +186 -0
  153. loop_engineer-0.9.0/scripts/test_fsm.py +100 -0
  154. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_integrations.py +61 -4
  155. loop_engineer-0.9.0/scripts/test_loop_architect_cli.py +146 -0
  156. loop_engineer-0.9.0/scripts/test_loop_cli.py +301 -0
  157. loop_engineer-0.9.0/scripts/test_loop_cli_status_replay.py +254 -0
  158. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_loop_contract_core.py +68 -1
  159. loop_engineer-0.9.0/scripts/test_loop_runcontrol_cli.py +377 -0
  160. loop_engineer-0.9.0/scripts/test_loop_simulate_cli.py +211 -0
  161. loop_engineer-0.9.0/scripts/test_loop_simulate_zero_writes.py +91 -0
  162. loop_engineer-0.9.0/scripts/test_manifest_extra_states_schema.py +38 -0
  163. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_metrics.py +17 -0
  164. loop_engineer-0.9.0/scripts/test_plan_schema.py +225 -0
  165. loop_engineer-0.9.0/scripts/test_reducer.py +317 -0
  166. loop_engineer-0.9.0/scripts/test_runner_dispatch.py +129 -0
  167. loop_engineer-0.9.0/scripts/test_runner_verifier.py +158 -0
  168. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_runtime_monitor.py +18 -0
  169. loop_engineer-0.9.0/scripts/test_state_vocabulary.py +59 -0
  170. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_template_roundtrip.py +3 -16
  171. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_wheel_selfcontained.py +11 -0
  172. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/skills/loop-evals/SKILL.md +1 -1
  173. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/skills/loop-inspector/SKILL.md +1 -1
  174. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/skills/loop-run/SKILL.md +1 -1
  175. loop_engineer-0.9.0/templates/RUNLOG.md.tmpl +31 -0
  176. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/state.json.tmpl +1 -1
  177. loop_engineer-0.8.0/loop/__init__.py +0 -17
  178. loop_engineer-0.8.0/loop/__main__.py +0 -176
  179. loop_engineer-0.8.0/loop/emit.py +0 -258
  180. loop_engineer-0.8.0/loop/foreign.py +0 -69
  181. loop_engineer-0.8.0/schemas/state.schema.json +0 -25
  182. loop_engineer-0.8.0/schemas/terminal.schema.json +0 -19
  183. loop_engineer-0.8.0/scripts/test_emit.py +0 -178
  184. loop_engineer-0.8.0/scripts/test_foreign_inspect.py +0 -84
  185. loop_engineer-0.8.0/scripts/test_loop_cli.py +0 -149
  186. loop_engineer-0.8.0/templates/RUNLOG.md.tmpl +0 -42
  187. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/.claude-plugin/marketplace.json +0 -0
  188. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  189. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  190. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  191. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  192. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/.pre-commit-hooks.yaml +0 -0
  193. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/CODE_OF_CONDUCT.md +0 -0
  194. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/GLOSSARY.md +0 -0
  195. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/LICENSE +0 -0
  196. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/SECURITY.md +0 -0
  197. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/ROADMAP-v1.0.md +0 -0
  198. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/contributing/issues/01-good-first-qw9-trigger-phrases.md +0 -0
  199. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/contributing/issues/02-good-first-qw10-self-eval-labels.md +0 -0
  200. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/contributing/issues/03-good-first-emit-metrics-vocabulary.md +0 -0
  201. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/contributing/issues/04-help-wanted-openhands-recipe.md +0 -0
  202. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/contributing/issues/05-help-wanted-ruflo-recipe.md +0 -0
  203. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/contributing/issues/06-help-wanted-gap-reports.md +0 -0
  204. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/contributing/issues/07-help-wanted-emit-scaffold-runlog-seed.md +0 -0
  205. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/demo.cast +0 -0
  206. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/demo.gif +0 -0
  207. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/integrations/langgraph.md +0 -0
  208. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/integrations/temporal.md +0 -0
  209. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/metrics-baseline.json +0 -0
  210. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/social-card.png +0 -0
  211. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/superpowers/plans/2026-06-20-loop-engineer-v1.md +0 -0
  212. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/superpowers/plans/2026-06-30-loop-engineer-v1.0-roadmap.md +0 -0
  213. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/superpowers/plans/2026-07-03-adoption-slices.md +0 -0
  214. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/superpowers/specs/2026-06-20-loop-engineer-design.md +0 -0
  215. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/superpowers/specs/2026-06-30-st1-metrics-baseline.md +0 -0
  216. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/superpowers/specs/2026-06-30-st2-portable-contract-spec.md +0 -0
  217. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/superpowers/specs/2026-06-30-st3-integration-adapters.md +0 -0
  218. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/superpowers/specs/2026-06-30-v04-credibility-enforcement.md +0 -0
  219. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/superpowers/specs/2026-07-03-adoption-slices-design.md +0 -0
  220. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/docs/superpowers/specs/2026-07-08-v0.8.0-composes-the-field-design.md +0 -0
  221. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/evals/cases/structural.json +0 -0
  222. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/evals/rubric.md +0 -0
  223. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/ADR.md +0 -0
  224. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/README.md +0 -0
  225. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/RUNLOG.md +0 -0
  226. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/SPEC.md +0 -0
  227. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/TASKS.json +0 -0
  228. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/WORKFLOW.md +0 -0
  229. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/scripts/run-example +0 -0
  230. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/scripts/verify-fast +0 -0
  231. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/scripts/verify-full +0 -0
  232. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/target/manifest.json +0 -0
  233. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/target/measure_coverage.py +0 -0
  234. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/target/pricing.py +0 -0
  235. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/target/test_holdout.py +0 -0
  236. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/target/test_visible.py +0 -0
  237. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/coverage-repair/terminal_state.json +0 -0
  238. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/README.md +0 -0
  239. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/RUNLOG.md +0 -0
  240. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/SPEC.md +0 -0
  241. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/TASKS.json +0 -0
  242. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/WORKFLOW.md +0 -0
  243. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/scripts/run-example +0 -0
  244. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/scripts/verify-fast +0 -0
  245. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/scripts/verify-full +0 -0
  246. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/target/jobs.py +0 -0
  247. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/target/manifest.json +0 -0
  248. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/target/measure_stability.py +0 -0
  249. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/target/test_holdout.py +0 -0
  250. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/flaky-test-triage/target/test_visible.py +0 -0
  251. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/langgraph-emit/README.md +0 -0
  252. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/naive-loop/README.md +0 -0
  253. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/superpowers-run/.superpowers/sdd/progress.md +0 -0
  254. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/superpowers-run/README.md +0 -0
  255. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/superpowers-run/docs/superpowers/plans/2026-07-08-csv-dedupe.md +0 -0
  256. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/superpowers-run/docs/superpowers/specs/2026-07-08-csv-dedupe-design.md +0 -0
  257. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/examples/temporal-certify/README.md +0 -0
  258. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/hooks/stop_firewall.py +0 -0
  259. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/loop/_resources.py +0 -0
  260. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/loop/paths.py +0 -0
  261. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/loop/scaffold.py +0 -0
  262. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/reference/architecture-matrix.md +0 -0
  263. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/reference/eval-suite.md +0 -0
  264. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/reference/loop-patterns.md +0 -0
  265. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/reference/model-routing.md +0 -0
  266. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/reference/platform-map.md +0 -0
  267. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/reference/prompt-templates.md +0 -0
  268. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/reference/safety-and-approvals.md +0 -0
  269. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/schemas/receipt.schema.json +0 -0
  270. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/schemas/repair-record.schema.json +0 -0
  271. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/schemas/rollout-record.schema.json +0 -0
  272. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/schemas/tasks.schema.json +0 -0
  273. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/action_scorecard.py +0 -0
  274. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/anticheat_scan.py +0 -0
  275. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/benchmark_harness.py +0 -0
  276. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/holdout_gate.py +0 -0
  277. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/inspect_loop.py +0 -0
  278. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/rollout_ledger.py +0 -0
  279. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_action_scorecard.py +0 -0
  280. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_anticheat_scan.py +0 -0
  281. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_benchmark_harness.py +0 -0
  282. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_contract_records.py +0 -0
  283. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_docs_adoption.py +0 -0
  284. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_docs_baseline.py +0 -0
  285. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_docs_claims.py +0 -0
  286. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_example_runnable.py +0 -0
  287. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_flaky_example.py +0 -0
  288. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_holdout_gate.py +0 -0
  289. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_inspect_loop.py +0 -0
  290. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_langgraph_recipe.py +0 -0
  291. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_langgraph_recipe_st3.py +0 -0
  292. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_metrics_cli.py +0 -0
  293. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_precommit_hook.py +0 -0
  294. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_resources.py +0 -0
  295. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_rollout_ledger.py +0 -0
  296. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_scaffold.py +0 -0
  297. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_schemas_metrics.py +0 -0
  298. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_self_eval.py +0 -0
  299. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_stop_firewall.py +0 -0
  300. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_temporal_recipe.py +0 -0
  301. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/test_validate_frontmatter.py +0 -0
  302. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/scripts/validate_frontmatter.py +0 -0
  303. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/skills/loop-architect/SKILL.md +0 -0
  304. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/skills/loop-contract/SKILL.md +0 -0
  305. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/skills/loop-engineer/SKILL.md +0 -0
  306. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/skills/loop-flywheel/SKILL.md +0 -0
  307. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/skills/loop-inspector/reference/patterns.md +0 -0
  308. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/skills/loop-repair/SKILL.md +0 -0
  309. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/skills/loop-runtime-monitor/SKILL.md +0 -0
  310. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/skills/loop-runtime-monitor/reference/patterns.md +0 -0
  311. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/AGENTS.md.tmpl +0 -0
  312. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/EVALS-rubric.md.tmpl +0 -0
  313. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/SPEC.md.tmpl +0 -0
  314. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/TASKS.json.tmpl +0 -0
  315. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/WORKFLOW.md.tmpl +0 -0
  316. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/extract-trace-metrics.sh +0 -0
  317. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/judge-rubric.sh +0 -0
  318. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/manifest.yaml.tmpl +0 -0
  319. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/terminal_state.json.tmpl +0 -0
  320. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/verify-fast.sh +0 -0
  321. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/verify-full.sh +0 -0
  322. {loop_engineer-0.8.0 → loop_engineer-0.9.0}/templates/verify-safety.sh +0 -0
@@ -1,11 +1,25 @@
1
1
  {
2
2
  "name": "loop-engineer",
3
- "version": "0.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "Design, launch, verify, repair, and improve agent loops. A Claude-Code-native architect+operator for long-running, verifiable, self-improving agentic-coding systems.",
5
- "author": { "name": "Sollan Systems", "url": "https://github.com/SollanSystems" },
5
+ "author": {
6
+ "name": "Sollan Systems",
7
+ "url": "https://github.com/SollanSystems"
8
+ },
6
9
  "homepage": "https://github.com/SollanSystems/loop-engineer",
7
10
  "repository": "https://github.com/SollanSystems/loop-engineer",
8
- "keywords": ["agent", "loop", "agentic", "verification", "harness", "orchestration", "self-improvement", "claude-code", "eval", "repair"],
11
+ "keywords": [
12
+ "agent",
13
+ "loop",
14
+ "agentic",
15
+ "verification",
16
+ "harness",
17
+ "orchestration",
18
+ "self-improvement",
19
+ "claude-code",
20
+ "eval",
21
+ "repair"
22
+ ],
9
23
  "license": "MIT",
10
24
  "hooks": {
11
25
  "Stop": [
@@ -0,0 +1,16 @@
1
+ version: 2
2
+ updates:
3
+ # Covers .github/workflows/*.yml and the root composite action.yml.
4
+ - package-ecosystem: "github-actions"
5
+ directory: "/"
6
+ schedule:
7
+ interval: "weekly"
8
+ groups:
9
+ actions:
10
+ patterns: ["*"]
11
+
12
+ # Runtime is stdlib-only; this watches the optional extras and any future pins.
13
+ - package-ecosystem: "pip"
14
+ directory: "/"
15
+ schedule:
16
+ interval: "weekly"
@@ -5,6 +5,9 @@ on:
5
5
  branches: [main]
6
6
  pull_request:
7
7
 
8
+ permissions:
9
+ contents: read
10
+
8
11
  jobs:
9
12
  gates:
10
13
  name: gates (py${{ matrix.python-version }})
@@ -14,14 +17,14 @@ jobs:
14
17
  matrix:
15
18
  python-version: ["3.10", "3.11", "3.12"]
16
19
  steps:
17
- - uses: actions/checkout@v4
20
+ - uses: actions/checkout@v7
18
21
 
19
- - uses: actions/setup-python@v5
22
+ - uses: actions/setup-python@v6
20
23
  with:
21
24
  python-version: ${{ matrix.python-version }}
22
25
 
23
26
  - name: Install gate dependencies
24
- run: python -m pip install --upgrade pip pyyaml pytest jsonschema
27
+ run: python -m pip install --upgrade pip pyyaml pytest jsonschema hypothesis
25
28
 
26
29
  - name: Frontmatter gate
27
30
  run: python -B scripts/validate_frontmatter.py
@@ -45,15 +48,27 @@ jobs:
45
48
 
46
49
  - name: Quickstart smoke test
47
50
  run: |
48
- python -B -m loop doctor examples/coverage-repair
51
+ python -B -m loop doctor --mode release examples/coverage-repair
49
52
  python -B -m loop inspect examples/coverage-repair
50
53
 
54
+ - name: Plan lint smoke test
55
+ run: |
56
+ python -B -m loop plan-lint --mode release examples/plans/coverage-repair.plan.json
57
+ if python -B -m loop plan-lint --mode release examples/plans/invalid/cyclic-dependency.plan.json; then
58
+ echo "::error::cyclic-dependency.plan.json unexpectedly passed plan-lint"
59
+ exit 1
60
+ fi
61
+ if python -B -m loop plan-lint --mode release examples/plans/invalid/missing-goal.plan.json; then
62
+ echo "::error::missing-goal.plan.json unexpectedly passed plan-lint"
63
+ exit 1
64
+ fi
65
+
51
66
  recipe-langgraph:
52
67
  name: recipe (langgraph)
53
68
  runs-on: ubuntu-latest
54
69
  steps:
55
- - uses: actions/checkout@v4
56
- - uses: actions/setup-python@v5
70
+ - uses: actions/checkout@v7
71
+ - uses: actions/setup-python@v6
57
72
  with:
58
73
  python-version: "3.12"
59
74
  - name: Install recipe dependencies
@@ -65,8 +80,8 @@ jobs:
65
80
  name: recipe (temporal)
66
81
  runs-on: ubuntu-latest
67
82
  steps:
68
- - uses: actions/checkout@v4
69
- - uses: actions/setup-python@v5
83
+ - uses: actions/checkout@v7
84
+ - uses: actions/setup-python@v6
70
85
  with:
71
86
  python-version: "3.12"
72
87
  - name: Install recipe dependencies
@@ -81,7 +96,7 @@ jobs:
81
96
  name: action (dogfood on flagship example)
82
97
  runs-on: ubuntu-latest
83
98
  steps:
84
- - uses: actions/checkout@v4
99
+ - uses: actions/checkout@v7
85
100
  # The repo root's live .loop/ is gitignored, so it does not exist in a fresh
86
101
  # CI checkout — the tracked flagship example is the contract the action gates
87
102
  # (doctor-clean, inspect 90/strong in the action's dependency-free install).
@@ -4,13 +4,16 @@ on:
4
4
  push:
5
5
  tags: ["v*"]
6
6
 
7
+ permissions:
8
+ contents: read
9
+
7
10
  jobs:
8
11
  build:
9
12
  runs-on: ubuntu-latest
10
13
  steps:
11
- - uses: actions/checkout@v4
14
+ - uses: actions/checkout@v7
12
15
 
13
- - uses: actions/setup-python@v5
16
+ - uses: actions/setup-python@v6
14
17
  with:
15
18
  python-version: "3.12"
16
19
 
@@ -38,7 +41,7 @@ jobs:
38
41
  /tmp/smoke/bin/loop doctor /tmp/smoke-loop
39
42
  /tmp/smoke/bin/loop inspect /tmp/smoke-loop || true
40
43
 
41
- - uses: actions/upload-artifact@v4
44
+ - uses: actions/upload-artifact@v7
42
45
  with:
43
46
  name: dist
44
47
  path: dist/
@@ -50,7 +53,7 @@ jobs:
50
53
  permissions:
51
54
  id-token: write
52
55
  steps:
53
- - uses: actions/download-artifact@v4
56
+ - uses: actions/download-artifact@v8
54
57
  with:
55
58
  name: dist
56
59
  path: dist/
@@ -1,19 +1,20 @@
1
- # Ephemeral workbench
2
- .tmp/
1
+ # Ephemeral workbench (root-anchored: examples/*-run fixtures may legitimately
2
+ # contain same-named dirs — .claude/, .taskmaster/, memory/ — that MUST track)
3
+ /.tmp/
3
4
 
4
5
  # Loop run telemetry (operating-contract state for the self-improvement run; not plugin content)
5
- .loop/
6
+ /.loop/
6
7
 
7
8
  # Machine-local Claude Code config + GSD audit telemetry (not plugin content)
8
- .claude/
9
- .gsd/
9
+ /.claude/
10
+ /.gsd/
10
11
 
11
12
  # Local session memory / private build narrative (not plugin content)
12
- memory/
13
+ /memory/
13
14
 
14
15
  # Workbench dirs (review scratch + roadmap drafts; not plugin content)
15
- review/
16
- roadmap/
16
+ /review/
17
+ /roadmap/
17
18
 
18
19
  # Python
19
20
  __pycache__/
@@ -14,6 +14,68 @@ All notable changes to `loop-engineer` are documented here.
14
14
  `WORKFLOW.md` and `README.md` are reworded to describe the mechanism; the 0.3.4
15
15
  history is left intact.
16
16
 
17
+ ## 0.9.0 — 2026-07-17
18
+
19
+ **The event-sourced kernel.** The contract gains a durable runtime substrate:
20
+ `loop-engineer/event@1` events in an append-only SQLite store
21
+ (`.loop/events.db` — WAL, `synchronous=FULL`, no-update/no-delete triggers,
22
+ `expected_sequence` compare-and-swap) folded by a deterministic reducer that
23
+ enforces FSM legality, the all-required completion gate, and terminal
24
+ immutability through the same `loop.fsm`/`loop.completion` modules the
25
+ writers use (#62). Around it: a canonical intermediate-state FSM with
26
+ unknown-state validation and writer timestamps (#59); `loop-engineer/plan@1`
27
+ — a Loop Plan IR with a `plan-lint` verb and a typed capability vocabulary
28
+ (#61); `loop-engineer/evidence@1` — hashed evidence objects with provenance,
29
+ re-verifiable byte-for-byte (#63); administrative `terminal_superseded`
30
+ events — the only event a terminated run admits, so a wrong terminal is
31
+ corrected on the record instead of edited in place (#64); a run-control event
32
+ vocabulary for approval, pause, and resume (#73); and explicit validation
33
+ modes `--mode basic|strict|release` across the CLI (#60).
34
+
35
+ **Runtime verbs.** `loop run` — event-sourced single-step dispatch with
36
+ crash-safe resume (#71); read-only `loop status` and `loop replay` (#70);
37
+ `loop simulate` — strictly read-only dry-run dispatch prediction (#75);
38
+ `approve` / `pause` / `resume` / `cancel` (#74); a subprocess-isolated
39
+ verifier runner — shlex argv, no shell, wall-clock cap, bounded output tail,
40
+ typed failure classes — plus typed fail-loud stubs for the not-yet-shipped
41
+ run modes (#72); `loop architect` as a typed fail-loud deferral (#76). And
42
+ `loop doctor` now composes an event-store consistency gate over
43
+ `status`/`replay` whenever `.loop/events.db` exists — one hard gate across
44
+ the file layer and the event log (#77).
45
+
46
+ **Completion-semantics hardening (Phase 0).** `Succeeded` now requires
47
+ **all** required criteria satisfied plus evidence — the prior any-true
48
+ reading was a correctness bug, fixed in one shared `loop/completion.py`
49
+ wired into the writer API, the integrations projection, and the contract
50
+ validator's G1 check. `terminal_state.json` is create-once (atomic;
51
+ `force` always raises); iteration ids are canonical ints (legacy decimal
52
+ strings stay read-compatible); `terminal@1` gains an additive
53
+ `completion_policy` (#48).
54
+
55
+ **Adversarial hardening.** A property-based kernel suite over FSM legality,
56
+ G1 completion, supersession, and replay determinism (#65), and a
57
+ process/security suite — real crash injection at code-controlled barriers,
58
+ verifier tampering, workspace-escape TOCTOU (#66). The `verify_evidence()`
59
+ symlink-swap TOCTOU that suite discovered (#67) is closed by fd-pinned
60
+ open-then-verify (#69), retiring the strict xfail marker.
61
+
62
+ **Scoreboard, funnel, housekeeping.** The ST5 harness scoreboard — 9 public
63
+ harnesses read through a foreign-layout registry with 8 vendored fixtures
64
+ (#41); contributor-funnel fixes — trigger-phrase disambiguation (#42),
65
+ documentation-completeness labels on the self-eval (#43),
66
+ `approval_requested`/`replanned` recognized as honest-red metrics tokens
67
+ (#44), metrics-clean RUNLOG seeding (#45); Dependabot version updates and
68
+ least-privilege workflow permissions (#46, #47).
69
+
70
+ **Known limitation.** Read verbs over the event store leave SQLite
71
+ `-wal`/`-shm` sidecars next to `.loop/events.db` (read-only connections
72
+ recreate them and cannot checkpoint on close). Store content is never
73
+ mutated, but tree-byte-identity checks over a store-backed workspace will
74
+ notice them.
75
+
76
+ Test baseline: 933 passed / 16 skipped with the `yaml`+`schemas` extras;
77
+ 864 / 85 in structural-fallback mode (PyYAML only).
78
+
17
79
  ## 0.8.0 — 2026-07-09
18
80
 
19
81
  **ST3 — integration adapters.** `loop/integrations.py`: an engine-neutral,
@@ -11,7 +11,7 @@ you open a PR, all of these must be green (CI runs them on every push):
11
11
  ```bash
12
12
  # from the repo root
13
13
  python3 scripts/validate_frontmatter.py # SKILL.md frontmatter
14
- python3 scripts/self_eval.py # 13 structural invariants
14
+ python3 scripts/self_eval.py # 13 structural/doc-completeness invariants
15
15
  python3 -m pytest -q scripts # the test suite
16
16
  python3 -m py_compile loop/*.py scripts/*.py
17
17
  python3 -m loop doctor examples/coverage-repair # quickstart still works
@@ -20,6 +20,16 @@ python3 -m loop inspect examples/coverage-repair
20
20
 
21
21
  If you don't have the deps, prefix with `uv run --with pyyaml --with pytest`.
22
22
 
23
+ `scripts/test_adversarial_kernel.py` also uses the dev-only `hypothesis` dependency: install it with `pip install -e ".[dev]"`, or use `uv run --with hypothesis --with pytest`. A plain install never pulls it in; without it, those property tests skip rather than fail.
24
+
25
+ `scripts/test_adversarial_process.py` spawns short-lived child processes and sends real `SIGKILL` signals to simulate mid-transaction crashes; it is POSIX-only (CI uses `ubuntu-latest`), requires no new dependency, and adds a few seconds of subprocess wall time.
26
+
27
+ Most `self_eval.py` checks verify documentation-completeness — that the suite's
28
+ canonical vocabulary (terminal states, repair-record fields, eval layers +
29
+ metrics) is present in the skill prose — not that a running loop enforces it. The
30
+ runtime/behavioral gate is `python3 -m loop doctor` and the contract's own
31
+ `verify-*` scripts, which is why both appear in the list above.
32
+
23
33
  ## Start here — the contributor funnel
24
34
 
25
35
  Every open starter issue names **the gate that proves the fix** — a
@@ -53,7 +63,10 @@ Loop-Engineer-conformant contract v1. Drafts for the seeded issues live in
53
63
 
54
64
  ## Authoring or editing a skill
55
65
 
56
- The `self_eval.py` checks encode hard rules — match them or the gate fails:
66
+ The `self_eval.py` checks encode hard rules — match them or the gate fails. Most
67
+ are documentation-completeness checks (the canonical vocabulary must appear in the
68
+ skill prose), not behavioral enforcement of a running loop — that gate is `loop
69
+ doctor` and the contract's own `verify-*` scripts:
57
70
 
58
71
  - **Frontmatter** must have `name:` and `description:`. The directory name **must equal**
59
72
  the frontmatter `name`. Keep the `description` a *quoted* YAML scalar (the suite quotes
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: loop-engineer
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: Portable Loop Contract Core: validate and inspect repo-native operating contracts for agent loops.
5
5
  Project-URL: Homepage, https://github.com/SollanSystems/loop-engineer
6
6
  Project-URL: Repository, https://github.com/SollanSystems/loop-engineer
@@ -29,6 +29,8 @@ License: MIT License
29
29
  License-File: LICENSE
30
30
  Keywords: agent,agentic,claude-code,eval,harness,loop,orchestration,repair,self-improvement,verification
31
31
  Requires-Python: >=3.10
32
+ Provides-Extra: dev
33
+ Requires-Dist: hypothesis>=6; extra == 'dev'
32
34
  Provides-Extra: schemas
33
35
  Requires-Dist: jsonschema>=4; extra == 'schemas'
34
36
  Provides-Extra: yaml
@@ -42,7 +44,7 @@ Description-Content-Type: text/markdown
42
44
  [![CI](https://github.com/SollanSystems/loop-engineer/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/SollanSystems/loop-engineer/actions/workflows/ci.yml)
43
45
  [![Python 3.10–3.12](https://img.shields.io/badge/python-3.10%E2%80%933.12-blue)](https://www.python.org/downloads/)
44
46
  [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE)
45
- [![Release](https://img.shields.io/badge/release-0.8.0-blue)](https://github.com/SollanSystems/loop-engineer/tags)
47
+ [![Release](https://img.shields.io/badge/release-0.9.0-blue)](https://github.com/SollanSystems/loop-engineer/tags)
46
48
 
47
49
  Long-running agents commit **false completion**. After context compaction they
48
50
  forget what "done" meant, optimize to the visible test, patch in circles, and
@@ -57,7 +59,11 @@ ships, on disk and runnable today:
57
59
  - a **held-out gate** and an **anti-cheat scan** built to catch a loop gaming its
58
60
  own verifier;
59
61
  - a runnable example whose `false_completion: false` is backed by a committed,
60
- real gate verdict — `.loop/artifacts/holdout-verdict.json`, not a hand-set flag.
62
+ real gate verdict — `.loop/artifacts/holdout-verdict.json`, not a hand-set flag;
63
+ - an **event-sourced runtime** — `run`, `status`, `replay`, `simulate`, and
64
+ approve/pause/resume/cancel over an append-only SQLite event log
65
+ (`.loop/events.db`), folded by a deterministic reducer that enforces the same
66
+ completion gate as the writers, with crash-safe single-step resume.
61
67
 
62
68
  ![The inspector scores a self-asserted DIY loop 0/weak, then the gate-backed example 90/strong — both runs live](docs/demo.gif)
63
69
 
@@ -161,6 +167,7 @@ directory, and need no agent runtime to run.
161
167
  {
162
168
  "ok": true,
163
169
  "validation_mode": "structural-fallback",
170
+ "requested_mode": "auto",
164
171
  "schemas_checked": [
165
172
  "loop-engineer/manifest@1",
166
173
  "loop-engineer/state@1",
@@ -176,6 +183,15 @@ default, or real JSON-Schema validation against `schemas/*.json` when the
176
183
  optional `jsonschema` dependency is present (`pip install -e ".[schemas]"`), in
177
184
  which case it reads `"jsonschema"`.
178
185
 
186
+ For `doctor`, `validate`, and `verify`, `--mode basic|strict|release` makes the
187
+ choice explicit. With no flag, the current auto-detect behavior is unchanged
188
+ for backward compatibility with existing foreign and scoreboard callers.
189
+ `--mode basic` always uses the structural fallback, regardless of whether
190
+ `jsonschema` happens to be installed. `--mode strict` and `--mode release`
191
+ require real JSON-Schema validation and fail non-zero rather than silently
192
+ downgrade if the `jsonschema` extra is missing. `release` currently has the
193
+ same behavior as `strict`; it is reserved for a stricter future policy.
194
+
179
195
  `inspect` is a static contract linter: it scores the loop contract's structure —
180
196
  what proof machinery is present and what is missing — without running the loop:
181
197
 
@@ -253,7 +269,7 @@ terminal outcome:
253
269
  .loop/
254
270
  manifest.yaml # contract metadata
255
271
  state.json # live FSM cursor
256
- terminal_state.json # final exit record; written once — emit refuses overwrite without force=True
272
+ terminal_state.json # final exit record; immutable once written
257
273
  artifacts/ # evidence bundles and intermediate outputs
258
274
  approvals/ # approval requests and resolutions
259
275
  checkpoints/ # recoverable snapshots
@@ -307,6 +323,12 @@ The portable core lives in `loop/` and validates schema-bearing artifacts in
307
323
  - `loop-engineer/state@1`
308
324
  - `loop-engineer/tasks@1`
309
325
  - `loop-engineer/terminal@1`
326
+ - `loop-engineer/receipt@1`
327
+ - `loop-engineer/repair@1`
328
+ - `loop-engineer/rollout@1`
329
+ - `loop-engineer/plan@1`
330
+ - `loop-engineer/event@1`
331
+ - `loop-engineer/evidence@1`
310
332
 
311
333
  ### Claude Code plugin
312
334
 
@@ -338,13 +360,14 @@ otherwise, the stop is blocked with the exact doctor issues. No-op without
338
360
  **Any Python runtime** — `loop.emit` is a pure-stdlib writer for foreign
339
361
  orchestrators (LangGraph, or anything that can call four functions):
340
362
  `open_contract`, `append_iteration`, `append_receipt`, `terminate`. The writer
341
- refuses an evidence-free `Succeeded` at write time. Recipe:
363
+ refuses `Succeeded` unless every declared criterion is true and evidence is
364
+ present. Recipe:
342
365
  [docs/integrations/langgraph.md](docs/integrations/langgraph.md).
343
366
 
344
367
  **CI** — one workflow step validates the contract and publishes a scorecard:
345
368
 
346
369
  ```yaml
347
- - uses: SollanSystems/loop-engineer@v0.8.0
370
+ - uses: SollanSystems/loop-engineer@v0.9.0
348
371
  with:
349
372
  path: "."
350
373
  ```
@@ -426,16 +449,19 @@ claude plugin validate --strict .claude-plugin/plugin.json
426
449
  ```
427
450
 
428
451
  The structural self-eval checks skill presence, frontmatter, cross-links,
429
- terminal-state coverage, repair-record fields, eval metrics, templates, secret
430
- patterns, dispatch examples, the bring-your-own-verifier default, the MIT
431
- license, and README differentiation.
452
+ templates, secret patterns, dispatch examples, the bring-your-own-verifier
453
+ default, the MIT license, and README differentiation. Three further checks are
454
+ documentation-completeness scans: they confirm the canonical vocabulary for
455
+ terminal-state coverage, repair-record fields, and eval metrics is present in the
456
+ skill prose — not that a running loop enforces it (that runtime gate is `loop
457
+ doctor` and the contract's own `verify-*` scripts).
432
458
 
433
459
  ---
434
460
 
435
461
  ## Status
436
462
 
437
- - Version: `0.8.0`
438
- - Release tag: `v0.8.0` (PyPI publish trigger; plugin tags through 0.6.0 used `loop-engineer--v<version>`)
463
+ - Version: `0.9.0`
464
+ - Release tag: `v0.9.0` (PyPI publish trigger; plugin tags through 0.6.0 used `loop-engineer--v<version>`)
439
465
  - License: MIT
440
466
  - Primary interface: Claude Code plugin
441
467
  - Portable core: Python CLI + JSON schemas
@@ -5,7 +5,7 @@
5
5
  [![CI](https://github.com/SollanSystems/loop-engineer/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/SollanSystems/loop-engineer/actions/workflows/ci.yml)
6
6
  [![Python 3.10–3.12](https://img.shields.io/badge/python-3.10%E2%80%933.12-blue)](https://www.python.org/downloads/)
7
7
  [![License: MIT](https://img.shields.io/badge/license-MIT-green)](LICENSE)
8
- [![Release](https://img.shields.io/badge/release-0.8.0-blue)](https://github.com/SollanSystems/loop-engineer/tags)
8
+ [![Release](https://img.shields.io/badge/release-0.9.0-blue)](https://github.com/SollanSystems/loop-engineer/tags)
9
9
 
10
10
  Long-running agents commit **false completion**. After context compaction they
11
11
  forget what "done" meant, optimize to the visible test, patch in circles, and
@@ -20,7 +20,11 @@ ships, on disk and runnable today:
20
20
  - a **held-out gate** and an **anti-cheat scan** built to catch a loop gaming its
21
21
  own verifier;
22
22
  - a runnable example whose `false_completion: false` is backed by a committed,
23
- real gate verdict — `.loop/artifacts/holdout-verdict.json`, not a hand-set flag.
23
+ real gate verdict — `.loop/artifacts/holdout-verdict.json`, not a hand-set flag;
24
+ - an **event-sourced runtime** — `run`, `status`, `replay`, `simulate`, and
25
+ approve/pause/resume/cancel over an append-only SQLite event log
26
+ (`.loop/events.db`), folded by a deterministic reducer that enforces the same
27
+ completion gate as the writers, with crash-safe single-step resume.
24
28
 
25
29
  ![The inspector scores a self-asserted DIY loop 0/weak, then the gate-backed example 90/strong — both runs live](docs/demo.gif)
26
30
 
@@ -124,6 +128,7 @@ directory, and need no agent runtime to run.
124
128
  {
125
129
  "ok": true,
126
130
  "validation_mode": "structural-fallback",
131
+ "requested_mode": "auto",
127
132
  "schemas_checked": [
128
133
  "loop-engineer/manifest@1",
129
134
  "loop-engineer/state@1",
@@ -139,6 +144,15 @@ default, or real JSON-Schema validation against `schemas/*.json` when the
139
144
  optional `jsonschema` dependency is present (`pip install -e ".[schemas]"`), in
140
145
  which case it reads `"jsonschema"`.
141
146
 
147
+ For `doctor`, `validate`, and `verify`, `--mode basic|strict|release` makes the
148
+ choice explicit. With no flag, the current auto-detect behavior is unchanged
149
+ for backward compatibility with existing foreign and scoreboard callers.
150
+ `--mode basic` always uses the structural fallback, regardless of whether
151
+ `jsonschema` happens to be installed. `--mode strict` and `--mode release`
152
+ require real JSON-Schema validation and fail non-zero rather than silently
153
+ downgrade if the `jsonschema` extra is missing. `release` currently has the
154
+ same behavior as `strict`; it is reserved for a stricter future policy.
155
+
142
156
  `inspect` is a static contract linter: it scores the loop contract's structure —
143
157
  what proof machinery is present and what is missing — without running the loop:
144
158
 
@@ -216,7 +230,7 @@ terminal outcome:
216
230
  .loop/
217
231
  manifest.yaml # contract metadata
218
232
  state.json # live FSM cursor
219
- terminal_state.json # final exit record; written once — emit refuses overwrite without force=True
233
+ terminal_state.json # final exit record; immutable once written
220
234
  artifacts/ # evidence bundles and intermediate outputs
221
235
  approvals/ # approval requests and resolutions
222
236
  checkpoints/ # recoverable snapshots
@@ -270,6 +284,12 @@ The portable core lives in `loop/` and validates schema-bearing artifacts in
270
284
  - `loop-engineer/state@1`
271
285
  - `loop-engineer/tasks@1`
272
286
  - `loop-engineer/terminal@1`
287
+ - `loop-engineer/receipt@1`
288
+ - `loop-engineer/repair@1`
289
+ - `loop-engineer/rollout@1`
290
+ - `loop-engineer/plan@1`
291
+ - `loop-engineer/event@1`
292
+ - `loop-engineer/evidence@1`
273
293
 
274
294
  ### Claude Code plugin
275
295
 
@@ -301,13 +321,14 @@ otherwise, the stop is blocked with the exact doctor issues. No-op without
301
321
  **Any Python runtime** — `loop.emit` is a pure-stdlib writer for foreign
302
322
  orchestrators (LangGraph, or anything that can call four functions):
303
323
  `open_contract`, `append_iteration`, `append_receipt`, `terminate`. The writer
304
- refuses an evidence-free `Succeeded` at write time. Recipe:
324
+ refuses `Succeeded` unless every declared criterion is true and evidence is
325
+ present. Recipe:
305
326
  [docs/integrations/langgraph.md](docs/integrations/langgraph.md).
306
327
 
307
328
  **CI** — one workflow step validates the contract and publishes a scorecard:
308
329
 
309
330
  ```yaml
310
- - uses: SollanSystems/loop-engineer@v0.8.0
331
+ - uses: SollanSystems/loop-engineer@v0.9.0
311
332
  with:
312
333
  path: "."
313
334
  ```
@@ -389,16 +410,19 @@ claude plugin validate --strict .claude-plugin/plugin.json
389
410
  ```
390
411
 
391
412
  The structural self-eval checks skill presence, frontmatter, cross-links,
392
- terminal-state coverage, repair-record fields, eval metrics, templates, secret
393
- patterns, dispatch examples, the bring-your-own-verifier default, the MIT
394
- license, and README differentiation.
413
+ templates, secret patterns, dispatch examples, the bring-your-own-verifier
414
+ default, the MIT license, and README differentiation. Three further checks are
415
+ documentation-completeness scans: they confirm the canonical vocabulary for
416
+ terminal-state coverage, repair-record fields, and eval metrics is present in the
417
+ skill prose — not that a running loop enforces it (that runtime gate is `loop
418
+ doctor` and the contract's own `verify-*` scripts).
395
419
 
396
420
  ---
397
421
 
398
422
  ## Status
399
423
 
400
- - Version: `0.8.0`
401
- - Release tag: `v0.8.0` (PyPI publish trigger; plugin tags through 0.6.0 used `loop-engineer--v<version>`)
424
+ - Version: `0.9.0`
425
+ - Release tag: `v0.9.0` (PyPI publish trigger; plugin tags through 0.6.0 used `loop-engineer--v<version>`)
402
426
  - License: MIT
403
427
  - Primary interface: Claude Code plugin
404
428
  - Portable core: Python CLI + JSON schemas
@@ -29,7 +29,7 @@ inputs:
29
29
  runs:
30
30
  using: "composite"
31
31
  steps:
32
- - uses: actions/setup-python@v5
32
+ - uses: actions/setup-python@v6
33
33
  with:
34
34
  python-version: ${{ inputs.python-version }}
35
35
 
@@ -0,0 +1,104 @@
1
+ # ADR 0001: Separate the proof kernel from the execution runtime
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-07-12
5
+ - **Decision owners:** Loop Engineer maintainers
6
+
7
+ ## Context
8
+
9
+ Loop Engineer began as a portable contract and proof layer. Its current core is
10
+ valuable because it defines typed terminal states, evidence-gated completion,
11
+ anti-cheat checks, bounded repair, and repo-native state without binding those
12
+ concepts to a particular orchestration framework.
13
+
14
+ The product goal is broader: a user should be able to provide a complex goal,
15
+ receive a reviewable loop design, execute it through interchangeable agents and
16
+ tools, pause for approvals, recover from failure, and obtain an independently
17
+ verified terminal result.
18
+
19
+ Keeping execution out of the project would preserve a small scope, but it would
20
+ also leave the most important invariants as instructions that a host agent may
21
+ ignore. Folding every concern into one package would create the opposite
22
+ problem: provider-specific execution details would contaminate the portable
23
+ proof protocol.
24
+
25
+ ## Decision
26
+
27
+ Loop Engineer will have two first-party layers with a strict dependency
28
+ direction.
29
+
30
+ ### 1. Proof kernel
31
+
32
+ The proof kernel is the stable, runtime-neutral protocol. It owns:
33
+
34
+ - contract and schema versions;
35
+ - deterministic completion-policy evaluation;
36
+ - legal state and terminal-state projection;
37
+ - evidence and provenance rules;
38
+ - verifier and anti-cheat interfaces;
39
+ - policy validation and conformance tests;
40
+ - event reduction and replay semantics.
41
+
42
+ The kernel must not import model providers, agent frameworks, or workflow
43
+ engines. It may be embedded by foreign runtimes.
44
+
45
+ ### 2. Execution runtime
46
+
47
+ The execution runtime interprets a validated Loop Plan and owns:
48
+
49
+ - planning and task scheduling;
50
+ - worker leases and attempt numbers;
51
+ - agent and tool dispatch;
52
+ - budgets, retries, timeouts, pause, resume, and cancellation;
53
+ - approvals and side-effect policy;
54
+ - checkpointing and crash recovery;
55
+ - persistence of immutable events and artifacts.
56
+
57
+ The runtime depends on the kernel. The kernel never depends on the runtime.
58
+
59
+ ## Governing rule
60
+
61
+ **Agents propose; the kernel disposes.**
62
+
63
+ An agent may propose a command, patch, transition, or completion claim. Only the
64
+ kernel may validate and commit a state transition or terminal result.
65
+
66
+ ## Immediate consequences
67
+
68
+ 1. `Succeeded` uses an explicit completion policy. The first supported policy is
69
+ `all_required`; every declared criterion must be proven true.
70
+ 2. Terminal records are immutable. Corrections will be represented by separate,
71
+ auditable administrative events rather than file replacement.
72
+ 3. New state writers use canonical integer iteration identifiers. Legacy
73
+ numeric strings remain a read-compatibility concern until a versioned state
74
+ migration removes them.
75
+ 4. The next persistence milestone will introduce an `EventStore` protocol and a
76
+ SQLite/WAL implementation. JSON and Markdown files become projections rather
77
+ than the sole authoritative state.
78
+ 5. Provider and model selection will be capability-based, not encoded in the
79
+ portable contract as vendor model names.
80
+
81
+ ## Non-goals of this decision
82
+
83
+ This ADR does not select a distributed scheduler, hosted control plane, web UI,
84
+ or model provider. It also does not make structural evidence equivalent to
85
+ cryptographic attestation. Those require separate decisions.
86
+
87
+ ## Rejected alternatives
88
+
89
+ ### Remain contract-only
90
+
91
+ Rejected because the desired product must execute and govern loops end to end.
92
+ A prose-only state machine cannot reliably enforce concurrency, approvals,
93
+ budgets, or immutable terminal decisions.
94
+
95
+ ### Build a monolithic provider-specific agent framework
96
+
97
+ Rejected because it would erase the strongest differentiation: a portable proof
98
+ contract that can sit above multiple runtimes.
99
+
100
+ ### Permit terminal overwrite for operator convenience
101
+
102
+ Rejected because an overwritten terminal record destroys audit history and
103
+ creates a race in which a later writer can launder an earlier result. A future
104
+ supersession event can preserve both the original decision and the correction.