{"ok":true,"version":"agent-idea-board.v1","generatedAt":"2026-05-30T06:51:53.750Z","surface":{"id":"idea-board","artistId":"laurel","safeForAgent":true,"browserAutomationRequired":false,"currentMode":"read-manifest-with-write-contracts","relatedIssues":[599,602,608,1125,1897],"mcpResource":"fanful://agent/idea-board/manifest","mcpTool":"fanful_member_idea_board_read"},"principal":{"source":"guest","role":"guest","signedIn":false,"displayName":"Guest listener","email":null,"emailVerified":null,"adminRole":null,"capabilities":{"readPublicIdeaBoard":true,"readMemberIdeaState":false,"submitIdea":false,"voteOnIdea":false,"reviewIdeas":false,"moderateIdeas":false,"manageIdeaBoardSettings":false}},"ideaBoard":{"settings":{"artistId":"laurel","title":"What should Laurel build next?","intro":"Propose and upvote ideas for Laurel's music site and the reusable Fanful platform.","postingPolicy":"verified_listener","votingPolicy":"verified_listener","submissionsOpen":true,"votingOpen":true,"updatedAt":null},"stats":{"totalIdeas":0,"visibleIdeas":0,"totalVotes":0},"moderation":{"contract":"idea-board-moderation.v1","operations":{"idea.report.create":{"state":"forbidden","reason":"verified_session_required","issue":1894,"requires":["signed_in","email_verified"]},"idea.duplicate.suggest":{"state":"forbidden","reason":"verified_session_required","issue":1894,"requires":["signed_in","email_verified"]},"idea.moderation.admin.resolve":{"state":"forbidden","reason":"artist_admin_required","issue":1894,"requires":["artist_admin"]},"idea.moderation.agent.write":{"state":"forbidden","reason":"artist_admin_required","issue":1897,"requires":["artist_admin","confirmed_agent_write_envelope"]}}},"viewer":{"signedIn":false,"emailVerified":false,"canPost":false,"canVote":false,"displayName":null,"rawIdentifiersRedacted":true},"ideas":[]},"workflowTriggers":{"memberIdeaSubmitted":{"type":"member.idea.submitted","version":"agent-workflow-trigger.member-idea.v1","status":"manifest-ready","delivery":"runtime-enabled-for-member-idea-submitted","summary":"Visible member idea submissions have deterministic signed trigger records and runtime webhook fan-out for active member.idea.submitted subscriptions. Other workflow-trigger families remain manual-test-only or manifest-ready.","recentVisibleSubmissions":[],"idempotency":"Event id, delivery id, and idempotency key are deterministic from the public idea id, so duplicate reads/retries collapse to the same keys.","boundaries":["Only visible ideas are eligible for member.idea.submitted trigger status.","Guest and listener clients never receive raw user ids, voter ids, reviewer ids, hidden ideas, or private admin notes.","Triggers may prepare review queues or summaries, but must not auto-post, hide, feature, or change status without a confirmed action contract."]}},"operations":[{"id":"member.idea-board.read","toolName":"member_idea_board_read","status":"ready","enabled":true,"summary":"Read the agent-safe member idea board, including public ideas, vote counts, viewer vote state when signed in, and admin-only review fields when authorized.","endpoint":{"href":"https://docs.fanful.net/api/agent/idea-board","method":"GET","auth":"optional-session","description":"Read the sanitized idea-board agent manifest."},"confirmation":{"required":false,"kind":"none","reason":null},"audit":{"required":false,"currentRecord":null,"requiredBeforeExecutable":null,"attribution":"Read-only idea-board state. Guest/listener reads redact raw user ids, voter ids, reviewer ids, and private admin notes."},"idempotency":{"requiredForWrites":false,"keyScope":"not applicable"},"input":{"limit":{"type":"integer","required":false,"min":1,"max":200},"useAdminCredential":{"type":"boolean","required":false,"description":"MCP clients can request env-gated admin credentials; secrets are never accepted as tool input."}},"boundaries":["Guest and listener reads only include visible ideas.","Admin reads can include hidden ideas and review fields after first-party admin or approved automation authorization."]},{"id":"member.idea-board.submit","toolName":"member_idea_board_submit","status":"ready","enabled":false,"summary":"Submit a new public idea as the authenticated listener after exact public-content confirmation, idempotency, and audit attribution.","endpoint":{"href":"https://docs.fanful.net/api/agent/idea-board","method":"POST","auth":"confirmed-listener","description":"Confirmed agent wrapper for member idea submission."},"confirmation":{"required":true,"kind":"public-content","reason":"Ideas are visible to the artist and other members."},"audit":{"required":true,"currentRecord":"idea_posts + analytics_events.idea_submitted + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute submissions to the signed-in listener or scoped listener grant plus the calling agent client, idempotency key, and audit correlation id."},"idempotency":{"requiredForWrites":true,"keyScope":"listener-id + normalized title/body content hash"},"input":{"action":{"type":"literal","value":"confirm_member_idea_submit","required":true},"title":{"type":"string","required":true,"minLength":6,"maxLength":120},"body":{"type":"string","required":true,"minLength":12,"maxLength":1200},"envelope":{"type":"agent-write-envelope.v1","required":true,"contractId":"member.ideas.submit-and-vote"}},"boundaries":["Anonymous submissions are rejected.","Existing abuse controls allow at most four listener submissions in a ten-minute window.","Do not post model-generated public text without showing the exact title/body to the listener first."]},{"id":"member.idea-board.vote.toggle","toolName":"member_idea_board_vote_toggle","status":"ready","enabled":false,"summary":"Toggle or set the authenticated listener's vote on one visible idea after confirming the target idea and desired state.","endpoint":{"href":"https://docs.fanful.net/api/agent/idea-board","method":"POST","auth":"confirmed-listener","description":"Confirmed agent wrapper for member idea votes."},"confirmation":{"required":true,"kind":"vote","reason":"Votes affect public prioritization signals."},"audit":{"required":true,"currentRecord":"idea_votes + analytics_events.idea_upvoted/idea_unvoted + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute vote changes to the signed-in listener or scoped listener grant plus the calling agent client, idempotency key, and audit correlation id."},"idempotency":{"requiredForWrites":true,"keyScope":"listener-id + idea-id + desired selected state"},"input":{"action":{"type":"literal","value":"confirm_member_idea_vote_toggle","required":true},"ideaId":{"type":"string","required":true},"desiredSelected":{"type":"boolean","required":false},"envelope":{"type":"agent-write-envelope.v1","required":true,"contractId":"member.ideas.submit-and-vote"}},"boundaries":["Votes only apply to visible ideas.","Agents should confirm the idea title/status before changing a vote.","When desiredSelected already matches the current vote state, the wrapper records idempotency and returns a no-op result without toggling."]},{"id":"creator.idea-board.moderation.manage","toolName":"creator_idea_board_moderation_manage","status":"ready","enabled":false,"summary":"Accept duplicate suggestions, archive or restore an idea, and add private moderation notes through confirmed artist-admin or approved automation writes.","endpoint":{"href":"https://docs.fanful.net/api/agent/idea-board","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed agent wrapper for idea-board moderation actions."},"confirmation":{"required":true,"kind":"moderation","reason":"Moderation actions change public idea visibility/resolution state or add private admin context."},"audit":{"required":true,"currentRecord":"idea_moderation_events + idea_moderation_reports/idea_duplicate_links/idea_private_admin_notes + agent_write_idempotency_keys","requiredBeforeExecutable":null,"attribution":"Attribute moderation writes to the artist admin or approved automation identity plus the calling agent client, idempotency key, audit correlation id, and exact confirmation evidence."},"idempotency":{"requiredForWrites":true,"keyScope":"admin-or-automation + idea-id + moderation action + observed updated_at"},"input":{"action":{"type":"enum","values":["confirm_creator_idea_duplicate_accept","confirm_creator_idea_archive","confirm_creator_idea_restore","confirm_creator_idea_private_note_add"],"required":true},"ideaId":{"type":"string","required":true},"targetIdeaId":{"type":"string","required":false,"description":"Required when accepting a duplicate."},"observedUpdatedAt":{"type":"string","required":false,"description":"Required for duplicate, archive, and restore actions so stale public-state changes are rejected."},"archivedReason":{"type":"enum","values":["abuse","spam","duplicate","stale","off_topic","other"],"required":false},"publicSummary":{"type":"string","required":false,"maxLength":220},"privateNote":{"type":"string","required":false,"maxLength":800},"body":{"type":"string","required":false,"maxLength":800,"description":"Private note body for confirm_creator_idea_private_note_add."},"envelope":{"type":"agent-write-envelope.v1","required":true,"contractId":"creator.ideas.moderate"}},"boundaries":["Guest and listener manifests never include open reports, private notes, or reviewer identifiers.","Duplicate/archive/restore actions require observedUpdatedAt and reject stale state.","Agents must confirm the exact idea title and public consequence before mutating moderation state."]},{"id":"creator.idea-board.review","toolName":"creator_idea_board_review","status":"contract-only","enabled":false,"summary":"Change idea status, visibility, featured state, or admin note as artist admin or approved automation.","endpoint":{"href":"https://docs.fanful.net/api/admin/ideas","method":"PATCH","auth":"artist-admin-or-approved-automation","description":"Existing first-party admin idea moderation route."},"confirmation":{"required":true,"kind":"moderation","reason":"Status, visibility, and featured changes affect the public roadmap signal."},"audit":{"required":true,"currentRecord":"idea_posts.reviewedAt/reviewedBy/adminNote + analytics_events for admin creates","requiredBeforeExecutable":"Agent client attribution and explicit before/after review summary on admin idea-board writes.","attribution":"Attribute review changes to the artist admin or approved automation identity plus the calling agent client."},"idempotency":{"requiredForWrites":true,"keyScope":"admin-or-automation + idea-id + requested review patch"},"input":{"action":{"type":"literal","value":"update_idea","required":true},"id":{"type":"string","required":true},"status":{"type":"enum","values":["under_review","planned","in_progress","shipped","closed"],"required":false},"visibility":{"type":"enum","values":["visible","hidden"],"required":false},"featured":{"type":"boolean","required":false},"adminNote":{"type":"string","required":false,"maxLength":500}},"boundaries":["Never expose private admin notes to guest/listener callers.","Agents should repeat the idea title and requested before/after change before asking the creator to confirm."]},{"id":"creator.idea-board.settings.update","toolName":"creator_idea_board_settings_update","status":"contract-only","enabled":false,"summary":"Update board title, intro, posting policy, voting policy, or open/closed switches for artist admin.","endpoint":{"href":"https://docs.fanful.net/api/admin/ideas","method":"PATCH","auth":"artist-admin-or-approved-automation","description":"Existing first-party admin idea-board settings route."},"confirmation":{"required":true,"kind":"settings","reason":"Board settings change who can post or vote."},"audit":{"required":true,"currentRecord":"idea_board_settings","requiredBeforeExecutable":"Agent client attribution and before/after settings diff on admin settings writes.","attribution":"Attribute settings changes to the artist admin or approved automation identity plus the calling agent client."},"idempotency":{"requiredForWrites":true,"keyScope":"admin-or-automation + normalized settings patch"},"input":{"action":{"type":"literal","value":"update_settings","required":true},"title":{"type":"string","required":true,"maxLength":120},"intro":{"type":"string","required":true,"maxLength":420},"postingPolicy":{"type":"enum","values":["verified_listener","active_member","tier_at_least:supporter","tier_at_least:patron","tier_in:patron,circle","admin_only"],"required":true},"votingPolicy":{"type":"enum","values":["verified_listener","active_member","tier_at_least:supporter","tier_at_least:patron","tier_in:patron,circle","admin_only"],"required":true},"submissionsOpen":{"type":"boolean","required":true},"votingOpen":{"type":"boolean","required":true}},"boundaries":["Changing posting or voting policy should be treated as a creator-visible setting change, not a silent automation.","Do not let agents infer policy from prose; send the exact enum values."]}],"endpoints":{"agentIdeaBoard":{"href":"https://docs.fanful.net/api/agent/idea-board","method":"GET","auth":"optional-session","description":"Read the agent-safe idea board."},"publicIdeas":{"href":"https://docs.fanful.net/api/ideas","method":"GET","auth":"guest","description":"Existing public idea-board snapshot route."},"memberIdeas":{"href":"https://docs.fanful.net/api/ideas","method":"POST","auth":"signed-in-listener","description":"Existing member idea submission route."},"memberIdeaVotes":{"href":"https://docs.fanful.net/api/ideas/votes","method":"POST","auth":"signed-in-listener","description":"Existing member idea vote route."},"memberIdeaReports":{"href":"https://docs.fanful.net/api/ideas/reports","method":"POST","auth":"signed-in-listener","description":"Existing member idea report route."},"agentIdeaBoardWrites":{"href":"https://docs.fanful.net/api/agent/idea-board","method":"POST","auth":"artist-admin-or-approved-automation","description":"Confirmed agent wrapper for member submit/vote and creator moderation actions."},"adminIdeas":{"href":"https://docs.fanful.net/api/admin/ideas","method":"PATCH","auth":"artist-admin-or-approved-automation","description":"Existing admin idea-board moderation/settings route."},"adminIdeaModeration":{"href":"https://docs.fanful.net/api/admin/ideas/moderation","method":"POST","auth":"artist-admin-or-approved-automation","description":"Existing admin route for resolving idea-board reports, duplicate links, archives, restores, and private notes."}},"policy":{"readPolicy":"Guest reads expose visible ideas and public board settings. Signed-in listeners add viewer vote/ownership state. Admin or approved automation reads can include hidden ideas and review fields.","writeConfirmation":"Require explicit confirmation before submitting public idea text, changing a vote, resolving duplicates, archiving/restoring ideas, adding private admin notes, hiding/featuring an idea, changing status, or changing board posting/voting policy.","audit":"Confirmed member submit/vote writes record idea rows or votes, analytics events, agent client attribution, confirmation evidence, audit correlation, and idempotency keys. Confirmed moderation writes record idea moderation events and idempotency keys. Broader admin review/settings writes still need dedicated confirmed wrappers before MCP/CLI/ChatGPT execution.","rateLimits":{"memberSubmissions":"Existing first-party route allows at most four ideas per verified listener in ten minutes.","memberVotes":"Existing first-party route has one vote row per listener and idea.","adminWrites":"Admin routes require first-party admin session or configured automation token."},"secretHandling":"Do not expose raw Better Auth user ids, voter ids, reviewer ids, open reports, hidden idea rows, or private admin notes to guest/listener agents."},"serverGaps":[{"id":"idea-board.creator-write-envelope","relatedIssue":599,"status":"planned","note":"Member submit/vote and idea moderation writes now consume the shared envelope. Creator review/settings tools still need confirmed wrappers with before/after diffs, client attribution, audit correlation, and idempotency."},{"id":"idea-board.agent-client-auth","relatedIssue":673,"status":"partially-shipped","note":"Scoped listener:ideas:write grants can execute member submit/vote wrappers. Creator-admin delegated review/settings writes remain blocked until dedicated scoped grant policies and confirmed wrappers ship."}],"redactedFields":["idea.createdByUserId","ideaVotes.userId","idea.reviewedBy","idea.adminNote","idea.adminModeration.openReports","idea.adminModeration.privateNotes","betterAuthUserId","raw voter ids"]}