Add epic hierarchy to Project Planning - #206
Merged
Merged
Conversation
GitHub's issue list reports sub_issues_summary but never a parent link, and
the only endpoint that names an epic's children is /issues/{n}/sub_issues.
So the snapshot now resolves edges itself, after pagination, with a bounded
fan-out: issues with childCount > 0, sorted by number descending, capped at
PLANNING_LIMITS.epics, at most epicConcurrency requests in flight, at most
epicChildren entries read per epic. It fails open per parent exactly like
the comments fetch in getPlanningItemDetails, so one unlucky epic cannot
blank a backlog that is mostly about other work, and it reports
epicsTruncated rather than implying the hierarchy is complete. Requests run
concurrently but assignments are applied afterwards in parent order, so a
child claimed by two epics always lands on the same one.
groupPlanningItems now returns nodes rather than flat items. A child folds
into its parent and gets no top-level row; a child whose parent is absent
from the filtered input keeps its row with orphanedParentNumber set, since
silently deleting it is the one outcome worse than a missing breadcrumb.
Section placement gains one deliberate exception to "the exact label selects
the section": a node sits at the highest priority anywhere in its epic, so a
priority:high child cannot be buried inside an unlabelled parent. The
parent's own priority conflict still wins outright — it needs triage
whatever its children say — and the tag group still comes from the parent
alone.
planningView.ts persists which epics a device has expanded, defaulting to
none, because folding the backlog down to its parents is the point.
Planning.tsx is touched only enough to keep typecheck honest: it flattens
each node back to parent-then-children rows until the epic UI lands.
Owner
Author
GitHub epic grouping mutation logLive preflight completed before mutation: only #110 and #132 were parents; every proposed child was unparented; no proposed new parent title existed. PR #116 remained open, so #53 was included. PRs #176 and #178 were merged; closed #91 was omitted, while open #182 and #90 left two eligible sub-agent children. #104 was untouched. Applied
Post-mutation verification refetched every child parent URL, all ten parent trees, adjusted labels, and the repository-wide parent set. Top-level open issue count: 25. Exact rollbackGitHub cannot delete created issues. The commands below detach every added edge, restore adjusted labels, and close the eight newly-created empty parents. gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/132/sub_issue -F sub_issue_id=5252115854
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/110/sub_issue -F sub_issue_id=5219225531
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/207/sub_issue -F sub_issue_id=5252247399
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/207/sub_issue -F sub_issue_id=5251617276
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/207/sub_issue -F sub_issue_id=5224038116
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/207/sub_issue -F sub_issue_id=5241931597
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/207/sub_issue -F sub_issue_id=5235978226
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/207/sub_issue -F sub_issue_id=5224023873
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/208/sub_issue -F sub_issue_id=5251652312
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/208/sub_issue -F sub_issue_id=5223345807
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/209/sub_issue -F sub_issue_id=5221982083
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/209/sub_issue -F sub_issue_id=5228665992
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/209/sub_issue -F sub_issue_id=5249538674
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/209/sub_issue -F sub_issue_id=5219011152
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/210/sub_issue -F sub_issue_id=5220612919
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/210/sub_issue -F sub_issue_id=5220505573
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/211/sub_issue -F sub_issue_id=5225369943
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/211/sub_issue -F sub_issue_id=5247279334
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/211/sub_issue -F sub_issue_id=5225453098
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/211/sub_issue -F sub_issue_id=5249542217
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/211/sub_issue -F sub_issue_id=5225453093
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/211/sub_issue -F sub_issue_id=5252278947
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/212/sub_issue -F sub_issue_id=5227326258
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/212/sub_issue -F sub_issue_id=5248550957
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/212/sub_issue -F sub_issue_id=5251627861
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/213/sub_issue -F sub_issue_id=5224887925
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/213/sub_issue -F sub_issue_id=5230632891
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/213/sub_issue -F sub_issue_id=5219076121
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/214/sub_issue -F sub_issue_id=5248101251
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/214/sub_issue -F sub_issue_id=5248062323
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/214/sub_issue -F sub_issue_id=5248975639
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/132/labels
gh api --method PATCH repos/leoncheng57/custom-dca-opencode/issues/110 -f "labels[]=priority:medium"
gh api --method DELETE repos/leoncheng57/custom-dca-opencode/issues/181/labels
gh issue close 207 --repo leoncheng57/custom-dca-opencode
gh issue close 208 --repo leoncheng57/custom-dca-opencode
gh issue close 209 --repo leoncheng57/custom-dca-opencode
gh issue close 210 --repo leoncheng57/custom-dca-opencode
gh issue close 211 --repo leoncheng57/custom-dca-opencode
gh issue close 212 --repo leoncheng57/custom-dca-opencode
gh issue close 213 --repo leoncheng57/custom-dca-opencode
gh issue close 214 --repo leoncheng57/custom-dca-opencode |
leoncheng57
marked this pull request as ready for review
August 26, 2026 05:03
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Verification
npm run typecheck- VERIFIEDnpm test- VERIFIED: 631 tests / 53 filesnpm run build- VERIFIEDCI=1 PORT=3541 MOCK_OPENCODE_PORT=4744 MOCK_PREVIEW_PORT=4745 npm run test:e2e- VERIFIED: 322 passed, 1 screenshot-runner-gated skipnpm run test:preview- VERIFIED: 1 passed after one unrelated transient iframe timeout on the first attemptHuman verification
/planning; an epic is collapsed by default. Expected: child titles are absent and the parent shows an Epic marker plus progress. Failure: child rows render top-level or expanded.Child of #101. Failure: it silently disappears.epicsTruncated. Expected: warning appears while the planning feed remains visible. Failure: no warning or blank page.Remote hierarchy mutations
The approved GitHub issue grouping will be applied only after live preflight. A follow-up PR comment will contain the mutation log, final tree, and exact rollback commands.