Skip to content

Artifactory: read sends its request; the rail draws the whole board - #237

Merged
scgopi merged 1 commit into
mainfrom
fix/artifactory-read-and-rail
Sep 1, 2026
Merged

scgopi merged 1 commit into
mainfrom
fix/artifactory-read-and-rail

Conversation

@scgopi

@scgopi scgopi commented Sep 1, 2026

Copy link
Copy Markdown
Owner

Two bugs, one found by a peer loop and one by a human, both real.

artifactory read never worked

graphcode artifactory read <path> <id> timed out on every id (exit 75) while sync/list/status answered fine. The openProject send that opens the round-trip was glued onto the end of the preceding comment line — syntactically a comment, so it never ran, and read then waited for a .graphChanged nobody had asked for.

Broken since the read-side round of #229; never worked in any release. Diagnosed to the line by the Artifactory demo GIF loop during a peer verification run — the first time a loop on this graph has found a bug by using the board. A newline fixes it.

The expanded rail section drew no posts

Header, Leave a note, and nothing between — while the folded line proved a post existed. The scroll box asked for min(contentHeight, cap) with contentHeight starting at zero, and a zero-height scroll view never lays out its content, so the preference that would have grown it never fired. Resolved by leaving the box unsized until the measurement lands. Every note is drawn, in a box that hugs them until ~10 and scrolls after.

Verification

Suite 1482 tests / 153 suites pass; swiftlint 0 errors, swift-format --strict clean. read verified live after local install. The rail still needs a human's eyes.

🤖 Generated with Claude Code

https://claude.ai/code/session_019A6NULwEiBXEdRXwEKKcRH

Two bugs, one found by a peer loop and one by a human, both real.

`graphcode artifactory read <path> <id>` timed out on every id, valid or not
(exit 75), while sync/list/status answered fine from the same daemon. The
`openProject` send that opens the round-trip had been glued onto the end of
the preceding comment line — syntactically a comment, so it never ran, and
`read` then waited for a `.graphChanged` nobody had asked for. Broken since
the read-side round of #229; never worked in any release. Diagnosed to the
line by the Artifactory demo GIF loop, which is the first time a loop on this
graph has found a bug by using the board. A newline fixes it.

The rail's expanded ARTIFACTORY section drew its header and the "Leave a
note" button with nothing between them, while the folded line showed a post
was there. The scroll box asked for `min(contentHeight, cap)` with
`contentHeight` starting at zero, and a zero-height scroll view never lays out
its content — so the preference that would have grown it never fired. Chicken
and egg, resolved by leaving the box unsized until the measurement lands: the
first pass lays the posts out, the height arrives, the box snaps to it. Every
note is drawn, in a box that hugs them until roughly ten and scrolls after.

Suite: 1482 tests / 153 suites pass; swiftlint 0 errors, format clean. `read`
is verified live after install; the rail still needs a human's eyes.

Signed-off-by: scgopi <scgopireddy@gmail.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019A6NULwEiBXEdRXwEKKcRH
@scgopi
scgopi merged commit a38d55c into main Sep 1, 2026
1 check passed
scgopi added a commit that referenced this pull request Sep 1, 2026
…nt (#238)

Reported with a screenshot: a large gap between the ARTIFACTORY header and
the "3 message records" row under it. The box was taller than its rows and
bottom-anchored, so the slack sat between the header and the first row.

This is the second failure of sizing the scroll box from a measured content
height — first a zero start that never laid out (#237), now a stale reading.
Preferences from inside a ScrollView are not a foundation to build on.

Replaced with the idiom that needs no measuring: `.frame(maxHeight:)` under
`.fixedSize(horizontal: false, vertical: true)`. fixedSize asks the scroll
view for its ideal height, which is its content's, and the frame clamps that.
The box is exactly as tall as the posts until the cap and scrolls after. No
state, nothing to go stale, nothing to fire late. All GeometryReader and
preference plumbing removed.

Suite: 1482 tests / 153 suites pass; swiftlint 0 errors, format clean.



Claude-Session: https://claude.ai/code/session_019A6NULwEiBXEdRXwEKMcRH

Signed-off-by: scgopi <scgopireddy@gmail.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant