Status: Draft
Author: AI Design Task
Date: 2026-02-06
Organizer Co-Pilot is an opt-in AI assistant that helps Rust NYC meetup organizers triage talk submissions, detect urgency, score against rubrics, generate weekly digests, and draft repliesβall while preserving privacy and human oversight.
Organizers currently face:
- Triage fatigue β Manually reviewing each submission takes significant time
- Inconsistent evaluation β Different organizers may weight criteria differently
- Missed deadlines β Time-sensitive submissions (e.g., visiting speakers) slip through
- Slow response times β Submitters wait days/weeks for feedback
- Context loss β Discord threads grow long; key details get buried
| Capability | Description | Trigger |
|---|---|---|
| Rubric Scoring | Auto-score submissions against configurable criteria (topic fit, novelty, clarity, speaker experience) | On submission |
| Urgency Detection | Flag time-sensitive signals (travel dates, deadlines, "visiting next week") | On submission |
| Suggested Tags | Propose labels: lightning, deep-dive, beginner-friendly, advanced, needs-mentorship | On submission |
| Weekly Digest | Summarize new submissions, pending decisions, upcoming deadlines | Scheduled (cron) |
| Draft Replies | Generate templated responses for common scenarios (accept, decline, request-more-info) | On-demand (slash command) |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Talk Submission β
β (backend/index.ts:POST /api/submissions) β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AI Co-Pilot Pipeline β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ ββββββββββββββ β
β β Rubric Score βββ Urgency Flag βββ Tag Suggest βββ Store Meta β β
β ββββββββββββββββ ββββββββββββββββ ββββββββββββββββ ββββββββββββββ β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Discord Notification (enhanced) β
β β’ Includes score badge, urgency flag, suggested tags β
β β’ Posts to #organizers channel β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
| File | Changes |
|---|---|
backend/copilot/ (new) | New module for AI analysis |
backend/copilot/rubric.ts | Rubric scoring logic |
backend/copilot/urgency.ts | Urgency detection |
backend/copilot/tags.ts | Tag suggestions |
backend/copilot/digest.ts | Weekly digest generation |
backend/copilot/replies.ts | Draft reply templates |
backend/index.ts | Integration hook after submission (lines ~100-150) |
shared/types.ts | New CopilotAnalysis type |
-- New table for AI analysis results
CREATE TABLE copilot_analyses_1 (
id INTEGER PRIMARY KEY AUTOINCREMENT,
submission_id INTEGER NOT NULL REFERENCES talk_submissions_3(id),
-- Rubric scores (0-100)
score_topic_fit INTEGER,
score_novelty INTEGER,
score_clarity INTEGER,
score_speaker_exp INTEGER,
score_overall INTEGER,
-- Urgency
urgency_level TEXT CHECK(urgency_level IN ('none', 'low', 'medium', 'high')),
urgency_reason TEXT,
urgency_deadline DATE,
-- Tags (JSON array)
suggested_tags TEXT, -- ["lightning", "beginner-friendly"]
-- Metadata
model_version TEXT NOT NULL,
analyzed_at DATETIME DEFAULT CURRENT_TIMESTAMP,
-- Opt-out tracking
organizer_override BOOLEAN DEFAULT FALSE,
override_notes TEXT
);
-- Index for digest queries
CREATE INDEX idx_copilot_analyses_analyzed_at ON copilot_analyses_1(analyzed_at);
CREATE INDEX idx_copilot_analyses_urgency ON copilot_analyses_1(urgency_level);
Prompt template (configurable in copilot/rubric.ts):
const RUBRIC_PROMPT = `You are evaluating a Rust NYC meetup talk submission.
SUBMISSION:
Speaker: {{speaker_name}}
Context: {{talk_context}}
Type: {{submission_type}}
Score each criterion 0-100:
1. Topic Fit: Is this relevant to the Rust community?
2. Novelty: Is this a fresh perspective or well-covered ground?
3. Clarity: Is the proposal clear about what will be presented?
4. Speaker Experience: Based on context, how prepared is the speaker?
Return ONLY valid JSON:
{
"topic_fit": 85,
"novelty": 70,
"clarity": 90,
"speaker_exp": 75,
"reasoning": "Brief explanation"
}`;
Scoring thresholds (env-configurable):
| Score | Badge | Action |
|---|---|---|
| 80+ | π Strong | Fast-track review |
| 60-79 | β Solid | Normal queue |
| 40-59 | π€ Consider | May need mentorship |
| <40 | β οΈ Needs Work | Request more info |
Pattern-based + AI hybrid approach:
// backend/copilot/urgency.ts
// Fast regex patterns (no API call)
const URGENCY_PATTERNS = [
{ pattern: /visiting\s+(next|this)\s+week/i, level: 'high', reason: 'Visiting speaker' },
{ pattern: /deadline\s*(is\s+)?(\w+\s+\d+|\d+\/\d+)/i, level: 'medium', reason: 'Mentioned deadline' },
{ pattern: /time[- ]sensitive/i, level: 'medium', reason: 'Explicitly time-sensitive' },
{ pattern: /only\s+available\s+(on|until)/i, level: 'high', reason: 'Limited availability' },
{ pattern: /leaving\s+(the\s+)?(city|country|US)/i, level: 'high', reason: 'Departing soon' },
];
// If patterns don't match, use AI for nuanced detection
async function detectUrgencyWithAI(content: string): Promise<UrgencyResult> {
// Uses gpt-4o-mini with specific urgency-detection prompt
}
Auto-suggested, organizer-confirmed:
const TAG_TAXONOMY = {
format: ['lightning', 'deep-dive', 'workshop', 'panel'],
level: ['beginner-friendly', 'intermediate', 'advanced'],
topic: ['async', 'systems', 'wasm', 'embedded', 'web', 'cli', 'gamedev'],
support: ['needs-mentorship', 'needs-slides-review', 'first-time-speaker'],
};
Tags appear in Discord notification with β /β buttons for organizers to confirm.
Cron job (copilot-digest.cron.ts) runs Monday 9am:
## π Rust NYC Talk Submissions β Week of Feb 3
### π New Submissions (3)
| Speaker | Topic | Score | Urgency |
|---------|-------|-------|---------|
| Alice | Async Rust Deep Dive | π 85 | β° HIGH: visiting Feb 15 |
| Bob | My First Crate | π€ 55 | β |
| Carol | WebAssembly Perf | β
72 | β |
### β³ Pending Decisions (5)
- Alice's talk awaiting slot assignment (7 days)
- Bob's talk needs mentorship assignment (14 days)
### π
Upcoming Deadlines
- Feb 15: Alice only available this date
- Feb 28: March meetup speaker deadline
### π Stats
- Avg response time: 4.2 days
- Acceptance rate: 67%
Slash command /copilot reply <submission-id> <scenario>:
| Scenario | Template |
|---|---|
accept | Congratulations, scheduling details, next steps |
decline | Gracious decline, reasons, encouragement to resubmit |
more-info | Specific questions based on what's missing |
mentorship | Offer pairing with experienced speaker |
Guardrail: Draft is posted as an ephemeral message only visible to the organizer who invoked it. Organizer must explicitly send or edit before it's visible to the submitter.
| Level | Scope | How to Enable |
|---|---|---|
| Guild-level | Entire Discord server | Env var COPILOT_ENABLED=true |
| Channel-level | Specific submission channels | Channel topic includes [copilot] |
| Submission-level | Individual submission | Submitter checkbox "Allow AI-assisted review" |
Default: All levels default to OFF. Requires explicit opt-in.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AI Output Classification β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β ADVISORY (shown to organizers only): β
β β’ Rubric scores β
β β’ Urgency flags β
β β’ Tag suggestions β
β β’ Weekly digests β
β β’ Draft replies (ephemeral) β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β NEVER autonomous: β
β β’ Accepting/declining submissions β
β β’ Sending replies to submitters β
β β’ Modifying submission content β
β β’ Creating public channels β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Any organizer can override AI analysis:
/copilot override <submission-id> score=95 urgency=none tags=deep-dive,advanced
Overrides are logged with organizer ID, timestamp, and reason.
| Resource | Limit | Reason |
|---|---|---|
| OpenAI calls per submission | 3 | Score + urgency + tags |
| OpenAI calls per day | 100 | Cost control |
| Digest generation | 1/week | Prevent spam |
| Draft replies per organizer | 20/day | Prevent abuse |
| Data | Stored | Retention | Purpose |
|---|---|---|---|
| Submission content | β Yes | Indefinite | Core functionality |
| AI scores | β Yes | Indefinite | Audit trail |
| AI reasoning | β Yes | 90 days | Debugging |
| Full prompts sent to AI | β No | β | Privacy |
| AI model responses | β Yes (parsed) | 90 days | Debugging |
| Organizer overrides | β Yes | Indefinite | Accountability |
- Raw API request/response bodies to OpenAI
- Conversation history beyond current submission
- Personal data beyond what's in submission form
- IP addresses or device fingerprints
ββββββββββββββββββββ ββββββββββββββββββββ
β Our Database β β OpenAI API β
β (Val Town SQL) β β (gpt-4o-mini) β
ββββββββββ¬ββββββββββ ββββββββββ²ββββββββββ
β β
β Submission content β Anonymized prompt
β (speaker name, β (no email, no Discord IDs
β talk context) β in production prompts)
ββββββββββββββββββββββββββββββ
OpenAI Data Policy: Using API (not ChatGPT), data is not used for training per OpenAI API ToS.
| Metric | Baseline | Target | Measurement |
|---|---|---|---|
| Avg. response time | 5 days | 2 days | Time from submission to first organizer reply |
| Triage time per submission | 10 min | 3 min | Organizer-reported (survey) |
| Missed urgent submissions | Unknown | 0 | Count of high-urgency not reviewed within 48h |
| AI score correlation | N/A | >0.7 | Correlation between AI score and final decision |
| Organizer override rate | N/A | <20% | Indicates AI alignment with organizer judgment |
| Submitter satisfaction | 4.0/5 | 4.5/5 | Post-event survey |
New opt-in feature helps organizers respond to speakers 60% faster while maintaining human decision-making
New York, NY β Rust NYC, the popular systems programming meetup, today announced the launch of Organizer Co-Pilot, an AI-assisted tool that helps volunteer organizers efficiently triage talk submissions without compromising privacy or human oversight.
"Our organizers are volunteers with day jobs," said [Organizer Name]. "Co-Pilot handles the time-consuming first passβscoring proposals, flagging visiting speakers who need fast responses, and drafting reply templatesβso we can focus on the human conversations that matter."
Key Features:
- Smart Scoring: AI evaluates submissions against transparent rubrics, highlighting strong proposals
- Urgency Detection: Automatically flags time-sensitive submissions (visiting speakers, deadlines)
- Weekly Digests: Summarizes pending submissions so nothing falls through the cracks
- Draft Replies: Generates starting points for common responses, always requiring human review before sending
Privacy by Design:
- Opt-in at every level (guild, channel, individual submission)
- AI provides recommendations onlyβhumans make all decisions
- No personal data stored beyond submission content
- Full audit trail of AI suggestions vs. human decisions
The feature is available immediately for Rust NYC and will be open-sourced for other meetup organizers.
Q: Does the AI automatically accept or reject talks?
A: No. The AI provides scores and suggestions visible only to organizers. All accept/decline decisions require explicit human action.
Q: Is my submission data used to train AI models?
A: No. We use OpenAI's API, which does not use API data for training. Submission content is processed but not retained by OpenAI.
Q: Can I opt out of AI analysis?
A: Yes. Submitters can uncheck "Allow AI-assisted review" on the form. Organizers can disable Co-Pilot at the channel or guild level.
Q: What if the AI score is wrong?
A: Organizers can override any AI analysis with one command. Overrides are logged for continuous improvement.
Q: Who can see AI scores?
A: Only organizers with access to the #organizers channel. Scores are never shared with submitters.
Q: Is the scoring rubric transparent?
A: Yes. The rubric criteria and weights are documented and can be customized per community.
| Phase | Scope | Duration | Dependencies |
|---|---|---|---|
| Phase 1 | Rubric scoring + urgency detection | 2 weeks | None |
| Phase 2 | Suggested tags + enhanced Discord notifications | 1 week | Phase 1 |
| Phase 3 | Weekly digest cron job | 1 week | Phase 1 |
| Phase 4 | Draft replies slash command | 2 weeks | Discord slash command registration |
| Phase 5 | Organizer dashboard (optional) | 3 weeks | All phases |
The autothread module (backend/autothread/logic.ts) provides proven patterns:
| Pattern | Location | Reuse For |
|---|---|---|
| OpenAI integration | logic.ts:100-160 (generateAIThreadName) | All AI calls |
| JSON response parsing | logic.ts:130-145 | Score/tag parsing |
| Prompt construction | logic.ts:105-125 | Rubric prompts |
| Error handling | logic.ts:150-160 | Graceful degradation |
| Mode guards (plan/dry_run/live) | logic.ts:200-250 | Testing without side effects |
| Namespace isolation | store.ts | Sandbox testing of Co-Pilot |
For orchestrator follow-up:
- Create
backend/copilot/module structure with type definitions - Implement rubric scoring (highest value, lowest complexity)
- Add
copilot_analysestable migration - Integration test with existing submission flow
- Discord notification enhancement with score badges
- Cron job for weekly digest
- Slash command registration for
/copilotcommands
π’ **New Talk Submission**
**Speaker:** Alice Chen
**Topic:** Building a Custom Async Runtime in Rust
**π€ Co-Pilot Analysis:**
βββββββββββββββββββββββββββββββββββββββββββ
β Score: π 85/100 β
β ββ Topic Fit: 92 β
β ββ Novelty: 78 β
β ββ Clarity: 88 β
β ββ Speaker Exp: 82 β
β β
β β° URGENCY: HIGH β
β ββ "Visiting NYC Feb 12-16 only" β
β β
β Tags: `deep-dive` `async` `advanced` β
βββββββββββββββββββββββββββββββββββββββββββ
[View Submission] [Override Analysis] [Draft Reply]
// Environment variables
COPILOT_ENABLED=true|false // Master switch
COPILOT_MODEL=gpt-4o-mini // AI model
COPILOT_DAILY_LIMIT=100 // API call cap
COPILOT_SCORE_THRESHOLD_STRONG=80 // Fast-track threshold
COPILOT_SCORE_THRESHOLD_WEAK=40 // Needs-work threshold
COPILOT_DIGEST_DAY=1 // 0=Sun, 1=Mon, etc.
COPILOT_DIGEST_HOUR=9 // Hour in UTC
End of RFC