workflow-fix: merge=union for eval_results/INDEX.md
Highlight text on any card (body, plan, or an event) to anchor a comment, or leave a whole-task comment here. Mention @claude to summon a reply.
No comments yet.
Overview / Motivation
Auto-filed by the workflow-fix-on-bug protocol from a prose workflow-fix follow-up raised on task #1525 (emitting agent: Alternatives plan-critic; parked under the recursion guard, routed by the 2026-07-18 /daily Step C parked-candidate sweep).
Goal
Add eval_results/INDEX.md merge=union to .gitattributes (same
append-dominant rationale + LOCAL-merges-only scope caveat as the #896 block)
so the recurring INDEX.md append-conflict class never fires at
sync_repo_root's own pull.
Workflow gap
- Bug observed:
eval_results/INDEX.mdis append-dominant and repeatedly conflicts on concurrent repo-root pulls; #1525's stranded-commit incident included exactly this conflict class at sync_repo_root's own pull. - Why it is a workflow gap:
.gitattributesalready carriesmerge=unionfor the analogous append-only surfaces (tasks/**/events.jsonl,tasks/**/comments.jsonl,.claude/agent-memory/**/*.md) and the #1525 session verified union IS honored on localpull --rebase=merges— INDEX.md is the missing sibling. Complements (does not replace) #1525's own recipe fix; the stranded-commit defect is path-general. - Confidence (emitter): medium (the emitting critic pre-verified the attribute state and the union-honored-on-local-pull behavior)
- verified-at-filing:
git check-attr merge eval_results/INDEX.md→merge: unspecified(gap present as claimed);grep -n 'merge=union' .gitattributes→ 3 hits (L18 tasks//events.jsonl, L19 tasks//comments.jsonl, L30 .claude/agent-memory/**/*.md), no eval_results entry;git log --oneline --since='7 days ago' -- .gitattributes→ 0 commits (no just-landed fix) (2026-07-19)
Proposed change (candidate diff sketch — refine in planning)
(none — synthesized from prose follow-up)
Sketch for the planner:
# .gitattributes, alongside the #896 append-only union block:
+ eval_results/INDEX.md merge=union
with the same scope-caveat comment as the existing block (union takes effect ONLY on LOCAL merges/rebases, not GitHub-side merges).
Scope / surfaces
- Primary target:
.gitattributes - Grep the workflow surface for the pattern before editing
(
grep -rln 'merge=union\|INDEX.md' .claude/ CLAUDE.md scripts/ .gitattributes) — check whetherscripts/sync_repo_root.py's byte-identical untracked- collision sweep or docs reference INDEX.md conflict handling; list every hit in the plan.
Constraints / invariants
- Workflow-surface only — never experiment code,
configs/, ortasks/. - Union merge is only safe for append-dominant files — the plan states why INDEX.md qualifies (and what a mid-file edit would do under union).
scripts/workflow_lint.py --check-askspasses.- This session runs under
EPM_WORKFLOW_FIX_SESSION=1and carries aworkflow_fix_target:Provenance line — it MUST NOT auto-route any of its own subagents' workflow-fix candidates (recursion guard, § Recursion guard).
Provenance
- workflow_fix_target: .gitattributes
- fingerprint: b0c00eab01cf
Verbatim surfaced prose (task #1525 events.jsonl, 2026-07-19T00:52:07Z): "Candidate surfaced by the Alternatives plan-critic on #1525: add 'eval_results/INDEX.md merge=union' to .gitattributes (same append-dominant rationale + scope caveat as the #896 block) so the recurring INDEX.md append-conflict class never fires at sync_repo_root's own pull. Verified: git check-attr merge eval_results/INDEX.md -> unspecified; .gitattributes already carries merge=union for tasks//events.jsonl + comments.jsonl + .claude/agent-memory//*.md and notes union IS honored on local pull --rebase=merges. Complements (does not replace) this task's recipe fix — the stranded-commit defect is path-general. target_file: .gitattributes."