The phone reads the thread — comments arrive on the card's read view, posting and editing behind transactional sheets

The comment thread renders read-only under the card's body (author line, Markdown body through CardBodyView, read-only paperclip rows), read outside the snapshot and re-read on every walk landing via BoardSession.snapshotGeneration. Add Comment posts through the Mac composer's own draft-then-rename bracket — seeding from the card's single synced draft so a thought started on the Mac finishes here — and each row's context menu opens the same sheet in edit mode. Both commit on their trailing button or not at all: the phone's transactional model, dirty-Cancel confirmation and swipe-dismiss disabled while dirty included. UI-tested end to end with disk assertions.

Claude-Session: https://claude.ai/code/session_01SR4XGjmBE16ZUYWpfFHXwY
This commit is contained in:
2026-08-08 18:18:56 -04:00
parent 2516c4ba5d
commit 78c32776d4
9 changed files with 521 additions and 27 deletions
@@ -120,32 +120,8 @@ final class BoardsNavigationUITests: XCTestCase {
private extension XCUIApplication {
/// Boards the fixture's first lane its first card, landing on `CardDetailScreen`'s read
/// view. Shared by every test in this file so the navigation-and-assert boilerplate is written
/// once.
@MainActor
func navigateToFirstCard() {
let boardRow = element(labelContaining: RichBoard.title)
XCTAssertTrue(
boardRow.waitForExistence(timeout: XCUIApplication.uiTimeout),
"the \"\(RichBoard.title)\" row never appeared — check the fixture copy or the first scan"
)
boardRow.tap()
let laneRow = element(labelContaining: RichBoard.firstLane)
XCTAssertTrue(
laneRow.waitForExistence(timeout: XCUIApplication.uiTimeout),
"the \"\(RichBoard.firstLane)\" lane row never appeared"
)
laneRow.tap()
let cardRow = element(labelContaining: RichBoard.firstLaneFirstCard)
XCTAssertTrue(
cardRow.waitForExistence(timeout: XCUIApplication.uiTimeout),
"the \"\(RichBoard.firstLaneFirstCard)\" card row never appeared"
)
cardRow.tap()
}
// `navigateToFirstCard()` moved to `MobileUITestSupport.swift` the comments suite starts on
// the same card.
/// Taps `CardDetailScreen`'s Edit button and waits for `CardEditScreen`'s cover to land.
@MainActor