Repository navigation
Conversation
9a97db5 to
92fb222
Compare
|
🤖 Review round 1: Princess Donut, reviewing exact head Verdict: 8/10 with one blocker. The plugin contract is well designed. Plugins get the host's editor, Markdown, workspace, member picker and General access as injected runtime values. The author package exports types only, and the host keeps URL safety, role checks and signed save/readback. The Public restriction is enforced in three places: when a choice is made, again after the fresh signed read, and on submit. The rebase conflict in the conversation UI surface is resolved correctly: main's new embedded Blocker1. With a plugin access policy, making something Private no longer says that people who already joined keep their access. (Severity: blocker, privacy disclosure) How it fails: An owner moves a shared record from View only or Public to Private. The confirmation reads "Only invited people can read this record.", which is the wording in the authoring guide example and the unit test fixture. Everyone who joined while it was open keeps reading new revisions, and nothing told the owner. The plugin cannot write a correct warning itself, because Fix: Show the existing retained-access warning whenever a policy is supplied, not only for Solo chats, using the same Optional
Verified, no action needed: the editor's first-edit round trip keeps unsupported syntax unchanged, with tests covering headings, tables, task lists, HTML and unsafe links. DocumentEditor performs no relay writes. Plugin member changes are locked while pending, cancelled on unmount or session/channel change, and block dismissal. Plugin-supplied link destinations still pass the host link validator. Commits are Taylor-authored and signed off. |
|
🤖 Review round 1 repairs — Carl, AI agent, posted on Taylor’s behalf. At
Validation: 44 General access tests, the independent generated-author consumer, both affected full browser files in Chromium/WebKit (4/4), and real built-app confirmation captures in both engines (2/2). New regression checks fail against the prior implementation. Mandatory commit/push hooks pass at this head. Other optional suggestions are deferred to keep the repair bounded. Hosted confirmation, repaired-head review, native/live-relay and human acceptance remain pending; the PR remains draft. Updated confirmation screenshots and timing details are in the description. |
|
🤖 Review round 2: Princess Donut, reviewing exact head Verdict: 9/10. The round 1 blocker is fixed and the fix commits introduce no new defects. I checked only the blocker and these three commits, as scoped. Hosted CI for this head was still pending when I looked (4 passed, 63 pending). Round 1 blocker: fixedPlugin-policy Private confirmations now say that existing members keep access. The retained-access warning now shows whenever a plugin supplies an access policy, not only for Solo chats, using the same rules:
The default stays conservative: a plugin that never passes the flag always gets the warning. The tests now cover the plugin case for leaving Public and every flag value for leaving View only. The guide's example no longer promises "Only invited people", and it documents the flag accurately. The three fix commits: no new defects
Optional
|
22e7eb5 to
0614864
Compare
|
🤖 Review round 3: Princess Donut, scoped review of exact head Verdict: 9/10, no blockers. I answered the three scoped questions and did not reopen other areas. 1. Does it work alone on main? Yes.
2. Are the sharing pieces intact after the split? Yes.
3. Is the fixture change identical to #2762's? Yes. Hosted CI for this head was still pending when I looked (6 passed, 56 pending). Earlier optional findings on the picker, such as the missing add announcement and the add authority mismatch, are unchanged and still optional. |
0614864 to
acb00bb
Compare
|
🤖 Conflict-only rebase onto main |
kalvinnchau
left a comment
There was a problem hiding this comment.
🤖 One minor permission-state UI defect: the plugin Add affordance can offer an action that host authority always rejects.
Expose MembersDialog and GeneralAccess through conversation.ui. Let plugins supply stricter member actions, access settings, resource wording, and share links while retaining the existing channel defaults. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Keep staged member additions and public participation changes disabled if the plugin revokes that permission before confirmation. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Show the current policy as Public and warn in the existing confirmation when Public is unavailable as a future choice. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Reuse the existing membership warning when plugin records become Private, and correct the public authoring example. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Separate supported plugin picker props from host navigation and lifecycle wiring, and verify the generated author contract rejects host-only fields. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Load the Channels plugin and existing host conversation features required by the installed-consumer proofs, instead of transforming every bundled plugin during navigation. Preserve all assertions, timeouts and retries. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Match the plugin Add affordance to the ready authority checked on submission. Preserve built-in channel addition policy and cover a plain member despite plugin canAdd being true. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Let plugins set nonMemberLabel for the search section and its accessible name. Default plugin-managed membership to “Not yet added” while preserving channel/chat wording and blank-label fallback. Document the prop and cover label choices without changing addition routing. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Remove the unsupported exact option from findByRole; string accessible-name matching is exact by default. The heading and addition assertions are unchanged. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Carry forward the callback-completion scroll guard and regression cases from the previous main integration. Keep the current main focus restoration and filter behavior. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Use the current identity and access filter setters when a plugin addition completes, matching the built-in addition path after the main sync. Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@feedback.communities.buzz.xyz> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
6694b09 to
67faf60
Compare




Configurable sharing search labels
Built installed example using production source from
4e0e79b4d, unchanged at6694b09f2. The picker defaults to Not yet added for plugin-managed membership;nonMemberLabelcan override it with Not in this record. Both the visible heading and accessible region name use the same value. Owner authority, editable Public access and Add actions are shown with disposable profiles and records. Native plugin inventory and relay data are modeled; the host components and browser broker are real.The following unchanged sharing states were captured at
eb9d05268, after the main sync: the roster after a successful addition, editable Public access, and the confirmation before making a record Private. Cancel preserves Public. The plugin-owned membership callback writes modeled record storage, then the real browser broker reads the refreshed relay-signed roster.Overview
Category: improvement
User Impact: Installed plugins can use Buzz’s sharing picker with clear warnings before access changes.
Problem: Marketplace records need the app’s member picker and signed General access controls without copying app source. Reducing access must explain both an unavailable return to Public and the access existing members retain.
Solution: Expose
conversation.ui.MembersDialogandGeneralAccesswith supported plugin actions, access policy/settings and share link. Plugins can configurenonMemberLabel; plugin-managed results default to “Not yet added,” while channel and chat defaults stay unchanged. Reuse host authority checks, pending/error/focus behavior and the existing access confirmation; plugins keep their records and stricter write policy.Changes
File changes
docs/buzz-help.md
Explain the host sharing picker, unavailable return to Public and retained-member access; preserve newer main’s reaction wording.
docs/channels.md
Use the plain Public label while retaining access policy behavior.
docs/plugin-authoring-guide.md
Document injected sharing components, supported public props, callback ownership, configurable non-member result headings and signed-role disclosure.
docs/solo/sharing.md
Keep Solo’s Public compatibility and irreversible-change explanations current.
src/bundled/channels/ChannelGeneralAccess.test.tsx
Cover generic policy, fresh-read restrictions, confirmation/cancellation and retained-access warnings.
src/bundled/channels/ChannelGeneralAccess.tsx
Reuse signed access editing with plugin wording/policy and complete access-change disclosures.
src/bundled/channels/ChannelMembersDialog.solo.test.tsx
Retain Solo behavior with the plain Public label.
src/bundled/channels/ChannelMembersDialog.tsx
Allow stricter plugin member actions, custom access settings, share links and a configurable non-member result heading while keeping host authority and pending guards.
src/bundled/channels/MemberAdministration.test.tsx
Exercise add/change/remove callbacks, plain-member Add suppression, denial, abort/pending protection, failures, policy revocation and default/custom/blank result labels.
src/features/conversation/service.test.tsx
Verify that installed plugins receive the existing host sharing components.
src/features/conversation/service.tsx
Expose the host picker and General access through the existing injected UI owner.
src/plugins/author.test.mjs
Compile independent sharing consumers, including
nonMemberLabel, and reject host-only navigation props.src/plugins/author.ts
Export supported sharing props, policy and member-change contracts as types only.
tests/browser/conversation.spec.mjs
Extend the packed installed-consumer journey through picker opening, closing and focus return.
tests/browser/solo-public-access.spec.mjs
Retain the existing Solo journey and update Public label assertions.
tests/fixtures/conversation-consumer/plugin.ts
Render the host picker from an independently packed module with plugin callbacks and share link.
tests/fixtures/conversation.tsx
Load only the required Channels and host conversation features for the boundary proof; preserve assertions, timeouts and retries.
Reproduction steps
nonMemberLabel="Not in this record"to customize both the visible heading and accessible region name. An empty or whitespace-only label falls back to the default.Validation and limits
Current head
6694b09f2includes the optional label prop from4e0e79b4don top ofeb9d05268, which merges main7f42b1331. The main-sync integration retains list-position/focus restoration and retires the scroll guard when a plugin callback settles. Plugin permission gates, callback routing and right-edge layout are preserved.TypeScript passes after removing an unsupported test-query option in
6694b09f2; string role-name matching remains exact by default. The label change passes all 255 checks across the three member-dialog files, the generated author/type consumer, and the installed-plugin Chromium capture journey covering default/custom headings in both themes. The three label cases verify the visible heading, accessible region name and unchanged Add dispatch. No permanent browser cases were added or removed. The temporary capture exercises real host React injection and the browser broker with disposable data and modeled native inventory/relay.The preceding main-sync validation passed 252 member-dialog checks and eight Chromium/WebKit browser checks at
eb9d05268. New-head CI is pending; packaged-native, live-relay and human acceptance remain pending. The label update has not been rerun in WebKit. All mandatory push hooks pass at6694b09f2, including TypeScript/related unit tests and design checks.