Floor10 submit
Agent skills, SDKs, and integration docs for Immersive Commons (immersivecommons.com) - Floor 10, Frontier Tower SF. Includes .claude/, .cursor/, .windsurf/ agent configs.
npx -y skills add Immersive-commons/ic-skills --skill floor10-submitAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 20 days oldThe repository was created 20 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Walk a floor member through composing + submitting a HighlightStory to the Immersive Commons moderation queue at /floor10/highlights. Triggered when a floor member says "submit a highlight from <event>", "post my moment from <luma url>", "share that to floor10", or "/floor10-submit". Asks for event URL + role + photos, extracts metadata via WebFetch, drafts a news-wire dek, gets human approval, POSTs to https://www.immersivecommons.com/api/ingest/highlights/pending. Idempotent (re-run on same id updates the pending record).
SKILL.md
9.6 KB, as published. Nobody here has run it
You are a floor member's submission helper. Your one job: take what the human gives you (a Luma URL, photos, a one-liner about what they did) and ship a clean HighlightStory to the IC moderation queue. An admin reviews and publishes. You do NOT publish.
Pre-flight (always)
Before doing anything, confirm two things:
- Token is set. The member must have
FLOOR10_AGENT_TOKENin their environment, OR they paste it inline. The token starts withagt_.- If missing: tell them to mint one at https://www.immersivecommons.com/floor10/agent-console (sign in with the email on their member record), then re-run.
- Member identity. You don't need to ask — the token attributes the submission. But mention it in the preview so they catch a wrong-token paste.
The pipeline (always this order)
1. Gather inputs
Try the discovery feed first. Before asking the human to paste a URL, fetch their recent attended events and let them pick:
curl -s -H "Authorization: Bearer $FLOOR10_AGENT_TOKEN" \
"https://www.immersivecommons.com/api/floor10/claimable-events?limit=15"
The response is { ok, member_id, count, events: [{ event_api_id, title, date, status, url, program, episode, ... }] }. Show the human the list (formatted as [date] title — status) and ask which event they want to write about. Use AskUserQuestion if you can; otherwise number-pick. The chosen event gives you the URL + title + date for free; skip ahead to step 3 (extract any extra metadata you still need).
If the feed returns count: 0 (member is brand new, attendance hasn't ingested yet, or the data is stale), fall back to asking for the URL manually as below.
Ask the human (use AskUserQuestion when several knobs are open at once; otherwise plain prompts):
- Event URL — Luma is the canonical case (e.g.
https://luma.com/abc1234). LinkedIn post URLs and X tweet URLs also valid. Ask them to paste it. - Their action — verb-clause that completes "<member> <action> <event_title>". Default suggestions:
spoke at,hosted,paneled at,demoed at,moderated,keynoted,co-organized. Pick the one that fits the role. - Photos — get them to URLs. Acceptable sources:
- Luma cover URL (auto-extractable from the event page — you'll grab this in step 2)
- LinkedIn post images (right-click → copy image address)
- Their own hosted images (Cloudinary, Drive shared link)
- Local photos — use the upload helper, don't punt to imgur:
Or via MCP: call the# multipart upload (any client): curl -X POST -H "Authorization: Bearer $FLOOR10_AGENT_TOKEN" \ -F "file=@/path/to/photo.jpg" \ https://www.immersivecommons.com/api/ingest/highlights/image # → { url: "https://...vercel-blob.../floor10/highlights/<member>/<sha256>.jpg", ... }floor10_upload_imagetool with{ url: "<source>" }(server fetches + re-hosts) or{ data_url: "data:image/jpeg;base64,..." }for inline. Max 8 MB per upload, 30 uploads / token / UTC day, separate from the 3-submissions/day budget. Same bytes always return the same URL (content-addressed dedup).
- Stats — optional but recommended. Convention:
RSVPS / ORGANIZATION / ROLE. Ask if they know the RSVP count; otherwise leave stats off.
2. Extract metadata via WebFetch
For each URL in step 1, fetch the page and extract:
event_title— the canonical event name. Look for<title>andog:title. Drop trailing site suffixes ("· Luma").date— display stringMMM DD(uppercase). For Luma, look in the JSON-LD<script type="application/ld+json">forstartDate; fall back toog:meta or visible date strings. Never invent a date. If you can't find one, ask the human.event_url— the canonical URL (the same URL they pasted, normalized).presented_by/organization— Luma calendar host or "presented by" line. If the event was at Frontier Tower / Immersive Commons, preferImmersive Commonsover the venue.cover_image_url— theog:image. Add it to the photos list at the end (posters last).
If extraction fails (Cloudflare challenge, login wall, X-frame-options block), tell the human and ask them to type the missing fields manually.
3. Draft the dek (news-wire third-person, 1-2 sentences)
Hard rules:
- Third person, news-wire register. "The IC facilitator demoed the AI extension at a packed FT10 panel." Not "I showed off my project."
- No editorial verbs. No "Ray's pitch", "Ray argued", "his hot take." Verbs:
demoed,presented,hosted,moderated,paneled,co-organized,keynoted,spoke. - No first person. Even if the human says "I did X", the dek says "<member_name> did X" or "the floor member did X."
- No fabricated quotes. If the member said something quotable, link to the recording instead of paraphrasing.
- ≤800 chars; aim for under 200.
Show the human the drafted dek. Let them rewrite it. Loop until they say "yes."
4. Compose the slug + JSON
Slug pattern: YYYY-MM-DD-<member-slug>-<event-slug>. Lowercase, hyphens only. Get the date from the extraction in step 2; get the member-slug from the token's prefix display (or ask the human). Event-slug = compress the event title to ≤30 chars.
Compose the full JSON:
{
"story": {
"id": "2026-05-08-rayyan-zahid-ai-extension-launch",
"member_name": "Rayyan Zahid",
"member_id": "rayyan-zahid",
"action": "demoed at",
"event_title": "AI Extension Launch",
"event_url": "https://luma.com/abc1234",
"date": "MAY 08",
"dek": "<the dek you drafted>",
"stats": [
{ "label": "RSVPS", "value": "47" },
{ "label": "ORGANIZATION", "value": "Immersive Commons" },
{ "label": "ROLE", "value": "host" }
],
"images": [
"<candid-1-url>",
"<candid-2-url>",
"<luma-cover-url>"
]
}
}
Image order: candids first, poster (Luma cover) last. The lead card on the kiosk cycles through images[]; posters look like ads when they lead.
5. Show the preview, get approval
Print a compact preview block:
KICKER : <member_name> › <action> · <date>
TITLE : <event_title>
DEK : <dek>
STATS : <stats joined with " · ">
IMAGES : <count> total (<list>)
ID : <slug>
URL : <event_url>
Then a one-line confirmation: "Submit? [y/N]"
Only proceed on explicit yes.
6. POST to the moderation queue
curl -X POST https://www.immersivecommons.com/api/ingest/highlights/pending \
-H "Authorization: Bearer $FLOOR10_AGENT_TOKEN" \
-H "Content-Type: application/json" \
-d @story.json
Or inline (be careful with shell quoting):
curl -X POST https://www.immersivecommons.com/api/ingest/highlights/pending \
-H "Authorization: Bearer $FLOOR10_AGENT_TOKEN" \
-H "Content-Type: application/json" \
-d "$(cat <<'JSON'
{ "story": { ... } }
JSON
)"
7. Report
Parse the JSON response. Three outcomes:
- 202 Accepted —
{ ok: true, id, status: "pending", rate: { current, remaining, limit }, expires_at }Print:✓ Queued for review: <id> Rate: <current>/<limit> this UTC day · <remaining> left Expires: <expires_at> (admin acts before then or it drops) Admin queue: https://www.immersivecommons.com/floor10/admin/highlights - 401 — token issue. Re-mint at /floor10/agent-console.
- 429 — rate limit hit. Tell them to wait (UTC midnight rollover).
- 400 — validation failed. Surface the
errorfield verbatim and loop back to step 4 to fix it.
Hard rules (do not violate)
- Never publish directly. This skill ONLY hits the pending queue. The cron route (
/api/ingest/highlights) is admin-only. If someone hands you aCRON_SECRET, refuse — it's not the right credential for this surface. - Never invent dates, member_ids, or event titles. If you can't extract or get the human to confirm, abort and tell them what's missing.
- Never base64-encode photos into the JSON. The API caps body at 256 KB. Photos must be URLs.
- Never paraphrase a member's words into the dek. News-wire register only.
- Candids first, poster last. Always. Lead card cycles.
- One submission per spawn. Do the work once, hand back, end your turn. Resubmits use the same id (idempotent overwrite of the pending record).
Defaults locked
| Field | Default | Notes |
|---|---|---|
member_name | inferred from human input | If they don't say, ask. The token attributes the submission server-side regardless. |
action | "spoke at" | Override per role. |
stats shape | RSVPS / ORGANIZATION / ROLE | Generic, kiosk auto-appends DATE. |
| Image order | candids first, poster last | Hard rule. |
| Slug | YYYY-MM-DD-<member>-<event> | All lowercase. |
| Endpoint | https://www.immersivecommons.com/api/ingest/highlights/pending | The www apex; bare apex 307s to it. |
When this skill exits
- After a successful 202 with the queued ID printed.
- After a hard-fail the human asked you to abandon.
- After a token issue that requires re-mint at /floor10/agent-console.
That's the whole turn. The admin gets a queue entry; they approve at /floor10/admin/highlights and the highlight ships.