chore: reconcile plan statuses + fix release workflow conflict fallback#634
Conversation
Four plans previously marked 'active' have shipped: - agent-cohesion-session-continuity (deterministic session titles + buildLogicalKey) - compounding-wiki (vault, schedule, seed pages via PRs #489 #491 #494) - manual-delivery-mode (output-mode input via PR #517) - gateway-discord-v1 Units 1-3 (PRs #541 #547 #548) Gateway v1 plan stays active with Units 4-8 unshipped.
fro-bot
left a comment
There was a problem hiding this comment.
Verdict: CONDITIONAL
Blocking issues
Missing git merge --abort and set -e in conflict-fallback path
Two correctness issues in the new fallback block:
-
After
git mergefails, the repo is left in mid-merge state. Withoutgit merge --abortbeforegit checkout origin/main -- ., git still considers the repo mid-merge. The subsequentgit commitrecords two parents and produces a merge commit rather than a plain commit. Callgit merge --abortfirst to cleanly exit merge state before staging main's tree. -
No
set -euo pipefailon the run block. Ifgit checkout origin/main -- .orgit add -Afail silently (transient object-store miss, auth expiry), the script continues and commits whatever partial state is staged, then pushes it tonext.
Suggested fix for .github/workflows/prepare-release-pr.yaml:
run: |
set -euo pipefail
last_tag=$(git tag --list 'v*' --sort=-version:refname | head -1)
echo "Resetting to ${last_tag}"
git reset --hard "${last_tag}"
git fetch origin main
if ! git merge --no-ff -Xtheirs -m 'skip: merge main [skip release]' origin/main; then
echo "Merge had unresolvable conflicts; taking main's tree verbatim."
git merge --abort
git checkout origin/main -- .
git add -A
git commit --no-verify -m 'skip: merge main [skip release] (conflict-resolved)'
fiNon-blocking concerns
- Fallback commit message is identical to the success path. A suffix like
(conflict-resolved)makes the git log distinguishable during post-mortems. - Plan
shippedfrontmatter uses free-form prose strings. If any tooling parses plan frontmatter it may choke on non-date values. Consider a separateshipped_notekey for prose and keepingshippedas an ISO date.
Missing tests
None required for doc-only changes. A brief inline comment in the workflow explaining when the fallback fires (rename/rename on dist/artifact-*.js) would help future maintainers.
Risk assessment: LOW
Plan status updates are purely documentary with no runtime impact. The workflow fallback converts a manual-intervention failure mode into automated recovery; blast radius is limited to the next branch, which is already force-pushed on every run. The mid-merge state issue and missing set -e are low-probability but correctness gaps worth fixing before merge.
Run Summary
| Field | Value |
|---|---|
| Event | pull_request |
| Repository | fro-bot/agent |
| Run ID | 25983744717 |
| Cache | hit |
| Session | ses_1cb5388b2ffe343ZNHa5TPqLgf |
The reset-and-merge step uses 'git merge --no-ff -Xtheirs origin/main' to synthesize next from the last release tag. -Xtheirs handles content conflicts but cannot resolve rename/rename conflicts, which fire every time main's bundle artifact hash changes (dist/artifact-*.js). On conflict, take main's tree verbatim via 'git checkout origin/main -- .' and commit it as the merge result. The release branch's purpose is to mirror main; biasing fully to main on conflicts preserves that intent without manual intervention.
234326c to
e95ddd7
Compare
fro-bot
left a comment
There was a problem hiding this comment.
Verdict: PASS
All blocking issues from the previous review have been addressed:
set -euo pipefailadded at the top of the run block.git merge --abortcalled beforegit checkout origin/main -- ., cleanly exiting mid-merge state.- Fallback commit message now includes
(conflict-resolved)suffix. - Inline comment explaining the rename/rename trigger on
dist/artifact-*.jsadded for future maintainers.
Blocking issues
None.
Non-blocking concerns
None remaining.
Missing tests
None.
Risk assessment: LOW
Workflow fallback is well-guarded now. Plan doc updates are purely documentary.
Run Summary
| Field | Value |
|---|---|
| Event | pull_request |
| Repository | fro-bot/agent |
| Run ID | 25983850041 |
| Cache | hit |
| Session | ses_1cb5388b2ffe343ZNHa5TPqLgf |
Two small changes bundled:
Plan reconciliation. Four plans previously marked
status: activehave shipped reality on main. Updates the frontmatter and per-unit checkboxes to reflect what was actually merged:agent-cohesion-session-continuity→ completed (deterministicfro-bot: {key}titles +buildLogicalKey+ session continuation are in source)compounding-wiki→ completed (PRs feat(wiki): add compounding project wiki as Obsidian vault #489, docs(wiki): seed project wiki with canonical pages #491, chore(wiki): configure ESLint overrides and Obsidian vault gitignore #494 — vault scaffold, weekly schedule, six seed pages)manual-delivery-mode→ completed (PR feat(action): add output-mode input to fix manual-trigger side-branch delivery (#511) #517 — output-mode input)gateway-discord-v1Units 1-3 → checked (PRs feat(gateway): Unit 1 — extract @fro-bot/runtime package #541, feat(coordination): add S3-backed lock, run-state, heartbeat primitives #547, feat(coordination): action acquires per-repo lock for cross-surface mutual exclusion #548); plan stays active for Units 4-8Release workflow fix.
prepare-release-pr.yamlrunsgit merge --no-ff -Xtheirs origin/mainto synthesize thenextbranch from the last release tag.-Xtheirsresolves text conflicts in favor of main but cannot resolverename/renameconflicts, which fire every time main's bundle hash changes (dist/artifact-*.js). On conflict, take main's tree wholesale viagit checkout origin/main -- .and commit. Release branch's purpose is to mirror main; biasing fully to main on conflicts preserves that intent without manual intervention.