Repository navigation
Conversation
|
🤖 [blocking] View only also publishes the chat's Canvas — workspace folders and agent instructions — but the consent copy only says "full history". Adversarial review by Princess Donut (AI agent), posted from Taylor's account on Taylor's behalf, at A Solo chat's Canvas is a channel-scoped kind How it fails: An owner whose chat was started from a workspace chooses View only. The confirmation says only "Everyone in this community will be able to view this chat’s full history." ( Fix: For Solo, make the confirmation (and |
|
🤖 [blocking] Mobile still requires Adversarial review by Princess Donut (AI agent), posted from Taylor's account on Taylor's behalf, at This PR changes the shared classification contract. // mobile/lib/features/channels/channel.dart:109
bool get isSolo => isStream && isPrivate && labels.contains('buzz.solo');
How it fails: The owner sets a chat to View only on desktop and then opens mobile. The chat drops out of Me ( Fix: Land a companion block/buzz change that drops |
|
🤖 [optional] Stale contract comment: Princess Donut (AI agent), posted from Taylor's account on Taylor's behalf. |
|
🤖 [optional] Test the "Public (existing)" Solo state, which is now reachable from the Solo surfaces. Princess Donut (AI agent), posted from Taylor's account on Taylor's behalf.
|
099c634 to
e71d37f
Compare
|
🤖 [blocking] With Public, anyone in the community can join and direct the owner's agents inside the owner's workspace folders, and the answers land in a community-readable chat. Adversarial re-review by Princess Donut (AI agent), posted from Taylor's account on Taylor's behalf, at Waking matches an ordinary public channel. What a woken agent can do does not. In a Solo chat, every turn is given the owner's Canvas project: "This chat's work happens in these folders, not your own workspace: … How it fails: A community member finds the chat in Search, joins and posts "@agent, show me the config in the project folder." The owner's agent runs on the owner's machine, works in the owner's local folder and posts the result at top level, where the whole community can read it. The only limit is that agent's protection policy, which is set per agent and isn't specific to Solo. I didn't verify its defaults. The confirmation says "New people will be able to post" ( Fix (pick one; this is a product call):
|
|
🤖 [blocking] Any Public joiner can knock out the owner's Canvas for every agent turn. Adversarial re-review by Princess Donut (AI agent), posted from Taylor's account on Taylor's behalf, at The relay treats kind
How it fails: A community member joins a Public Solo chat and saves any Canvas text. From then on, every turn of the owner's agents runs without the owner's standing instructions or workspace folders, and nobody is told. The owner's Canvas view now shows the joiner's text. Only the owner rewriting the Canvas recovers it. Invited members could already do this, but Public opens it to the whole community. Fix: When the head isn't from the owner's side, fall back to the latest revision that is. The Canvas is a regular event: query |
|
🤖 Re-review at
|
e71d37f to
e998427
Compare
|
🤖 Scoped re-check at
Not covered here: the carried-over |
e998427 to
b5ad705
Compare
|
🤖 Carl, on Taylor’s behalf: pushed The final amendment is only the stale hint expectation in The scoped UI re-check at |
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 Found a conversion access regression and two access-disclosure/copy issues.
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Star Lord’s automated source review via Wes’s account, with independent Rocket, Mantis and Groot coverage. Two P2 findings are attached inline.
Reviewed head b5ad705 against base 7878f06, using immutable Git objects. I also inspected the public description, commit message and all 20 attached images; no actionable public-material exposure was found on those surfaces.
The change reuses Select, AlertDialog, channelDetails save/readback and ordinary discovery authority. The two new browser journeys (four engine cases) cover routing, signed broker/discovery integration, persistence, focus and responsive overlays; role permutations remain in unit tests. Existing recovery tests include focus assertions, but this review did not run them.
Source-only: no tests, builds or app execution. The single hosted-check snapshot showed CI required and the listed checks successful, with Windows validation skipped. Native/live-relay acceptance, performance measurements and the final human walkthrough remain unverified. Disabling Public is assessed as the documented UI restriction; separate harness/Canvas hardening is outside this change. This COMMENT review is not an approval.
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Star Lord’s automated source follow-up via Wes’s account, with independent Rocket, Mantis and Groot coverage. No new actionable findings in the changes since b5ad705.
The two prior P2 findings are repaired in source: Solo agent additions explicitly request Bot through the existing outbox, with compatible receipt matching, and Public/Member nonmember previews use the ordinary roster reader. I also checked conversion’s current-visibility default and retained explicit/pending intent. The native generic signer and browser enrollment route accept the new admission shape; this is source inference, not live-host acceptance.
Reviewed head 2f976be against base 923a80f, using immutable Git objects. The 12-file endpoint follow-up reuses the existing Dialog, RadioGroup, roster reader and channelWrites owner. No browser cases were added or removed; two existing journeys extend actual modal/focus and broker/discovery coverage while role permutations remain in unit tests. I inspected the current public description, commit message and all 22 attached images; no actionable publication-surface exposure was found.
Source-only: no tests, builds or app execution by this review. One hosted-check snapshot showed all listed checks successful except skipped Windows native validation. Native/live-relay acceptance, rendered error/retry focus, performance measurements and the human walkthrough remain unverified. The existing optional disclosure/label decisions and documented harness-hardening follow-ups are unchanged. This COMMENT review is not an approval.
b5ad705 to
2f976be
Compare
|
🤖 Scoped re-check at
Note, in Kalvin's on-hold P3 scope (no action here): a Public/Member Solo visitor's access panel says "New people can participate. People already in the channel keep their access." But Solo has no Join path, and the noun is "channel". |
2f976be to
8afa56e
Compare
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Carl, an automated reviewer, commenting via Wes's GitHub account. The review is from Carl, Princess Donut, Mongo and Mordecai, and covers head 8afa56e08 against 7878f0609.
Verdict: one P2 should be fixed before merge. There are two optional P3s. All three are inline.
- What holds: View only stays read-only through the relay. Guests can't post, react or write the Canvas, and nonmembers can't add people. The explicit Bot and Member grants pass the relay's admission rules. The strict receipt matching for agent additions holds. Conversion keeps the current visibility. Previews use the ordinary roster reader. Public cannot reach the Solo save path.
- Not verified: this was a source review, with one focused Node probe of the invitation recovery path. CI is green at this head. Native and live-relay acceptance and a human walkthrough remain open. The mobile app still treats only private chats as Solo (
isSolo), and that stays the PR's stated follow-up. - Merge criteria: make the Private transition's copy and docs true for people who joined while the chat was View only.
857dda9 to
658395c
Compare
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 One additional Solo disclosure concern; existing findings are not repeated.
658395c to
c964938
Compare
c964938 to
cd8d751
Compare
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 One remaining disclosure gap when member roles are unavailable.
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
cd8d751 to
8af2cd2
Compare
|
🤖 @kalvinnchau Both disclosure gaps are fixed in The failed WebKit conversion journey now waits for Select closure/focus before keyboard navigation, retaining its selection/publication/focus assertions without sleeps or retries. The existing compact Dialog spacing keeps the disclosure, picker and actions unobscured. Validation: 75 unit checks in three complete files; final conversion refinement reran all 29 conversion checks. All 24 Chromium/WebKit cases across the two complete browser files passed; the final refinement reran all 20 Solo chats cases (47.5s). Mandatory push gates pass, including types/related units (147.53s). Hosted CI and human retest remain pending. The description keeps desktop captures; narrow/enlarged-text checks remain covered. |
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Carl, an automated reviewer, commenting via Wes's GitHub account. This is a follow-up from Carl, Princess Donut, Mongo and Mordecai at 8af2cd287, against 6dc462a2d.
Verdict: nothing blocks merge. The prior P2 is fixed. The retained-Guest warning shows while roles are loading, after they fail to load, and whenever a Guest exists. The Public (existing) → View only copy and the docs now match relay behavior. Three optional P3s are inline.
- Checked: in
applySharedChannelDetails, thejoinRolematching has one caller, conversion, which passes complete loaded details, so it raises no spurious conflicts. Private keeps the admission default.channel-writes.tsis unchanged since the last review. The conversion Select uses the shared keyboard and focus handling. The newgeneral-access.tsserves two real callers. - Not verified: this was a source review only. CI snapshot: 39 checks passed, WebKit 2/14 was still pending, and Windows was skipped. Native and live-relay acceptance and a human retest remain open. The mobile app still treats only private chats as Solo, and that stays the stated follow-up.
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
|
🤖 Carl (AI agent): @wesbillman All four open P3s are addressed in
Validation: 116 focused checks across the three complete unit files; all 24 Chromium/WebKit cases at |
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 One legacy invitation recovery dead end remains.
| if (soloParticipant && pending && noRole(pending.event)) { | ||
| if (!channel()?.members?.includes(pubkey)) | ||
| throw new Error( | ||
| "This saved invitation does not explicitly grant participation. Check its status in Outbox before inviting again.", |
There was a problem hiding this comment.
🤖 [P2] Provide a recovery exit for an unapplied legacy invitation
With a saved no-role Solo kind-9000 whose delivery is unknown and whose target is absent from the verified roster, recover() above attaches a member-add: recovery key before this branch directs the user to Outbox. Outbox Retry routes back through memberAdditions.add and reaches this same rejection; Remove rejects non-failed kind-9000 items with recovery keys (outbox.ts:877–884). Members Add and Solo sharing also reach this branch. The existing members.test.ts assertions at lines 299 and 302 preserve the dismiss rejection and the repeated add rejection after restart. Consequently this profile cannot complete a fresh invitation for that person through these actions. Provide an explicit, safely verified way to retire the legacy receipt and issue a fresh role=member invitation while preserving the prohibition on replaying the no-role event.
wesbillman
left a comment
There was a problem hiding this comment.
🤖 Star Lord’s automated source follow-up via Wes’s account, with independent Rocket, Mantis and Groot coverage.
One P2 remains: I corroborate the existing legacy-invitation recovery finding. For an unknown no-role invitation whose target remains absent, members.ts:192–201 attaches recovery ownership and rejects; Outbox Retry returns to the same branch, while Remove rejects the unknown recovery item. The new restart test preserves that loop. Please provide a verified recovery exit that allows participation to be restored while preserving unknown-outcome safety and never replaying the no-role grant. Fresh roster absence alone does not establish that an in-flight command cannot arrive later. Keeping this attached to the existing finding avoids a duplicate inline thread.
The retained-access warnings and superseded Finish-receipt fixes are present in source; no additional actionable defect was established in this follow-up. Reviewed head 590f4ee against base bcabade, focusing on changes since 8af2cd2. The public description and all 23 attached images were inspected.
Source-only: no tests, builds or app execution; CI was not assessed. Native/live-relay recovery, performance, keyboard/screen-reader behavior on mismatch and retry, and human acceptance remain unverified. This is a COMMENT review, not approval.
Overview
Category: new-feature
User Impact: Solo chat owners can let their community read a chat while keeping participation by invitation in the access dialog.
Problem: Solo owners could share individual membership, but could not open a chat for community reading while keeping its Solo identity and project filing.
Solution: Reuse channel access with View only / Private, preserving Solo identity and individual roles. Access changes and conversion disclose history, Canvas workspace folders/agent instructions, and retained member access, including when role verification is unavailable. Conversion preselects the current policy and saves matching admission; invited Solo agents receive Bot so they can reply.
Changes
File changes
docs/buzz-help.md
Explain View only / Private, the conditional retained-access confirmations, Bot admission and the three conversion access choices.
docs/solo/README.md
Describe Solo identity independently of visibility and conversion selecting Private, View only or Public.
docs/solo/sharing.md
Document community reading, invitations, Bot admission, conversion access and existing Public policies. Explain the conditional confirmations and that Private blocks nonmembers while joined Guests retain access until removed in People.
src/app/shell/SearchResults.tsx
Label View-only chats accurately while retaining a truthful Public chat label for policies created elsewhere.
src/bundled/channels/ChannelGeneralAccess.test.tsx
Cover the two available choices and transition-specific confirmation copy, including retained Public → Private membership and the expanded Canvas disclosure.
src/bundled/channels/ChannelGeneralAccess.tsx
Reuse the shared access options and policy mapping. Solo offers View only / Private, retains Public (existing), and confirms history/Canvas disclosure plus the retained-access sentence for each applicable transition.
src/bundled/channels/ChannelMembersDialog.solo.test.tsx
Exercise Public → Guest admission and View only → Private through real dialog/session wiring, including verified Guest/Member roles, pending/failed role verification with cached Guest or Member roles, unchanged membership, cancellation and preserved Solo filing.
src/bundled/channels/ChannelMembersDialog.test.tsx
Cover explicit Bot grants in public/private Solo chats with Guest defaults and verified preview rosters for Public/Member visitors, retaining no-message, focus and recovery checks.
src/bundled/channels/ChannelMembersDialog.tsx
Enable shared General access for Solo and remove the redundant hint. Keep the retained-Guest warning unless the existing signed role snapshot verifies no Guests; loading/error states retain it. Read-only Solo previews use ordinary roster reads rather than member-only sharing refreshes.
src/features/channels/general-access.ts
Share access labels, descriptions, current-policy classification and visibility/admission mapping between the access picker and conversion. Private preserves the existing admission default.
src/features/channel-members/members.test.ts
Verify participatory invitations with a saved Guest admission default. Cover legacy no-role receipts, unknown outcomes, verified roles, Guest recovery across restart, explicit failed-receipt dismissal and concurrent role administration.
src/features/channel-members/members.ts
Permit invitations to open Solo chats and explicitly grant Member participation to invited people. Recovery never replays a legacy no-role receipt as a participation grant; signed roles distinguish a completed invitation from a retained Guest, with an actionable remove-and-invite-again path.
src/features/messages/ChannelJoinNotice.tsx
Use the existing chat/channel noun for the read-only notice.
src/features/messages/MessageComposer.test.tsx
Exercise admission-before-send and cancellation/refusal in both public and private Solo chats with a Guest default.
src/features/relay/channel-writes.ts
Request Bot explicitly for Solo agents added by the access dialog or composer. Retry only compatible role receipts while preserving acknowledgement, delivery, target and expiry checks; ordinary channel admission is unchanged.
src/features/relay/contracts.ts
Describe Solo as a labelled stream independently of visibility.
src/features/relay/discovery-permissions.test.ts
Cover visitor reading, denied View-only participation and access revocation on privacy restoration.
src/features/relay/discovery.ts
Recognize Solo metadata independently of visibility.
src/features/relay/session-agent-admission.test.ts
Verify signed Bot invitations with Guest defaults in public/private Solo chats, same-event retries and rejection of no-role, Guest, Member and duplicate-role receipts.
src/features/relay/session-discovery.test.ts
Verify signed public metadata retains Solo classification.
src/features/solo/ConvertToChannel.test.tsx
Verify all nine access-policy transitions, current-policy preselection and Guest/Member readback while preserving TTL and labels. Exercise uncertain-save recovery, transient Finish read failures and superseded admission mismatches through Reload and remount without republishing or unfiling.
src/features/solo/ConvertToChannel.tsx
Offer the shared Private, View only and Public options with current access preselected. Save visibility and admission together, preserve the chosen policy during recovery, and reject changed admission before unfiling. Private conversion reuses the retained-access warning; verified superseding edits retire obsolete unconfirmed receipts while transient reads retain recovery.
src/features/solo/labels.ts
Keep label-based presentation separate from relay access authority and share the Solo disclosure and retained-member warning between access and conversion.
src/features/solo/share.ts
Include admission in exact conversion-intent matching and fresh-details conflict checks.
src/features/solo/share.test.ts
Verify explicit Member grants for people and preserved Bot grants for agents.
tests/browser/channel-members-focus.spec.mjs
Expect no accessible description after removing the Solo hint, while retaining pointer/Enter agent admission and search-focus assertions.
tests/browser/fixture.mjs
Supply signed public Solo metadata and preview rosters for real broker/discovery journeys.
tests/browser/solo-chats.spec.mjs
Extend the existing conversion focus journey to start from View only, exercise all three choices by pointer and keyboard, preserve Guest admission, and check the retained-Guest Private conversion warning in both themes and sizes without adding browser cases.
tests/browser/solo-public-access.spec.mjs
Exercise the two-choice picker, View-only save/reload, visitor reading and privacy restoration. Extend the owner journey for the conditional confirmations, including Public (existing) → Private, cancellation/focus and narrow enlarged-text layouts; inspect an existing Public/Member visitor without a roster error. No browser cases added.
Reproduction steps
Scope and limits
The available choices are a UI restriction, not a relay or agent-harness safeguard. CLI/MCP and other clients can still set Public with Member admission. Existing members can still address agents and replace the shared Canvas; View only restricts new people and does not revoke existing memberships. Wake and owner-Canvas hardening belong to a separate follow-up. This PR does not claim to resolve those underlying risks.
Solo visitors read without a Join action. Ordinary channel access choices and Join behavior remain as on main.
Validation
Review fixes are committed as
590f4ee29. The previous feature baseline is8af2cd287.f51d51ca8. The final follow-up only blocks stale legacy-role confirmation; the checked warning/conversion and browser files are unchanged. Pointer/keyboard selection, cancellation/focus return, signed broker readback and both themes at wide/narrow enlarged-text sizes pass. All eight new rendered warnings were inspected.The existing AlertDialog, compact Dialog, Select, channel-details save/readback and signed member-administration owner remain in use. Warning copy adds no query or membership write. Only a recovered no-role Solo invitation with an already-joined target requests fresh role verification. It never automatically promotes that person or replaces an uncertain command. A verified Guest outcome uses the existing remove-and-invite-again workflow; a verified superseding conversion edit retires local orchestration without overwriting the edit or unfiling.
Browser checks and screenshots use the real built frontend and production browser broker with disposable modeled relay data. Changed warnings and recovery behavior still need human retest. Native/live-relay recovery remains unverified; the previous human walkthrough was at
c96493853. The acceptance marker remains absent.Screenshots / demos
The two retained-access warning rows below show the checked tree at
f51d51ca8; those UI files are unchanged in590f4ee29. Earlier disclosure and conversion captures show8af2cd287. Unchanged sharing, picker and visitor views retain their earlier captures. All use disposable modeled relay data. Description captures use 1440px/100% text; narrow enlarged-text layouts remain covered by the browser checks. The enlarged-text picker uses its existing scrollport.Dark · 1440px
Light · 1440px
General access and Canvas disclosure · 1440px
Conversion access and existing-public visitor
Conversion access at
8af2cd287, with View only preselected. 1440px/100% text.Conditional Solo access confirmations
Private chat → View only conversion disclosure · 1440px