Skip to content

feat: autocoder history logging + /retro command#12

Merged
laird merged 55 commits into
masterfrom
feat/fix-loop-token-efficiency
May 30, 2026
Merged

feat: autocoder history logging + /retro command#12
laird merged 55 commits into
masterfrom
feat/fix-loop-token-efficiency

Conversation

@laird

@laird laird commented May 30, 2026

Copy link
Copy Markdown
Owner

Summary

  • Extends shared scripts/append-to-history.sh with --backend [file|github|auto] and --history-file flags; GitHub backend creates/posts to a history-log labeled issue; bare filenames auto-resolve to the main git worktree so parallel fix-loop workers write to one file
  • Distributes the script identically to plugins/autocoder/scripts/, plugins/modernize/scripts/, and .agent/scripts/
  • Adds 5 history logging calls in fix.md (simple PR, simple merge, complex PR, complex merge, blocking) and mirrored to .agent/workflows/fix.md
  • Adds SCRIPT_DIR enforcement + two logging calls to full-regression-test.md and its .agent mirror
  • Creates new /retro command (plugins/autocoder/commands/retro.md + .agent mirror): 4-phase analysis (history, git log, issue tracker, test failures) → IMPROVEMENTS.md
  • Bumps autocoder 4.0.0 → 4.1.0, marketplace 3.19.0 → 3.20.0, registers retro command

Design process

Spec → CDR round 1 → spec updated → implementation plan → 2 CIR rounds (caught non-unique Edit anchors and cut vs sed worktree path bug) → subagent execution (10 tasks) → completion review

Caveats (from completion review)

  • ${ISSUE_BODY:0:150} in fix.md logging calls flows into an unquoted heredoc — sanitize before heavy GitHub-backend use
  • UNIT_PASS/UNIT_TOTAL etc. not yet wired in full-regression-test.md logging calls; entries show ?/? until connected
  • .agent/workflows/retro.md replaces a pre-existing 146-line modernize retro stub (naming collision in Antigravity's flat namespace)

Test plan

  • 59 existing pytest tests pass
  • append-to-history.sh verified: file backend, backward compat, auto-detect, error paths, worktree detection
  • GitHub backend error guard (no auth → clean exit 1 with message)

🤖 Generated with Claude Code

laird and others added 30 commits May 21, 2026 17:26
Workflow commands had GitHub-specific gh calls hardcoded, so file-backend
users hit gh-auth errors and saw irrelevant label-setup output. Gate the
GitHub-only blocks on ISSUE_SOURCE=github and route issue ops through the
backend-neutral issue_update/issue_comment functions (or /update-issue
slash command in user-facing prose). Mirrored to both .agent/workflows/
and plugins/autocoder/commands/.

Also adds .gitignore entries for __pycache__, .playwright-mcp/, and the
machine-local .autocoder.json config, plus the critical review doc for
the pluggable-issue-source implementation plan.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
Six CDR cycles + thorough-brainstorming verification produced
docs/specs/2026-05-21-fix-loop-token-efficiency-design.md.
Anthropic pricing verified against platform docs; Opus 4.7
corrected from $15→$5/MTok. Spec includes Appendix A with
empirical verification trail (19 assumptions).

🤖 Generated with Claude Code
Phase 1 of fix-loop token-efficiency plan. issues-file.py
'update --add-label LBL --if-unset' exits 9 if label already
present, race-free under the existing flock(LOCK_EX). Enables
fix-loop-gate.sh to do CAS-style atomic issue claiming.

Tests: 4/4 pass — claim-succeeds, claim-fails-when-set,
add-label-idempotent (regression), 10-process concurrent race
(exactly one winner, no duplicate labels).

🤖 Generated with Claude Code
Phase 2.0 of fix-loop token-efficiency plan (deterministic
subset; PostSessionEnd probe and TTL calibration deferred).

- gate-log.py: append-only JSONL writer per spec §13.2
- analyze-gate-log.py: defensive parser, CSV + markdown output,
  fails on schema drift, warns on unknown fields
- sample-session.jsonl + sample-gate.jsonl: golden-output
  fixtures (1024/8192/0/37 tokens, claude-sonnet-4-6)
- test_analyze_gate_log.py: 3/3 pass (golden / schema-fail /
  unknown-warn)
- README-measurement-tooling.md: usage docs
- fix-loop-gate.sh: pre-LLM gate from earlier in plan

Real Anthropic jsonl schema confirmed: usage at message.usage.*
(not top-level), model at message.model. KNOWN_USAGE_EXTRAS
whitelists undocumented fields (server_tool_use, service_tier,
cache_creation, inference_geo, iterations, speed).

🤖 Generated with Claude Code
Phase 0 of fix-loop token-efficiency plan. Default
IDLE_SLEEP_MINUTES 15→4 keeps consecutive ticks inside the 5-min
prompt cache TTL. See docs/specs/2026-05-21-fix-loop-token-efficiency-design.md §6
for the math: ~9× cheaper per idle tick on Sonnet at the cost of
4× tick frequency.

- plugins/autocoder/commands/fix-loop.md + .agent/workflows/fix-loop.md:
  IDLE_SLEEP_MINUTES default 15→4, help text updated, comment cites spec
- plugins/autocoder/scripts/run-phase-experiment.sh: experiment
  runner skeleton; dry-run default, --execute stubbed with
  PostSessionEnd TODO until Phase 2.0 verifies hook availability
- plugins/autocoder/scripts/phase0-1h-ttl-probe.md: runbook for
  the 1-h TTL vs 5-min TTL comparison mandated by §13.4 Phase 0
  acceptance (both configs measured; cheaper wins)

Queue-state fixtures the runner expects under tests/fixtures/
queue-state-*.sh are pending (separate task).

🤖 Generated with Claude Code
Four fixtures under tests/fixtures/ for the experiment runner:
queue-state-{empty, p2-bug, triage, active}.sh. Each script
takes setup|teardown, honors ISSUE_DIR_PATH, backs up existing
.issues/ to a sidecar before installing fixture state, restores
on teardown. Marker file (not $$) so teardown works from a
different process.

Fixture states:
- empty: no open issues
- p2-bug: 1 P2 bug
- triage: 5 issues without P0-P3 labels
- active: 3 issues — P0 mid-fix (working), P1 ready, P2 enhancement

🤖 Generated with Claude Code
Empirical test 2026-05-21: spawned Task subagents with model=haiku
and model=opus from an Opus 4.7 parent. Both reported their own
distinct model identity (claude-haiku-4-5-20251001 vs
claude-opus-4-7[1m]).

A2 (Task model= override) ✅ confirmed. A1 (Skill inheritance) not
directly tested but moot for Phase 2 (same-model only); flagged
for re-test only if Phase 3 design changes to need cross-model Skill.

Phase 2 + Phase 3 + Phase 4 dispatch architecture all unblocked.

🤖 Generated with Claude Code
The /loop cron now invokes /autocoder:gate instead of /autocoder:fix.
Gate body is 1973 bytes (≪ 75 KB fix.md), so idle ticks load the
slim command via prompt cache instead of the full triage workflow.

- plugins/autocoder/commands/gate.md (new, 1973 B): reads
  /tmp/autocoder-work.json from fix-loop-gate.sh, branches on
  phase (triage handled inline with condensed decision matrix;
  fix/enhance delegates to /autocoder:fix N via Skill).
- plugins/autocoder/commands/fix-loop.md + .agent/workflows/
  fix-loop.md: invocation target switched to /autocoder:gate.

/autocoder:fix N (direct invocation with issue number) unchanged
for backward compat. Phase 4 (slim fix.md itself) is separate.

Phase 2 acceptance per §13.4 requires measured per-tick input ≤15%
of pre-Phase-2 baseline; that measurement awaits the §10 Phase 2.0
PostSessionEnd hook probe (runtime experiment, separate ticket).

🤖 Generated with Claude Code
Opt-in model-split routing for fix-loop. Set LOOP_MODEL_SPLIT=1
to use /autocoder:dispatch (Haiku) instead of /autocoder:gate
(same-model). Default is unchanged — dispatch is opt-in until
Phase 3 acceptance per §13.4 is measured.

- plugins/autocoder/commands/dispatch.md (new, 2700 B):
  frontmatter model=claude-haiku-4-5 (verified id from §7.1.1).
  Triage path runs inline on Haiku; fix/enhance path spawns
  Task(model="sonnet"|"opus") subagent to load /autocoder:fix N.
- plugins/autocoder/commands/fix-loop.md + .agent/workflows/
  fix-loop.md: LOOP_TARGET dispatch switch; default unchanged.
- tests/triage_corpus/README.md (placeholder for the
  Haiku-vs-Sonnet correctness corpus mandated by §13.4 Phase 3).

§7.1.1 verified A2 (Task model= override) so the Haiku→Sonnet
handoff is viable. Acceptance criteria (≥80% triage agreement
with Sonnet baseline, ≤30% per-tick cost) await the corpus and
runtime measurement.

🤖 Generated with Claude Code
Per .issues/001.md item 1: 10 synthetic GitHub-style issue bodies
under tests/triage_corpus/issues/ with expected.csv ground truth
covering P0×2, P1×3, P2×3, P3×2. Two deliberately ambiguous cases
(SSO down for 65% of users; "feels slow sometimes") flagged so
Haiku/Sonnet disagreement on borderline calls doesn't penalize
either model.

README rewritten with purpose (§13.4 Phase 3 gate), runner
pseudocode, ≥80% Haiku/Sonnet agreement threshold, extension
instructions. Actual benchmark runner is a runtime experiment
(separate, runtime-only).

🤖 Generated with Claude Code
… items 3,5)

Per .issues/001.md items 3, 5:

- run-phase-experiment.sh: --inject-at <N> + --inject-fixture <name>
  now produce a documented dry-run preview line and a
  commented-out --execute block showing the background-sleeper
  (sleep N && fixture.sh setup) & pattern. Timing model
  documented: fires from runner PID, not a separate cron tick.
- docs/reports/TEMPLATE-cumulative.md (new, 101 lines): fill-in
  template for the post-Phase-4 cumulative report per §13.5.
  Six sections + test env disclosure; v3 trigger checklist
  references the §11/§13.5 thresholds.

Item 2 (pytestmark=unit on test_issues_file_if_unset.py) skipped:
agents repo doesn't register a 'unit' marker anywhere
(pyproject.toml/pytest.ini/conftest.py all absent, no other
pytestmark usage in tests/). Adding the marker would just emit
PytestUnknownMarkWarning. Documented as skip in commit.

🤖 Generated with Claude Code
Per .issues/001.md item 4. gate.md's phase routing is LLM-prose,
not bash, so functional per-phase assertions aren't possible
without an integration test driving a real LLM. What this test
covers (and the honest scope):

- bash -n over all fenced blocks in gate.md (syntactic validity)
- Structural assertions on the main block: sources issue-fns.sh,
  honors AUTOCODER_WORK_JSON, invokes fix-loop-gate.sh, captures rc
- Parameterized over triage/fix/enhance: shimmed gate.sh exits
  1/2/0, GATE_RC propagates, work.json path reachable
- Guard: asserts NO bash 'case $PHASE' dispatcher exists. Fails if
  someone migrates routing into shell, forcing real per-phase tests
  to be added at that point
- Two prose-presence tests so phase docs / rc docs don't silently
  disappear

14 tests, 0.6s, all pass.

🤖 Generated with Claude Code
Verified against Claude Code upstream docs (code.claude.com/docs/
en/slash-commands frontmatter reference) and grep of bundled
plugins: the model: frontmatter field expects short aliases
(haiku/sonnet/opus/inherit), NOT dated IDs. Zero real-world usage
of claude-haiku-4-5-20251001 found across feature-dev, plugin-dev,
or superpowers plugins.

- plugins/autocoder/commands/dispatch.md: model: claude-haiku-4-5
  → model: haiku. Inline comment expanded with convention,
  verification date, §7.1.1 cross-reference.
- docs/notes/2026-05-21-frontmatter-model-convention.md (new):
  research trail for future maintainers — what was checked, the
  short-alias convention, where to update if Claude Code adds
  full-id support.

🤖 Generated with Claude Code
Records the closed issue that drove the 5 follow-up commits
(triage corpus, inject handler, cumulative template, gate.md
tests, dispatch.md model fix) on this branch. Useful as a paper
trail for the autonomous-fix workflow that closed it.

🤖 Generated with Claude Code
User-confirmed: those PNGs are local testing artifacts, not for
commit.

🤖 Generated with Claude Code
Runs python3 -m pytest tests/ -v on ubuntu-latest with Python 3.12
on push and pull_request. Installs pytest in-job (no requirements
file added). 19 lines.

Closes #3.

🤖 Generated with Claude Code
Adds a Token-Efficient Loop Commands section to the autocoder
plugin README covering:
- /autocoder:gate — slim default for the loop cron path (1973 B
  vs ~75 KB fix.md)
- /autocoder:dispatch — opt-in Haiku-pinned variant via
  LOOP_MODEL_SPLIT=1, with §7.1.1-verified Task model= dispatch
- Configuration table: LOOP_MODEL_SPLIT, AUTOCODER_WORK_JSON,
  IDLE_SLEEP_MINUTES
- Cross-references: spec §5.3, §7.1.1, §13.4

Also adds two rows to the existing Commands table for
discoverability.

Closes #2.

🤖 Generated with Claude Code
Measured 2026-05-21 with claude -p in fresh empty-queue sessions
(opus, bypassPermissions). Headline: /autocoder:gate idle tick is
$0.154 vs /autocoder:fix idle tick $0.381 — 60% cost reduction.

Cache_creation ratio came in at 36%, not the original 15% target.
Revised the §13.4 Phase 2 threshold to ≤40% cache_creation +
≥50% total-cost reduction, with total cost as the load-bearing
metric. The 15% target was a naive byte-count prediction
(18KB → 2KB → 11%) that ignored the slash-command rendering
envelope's ~17K fixed overhead.

New §13.4.1 documents:
- The exact measurement table (cost, cw, cr, out, turns, duration)
- Why 15% wasn't hittable (overhead floor)
- $30K/year savings projection at observed cadence
- Installation gotcha: gate.md must land in
  ~/.claude/plugins/cache/plugin-marketplace/autocoder/3.10.0/
  not ~/.claude/plugins/autocoder/, because Claude Code v2.1.146
  discovers commands from the versioned cache install path
- Implication for §11 v3 trigger: Phase 2 alone doesn't cross the
  $0.20/day v3 threshold; Phase 3 (Haiku) still needed

Also relaxed output-token budget from <50 to <1000 (measured 772)
and gate-duration p95 from 2s to 60s (Claude Code session startup
dominates first-tick latency, not the gate body).

🤖 Generated with Claude Code
Replaces flat .issues/*.md layout with open/working/closed buckets,
defines atomic rename-based claim, extracts gh logic into issues-gh.sh
behind a uniform 8-verb backend CLI, and adds any-claimable preflight
for zero-cost idle fix-loop ticks.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Addresses 4 literal-wrongness findings from
docs/criticalreviews/2026-05-22-issue-storage-and-backend-abstraction-design-critical-review-1.md:

- 2.1 any-claimable decoupled from "claimable": add blocked/ bucket
  (Option A); blocking-label adds/removes trigger renames; any-claimable
  stays O(1) even when most open work is gated on human input.
- 2.2 exit-code ambiguity: split codes (0 work, 1 no-work, 2 usage, 3
  backend-error); preflight blocks in fix.md / fix-loop.md use case.
- 2.3 comment-during-rename duplicate-file race: add normative fd-based
  I/O requirement under flock; tighten race-2 analysis to reference it.
- 2.4 github any-claimable never exits 1: switch shown command to a
  count-and-bracket form that emits the right exit code.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Addresses 5 round-2 findings from
docs/criticalreviews/2026-05-22-issue-storage-and-backend-abstraction-design-critical-review-2.md,
plus a new explicit cross-worktree coordination requirement:

- 2.1 §2/§4 ordering contradiction for claim/release: rewrite §4 file
  row to match §2's rename-first order for claim; document the
  asymmetry (claim rename-first, release flock-then-rename).
- 2.2 --state blocked missing from CLI contract: add blocked to enum.
- 2.3 release Python snippet hardcoded open/ destination: replace with
  label-aware target selection that flock-reads labels before rename.
- 2.4 file-backend any-claimable can't emit exit 3: guard with
  directory-existence check; pipe find into grep -q . so exit code
  reflects file presence, not find's own quirks.
- 2.5 Section E claim test unsatisfiable by gh: split into strict
  (file/jira) and best-effort (gh) variants.
- Cross-worktree: add Goal #5, normative subsection in §1 requiring
  ISSUE_DIR_PATH resolution to the main worktree, and a cross-worktree
  end-to-end test in the testing plan.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Addresses finding 3.1 from
docs/criticalreviews/2026-05-22-issue-storage-and-backend-abstraction-design-critical-review-3.md:
expand migration plan step 6 to enumerate list-needs-design,
list-needs-feedback, list-proposals, and the additional monitor-workers
queries that all need --state open → --state blocked (or --state
working) updates so the round-1 blocked-bucket fix doesn't silently
break those slash commands.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Empirically verified 21 load-bearing claims about the codebase at
spec-write time (file paths, function locations, existing query
shapes, library/platform behavior). One discrepancy surfaced and
addressed: monitor-workers.md:130 omits needs-feedback from its
blocking-label filter (oversight); spec now notes the omission
and the new layout corrects it.

This makes the spec accepted as input by thorough-writing-plans.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… plan

Translates docs/superpowers/specs/2026-05-22-issue-storage-and-backend-abstraction-design.md
(spec SHA c0b3df6) into 8 tasks with 19 verified plan-level assumptions.
Task ordering: file backend overhaul → gh extraction → fix-loop preflight
→ README → fix-loop-gate migration → state-query caller migration →
new slash commands → .agent/ mirror. Tests fold into each task.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…plan

Addresses 1 partial §1 + 5 §2 findings from
docs/criticalreviews/2026-05-22-issue-storage-and-backend-abstraction-implementation-plan-critical-review-1.md:

- §1.13 commit-convention assumption text broadened (codebase mixes
  scoped and unscoped commits; flag has no behavioral impact).
- §2.1 cmd_update added to Step 9's resolve_path list; Step 7 code
  block made self-contained with proper variable bindings.
- §2.2 update --add-label working stays supported (legacy/idempotent);
  claim is the atomic path. fix.md and fix-loop-gate.sh re-asserts
  unchanged.
- §2.3 monitor-workers Step 2 expanded to show three distinct
  replacements (display / sort / count) instead of one.
- §2.4 added cross-worktree and fix-loop-idle test steps to Task 1
  Step 10, closing spec Testing-plan coverage gaps.
- §2.5 Task 3 Step 1 line references corrected (276/282 instead of
  350); preflight no longer duplicates the source line.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…d-based I/O

Implements the file-backend overhaul per
docs/superpowers/specs/2026-05-22-issue-storage-and-backend-abstraction-design.md:
- open/working/blocked/closed bucket directories under .issues/
- atomic rename-based claim/release; --if-unset flag retired
- any-claimable verb with exit-3 backend-error contract
- migrate-layout subcommand for one-shot flat→bucket migration
- .seq as authoritative monotonic counter (no more glob scan in create)
- fd-based I/O under flock (no path re-open) preserves directory
  authority across concurrent renames
- blocking labels (needs-design, needs-clarification, needs-feedback,
  needs-approval, too-complex, future, proposal) trigger bucket
  transitions automatically on update
- cmd_close renames to closed/ regardless of source bucket
- legacy update --add-label working still supported (idempotent label-set)

42 tests pass (list, get, update, comment, close, create, claim, release,
any-claimable, migrate-layout, blocking transitions, parallel-claim stress).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Per spec §4 backend abstraction:
- New plugins/autocoder/scripts/issues-gh.sh implements the uniform
  9-verb CLI (list/get/update/comment/close/create/claim/release/
  any-claimable) for the GitHub backend. Includes the
  blocking-label-exclusion search for --state open and the
  count-and-bracket exit-code form for any-claimable.
- issue-fns.sh shrinks to pure dispatch — each issue_* function shells
  out to the configured backend script with the verb name and args.
  The _ifns_gh_* helper functions are gone.

11 dispatcher tests pass: list/get/update/claim/release/close/create/
any-claimable + bucket-transition routing through the file backend.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Per spec §5, inserts a case-statement preflight immediately after the
issue-fns.sh source. When no claimable work exists, /fix prints one
line and exits without invoking any sub-agent — zero LLM cost on idle.

(fix-loop.md keeps its existing stop-hook + fix-loop-gate.sh dispatch;
that gate is already the work-presence preflight for the outer loop.
Task 5 migrates the gate's atomic-claim mechanism to issue_claim.)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The --if-unset exit-9 contract retires in this design; atomic claim
moves to the new issue_claim verb (rename open/N.md → working/N.md on
the file backend; best-effort label-add on github). The gate's race
handling is unchanged at the boolean level — lost race still exits 1
and re-runs on next tick.

14 gate tests pass.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Per spec §3 migration plan step 6:
- list-needs-design.md, list-needs-feedback.md, list-proposals.md,
  approve-proposal.md, brainstorm-issue.md: --state open --label X →
  --state blocked --label X (blocked-labeled issues now live in
  blocked/, not open/).
- monitor-workers.md:
  - Line 79 display query: drop jq blocking-label filter (open/
    excludes blocked by directory).
  - Line 130 sort query: same simplification.
  - Line 262 count query: WORKING from --state working (bucket
    directly), UNBLOCKED from --state open count.
  - Recovery step: issue_update --remove-label working → issue_release.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
laird and others added 25 commits May 22, 2026 15:38
Covers spec Testing-plan goals #2 (zero-cost idle preflight) and #5
(cross-worktree coordination):

- tests/test_issues_file_cross_worktree.sh (8 tests): bootstraps a
  temp git repo + secondary worktree; verifies ISSUE_DIR_PATH resolves
  identically from both, and that issue_list/claim/release/close from
  the secondary worktree all target the main worktree's .issues/.
- tests/test_fix_loop_idle.sh (6 tests): verifies any-claimable exits
  1 on empty open/, fix-loop-gate.sh exits 1 with no work plan when
  idle, and exits 0 + writes plan + claims the issue when work exists.

Also fixes issue-config.sh and issue-fns.sh to tolerate `set -u`
(unbound-variable strict mode) — both scripts are sourced by
fix-loop-gate.sh which runs with set -euo pipefail.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Major bump for autocoder reflects the breaking changes from the
issue-storage-and-backend-abstraction work on this branch:
- --if-unset flag retired from issues-file.py
- --state open semantics changed (now walks only open/ bucket,
  excludes working and blocked-labeled issues)
- New 4-bucket file layout (open/working/blocked/closed)
- New verbs (claim, release, any-claimable, migrate-layout)
- New slash commands (/show-issue, /migrate-issues-layout)

Also brings .claude-plugin/plugins/autocoder/plugin.json up to date
(was lagging at 3.10.0) and registers the two new slash commands in
both .claude-plugin and .factory-plugin plugin.json manifests.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Resolves three CDR findings:
- GitHub backend: create history-log label before issue creation
- Modernize: keep inline heredoc, add plugin copy as maintainer sync source
- Worktrees: per-worker HISTORY.md merged to main worktree at cleanup

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
10-task plan covering shared append-to-history.sh extension, plugin
distribution, fix.md/full-regression-test.md logging, and new /retro command.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Task 5 Step 2: unique old_string via simple-path PR body content
- Task 5 Step 4: explicit old_string via "auto-resolved by autonomous fix workflow" anchor
- Task 8: embed actual optional-skills-prelude block; remove placeholder

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
One finding: cut -d' ' -f2 truncates worktree paths with spaces.
Fix: use sed 's/^worktree //' instead.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Preserves paths with spaces; addresses CIR round 2 finding 1.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…lags

Adds GitHub backend (history-log issue), worktree-aware path resolution,
and backward-compatible default behavior for modernize.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Points maintainers to the canonical script in plugins/modernize/scripts/.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…sion-test

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Overall: Very Good. Two caveats before heavy production use:
1. Sanitize $ISSUE_BODY before heredoc interpolation in append-to-history.sh
2. Wire test count variables in full-regression-test.md logging calls

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@laird laird merged commit 4c78f0d into master May 30, 2026
0 of 2 checks passed
@laird laird deleted the feat/fix-loop-token-efficiency branch May 30, 2026 01:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant