diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..0e4c6f8 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +# Every PR adds an entry at the top of TODO.md's Completed Steps; union keeps +# both sides instead of conflicting. Git never reports a conflict here: read +# the merged entries after every merge or rebase. +TODO.md merge=union diff --git a/TODO.md b/TODO.md index ec2ee54..8a0673a 100644 --- a/TODO.md +++ b/TODO.md @@ -3,6 +3,8 @@ * branch per issue from `next` * do the work in Next Step * move Next Step to the top of Completed Steps +* `TODO.md` merges with git's union merge (`.gitattributes`), which never + reports a conflict: read the merged entries after every merge or rebase * move the top item of Future Steps into Next Step * commit (`TODO.md` changes in the same commit as the work) * open a PR based on `next` @@ -29,6 +31,14 @@ P2: security: referer blacklist # Completed Steps +- 2026-10-04 `TODO.md` merges with git's union merge (closes #190): a root + `.gitattributes`, copied from `sneak/prompts`, marks it `merge=union`, so two + branches that each add an entry at the top of Completed Steps merge without a + conflict and keep both entries. Git now never reports a conflict in + `TODO.md`: a real one keeps both versions of the lines, and two entries that + share an identical line can end up one inside the other, which a rebase can + do to an entry already on `next`. The Workflow above says to read the merged + entries after every merge or rebase. - 2026-10-04 `TestEvictionRunsOnPeriodicSchedule` no longer races the evictor (closes #183): it wrote each variant file and then inserted its accounting row by hand, and a reconciliation pass between the two adopted the file first, so