Skip to content

AIDA-2490: Show mobile forum posts on desktop - #2836

Open
ravarora2 wants to merge 9 commits into
mainfrom
rarora/AIDA-2490/forum-read-compatibility
Open

ravarora2 wants to merge 9 commits into
mainfrom
rarora/AIDA-2490/forum-read-compatibility

Conversation

@ravarora2

@ravarora2 ravarora2 commented Nov 6, 2026 •

Copy link
Copy Markdown
Contributor

Why

Mobile forum posts and replies are saved on the relay but disappear from desktop's conversation view. Desktop omits their event kinds from channel history and thread handling.

Fixes AIDA-2490.

What

Show existing forum posts and replies through the current desktop conversation and thread views. Support deletion and reporting, including recovery after an uncertain deletion. Forum editing and reacting remain unavailable until mobile consumes their overlays. Forum read-state actions and deletion of an agent’s forum content by its owner are also unavailable; deletion of the viewer’s own forum content remains supported.

How

Include forum events in channel rows, thread admission and both pagination paths. Reuse the current rendering, attachments, live subscription and signed cursor checks. Browser and native deletion validators accept forum targets under the existing bounded deletion capability; author and channel authorization stay in place.

Regression coverage includes history and reload, live delivery, exact reply links, reconnect repair, mixed chat/forum pagination with tied timestamps, attachments, author checks, migrated-author deletion, deletion recovery and host validation. No automated browser cases were added or removed; protocol/state coverage lives in Vitest and the existing native validator test.

Node integration now runs in a separate required job. Native compilation previously left only 87 seconds of its 20-minute budget for the complete Node suite. The required-check guard rejects failures or skips in either job.

Risk

This changes shared message classification and action gates. It requires no data migration. Agent-owner mutation support remains limited to its existing message kinds.

Testing

Used the production desktop UI in a browser dev host against the existing local relay, with its synthetic account. In Chromium and WebKit, the actual post and reply created earlier through the iOS simulator app appeared, remained visible after reload, and a newly published forum reply arrived live. Each engine completed 26 successful queries with no page errors. Inspected the existing conversation/thread components in both themes at 1440px and 540px, with a 150% root font size.

Independent source review completed; its three findings were fixed. Native Tauri UI and human acceptance remain pending. To try it: open the same forum on mobile and this desktop build, open the post's replies, reload desktop, then add another reply and check that it arrives.

Validation limit: the full macOS native package suite crashed in both parallel and serial runs. Its unchanged window_state::tests::onboarding_snapshot_is_kept_until_next_launch_restore test also crashes alone under LLDB when Tauri's MockRuntime passes a mock window handle to Objective-C. The forum deletion validator test passes; this does not establish a full native-suite pass.

Follow-up at 8d45d966e: regression coverage gates forum edits/reactions in the message API, menu, keyboard edit selection and reaction controls while preserving chat actions and forum deletion/reporting. Corrected the browser fixture’s signed thread-kind digest and its activity-query classification. The existing prefix-insertion test now establishes its reading position directly; its anchoring assertions are unchanged. No browser cases were added or removed. Local follow-up tests were skipped at the human’s request. Compatibility coverage, all six JavaScript shards and both Vitest flake batches passed on b070d94f8; earlier local UI checks predate this follow-up.

CI scheduling evidence: run 42276502874 passed all Rust tests/doctests but timed out during Node integration. A successful main baseline took 164 seconds for Node integration (274 passed, 5 skipped); browser test discovery was the slowest case at 148 seconds. ad7e33f4c moves that unchanged command into its own job, adds one scheduling guard test and extends the existing required-lane failure checks. Post-split hosted CI passed both jobs: native completed in 18m14s; Node integration completed in 4m19s, including 207s execution (279 passed, 5 skipped). Runner setup and standalone plugin-target compilation add work; these different CI snapshots are not a controlled performance comparison.

The remaining WebKit failure exposed a timestamp-ordering error in the notification fixture: its incoming message could predate the history row while browser time was paused. 9fa4d55b5 supplies increasing event timestamps and checks the unread precondition, preserving notification/dwell assertions. No browser cases were added or removed. Hosted CI on 9fa4d55b5 passed, including WebKit, Rust/tool, Node integration and the required gate. Local tests remain skipped as requested.

Rebased onto main fa5bf08f7 at 73772bcb0d4cb3c9c0d74ced657028f88c659342. The only conflict combined independent help-guide additions; range-diff confirms the remaining seven commits are unchanged. GitHub now reports mergeable. Hosted CI completed successfully on 73772bcb0d4cb3c9c0d74ced657028f88c659342, including Rust/tool, Node integration, browser checks and the required gate; DCO passed. Review approval, native Tauri UI acceptance and human acceptance remain pending.

Action follow-up at 98cee06f7c2300b6cb141e88af5659f76df3c705: addressed both design-review findings by gating forum menu/keyboard unread actions and agent-owner deletion. Extended component coverage for both forum kinds, self-deletion, and ordinary chat owner deletion/retry as member and guest. Existing service permissions remain unchanged. Hosted validation completed successfully on 98cee06f7c2300b6cb141e88af5659f76df3c705: attempt 2 passed, including JavaScript 5/6 and the required gate. The rerun completed that shard in 5m18s on the unchanged commit with the same timeout and test selection. MessageManagement.test.tsx passed all 54 tests in JavaScript 2/6 and all five iterations in each of the two Vitest flake jobs; the other non-skipped jobs also passed. The original shard timeout’s cause remains unknown because its log and timing artifact were unavailable. Local tests and fresh rendered/native inspection remained skipped under the existing instruction. Review approval and native/human acceptance remain outstanding; green hosted CI does not establish those acceptance checks.

Generated with Codex

@ravarora2
ravarora2 marked this pull request as ready for review November 6, 2026 17:01
@ravarora2
ravarora2 requested a review from a team as a code owner November 6, 2026 17:01
@ravarora2
ravarora2 force-pushed the rarora/AIDA-2490/forum-read-compatibility branch from 2d258df to 85d804f Compare November 6, 2026 18:14

@kalvinnchau kalvinnchau 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.

🤖 One cross-client compatibility finding; desktop browser journeys passed against a modeled relay, but mobile UI compatibility was not exercised.

Comment thread src/features/relay/messages.ts Resolved
ravarora2 and others added 8 commits November 6, 2026 22:05
Read mobile forum posts and comments through the existing channel and thread views. Preserve author actions and deletion recovery across host validation.

Co-authored-by: BuzzPRReviewAssistant1 <a581a7e8115222acdc32ffb14bfce55d48c24478d98e155f8eba126b69b83c7b@buzz.block.builderlab.xyz>
Signed-off-by: Ravneet Arora <[email protected]>
Keep the existing HTTP profiling fixture aligned with the forum-compatible thread request.

Co-authored-by: BuzzPRReviewAssistant1 <a581a7e8115222acdc32ffb14bfce55d48c24478d98e155f8eba126b69b83c7b@buzz.block.builderlab.xyz>
Signed-off-by: Ravneet Arora <[email protected]>
Keep the signed browser relay fixture strict while accepting the forum kinds requested by thread views.

Co-authored-by: BuzzPRReviewAssistant1 <a581a7e8115222acdc32ffb14bfce55d48c24478d98e155f8eba126b69b83c7b@buzz.block.builderlab.xyz>
Signed-off-by: Ravneet Arora <[email protected]>
Keep forum edits and reactions unavailable until mobile applies their overlays. Correct signed thread and activity fixtures, and establish the retained-prefix reading position before its anchoring assertion.

Co-authored-by: BuzzPRReviewAssistant1 <a581a7e8115222acdc32ffb14bfce55d48c24478d98e155f8eba126b69b83c7b@buzz.block.builderlab.xyz>
Signed-off-by: Ravneet Arora <[email protected]>
Co-authored-by: BuzzPRReviewAssistant1 <a581a7e8115222acdc32ffb14bfce55d48c24478d98e155f8eba126b69b83c7b@buzz.block.builderlab.xyz>
Signed-off-by: Ravneet Arora <[email protected]>
Co-authored-by: BuzzPRReviewAssistant1 <a581a7e8115222acdc32ffb14bfce55d48c24478d98e155f8eba126b69b83c7b@buzz.block.builderlab.xyz>
Signed-off-by: Ravneet Arora <[email protected]>
Give required Node integration its own job after repeated native timeouts.

Co-authored-by: BuzzPRReviewAssistant1 <a581a7e8115222acdc32ffb14bfce55d48c24478d98e155f8eba126b69b83c7b@buzz.block.builderlab.xyz>
Signed-off-by: Ravneet Arora <[email protected]>
Keep incoming messages after the history row when browser time is paused.

Co-authored-by: BuzzPRReviewAssistant1 <a581a7e8115222acdc32ffb14bfce55d48c24478d98e155f8eba126b69b83c7b@buzz.block.builderlab.xyz>
Signed-off-by: Ravneet Arora <[email protected]>
@ravarora2
ravarora2 force-pushed the rarora/AIDA-2490/forum-read-compatibility branch from 9fa4d55 to 73772bc Compare November 7, 2026 03:06
@tellaho

tellaho commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

🤖 Follow-up design review at 98cee06f7c2300b6cb141e88af5659f76df3c705: both previously reported action failures are resolved in source. No remaining blockers found in this follow-up.

  • Forum posts/comments no longer offer unsupported read-state actions through the menu or keyboard gate.
  • Agent-owner deletion excludes forum rows. Deletion of your own forum content and ordinary chat owner deletion remain available.

The updated component coverage includes both forum kinds, member/guest ownership, chat deletion/retry and author deletion recovery. Hosted CI attempt 2 completed successfully on this exact head.

Source review only; I did not run local tests or inspect rendered widths/themes, enlarged text, empty/loading/error/long-content states, keyboard focus, many-agent layouts or live mobile/native behavior. Those acceptance checks remain outstanding.

Keep unread actions and agent-owner deletion aligned with the existing service capabilities. Preserve deletion of self-authored forum content.

Co-authored-by: appetizer <a581a7e8115222acdc32ffb14bfce55d48c24478d98e155f8eba126b69b83c7b@buzz.block.builderlab.xyz>
Signed-off-by: Ravneet Arora <[email protected]>
@ravarora2
ravarora2 force-pushed the rarora/AIDA-2490/forum-read-compatibility branch from def7b3d to 98cee06 Compare November 7, 2026 04:36
@ravarora2

ravarora2 commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor Author

🤖 In response to the two action findings: both are valid and addressed in 98cee06f7c2300b6cb141e88af5659f76df3c705.

  • Forum rows no longer offer Mark read/unread in the menu or Mark unread through selected-message keyboard actions. The unread service retains its existing kind restrictions.
  • The agent-owner deletion menu path excludes forum rows. Deletion of the viewer’s own forum posts/comments remains available, including keyboard deletion and existing uncertain-delivery recovery. Service authorization is unchanged.

Extended MessageManagement coverage for forum kinds 45001/45003, ordinary chat controls, and agent-owner menu behavior for members and guests. The chat cases retain actual deletion and retry assertions for kinds 9/40002; forum cases assert the unsupported action is absent after profile ownership resolves. Existing own-forum deletion/recovery coverage remains. No browser cases were added or removed.

Staged formatting/static checks passed. Local tests and fresh rendered inspection were skipped under the existing instruction to use hosted CI. Hosted validation completed successfully on 98cee06f7c2300b6cb141e88af5659f76df3c705: attempt 2 passed, including JavaScript 5/6 and the required gate. The rerun completed that shard in 5m18s on the unchanged commit with the same timeout and test selection. MessageManagement.test.tsx passed all 54 tests in JavaScript 2/6 and all five iterations in each of the two Vitest flake jobs; the other non-skipped jobs also passed. The original shard timeout’s cause remains unknown because its log and timing artifact were unavailable. Local tests and fresh rendered/native inspection remained skipped under the existing instruction. Review approval and native/human acceptance remain outstanding; green hosted CI does not establish those acceptance checks.

@tellaho

tellaho commented Nov 10, 2026

Copy link
Copy Markdown
Contributor

🤖 Could you add a screenshot or short video of the change to the PR? Design uses these for faster reviews.

@ravarora2

Copy link
Copy Markdown
Contributor Author

🤖 Could you add a screenshot or short video of the change to the PR? Design uses these for faster reviews.

image

matt2e added a commit that referenced this pull request Nov 14, 2026
…in the measurements lane (#3447)

## Why

`browser-host/relay-broker-live.test.mjs`, "real broker keeps 100,000
joined channels and delivers outside the first batch", times out
intermittently in the shared JavaScript shard.

| Sighting | Lane |
|---|---|
| [7 Nov, PR, passed on
re-run](https://github.com/block/buzz-app/actions/runs/42415071330/job/128531273095)
| JavaScript (2/6) |
| [9 Nov, PR, passed on
re-run](https://github.com/block/buzz-app/actions/runs/42600556170/job/129103660721)
| JavaScript (2/6) |

**This PR edits `.github/workflows/ci.yml`.** It adds one step to the
existing Browser measurements job. The required gate is unchanged: no
job was added or removed, and the measurements result that `CI required`
already checks now carries the scale check.

## Root cause

The test asserts wall-clock time: about 20 s of single-threaded CPU has
to finish inside a 30 s `vi.waitFor` budget. Vitest hashes files to
shards, so the test always shared shard 2/6 with `InboxPage.test.tsx`
and `vite-config.test.mjs`, under two workers.

- `main` passed at 22.5 s.
- The two failing jobs reached the budget at 33.9 s and 32.8 s, with the
broker connected and no channels reported joined yet.
- Their whole shard ran 440 to 446 s against 366 s on `main`.
- Locally the test took 18 s unthrottled and failed 2 of 3 at about 35 s
under CPU throttling.

The 30 s budget is a documented performance contract, so it is not
raised.

## Change

The test body moves into a helper shared by two tests in the same file.

- **"real broker delivers outside the first joined batch"** joins one
channel more than a live batch and runs in the shared shards. It keeps
the behavioural contract: one socket, the first live-only REQ names a
full batch that excludes the last channel, an event in that channel is
delivered, and swapping it for a new channel establishes the new one and
retires the old route. The lone overflow channel replays inside its own
REQ, so this case expects one live-only batch REQ, not two.
- **The 100,000-channel check** keeps its 49 live-only REQs, its
open-wire ceiling and its 30 s and 60 s budgets. It is gated with
`test.skipIf(!process.env.BUZZ_BROKER_SCALE)`, the same pattern the
Claude Code protection live test uses.

The gated check runs as a step of the Browser measurements job, which
already runs serially on an isolated runner. The step sets
`BUZZ_BROKER_SCALE`, filters by title through `ci-test-report.mjs`, and
uploads its report with the job's evidence artifact. A title filter that
matches nothing is a green run of zero tests, so the step then requires
exactly one passed test. `docs/contributing.md` lists the step under the
lane.

No budget, assertion or failure path was weakened, and no engine was
skipped.

## Evidence

Measured locally on an idle 32-core Linux host, Vitest 5.0.4.

| Measurement | Before | After |
|---|---|---|
| Scale check alone | 14.8 s test time (`vitest run -t "100,000"`, 15.3
s total) | 15.0 s test time, 16.6 s elapsed with the exact lane command;
1 passed, 55 skipped, guard exit 0 |
| Whole file, as a shared shard runs it | 22.2 s, 55 tests | 7.5 s, 55
passed and 1 skipped |
| New behavioural case | | 10 of 10 fresh runs passed, 231 to 277 ms |
| Guard with the gate unset, `-t "100,000"` | | vitest exits 0 with 56
skipped; the guard exits 1 |

Hosted, before, from a green `main` run: Browser measurements 10 m 34 s,
JavaScript (2/6) 7 m 31 s. Biome is clean on the test file and the
workflow parses. The pre-push type check and the file's related unit
tests passed on this branch's head.

`tests/integration/browser-ci.test.mjs` pins the upload paths of the
**Measurement evidence** step, in the case "classic-scrollbar cases run
exactly once, after the measurements, without clearing their evidence".
The second commit adds `test-results/broker-scale` to that expected
list. It changes the test expectation only; the workflow is as in the
first commit.

| Integration test file | Before the second commit | After |
|---|---|---|
| `./bin/node --test tests/integration/browser-ci.test.mjs`, macOS, Node
v24.18.0 | 6 passed, 1 failed on the upload-path assertion | 7 passed, 0
failed |

That assertion is the only pin of the measurements job's steps or paths.
The lane's other integration test files and the Linux container the lane
uses in CI were not run locally.

## Not confirmed, not run

- Hosted timings after the change are not known yet. The measurements
lane gains about the scale check's run plus Vitest startup. The drop in
shard 2 is confirmed only by the job summary once CI runs this PR.
Reviewers should compare both there.
- The local timings are from Linux and are not hosted CI numbers.
- No human has tested this yet, so `buzz-review-completed` is not set.

## Left alone

- `InboxPage.test.tsx` shares the same slow shard with no race found. It
needs fixture-cost profiling rather than a timeout change.
- Open PRs #3050, #3046, #2883, #2836, #2014, #1140, #1105 and #873 also
edit `ci.yml`; #2604 and #427 edit the test file; #1547, #1140 and #427
edit `docs/contributing.md`. A trial merge of each against this change
is clean.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Signed-off-by: mtoohey <[email protected]>
Signed-off-by: Matt Toohey <[email protected]>
Co-authored-by: Claude Fable 5.1 <[email protected]>

This branch has not been deployed

No deployments
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.

4 participants