Skip to content

[3326 by Claude Opus 5.5] Goal repository identity is clipped beyond the 320px phone viewport - #3327

Merged
integry merged 3 commits into
mainfrom
3326/claude-opus-5-5-goal-repository-identity--20261022-2313-7c6
Oct 23, 2026
Merged

integry merged 3 commits into
mainfrom
3326/claude-opus-5-5-goal-repository-identity--20261022-2313-7c6

Conversation

@propr-dev

@propr-dev propr-dev Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

AI Implementation Summary

Closes #3326

Branch: 3326/claude-opus-5-5-goal-repository-identity--20261022-2313-7c6
Commits: ✅ Changes committed (f950f87)


AI Processing Completed

Execution Details:

Summary:
I've fixed the clipped repository name on the Goal detail header. At 320px the full owner and repository name are now readable, with the owner on its own line above the repository name, which wraps if needed. No tooltip or sideways scrolling is needed. Desktop still shows the compact one-line owner/name chip.

Cause: the chip's text doesn't wrap, and that stopped the chip from shrinking even though its width was capped at the space available. So the whole chip was wider than its column and a parent element cut it off. That is why there was no ellipsis and why the page reported no horizontal overflow.

Changes:

  • RepositoryChip.tsx: a new opt-in stackOnNarrow setting for the shared chip. Below 640px (Tailwind's sm breakpoint) it puts the owner above the repository name, lets both wrap, and lets the chip shrink to fit. On phones the chip's text is sized relative to the page's base font size, so it grows when the reader enlarges text. From 640px up it is the normal one-line chip. The slash is hidden on phones but screen readers still read it. Other chips (the Goal list, global search) don't use the setting and are unchanged.
  • GoalsPage.tsx: only the Goal detail header turns the setting on.
  • e2e/creator-attribution.pw.ts: an existing test that found the repository text through the chip's truncate style class now finds it by its test id, because the stacked chip only truncates from 640px up.

Tests:

  • Browser tests: I added e2e/goal-repository-identity.pw.ts, which runs in Chromium against the built app. It uses the slug from the issue (propr-ultrafix/propr-desktop-acceptance-20260909) and a much longer owner/repository pair. It covers:

    • 320px and 390px widths.
    • 320px with the page's base text at 150% and 200%.
    • 1440px desktop.
    • native Linux desktop-app windows at 320px and at the zoomed 406px size.
    • the Goal list at 320px, which should still show one truncated line.

    The tests measure where every line of the chip's text actually lands and check it sits inside the header content, the viewport and every parent that could cut it off. They also check the owner is above the name and nothing is hidden behind an ellipsis. Model, elapsed time, completed status, requester, Open draft PR and the menu are still visible and on screen.

  • Check against the old code: on the unfixed code, the 320px case fails on the measurement itself: the chip's right edge is at 376.8px, matching the ~375px in the issue.

  • Results: the new spec passes 13/13. The existing Goal browser specs (regressions, queue, attention, previews, creator attribution) pass. All 3047 unit tests pass (including two new chip tests), and typecheck and lint are clean.

The independent Astra review and the real native/mobile check on a device still need to happen; I tested native windows only with the simulated desktop shell in Chromium. Nothing was merged or published.

Detailed Logs:

  • Conversation: 102 messages
  • Session: 3905be8f-647d-4c34-aa6d-8b66fb1c1105

Log files stored at:

  • conversation: /usr/src/app/logs/executions/issue-3326-2026-10-22T23-35-09-057Z-conversation.json
  • output: /usr/src/app/logs/executions/issue-3326-2026-10-22T23-35-09-057Z-output.txt
Latest Conversation Messages
ASSISTANT: [content unavailable]

ASSISTANT: I've fixed the clipped repository name on the Goal detail header. At 320px the full owner and repository name are now readable, with the owner on its own line above the repository name, which wraps if...


This PR was created automatically by ProPR after processing issue #3326.


💡 Need changes?

Comment on this PR to request refinements — the AI agent monitors comments and will update the implementation based on your feedback. Keep iterating until you're satisfied!


Visual preview

Enlarged text (150%) at 320px

Enlarged text (150%) at 320px

The chip text scales with the root font size and still wraps in full

Original unavailable: managed storage is unavailable or the upload has expired.

Long owner and repository at 320px

Long owner and repository at 320px

Very long owner and repository names wrap inside the chip instead of overflowing

Original unavailable: managed storage is unavailable or the upload has expired.

Desktop header (unchanged compact chip)

Desktop header (unchanged compact chip)

At 1440px the metadata row keeps the one-line owner/name chip

Original unavailable: managed storage is unavailable or the upload has expired.

Native Linux shell, 320px window

Native Linux shell, 320px window

Desktop-app narrow window shows the full stacked identity

Original unavailable: managed storage is unavailable or the upload has expired.

Goal header at 320px (reported repository)

Goal header at 320px (reported repository)

propr-ultrafix/propr-desktop-acceptance-20260909: owner stacked above the full repository name, inside the 320px viewport

Original unavailable: managed storage is unavailable or the upload has expired.

Goal header at 390px

Goal header at 390px

Same goal at a typical phone width

Original unavailable: managed storage is unavailable or the upload has expired.

…320px the full owner and repository name are now readable, with the owner on its own line above the repository name, which wraps if needed. No tooltip or sideways scrolling is needed. Desktop still shows the compact one-line `owner/name` chip.

Cause: the chip's text doesn't wrap, and that stopped the chip from shrinking even though its width was capped at the space available. So the whole chip was wider than its column and a parent element cut it off. That is why there was no ellipsis and why the page reported no horizontal overflow.

Changes:
- `RepositoryChip.tsx`: a new opt-in `stackOnNarrow` setting for the shared chip. Below 640px (Tailwind's `sm` breakpoint) it puts the owner above the repository name, lets both wrap, and lets the chip shrink to fit. On phones the chip's text is sized relative to the page's base font size, so it grows when the reader enlarges text. From 640px up it is the normal one-line chip. The slash is hidden on phones but screen readers still read it. Other chips (the Goal list, global search) don't use the setting and are unchanged.
- `GoalsPage.tsx`: only the Goal detail header turns the setting on.
- `e2e/creator-attribution.pw.ts`: an existing test that found the repository text through the chip's `truncate` style class now finds it by its test id, because the stacked chip only truncates from 640px up.

Tests:
- Browser tests: I added `e2e/goal-repository-identity.pw.ts`, which runs in Chromium against the built app. It uses the slug from the issue (`propr-ultrafix/propr-desktop-acceptance-20260909`) and a much longer owner/repository pair. It covers:
  - 320px and 390px widths.
  - 320px with the page's base text at 150% and 200%.
  - 1440px desktop.
  - native Linux desktop-app windows at 320px and at the zoomed 406px size.
  - the Goal list at 320px, which should still show one truncated line.

  The tests measure where every line of the chip's text actually lands and check it sits inside the header content, the viewport and every parent that could cut it off. They also check the owner is above the name and nothing is hidden behind an ellipsis. Model, elapsed time, completed status, requester, Open draft PR and the menu are still visible and on screen.
- Check against the old code: on the unfixed code, the 320px case fails on the measurement itself: the chip's right edge is at 376.8px, matching the ~375px in the issue.
- Results: the new spec passes 13/13. The existing Goal browser specs (regressions, queue, attention, previews, creator attribution) pass. All 3047 unit tests pass (including two new chip tests), and typecheck and lint are clean.

The independent Astra review and the real native/mobile check on a device still need to happen; I tested native windows only with the simulated desktop shell in Chromium. Nothing was merged or published.
@integry

integry commented Oct 22, 2026

Copy link
Copy Markdown
Owner

/review gpt-6-astra

Review exact head f950f87 for the actual 320px Goal-detail repository clipping defect. Check owner/name full visibility, real text-line and clipping-ancestor bounds, root-text enlargement, accessibility slash, compact list preservation and desktop creator baseline. Document overflow alone is insufficient. Root exact-source tests and actual-data rendered phone checks remain separate; no signed-native or physical-phone claim yet. Do not merge or publish.

@propr-dev

propr-dev Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor Author

✅ AI Code Review Complete requested by @integry

Posted 1 review:

View Task Details

@propr-dev

propr-dev Bot commented Oct 22, 2026

Copy link
Copy Markdown
Contributor Author

🔍 AI Code Review — gpt-6-astra

Overall Evaluation

The supplied diff for head f950f87f9b3ab7dd1333b61738adb2c8dfd6f1cc appears to address the clipping mechanism correctly. No code blocker is evident, but rendered verification remains outstanding before I can call the fix fully validated.

✅ Scoped wrapping — Only Goal detail opts into stacking. Both owner and name can wrap anywhere, and the chip and inner text can shrink. Default compact consumers retain their existing rendering.

✅ Responsive identity preservation — The slash remains in the DOM without aria-hidden; only its visual presentation changes on phones. Mobile font sizing uses rem-based utilities, while desktop retains inline truncation.

✅ Relevant regression coverage — Added tests inspect text-line and clipping-ancestor horizontal bounds, cover 320px and enlarged root text, and preserve compact-list checks. The desktop creator-baseline assertion remains intact with an updated selector.

This was a static review; no commands or tests were run. Exact-source test execution and actual-data rendered phone inspection remain separate, unverified evidence. No signed-native or physical-phone validation is claimed. The supplied issue excerpt is truncated; the supplied diff is complete.

Merge blockers

No merge blockers.

Suggestions

These are optional follow-ups and are not sent to /fix.

S1: 🟢 Strengthen clipping geometry assertions

In propr-ui/e2e/goal-repository-identity.pw.ts, chipGeometry collects vertical bounds, but expectReadableIdentity checks only horizontal containment. Optionally check vertical containment against ancestors that actually clip vertically, accounting for scrollable content, and use clipping client bounds rather than outer border rectangles. This strengthens future regression detection; the diff does not demonstrate vertical clipping.

S2: 🟢 Verify accessible slash exposure

The DOM retains the slash, but text-content and innerText assertions do not verify accessibility-tree exposure. An accessibility snapshot assertion at phone width would strengthen this contract. This is optional coverage: the implementation uses the conventional screen-reader-only pattern and introduces no demonstrated accessibility defect.

Score

The implementation is focused and its proposed coverage addresses the reported failure mechanism. No verified code blocker or current check failure is present, but the requested rendered validation is unverified; six supplied checks remain pending.

Score: 7/10


🤖 Review Details

  • Model: GPT-6 Astra
  • Time: 25s
  • Tokens: 37,443 (36,776 in / 667 out)
  • Cost: $0.27

View Task


💡 Next step: Comment /fix to address every F# merge blocker, /fix all for every pending blocker and suggestion, or name records explicitly, as in /fix F3 S5.
F# and S# IDs increment across review comments and remain permanent, so selectors such as /fix F3 F5 stay unambiguous across cycles. S# suggestions stay optional: they are implemented only when you name them or request /fix all, and they never relax a merge blocker.

Copy and edit to choose records from this review:

/fix S1 S2

🤖 Review by ProPR

@propr-dev

propr-dev Bot commented Oct 22, 2026

Copy link
Copy Markdown
Contributor Author

CI failed: Full Test Suite Shard 2/4

Please investigate and fix this CI failure.

  • Check: Full Test Suite Shard 2/4
  • Result: failure
  • Commit: f950f87f9b3a (f950f87f9b3ab7dd1333b61738adb2c8dfd6f1cc)
  • Details: View CI failure

Failure evidence

.github:11
Process completed with exit code 1.

.github:36110
Process completed with exit code 1.

.github:2
Node.js 20 is deprecated. The following actions target Node.js 20 but are being forced to run on Node.js 24: actions/checkout@11d5960. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/

@propr-dev

propr-dev Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor Author

✅ Applied the requested follow-up changes in commit b35208f

Summary of Changes

I fixed the failure in Full Test Suite Shard 2/4 by updating one test file. Your Goal header change didn't cause it.

Cause: the shard failed on a single suite, test/prPublicationRecoveryJob.test.ts. It errored before running any tests:

SyntaxError: The requested module './prCommentCollisionRecovery.js' does not provide an export named 'delayPRCommentJobInPlace'

Commit f5e3510 ("wait in place behind a blocked predecessor follow-up handoff") made src/jobs/prCommentHandoffIntegration.ts import delayPRCommentJobInPlace and predecessorWaitDelay from prCommentCollisionRecovery.js. This suite replaces that module with a fake that lists its exports by hand, and neither function was on the list, so the module failed to load.

Fix: I added the two missing functions to the fake in test/prPublicationRecoveryJob.test.ts:309, as no-op stubs. Nothing outside that test file changed.

Verification:

  • Run through the project's test runner, the suite now passes 39/39.
  • I also checked the other suites that fake or import these modules. Six failed when I ran them with bare node --test, so I re-ran each failing one through the runner. All of them pass except the one I fixed.

This is a test-only change with nothing visible on screen, so I made no previews.


🤖 Implementation Details

  • Model: Claude Opus 5.5 (medium)
  • Requested By: @propr-dev[bot]
  • Time: 4m 39s
  • Tokens: 538,687 (535,332 in / 3,355 out)
  • Cost: $0.37

Undo Changes • View Task Execution


💡 ProPR Slash Commands
Command Description Example
/merge Merge target branch into this PR and resolve conflicts /merge
/review Request an AI code review /review or /review claude-sonnet
/fix Address review blockers, or blockers and suggestions with /fix all /fix, /fix all, or /fix F3 S5
/switch Change the AI model for this PR /switch claude-opus
/use Override the model for a single follow-up run /use claude-sonnet
/ultrafix Loop review→fix cycles until score goal is met /ultrafix or /ultrafix goal=8 max=10

🤖 Generated by ProPR
Processing comment ID: 6353894664✓

@integry

integry commented Oct 22, 2026

Copy link
Copy Markdown
Owner

/merge

Integrate current main including merged PR #3321 (960a437). That reviewed change contains the logger containment fix, ip-address 10.7.4 lockfile resolution and the missing delayPRCommentJobInPlace/predecessorWaitDelay recovery-fixture mock exports. PR3325 CI at c5c51b3 demonstrably failed importing the first missing export from that old fixture; sanitized shard2 output retained independently. Preserve this PR's reviewed UI changes and assertions; do not create another workaround for a fixture already fixed on main. ProPR owns Git finalization. Do not merge this PR into main, publish or deploy. Root will inspect the exact resulting head, refresh Astra review and verify current checks separately.

…g one test file. Your Goal header change didn't cause it.

I fixed the failure in Full Test Suite Shard 2/4 by updating one test file. Your Goal header change didn't cause it.

**Cause:** the shard failed on a single suite, `test/prPublicationRecoveryJob.test.ts`. It errored before running any tests:

```
SyntaxError: The requested module './prCommentCollisionRecovery.js' does not provide an export named 'delayPRCommentJobInPlace'
```

Commit f5e3510 ("wait in place behind a blocked predecessor follow-up handoff") made `src/jobs/prCommentHandoffIntegration.ts` import `delayPRCommentJobInPlace` and `predecessorWaitDelay` from `prCommentCollisionRecovery.js`. This suite replaces that module with a fake that lists its exports by hand, and neither function was on the list, so the module failed to load.

**Fix:** I added the two missing functions to the fake in `test/prPublicationRecoveryJob.test.ts:309`, as no-op stubs. Nothing outside that test file changed.

**Verification:**
- Run through the project's test runner, the suite now passes 39/39.
- I also checked the other suites that fake or import these modules. Six failed when I ran them with bare `node --test`, so I re-ran each failing one through the runner. All of them pass except the one I fixed.

This is a test-only change with nothing visible on screen, so I made no previews.

PR: #3327
Comment by: @propr-dev[bot] (ID: 6353894664)
Model: Claude Opus 5.5
@propr-dev

propr-dev Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor Author

🔀 Resolved merge conflicts from main into 3326/claude-opus-5-5-goal-repository-identity--20261022-2313-7c6 in commit 6b7bfed

Conflicting Files

  • test/prPublicationRecoveryJob.test.ts

Resolution Summary

I resolved the one merge conflict, in test/prPublicationRecoveryJob.test.ts. No conflict markers are left anywhere in the repository, and that test file passes when run alone through the project's test runner.

What the conflict was about: main added a feature where a follow-up job waits behind a blocked earlier job (commit f5e3510). That feature uses two new functions, delayPRCommentJobInPlace and predecessorWaitDelay. This test file replaces the module containing them with a hand-written fake, and the fake was missing both functions, so the suite failed to load. Both branches fixed this separately by adding the two functions to the fake at line 309, and the conflict is between those two versions of that one line:

  • This PR (b35208f): delayPRCommentJobInPlace: async () => undefined, predecessorWaitDelay: () => 0
  • main (960a437): delayPRCommentJobInPlace: async () => false, predecessorWaitDelay: () => 60_000

How I resolved it: I kept main's version.

Why: Both versions do the same job, so neither side's intent is lost. main's version matches what the real functions return: delayPRCommentJobInPlace returns Promise<boolean> and predecessorWaitDelay returns a number of milliseconds, both in src/jobs/prCommentCollisionRecovery.ts. false is a real value for "could not wait in place", while undefined is not a boolean. Taking main's line also means this file is identical to main's copy, so later merges won't hit this conflict again.

Checks:

  • Tests: node scripts/run-test-suite.mjs test/prPublicationRecoveryJob.test.ts passed.
  • Typecheck: running tsc --noEmit against the root project reported no errors in this file.

The other staged changes from the merge (apps/desktop/src/logger.ts, apps/desktop/src/logger-sinks.test.ts, package-lock.json) had no conflicts, and I didn't touch them.


🤖 Resolution Details

  • Model: Claude Opus 5.5
  • Time: 3m 22s

View Task Execution


System-triggered merge conflict resolution

…ository-identity--20261022-2313-7c6

Automatically resolved merge conflicts after merging target branch into PR branch.
Resolved conflicts in:
- test/prPublicationRecoveryJob.test.ts

PR: #3327
Model: Claude Opus 5.5
@propr-dev

propr-dev Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor Author

🔀 Auto-merged main into 3326/claude-opus-5-5-goal-repository-identity--20261022-2313-7c6 (clean merge) in commit 6b7bfed

No conflicts were found — the merge was verified by an AI agent.


🤖 Verification Details

  • Model: Claude Opus 5.5
  • Time: 2m 2s

View Task Execution


System-triggered merge conflict resolution

@integry

integry commented Oct 23, 2026

Copy link
Copy Markdown
Owner

/review gpt-6-astra

Review exact main-integrated head 6b7bfed. Root full compare from previously reviewed f950f87 changes exactly four files: desktop logger, logger tests, root lockfile ip-address10.7.4, and recovery test mock. Every changed blob exactly equals reviewed/green main960a4375 (#3321); all UI code/tests and other tracked files are unchanged. Check composition and continued mobile/desktop behavior rather than assuming the earlier head review covers this head automatically.

Independent root evidence at f950:65 targeted units,82 Chromium/WebKit browser cases, real completed Goal data at320/390 and24/32px root-font scaling, served bundle/source-map byte binding, actual trusted touch dragging, text-line hit testing and directly inspected stable screenshots. No signed combined-native or physical-phone acceptance is claimed. Root current source audits and current-headCI remain separate gates. Do not merge, publish or deploy.

@propr-dev

propr-dev Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor Author

✅ AI Code Review Complete requested by @integry

Posted 1 review:

View Task Details

@propr-dev

propr-dev Bot commented Oct 23, 2026

Copy link
Copy Markdown
Contributor Author

🔍 AI Code Review — gpt-6-astra

Overall Evaluation

The change addresses the reported 320px clipping defect with an opt-in wrapping layout while preserving compact chips elsewhere. No merge-blocking defect is evident in the supplied diff; merge readiness is conditional on the pending current-head checks completing successfully.

✅ Scoped layout change — Only the Goal detail header enables stackOnNarrow; other callers retain their existing truncated layout.

✅ Readable repository identity — Shrinkable containers and overflow-wrap:anywhere allow both owner and name to wrap. The slash remains in the DOM for assistive technology and desktop rendering.

✅ Relevant regression coverage — Browser assertions inspect text-line and clipping-ancestor bounds, enlarged root text, compact list behavior, and desktop creator alignment.

This was a static review; no commands or tests were run. The reported integration blob equality and historical browser results were not independently verified. The supplied PR diff shows no interaction with the logger, dependency resolution, or recovery fixture changes described in the integration context. The issue excerpt is truncated, so assessment covers its visible requirements.

Merge blockers

No merge blockers.

Suggestions

These are optional follow-ups and are not sent to /fix.

S3: 🟢 Clarify native simulation labels

In propr-ui/e2e/goal-repository-identity.pw.ts, the “native” cases use a mocked desktop bridge and browser viewport/device-scale settings. Naming them desktop-shell simulations would make their evidence clearer: they exercise responsive shell layout, but do not execute native window zoom or signed desktop packaging. This is optional documentation cleanup; the review request already distinguishes these acceptance boundaries.

Score

The implementation is localized and backed by regression assertions targeting the actual clipping failure. No current-head failures are reported; seven checks remain pending, and runtime evidence was not independently reproduced during this review.

Score: 8/10


🤖 Review Details

  • Model: GPT-6 Astra
  • Time: 27s
  • Tokens: 37,156 (36,650 in / 506 out)
  • Cost: $0.28

View Task


💡 Next step: Comment /fix to address every F# merge blocker, /fix all for every pending blocker and suggestion, or name records explicitly, as in /fix F3 S5.
F# and S# IDs increment across review comments and remain permanent, so selectors such as /fix F3 F5 stay unambiguous across cycles. S# suggestions stay optional: they are implemented only when you name them or request /fix all, and they never relax a merge blocker.

Copy and edit to choose records from this review:

/fix S3

🤖 Review by ProPR

@integry
integry merged commit 9885541 into main Oct 23, 2026
53 of 82 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Goal repository identity is clipped beyond the 320px phone viewport

1 participant