Add inline mobile agent activity - #6054
Conversation
Signed-off-by: kenny lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7af71e9ce7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
themiguelamador
left a comment
There was a problem hiding this comment.
I found two blocking correctness issues and fixed both on Complear:review/pr-6054-fix (0e4c0453f):
- P1 — Thread activity could expose the wrong turn. Observer frames are channel-scoped and carry no thread ID, but a thread typing signal was paired with that agent's latest observer turn in the channel. With concurrent turns, opening activity in thread A could therefore show the transcript for thread B. Thread signals are now status-only until the protocol can identify an exact thread turn, with a regression test.
- P1 — Adaptive liveness expiry did not have a producer contract. Mobile read
livenessIntervalSecs, but the ACP harness emitted neither that field onturn_startednor onturn_liveness; moreover, every legacy heartbeat reset a previously learned timeout to 30 seconds. Agents configured above the default interval could disappear before their first/next heartbeat, while interval0produced a stale badge for more than 24 hours after a crash. The harness now publishes its configured interval, mobile preserves the prior interval for legacy heartbeats, and disabled liveness uses a bounded fallback. NIP-AO and regression coverage are updated.
Verification on the fix branch:
just mobile-check— pass (format, analyzer, file-size ratchet)just mobile-test— 1,489 passedcargo test -p buzz-acp— 787 passed (778 unit + 9 lifecycle)cargo clippy -p buzz-acp --all-targets -- -D warnings— passgit diff --check— pass
The source head was still 7af71e9ce710cfa5f57f9989abfd6f606be18fdc immediately before publishing this review.
Signed-off-by: kenny lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1ca9793e7d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: kenny lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 638320c007
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: kenny lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 63a1829f69
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: kenny lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 3ff56f93a9
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: kenny lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 64ea2d430a
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: kenny lopez <klopez4212@gmail.com>
wesbillman
left a comment
There was a problem hiding this comment.
Carl, an automated reviewer, commenting via Wes’s GitHub account.
One lifecycle-ordering defect remains at exact head 64ea2d430a12554409e7fffcc8933238049a6fa5:
An older stale working turn always hides a newer completion or error for the same agent. _compareComposerTurnRecency prioritizes isWorking before comparing either turn's activity chronology (mobile/lib/features/channels/agent_activity/working_bots_provider.dart:172-178). If an ephemeral terminal frame is missed for turn A, and a later turn B starts and then completes/errors, activeByAgent selects stale A even though B has the later lastActivityAt. Observer kind:24200 is deliberately WS-only and not stored (crates/buzz-relay/src/handlers/event.rs:947-949), so a missed frame is a supported failure mode; with disabled liveness, the false working state can remain until the seven-day backstop (active_agent_turns.dart:323-340).
Select the newest turn by lifecycle/receipt chronology, using working state only as a tie-breaker when chronology is equal. Add the inverse of the current old-terminal/new-working test: an old working turn plus a newer error/completion must surface the newer terminal outcome.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7da997a567
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: kenny lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d5b96f9a27
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: kenny lopez <klopez4212@gmail.com>
…nt-activity Signed-off-by: kenny lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1fab22311f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: kenny lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d40c4ed894
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: kenny lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 870f4b340c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
jedwards27
left a comment
There was a problem hiding this comment.
Verdict: REQUEST CHANGES
Reviewed: 076081bfc646f8fdf8ff9dc6e00843b5bdae0ad0..870f4b340c21d8388c96470077639947f263fa73 (exact head 870f4b340c21d8388c96470077639947f263fa73)
Risk: high. This changes the ACP lifecycle producer/contract and adds a primary, user-visible mobile activity workflow.
Two material regressions are unresolved; see inline findings. Both were independently reproduced from clean exact-head bytes with focused Flutter probes.
Validation at matching head:
- PASS:
cargo test -p buzz-acp(795 unit + 9 lifecycle tests). - PASS:
just mobile-check. - PASS in an independent clean run: full
just mobile-test(1,506 tests). A second full-suite attempt hit one order-sensitive failure and then the command cap; that row passed alone, so I am not attributing it to this PR. - PASS:
git diff --check 076081bfc646f8fdf8ff9dc6e00843b5bdae0ad0..HEAD. - PASS: all current GitHub checks, including Mobile, at this exact head.
- FAIL: clock-rollback lifecycle probe: a
turn_completed(seq=2)with an earlier wall-clock timestamp thanturn_started(seq=1)reduces toworking, notfinished. - FAIL: narrow 220×600 multi-agent fixture at
TextScaler.linear(2)overflows by 57 px.
Manual/native evidence: not supplied. The PR adds no mobile integration/native-review journey and has no exact-artifact recording of composer → keyboard dismissal → overlay → agent switching → collapse/focus restoration. After fixing the blockers, please provide an iOS/Android journey covering the actual IME and accessibility behavior; widget tests cannot establish VoiceOver/TalkBack or native focus restoration.
The product scope aligns with Buzz's human/agent workspace direction, and I found no additional material tenancy, persistence, authorization, or secret-handling defect in the changed paths reviewed. Green CI is welcome, but it does not negotiate with two executable counterexamples.
Signed-off-by: kenny lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4cf8e98242
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: kenny lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: aca4ee3415
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Co-authored-by: Kenny Lopez <klopez4212@gmail.com> Signed-off-by: Kenny Lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e166a8ce75
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Co-authored-by: Kenny Lopez <klopez4212@gmail.com> Signed-off-by: Kenny Lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 88f5ba2e6d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Co-authored-by: Kenny Lopez <klopez4212@gmail.com> Signed-off-by: Kenny Lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 287e562280
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Co-authored-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz> Signed-off-by: Princess Donut <b238ea756dee4d98afa5883fc7f1de61eeabe65bf700e3a5a5a80db5e42e2c2b@buzz.block.builderlab.xyz>
jedwards27
left a comment
There was a problem hiding this comment.
:bot: Jude’s code review agent
Verdict: REQUEST CHANGES
Reviewed: 076081bfc646f8fdf8ff9dc6e00843b5bdae0ad0..6dbfb88d058cedc30e3dfda842c392ecdfda44cb (exact head 6dbfb88d058cedc30e3dfda842c392ecdfda44cb)
Risk: high — this changes the mobile composer’s real-IME/focus lifecycle and accessibility interaction while also extending ACP observer scope and ordering contracts.
The source-level blockers from the prior round are fixed. Large-text sizing now follows the active TextScaler, the narrow footer can stack, overlay geometry remains bounded above the composer, keyboard-open expansion waits for native inset/layout settlement, and focus restoration is conditional on prior focus. The ACP path also keeps steering delivery, observer rescoping, stale completion, sequence ordering, owner binding, identity teardown, and bounded buffering coherent. I found no material source-level defect or unrelated conflict with VISION.md / TESTING.md at this head.
Blocking evidence gap: there is still no exact-head native iOS or Android artifact exercising the complete composer → real IME dismissal → expanded overlay → agent switch → collapse/focus restoration journey, nor a VoiceOver/TalkBack traversal. The widget semantics checks at mobile/test/features/channels/agent_activity/composer_agent_activity_indicator_test.dart:577,705 establish a label but do not establish native focus order, announcements/selected state, horizontal selector discoverability, IME behavior, draft preservation, or focus restoration. Because those are the user-facing boundaries changed here, green widget/CI tests are not sufficient proof.
Smallest safe closure: attach exact-head iOS and Android captures with a real IME and VoiceOver/TalkBack enabled, verifying focus order and selected state, horizontal selector discoverability, agent switching, collapse, draft preservation, and focus restoration. No source change is requested unless that exercise exposes one.
Validation at matching clean HEAD:
- Focused mobile activity suite: 19/19 passed.
- Full
mobileFlutter package suite: 1,521/1,521 passed. - Additional mobile ownership/lifecycle suites: 47/47 passed.
cargo test -p buzz-acp: 800 library + 9 integration tests passed.git diff --check: passed; worktree clean.- Current GitHub checks, including Mobile, Rust, security, relay/backend integration, and mesh lifecycle: completed successfully (publish-only jobs intentionally skipped).
Residual risk: native IME and assistive-technology behavior on both supported mobile platforms remains unverified at this exact SHA.
Co-authored-by: Kenny Lopez <klopez4212@gmail.com> Signed-off-by: Kenny Lopez <klopez4212@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1ecfed8d9b
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| final activityIndicator = activityIndicatorBuilder?.call( | ||
| composerExpansionController, | ||
| focusNode, | ||
| activityInteractionLock, | ||
| composerActivationRequests, | ||
| expandComposer, | ||
| ); |
There was a problem hiding this comment.
Split the composer widget below the file-size ceiling
This addition leaves compose_bar_widget.dart over the repository's hard 1,000-line limit, so just file-size-check, pre-push, and CI reject the change. Move another private section into a sibling part file rather than growing this widget further.
AGENTS.md reference: AGENTS.md:L573-L579
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
🤖 Corroborating this finding at the same head 1ecfed8d9b94, with two additions.
Reproduced locally. node mobile/scripts/check-file-sizes.mjs exits 1: lib/features/channels/compose_bar/compose_bar_widget.dart: 999 -> 1013 (+14) lines (allowed 1000), base fe7c6808e743. Control: the same command at the previous PR head 6dbfb88d058c exits 0. The file measures 999 ratchet-lines on both main and 6dbfb88d058c, so this head is the first revision where the branch's activity-indicator additions and main's own growth of the same file coexist. It came in with the merge, not with the feature commits.
Consequence past this one file. The failing step is File size policy inside Detect Changed Paths, the path-filter job the rest of CI keys off. With it red, Desktop and Desktop E2E Integration fail as aggregators (Desktop Core finished with: skipped) and Mobile is skipped outright, so there is no mobile CI signal at this head at all. Clearing this is a precondition for getting one, not just a lint cleanup.
Local runs at this exact head, since the Mobile job did not run: flutter analyze clean, full mobile suite 1600/1600 passed (agent_activity 70, channel_detail_page_test.dart 149), cargo test -p buzz-acp 810 library + 9 integration passed.
jedwards27
left a comment
There was a problem hiding this comment.
:bot: Jude’s code review agent
Verdict: REQUEST CHANGES
Reviewed: fe7c6808e7430d185498178e07e58e378d2e4c7d..1ecfed8d9b946288b92ed9bf01b8f05fdf4757a5 (exact head 1ecfed8d9b946288b92ed9bf01b8f05fdf4757a5)
Risk: high — this changes ACP lifecycle contracts and a primary mobile composer/focus/accessibility workflow.
The merge delta introduces no new material source-level contract, lifecycle, persistence, tenancy, authorization, secret-handling, product, layout, or semantics defect found in this review. Parent-owned focus restoration remains coherent across channel/thread pages, ComposeBar, and activity handoff; the earlier large-text/narrow-layout fixes remain intact.
Blocking merge gate
The exact head deterministically fails the required file-size policy. CI run 32283107407, job 96166215156, reports:
Mobile file size ratchet failed (base HEAD^1):
lib/features/channels/compose_bar/compose_bar_widget.dart: 999 -> 1013 (+14) lines (allowed 1000)
The merge resolution grew mobile/lib/features/channels/compose_bar/compose_bar_widget.dart beyond the ratchet. Detect Changed Paths exits at that point, so Mobile, Rust/unit, Security, Desktop, and integration jobs are skipped; the red aggregate jobs reflect those skipped dependencies. Please extract one coherent composer concern into the existing part-file structure (or otherwise return the file within policy) and rerun all required checks on the resulting head. This gate should not be waived.
Validation at matching clean head
- PASS: focused composer activity suite, 19/19.
- PASS: focused channel overlay/tail integration plus archived composer suppression, 2/2.
- PASS: focused lifecycle/ownership suites, 47/47 (
active_agent_turns,working_bots_provider,observer_subscription). - PASS:
just mobile-check(format/analyzer); PASS:git diff --check fe7c6808...HEAD. - FAIL: exact-head GitHub file-size gate above; affected downstream CI did not run.
- NOT GREEN: two
cargo test -p buzz-acppackage attempts each produced 809 pass / 1 fail atacp::tests::keepalive_resets_idle_past_deadline; the row passed twice alone. That is suite-load/order-sensitive evidence and is not sufficient to attribute a production regression to this PR, but it is not a valid package pass either. - NOT RUN: full mobile package suite at this merge head. The PR description's earlier full-suite claim is not attributable to these merge bytes.
Native evidence still required
No exact-head iOS/Android artifact demonstrates real IME dismissal → overlay → agent switch → collapse/focus restoration, draft preservation, or VoiceOver/TalkBack traversal. Widget semantics cannot establish native focus order, announcements/selected state, horizontal selector discoverability, or IME restoration. After the policy fix, please provide exact-head captures for both platforms covering those boundaries.
Residual risk: native IME and assistive-technology behavior remains unverified, and the exact-head ACP package gate is not clean.
Summary
Testing
just mobile-checkjust mobile-test(1,486 tests)