issues: file debt 14-18 (merge flow, round-trip, task flags, -h skill, EPIPE panic)

a383de5gl0w

all commits

Message

issues: file debt 14-18 (merge flow, round-trip, task flags, -h skill, EPIPE panic)

Diff

.forge/issues/1c25767c-4e1c-473e-827d-4a39bc8c4cac/issue.md+13 −0
diff --git a/.forge/issues/1c25767c-4e1c-473e-827d-4a39bc8c4cac/issue.md b/.forge/issues/1c25767c-4e1c-473e-827d-4a39bc8c4cac/issue.mdnew file mode 100644index 0000000..02e1057--- /dev/null+++ b/.forge/issues/1c25767c-4e1c-473e-827d-4a39bc8c4cac/issue.md@@ -0,0 +1,13 @@1+---2+id: 1c25767c-4e1c-473e-827d-4a39bc8c4cac3+title: 'bug: panics on EPIPE when stdout consumer closes early'4+state: open5+labels:6+- dogfood7+- pri8+assignees: []9+milestone: null10+created: 2026-09-08T04:44:54Z11+updated: null12+---13+Evidence: "f0rge issue list | awk ..." where awk exited early -> process panicked: thread main panicked "failed printing to stdout: Broken pipe (os error 32)" with full stack trace. Violates: no panics on hostile input, one-line errors, exit codes 0/1/2 (exit was 101). All stdout users (println!/print!) must treat BrokenPipe as clean exit (write via writeln! and ignore EPIPE, like issue #13 fix but on the output side). Verify: "f0rge issue list | head -1" exits 0, no stderr, no panic; same for --json and every cmd.
.forge/issues/3e9dd37e-8323-4d42-a247-f4a93aad5194/issue.md+12 −0
diff --git a/.forge/issues/3e9dd37e-8323-4d42-a247-f4a93aad5194/issue.md b/.forge/issues/3e9dd37e-8323-4d42-a247-f4a93aad5194/issue.mdnew file mode 100644index 0000000..c30a0af--- /dev/null+++ b/.forge/issues/3e9dd37e-8323-4d42-a247-f4a93aad5194/issue.md@@ -0,0 +1,12 @@1+---2+id: 3e9dd37e-8323-4d42-a247-f4a93aad51943+title: 'task create: --body/--column flags (feature)'4+state: open5+labels:6+- dogfood7+assignees: []8+milestone: null9+created: 2026-09-08T04:42:15Z10+updated: null11+---12+task create is title-only; body + column are file edits after. Add --body and --column (todo|doing|blocked|done per spec §task); update spec/schema.md + fixtures + -h within budget. Acceptance: 'f0rge task create --title X --body B --column doing' → task with body, status doing, correct column in list; budgets hold.
.forge/issues/6285a06f-dfa3-413e-98ad-f2d64e0abee9/issue.md+13 −0
diff --git a/.forge/issues/6285a06f-dfa3-413e-98ad-f2d64e0abee9/issue.md b/.forge/issues/6285a06f-dfa3-413e-98ad-f2d64e0abee9/issue.mdnew file mode 100644index 0000000..b508712--- /dev/null+++ b/.forge/issues/6285a06f-dfa3-413e-98ad-f2d64e0abee9/issue.md@@ -0,0 +1,13 @@1+---2+id: 6285a06f-dfa3-413e-98ad-f2d64e0abee93+title: 'merge branch: merge record links to fresh uuid, not the PR'4+state: open5+labels:6+- dogfood7+- pri8+assignees: []9+milestone: null10+created: 2026-09-08T04:42:15Z11+updated: null12+---13+Evidence: 'f0rge merge dog-boot' wrote record pr:2a2f1add.. while the real PR was e769d904..; 'f0rge merge dog-pr' wrote pr:5c99b18d.., real PR 78e0c97e.. (folder payloads link correctly; branch payloads generate a fresh uuid because pr_by_head finds nothing on main). Fix in cmd/merge.rs from_branch: when a PR whose head == <branch> exists (reachable via the patch or a known list), use its uuid; fresh uuid only as last resort. Acceptance: 'f0rge merge <branch>' writes record pr: <canonical pr uuid> (temp-repo test). Bitter-lesson: pure resolution, no locks, no new stored state.
.forge/issues/a2697032-69ca-4561-9acf-ff3fd7be08d9/issue.md+12 −0
diff --git a/.forge/issues/a2697032-69ca-4561-9acf-ff3fd7be08d9/issue.md b/.forge/issues/a2697032-69ca-4561-9acf-ff3fd7be08d9/issue.mdnew file mode 100644index 0000000..92d2a6b--- /dev/null+++ b/.forge/issues/a2697032-69ca-4561-9acf-ff3fd7be08d9/issue.md@@ -0,0 +1,12 @@1+---2+id: a2697032-69ca-4561-9acf-ff3fd7be08d93+title: 'issue list⇄close round-trip: list renders #1, close wants 1'4+state: open5+labels:6+- dogfood7+assignees: []8+milestone: null9+created: 2026-09-08T04:42:15Z10+updated: 2026-09-08T04:44:54Z11+---12+Evidence: "f0rge issue list" prints "#1  open  .."; "f0rge issue close #1" -> usage error. Copy-paste from list never works. Fix: set_state verbs (close/reopen/view/comment/assign/label/edit) accept "#N", "N", and uuid; or render list ids copy-safe. Acceptance: close "$(f0rge issue list | awk "NR==2{print \$1}")" round-trips verbatim.
.forge/issues/e221d8ed-d5c8-4aed-8873-8acb0d6f02c2/issue.md+13 −0
diff --git a/.forge/issues/e221d8ed-d5c8-4aed-8873-8acb0d6f02c2/issue.md b/.forge/issues/e221d8ed-d5c8-4aed-8873-8acb0d6f02c2/issue.mdnew file mode 100644index 0000000..5f499d3--- /dev/null+++ b/.forge/issues/e221d8ed-d5c8-4aed-8873-8acb0d6f02c2/issue.md@@ -0,0 +1,13 @@1+---2+id: e221d8ed-d5c8-4aed-8873-8acb0d6f02c23+title: 'merge branch: fork-drifted diff can silently delete shared .forge/prs records'4+state: open5+labels:6+- dogfood7+- pri8+assignees: []9+milestone: null10+created: 2026-09-08T04:42:15Z11+updated: null12+---13+Evidence: dog-issue forked before dog-pr merged; its main..head diff contained deletions of already-landed PR records (t1/t2/78e0c97e folders); orchestrator avoided data loss by merging the folder payload (disjoint range) instead of the branch diff. Acceptance: merging a branch whose base predates other landings must NOT silently delete forge state; deletions of .forge/prs/* surface as conflicts (file list + stop), never applied silently. File: cmd/merge.rs (base-aware diff / deletion surfacing). Bitter-lesson: no merge engine, no auto-resolution — surface the conflict, list files, stop; the reconciling agent decides.