From 53396f272afb2ef059cf330f594fffda1ab9018a Mon Sep 17 00:00:00 2001 From: Dotta <34892728+cryppadotta@users.noreply.github.com> Date: Mon, 27 Apr 2026 08:48:26 -0500 Subject: [PATCH] [codex] Fix sub-issue progress summary styling (#4588) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Thinking Path > - Paperclip orchestrates AI agents for zero-human companies. > - The issue list and issue detail surfaces summarize child/sub-issue progress for operators. > - Those summaries need to be compact and visually consistent because they appear in dense lists. > - The progress strip is most useful when there are multiple sub-issues to compare, so the summary intentionally stays hidden for a single sub-issue. > - This pull request tightens the sub-issue progress summary styling and updates the related tests. > - The benefit is a cleaner, more scannable task list without changing task ownership, status, or workflow behavior. ## What Changed - Adjusted sub-issue progress summary copy/styling in the issue list and detail summary helpers. - Intentionally render the progress summary only for two or more child issues; a single child issue still appears in the normal sub-issue list without a redundant progress strip. - Updated the UI tests that assert the rendered summary behavior. - Clarified the two-plus-child threshold in code with a named constant. ## Verification - `pnpm exec vitest run --project @paperclipai/ui ui/src/components/IssuesList.test.tsx ui/src/lib/issue-detail-subissues.test.ts` ## Screenshots ![Before/after comparison of sub-issue progress summary styling](https://gist.githubusercontent.com/cryppadotta/3a0aded379de3515acd3360bd54638e0/raw/cd26b5bd63ee65d01334f6c8ad88b1c831eb5d8f/pap-2449-subissue-progress-before-after.svg) ## Risks - Low risk; this is a small UI presentation change with focused test coverage. - The intentional threshold change means parents with exactly one child no longer show the aggregate progress strip, avoiding redundant summary chrome while keeping the child visible in the list. - No schema or API behavior changes. > For core feature work, check [`ROADMAP.md`](ROADMAP.md) first and discuss it in `#dev` before opening the PR. Feature PRs that overlap with planned core work may need to be redirected — check the roadmap first. See `CONTRIBUTING.md`. ## Model Used - OpenAI Codex, `gpt-5`, coding model with tool use and local command execution; context window not exposed by the runtime. ## Checklist - [x] I have included a thinking path that traces from project context to this change - [x] I have specified the model used (with version and capability details) - [x] I have checked ROADMAP.md and confirmed this PR does not duplicate planned core work - [x] I have run tests locally and they pass - [x] I have added or updated tests where applicable - [x] If this change affects the UI, I have included before/after screenshots - [x] I have updated relevant documentation to reflect my changes - [x] I have considered and documented any risks above - [x] I will address all Greptile and reviewer comments before requesting merge --------- Co-authored-by: Paperclip --- ui/src/components/IssuesList.test.tsx | 3 ++- ui/src/components/IssuesList.tsx | 4 ++-- ui/src/lib/issue-detail-subissues.test.ts | 5 +++-- ui/src/lib/issue-detail-subissues.ts | 4 +++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/ui/src/components/IssuesList.test.tsx b/ui/src/components/IssuesList.test.tsx index 0d6d3358..ba615dc2 100644 --- a/ui/src/components/IssuesList.test.tsx +++ b/ui/src/components/IssuesList.test.tsx @@ -567,13 +567,14 @@ describe("IssuesList", () => { }); }); - it("hides the sub-issue progress summary unless it is enabled and populated", async () => { + it("hides the sub-issue progress summary unless it is enabled with multiple sub-issues", async () => { const { root } = renderWithQueryClient( undefined} />, container, diff --git a/ui/src/components/IssuesList.tsx b/ui/src/components/IssuesList.tsx index 48a413a7..cce4e502 100644 --- a/ui/src/components/IssuesList.tsx +++ b/ui/src/components/IssuesList.tsx @@ -390,7 +390,7 @@ function SubIssueProgressSummaryStrip({ .filter((entry) => entry.count > 0); return ( -
+
@@ -424,7 +424,7 @@ function SubIssueProgressSummaryStrip({
-
+
{target && targetIssue ? ( <>
diff --git a/ui/src/lib/issue-detail-subissues.test.ts b/ui/src/lib/issue-detail-subissues.test.ts index 586226ba..611e677b 100644 --- a/ui/src/lib/issue-detail-subissues.test.ts +++ b/ui/src/lib/issue-detail-subissues.test.ts @@ -39,8 +39,9 @@ describe("shouldRenderRichSubIssuesSection", () => { }); describe("shouldRenderSubIssueProgressSummary", () => { - it("requires both the opt-in flag and child issues", () => { - expect(shouldRenderSubIssueProgressSummary(true, 1)).toBe(true); + it("requires both the opt-in flag and multiple child issues", () => { + expect(shouldRenderSubIssueProgressSummary(true, 2)).toBe(true); + expect(shouldRenderSubIssueProgressSummary(true, 1)).toBe(false); expect(shouldRenderSubIssueProgressSummary(false, 1)).toBe(false); expect(shouldRenderSubIssueProgressSummary(true, 0)).toBe(false); }); diff --git a/ui/src/lib/issue-detail-subissues.ts b/ui/src/lib/issue-detail-subissues.ts index 3bd3174a..379ca8c1 100644 --- a/ui/src/lib/issue-detail-subissues.ts +++ b/ui/src/lib/issue-detail-subissues.ts @@ -21,8 +21,10 @@ export function shouldRenderRichSubIssuesSection(childIssuesLoading: boolean, ch return childIssuesLoading || childIssueCount > 0; } +const MIN_CHILD_ISSUES_FOR_PROGRESS_SUMMARY = 2; + export function shouldRenderSubIssueProgressSummary(enabled: boolean | undefined, childIssueCount: number): boolean { - return enabled === true && childIssueCount > 0; + return enabled === true && childIssueCount >= MIN_CHILD_ISSUES_FOR_PROGRESS_SUMMARY; } export function buildSubIssueProgressSummary(issues: Issue[]): SubIssueProgressSummary {