You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Issue #1 (the build-tsb-pandas-typescript-migration autoloop program) has received no new comments since 2026-04-12 — over 8 days. The state file on memory/autoloop says Last Run: 2026-04-12T11:15:07Z, Iteration Count: 230, Paused: false, Completed: false. The program is healthy by every recorded criterion, but it is never selected.
Meanwhile perf-comparison runs every 30 minutes.
Root cause
The autoloop pre-step ("Check which programs are due") reads state files from /tmp/gh-aw/repo-memory/autoloop/, but the memory-clone step runs after the pre-step and clones to /tmp/gh-aw/repo-memory/default/. Wrong directory and wrong order — the pre-step never sees state for any program.
Confirmed in the agent-job log for run 24642957273:
Found issue-based program: 'build-tsb-pandas-typescript-migration' (issue #1)
perf-comparison: no state file found (first run)
perf-comparison: no state found (first run)
build-tsb-pandas-typescript-migration: no state file found (first run)
build-tsb-pandas-typescript-migration: no state found (first run)
=== Autoloop Program Check ===
Selected program: perf-comparison (.autoloop/programs/perf-comparison/program.md)
Deferred (next run): ['build-tsb-pandas-typescript-migration']
Programs skipped: (none)
Relevant code in .github/workflows/autoloop.md:
L107: repo_memory_dir = "/tmp/gh-aw/repo-memory/autoloop" — where the Python pre-step looks for state files.
The memory-clone step (downstream of the pre-step) sets MEMORY_DIR=/tmp/gh-aw/repo-memory/default and clones memory/autoloop there after the Python script has already run.
Why build-tsb gets starved
Without state, every program looks like "first run" (no last_run, nothing to order by). The selection tiebreaker picks programs in program_files order, which appends file-based programs first (perf-comparison) and issue-based programs last (build-tsb-pandas-typescript-migration). So every run:
Both programs discovered.
Both "no state found → treat as first run".
perf-comparison wins the tiebreaker.
build-tsb-pandas-typescript-migration is deferred to "next run".
Next run: go to step 1.
Nothing breaks the cycle. build-tsb has been in "deferred" purgatory for 8 days.
Fix
Clone the memory/autoloop branch into /tmp/gh-aw/repo-memory/autoloop/before the "Check which programs are due" step runs. Options:
Option A (minimal): Add a shell step at the top of the steps: list that does the clone:
steps:
- name: Clone repo-memory for schedulerenv:
GITHUB_TOKEN: ${{ github.token }}GITHUB_REPOSITORY: ${{ github.repository }}run: | mkdir -p /tmp/gh-aw/repo-memory git clone --depth=1 --branch memory/autoloop \ "https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git" \ /tmp/gh-aw/repo-memory/autoloop \ || mkdir -p /tmp/gh-aw/repo-memory/autoloop # branch may not exist on first run
- name: Check which programs are due# (existing step)
Option B: Do the memory/autoloop fetch inline within the existing Python script using the GitHub Contents API (no separate shell step; single source of truth for where state lives). Heavier rewrite but less moving parts.
Option C: Reorder so gh-aw's built-in repo-memory clone runs before the pre-step, and change the pre-step to read from wherever the built-in clone lands. Requires coordination with gh-aw plumbing; brittle.
Prefer Option A — it's additive, doesn't touch gh-aw internals, and it's obvious from reading the workflow why the clone is there.
Secondary fix — deterministic tie-breaking
Even after the state is read, when a program genuinely has never run, the tiebreaker should avoid permanent starvation. Prefer:
Among programs with no last_run, pick the one whose schedule is shortest (so "every 30m" beats "every 6h"), then fall back to alphabetical by name.
This way build-tsb (every 30m) would beat perf-comparison (every 6h) on the first run after the fix, then state catches up and ordinary last_run ordering takes over.
Acceptance
After merge, the next autoloop run logs build-tsb-pandas-typescript-migration: last_run=2026-04-12T11:15:07Z, iteration_count=230 (state successfully read).
Symptom
Issue #1 (the
build-tsb-pandas-typescript-migrationautoloop program) has received no new comments since 2026-04-12 — over 8 days. The state file onmemory/autoloopsaysLast Run: 2026-04-12T11:15:07Z,Iteration Count: 230,Paused: false,Completed: false. The program is healthy by every recorded criterion, but it is never selected.Meanwhile
perf-comparisonruns every 30 minutes.Root cause
The autoloop pre-step ("Check which programs are due") reads state files from
/tmp/gh-aw/repo-memory/autoloop/, but the memory-clone step runs after the pre-step and clones to/tmp/gh-aw/repo-memory/default/. Wrong directory and wrong order — the pre-step never sees state for any program.Confirmed in the agent-job log for run 24642957273:
Relevant code in
.github/workflows/autoloop.md:repo_memory_dir = "/tmp/gh-aw/repo-memory/autoloop"— where the Python pre-step looks for state files.MEMORY_DIR=/tmp/gh-aw/repo-memory/defaultand clonesmemory/autoloopthere after the Python script has already run.Why build-tsb gets starved
Without state, every program looks like "first run" (no
last_run, nothing to order by). The selection tiebreaker picks programs inprogram_filesorder, which appends file-based programs first (perf-comparison) and issue-based programs last (build-tsb-pandas-typescript-migration). So every run:perf-comparisonwins the tiebreaker.build-tsb-pandas-typescript-migrationis deferred to "next run".Nothing breaks the cycle.
build-tsbhas been in "deferred" purgatory for 8 days.Fix
Clone the
memory/autoloopbranch into/tmp/gh-aw/repo-memory/autoloop/before the "Check which programs are due" step runs. Options:Option A (minimal): Add a shell step at the top of the
steps:list that does the clone:Option B: Do the
memory/autoloopfetch inline within the existing Python script using the GitHub Contents API (no separate shell step; single source of truth for where state lives). Heavier rewrite but less moving parts.Option C: Reorder so gh-aw's built-in repo-memory clone runs before the pre-step, and change the pre-step to read from wherever the built-in clone lands. Requires coordination with gh-aw plumbing; brittle.
Prefer Option A — it's additive, doesn't touch gh-aw internals, and it's obvious from reading the workflow why the clone is there.
Secondary fix — deterministic tie-breaking
Even after the state is read, when a program genuinely has never run, the tiebreaker should avoid permanent starvation. Prefer:
last_run, pick the one whosescheduleis shortest (so "every 30m" beats "every 6h"), then fall back to alphabetical by name.build-tsb(every 30m) would beatperf-comparison(every 6h) on the first run after the fix, then state catches up and ordinarylast_runordering takes over.Acceptance
build-tsb-pandas-typescript-migration: last_run=2026-04-12T11:15:07Z, iteration_count=230(state successfully read).perf-comparisonandbuild-tsbalternate naturally based onlast_run, with neither starved.Context
build-tsb-pandas-typescript-migration.mdonmemory/autoloopbranch,Last Run: 2026-04-12T11:15:07Z.