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.
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.claude-plugin/plugin.json +17 -3
- loop_engineer-0.10.0/.github/dependabot.yml +16 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.github/workflows/ci.yml +24 -9
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.github/workflows/publish.yml +7 -4
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.gitignore +9 -8
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/CHANGELOG.md +146 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/CONTRIBUTING.md +15 -2
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/PKG-INFO +41 -11
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/README.md +38 -10
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/action.yml +43 -2
- loop_engineer-0.10.0/docs/adr/0001-proof-kernel-and-runtime.md +104 -0
- loop_engineer-0.10.0/docs/gap-reports/scoreboard.md +296 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/gap-reports/superpowers.md +5 -4
- {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
- loop_engineer-0.10.0/docs/superpowers/plans/2026-07-09-st5-harness-scoreboard.md +39 -0
- loop_engineer-0.10.0/docs/superpowers/specs/2026-07-09-st5-harness-scoreboard-design.md +104 -0
- loop_engineer-0.10.0/examples/agent-os-run/README.md +52 -0
- loop_engineer-0.10.0/examples/agent-os-run/agent-os/product/mission.md +23 -0
- loop_engineer-0.10.0/examples/agent-os-run/agent-os/product/roadmap.md +16 -0
- loop_engineer-0.10.0/examples/agent-os-run/agent-os/specs/2026-07-09-1030-csv-dedupe/plan.md +31 -0
- loop_engineer-0.10.0/examples/agent-os-run/agent-os/specs/2026-07-09-1030-csv-dedupe/references.md +23 -0
- loop_engineer-0.10.0/examples/agent-os-run/agent-os/specs/2026-07-09-1030-csv-dedupe/shape.md +32 -0
- loop_engineer-0.10.0/examples/agent-os-run/agent-os/specs/2026-07-09-1030-csv-dedupe/standards.md +25 -0
- loop_engineer-0.10.0/examples/agent-os-run/agent-os/standards/backend/data-imports.md +16 -0
- loop_engineer-0.10.0/examples/agent-os-run/agent-os/standards/index.yml +5 -0
- loop_engineer-0.10.0/examples/bmad-run/README.md +39 -0
- loop_engineer-0.10.0/examples/bmad-run/_bmad/bmm/config.yaml +15 -0
- loop_engineer-0.10.0/examples/bmad-run/_bmad-output/implementation-artifacts/1-1-deduplicate-csv-rows.md +83 -0
- loop_engineer-0.10.0/examples/bmad-run/_bmad-output/implementation-artifacts/epic-1-retro-2026-07-09.md +54 -0
- loop_engineer-0.10.0/examples/bmad-run/_bmad-output/implementation-artifacts/sprint-status.yaml +38 -0
- loop_engineer-0.10.0/examples/bmad-run/_bmad-output/planning-artifacts/epics.md +48 -0
- loop_engineer-0.10.0/examples/bmad-run/_bmad-output/planning-artifacts/prd.md +48 -0
- loop_engineer-0.10.0/examples/bmad-run/src/import_contacts.py +55 -0
- loop_engineer-0.10.0/examples/bmad-run/tests/test_import_contacts.py +59 -0
- loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/1235-analysis.md +51 -0
- loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/1235.md +43 -0
- loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/epic.md +79 -0
- loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/execution-status.md +16 -0
- loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/github-mapping.md +7 -0
- loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/updates/1235/progress.md +30 -0
- loop_engineer-0.10.0/examples/ccpm-run/.claude/epics/csv-dedupe/updates/1235/stream-A.md +18 -0
- loop_engineer-0.10.0/examples/ccpm-run/.claude/prds/csv-dedupe.md +63 -0
- loop_engineer-0.10.0/examples/ccpm-run/README.md +45 -0
- loop_engineer-0.10.0/examples/coverage-repair/.loop/approvals/.gitkeep +0 -0
- loop_engineer-0.10.0/examples/coverage-repair/.loop/artifacts/holdout-run.txt +49 -0
- loop_engineer-0.10.0/examples/coverage-repair/.loop/artifacts/holdout-verdict.json +26 -0
- loop_engineer-0.10.0/examples/coverage-repair/.loop/artifacts/verify-T1.json +8 -0
- loop_engineer-0.10.0/examples/coverage-repair/.loop/artifacts/verify-T2-iter1.json +8 -0
- loop_engineer-0.10.0/examples/coverage-repair/.loop/artifacts/verify-T2.json +8 -0
- loop_engineer-0.10.0/examples/coverage-repair/.loop/checkpoints/.gitkeep +0 -0
- loop_engineer-0.10.0/examples/coverage-repair/.loop/manifest.yaml +53 -0
- loop_engineer-0.10.0/examples/coverage-repair/.loop/memory/.gitkeep +0 -0
- loop_engineer-0.10.0/examples/coverage-repair/.loop/repair/iter-002.json +12 -0
- loop_engineer-0.10.0/examples/coverage-repair/.loop/state.json +14 -0
- loop_engineer-0.10.0/examples/evidence/invalid/absolute-uri.json +10 -0
- loop_engineer-0.10.0/examples/evidence/invalid/bad-sha256-pattern.json +10 -0
- loop_engineer-0.10.0/examples/evidence/invalid/missing-required-field.json +9 -0
- loop_engineer-0.10.0/examples/evidence/invalid/scheme-uri.json +10 -0
- loop_engineer-0.10.0/examples/evidence/valid-evidence.json +22 -0
- loop_engineer-0.10.0/examples/flaky-test-triage/.loop/artifacts/holdout-verdict.json +21 -0
- loop_engineer-0.10.0/examples/flaky-test-triage/.loop/artifacts/verify-T1-iter1.json +8 -0
- loop_engineer-0.10.0/examples/flaky-test-triage/.loop/artifacts/verify-T1.json +9 -0
- loop_engineer-0.10.0/examples/flaky-test-triage/.loop/manifest.yaml +53 -0
- loop_engineer-0.10.0/examples/flaky-test-triage/.loop/repair/iter-002.json +12 -0
- loop_engineer-0.10.0/examples/flaky-test-triage/.loop/state.json +14 -0
- loop_engineer-0.10.0/examples/flaky-test-triage/.loop/terminal_state.json +14 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/langgraph-emit/graph_example.py +0 -6
- loop_engineer-0.10.0/examples/naive-loop/.loop/state.json +5 -0
- loop_engineer-0.10.0/examples/openspec-run/README.md +46 -0
- loop_engineer-0.10.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/.openspec.yaml +2 -0
- loop_engineer-0.10.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/design.md +49 -0
- loop_engineer-0.10.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/proposal.md +31 -0
- loop_engineer-0.10.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/specs/csv-dedupe/spec.md +37 -0
- loop_engineer-0.10.0/examples/openspec-run/openspec/changes/archive/2026-07-09-dedupe-csv-rows/tasks.md +25 -0
- loop_engineer-0.10.0/examples/openspec-run/openspec/config.yaml +22 -0
- loop_engineer-0.10.0/examples/openspec-run/openspec/specs/csv-dedupe/spec.md +41 -0
- loop_engineer-0.10.0/examples/plans/coverage-repair.plan.json +32 -0
- loop_engineer-0.10.0/examples/plans/invalid/cyclic-dependency.plan.json +11 -0
- loop_engineer-0.10.0/examples/plans/invalid/missing-goal.plan.json +6 -0
- loop_engineer-0.10.0/examples/prp-run/.claude/PRPs/plans/completed/csv-dedupe.plan.md +98 -0
- loop_engineer-0.10.0/examples/prp-run/.claude/PRPs/prds/csv-dedupe.prd.md +65 -0
- loop_engineer-0.10.0/examples/prp-run/.claude/PRPs/reports/csv-dedupe-report.md +86 -0
- loop_engineer-0.10.0/examples/prp-run/.claude/PRPs/reviews/pr-42-cycle-0.verdict.json +4 -0
- loop_engineer-0.10.0/examples/prp-run/.claude/PRPs/reviews/pr-42-review.md +95 -0
- loop_engineer-0.10.0/examples/prp-run/.claude/prp-loop.run.log +10 -0
- loop_engineer-0.10.0/examples/prp-run/.claude/prp-loop.state.json +30 -0
- loop_engineer-0.10.0/examples/prp-run/README.md +43 -0
- loop_engineer-0.10.0/examples/ruflo-run/.claude-flow/metrics/swarm-activity.json +18 -0
- loop_engineer-0.10.0/examples/ruflo-run/.claude-flow/metrics/v3-progress.json +26 -0
- loop_engineer-0.10.0/examples/ruflo-run/.claude-flow/security/audit-status.json +8 -0
- loop_engineer-0.10.0/examples/ruflo-run/.hive-mind/sessions/hive-mind-prompt-swarm-2026-07-09.txt +46 -0
- loop_engineer-0.10.0/examples/ruflo-run/.mcp.json +17 -0
- loop_engineer-0.10.0/examples/ruflo-run/.swarm/memory-export.json +78 -0
- loop_engineer-0.10.0/examples/ruflo-run/README.md +46 -0
- loop_engineer-0.10.0/examples/spec-kit-run/.specify/feature.json +1 -0
- loop_engineer-0.10.0/examples/spec-kit-run/.specify/memory/constitution.md +35 -0
- loop_engineer-0.10.0/examples/spec-kit-run/README.md +27 -0
- loop_engineer-0.10.0/examples/spec-kit-run/specs/001-csv-dedupe/checklists/requirements.md +32 -0
- loop_engineer-0.10.0/examples/spec-kit-run/specs/001-csv-dedupe/plan.md +71 -0
- loop_engineer-0.10.0/examples/spec-kit-run/specs/001-csv-dedupe/quickstart.md +38 -0
- loop_engineer-0.10.0/examples/spec-kit-run/specs/001-csv-dedupe/research.md +32 -0
- loop_engineer-0.10.0/examples/spec-kit-run/specs/001-csv-dedupe/spec.md +74 -0
- loop_engineer-0.10.0/examples/spec-kit-run/specs/001-csv-dedupe/tasks.md +74 -0
- loop_engineer-0.10.0/examples/task-master-run/.taskmaster/config.json +32 -0
- loop_engineer-0.10.0/examples/task-master-run/.taskmaster/docs/prd.txt +42 -0
- loop_engineer-0.10.0/examples/task-master-run/.taskmaster/reports/task-complexity-report.json +37 -0
- loop_engineer-0.10.0/examples/task-master-run/.taskmaster/state.json +9 -0
- loop_engineer-0.10.0/examples/task-master-run/.taskmaster/tasks/task_001.txt +17 -0
- loop_engineer-0.10.0/examples/task-master-run/.taskmaster/tasks/tasks.json +73 -0
- loop_engineer-0.10.0/examples/task-master-run/.taskmaster/templates/example_prd.txt +32 -0
- loop_engineer-0.10.0/examples/task-master-run/CLAUDE.md +57 -0
- loop_engineer-0.10.0/examples/task-master-run/README.md +38 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/temporal-certify/workflow_example.py +0 -6
- loop_engineer-0.10.0/loop/__init__.py +30 -0
- loop_engineer-0.10.0/loop/__main__.py +414 -0
- loop_engineer-0.10.0/loop/architect.py +39 -0
- loop_engineer-0.10.0/loop/chain.py +88 -0
- loop_engineer-0.10.0/loop/completion.py +73 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/loop/contract.py +205 -21
- loop_engineer-0.10.0/loop/emit.py +399 -0
- loop_engineer-0.10.0/loop/events.py +388 -0
- loop_engineer-0.10.0/loop/evidence.py +194 -0
- loop_engineer-0.10.0/loop/foreign.py +381 -0
- loop_engineer-0.10.0/loop/fsm.py +67 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/loop/integrations.py +63 -9
- loop_engineer-0.10.0/loop/migrate.py +45 -0
- loop_engineer-0.10.0/loop/plan.py +267 -0
- loop_engineer-0.10.0/loop/reducer.py +199 -0
- loop_engineer-0.10.0/loop/runcontrol.py +120 -0
- loop_engineer-0.10.0/loop/runner.py +249 -0
- loop_engineer-0.10.0/loop/runtime.py +293 -0
- loop_engineer-0.10.0/loop/simulate.py +120 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/pyproject.toml +3 -1
- loop_engineer-0.10.0/reference/repo-os-contract.md +1043 -0
- loop_engineer-0.10.0/schemas/event.schema.json +35 -0
- loop_engineer-0.10.0/schemas/evidence.schema.json +46 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/schemas/manifest.schema.json +1 -0
- loop_engineer-0.10.0/schemas/plan.schema.json +23 -0
- loop_engineer-0.10.0/schemas/state.schema.json +103 -0
- loop_engineer-0.10.0/schemas/terminal.schema.json +90 -0
- loop_engineer-0.10.0/scripts/chain_fixtures.py +66 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/metrics.py +2 -2
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/runtime_monitor.py +14 -3
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/self_eval.py +20 -6
- loop_engineer-0.10.0/scripts/test_adversarial_chain.py +345 -0
- loop_engineer-0.10.0/scripts/test_adversarial_kernel.py +264 -0
- loop_engineer-0.10.0/scripts/test_adversarial_process.py +207 -0
- loop_engineer-0.10.0/scripts/test_ci_release_mode.py +27 -0
- loop_engineer-0.10.0/scripts/test_completion_policy.py +118 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_conformance.py +1 -1
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_docs_version.py +13 -2
- loop_engineer-0.10.0/scripts/test_doctor_eventstore.py +420 -0
- loop_engineer-0.10.0/scripts/test_emit.py +358 -0
- loop_engineer-0.10.0/scripts/test_event_chain.py +487 -0
- loop_engineer-0.10.0/scripts/test_eventstore.py +296 -0
- loop_engineer-0.10.0/scripts/test_evidence.py +234 -0
- loop_engineer-0.10.0/scripts/test_foreign_inspect.py +186 -0
- loop_engineer-0.10.0/scripts/test_fsm.py +100 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_integrations.py +61 -4
- loop_engineer-0.10.0/scripts/test_loop_architect_cli.py +146 -0
- loop_engineer-0.10.0/scripts/test_loop_cli.py +301 -0
- loop_engineer-0.10.0/scripts/test_loop_cli_status_replay.py +261 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_loop_contract_core.py +68 -1
- loop_engineer-0.10.0/scripts/test_loop_runcontrol_cli.py +377 -0
- loop_engineer-0.10.0/scripts/test_loop_simulate_cli.py +211 -0
- loop_engineer-0.10.0/scripts/test_loop_simulate_zero_writes.py +116 -0
- loop_engineer-0.10.0/scripts/test_manifest_extra_states_schema.py +38 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_metrics.py +17 -0
- loop_engineer-0.10.0/scripts/test_migrate_cli.py +128 -0
- loop_engineer-0.10.0/scripts/test_plan_schema.py +225 -0
- loop_engineer-0.10.0/scripts/test_reducer.py +317 -0
- loop_engineer-0.10.0/scripts/test_runner_dispatch.py +129 -0
- loop_engineer-0.10.0/scripts/test_runner_verifier.py +158 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_runtime_monitor.py +18 -0
- loop_engineer-0.10.0/scripts/test_state_vocabulary.py +59 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_template_roundtrip.py +3 -16
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_wheel_selfcontained.py +11 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-evals/SKILL.md +1 -1
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-inspector/SKILL.md +1 -1
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-run/SKILL.md +1 -1
- loop_engineer-0.10.0/templates/RUNLOG.md.tmpl +31 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/state.json.tmpl +1 -1
- loop_engineer-0.8.0/loop/__init__.py +0 -17
- loop_engineer-0.8.0/loop/__main__.py +0 -176
- loop_engineer-0.8.0/loop/emit.py +0 -258
- loop_engineer-0.8.0/loop/foreign.py +0 -69
- loop_engineer-0.8.0/reference/repo-os-contract.md +0 -546
- loop_engineer-0.8.0/schemas/state.schema.json +0 -25
- loop_engineer-0.8.0/schemas/terminal.schema.json +0 -19
- loop_engineer-0.8.0/scripts/test_emit.py +0 -178
- loop_engineer-0.8.0/scripts/test_foreign_inspect.py +0 -84
- loop_engineer-0.8.0/scripts/test_loop_cli.py +0 -149
- loop_engineer-0.8.0/templates/RUNLOG.md.tmpl +0 -42
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.claude-plugin/marketplace.json +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/.pre-commit-hooks.yaml +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/CODE_OF_CONDUCT.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/GLOSSARY.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/LICENSE +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/SECURITY.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/ROADMAP-v1.0.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/01-good-first-qw9-trigger-phrases.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/02-good-first-qw10-self-eval-labels.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/03-good-first-emit-metrics-vocabulary.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/04-help-wanted-openhands-recipe.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/05-help-wanted-ruflo-recipe.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/06-help-wanted-gap-reports.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/contributing/issues/07-help-wanted-emit-scaffold-runlog-seed.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/demo.cast +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/demo.gif +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/integrations/langgraph.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/integrations/temporal.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/metrics-baseline.json +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/social-card.png +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/plans/2026-06-20-loop-engineer-v1.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/plans/2026-06-30-loop-engineer-v1.0-roadmap.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/plans/2026-07-03-adoption-slices.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-06-20-loop-engineer-design.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-06-30-st1-metrics-baseline.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-06-30-st2-portable-contract-spec.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-06-30-st3-integration-adapters.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-06-30-v04-credibility-enforcement.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/docs/superpowers/specs/2026-07-03-adoption-slices-design.md +0 -0
- {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
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/evals/cases/structural.json +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/evals/rubric.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/ADR.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/README.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/RUNLOG.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/SPEC.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/TASKS.json +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/WORKFLOW.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/scripts/run-example +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/scripts/verify-fast +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/scripts/verify-full +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/target/manifest.json +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/target/measure_coverage.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/target/pricing.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/target/test_holdout.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/target/test_visible.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/coverage-repair/terminal_state.json +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/README.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/RUNLOG.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/SPEC.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/TASKS.json +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/WORKFLOW.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/scripts/run-example +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/scripts/verify-fast +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/scripts/verify-full +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/target/jobs.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/target/manifest.json +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/target/measure_stability.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/target/test_holdout.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/flaky-test-triage/target/test_visible.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/langgraph-emit/README.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/naive-loop/README.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/superpowers-run/.superpowers/sdd/progress.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/superpowers-run/README.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/superpowers-run/docs/superpowers/plans/2026-07-08-csv-dedupe.md +0 -0
- {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
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/examples/temporal-certify/README.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/hooks/stop_firewall.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/loop/_resources.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/loop/paths.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/loop/scaffold.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/architecture-matrix.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/eval-suite.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/loop-patterns.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/model-routing.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/platform-map.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/prompt-templates.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/reference/safety-and-approvals.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/schemas/receipt.schema.json +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/schemas/repair-record.schema.json +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/schemas/rollout-record.schema.json +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/schemas/tasks.schema.json +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/action_scorecard.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/anticheat_scan.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/benchmark_harness.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/holdout_gate.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/inspect_loop.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/rollout_ledger.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_action_scorecard.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_anticheat_scan.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_benchmark_harness.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_contract_records.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_docs_adoption.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_docs_baseline.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_docs_claims.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_example_runnable.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_flaky_example.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_holdout_gate.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_inspect_loop.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_langgraph_recipe.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_langgraph_recipe_st3.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_metrics_cli.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_precommit_hook.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_resources.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_rollout_ledger.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_scaffold.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_schemas_metrics.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_self_eval.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_stop_firewall.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_temporal_recipe.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/test_validate_frontmatter.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/scripts/validate_frontmatter.py +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-architect/SKILL.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-contract/SKILL.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-engineer/SKILL.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-flywheel/SKILL.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-inspector/reference/patterns.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-repair/SKILL.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-runtime-monitor/SKILL.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/skills/loop-runtime-monitor/reference/patterns.md +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/AGENTS.md.tmpl +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/EVALS-rubric.md.tmpl +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/SPEC.md.tmpl +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/TASKS.json.tmpl +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/WORKFLOW.md.tmpl +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/extract-trace-metrics.sh +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/judge-rubric.sh +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/manifest.yaml.tmpl +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/terminal_state.json.tmpl +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/verify-fast.sh +0 -0
- {loop_engineer-0.8.0 → loop_engineer-0.10.0}/templates/verify-full.sh +0 -0
- {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.
|
|
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": {
|
|
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": [
|
|
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@
|
|
20
|
+
- uses: actions/checkout@v7
|
|
18
21
|
|
|
19
|
-
- uses: actions/setup-python@
|
|
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@
|
|
56
|
-
- uses: actions/setup-python@
|
|
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@
|
|
69
|
-
- uses: actions/setup-python@
|
|
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@
|
|
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@
|
|
14
|
+
- uses: actions/checkout@v7
|
|
12
15
|
|
|
13
|
-
- uses: actions/setup-python@
|
|
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@
|
|
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@
|
|
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
|
-
.
|
|
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
|
-
|
|
6
|
+
/.loop/
|
|
6
7
|
|
|
7
8
|
# Machine-local Claude Code config + GSD audit telemetry (not plugin content)
|
|
8
|
-
|
|
9
|
-
|
|
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.
|
|
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
|
[](https://github.com/SollanSystems/loop-engineer/actions/workflows/ci.yml)
|
|
43
45
|
[](https://www.python.org/downloads/)
|
|
44
46
|
[](LICENSE)
|
|
45
|
-
[](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
|

|
|
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;
|
|
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
|
|
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.
|
|
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
|
-
|
|
430
|
-
|
|
431
|
-
|
|
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.
|
|
438
|
-
- Release tag: `v0.
|
|
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
|
[](https://github.com/SollanSystems/loop-engineer/actions/workflows/ci.yml)
|
|
6
6
|
[](https://www.python.org/downloads/)
|
|
7
7
|
[](LICENSE)
|
|
8
|
-
[](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
|

|
|
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;
|
|
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
|
|
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.
|
|
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
|
-
|
|
393
|
-
|
|
394
|
-
|
|
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.
|
|
401
|
-
- Release tag: `v0.
|
|
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
|