Skip to content

fix(mobile): make merge the sole primary action on the PR overview - #6402

Merged
iscekic merged 1 commit into
mainfrom
kwf/explorer-pr-overview-the-pr-detail-stacks-two-full-width-961b93-5e1a
Sep 21, 2026
Merged

iscekic merged 1 commit into
mainfrom
kwf/explorer-pr-overview-the-pr-detail-stacks-two-full-width-961b93-5e1a

Conversation

@iscekic

@iscekic iscekic commented Sep 19, 2026

Copy link
Copy Markdown
Collaborator

Changelog for users

  • On a GitHub pull request overview, merging is the single primary action.
  • The review re-entry below it is a neutral outline button instead of a second solid olive button.
  • Tapping that review re-entry still opens the review-submit sheet.

Changelog for maintainers

  • The overview review button now sets variant="outline", and its check icon uses foreground instead of primaryForeground so it stays legible on the neutral fill.
  • The merge CTA keeps the default solid primary variant, so the overview body has exactly one primary action.
  • This matches the design rule "Use one primary action per surface" and "Don't put multiple yellow primary buttons on one surface".
  • The review section renders only for GitHub PRs; provider PRs have no equivalent button.
  • The screen header still owns the primary Submit-review CTA; the section is a secondary re-entry to the same route.
  • A new mounted test asserts the review button is outline, the merge button is default, and exactly one rendered button uses the primary variant.
  • Review hint: confirm the header CTA and the body merge CTA read as separate surfaces rather than two competing primaries.

E2E proof

[e1] In light mode on emulator-5554, open an open+mergeable GitHub PR overview: the body shows exactly one solid-olive full-width CTA (Merge) and the Review re-entry renders as a neutral outline button. — android emulator-5554, app Appearance Light (e1-light-mode.txt: content-desc="Light" checked="true"); scene opened iscekic/tax-report-generator#1 (e1-pr-top.txt: text="Open", text="#1") and e1-scene.xml shows exactly one MERGE section with content-desc="Merge pull request" bounds="[37,2050][1043,2165]" and one REVIEW section with content-desc="Review pull request" bounds="[37,1826][1043,1941]", the only such buttons in the body; script-final.log line 1 SCENE e1 OK; no UX-DEFECT observed in the digest; the solid-olive-vs-outline variant is left to the visual reviewer on e1.png.

[e1] In light mode on emulator-5554, open an open+mergeable GitHub PR overview: the body shows exactly one solid-olive full-width CTA (Merge) and the Review re-entry renders as a neutral outline button. — e2e-mobile-app/e1.png

[e2] From the same overview, tap the outline Review re-entry and confirm the review-submit sheet still opens. — android emulator-5554; script-final.log line 42 SCENE e2 OK; e2-scene.xml shows the review-submit sheet opened after tapping the outline Review re-entry, with text="REVIEW EVENT", text="Summary (optional)", text="0 pending comments", text="Submit review" (e2.png left for the visual reviewer); no UX-DEFECT observed in the digest.

[e2] From the same overview, tap the outline Review re-entry and confirm the review-submit sheet still opens. — e2e-mobile-app/e2.png

E2E proof — log excerpts

[e1] In light mode on emulator-5554, open an open+mergeable GitHub PR overview:  -> pass :: android emulator-5554, app Appearance Light (e1-light-mode.txt: content-desc="Light" checked="true"); scene opened iscekic/tax-report-generator#1 (e1-pr-top.txt: text="Open", text="#1") and e1-scene.xml shows exactly one MERGE section with content-desc="Merge pull request" bounds="[37,2050][1043,2165]" and one REVIEW section with content-desc="Review pull request" bounds="[37,1826][1043,1941]", the only such buttons in the body; script-final.log line 1 SCENE e1 OK; no UX-DEFECT observed in the digest; the solid-olive-vs-outline variant is left to the visual reviewer on e1.png.
[e2] From the same overview, tap the outline Review re-entry and confirm the rev -> pass :: android emulator-5554; script-final.log line 42 SCENE e2 OK; e2-scene.xml shows the review-submit sheet opened after tapping the outline Review re-entry, with text="REVIEW EVENT", text="Summary (optional)", text="0 pending comments", text="Submit review" (e2.png left for the visual reviewer); no UX-DEFECT observed in the digest.
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-pr-overview-the-pr-detail-stacks-two-full-width-961b93-5e1a/e2e-mobile-app/e1-scene.log
android.widget.TextView Create README.md with a Getting Started section covering: tappable [124,468][1008,489]
android.view.ViewGroup marked-list-item tappable [124,489][1007,562]
android.widget.TextView •  tappable [124,489][176,552]
android.widget.TextView Prerequisites (Node.js 22+, pnpm) tappable [174,489][810,552]
android.view.ViewGroup marked-list-item tappable [124,563][1007,637]
android.widget.TextView •  tappable [124,563][176,626]
android.widget.TextView Install steps (pnpm install) tappable [174,563][643,626]
android.view.ViewGroup marked-list-item tappable [124,636][1007,762]
android.widget.TextView •  tappable [124,636][176,699]
android.widget.TextView Required .env configuration (NBS, personal data, and Trading 212 variables) tappable [174,636][1007,762]
android.view.ViewGroup marked-list-item tappable [124,762][1007,835]
android.widget.TextView •  tappable [124,762][176,825]
android.widget.TextView Build steps (pnpm exec tsc and pnpm run dev) tappable [174,762][975,825]
android.view.ViewGroup marked-list-item tappable [124,836][1007,1025]
android.widget.TextView •  tappable [124,836][176,899]
android.widget.TextView Run steps for both supported data sources (node build/index.js --t212 and --ibkr), plus the optional --now flag tappable [174,836][1007,1025]
android.view.ViewGroup marked-list-item tappable [124,1025][1007,1099]
android.widget.TextView •  tappable [124,1025][176,1088]
android.widget.TextView Test, lint, and format commands tappable [174,1025][777,1088]
android.view.View Notes tappable [74,1118][1007,1227]
android.view.ViewGroup marked-list-item tappable [74,1237][1007,1311]
android.widget.TextView •  tappable [74,1237][125,1300]
android.widget.TextView No source code changes; documentation only. tappable [124,1237][984,1300]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-pr-overview-the-pr-detail-stacks-two-full-width-961b93-5e1a/e2e-mobile-app/e1-light-mode.txt
<redacted>
<redacted>
                                        </com.horcrux.svg.GroupView>
                                      </com.horcrux.svg.SvgView>
                                    </android.view.View>
                                  </android.view.ViewGroup>
                                </android.view.ViewGroup>
                              </android.view.ViewGroup>
                            </android.widget.ScrollView>
                          </android.view.ViewGroup>
                        </android.view.ViewGroup>
                      </android.view.ViewGroup>
<redacted>
                    </android.view.ViewGroup>
                  </android.view.ViewGroup>
                </android.view.ViewGroup>
              </android.widget.FrameLayout>
            </android.widget.FrameLayout>
          </android.widget.FrameLayout>
        </android.widget.LinearLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-pr-overview-the-pr-detail-stacks-two-full-width-961b93-5e1a/e2e-mobile-app/e1-pr-top.txt
                                            </android.widget.ScrollView>
                                          </android.view.ViewGroup>
                                        </android.view.ViewGroup>
                                      </android.view.ViewGroup>
                                    </android.widget.ScrollView>
                                  </android.view.ViewGroup>
                                </android.view.ViewGroup>
                              </android.view.ViewGroup>
                            </android.widget.ScrollView>
                          </android.view.ViewGroup>
                        </android.view.ViewGroup>
                      </android.view.ViewGroup>
<redacted>
                    </android.view.ViewGroup>
                  </android.view.ViewGroup>
                </android.view.ViewGroup>
              </android.widget.FrameLayout>
            </android.widget.FrameLayout>
          </android.widget.FrameLayout>
        </android.widget.LinearLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-pr-overview-the-pr-detail-stacks-two-full-width-961b93-5e1a/e2e-mobile-app/script-final.log
android.widget.TextView Create README.md with a Getting Started section covering: tappable [124,468][1008,489]
android.view.ViewGroup marked-list-item tappable [124,489][1007,562]
android.widget.TextView •  tappable [124,489][176,552]
android.widget.TextView Prerequisites (Node.js 22+, pnpm) tappable [174,489][810,552]
android.view.ViewGroup marked-list-item tappable [124,563][1007,637]
android.widget.TextView •  tappable [124,563][176,626]
android.widget.TextView Install steps (pnpm install) tappable [174,563][643,626]
android.view.ViewGroup marked-list-item tappable [124,636][1007,762]
android.widget.TextView •  tappable [124,636][176,699]
android.widget.TextView Required .env configuration (NBS, personal data, and Trading 212 variables) tappable [174,636][1007,762]
android.view.ViewGroup marked-list-item tappable [124,762][1007,835]
android.widget.TextView •  tappable [124,762][176,825]
android.widget.TextView Build steps (pnpm exec tsc and pnpm run dev) tappable [174,762][975,825]
android.view.ViewGroup marked-list-item tappable [124,836][1007,1025]
android.widget.TextView •  tappable [124,836][176,899]
android.widget.TextView Run steps for both supported data sources (node build/index.js --t212 and --ibkr), plus the optional --now flag tappable [174,836][1007,1025]
android.view.ViewGroup marked-list-item tappable [124,1025][1007,1099]
android.widget.TextView •  tappable [124,1025][176,1088]
android.widget.TextView Test, lint, and format commands tappable [174,1025][777,1088]
android.view.View Notes tappable [74,1118][1007,1227]
android.view.ViewGroup marked-list-item tappable [74,1237][1007,1311]
android.widget.TextView •  tappable [74,1237][125,1300]
android.widget.TextView No source code changes; documentation only. tappable [124,1237][984,1300]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-pr-overview-the-pr-detail-stacks-two-full-width-961b93-5e1a/e2e-mobile-app/e2-scene.log
android.widget.TextView Create README.md with a Getting Started section covering: tappable [124,468][1008,489]
android.view.ViewGroup marked-list-item tappable [124,489][1007,562]
android.widget.TextView •  tappable [124,489][176,552]
android.widget.TextView Prerequisites (Node.js 22+, pnpm) tappable [174,489][810,552]
android.view.ViewGroup marked-list-item tappable [124,563][1007,637]
android.widget.TextView •  tappable [124,563][176,626]
android.widget.TextView Install steps (pnpm install) tappable [174,563][643,626]
android.view.ViewGroup marked-list-item tappable [124,636][1007,762]
android.widget.TextView •  tappable [124,636][176,699]
android.widget.TextView Required .env configuration (NBS, personal data, and Trading 212 variables) tappable [174,636][1007,762]
android.view.ViewGroup marked-list-item tappable [124,762][1007,835]
android.widget.TextView •  tappable [124,762][176,825]
android.widget.TextView Build steps (pnpm exec tsc and pnpm run dev) tappable [174,762][975,825]
android.view.ViewGroup marked-list-item tappable [124,836][1007,1025]
android.widget.TextView •  tappable [124,836][176,899]
android.widget.TextView Run steps for both supported data sources (node build/index.js --t212 and --ibkr), plus the optional --now flag tappable [174,836][1007,1025]
android.view.ViewGroup marked-list-item tappable [124,1025][1007,1099]
android.widget.TextView •  tappable [124,1025][176,1088]
android.widget.TextView Test, lint, and format commands tappable [174,1025][777,1088]
android.view.View Notes tappable [74,1118][1007,1227]
android.view.ViewGroup marked-list-item tappable [74,1237][1007,1311]
android.widget.TextView •  tappable [74,1237][125,1300]
android.widget.TextView No source code changes; documentation only. tappable [124,1237][984,1300]
Owner request

Explorer finding: pr-overview: The PR detail stacks two full-width solid-olive buttons, "مراجعة طلب السحب" and "دمج طلب السحب", at identical weight, so no single primary action reads as primary.

The user-agent explorer found this while using the app like a user.
One finding per item; the explorer never edits product code.

Flow: pr-overview
Found on revision: 5327758

Repro:

  1. set this state first: the device in light mode
  2. open the app on emulator-5554
  3. reach pr-overview
  4. the capture shows the defect named below

Observed: The PR detail stacks two full-width solid-olive buttons, "مراجعة طلب السحب" and "دمج طلب السحب", at identical weight, so no single primary action reads as primary.
Expected: the screen renders without this defect

Evidence (from the device run):

Open findings (not fixed here)

  • not proved live: pr-overview.png is no longer on the host that took it, so no publish can carry it

Explorer finding: pr-overview: The PR detail stacks two full-width solid-olive buttons, "مراجعة طلب السحب" and "دمج طلب السحب", at identical weight, so no single primary action reads as primary.

The user-agent explorer found this while using the app like a user.
One finding per item; the explorer never edits product code.

Flow: pr-overview
Found on revision: 5327758

Repro:
1. set this state first: the device in light mode
2. open the app on emulator-5554
3. reach pr-overview
4. the capture shows the defect named below

Observed: The PR detail stacks two full-width solid-olive buttons, "مراجعة طلب السحب" and "دمج طلب السحب", at identical weight, so no single primary action reads as primary.
Expected: the screen renders without this defect

Evidence (from the device run):
- ~/.local/share/kwf/findings/explorer-pr-overview-the-pr-detail-stacks-two-full-width-961b9341/pr-overview.png
@kilo-code-bot

kilo-code-bot Bot commented Sep 19, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

The review re-entry now uses the valid outline variant with a foreground icon that matches the variant's text color, and the header still owns the primary Submit-review CTA, so the overview body keeps exactly one primary action.

Files Reviewed (2 files)
  • apps/mobile/src/components/pr-review/pr-review-overview.tsx
  • apps/mobile/src/components/pr-review/pr-review-overview-actions.mounted.test.tsx

Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0

Review guidance: REVIEW.md from base branch main

@iscekic

iscekic commented Sep 19, 2026

Copy link
Copy Markdown
Collaborator Author

This description names a scenario the proof did not capture:

  • not proved live: pr-overview.png is no longer on the host that took it, so no publish can carry it

A repeated proof run rebuilds the same evidence, so no proof run is dispatched for a named gap. Merging with this gap open is your decision.

@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 19, 2026
@iscekic iscekic self-assigned this Sep 19, 2026

@eshurakov eshurakov left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved after a shallow triage pass. No blocking findings.

@iscekic
iscekic merged commit bd4e4ba into main Sep 21, 2026
29 checks passed
@iscekic
iscekic deleted the kwf/explorer-pr-overview-the-pr-detail-stacks-two-full-width-961b93-5e1a branch September 21, 2026 13:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

human-ready The PR is ready for human review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants