loop-engineer 0.8.0__tar.gz → 0.10.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 (329) hide show
  1. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.claude-plugin/plugin.json +17 -3
  2. loop_engineer-0.10.0/.github/dependabot.yml +16 -0
  3. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.github/workflows/ci.yml +24 -9
  4. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.github/workflows/publish.yml +7 -4
  5. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.gitignore +9 -8
  6. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/CHANGELOG.md +146 -0
  7. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/CONTRIBUTING.md +15 -2
  8. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/PKG-INFO +41 -11
  9. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/README.md +38 -10
  10. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/action.yml +43 -2
  11. loop_engineer-0.10.0/docs/adr/0001-proof-kernel-and-runtime.md +104 -0
  12. loop_engineer-0.10.0/docs/gap-reports/scoreboard.md +296 -0
  13. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/gap-reports/superpowers.md +5 -4
  14. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/plans/2026-07-08-v0.8.0-composes-the-field.md +1 -1
  15. loop_engineer-0.10.0/docs/superpowers/plans/2026-07-09-st5-harness-scoreboard.md +39 -0
  16. loop_engineer-0.10.0/docs/superpowers/specs/2026-07-09-st5-harness-scoreboard-design.md +104 -0
  17. loop_engineer-0.10.0/examples/agent-os-run/README.md +52 -0
  18. loop_engineer-0.10.0/examples/agent-os-run/agent-os/product/mission.md +23 -0
  19. loop_engineer-0.10.0/examples/agent-os-run/agent-os/product/roadmap.md +16 -0
  20. loop_engineer-0.10.0/examples/agent-os-run/agent-os/specs/2026-07-09-1030-csv-dedupe/plan.md +31 -0
  21. loop_engineer-0.10.0/examples/agent-os-run/agent-os/specs/2026-07-09-1030-csv-dedupe/references.md +23 -0
  22. loop_engineer-0.10.0/examples/agent-os-run/agent-os/specs/2026-07-09-1030-csv-dedupe/shape.md +32 -0
  23. loop_engineer-0.10.0/examples/agent-os-run/agent-os/specs/2026-07-09-1030-csv-dedupe/standards.md +25 -0
  24. loop_engineer-0.10.0/examples/agent-os-run/agent-os/standards/backend/data-imports.md +16 -0
  25. loop_engineer-0.10.0/examples/agent-os-run/agent-os/standards/index.yml +5 -0
  26. loop_engineer-0.10.0/examples/bmad-run/README.md +39 -0
  27. loop_engineer-0.10.0/examples/bmad-run/_bmad/bmm/config.yaml +15 -0
  28. loop_engineer-0.10.0/examples/bmad-run/_bmad-output/implementation-artifacts/1-1-deduplicate-csv-rows.md +83 -0
  29. loop_engineer-0.10.0/examples/bmad-run/_bmad-output/implementation-artifacts/epic-1-retro-2026-07-09.md +54 -0
  30. loop_engineer-0.10.0/examples/bmad-run/_bmad-output/implementation-artifacts/sprint-status.yaml +38 -0
  31. loop_engineer-0.10.0/examples/bmad-run/_bmad-output/planning-artifacts/epics.md +48 -0
  32. loop_engineer-0.10.0/examples/bmad-run/_bmad-output/planning-artifacts/prd.md +48 -0
  33. loop_engineer-0.10.0/examples/bmad-run/src/import_contacts.py +55 -0
  34. loop_engineer-0.10.0/examples/bmad-run/tests/test_import_contacts.py +59 -0
  35. loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/1235-analysis.md +51 -0
  36. loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/1235.md +43 -0
  37. loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/epic.md +79 -0
  38. loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/execution-status.md +16 -0
  39. loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/github-mapping.md +7 -0
  40. loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/updates/1235/progress.md +30 -0
  41. loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/updates/1235/stream-A.md +18 -0
  42. loop_engineer-0.10.0/examples/ccpm-run/.claude/prds/csv-dedupe.md +63 -0
  43. loop_engineer-0.10.0/examples/ccpm-run/README.md +45 -0
  44. loop_engineer-0.10.0/examples/coverage-repair/.loop/approvals/.gitkeep +0 -0
  45. loop_engineer-0.10.0/examples/coverage-repair/.loop/artifacts/holdout-run.txt +49 -0
  46. loop_engineer-0.10.0/examples/coverage-repair/.loop/artifacts/holdout-verdict.json +26 -0
  47. loop_engineer-0.10.0/examples/coverage-repair/.loop/artifacts/verify-T1.json +8 -0
  48. loop_engineer-0.10.0/examples/coverage-repair/.loop/artifacts/verify-T2-iter1.json +8 -0
  49. loop_engineer-0.10.0/examples/coverage-repair/.loop/artifacts/verify-T2.json +8 -0
  50. loop_engineer-0.10.0/examples/coverage-repair/.loop/checkpoints/.gitkeep +0 -0
  51. loop_engineer-0.10.0/examples/coverage-repair/.loop/manifest.yaml +53 -0
  52. loop_engineer-0.10.0/examples/coverage-repair/.loop/memory/.gitkeep +0 -0
  53. loop_engineer-0.10.0/examples/coverage-repair/.loop/repair/iter-002.json +12 -0
  54. loop_engineer-0.10.0/examples/coverage-repair/.loop/state.json +14 -0
  55. loop_engineer-0.10.0/examples/evidence/invalid/absolute-uri.json +10 -0
  56. loop_engineer-0.10.0/examples/evidence/invalid/bad-sha256-pattern.json +10 -0
  57. loop_engineer-0.10.0/examples/evidence/invalid/missing-required-field.json +9 -0
  58. loop_engineer-0.10.0/examples/evidence/invalid/scheme-uri.json +10 -0
  59. loop_engineer-0.10.0/examples/evidence/valid-evidence.json +22 -0
  60. loop_engineer-0.10.0/examples/flaky-test-triage/.loop/artifacts/holdout-verdict.json +21 -0
  61. loop_engineer-0.10.0/examples/flaky-test-triage/.loop/artifacts/verify-T1-iter1.json +8 -0
  62. loop_engineer-0.10.0/examples/flaky-test-triage/.loop/artifacts/verify-T1.json +9 -0
  63. loop_engineer-0.10.0/examples/flaky-test-triage/.loop/manifest.yaml +53 -0
  64. loop_engineer-0.10.0/examples/flaky-test-triage/.loop/repair/iter-002.json +12 -0
  65. loop_engineer-0.10.0/examples/flaky-test-triage/.loop/state.json +14 -0
  66. loop_engineer-0.10.0/examples/flaky-test-triage/.loop/terminal_state.json +14 -0
  67. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/langgraph-emit/graph_example.py +0 -6
  68. loop_engineer-0.10.0/examples/naive-loop/.loop/state.json +5 -0
  69. loop_engineer-0.10.0/examples/openspec-run/README.md +46 -0
  70. loop_engineer-0.10.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/.openspec.yaml +2 -0
  71. loop_engineer-0.10.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/design.md +49 -0
  72. loop_engineer-0.10.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/proposal.md +31 -0
  73. loop_engineer-0.10.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/specs/csv-dedupe/spec.md +37 -0
  74. loop_engineer-0.10.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/tasks.md +25 -0
  75. loop_engineer-0.10.0/examples/openspec-run/openspec/config.yaml +22 -0
  76. loop_engineer-0.10.0/examples/openspec-run/openspec/specs/csv-dedupe/spec.md +41 -0
  77. loop_engineer-0.10.0/examples/plans/coverage-repair.plan.json +32 -0
  78. loop_engineer-0.10.0/examples/plans/invalid/cyclic-dependency.plan.json +11 -0
  79. loop_engineer-0.10.0/examples/plans/invalid/missing-goal.plan.json +6 -0
  80. loop_engineer-0.10.0/examples/prp-run/.claude/PRPs/plans/completed/csv-dedupe.plan.md +98 -0
  81. loop_engineer-0.10.0/examples/prp-run/.claude/PRPs/prds/csv-dedupe.prd.md +65 -0
  82. loop_engineer-0.10.0/examples/prp-run/.claude/PRPs/reports/csv-dedupe-report.md +86 -0
  83. loop_engineer-0.10.0/examples/prp-run/.claude/PRPs/reviews/pr-42-cycle-0.verdict.json +4 -0
  84. loop_engineer-0.10.0/examples/prp-run/.claude/PRPs/reviews/pr-42-review.md +95 -0
  85. loop_engineer-0.10.0/examples/prp-run/.claude/prp-loop.run.log +10 -0
  86. loop_engineer-0.10.0/examples/prp-run/.claude/prp-loop.state.json +30 -0
  87. loop_engineer-0.10.0/examples/prp-run/README.md +43 -0
  88. loop_engineer-0.10.0/examples/ruflo-run/.claude-flow/metrics/swarm-activity.json +18 -0
  89. loop_engineer-0.10.0/examples/ruflo-run/.claude-flow/metrics/v3-progress.json +26 -0
  90. loop_engineer-0.10.0/examples/ruflo-run/.claude-flow/security/audit-status.json +8 -0
  91. loop_engineer-0.10.0/examples/ruflo-run/.hive-mind/sessions/hive-mind-prompt-swarm-2026-07-09.txt +46 -0
  92. loop_engineer-0.10.0/examples/ruflo-run/.mcp.json +17 -0
  93. loop_engineer-0.10.0/examples/ruflo-run/.swarm/memory-export.json +78 -0
  94. loop_engineer-0.10.0/examples/ruflo-run/README.md +46 -0
  95. loop_engineer-0.10.0/examples/spec-kit-run/.specify/feature.json +1 -0
  96. loop_engineer-0.10.0/examples/spec-kit-run/.specify/memory/constitution.md +35 -0
  97. loop_engineer-0.10.0/examples/spec-kit-run/README.md +27 -0
  98. loop_engineer-0.10.0/examples/spec-kit-run/specs/001-csv-dedupe/checklists/requirements.md +32 -0
  99. loop_engineer-0.10.0/examples/spec-kit-run/specs/001-csv-dedupe/plan.md +71 -0
  100. loop_engineer-0.10.0/examples/spec-kit-run/specs/001-csv-dedupe/quickstart.md +38 -0
  101. loop_engineer-0.10.0/examples/spec-kit-run/specs/001-csv-dedupe/research.md +32 -0
  102. loop_engineer-0.10.0/examples/spec-kit-run/specs/001-csv-dedupe/spec.md +74 -0
  103. loop_engineer-0.10.0/examples/spec-kit-run/specs/001-csv-dedupe/tasks.md +74 -0
  104. loop_engineer-0.10.0/examples/task-master-run/.taskmaster/config.json +32 -0
  105. loop_engineer-0.10.0/examples/task-master-run/.taskmaster/docs/prd.txt +42 -0
  106. loop_engineer-0.10.0/examples/task-master-run/.taskmaster/reports/task-complexity-report.json +37 -0
  107. loop_engineer-0.10.0/examples/task-master-run/.taskmaster/state.json +9 -0
  108. loop_engineer-0.10.0/examples/task-master-run/.taskmaster/tasks/task_001.txt +17 -0
  109. loop_engineer-0.10.0/examples/task-master-run/.taskmaster/tasks/tasks.json +73 -0
  110. loop_engineer-0.10.0/examples/task-master-run/.taskmaster/templates/example_prd.txt +32 -0
  111. loop_engineer-0.10.0/examples/task-master-run/CLAUDE.md +57 -0
  112. loop_engineer-0.10.0/examples/task-master-run/README.md +38 -0
  113. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/temporal-certify/workflow_example.py +0 -6
  114. loop_engineer-0.10.0/loop/__init__.py +30 -0
  115. loop_engineer-0.10.0/loop/__main__.py +414 -0
  116. loop_engineer-0.10.0/loop/architect.py +39 -0
  117. loop_engineer-0.10.0/loop/chain.py +88 -0
  118. loop_engineer-0.10.0/loop/completion.py +73 -0
  119. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/loop/contract.py +205 -21
  120. loop_engineer-0.10.0/loop/emit.py +399 -0
  121. loop_engineer-0.10.0/loop/events.py +388 -0
  122. loop_engineer-0.10.0/loop/evidence.py +194 -0
  123. loop_engineer-0.10.0/loop/foreign.py +381 -0
  124. loop_engineer-0.10.0/loop/fsm.py +67 -0
  125. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/loop/integrations.py +63 -9
  126. loop_engineer-0.10.0/loop/migrate.py +45 -0
  127. loop_engineer-0.10.0/loop/plan.py +267 -0
  128. loop_engineer-0.10.0/loop/reducer.py +199 -0
  129. loop_engineer-0.10.0/loop/runcontrol.py +120 -0
  130. loop_engineer-0.10.0/loop/runner.py +249 -0
  131. loop_engineer-0.10.0/loop/runtime.py +293 -0
  132. loop_engineer-0.10.0/loop/simulate.py +120 -0
  133. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/pyproject.toml +3 -1
  134. loop_engineer-0.10.0/reference/repo-os-contract.md +1043 -0
  135. loop_engineer-0.10.0/schemas/event.schema.json +35 -0
  136. loop_engineer-0.10.0/schemas/evidence.schema.json +46 -0
  137. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/schemas/manifest.schema.json +1 -0
  138. loop_engineer-0.10.0/schemas/plan.schema.json +23 -0
  139. loop_engineer-0.10.0/schemas/state.schema.json +103 -0
  140. loop_engineer-0.10.0/schemas/terminal.schema.json +90 -0
  141. loop_engineer-0.10.0/scripts/chain_fixtures.py +66 -0
  142. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/metrics.py +2 -2
  143. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/runtime_monitor.py +14 -3
  144. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/self_eval.py +20 -6
  145. loop_engineer-0.10.0/scripts/test_adversarial_chain.py +345 -0
  146. loop_engineer-0.10.0/scripts/test_adversarial_kernel.py +264 -0
  147. loop_engineer-0.10.0/scripts/test_adversarial_process.py +207 -0
  148. loop_engineer-0.10.0/scripts/test_ci_release_mode.py +27 -0
  149. loop_engineer-0.10.0/scripts/test_completion_policy.py +118 -0
  150. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_conformance.py +1 -1
  151. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_docs_version.py +13 -2
  152. loop_engineer-0.10.0/scripts/test_doctor_eventstore.py +420 -0
  153. loop_engineer-0.10.0/scripts/test_emit.py +358 -0
  154. loop_engineer-0.10.0/scripts/test_event_chain.py +487 -0
  155. loop_engineer-0.10.0/scripts/test_eventstore.py +296 -0
  156. loop_engineer-0.10.0/scripts/test_evidence.py +234 -0
  157. loop_engineer-0.10.0/scripts/test_foreign_inspect.py +186 -0
  158. loop_engineer-0.10.0/scripts/test_fsm.py +100 -0
  159. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_integrations.py +61 -4
  160. loop_engineer-0.10.0/scripts/test_loop_architect_cli.py +146 -0
  161. loop_engineer-0.10.0/scripts/test_loop_cli.py +301 -0
  162. loop_engineer-0.10.0/scripts/test_loop_cli_status_replay.py +261 -0
  163. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_loop_contract_core.py +68 -1
  164. loop_engineer-0.10.0/scripts/test_loop_runcontrol_cli.py +377 -0
  165. loop_engineer-0.10.0/scripts/test_loop_simulate_cli.py +211 -0
  166. loop_engineer-0.10.0/scripts/test_loop_simulate_zero_writes.py +116 -0
  167. loop_engineer-0.10.0/scripts/test_manifest_extra_states_schema.py +38 -0
  168. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_metrics.py +17 -0
  169. loop_engineer-0.10.0/scripts/test_migrate_cli.py +128 -0
  170. loop_engineer-0.10.0/scripts/test_plan_schema.py +225 -0
  171. loop_engineer-0.10.0/scripts/test_reducer.py +317 -0
  172. loop_engineer-0.10.0/scripts/test_runner_dispatch.py +129 -0
  173. loop_engineer-0.10.0/scripts/test_runner_verifier.py +158 -0
  174. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_runtime_monitor.py +18 -0
  175. loop_engineer-0.10.0/scripts/test_state_vocabulary.py +59 -0
  176. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_template_roundtrip.py +3 -16
  177. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_wheel_selfcontained.py +11 -0
  178. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-evals/SKILL.md +1 -1
  179. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-inspector/SKILL.md +1 -1
  180. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-run/SKILL.md +1 -1
  181. loop_engineer-0.10.0/templates/RUNLOG.md.tmpl +31 -0
  182. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/state.json.tmpl +1 -1
  183. loop_engineer-0.8.0/loop/__init__.py +0 -17
  184. loop_engineer-0.8.0/loop/__main__.py +0 -176
  185. loop_engineer-0.8.0/loop/emit.py +0 -258
  186. loop_engineer-0.8.0/loop/foreign.py +0 -69
  187. loop_engineer-0.8.0/reference/repo-os-contract.md +0 -546
  188. loop_engineer-0.8.0/schemas/state.schema.json +0 -25
  189. loop_engineer-0.8.0/schemas/terminal.schema.json +0 -19
  190. loop_engineer-0.8.0/scripts/test_emit.py +0 -178
  191. loop_engineer-0.8.0/scripts/test_foreign_inspect.py +0 -84
  192. loop_engineer-0.8.0/scripts/test_loop_cli.py +0 -149
  193. loop_engineer-0.8.0/templates/RUNLOG.md.tmpl +0 -42
  194. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.claude-plugin/marketplace.json +0 -0
  195. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  196. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  197. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  198. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  199. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.pre-commit-hooks.yaml +0 -0
  200. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/CODE_OF_CONDUCT.md +0 -0
  201. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/GLOSSARY.md +0 -0
  202. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/LICENSE +0 -0
  203. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/SECURITY.md +0 -0
  204. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/ROADMAP-v1.0.md +0 -0
  205. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/01-good-first-qw9-trigger-phrases.md +0 -0
  206. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/02-good-first-qw10-self-eval-labels.md +0 -0
  207. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/03-good-first-emit-metrics-vocabulary.md +0 -0
  208. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/04-help-wanted-openhands-recipe.md +0 -0
  209. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/05-help-wanted-ruflo-recipe.md +0 -0
  210. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/06-help-wanted-gap-reports.md +0 -0
  211. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/07-help-wanted-emit-scaffold-runlog-seed.md +0 -0
  212. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/demo.cast +0 -0
  213. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/demo.gif +0 -0
  214. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/integrations/langgraph.md +0 -0
  215. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/integrations/temporal.md +0 -0
  216. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/metrics-baseline.json +0 -0
  217. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/social-card.png +0 -0
  218. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/plans/2026-06-20-loop-engineer-v1.md +0 -0
  219. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/plans/2026-06-30-loop-engineer-v1.0-roadmap.md +0 -0
  220. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/plans/2026-07-03-adoption-slices.md +0 -0
  221. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-06-20-loop-engineer-design.md +0 -0
  222. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-06-30-st1-metrics-baseline.md +0 -0
  223. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-06-30-st2-portable-contract-spec.md +0 -0
  224. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-06-30-st3-integration-adapters.md +0 -0
  225. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-06-30-v04-credibility-enforcement.md +0 -0
  226. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-07-03-adoption-slices-design.md +0 -0
  227. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-07-08-v0.8.0-composes-the-field-design.md +0 -0
  228. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/evals/cases/structural.json +0 -0
  229. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/evals/rubric.md +0 -0
  230. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/ADR.md +0 -0
  231. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/README.md +0 -0
  232. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/RUNLOG.md +0 -0
  233. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/SPEC.md +0 -0
  234. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/TASKS.json +0 -0
  235. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/WORKFLOW.md +0 -0
  236. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/scripts/run-example +0 -0
  237. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/scripts/verify-fast +0 -0
  238. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/scripts/verify-full +0 -0
  239. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/target/manifest.json +0 -0
  240. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/target/measure_coverage.py +0 -0
  241. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/target/pricing.py +0 -0
  242. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/target/test_holdout.py +0 -0
  243. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/target/test_visible.py +0 -0
  244. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/terminal_state.json +0 -0
  245. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/README.md +0 -0
  246. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/RUNLOG.md +0 -0
  247. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/SPEC.md +0 -0
  248. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/TASKS.json +0 -0
  249. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/WORKFLOW.md +0 -0
  250. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/scripts/run-example +0 -0
  251. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/scripts/verify-fast +0 -0
  252. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/scripts/verify-full +0 -0
  253. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/target/jobs.py +0 -0
  254. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/target/manifest.json +0 -0
  255. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/target/measure_stability.py +0 -0
  256. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/target/test_holdout.py +0 -0
  257. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/target/test_visible.py +0 -0
  258. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/langgraph-emit/README.md +0 -0
  259. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/naive-loop/README.md +0 -0
  260. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/superpowers-run/.superpowers/sdd/progress.md +0 -0
  261. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/superpowers-run/README.md +0 -0
  262. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/superpowers-run/docs/superpowers/plans/2026-07-08-csv-dedupe.md +0 -0
  263. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/superpowers-run/docs/superpowers/specs/2026-07-08-csv-dedupe-design.md +0 -0
  264. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/temporal-certify/README.md +0 -0
  265. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/hooks/stop_firewall.py +0 -0
  266. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/loop/_resources.py +0 -0
  267. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/loop/paths.py +0 -0
  268. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/loop/scaffold.py +0 -0
  269. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/architecture-matrix.md +0 -0
  270. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/eval-suite.md +0 -0
  271. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/loop-patterns.md +0 -0
  272. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/model-routing.md +0 -0
  273. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/platform-map.md +0 -0
  274. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/prompt-templates.md +0 -0
  275. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/safety-and-approvals.md +0 -0
  276. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/schemas/receipt.schema.json +0 -0
  277. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/schemas/repair-record.schema.json +0 -0
  278. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/schemas/rollout-record.schema.json +0 -0
  279. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/schemas/tasks.schema.json +0 -0
  280. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/action_scorecard.py +0 -0
  281. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/anticheat_scan.py +0 -0
  282. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/benchmark_harness.py +0 -0
  283. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/holdout_gate.py +0 -0
  284. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/inspect_loop.py +0 -0
  285. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/rollout_ledger.py +0 -0
  286. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_action_scorecard.py +0 -0
  287. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_anticheat_scan.py +0 -0
  288. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_benchmark_harness.py +0 -0
  289. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_contract_records.py +0 -0
  290. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_docs_adoption.py +0 -0
  291. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_docs_baseline.py +0 -0
  292. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_docs_claims.py +0 -0
  293. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_example_runnable.py +0 -0
  294. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_flaky_example.py +0 -0
  295. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_holdout_gate.py +0 -0
  296. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_inspect_loop.py +0 -0
  297. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_langgraph_recipe.py +0 -0
  298. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_langgraph_recipe_st3.py +0 -0
  299. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_metrics_cli.py +0 -0
  300. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_precommit_hook.py +0 -0
  301. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_resources.py +0 -0
  302. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_rollout_ledger.py +0 -0
  303. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_scaffold.py +0 -0
  304. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_schemas_metrics.py +0 -0
  305. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_self_eval.py +0 -0
  306. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_stop_firewall.py +0 -0
  307. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_temporal_recipe.py +0 -0
  308. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_validate_frontmatter.py +0 -0
  309. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/validate_frontmatter.py +0 -0
  310. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-architect/SKILL.md +0 -0
  311. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-contract/SKILL.md +0 -0
  312. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-engineer/SKILL.md +0 -0
  313. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-flywheel/SKILL.md +0 -0
  314. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-inspector/reference/patterns.md +0 -0
  315. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-repair/SKILL.md +0 -0
  316. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-runtime-monitor/SKILL.md +0 -0
  317. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-runtime-monitor/reference/patterns.md +0 -0
  318. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/AGENTS.md.tmpl +0 -0
  319. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/EVALS-rubric.md.tmpl +0 -0
  320. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/SPEC.md.tmpl +0 -0
  321. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/TASKS.json.tmpl +0 -0
  322. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/WORKFLOW.md.tmpl +0 -0
  323. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/extract-trace-metrics.sh +0 -0
  324. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/judge-rubric.sh +0 -0
  325. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/manifest.yaml.tmpl +0 -0
  326. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/terminal_state.json.tmpl +0 -0
  327. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/verify-fast.sh +0 -0
  328. {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/verify-full.sh +0 -0
  329. {loop_engineer-0.8.0 → loop_engineer-0.10.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.10.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,152 @@ 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.10.0 — 2026-07-25
18
+
19
+ **The hash-linked event chain.** Every `loop-engineer/event@1` row now carries
20
+ `prev_event_hash` and `event_hash` — a sha256 over a canonical JSON preimage of
21
+ the event's hashed fields, `prev_event_hash` among them. Canonical form is
22
+ `json.dumps(sort_keys=True, separators=(",", ":"), ensure_ascii=False,
23
+ allow_nan=False)` encoded UTF-8, pinned normatively with conformance vectors in
24
+ `reference/repo-os-contract.md` §16. The digest is computed **inside the store on
25
+ append**, never supplied by a caller, and the deterministic reducer re-verifies
26
+ each link as it folds: a spliced, reordered, or edited row raises
27
+ `ChainBreakError` and stops the fold instead of projecting a plausible state.
28
+ `loop.chain` is stdlib-only and imports no other module of this package, so
29
+ `verify_chain()` re-verifies an exported event stream without the store code
30
+ (#82).
31
+
32
+ **Store generations and `loop migrate`.** A fresh store stamps `PRAGMA
33
+ user_version = 2` and widens the `events` DDL with `event_hash TEXT NOT NULL`.
34
+ `loop migrate` is the only store-upgrade path — explicit, idempotent, and
35
+ non-rewriting: it adds the two columns and stamps `user_version = 2`, but never
36
+ backfills hashes onto existing rows, because the append-only `BEFORE UPDATE`
37
+ trigger forbids it. Pre-migration rows therefore stay an **unchained prefix**
38
+ that doctor reports rather than elides, and the first post-migration append is a
39
+ chain genesis.
40
+
41
+ **Anchored doctor gate.** `loop doctor` gains an `event_store.chain` block
42
+ (`head`, `unchained_prefix`) and a `--expect-chain-head SHA256` flag — also
43
+ accepted by `validate` and `verify` — that fails the gate unless the store's head
44
+ equals an externally remembered anchor. Four new issue codes: `event_chain_broken`
45
+ (a link does not verify), `chain_anchor_mismatch` (the head differs from the
46
+ supplied anchor, or an anchor was supplied with no readable store),
47
+ `missing_event_store` (`events.db` is absent while SQLite sidecars remain — the
48
+ store was deleted), and `chain_columns_missing` (the store still declares
49
+ generation 2 with its chain columns gone — the lazy downgrade). The composite
50
+ action publishes the observed head as a `chain-head` output on every run and
51
+ optionally enforces one through an `expect-chain-head` input.
52
+
53
+ **Integrity boundary.** The chain is **tamper-evident relative to an anchored
54
+ head** — a detection property, not a prevention one, and scoped to the anchor.
55
+ It detects splicing, reordering, an edit that does not recompute every downstream
56
+ digest, and byte corruption of any hashed field; given an anchor it detects *any*
57
+ divergence from the head that anchor names, including tail truncation, which is
58
+ otherwise invisible because deleting trailing events leaves a shorter but
59
+ internally valid chain. It does **not** detect a full in-workspace recompute, a
60
+ chain-column downgrade that also resets `user_version`, deletion of the store when
61
+ no sidecars remain and no anchor is supplied, well-formed lies (nothing in the
62
+ chain judges whether a payload is true), or anything in a never-migrated prefix.
63
+ And the window stays open at the head: "An anchor certifies the log only up to the
64
+ anchored head. Everything appended after the last externally-read anchor —
65
+ including a rewrite of the suffix — is unverified until the next anchor is read
66
+ and remembered outside the workspace. The chain narrows the tampering window; it
67
+ does not close it." `scripts/test_adversarial_chain.py` pins both sides — the
68
+ attacks that are caught and four `PINNED LIMITATION` cases that are not. The full
69
+ boundary, with the anchor's trust assumptions, is normative in
70
+ `reference/repo-os-contract.md` §16.
71
+
72
+ **Stricter reads.** `status`, `replay`, and `doctor` now **reject** a store
73
+ containing any schema-invalid event, raising `invalid_event` instead of silently
74
+ folding past it as they did in 0.9.0. Validation runs before the fold, so a tamper
75
+ that also violates `event@1` surfaces as `invalid_event` rather than
76
+ `event_chain_broken`.
77
+
78
+ **Sidecars resolved.** Read verbs no longer leave `-wal`/`-shm` files beside a
79
+ clean `.loop/events.db` — the 0.9.0 known limitation recorded below. #80 landed
80
+ the first half, opening read-only connections with `immutable=1` when no WAL
81
+ sidecar exists; this release completes it with a two-stage retry so that a lost
82
+ `immutable=1` race against a live writer retries plainly as `mode=ro` before
83
+ anything may be called corruption, the same read path in the runner, and a
84
+ zero-carve-out tripwire proving every read verb leaves a clean store
85
+ byte-identical on both store generations.
86
+
87
+ **Compatibility, both directions.** Pre-0.10.0 *readers* can read a v2 store:
88
+ their explicit ten-column `SELECT` is unaffected by the two added columns.
89
+ Pre-0.10.0 *writers* must not append to a chained store. A fresh v0.10.0 store
90
+ refuses such an append at the database, because `event_hash` is `NOT NULL`; a
91
+ *migrated* store keeps its columns nullable, so the append succeeds and produces a
92
+ permanent, unrepairable `event_chain_broken` — the row cannot be re-linked
93
+ afterwards, since `UPDATE` is trigger-blocked. Pin your `loop-engineer` and action
94
+ version per store.
95
+
96
+ Test baseline: 1021 passed / 16 skipped with the `yaml`+`schemas` extras;
97
+ 951 / 86 in structural-fallback mode (PyYAML only). Both measured in a fresh
98
+ worktree; a live checkout reads +2 passed / −2 skipped through two
99
+ checked-when-present tests.
100
+
101
+ ## 0.9.0 — 2026-07-17
102
+
103
+ **The event-sourced kernel.** The contract gains a durable runtime substrate:
104
+ `loop-engineer/event@1` events in an append-only SQLite store
105
+ (`.loop/events.db` — WAL, `synchronous=FULL`, no-update/no-delete triggers,
106
+ `expected_sequence` compare-and-swap) folded by a deterministic reducer that
107
+ enforces FSM legality, the all-required completion gate, and terminal
108
+ immutability through the same `loop.fsm`/`loop.completion` modules the
109
+ writers use (#62). Around it: a canonical intermediate-state FSM with
110
+ unknown-state validation and writer timestamps (#59); `loop-engineer/plan@1`
111
+ — a Loop Plan IR with a `plan-lint` verb and a typed capability vocabulary
112
+ (#61); `loop-engineer/evidence@1` — hashed evidence objects with provenance,
113
+ re-verifiable byte-for-byte (#63); administrative `terminal_superseded`
114
+ events — the only event a terminated run admits, so a wrong terminal is
115
+ corrected on the record instead of edited in place (#64); a run-control event
116
+ vocabulary for approval, pause, and resume (#73); and explicit validation
117
+ modes `--mode basic|strict|release` across the CLI (#60).
118
+
119
+ **Runtime verbs.** `loop run` — event-sourced single-step dispatch with
120
+ crash-safe resume (#71); read-only `loop status` and `loop replay` (#70);
121
+ `loop simulate` — strictly read-only dry-run dispatch prediction (#75);
122
+ `approve` / `pause` / `resume` / `cancel` (#74); a subprocess-isolated
123
+ verifier runner — shlex argv, no shell, wall-clock cap, bounded output tail,
124
+ typed failure classes — plus typed fail-loud stubs for the not-yet-shipped
125
+ run modes (#72); `loop architect` as a typed fail-loud deferral (#76). And
126
+ `loop doctor` now composes an event-store consistency gate over
127
+ `status`/`replay` whenever `.loop/events.db` exists — one hard gate across
128
+ the file layer and the event log (#77).
129
+
130
+ **Completion-semantics hardening (Phase 0).** `Succeeded` now requires
131
+ **all** required criteria satisfied plus evidence — the prior any-true
132
+ reading was a correctness bug, fixed in one shared `loop/completion.py`
133
+ wired into the writer API, the integrations projection, and the contract
134
+ validator's G1 check. `terminal_state.json` is create-once (atomic;
135
+ `force` always raises); iteration ids are canonical ints (legacy decimal
136
+ strings stay read-compatible); `terminal@1` gains an additive
137
+ `completion_policy` (#48).
138
+
139
+ **Adversarial hardening.** A property-based kernel suite over FSM legality,
140
+ G1 completion, supersession, and replay determinism (#65), and a
141
+ process/security suite — real crash injection at code-controlled barriers,
142
+ verifier tampering, workspace-escape TOCTOU (#66). The `verify_evidence()`
143
+ symlink-swap TOCTOU that suite discovered (#67) is closed by fd-pinned
144
+ open-then-verify (#69), retiring the strict xfail marker.
145
+
146
+ **Scoreboard, funnel, housekeeping.** The ST5 harness scoreboard — 9 public
147
+ harnesses read through a foreign-layout registry with 8 vendored fixtures
148
+ (#41); contributor-funnel fixes — trigger-phrase disambiguation (#42),
149
+ documentation-completeness labels on the self-eval (#43),
150
+ `approval_requested`/`replanned` recognized as honest-red metrics tokens
151
+ (#44), metrics-clean RUNLOG seeding (#45); Dependabot version updates and
152
+ least-privilege workflow permissions (#46, #47).
153
+
154
+ **Known limitation.** Read verbs over the event store leave SQLite
155
+ `-wal`/`-shm` sidecars next to `.loop/events.db` (read-only connections
156
+ recreate them and cannot checkpoint on close). Store content is never
157
+ mutated, but tree-byte-identity checks over a store-backed workspace will
158
+ notice them. *(Resolved in 0.10.0 — see "Sidecars resolved" above.)*
159
+
160
+ Test baseline: 933 passed / 16 skipped with the `yaml`+`schemas` extras;
161
+ 864 / 85 in structural-fallback mode (PyYAML only).
162
+
17
163
  ## 0.8.0 — 2026-07-09
18
164
 
19
165
  **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.10.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.10.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,15 @@ 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. Events are
67
+ hash-chained; `loop doctor --expect-chain-head` verifies the log against an
68
+ externally anchored head. The chain is tamper-evident **relative to an
69
+ anchor** — an adversary with workspace write access can rewrite an unanchored
70
+ log.
61
71
 
62
72
  ![The inspector scores a self-asserted DIY loop 0/weak, then the gate-backed example 90/strong — both runs live](docs/demo.gif)
63
73
 
@@ -161,6 +171,7 @@ directory, and need no agent runtime to run.
161
171
  {
162
172
  "ok": true,
163
173
  "validation_mode": "structural-fallback",
174
+ "requested_mode": "auto",
164
175
  "schemas_checked": [
165
176
  "loop-engineer/manifest@1",
166
177
  "loop-engineer/state@1",
@@ -176,6 +187,15 @@ default, or real JSON-Schema validation against `schemas/*.json` when the
176
187
  optional `jsonschema` dependency is present (`pip install -e ".[schemas]"`), in
177
188
  which case it reads `"jsonschema"`.
178
189
 
190
+ For `doctor`, `validate`, and `verify`, `--mode basic|strict|release` makes the
191
+ choice explicit. With no flag, the current auto-detect behavior is unchanged
192
+ for backward compatibility with existing foreign and scoreboard callers.
193
+ `--mode basic` always uses the structural fallback, regardless of whether
194
+ `jsonschema` happens to be installed. `--mode strict` and `--mode release`
195
+ require real JSON-Schema validation and fail non-zero rather than silently
196
+ downgrade if the `jsonschema` extra is missing. `release` currently has the
197
+ same behavior as `strict`; it is reserved for a stricter future policy.
198
+
179
199
  `inspect` is a static contract linter: it scores the loop contract's structure —
180
200
  what proof machinery is present and what is missing — without running the loop:
181
201
 
@@ -253,7 +273,7 @@ terminal outcome:
253
273
  .loop/
254
274
  manifest.yaml # contract metadata
255
275
  state.json # live FSM cursor
256
- terminal_state.json # final exit record; written once — emit refuses overwrite without force=True
276
+ terminal_state.json # final exit record; immutable once written
257
277
  artifacts/ # evidence bundles and intermediate outputs
258
278
  approvals/ # approval requests and resolutions
259
279
  checkpoints/ # recoverable snapshots
@@ -307,6 +327,12 @@ The portable core lives in `loop/` and validates schema-bearing artifacts in
307
327
  - `loop-engineer/state@1`
308
328
  - `loop-engineer/tasks@1`
309
329
  - `loop-engineer/terminal@1`
330
+ - `loop-engineer/receipt@1`
331
+ - `loop-engineer/repair@1`
332
+ - `loop-engineer/rollout@1`
333
+ - `loop-engineer/plan@1`
334
+ - `loop-engineer/event@1`
335
+ - `loop-engineer/evidence@1`
310
336
 
311
337
  ### Claude Code plugin
312
338
 
@@ -338,13 +364,14 @@ otherwise, the stop is blocked with the exact doctor issues. No-op without
338
364
  **Any Python runtime** — `loop.emit` is a pure-stdlib writer for foreign
339
365
  orchestrators (LangGraph, or anything that can call four functions):
340
366
  `open_contract`, `append_iteration`, `append_receipt`, `terminate`. The writer
341
- refuses an evidence-free `Succeeded` at write time. Recipe:
367
+ refuses `Succeeded` unless every declared criterion is true and evidence is
368
+ present. Recipe:
342
369
  [docs/integrations/langgraph.md](docs/integrations/langgraph.md).
343
370
 
344
371
  **CI** — one workflow step validates the contract and publishes a scorecard:
345
372
 
346
373
  ```yaml
347
- - uses: SollanSystems/loop-engineer@v0.8.0
374
+ - uses: SollanSystems/loop-engineer@v0.10.0
348
375
  with:
349
376
  path: "."
350
377
  ```
@@ -426,16 +453,19 @@ claude plugin validate --strict .claude-plugin/plugin.json
426
453
  ```
427
454
 
428
455
  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.
456
+ templates, secret patterns, dispatch examples, the bring-your-own-verifier
457
+ default, the MIT license, and README differentiation. Three further checks are
458
+ documentation-completeness scans: they confirm the canonical vocabulary for
459
+ terminal-state coverage, repair-record fields, and eval metrics is present in the
460
+ skill prose — not that a running loop enforces it (that runtime gate is `loop
461
+ doctor` and the contract's own `verify-*` scripts).
432
462
 
433
463
  ---
434
464
 
435
465
  ## Status
436
466
 
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>`)
467
+ - Version: `0.10.0`
468
+ - Release tag: `v0.10.0` (PyPI publish trigger; plugin tags through 0.6.0 used `loop-engineer--v<version>`)
439
469
  - License: MIT
440
470
  - Primary interface: Claude Code plugin
441
471
  - 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.10.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,15 @@ 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. Events are
28
+ hash-chained; `loop doctor --expect-chain-head` verifies the log against an
29
+ externally anchored head. The chain is tamper-evident **relative to an
30
+ anchor** — an adversary with workspace write access can rewrite an unanchored
31
+ log.
24
32
 
25
33
  ![The inspector scores a self-asserted DIY loop 0/weak, then the gate-backed example 90/strong — both runs live](docs/demo.gif)
26
34
 
@@ -124,6 +132,7 @@ directory, and need no agent runtime to run.
124
132
  {
125
133
  "ok": true,
126
134
  "validation_mode": "structural-fallback",
135
+ "requested_mode": "auto",
127
136
  "schemas_checked": [
128
137
  "loop-engineer/manifest@1",
129
138
  "loop-engineer/state@1",
@@ -139,6 +148,15 @@ default, or real JSON-Schema validation against `schemas/*.json` when the
139
148
  optional `jsonschema` dependency is present (`pip install -e ".[schemas]"`), in
140
149
  which case it reads `"jsonschema"`.
141
150
 
151
+ For `doctor`, `validate`, and `verify`, `--mode basic|strict|release` makes the
152
+ choice explicit. With no flag, the current auto-detect behavior is unchanged
153
+ for backward compatibility with existing foreign and scoreboard callers.
154
+ `--mode basic` always uses the structural fallback, regardless of whether
155
+ `jsonschema` happens to be installed. `--mode strict` and `--mode release`
156
+ require real JSON-Schema validation and fail non-zero rather than silently
157
+ downgrade if the `jsonschema` extra is missing. `release` currently has the
158
+ same behavior as `strict`; it is reserved for a stricter future policy.
159
+
142
160
  `inspect` is a static contract linter: it scores the loop contract's structure —
143
161
  what proof machinery is present and what is missing — without running the loop:
144
162
 
@@ -216,7 +234,7 @@ terminal outcome:
216
234
  .loop/
217
235
  manifest.yaml # contract metadata
218
236
  state.json # live FSM cursor
219
- terminal_state.json # final exit record; written once — emit refuses overwrite without force=True
237
+ terminal_state.json # final exit record; immutable once written
220
238
  artifacts/ # evidence bundles and intermediate outputs
221
239
  approvals/ # approval requests and resolutions
222
240
  checkpoints/ # recoverable snapshots
@@ -270,6 +288,12 @@ The portable core lives in `loop/` and validates schema-bearing artifacts in
270
288
  - `loop-engineer/state@1`
271
289
  - `loop-engineer/tasks@1`
272
290
  - `loop-engineer/terminal@1`
291
+ - `loop-engineer/receipt@1`
292
+ - `loop-engineer/repair@1`
293
+ - `loop-engineer/rollout@1`
294
+ - `loop-engineer/plan@1`
295
+ - `loop-engineer/event@1`
296
+ - `loop-engineer/evidence@1`
273
297
 
274
298
  ### Claude Code plugin
275
299
 
@@ -301,13 +325,14 @@ otherwise, the stop is blocked with the exact doctor issues. No-op without
301
325
  **Any Python runtime** — `loop.emit` is a pure-stdlib writer for foreign
302
326
  orchestrators (LangGraph, or anything that can call four functions):
303
327
  `open_contract`, `append_iteration`, `append_receipt`, `terminate`. The writer
304
- refuses an evidence-free `Succeeded` at write time. Recipe:
328
+ refuses `Succeeded` unless every declared criterion is true and evidence is
329
+ present. Recipe:
305
330
  [docs/integrations/langgraph.md](docs/integrations/langgraph.md).
306
331
 
307
332
  **CI** — one workflow step validates the contract and publishes a scorecard:
308
333
 
309
334
  ```yaml
310
- - uses: SollanSystems/loop-engineer@v0.8.0
335
+ - uses: SollanSystems/loop-engineer@v0.10.0
311
336
  with:
312
337
  path: "."
313
338
  ```
@@ -389,16 +414,19 @@ claude plugin validate --strict .claude-plugin/plugin.json
389
414
  ```
390
415
 
391
416
  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.
417
+ templates, secret patterns, dispatch examples, the bring-your-own-verifier
418
+ default, the MIT license, and README differentiation. Three further checks are
419
+ documentation-completeness scans: they confirm the canonical vocabulary for
420
+ terminal-state coverage, repair-record fields, and eval metrics is present in the
421
+ skill prose — not that a running loop enforces it (that runtime gate is `loop
422
+ doctor` and the contract's own `verify-*` scripts).
395
423
 
396
424
  ---
397
425
 
398
426
  ## Status
399
427
 
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>`)
428
+ - Version: `0.10.0`
429
+ - Release tag: `v0.10.0` (PyPI publish trigger; plugin tags through 0.6.0 used `loop-engineer--v<version>`)
402
430
  - License: MIT
403
431
  - Primary interface: Claude Code plugin
404
432
  - Portable core: Python CLI + JSON schemas