v2.9.10 — README Sync & Digest Table Fixes
What's Fixed
README Sync Push Loop (05.1.readme_sync.yml)
The README Automated Sync workflow was stuck in an infinite rebase-conflict loop and failing on every run (exit code 1, run #27829956650).
Root cause: The old retry loop always pulled first (git pull --rebase), then tried to push only on success. After a conflict, the self-healing resolved it — but looped back to pull again instead of attempting a push. Because a concurrent V2 sync workflow kept advancing develop during those 5-second sleeps, every rebase hit a fresh conflict. All 5 retries exhausted, final push failed non-fast-forward.
A secondary bug: during a rebase, --ours refers to the upstream/remote side (not the local commit), so the bot's freshly-computed README metrics were silently discarded each round.
Fix:
- Pull latest before running the updater (shrinks the conflict window)
- Retry loop now tries push first, then fetch +
git merge -X ourson rejection (correct--ourssemantics: keep the bot's output) - Re-runs
readme_updater.pyafter each merge so metrics stay consistent with the merged state - Jittered backoff (
i * 3s) instead of a fixed 5s sleep
Digest Table Broken by Pipe in Title (src/v2_optimizer.py)
Titles containing | — e.g. "Neo, Now in the Terminal | Pulumi Blog" — were breaking Markdown table rows in tech-digest.md because the pipe was parsed as a column separator.
Root cause: render_digest_page() in v2_optimizer.py escaped pipes in the why column (.replace("|", "-")) but not in the link title t. One-line fix: .replace("|", r"\|") on the title.
The 4 already-rendered broken entries in v2-docs/tech-digest.md are corrected directly.
Full changelog: CHANGELOG.md