Skip to content

feat: complete community Magic Board across desktop and mobile - #5476

Open
PIZZALORD713 wants to merge 4 commits into
block:mainfrom
PIZZALORD713:codex/dispatch-magic-board-v0
Open

feat: complete community Magic Board across desktop and mobile#5476
PIZZALORD713 wants to merge 4 commits into
block:mainfrom
PIZZALORD713:codex/dispatch-magic-board-v0

Conversation

@PIZZALORD713

@PIZZALORD713 PIZZALORD713 commented Aug 10, 2026

Copy link
Copy Markdown

Summary

  • complete the Markdown-backed Magic Board card lifecycle on desktop
  • add durable card metadata for type, status, author, and attached Buzz thread
  • add Cards and Kanban layouts with persisted drag ordering and status changes
  • add per-card Buzz work rooms that create once, recover by deterministic marker, and reopen as native threads
  • add live canvas refresh, stale-revision guards, and steward-only layout editing
  • persist each channel's Board/Stream preference while preserving Stream for routed message intents
  • add read-only Cards/Kanban rendering and linked native-thread navigation on mobile

Product behavior

Cards and Kanban

  • Existing level-two Markdown sections remain valid cards with inferred type and status.
  • New or edited cards store durable metadata in a hidden buzz-board-card HTML comment.
  • Supported native types are task, note, conversation, project, artifact, person, agent, and decision.
  • Supported workflow states are Backlog, Doing, and Done.
  • Stewards can create, edit, reorder, and move cards between Kanban columns; the shared Markdown canvas remains the source of truth.

Card work rooms

  • Start thread creates an ordinary top-level Buzz conversation and links its event ID into the card metadata.
  • A deterministic client marker lets a retry recover the existing conversation instead of creating a duplicate.
  • Open thread routes directly into the linked native thread on desktop and mobile.

Collaboration and navigation

  • Desktop subscribes to live kind-40100 canvas updates for non-DM channels.
  • Board and raw-canvas editors keep the event ID they opened from and reject a stale save before publishing.
  • Mobile uses the same revision check in its management flow.
  • Revision checks are optimistic conflict guards; the relay does not currently provide an atomic compare-and-swap primitive.
  • Only channel stewards can mutate canvas layout. Other members remain read-only on the Board and can participate in linked card threads.
  • Board/Stream preference is stored per channel. Dispatch remains Board-first; other eligible channels remain Stream-first until selected.
  • Message, post, thread, forum, draft, profile, and agent-session route intents temporarily force Stream without overwriting the saved preference.

Mobile parity

  • Eligible channels expose a Board/Stream selector.
  • Mobile parses the same hidden metadata contract and renders Cards or Backlog/Doing/Done columns.
  • Linked card conversations open in the native thread page.
  • The composer and stream-only controls stay out of the way while Board is active.

Compatibility

  • no new event kinds or data migration
  • legacy canvas Markdown continues to render through type/status inference
  • the metadata comment remains valid, human-readable Markdown source
  • DMs remain Stream-only

Validation

  • bin/just ci passed across formatting, linting, Rust, desktop, web, mobile analysis, builds, and full test suites
  • full Flutter suite: 2,078 passed, 0 failed
  • focused mobile Board/channel matrix: 238 passed, 0 failed
  • focused Magic Board Playwright matrix: 9 passed, 0 failed
  • canvas model tests: 15 passed, 0 failed
  • Rust canvas revision tests: 2 passed, 0 failed
  • desktop and 390 px narrow-layout visual QA passed
  • git diff --check clean; no new Rust unwrap or expect

Verified head: a89ea281b4679871d95435419cb8c11a326f699c

@PIZZALORD713
PIZZALORD713 marked this pull request as ready for review August 10, 2026 17:00
@PIZZALORD713
PIZZALORD713 requested a review from a team as a code owner August 10, 2026 17:00
@PIZZALORD713
PIZZALORD713 marked this pull request as draft August 10, 2026 17:00

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8c81578a28

ℹ️ 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".

/>
</div>

<ChannelManagementSheet

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Navigate away after deleting the board channel

When an administrator deletes the currently viewed channel from this board-specific management sheet, no onDeleted callback is provided. The mutation immediately removes the channel from the shared channel query, so ChannelRouteScreen loses its activeChannel and renders ChannelScreenEmptyState while the URL still points to the deleted channel; unlike the existing stream and global-management paths, nothing calls goHome. Pass a deletion handler that closes the panel and replaces the invalid route.

Useful? React with 👍 / 👎.

@PIZZALORD713 PIZZALORD713 changed the title feat(desktop): add community Magic Board feat(desktop): add editable community Magic Board Aug 17, 2026
Render shared channel canvases as a responsive Board while preserving Stream routing for existing deep links and actions.

Co-authored-by: pizzalord.eth <pizzalord.gm@gmail.com>
Signed-off-by: pizzalord.eth <pizzalord.gm@gmail.com>
Co-authored-by: pizzalord.eth <pizzalord.gm@gmail.com>
Signed-off-by: pizzalord.eth <pizzalord.gm@gmail.com>
Let channel stewards create and edit Markdown-backed cards from the Board, reorder them with pointer or keyboard drag, and persist the shared canvas with optimistic rollback and conflict guards. Cover parsing, permissions, narrow layout, and the durable create-edit-drag flow.

Co-authored-by: pizzalord.eth <pizzalord.gm@gmail.com>
Signed-off-by: pizzalord.eth <pizzalord.gm@gmail.com>
@PIZZALORD713
PIZZALORD713 force-pushed the codex/dispatch-magic-board-v0 branch from 435c85c to 6637f92 Compare September 4, 2026 04:51
@github-actions

github-actions Bot commented Sep 4, 2026

Copy link
Copy Markdown

🔐 Codex Security Review

Status: review required for the current range.

The current range is 4b0744d7f3161d9f045dd67a73e014e4440c2b47...a89ea281b4679871d95435419cb8c11a326f699c.
A new review must complete for this exact range. When manual authorization
is required, a Block organization member must comment exactly
@buzz-security-review a89ea281b4679871d95435419cb8c11a326f699c to authorize a new review.
Any previous review applies only to its recorded range.

Signed-off-by: pizzalord.eth <pizzalord.gm@gmail.com>
@PIZZALORD713 PIZZALORD713 changed the title feat(desktop): add editable community Magic Board feat: complete community Magic Board across desktop and mobile Sep 4, 2026
@PIZZALORD713
PIZZALORD713 marked this pull request as ready for review September 4, 2026 06:16
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 4, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-04T06:26:27.196581Z a89ea28 Draft marked ready
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: a89ea281b4

ℹ️ 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".

Comment on lines +188 to +192
const hasRouteTarget = Boolean(
hasStreamRouteIntent ||
searchHighlight ||
selectedPostId ||
targetMessageId ||

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve stream mode after resolving a message target

In a Dispatch channel or any channel whose saved preference is Board, a messageId only forces Stream until the timeline finds the row: ChannelScreen then calls clearMessageRouteTarget({ replace: true }), making this predicate false and immediately remounting the Board. The linked message therefore appears only briefly before being hidden, so retain Stream for the lifetime of the resolved navigation rather than deriving it solely from the transient URL parameter.

Useful? React with 👍 / 👎.

Comment on lines +65 to +66
let current_event_id = events.first().map(|event| event.id.to_hex());
ensure_canvas_revision(expected_event_id.as_deref(), current_event_id.as_deref())?;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Use a revision that orders same-second canvas writes

When multiple board mutations occur within one second, their signed events share the same second-resolution created_at; however, query_events orders ties by id ASC (crates/buzz-db/src/store/event.rs:685-693). After the client caches the returned ID of a later drag or status write, this limit-one query can still select the earlier lower-ID event, causing the next save to report a revision conflict despite no concurrent editor and causing reloads to select the earlier canvas. The revision must use an authoritative monotonically ordered token rather than assuming the last submitted event ID will become the query head.

Useful? React with 👍 / 👎.

Comment on lines +1011 to +1015
.subscribeLive(
{
"#h": [channelId],
kinds: [40100],
limit: 0,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Backfill the desktop live canvas subscription

If the initial useCanvasQuery request completes before this WebSocket subscription becomes active, a canvas update published in that interval is absent from the history result, and limit: 0 prevents the subscription from replaying it. The desktop then displays stale board contents until another update or reconnect; start the live subscription with bounded backfill or establish readiness before refreshing history.

AGENTS.md reference: AGENTS.md:L183-L186

Useful? React with 👍 / 👎.

Comment on lines +556 to +558
useEffect(() {
if (sessionStatus != SessionStatus.connected || !boardAvailable) {
return null;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Subscribe before a mobile canvas exists

For an ordinary non-Dispatch channel with no canvas yet, boardAvailable is false, so this effect installs no subscription. If another steward creates the canvas while the page remains open, nothing invalidates channelCanvasProvider, the Board selector never appears, and the user must leave and reopen the channel; subscribe for every eligible non-DM channel so creation and recreation events are observable.

AGENTS.md reference: AGENTS.md:L176-L186

Useful? React with 👍 / 👎.

Comment on lines +269 to +273
(await relayClient.sendMessage(
channel.id,
buildCanvasBoardCardConversationOpener(card, channel.name),
[],
[["client", marker]],

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Durably recover the thread-to-card linkage

If this top-level message publish succeeds but the subsequent canvas update fails because of a revision conflict or network error, the conversation remains permanently visible in the stream while the card remains unlinked. The catch only displays an error, and the deterministic marker is consulted only if a user manually retries, so this two-write user action needs a durable linkage retry record rather than relying on another click.

AGENTS.md reference: AGENTS.md:L204-L209

Useful? React with 👍 / 👎.

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