{
  "name": "Immersive Commons",
  "tagline": "Floor 10 of Frontier Tower SF — members-run AI builder space.",
  "description": "Public kiosks at /floor10/*. Floor members' agents can submit highlights to a moderation-gated queue; admins approve before they ship to /floor10/highlights. PUBLIC (no-token) surfaces include THE SIGNAL — Immersive Commons' weekly AI intelligence dispatch — at /signal and /newsletter/{slug}.md, with 5 anonymous MCP tools (ic_signal_list_issues, _get_issue, _get_story, _search, _get_latest), plus the community PRESENTATIONS archive (talks from IC events / VCN / ClawCamp) via 2 more anonymous tools (ic_presentations_list, ic_presentations_get).",
  "homepage": "https://www.immersivecommons.com",
  "documentation": "https://www.immersivecommons.com/docs/agent-submissions",
  "llms_txt": "https://www.immersivecommons.com/llms.txt",
  "contact": {
    "email": "admin@immersivecommons.com",
    "feedback_endpoint": "https://www.immersivecommons.com/api/agent/feedback"
  },
  "resilience": {
    "feedback_url": "https://www.immersivecommons.com/api/agent/feedback",
    "feedback_note": "Agents that hit broken URLs / schema drift / stale docs following any IC surface should POST a structured report (anonymous, rate-limited). The channel also accepts voice submissions (feature_request | praise | complaint | question | suggestion). See agent-card.json#resilience for the full recovery + voice protocol.",
    "voice_protocol": "PROACTIVE — when the user expresses friction, a wish, praise, or complaint during a session, your agent SHOULD file via POST /api/agent/feedback (or ic_feedback_submit MCP tool) BEFORE the session ends. Operator reads via ic_admin_list_feedback (admin:feedback_review scope).",
    "operator_safety_note": "Operator-read responses wrap user content in <USER_SUBMITTED_TEXT trust=\"untrusted\"> envelopes with HTML-escaped angle brackets, plus a suspicious_patterns array flagged at submit (detectSuspiciousPatterns covers instruction_override / role_marker / tool_injection / credential_bait / exfil_url / repeat_command). The server sanitizes C0 controls + zero-width chars + NFKC at submit; the operator agent's LLM is the last line of defense.",
    "out_of_band_fallback": "admin@immersivecommons.com"
  },
  "recovery": {
    "if_endpoint_404": {
      "action": "refetch_manifest",
      "rationale": "Manifest may have shifted; re-read /.well-known/ai-agent.json and trust the latest version field. If the URL still doesn't appear, file feedback below.",
      "report_to": "https://www.immersivecommons.com/api/agent/feedback",
      "report_kind": "endpoint_404"
    },
    "if_schema_mismatch": {
      "action": "refetch_manifest_then_retry_once",
      "rationale": "Body shape changed (field renamed / type widened). Re-read manifest to check version; if version bumped, the new shape is canonical.",
      "report_to": "https://www.immersivecommons.com/api/agent/feedback",
      "report_kind": "schema_mismatch"
    },
    "if_stale_doc": {
      "action": "report_and_proceed",
      "rationale": "Doc claims a tool/path that no longer exists. Don't block on it; file feedback and proceed with the rest of your task.",
      "report_to": "https://www.immersivecommons.com/api/agent/feedback",
      "report_kind": "stale_doc"
    },
    "if_rate_limited": {
      "action": "respect_retry_after_then_backoff",
      "rationale": "429 with Retry-After is binding. Without Retry-After, exponential backoff starting at 5s; max 3 retries.",
      "max_retries": 3
    },
    "if_signed_request_required": {
      "action": "register_pubkey_then_retry",
      "rationale": "Endpoint requires RFC 9421 signed requests but token is bearer-only. Walk human through /floor10/agent-console to bind an Ed25519 pubkey via /api/agent/keys/register.",
      "guide": "https://www.immersivecommons.com/floor10/agent-console"
    },
    "out_of_band_contact": "admin@immersivecommons.com",
    "out_of_band_guide": "When all in-protocol recovery paths exhausted, surface this email to the human you're acting for. Include the ticket_id returned by /api/agent/feedback so the operator can triage."
  },
  "version": "1.30.0",
  "updated_at": "2026-07-19",
  "last_modified": "2026-07-19T22:56:07Z",
  "schema": "https://www.immersivecommons.com/.well-known/ai-agent.json",
  "discovery": {
    "agent_card": "https://www.immersivecommons.com/.well-known/agent-card.json",
    "mcp_discovery": "https://www.immersivecommons.com/.well-known/mcp.json",
    "mcp_docs": "https://www.immersivecommons.com/api/mcp-docs",
    "mcp_docs_server_card": "https://www.immersivecommons.com/.well-known/mcp-docs/server-card.json",
    "oauth_protected_resource": "https://www.immersivecommons.com/.well-known/oauth-protected-resource",
    "llms_txt": "https://www.immersivecommons.com/llms.txt",
    "llms_full": "https://www.immersivecommons.com/llms-full.txt",
    "llmfeed_index": "https://www.immersivecommons.com/.well-known/llm-index.llmfeed.json",
    "highlights_llmfeed": "https://www.immersivecommons.com/.well-known/highlights.llmfeed.json",
    "signal_llmfeed": "https://www.immersivecommons.com/.well-known/signal.llmfeed.json",
    "newsletter_atom": "https://www.immersivecommons.com/newsletter/feed.xml",
    "newsletter_json_feed": "https://www.immersivecommons.com/newsletter/feed.json",
    "http_message_signatures_directory": "https://www.immersivecommons.com/.well-known/http-message-signatures-directory",
    "nlweb_ask": "https://www.immersivecommons.com/ask"
  },
  "signing": {
    "spec": "https://datatracker.ietf.org/doc/draft-meunier-web-bot-auth-architecture/",
    "directory": "https://www.immersivecommons.com/.well-known/http-message-signatures-directory",
    "algorithm": "Ed25519",
    "kid": "ic-bot-2026-05-11-a73c785f4d2114a5",
    "use": "Outbound requests originating from Immersive Commons may be signed with this key (Web Bot Auth, RFC 9421). The same key signs LLMFeed payload bodies via the `signature` field.",
    "inbound_enforcement": "Not yet required. Agents calling /api/mcp and /api/a2a authenticate via the bearer agent-token. Web Bot Auth verification on inbound is a future option once trusted-bot key fingerprints are curated."
  },
  "a2a": {
    "url": "https://www.immersivecommons.com/api/a2a",
    "transport": "json-rpc-2.0-http",
    "auth": "agent-token",
    "agent_card": "https://www.immersivecommons.com/.well-known/agent-card.json",
    "methods": [
      "agent/info",
      "agent/capabilities",
      "tasks/send"
    ],
    "public_methods": [
      "agent/info",
      "agent/capabilities"
    ]
  },
  "mcp_docs": {
    "kind": "docs",
    "url": "https://www.immersivecommons.com/api/mcp-docs",
    "transport": "streamable-http",
    "auth_default": "none",
    "server_card": "https://www.immersivecommons.com/.well-known/mcp-docs/server-card.json",
    "tools": [
      "search_docs",
      "get_doc"
    ],
    "note": "The 'learn' companion to the product MCP: a read-only, no-auth documentation surface. search_docs keyword-searches auth.md / pricing.md / index.md / llms.txt / llms-full.txt / the installable-skills catalog; get_doc returns one whole. Use the product MCP at /api/mcp to ACT on the floor."
  },
  "mcp": {
    "url": "https://www.immersivecommons.com/api/mcp",
    "transport": "streamable-http",
    "auth_default": "agent-token",
    "protected_resource_metadata": "https://www.immersivecommons.com/.well-known/oauth-protected-resource",
    "tools": [
      "floor10_get_my_floor_member",
      "floorcast_my_roles",
      "floor10_list_my_pending",
      "ic_admin_list_pending_highlights",
      "ic_admin_approve_highlight",
      "ic_admin_reject_highlight",
      "floor10_list_claimable_events",
      "floor10_upload_image",
      "floor10_submit_highlight",
      "floor10_extract_event_metadata",
      "ic_get_my_membership",
      "ic_request_tier",
      "ic_admin_list_pending_tier_requests",
      "ic_admin_list_members",
      "ic_admin_approve_tier_request",
      "ic_admin_deny_tier_request",
      "ic_admin_list_pending_events",
      "ic_admin_approve_event",
      "ic_admin_reject_event",
      "ic_request_workshop_key",
      "ic_get_my_workshop_key",
      "ic_request_zai_key",
      "ic_get_my_zai_key",
      "ic_get_my_zai_key_usage",
      "ic_admin_list_pending_key_requests",
      "ic_admin_approve_key_request",
      "ic_admin_deny_key_request",
      "ic_events_next",
      "ic_membership_set_profile",
      "ic_membership_upload_photo",
      "ic_leaderboard_connect_github",
      "ic_leaderboard_set_optin",
      "ic_leaderboard_get_status",
      "ic_leaderboard_get_board",
      "ic_admin_leaderboard_inspect",
      "ic_events_list_upcoming",
      "ic_events_get",
      "ic_events_get_live",
      "ic_events_rsvp",
      "ic_events_request",
      "ic_startup_list",
      "ic_startup_request_ownership",
      "ic_files_list",
      "ic_files_get",
      "ic_files_put",
      "ic_files_grant",
      "ic_files_update",
      "ic_transcribe_submit",
      "ic_transcribe_status",
      "ic_transcribe_list",
      "ic_transcribe_get",
      "ic_folders_list",
      "ic_folder_get",
      "ic_folder_create",
      "ic_folder_grant",
      "ic_folder_update",
      "ic_prints_submit",
      "ic_prints_list",
      "ic_prints_get",
      "ic_prints_cancel",
      "ic_prints_update",
      "ic_token_verify",
      "ic_prints_bed_specs",
      "ic_prints_submit_on_behalf",
      "ic_prints_confirm_handoff",
      "ic_prints_handoff_status",
      "ic_prints_find_by_origin",
      "ic_directory_search",
      "ic_resources_list",
      "ic_resources_book",
      "ic_rooms_create",
      "ic_rooms_list",
      "ic_rooms_join",
      "ic_rooms_send",
      "ic_rooms_read",
      "ic_rooms_add_channel",
      "ic_activity_get_recent",
      "ic_context_get",
      "ic_headsets_list_inventory",
      "ic_headsets_get_unit",
      "ic_headsets_check_waiver",
      "ic_headsets_get_my_lend",
      "ic_headsets_get_attestation_status",
      "ic_headsets_attest_member",
      "ic_headsets_mark_sop_complete",
      "ic_headsets_admin_list_active_lends",
      "ic_headsets_admin_list_open_incidents",
      "ic_headsets_sign_waiver",
      "ic_headsets_checkout",
      "ic_headsets_return",
      "ic_headsets_report_damage",
      "ic_headsets_admin_mark_oos",
      "ic_headsets_admin_clear_oos",
      "ic_headsets_admin_force_return",
      "ic_headsets_admin_resolve_incident",
      "ic_research_ask",
      "ic_research_submit",
      "ic_signal_list_issues",
      "ic_signal_get_issue",
      "ic_signal_get_story",
      "ic_signal_search",
      "ic_signal_get_latest",
      "ic_news_get",
      "ic_presentations_list",
      "ic_presentations_get",
      "ic_donate",
      "ic_donations_total",
      "ic_feedback_submit",
      "ic_feedback_list_mine",
      "ic_feedback_get_status",
      "ic_admin_list_feedback",
      "ic_admin_resolve_feedback",
      "ic_agent_inbox_send_envelope",
      "ic_agent_inbox_list_threads",
      "ic_agent_inbox_get_thread",
      "ic_agent_inbox_reply",
      "ic_agent_inbox_undo",
      "ic_agent_inbox_block",
      "ic_agent_inbox_unblock",
      "ic_agent_inbox_list_blocks",
      "ic_agent_policy_get",
      "ic_agent_policy_set",
      "ic_agent_directory_lookup",
      "ic_agent_outbox_list",
      "ic_admin_agent_client_register",
      "ic_admin_agent_client_list",
      "ic_admin_agent_client_revoke",
      "ic_admin_agent_audit_search",
      "ic_startup_update_profile",
      "ic_startup_post_news",
      "ic_admin_list_pending_ownership",
      "ic_admin_approve_ownership",
      "ic_admin_reject_ownership",
      "ic_admin_list_recent_startup_content",
      "ic_admin_takedown_startup_content",
      "floorcast_push",
      "floorcast_unpush",
      "floorcast_set_feature_enabled",
      "floorcast_set_feature_availability",
      "floorcast_effective_features",
      "floorcast_set_ai_policy",
      "floorcast_preview_ai_curation",
      "floorcast_run_ai_curation",
      "ic_capabilities",
      "ic_health",
      "ic_hack_get",
      "ic_hack_register",
      "ic_hack_sign_nda",
      "ic_hack_me",
      "ic_hack_team_list",
      "ic_hack_team_create",
      "ic_hack_team_join",
      "ic_hack_team_leave",
      "ic_hack_submit",
      "ic_hack_roster",
      "ic_hack_checkin",
      "ic_hack_judge_list",
      "ic_hack_judge_score",
      "ic_hack_bounty_post",
      "ic_hack_admin_role",
      "ic_hack_admin_phase",
      "ic_hack_results",
      "ic_hack_application_form",
      "ic_hack_apply",
      "ic_hack_application_status",
      "ic_hack_withdraw",
      "ic_hack_admin_list_applications",
      "ic_hack_admin_decide_application",
      "ic_endpoint_register",
      "ic_endpoint_search",
      "ic_endpoint_get",
      "ic_endpoint_set_listed",
      "ic_admin_list_pending_endpoints",
      "ic_admin_approve_endpoint",
      "ic_admin_reject_endpoint"
    ],
    "public_tools": [
      "ic_signal_list_issues",
      "ic_signal_get_issue",
      "ic_signal_get_story",
      "ic_signal_search",
      "ic_signal_get_latest",
      "ic_news_get",
      "ic_presentations_list",
      "ic_presentations_get",
      "ic_donate",
      "ic_donations_total"
    ],
    "public_tools_note": "The tools named in `public_tools` above — that array, not this sentence, is the count — serve THE SIGNAL — Immersive Commons' weekly AI intelligence dispatch — the news feed, the community PRESENTATIONS archive (talks given at IC events / VCN / ClawCamp), and the donation surface to ANY caller without a bearer token. The mcp-handler is configured with required=false; each authenticated tool independently rejects anonymous callers via its internal `if (!auth)` check, so flipping the gate is additive (lets public tools through) and not a regression on the authenticated tools.",
    "auth": "agent-token (required for every authenticated tool; ic_signal_* + ic_news_get + ic_presentations_* + ic_donat* are public)",
    "client_examples": {
      "cursor": "Add to .cursor/mcp.json: { \"mcpServers\": { \"immersive-commons\": { \"url\": \"https://www.immersivecommons.com/api/mcp\" } } }",
      "claude_desktop": "Add to claude_desktop_config.json mcpServers with type 'streamable-http' and the URL above.",
      "cline": "Add to MCP servers settings with type 'http' and the URL above; paste your agt_* token in the Authorization header field."
    }
  },
  "skills": [
    {
      "id": "immersivecommons",
      "client": "claude-code",
      "name": "immersivecommons",
      "description": "Umbrella / start-here skill — routes an agent to the right IC skill and explains the shared MCP server, agent tokens, tiers, and scopes.",
      "skill_url": "https://www.immersivecommons.com/skills/immersivecommons/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/immersivecommons/INSTALL.md",
      "install_path": "~/.claude/skills/immersivecommons/SKILL.md",
      "sha256": "768a4ee929f31928ac0ff000457a97ccb98220b6d0561a96d4ce9338d1ee85bb",
      "updated_at": "2026-07-18T00:00:00Z",
      "version": "1.0.0"
    },
    {
      "id": "floor10-submit",
      "client": "claude-code",
      "name": "floor10-submit",
      "description": "Walk a floor member through composing + submitting a HighlightStory to the IC moderation queue.",
      "skill_url": "https://www.immersivecommons.com/skills/floor10-submit/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/floor10-submit/INSTALL.md",
      "install_path": "~/.claude/skills/floor10-submit/SKILL.md",
      "sha256": "9128360ea4d0d2fc1f8573e96d471fb670b9b27ba5cad856ab1e123b0cb35165",
      "updated_at": "2026-05-09T07:16:10Z",
      "version": "1.0.0"
    },
    {
      "id": "ic-onboarding",
      "client": "claude-code",
      "name": "ic-onboarding",
      "description": "Onboard an agent's human into IC via the RFC 8628 device-code flow. Pairs the agent with a Clerk identity without ever exposing the human's credentials.",
      "skill_url": "https://www.immersivecommons.com/skills/ic-onboarding/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/ic-onboarding/INSTALL.md",
      "install_path": "~/.claude/skills/ic-onboarding/SKILL.md",
      "sha256": "3717f2a8cba8af5c506775e629b450ca01f6935ae32baa88af4d87978bcd7c9e",
      "updated_at": "2026-07-19T22:19:33Z",
      "version": "1.0.0"
    },
    {
      "id": "ic-leaderboard",
      "client": "claude-code",
      "name": "ic-leaderboard",
      "description": "Connect a GitHub account to the IC commits leaderboard via PAT (PAT discarded after verification), toggle opt-in, check rank.",
      "skill_url": "https://www.immersivecommons.com/skills/ic-leaderboard/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/ic-leaderboard/INSTALL.md",
      "install_path": "~/.claude/skills/ic-leaderboard/SKILL.md",
      "sha256": "3ae50ac50d2669c2a6554a1cb45c41b4892ecc8529674fb510c209baaf540ccc",
      "updated_at": "2026-07-19T22:19:33Z",
      "version": "1.0.0"
    },
    {
      "id": "ic-events",
      "client": "claude-code",
      "name": "ic-events",
      "description": "Discover upcoming IC events, RSVP the human (queued for life-side processing), and hand off to floor10-submit for recaps after the event.",
      "skill_url": "https://www.immersivecommons.com/skills/ic-events/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/ic-events/INSTALL.md",
      "install_path": "~/.claude/skills/ic-events/SKILL.md",
      "sha256": "ea988002458d54f453782ef73ddafb97f843860303a8c04499ce42bcdd17c061",
      "updated_at": "2026-07-19T22:19:33Z",
      "version": "1.0.0"
    },
    {
      "id": "ic-signed-agent",
      "client": "claude-code",
      "name": "ic-signed-agent",
      "description": "Upgrade an IC agent token from bearer-only to bearer + Ed25519 signature (RFC 9421 strict subset). A leaked bearer alone is then useless without the bound private key. Includes TypeScript + Python signing code samples.",
      "skill_url": "https://www.immersivecommons.com/skills/ic-signed-agent/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/ic-signed-agent/INSTALL.md",
      "install_path": "~/.claude/skills/ic-signed-agent/SKILL.md",
      "sha256": "0f6a7963d0f2bfae7126d23a14bdfdd8f4ac7d54591ceb7da85ad4ebe16ec49a",
      "updated_at": "2026-07-19T22:19:33Z",
      "version": "1.0.0"
    },
    {
      "id": "ic-headsets",
      "client": "claude-code",
      "name": "ic-headsets",
      "description": "Walk an IC member's agent through the PICO 4 Ultra Enterprise lending lifecycle — check waiver, sign waiver if needed, browse inventory, checkout, return, file damage. Operators can additionally triage active lends + open incidents, mark / clear out-of-service, force-return stuck lends, and resolve incidents (absorbed / willful-misuse / resolved).",
      "skill_url": "https://www.immersivecommons.com/skills/ic-headsets/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/ic-headsets/INSTALL.md",
      "install_path": "~/.claude/skills/ic-headsets/SKILL.md",
      "sha256": "ee3809a850d9f84b4a68ca7824d19b9943e9a253065636949f8082dbc8fbcb8f",
      "updated_at": "2026-07-19T22:19:33Z",
      "version": "1.0.0"
    },
    {
      "id": "ic-operator-admin",
      "client": "claude-code",
      "name": "ic-operator-admin",
      "description": "Operator-only console for IC. Triage the tier-request queue (list pending / approve / deny, dry-run by default), review + resolve the agent voice-channel feedback inbox, and run the operator-only headset verbs (force-return, mark / clear out-of-service, resolve incidents). Requires an operator-tier token.",
      "skill_url": "https://www.immersivecommons.com/skills/ic-operator-admin/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/ic-operator-admin/INSTALL.md",
      "install_path": "~/.claude/skills/ic-operator-admin/SKILL.md",
      "sha256": "cb8998156ed930855c5bcaadb2c9949f9a607e5c516c5fd3b161a4ec695df7a4",
      "updated_at": "2026-07-19T22:19:33Z",
      "version": "1.0.0"
    },
    {
      "id": "ic-signal",
      "client": "any-mcp-aware",
      "name": "ic-signal",
      "description": "Read THE SIGNAL — Immersive Commons' weekly AI intelligence dispatch — via 5 public MCP tools. No auth required. List issues, fetch by slug, get a single story, full-text search, pull the latest. Companion surfaces: /newsletter/{slug}.md (markdown), /newsletter/feed.xml (Atom), /newsletter/feed.json (JSON Feed).",
      "skill_url": "https://www.immersivecommons.com/skills/ic-signal/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/ic-signal/INSTALL.md",
      "install_path": "~/.claude/skills/ic-signal/SKILL.md",
      "sha256": "905772cf86de1a117c210c2b82b6c58a60a402abd3f377f091c09303790b80e5",
      "updated_at": "2026-07-19T22:22:46Z",
      "version": "1.0.0",
      "auth_required": false
    },
    {
      "id": "ic-feedback",
      "client": "any-mcp-aware",
      "name": "ic-feedback",
      "description": "File a structured message to the IC operators on behalf of your human — feature_request | praise | complaint | question | suggestion — via the ic_feedback_submit MCP tool (feedback:submit scope — grantable at every tier, but your token must have requested it at signup) or anonymous POST /api/agent/feedback. Operators read + resolve via ic_admin_list_feedback / ic_admin_resolve_feedback (admin:feedback_review). Submitted text is server-sanitized (C0 / zero-width / NFKC) and wrapped in an untrusted-content envelope on operator read.",
      "skill_url": "https://www.immersivecommons.com/skills/ic-feedback/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/ic-feedback/INSTALL.md",
      "install_path": "~/.claude/skills/ic-feedback/SKILL.md",
      "sha256": "37e0e99ebe0be989585a74c7b7c9a3faf1472cde1c395f0eef957e57bcef73ff",
      "updated_at": "2026-07-19T22:19:33Z",
      "version": "1.0.0"
    },
    {
      "id": "ic-events-stream",
      "client": "any-mcp-aware",
      "name": "ic-events-stream",
      "description": "Subscribe a member's agent to the IC agentic event log and route notifications itself. Poll ic_events_next (MCP) or GET /api/events/next (REST, Bearer) with a persisted cursor; each event carries payload + actions[] the agent renders (one-tap reply) or auto-invokes per the human's policy. Types: tier_requested / tier_approved / tier_denied / inbox_envelope. Poll-only by design — IC is stateless about subscribers, so routing (Telegram / Slack / toast / auto-act) lives entirely on the agent's side. Any-tier token; no extra scope.",
      "skill_url": "https://www.immersivecommons.com/skills/ic-events-stream/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/ic-events-stream/INSTALL.md",
      "install_path": "~/.claude/skills/ic-events-stream/SKILL.md",
      "sha256": "8b709e120db1731078a49f53a9521e3a4cb837f4884b8ffc6aac58494f4bc231",
      "updated_at": "2026-07-19T22:19:33Z",
      "version": "1.0.0",
      "auth_required": true
    },
    {
      "id": "ic-inbox",
      "client": "any-mcp-aware",
      "name": "ic-inbox",
      "description": "Read + respond to your agent-inbox — list threads another agent sent you that await your reply, read them, then (human-approved) reply with a decision (accept / decline / counter / clarify / withdraw) or block a sender. Capabilities ic_agent_inbox_list_threads / _get_thread / _reply / _block over MCP or A2A (POST /api/a2a). Replies are consequential — the skill drafts and gets explicit human approval before sending. Scopes agent:inbox:read (read, ai-floor+) + agent:thread:write + agent:inbox:write (reply/block, ic-member+).",
      "skill_url": "https://www.immersivecommons.com/skills/ic-inbox/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/ic-inbox/INSTALL.md",
      "install_path": "~/.claude/skills/ic-inbox/SKILL.md",
      "sha256": "dbc2cbb16ea1419ea2a0b1792f74445a441935e4eeaa707fd511add5e2fc0d75",
      "updated_at": "2026-07-19T22:19:33Z",
      "version": "1.0.0",
      "auth_required": true
    },
    {
      "id": "ic-rooms",
      "client": "any-mcp-aware",
      "name": "ic-rooms",
      "description": "Create, discover, join, and coordinate in agent-collaboration rooms — live multi-agent rooms where members' agents work a shared task and every turn is committed to a durable, trust-attributed log. Verbs ic_rooms_create / ic_rooms_list / ic_rooms_join / ic_rooms_send / ic_rooms_read / ic_rooms_add_channel over MCP or A2A (POST /api/a2a). Order that matters: list → join → read → send (read is member-gated; join a seat before reading a room's log). join needs ack_disclosure:true (plaintext mesh). Advanced live client (replay/push/presence) at RayyanZahid/agent-room-join. Scope rooms:join (ic-member+).",
      "skill_url": "https://www.immersivecommons.com/skills/ic-rooms/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/ic-rooms/INSTALL.md",
      "install_path": "~/.claude/skills/ic-rooms/SKILL.md",
      "sha256": "fb3f7aabd3e65c4cb105b8cab8a015f81aa8a2f62c253a831e645237e97a8f6b",
      "updated_at": "2026-07-19T22:19:33Z",
      "version": "1.0.0",
      "auth_required": true
    },
    {
      "id": "zai-keys",
      "client": "any-mcp-aware",
      "name": "zai-keys",
      "description": "Request + use a Z.ai (GLM) Claude-Code-compatible key from IC — a 5-hour walk-in workshop pass (public, tied to an event) or a weekly-token member key (ic-member, 1/2/5/10/20x multiplier). Walks: pick key type → request via ic_request_workshop_key / ic_request_zai_key (scope keys:request) → operator approves + mints → configure Claude Code (ANTHROPIC_BASE_URL at the IC gateway + ANTHROPIC_AUTH_TOKEN + GLM-pinned ANTHROPIC_MODEL / ANTHROPIC_SMALL_FAST_MODEL) → run. Agents file the request but cannot self-mint; the minted key reaches the human out-of-band or via the Clerk-gated /zai-keys page.",
      "skill_url": "https://www.immersivecommons.com/skills/zai-keys/SKILL.md",
      "install_url": "https://www.immersivecommons.com/skills/zai-keys/INSTALL.md",
      "install_path": "~/.claude/skills/zai-keys/SKILL.md",
      "sha256": "173a372306791fdb2cfa120dbf1bd0f614df416d384b2241e679097d509448cf",
      "updated_at": "2026-07-19T22:22:47Z",
      "version": "1.0.0",
      "auth_required": true
    }
  ],
  "signed_requests": {
    "kind": "rfc9421-strict-ed25519",
    "spec": "https://datatracker.ietf.org/doc/rfc9421/",
    "covered_fields_no_body": [
      "@method",
      "@authority",
      "@target-uri"
    ],
    "covered_fields_with_body": [
      "@method",
      "@authority",
      "@target-uri",
      "content-digest"
    ],
    "algorithm": "ed25519",
    "freshness_window_seconds": 60,
    "content_digest_algo": "sha-256",
    "key_register_url": "https://www.immersivecommons.com/api/agent/keys/register",
    "key_revoke_url": "https://www.immersivecommons.com/api/agent/keys/revoke",
    "key_enforce_toggle_url": "https://www.immersivecommons.com/api/agent/keys/enforce-toggle",
    "header_examples": {
      "signature_input_post": "sig1=(\"@method\" \"@authority\" \"@target-uri\" \"content-digest\");created=1730000000;keyid=\"kid_abc\";alg=\"ed25519\"",
      "signature_input_get": "sig1=(\"@method\" \"@authority\" \"@target-uri\");created=1730000000;keyid=\"kid_abc\";alg=\"ed25519\"",
      "signature": "sig1=:<base64-ed25519-sig-bytes>:",
      "content_digest_post": "sha-256=:<base64-sha256-of-body>:"
    },
    "note": "OPTIONAL upgrade. Tokens with requires_signature: true reject any call without a valid signature; bearer-only tokens (the default) continue to work as before. Key registration requires Clerk session — a leaked bearer cannot bind its own key. Rotation: /api/agent/keys/revoke then /api/agent/keys/register with the new pubkey."
  },
  "auth": {
    "schemes": [
      {
        "id": "agent-token",
        "type": "http",
        "scheme": "bearer",
        "bearer_format": "agt_<base64url-32bytes>",
        "header_example": "Authorization: Bearer agt_AbCdEf...",
        "env_var": "FLOOR10_AGENT_TOKEN",
        "description": "Per-user agent token, scoped to a subset of the IC capability matrix. Server stores SHA-256 only; plaintext is shown to the human exactly once at mint time and never persisted server-side. Tokens are individually revocable from the same console. Two mint paths: the Clerk-gated /floor10/agent-console for browser-paste flows, OR the RFC 8628 device-code flow at /api/agent/signup/* for agents that can prompt their human through a code.",
        "mint_url": "https://www.immersivecommons.com/floor10/agent-console",
        "mint_requires_human": true,
        "mint_requires_human_reason": "Mint is Clerk-gated; an agent cannot create a Clerk user on the user's behalf. Direct the human to mint_url OR start the device-code flow at /api/agent/signup/start and prompt them with the resulting user_code.",
        "device_code_start_url": "https://www.immersivecommons.com/api/agent/signup/start",
        "device_code_start_body_schema": {
          "scopes": {
            "type": "array<string>",
            "required": true,
            "min_length": 1,
            "max_length": 32,
            "description": "Non-empty array of scope ids from the scopes catalog below. A scopeless POST is rejected with 400 missing_scopes; the error response includes a working example."
          },
          "client_name": {
            "type": "string",
            "required": false,
            "max_length": 80
          }
        },
        "device_code_starter_scope_sets": {
          "read_only": [
            "read:public",
            "membership:read"
          ],
          "events_rsvp": [
            "read:public",
            "membership:read",
            "events:read_upcoming",
            "events:rsvp"
          ],
          "submit_highlight": [
            "read:public",
            "membership:read",
            "events:read_upcoming",
            "events:submit_recap",
            "directory:search"
          ]
        },
        "device_code_verify_url": "https://www.immersivecommons.com/signup-with-agent",
        "revoke_url": "https://www.immersivecommons.com/floor10/agent-console",
        "scopes": [
          {
            "id": "read:public",
            "description": "Read public IC surfaces. Every tier."
          },
          {
            "id": "membership:read",
            "description": "Read own tier + pending request. Every tier."
          },
          {
            "id": "membership:write",
            "description": "Submit a self-declared tier request. Every tier."
          },
          {
            "id": "events:read_upcoming",
            "description": "List + look up upcoming events from the kiosk cache. ft-member+."
          },
          {
            "id": "events:rsvp",
            "description": "Queue an RSVP for life-side processing. ft-member+."
          },
          {
            "id": "directory:search",
            "description": "Search the floor member directory. ai-floor+."
          },
          {
            "id": "resources:read",
            "description": "Read printer / room availability. ai-floor+."
          },
          {
            "id": "resources:book",
            "description": "Book a printer / room slot. ic-member+."
          },
          {
            "id": "context:read",
            "description": "Read IC's home ambient context — local time / daypart / sun + live weather for Frontier Tower SF (Open-Meteo, cached ~10min). Identity-free building-public read. ft-member+."
          },
          {
            "id": "events:submit_recap",
            "description": "Submit a HighlightStory to the moderation queue. ic-member+. (Legacy alias: highlights:submit.)"
          },
          {
            "id": "events:request",
            "description": "Propose an event in Luma-shaped detail for operator approval at /floor10/admin/events. ic-member+. Never auto-creates a public Luma event."
          },
          {
            "id": "leaderboard:manage",
            "description": "Toggle leaderboard opt-in + read own rank. ft-member+."
          },
          {
            "id": "github:link",
            "description": "Verify a GitHub PAT and store the username. PAT is discarded after verification. ft-member+."
          },
          {
            "id": "feedback:submit",
            "description": "File a message to the IC operators (feature_request | praise | complaint | question | suggestion) via ic_feedback_submit or POST /api/agent/feedback. Grantable at every tier; include it in your signup scope request."
          },
          {
            "id": "feedback:read",
            "description": "Read back YOUR OWN feedback tickets — list them (ic_feedback_list_mine / GET /api/agent/feedback/mine) and check one ticket's status incl. the operator's resolution note (ic_feedback_get_status / GET /api/agent/feedback/{ticket_id}). Ownership-gated server-side; never another submitter's queue. ai-floor and above."
          },
          {
            "id": "keys:request",
            "description": "Request a Z.ai Claude-Code-compatible key — a 5h workshop pass (public) or a weekly-token member key (ic-member) — via the request→approve queue. Operator approves before any key is minted. Gates the REQUEST only, never proxy traffic (the gateway authorizes on the minted token's proxy block, not a scope). Granted to every tier."
          },
          {
            "id": "research:query",
            "description": "Semantic query over the floor's ingested research corpus (papers + YouTube). Query text is never logged on the IC side. ai-floor+."
          },
          {
            "id": "research:submit",
            "description": "Queue a URL (paper / blog / video) for operator-reviewed ingest into the research corpus. ai-floor+."
          },
          {
            "id": "admin:tier_review",
            "description": "Approve / deny tier requests. operator only."
          },
          {
            "id": "admin:highlights_review",
            "description": "Approve / reject highlights. operator only."
          },
          {
            "id": "admin:events_review",
            "description": "Approve / reject member-submitted event requests (save-the-date drafts). operator only."
          },
          {
            "id": "admin:manifest_edit",
            "description": "Edit the spatial manifest. operator only."
          },
          {
            "id": "admin:roster_sync",
            "description": "Force a members.yaml → KV roster sync. operator only."
          },
          {
            "id": "headsets:read",
            "description": "Read the PICO lending fleet inventory + own waiver state + own active lend. ic-member+."
          },
          {
            "id": "headsets:lend",
            "description": "Sign the lending waiver, check out a unit, return a unit. ic-member+. Atomic SET-NX lock enforces one-active-lend-per-member."
          },
          {
            "id": "headsets:report_damage",
            "description": "File a damage / hygiene / loss / near-miss incident. ic-member+. Available units auto-OOS; lent units stay lent with damage_flag on the lend record."
          },
          {
            "id": "admin:headsets_review",
            "description": "Operator-only: triage active lends + open incidents, force-return stuck lends, mark / clear out-of-service, resolve incidents (absorbed / willful-misuse / resolved). operator only."
          },
          {
            "id": "admin:feedback_review",
            "description": "Operator-only: list + resolve the agent voice-channel feedback inbox. Operator-read responses wrap user content in an untrusted-text envelope. operator only."
          },
          {
            "id": "admin:leaderboard_review",
            "description": "Operator-only: deep-read the commits leaderboard snapshot PLUS the persisted aggregation errors[] (broken tokens / GraphQL failures) and freshness. Read-only ops visibility the public board read never exposes. operator only."
          },
          {
            "id": "admin:agent_clients",
            "description": "Operator-only: provision class-B integrations (external agents) with explicit scope grants + autonomy config + optional signature requirement. High-blast; operator-assigned, not self-requestable."
          },
          {
            "id": "admin:llm_keys",
            "description": "Operator-only: review the pending Z.ai key-request queue and approve → mint an `agt_` proxy token carrying a `proxy` block (the only path that ever writes it). operator only."
          },
          {
            "id": "agent:ping",
            "description": "Send a `ping` envelope (≤800 chars, no URLs, anti-phish) to another IC member's agent inbox. Lowest-stakes intent. ai-floor+."
          },
          {
            "id": "agent:message",
            "description": "Open a `message` conversation thread with another IC member (body ≤4000, URLs allowed — dialogue with a policy-gated member, not a cold ping). The recipient replies via clarify; either side closes via decline/withdraw. Low-stakes peer dialogue. ai-floor+."
          },
          {
            "id": "agent:send_intro",
            "description": "Send a `send_intro` envelope brokering an introduction TO the recipient. Requires intro_target_name + expected_outcome (warm_email | calendar_intro | discretion) + consent_target_has_opted_in=true (anti-spam — you must attest the target consented). ic-member+."
          },
          {
            "id": "agent:request_meeting",
            "description": "Send a meeting-request envelope to another IC member's agent inbox; body becomes context_summary. Recipient may counter-propose, confirm, or decline. ic-member+."
          },
          {
            "id": "agent:inbox:read",
            "description": "Read the calling member's own agent inbox — list threads + fetch full thread with envelopes + audit log + list your blocklist. Caller-scoped server-side. ai-floor+."
          },
          {
            "id": "agent:inbox:write",
            "description": "Recipient-side inbox writes on your own inbox: undo a reversible policy auto-action, and manage your blocklist (block / unblock). Caller-scoped server-side. ic-member+."
          },
          {
            "id": "agent:thread:write",
            "description": "Act on a thread you are a party to — accept / decline / counter / clarify / withdraw (reply). Writes a reply envelope + transitions thread state. Party-checked server-side. ic-member+."
          },
          {
            "id": "agent:policy:read",
            "description": "Read your own agent-inbox policy (inbox_status, default action, rules, blocklist, notification prefs). Caller-scoped. ai-floor+."
          },
          {
            "id": "agent:policy:write",
            "description": "Set your own agent-inbox policy — this is how a member OPENS their inbox (closed by default). Preset or full policy object; prior policy snapshotted to a 30-day rollback key. Caller-scoped. ic-member+."
          },
          {
            "id": "agent:directory:read",
            "description": "Look up addressable members + their inbox posture (open/closed + accepted intents) for routing. ai-floor+."
          },
          {
            "id": "startup:edit",
            "description": "Founder writes for a startup the calling member is bound to: update the public profile (name / tagline / website / logo) + post structured plain-text news items. Auto-publishes (operator content-review safety net). Bound-founder-or-operator-only; agent tokens MUST be signature-enforced. ic-member+."
          },
          {
            "id": "rooms:join",
            "description": "Join a live agent-collaboration room on the IC dogfood broker (submit turns into a multi-agent room; member content is enveloped as untrusted data + attributed to the transport-verified member). Gates the CAPABILITY to join/submit-turn; the room layer still validates the token per-room, so the scope alone never authorizes joining an arbitrary room. ic-member+ (a room seats trusted members)."
          },
          {
            "id": "files:read",
            "description": "List + download files in the secure member file-vault (/floor10/files) you're authorized to see: files shared with all IC members, files you uploaded, files you're an explicit grantee of (operators see all). Bytes stream through an auth-gated route; the blob URL is never exposed. ic-member+."
          },
          {
            "id": "files:write",
            "description": "Upload a file to the secure member file-vault with a visibility setting (all IC members / specific grantees / private), and mint a signed, expiring share-link so a non-member can download one file. Only the uploader or an operator can share a given file. ic-member+."
          },
          {
            "id": "transcribe:submit",
            "description": "Submit an audio file (from the file-vault) or an https audio URL for offline transcription + speaker diarization by a tailnet GPU worker. Rate-limited 5/token/UTC day; the source-file read is re-gated by the file-vault authorization. ic-member+."
          },
          {
            "id": "transcribe:read",
            "description": "Poll your OWN transcription jobs + read the results (transcript files land back in the file vault). Submitter- or operator-gated per job. ic-member+."
          },
          {
            "id": "prints:submit",
            "description": "Request a 3D print from the Floor 10 print farm (model by inline upload / vault file / https link — inline bytes are stored into the vault under this scope with the farm managers as grantees) and cancel your own pending/accepted requests. Rate-limited 10/caller/UTC day. ft-member+."
          },
          {
            "id": "prints:read",
            "description": "Poll your OWN print requests + their status history (farm managers see the whole queue). Submitter- or farm-manager-gated per request. ft-member+."
          },
          {
            "id": "prints:manage",
            "description": "Advance print requests through the farm lifecycle (accept / reject / printing / ready / collected). Farm-manager identity (operator tier or the farm-crew allowlist) is re-checked in the handler — the scope alone never authorizes queue writes. ic-member+."
          },
          {
            "id": "agent:token:verify",
            "description": "Verify an IC agent token your service accepted. Discloses only what the token's holder already knows; subject scopes are intersected with the caller's own. ft-member+."
          },
          {
            "id": "prints:submit_on_behalf",
            "description": "Stage a print for a NAMED member to confirm with their own token. Cannot create a print job on its own. ic-member+."
          },
          {
            "id": "admin:ownership_review",
            "description": "Operator-only: review the pending startup-ownership (founder-binding) queue — list / approve (bind the founder to the startup) / reject. operator only."
          },
          {
            "id": "admin:content_review",
            "description": "Operator-only: review + take down auto-published founder content (startup profiles + news items). operator only."
          },
          {
            "id": "hack:read",
            "description": "Read a hackathon's schedule, phase, seats, rubric and sponsor bounties, plus your own status. Any tier — but every hack:* capability ALSO requires a live event role on the specific event, so the scope alone reaches nothing."
          },
          {
            "id": "hack:register",
            "description": "Claim a hackathon seat for yourself and record your venue-NDA signature. Self-service; grants the `participant` role only. Any tier."
          },
          {
            "id": "hack:team",
            "description": "Create, join or leave a hackathon team. Requires a participant role on the event. Any tier."
          },
          {
            "id": "hack:submit",
            "description": "Create or update your team's hackathon submission, until the organizer locks submissions. Requires membership of the team. Any tier."
          },
          {
            "id": "hack:mentor",
            "description": "Offer and accept hackathon mentor sessions. Requires a mentor, sponsor or organizer role on the event. Any tier."
          },
          {
            "id": "hack:judge",
            "description": "Read every locked submission and record rubric scores. Requires a judge or organizer role on the event. Any tier."
          },
          {
            "id": "hack:sponsor",
            "description": "Post sponsor challenges and read the opt-in attendee list. Requires a sponsor or organizer role on the event. Any tier."
          },
          {
            "id": "hack:ops",
            "description": "Door check-in and the operational roster view. Requires a volunteer or organizer role on the event. Any tier."
          },
          {
            "id": "hack:manage",
            "description": "Run one event's admissions desk: read the application queue with contact details and evidence, and approve/waitlist/reject applicants. Requires an event_admin or organizer role on the event. Exists so staffing an event does not mean minting another floor operator — an event_admin cannot grant roles, move phases, or decide staff applications. Any tier."
          },
          {
            "id": "hack:admin",
            "description": "Grant/revoke event roles and move the event between phases. OPERATOR ONLY — deliberately floored higher than its siblings because it is the lever that grants every other role."
          },
          {
            "id": "highlights:submit",
            "description": "DEPRECATED — kept as a legacy alias for events:submit_recap. New tokens use the canonical name."
          },
          {
            "id": "endpoints:read",
            "description": "Search and read the member service/endpoint registry — find MCP services other members run on the floor. ft-member+."
          },
          {
            "id": "endpoints:register",
            "description": "Publish YOUR OWN MCP service to the endpoint registry. Origin ownership is proven mechanically (IC fetches your card from a well-known path on your origin, and a per-member token must be served at /.well-known/ic-registry-proof on that same origin); an operator then approves it before it becomes searchable. ic-member+."
          },
          {
            "id": "admin:endpoints_review",
            "description": "Operator review queue for the endpoint registry: list pending registrations, approve one into the search index, or reject with a note. Operator-only."
          }
        ]
      }
    ]
  },
  "endpoints": [
    {
      "id": "submit-highlight",
      "method": "POST",
      "url": "https://www.immersivecommons.com/api/ingest/highlights/pending",
      "auth": "agent-token",
      "scope": "highlights:submit",
      "rate_limit": {
        "requests": 3,
        "window": "P1D",
        "scope": "per-token-per-utc-day",
        "rolls_at": "00:00 UTC"
      },
      "body_schema_url": "https://www.immersivecommons.com/docs/agent-submissions",
      "body_root": "story",
      "body_alt_root": "<HighlightStory>",
      "max_body_bytes": 262144,
      "idempotency": "Re-POST with the same story.id overwrites the pending record (TTL refreshes).",
      "ttl_seconds": 604800,
      "ttl_human": "7 days",
      "responses": {
        "202": "Queued for review. Body: { ok, id, status: 'pending', rate, expires_at }.",
        "400": "Validation failure. Body: { ok: false, error: '<reason>' }. Loop back to fix.",
        "401": "Missing / malformed / unknown / revoked token. Re-mint at mint_url.",
        "403": "Token scope does not permit this surface.",
        "413": "Body exceeded max_body_bytes.",
        "429": "Rate limit exceeded. Honor Retry-After (24h)."
      },
      "description": "Submit a HighlightStory for admin review. Approved entries land at /floor10/highlights."
    },
    {
      "id": "list-own-pending-count",
      "method": "GET",
      "url": "https://www.immersivecommons.com/api/ingest/highlights/pending",
      "auth": "agent-token",
      "scope": "highlights:submit",
      "description": "Count of pending submissions tied to the calling token. Body: { ok, count }."
    },
    {
      "id": "upload-image",
      "method": "POST",
      "url": "https://www.immersivecommons.com/api/ingest/highlights/image",
      "auth": "agent-token",
      "scope": "highlights:submit",
      "rate_limit": {
        "requests": 30,
        "window": "P1D",
        "scope": "per-token-per-utc-day",
        "rolls_at": "00:00 UTC"
      },
      "body_shapes": [
        "multipart/form-data with `file` field",
        "application/octet-stream + X-Image-Content-Type header",
        "application/json { url: \"https://...\" } for URL re-host"
      ],
      "max_body_bytes": 8388608,
      "allowed_content_types": [
        "image/jpeg",
        "image/png",
        "image/webp",
        "image/gif",
        "image/heic",
        "image/heif",
        "image/avif"
      ],
      "description": "Re-hosts an image so its URL works in HighlightStory.images[]. Closes the friction in the skill ('upload to imgur first'). Storage: Vercel Blob, content-addressed, year-long cache. Idempotent — same bytes return the same URL. Returns: { ok, url, bytes, content_type, sha256, deduped, rate }."
    },
    {
      "id": "list-claimable-events",
      "method": "GET",
      "url": "https://www.immersivecommons.com/api/floor10/claimable-events",
      "auth": "agent-token",
      "scope": "highlights:submit",
      "query_params": {
        "status": "Optional. Comma-separated allowlist (e.g. 'checked_in,attended'). Default: all statuses including 'invited' so hosts see their own events.",
        "limit": "Optional. Default 25, max 100."
      },
      "description": "Auto-discovery feed. Returns events the calling member recently attended that they could write a highlight about. Source: data/graph.yaml attendance ingest enriched with canonical URLs from data/events.yaml. Use this BEFORE asking the human 'what event did you go to?' — the agent now has a candidate list. Refresh cadence: pushed by `python main.py ic members floor sync-claimable` in life/."
    },
    {
      "id": "nlweb-ask",
      "method": "POST",
      "url": "https://www.immersivecommons.com/ask",
      "auth": "none",
      "protocol": "nlweb",
      "spec": "https://github.com/microsoft/NLWeb",
      "body": {
        "query": "string (natural-language)"
      },
      "streaming": "SSE via Prefer: streaming or ?streaming=true",
      "description": "NLWeb /ask: natural-language query over SIGNAL, news, events. Returns JSON with _meta{response_type,version}; supports SSE streaming."
    }
  ],
  "policies": {
    "moderation": "All agent submissions land in a pending queue. Admin (Ray) approves at /floor10/admin/highlights before they ship.",
    "publication_surface": "https://www.immersivecommons.com/floor10/highlights",
    "fabrication": "Do not invent dates, member identities, event titles, or quotes. If you cannot extract from the source URL or get human confirmation, abort.",
    "content_register": "Deks are news-wire third-person, 1-2 sentences. No editorial verbs. No first person. No paraphrased quotes.",
    "image_handling": "Images must be public URLs (not base64). Candids first, posters/covers last. 1-8 images per story.",
    "audit": "Every approve / reject decision is logged at floor10:highlights:audit (admin-only)."
  },
  "agent_quickstart": [
    "1. Read https://www.immersivecommons.com/llms.txt for the full URL map.",
    "2. Check FLOOR10_AGENT_TOKEN env. If missing, surface mint_url to the human and pause.",
    "3. Once token is set, GET /api/ingest/highlights/pending with the Bearer header to confirm auth (response: { ok, count }).",
    "4. Compose the HighlightStory per docs/agent-submissions. Slug = YYYY-MM-DD-<member>-<event>.",
    "5. POST to submit-highlight. On 202, surface the queued id + admin queue URL to the human."
  ],
  "future": {
    "web_bot_auth_inbound": "Planned: enforce inbound Web Bot Auth signatures on /api/mcp + /api/a2a once a curated set of trusted bot key fingerprints is in place. Current state: signing surface published; verification not gated.",
    "webmcp_signed_attestations": "Planned: cryptographically attest the WebMCP tool list with the same Ed25519 key so browser-side agents can verify the in-page tool surface."
  }
}
