fix: restrict membership management to org publishers#2285
Conversation
|
@vyctorbrzezowski is attempting to deploy a commit to the Amantus Machina Team on Vercel. A member of the Team first needs to authorize it. |
|
Codex review: found issues before merge. Reviewed May 27, 2026, 4:49 PM ET / 20:49 UTC. Summary Reproducibility: yes. from source inspection: current main still checks publisherMembers for personal-publisher owner scopes in helpers such as assertCanManageOwnedResource and package owner access. I did not run a live exploit locally because this is a read-only review, but the PR body includes live Convex denial proof for representative stale-membership paths. Review metrics: 2 noteworthy metrics.
Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Risk before merge
Maintainer options:
Next step before merge Security Review findings
Review detailsBest possible solution: Refresh the branch against current main, remove release-owned changelog churn, keep the linked-user-only personal publisher boundary, and land it with the existing live proof plus targeted regression coverage. Do we have a high-confidence way to reproduce the issue? Yes, from source inspection: current main still checks publisherMembers for personal-publisher owner scopes in helpers such as assertCanManageOwnedResource and package owner access. I did not run a live exploit locally because this is a read-only review, but the PR body includes live Convex denial proof for representative stale-membership paths. Is this the best way to solve the issue? Yes, the linked-user-only helper is the right security shape for personal publishers, with org publishers retaining membership roles. The merge-safe version should drop the changelog edit and be rebased so it composes with the current moderated file/tag guards. Full review comments:
Overall correctness: patch is correct AGENTS.md: found and applied where relevant. Codex review notes: model gpt-5.5, reasoning high; reviewed against 97023d3123f4. Label changesLabel changes:
Label justifications:
Evidence reviewedAcceptance criteria:
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
7d3ffa9 to
33ffa7f
Compare
33ffa7f to
5f97962
Compare
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
5f97962 to
8f08815
Compare
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
|
ClawSweeper PR egg ✨ Hatched: 🥚 common Velvet Lint Imp Hatch commandComment Hatchability rules:
Rarity: 🥚 common. What is this egg doing here?
|
16ece38 to
6fd4de1
Compare
# Conflicts: # CHANGELOG.md
Summary
Makes personal publishers behave like account aliases, not shared teams. Old membership rows on someone else's personal publisher no longer let another user publish, transfer, or manage their resources.
What changed
linkedUserId === actorUserId.Public behavior
Publishing, transferring, or managing through a personal publisher now requires that the personal publisher is linked to the acting user. A stale membership row cannot authorize a different user's personal publisher.
Org publisher membership remains valid for org-owned publishing.
Behavior proof
Live Convex runtime proof for the remaining stale personal-membership paths ClawSweeper called out:
This proof creates a stale personal-publisher membership for a non-linked actor and verifies that it cannot authorize direct skill transfer, package appeal submission, or owner-only package moderation status access.
Focused regression suite:
Validation
Current GitHub CI for this head also has
unit,packages,types-build,e2e-http,playwright-smoke, andplaywright-local-authpassing. Thestaticjob currently stops atbun auditon the existing transitivewsadvisoryGHSA-58qx-3vcg-4xpx.