From 83a6af30c125629bf417ba28bd853d56eebbc776 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Apr 2026 17:16:53 +0000 Subject: [PATCH 1/3] Initial plan From e68f6f5bf5f7289ad15e767a200d2717f54db5ef Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Apr 2026 17:18:16 +0000 Subject: [PATCH 2/3] Initial plan for removing experiment log issue Agent-Logs-Url: https://github.com/githubnext/autoloop/sessions/da00e65c-be29-4ac2-a848-0e26a65917f1 Co-authored-by: mrjf <180956+mrjf@users.noreply.github.com> --- .../conftest.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 3741 bytes ...est_scheduling.cpython-312-pytest-9.0.2.pyc | Bin 0 -> 101650 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc create mode 100644 tests/__pycache__/test_scheduling.cpython-312-pytest-9.0.2.pyc diff --git a/tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc b/tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94f6b912fc06133239e492fea21da1a05ca5294c GIT binary patch literal 3741 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 S+V@|umsuO`TL9RP{Qm<500{X2 literal 0 HcmV?d00001 From 309390d367a65281ad2bf50d37a6ce611144b6c8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 3 Apr 2026 17:22:07 +0000 Subject: [PATCH 3/3] =?UTF-8?q?Remove=20experiment=20log=20issue=20creatio?= =?UTF-8?q?n=20=E2=80=94=20consolidate=20iteration=20tracking=20on=20sourc?= =?UTF-8?q?e=20issue?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/githubnext/autoloop/sessions/da00e65c-be29-4ac2-a848-0e26a65917f1 Co-authored-by: mrjf <180956+mrjf@users.noreply.github.com> --- .github/workflows/autoloop.lock.yml | 9 +-- .github/workflows/autoloop.md | 75 ++++-------------- .gitignore | 1 + AGENTS.md | 2 +- create-program.md | 2 +- .../conftest.cpython-312-pytest-9.0.2.pyc | Bin 3741 -> 0 bytes ...st_scheduling.cpython-312-pytest-9.0.2.pyc | Bin 101650 -> 0 bytes workflows/autoloop.md | 75 ++++-------------- 8 files changed, 35 insertions(+), 129 deletions(-) create mode 100644 .gitignore delete mode 100644 tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc delete mode 100644 tests/__pycache__/test_scheduling.cpython-312-pytest-9.0.2.pyc diff --git a/.github/workflows/autoloop.lock.yml b/.github/workflows/autoloop.lock.yml index c575851..f9dd301 100644 --- a/.github/workflows/autoloop.lock.yml +++ b/.github/workflows/autoloop.lock.yml @@ -29,7 +29,6 @@ # - Persists all state via repo-memory (human-readable, human-editable) # - Commits accepted improvements to a long-running branch per program # - Maintains a single draft PR per program that accumulates all accepted iterations -# - Maintains a living experiment log as a GitHub issue # # Source: githubnext/autoloop # @@ -238,7 +237,7 @@ jobs: cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_prompt.md" cat << 'GH_AW_PROMPT_25eda8a50024125e_EOF' - Tools: add_comment(max:7), create_issue(max:2), update_issue(max:3), create_pull_request(max:2), add_labels(max:2), remove_labels(max:2), push_to_pull_request_branch(max:2), missing_tool, missing_data, noop + Tools: add_comment(max:7), create_issue(max:1), update_issue(max:3), create_pull_request(max:2), add_labels(max:2), remove_labels(max:2), push_to_pull_request_branch(max:2), missing_tool, missing_data, noop GH_AW_PROMPT_25eda8a50024125e_EOF cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_create_pull_request.md" cat "${RUNNER_TEMP}/gh-aw/prompts/safe_outputs_push_to_pr_branch.md" @@ -490,7 +489,7 @@ jobs: mkdir -p /tmp/gh-aw/safeoutputs mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs cat > ${RUNNER_TEMP}/gh-aw/safeoutputs/config.json << 'GH_AW_SAFE_OUTPUTS_CONFIG_4cb88c61a21f151b_EOF' - {"add_comment":{"hide_older_comments":false,"max":7,"target":"*"},"add_labels":{"max":2,"target":"*"},"create_issue":{"labels":["automation","autoloop"],"max":2,"title_prefix":"[Autoloop] "},"create_pull_request":{"draft":true,"labels":["automation","autoloop"],"max":2,"max_patch_size":1024,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS"],"protected_files_policy":"fallback-to-issue","protected_path_prefixes":[".github/",".agents/"],"title_prefix":"[Autoloop] "},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"push_repo_memory":{"memories":[{"dir":"/tmp/gh-aw/repo-memory/default","id":"default","max_file_count":100,"max_file_size":10240,"max_patch_size":10240}]},"push_to_pull_request_branch":{"if_no_changes":"warn","max":2,"max_patch_size":1024,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS"],"protected_path_prefixes":[".github/",".agents/"],"target":"*","title_prefix":"[Autoloop] "},"remove_labels":{"max":2,"target":"*"},"update_issue":{"allow_body":true,"max":3,"target":"*","title_prefix":"[Autoloop] "}} + {"add_comment":{"hide_older_comments":false,"max":7,"target":"*"},"add_labels":{"max":2,"target":"*"},"create_issue":{"labels":["automation","autoloop"],"max":1,"title_prefix":"[Autoloop] "},"create_pull_request":{"draft":true,"labels":["automation","autoloop"],"max":2,"max_patch_size":1024,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS"],"protected_files_policy":"fallback-to-issue","protected_path_prefixes":[".github/",".agents/"],"title_prefix":"[Autoloop] "},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"push_repo_memory":{"memories":[{"dir":"/tmp/gh-aw/repo-memory/default","id":"default","max_file_count":100,"max_file_size":10240,"max_patch_size":10240}]},"push_to_pull_request_branch":{"if_no_changes":"warn","max":2,"max_patch_size":1024,"protected_files":["package.json","bun.lockb","bunfig.toml","deno.json","deno.jsonc","deno.lock","global.json","NuGet.Config","Directory.Packages.props","mix.exs","mix.lock","go.mod","go.sum","stack.yaml","stack.yaml.lock","pom.xml","build.gradle","build.gradle.kts","settings.gradle","settings.gradle.kts","gradle.properties","package-lock.json","yarn.lock","pnpm-lock.yaml","npm-shrinkwrap.json","requirements.txt","Pipfile","Pipfile.lock","pyproject.toml","setup.py","setup.cfg","Gemfile","Gemfile.lock","uv.lock","CODEOWNERS"],"protected_path_prefixes":[".github/",".agents/"],"target":"*","title_prefix":"[Autoloop] "},"remove_labels":{"max":2,"target":"*"},"update_issue":{"allow_body":true,"max":3,"target":"*","title_prefix":"[Autoloop] "}} GH_AW_SAFE_OUTPUTS_CONFIG_4cb88c61a21f151b_EOF - name: Write Safe Outputs Tools run: | @@ -499,7 +498,7 @@ jobs: "description_suffixes": { "add_comment": " CONSTRAINTS: Maximum 7 comment(s) can be added. Target: *.", "add_labels": " CONSTRAINTS: Maximum 2 label(s) can be added. Target: *.", - "create_issue": " CONSTRAINTS: Maximum 2 issue(s) can be created. Title will be prefixed with \"[Autoloop] \". Labels [\"automation\" \"autoloop\"] will be automatically added.", + "create_issue": " CONSTRAINTS: Maximum 1 issue(s) can be created. Title will be prefixed with \"[Autoloop] \". Labels [\"automation\" \"autoloop\"] will be automatically added.", "create_pull_request": " CONSTRAINTS: Maximum 2 pull request(s) can be created. Title will be prefixed with \"[Autoloop] \". Labels [\"automation\" \"autoloop\"] will be automatically added. PRs will be created as drafts.", "push_to_pull_request_branch": " CONSTRAINTS: Maximum 2 push(es) can be made. The target pull request title must start with \"[Autoloop] \".", "remove_labels": " CONSTRAINTS: Maximum 2 label(s) can be removed. Target: *.", @@ -1275,7 +1274,7 @@ jobs: uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8 env: WORKFLOW_NAME: "Autoloop" - WORKFLOW_DESCRIPTION: "An iterative optimization loop inspired by Karpathy's Autoresearch and Claude Code's /loop.\nRuns on a configurable schedule to autonomously improve a target artifact toward a measurable goal.\nEach iteration: reads the program definition, proposes a change, evaluates against a metric,\nand accepts or rejects the change. Tracks all iterations in a rolling GitHub issue.\n- User defines the optimization goal and evaluation criteria in a program.md file\n- Accepts changes only when they improve the metric (ratchet pattern)\n- Persists all state via repo-memory (human-readable, human-editable)\n- Commits accepted improvements to a long-running branch per program\n- Maintains a single draft PR per program that accumulates all accepted iterations\n- Maintains a living experiment log as a GitHub issue" + WORKFLOW_DESCRIPTION: "An iterative optimization loop inspired by Karpathy's Autoresearch and Claude Code's /loop.\nRuns on a configurable schedule to autonomously improve a target artifact toward a measurable goal.\nEach iteration: reads the program definition, proposes a change, evaluates against a metric,\nand accepts or rejects the change.\n- User defines the optimization goal and evaluation criteria in a program.md file\n- Accepts changes only when they improve the metric (ratchet pattern)\n- Persists all state via repo-memory (human-readable, human-editable)\n- Commits accepted improvements to a long-running branch per program\n- Maintains a single draft PR per program that accumulates all accepted iterations" HAS_PATCH: ${{ needs.agent.outputs.has_patch }} with: script: | diff --git a/.github/workflows/autoloop.md b/.github/workflows/autoloop.md index 1290679..b467625 100644 --- a/.github/workflows/autoloop.md +++ b/.github/workflows/autoloop.md @@ -3,13 +3,12 @@ description: | An iterative optimization loop inspired by Karpathy's Autoresearch and Claude Code's /loop. Runs on a configurable schedule to autonomously improve a target artifact toward a measurable goal. Each iteration: reads the program definition, proposes a change, evaluates against a metric, - and accepts or rejects the change. Tracks all iterations in a rolling GitHub issue. + and accepts or rejects the change. - User defines the optimization goal and evaluation criteria in a program.md file - Accepts changes only when they improve the metric (ratchet pattern) - Persists all state via repo-memory (human-readable, human-editable) - Commits accepted improvements to a long-running branch per program - Maintains a single draft PR per program that accumulates all accepted iterations - - Maintains a living experiment log as a GitHub issue on: schedule: every 6h @@ -53,7 +52,7 @@ safe-outputs: create-issue: title-prefix: "[Autoloop] " labels: [automation, autoloop] - max: 2 + max: 1 update-issue: target: "*" title-prefix: "[Autoloop] " @@ -570,7 +569,6 @@ GitHub Issues (labeled 'autoloop-program'): Each program runs independently with its own: - Goal, target files, and evaluation command - Metric tracking and best-metric history -- Experiment log issue: `[Autoloop: {program-name}] Experiment Log {YYYY-MM}` - Steering issue: `[Autoloop: {program-name}] Steering` (persistent, links branch/PR/state) - Long-running branch: `autoloop/{program-name}` (persists across iterations) - Single draft PR per program: `[Autoloop: {program-name}]` (accumulates all accepted iterations) @@ -715,81 +713,38 @@ Each run executes **one iteration for the single selected program**: - Body includes: a summary of the program goal, link to the steering issue, the current best metric, and AI disclosure: `🤖 *This PR is maintained by Autoloop. Each accepted iteration adds a commit to this branch.*` If a draft PR already exists, update the PR body with the latest metric and a summary of the most recent accepted iteration. Add a comment to the PR summarizing the iteration: what changed, old metric, new metric, improvement delta, and a link to the actions run. 4. Ensure the steering issue exists (see [Steering Issue](#steering-issue) below). Add a comment to the steering issue linking to the commit and actions run. -5. Add an entry to the experiment log issue. -6. Update the state file `{program-name}.md` in the repo-memory folder: +5. Update the state file `{program-name}.md` in the repo-memory folder: - Update the **⚙️ Machine State** table: reset `consecutive_errors` to 0, set `best_metric`, increment `iteration_count`, set `last_run` to current UTC timestamp, append `"accepted"` to `recent_statuses` (keep last 10), set `paused` to false. - Prepend an entry to **📊 Iteration History** (newest first) with status ✅, metric, PR link, and a one-line summary of what changed and why it worked. - Update **📚 Lessons Learned** if this iteration revealed something new about the problem or what works. - Update **🔭 Future Directions** if this iteration opened new promising paths. -7. **If this is an issue-based program** (`selected_issue` is not null): update the status comment and post a per-run comment on the source issue (see [Issue-Based Program Updates](#issue-based-program-updates)). -8. **Check halting condition** (see [Halting Condition](#halting-condition)): If the program has a `target-metric` in its frontmatter and the new `best_metric` meets or surpasses the target, mark the program as completed. +6. **If this is an issue-based program** (`selected_issue` is not null): update the status comment and post a per-run comment on the source issue (see [Issue-Based Program Updates](#issue-based-program-updates)). +7. **Check halting condition** (see [Halting Condition](#halting-condition)): If the program has a `target-metric` in its frontmatter and the new `best_metric` meets or surpasses the target, mark the program as completed. **If the metric did not improve**: 1. Discard the code changes (do not commit them to the long-running branch). -2. Add a "rejected" entry to the experiment log issue. -3. Update the state file `{program-name}.md` in the repo-memory folder: +2. Update the state file `{program-name}.md` in the repo-memory folder: - Update the **⚙️ Machine State** table: increment `iteration_count`, set `last_run`, append `"rejected"` to `recent_statuses` (keep last 10). - Prepend an entry to **📊 Iteration History** with status ❌, metric, and a one-line summary of what was tried. - If this approach is conclusively ruled out (e.g., tried multiple variations and all fail), add it to **🚧 Foreclosed Avenues** with a clear explanation. - Update **🔭 Future Directions** if this rejection clarified what to try next. -4. **If this is an issue-based program** (`selected_issue` is not null): update the status comment and post a per-run comment on the source issue (see [Issue-Based Program Updates](#issue-based-program-updates)). +3. **If this is an issue-based program** (`selected_issue` is not null): update the status comment and post a per-run comment on the source issue (see [Issue-Based Program Updates](#issue-based-program-updates)). **If evaluation could not run** (build failure, missing dependencies, etc.): 1. Discard the code changes (do not commit them to the long-running branch). -2. Add an "error" entry to the experiment log issue. -3. Update the state file `{program-name}.md` in the repo-memory folder: +2. Update the state file `{program-name}.md` in the repo-memory folder: - Update the **⚙️ Machine State** table: increment `consecutive_errors`, increment `iteration_count`, set `last_run`, append `"error"` to `recent_statuses` (keep last 10). - If `consecutive_errors` reaches 3+, set `paused` to `true` and set `pause_reason` in the Machine State table, and create an issue describing the problem. - Prepend an entry to **📊 Iteration History** with status ⚠️ and a brief error description. -4. **If this is an issue-based program** (`selected_issue` is not null): update the status comment and post a per-run comment on the source issue (see [Issue-Based Program Updates](#issue-based-program-updates)). - -## Experiment Log Issue - -Maintain a single open issue **per program** titled `[Autoloop: {program-name}] Experiment Log {YYYY}-{MM}` as a rolling record of that program's iterations. - -### Issue Body Format - -```markdown -🤖 *Autoloop — an iterative optimization agent for this repository.* - -## Program - -**Goal**: {one-line summary from program.md} -**Target files**: {list of target files} -**Metric**: {metric name} ({higher/lower} is better) -**Current best**: {best_metric} (established in iteration {N}) - -## Iteration History - -### Iteration {N} — {YYYY-MM-DD HH:MM UTC} — [Run]({run_url}) -- **Status**: ✅ Accepted / ❌ Rejected / ⚠️ Error -- **Change**: {one-line description} -- **Metric**: {value} (previous best: {previous_best}, delta: {delta}) -- **Commit**: {short_sha} (if accepted) - -### Iteration {N-1} — {YYYY-MM-DD HH:MM UTC} — [Run]({run_url}) -- **Status**: ❌ Rejected -- **Change**: {one-line description} -- **Metric**: {value} (previous best: {previous_best}, delta: {delta}) -- **Reason**: {why it was rejected} -``` - -### Format Rules - -- Iterations in **reverse chronological order** (newest first). -- Each iteration heading links to its GitHub Actions run. -- Use `${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}` for the current run URL. -- Close the previous month's issue and create a new one at month boundaries. -- Maximum 50 iterations per issue; create a continuation issue if exceeded. +3. **If this is an issue-based program** (`selected_issue` is not null): update the status comment and post a per-run comment on the source issue (see [Issue-Based Program Updates](#issue-based-program-updates)). ## Steering Issue -Maintain a single **persistent** open issue per program titled `[Autoloop: {program-name}] Steering`. Unlike experiment log issues (which rotate monthly), the steering issue lives for the entire lifetime of the program. +Maintain a single **persistent** open issue per program titled `[Autoloop: {program-name}] Steering`. The steering issue lives for the entire lifetime of the program. -The steering issue serves as the central coordination point linking together the program's three key resources: +The steering issue serves as the central coordination point linking together the program's key resources: - The **long-running branch** `autoloop/{program-name}` and its draft PR - The **state file** `{program-name}.md` in repo-memory (on the `memory/autoloop` branch) -- The **experiment log** issues ### Steering Issue Body Format @@ -801,7 +756,6 @@ The steering issue serves as the central coordination point linking together the - **Branch**: [`autoloop/{program-name}`](https://github.com/{owner}/{repo}/tree/autoloop/{program-name}) - **Pull Request**: #{pr_number} - **State File**: [`{program-name}.md`](https://github.com/{owner}/{repo}/blob/memory/autoloop/{program-name}.md) -- **Experiment Log**: #{experiment_log_issue_number} ## Program @@ -814,14 +768,14 @@ The steering issue serves as the central coordination point linking together the ### Steering Issue Rules - Create the steering issue on the **first accepted iteration** for the program if it does not already exist. -- **Update the issue body** whenever the best metric, PR number, or experiment log issue changes. +- **Update the issue body** whenever the best metric or PR number changes. - **Add a comment** on each accepted iteration with a link to the commit and actions run. - The steering issue is labeled `[automation, autoloop]`. - Do NOT close the steering issue when the PR is merged — the branch continues to accumulate future iterations. ## Issue-Based Program Updates -When a program is defined via a GitHub issue (i.e., `selected_issue` is not null in `/tmp/gh-aw/autoloop.json`), the source issue itself serves as the program definition **and** as the primary interface for steering and monitoring the program. In addition to the normal iteration workflow (state file, experiment log, steering issue, PR), you must also update the source issue. +When a program is defined via a GitHub issue (i.e., `selected_issue` is not null in `/tmp/gh-aw/autoloop.json`), the source issue itself serves as the program definition **and** as the primary interface for steering and monitoring the program. In addition to the normal iteration workflow (state file, steering issue, PR), you must also update the source issue. ### Status Comment @@ -845,7 +799,6 @@ Find the status comment by searching for a comment containing ``) is maintained on the source issue, and a per-run comment is posted after each iteration diff --git a/create-program.md b/create-program.md index 860251d..33aff3c 100644 --- a/create-program.md +++ b/create-program.md @@ -24,7 +24,7 @@ Autoloop is a GitHub Agentic Workflow that runs iterative optimization loops. Ea .autoloop/programs/.md ``` -A repository can have multiple programs running independently. Each gets its own schedule, metric tracking, experiment log issue, long-running branch (`autoloop/`), and draft PR. +A repository can have multiple programs running independently. Each gets its own schedule, metric tracking, long-running branch (`autoloop/`), and draft PR. ## Step 1: Understand the Repository diff --git a/tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc b/tests/__pycache__/conftest.cpython-312-pytest-9.0.2.pyc deleted file mode 100644 index 94f6b912fc06133239e492fea21da1a05ca5294c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3741 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 S+V@|umsuO`TL9RP{Qm<500{X2 diff --git a/workflows/autoloop.md b/workflows/autoloop.md index 1290679..b467625 100644 --- a/workflows/autoloop.md +++ b/workflows/autoloop.md @@ -3,13 +3,12 @@ description: | An iterative optimization loop inspired by Karpathy's Autoresearch and Claude Code's /loop. Runs on a configurable schedule to autonomously improve a target artifact toward a measurable goal. Each iteration: reads the program definition, proposes a change, evaluates against a metric, - and accepts or rejects the change. Tracks all iterations in a rolling GitHub issue. + and accepts or rejects the change. - User defines the optimization goal and evaluation criteria in a program.md file - Accepts changes only when they improve the metric (ratchet pattern) - Persists all state via repo-memory (human-readable, human-editable) - Commits accepted improvements to a long-running branch per program - Maintains a single draft PR per program that accumulates all accepted iterations - - Maintains a living experiment log as a GitHub issue on: schedule: every 6h @@ -53,7 +52,7 @@ safe-outputs: create-issue: title-prefix: "[Autoloop] " labels: [automation, autoloop] - max: 2 + max: 1 update-issue: target: "*" title-prefix: "[Autoloop] " @@ -570,7 +569,6 @@ GitHub Issues (labeled 'autoloop-program'): Each program runs independently with its own: - Goal, target files, and evaluation command - Metric tracking and best-metric history -- Experiment log issue: `[Autoloop: {program-name}] Experiment Log {YYYY-MM}` - Steering issue: `[Autoloop: {program-name}] Steering` (persistent, links branch/PR/state) - Long-running branch: `autoloop/{program-name}` (persists across iterations) - Single draft PR per program: `[Autoloop: {program-name}]` (accumulates all accepted iterations) @@ -715,81 +713,38 @@ Each run executes **one iteration for the single selected program**: - Body includes: a summary of the program goal, link to the steering issue, the current best metric, and AI disclosure: `🤖 *This PR is maintained by Autoloop. Each accepted iteration adds a commit to this branch.*` If a draft PR already exists, update the PR body with the latest metric and a summary of the most recent accepted iteration. Add a comment to the PR summarizing the iteration: what changed, old metric, new metric, improvement delta, and a link to the actions run. 4. Ensure the steering issue exists (see [Steering Issue](#steering-issue) below). Add a comment to the steering issue linking to the commit and actions run. -5. Add an entry to the experiment log issue. -6. Update the state file `{program-name}.md` in the repo-memory folder: +5. Update the state file `{program-name}.md` in the repo-memory folder: - Update the **⚙️ Machine State** table: reset `consecutive_errors` to 0, set `best_metric`, increment `iteration_count`, set `last_run` to current UTC timestamp, append `"accepted"` to `recent_statuses` (keep last 10), set `paused` to false. - Prepend an entry to **📊 Iteration History** (newest first) with status ✅, metric, PR link, and a one-line summary of what changed and why it worked. - Update **📚 Lessons Learned** if this iteration revealed something new about the problem or what works. - Update **🔭 Future Directions** if this iteration opened new promising paths. -7. **If this is an issue-based program** (`selected_issue` is not null): update the status comment and post a per-run comment on the source issue (see [Issue-Based Program Updates](#issue-based-program-updates)). -8. **Check halting condition** (see [Halting Condition](#halting-condition)): If the program has a `target-metric` in its frontmatter and the new `best_metric` meets or surpasses the target, mark the program as completed. +6. **If this is an issue-based program** (`selected_issue` is not null): update the status comment and post a per-run comment on the source issue (see [Issue-Based Program Updates](#issue-based-program-updates)). +7. **Check halting condition** (see [Halting Condition](#halting-condition)): If the program has a `target-metric` in its frontmatter and the new `best_metric` meets or surpasses the target, mark the program as completed. **If the metric did not improve**: 1. Discard the code changes (do not commit them to the long-running branch). -2. Add a "rejected" entry to the experiment log issue. -3. Update the state file `{program-name}.md` in the repo-memory folder: +2. Update the state file `{program-name}.md` in the repo-memory folder: - Update the **⚙️ Machine State** table: increment `iteration_count`, set `last_run`, append `"rejected"` to `recent_statuses` (keep last 10). - Prepend an entry to **📊 Iteration History** with status ❌, metric, and a one-line summary of what was tried. - If this approach is conclusively ruled out (e.g., tried multiple variations and all fail), add it to **🚧 Foreclosed Avenues** with a clear explanation. - Update **🔭 Future Directions** if this rejection clarified what to try next. -4. **If this is an issue-based program** (`selected_issue` is not null): update the status comment and post a per-run comment on the source issue (see [Issue-Based Program Updates](#issue-based-program-updates)). +3. **If this is an issue-based program** (`selected_issue` is not null): update the status comment and post a per-run comment on the source issue (see [Issue-Based Program Updates](#issue-based-program-updates)). **If evaluation could not run** (build failure, missing dependencies, etc.): 1. Discard the code changes (do not commit them to the long-running branch). -2. Add an "error" entry to the experiment log issue. -3. Update the state file `{program-name}.md` in the repo-memory folder: +2. Update the state file `{program-name}.md` in the repo-memory folder: - Update the **⚙️ Machine State** table: increment `consecutive_errors`, increment `iteration_count`, set `last_run`, append `"error"` to `recent_statuses` (keep last 10). - If `consecutive_errors` reaches 3+, set `paused` to `true` and set `pause_reason` in the Machine State table, and create an issue describing the problem. - Prepend an entry to **📊 Iteration History** with status ⚠️ and a brief error description. -4. **If this is an issue-based program** (`selected_issue` is not null): update the status comment and post a per-run comment on the source issue (see [Issue-Based Program Updates](#issue-based-program-updates)). - -## Experiment Log Issue - -Maintain a single open issue **per program** titled `[Autoloop: {program-name}] Experiment Log {YYYY}-{MM}` as a rolling record of that program's iterations. - -### Issue Body Format - -```markdown -🤖 *Autoloop — an iterative optimization agent for this repository.* - -## Program - -**Goal**: {one-line summary from program.md} -**Target files**: {list of target files} -**Metric**: {metric name} ({higher/lower} is better) -**Current best**: {best_metric} (established in iteration {N}) - -## Iteration History - -### Iteration {N} — {YYYY-MM-DD HH:MM UTC} — [Run]({run_url}) -- **Status**: ✅ Accepted / ❌ Rejected / ⚠️ Error -- **Change**: {one-line description} -- **Metric**: {value} (previous best: {previous_best}, delta: {delta}) -- **Commit**: {short_sha} (if accepted) - -### Iteration {N-1} — {YYYY-MM-DD HH:MM UTC} — [Run]({run_url}) -- **Status**: ❌ Rejected -- **Change**: {one-line description} -- **Metric**: {value} (previous best: {previous_best}, delta: {delta}) -- **Reason**: {why it was rejected} -``` - -### Format Rules - -- Iterations in **reverse chronological order** (newest first). -- Each iteration heading links to its GitHub Actions run. -- Use `${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}` for the current run URL. -- Close the previous month's issue and create a new one at month boundaries. -- Maximum 50 iterations per issue; create a continuation issue if exceeded. +3. **If this is an issue-based program** (`selected_issue` is not null): update the status comment and post a per-run comment on the source issue (see [Issue-Based Program Updates](#issue-based-program-updates)). ## Steering Issue -Maintain a single **persistent** open issue per program titled `[Autoloop: {program-name}] Steering`. Unlike experiment log issues (which rotate monthly), the steering issue lives for the entire lifetime of the program. +Maintain a single **persistent** open issue per program titled `[Autoloop: {program-name}] Steering`. The steering issue lives for the entire lifetime of the program. -The steering issue serves as the central coordination point linking together the program's three key resources: +The steering issue serves as the central coordination point linking together the program's key resources: - The **long-running branch** `autoloop/{program-name}` and its draft PR - The **state file** `{program-name}.md` in repo-memory (on the `memory/autoloop` branch) -- The **experiment log** issues ### Steering Issue Body Format @@ -801,7 +756,6 @@ The steering issue serves as the central coordination point linking together the - **Branch**: [`autoloop/{program-name}`](https://github.com/{owner}/{repo}/tree/autoloop/{program-name}) - **Pull Request**: #{pr_number} - **State File**: [`{program-name}.md`](https://github.com/{owner}/{repo}/blob/memory/autoloop/{program-name}.md) -- **Experiment Log**: #{experiment_log_issue_number} ## Program @@ -814,14 +768,14 @@ The steering issue serves as the central coordination point linking together the ### Steering Issue Rules - Create the steering issue on the **first accepted iteration** for the program if it does not already exist. -- **Update the issue body** whenever the best metric, PR number, or experiment log issue changes. +- **Update the issue body** whenever the best metric or PR number changes. - **Add a comment** on each accepted iteration with a link to the commit and actions run. - The steering issue is labeled `[automation, autoloop]`. - Do NOT close the steering issue when the PR is merged — the branch continues to accumulate future iterations. ## Issue-Based Program Updates -When a program is defined via a GitHub issue (i.e., `selected_issue` is not null in `/tmp/gh-aw/autoloop.json`), the source issue itself serves as the program definition **and** as the primary interface for steering and monitoring the program. In addition to the normal iteration workflow (state file, experiment log, steering issue, PR), you must also update the source issue. +When a program is defined via a GitHub issue (i.e., `selected_issue` is not null in `/tmp/gh-aw/autoloop.json`), the source issue itself serves as the program definition **and** as the primary interface for steering and monitoring the program. In addition to the normal iteration workflow (state file, steering issue, PR), you must also update the source issue. ### Status Comment @@ -845,7 +799,6 @@ Find the status comment by searching for a comment containing `