gabriel / muse public
Closed #88 Bug enhancement
filed by aaronrene human · 105 days ago

platform: collaborator accepted_at null — no accept UI/API, write guards 403

0 Anchors
— Blast radius
— Churn 30d
0 Proposals

platform: collaborator invite has no accept flow — accepted_at stays null, guards 403

Reported: 2026-07-10 (VID-1 MP review + issue assign)

Symptom

aaronrene is listed as write collaborator on gabriel/muse (invited by gabriel), but:

  • No MuseHub UI or API to accept the invitation.
  • accepted_at stays null on the invite row.
  • Guards require accepted_at IS NOT NULL for:
    • issue assign (self-assign and assign reviewer)
    • push / MP reviewer request
    • other write-collaborator actions

Result: HTTP 403 — e.g. "Only the repo owner or a write/admin collaborator may perform this action."

Impact

  • VID-1 MP opened (task/video-timeline-vid1 → dev) — cannot request gabriel as reviewer via CLI.
  • Issue #86 filed — cannot self-assign.

Local build is unblocked; MP review requires gabriel merge from his side or accepted_at backfill.

Request

Either:

  1. Backfill accepted_at on collaborator row for aaronrene on gabriel/muse, or
  2. Point to the accept flow if it exists and was missed, or
  3. Ship accept UI/API on MuseHub.
  • VID-1 staging issue: #86
  • VID-1 MP: sha256:4950076ba4bc98f12b488f64750dd5bbd96b066d8513eebb9851bebdf17a9da3
◎ Activity1
●
aaronrene opened this issue 105 days ago
○
gabriel 2 days ago

Already fixed — this is the same incident as musehub#193 ("Critical: no accept-invitation mechanism — accepted_at gate from #131 permanently locks out all invited collaborators"), filed by the same reporter (aaronrene) two months after this ticket, and already closed.

Same root cause, confirmed

#131 (security/131-wire-write-authz, merged 2026-09-09) added an accepted_at IS NOT NULL gate on all non-owner collaborator writes — correct in intent, but invite_collaborator only ever wrote invited_at, never accepted_at, and nothing in MuseHub could set it: no accept route, no MCP tool, no CLI verb. Every invited collaborator (including aaronrene, on both gabriel/muse and gabriel/musehub) was permanently locked out of writes with no path to ever transition to "accepted" — exactly this ticket's symptom.

The fix (musehub#193, 2026-09-11)

Shipped all three things this ticket's "Request" section asked for in option 3:

  • muse hub collaborator accept CLI verb (self-service, idempotent — confirmed present: muse hub collaborator accept --json)
  • Corresponding REST route
  • Corresponding MCP tool

Scoped to the authenticated identity matching the invited handle, so an identity can't accept someone else's invitation.

Verified just now

muse hub collaborator list --hub https://staging.musehub.ai --json
→ {"handle": "aaronrene", "permission": "write", "invitedBy": "gabriel", "accepted": true}

aaronrene's invite on gabriel/muse shows accepted: true — already accepted via the shipped mechanism. Options 1 (manual backfill) and 2 (point to an existing flow) from this ticket's "Request" are both moot now that option 3 actually shipped and was used.

No code changes needed here. Closing as a duplicate, resolved by musehub#193.

✓
closed this issue 2 days ago