diff --git a/wg-events/COMMITTEE-HOWTO.md b/wg-events/COMMITTEE-HOWTO.md new file mode 100644 index 0000000..ce02408 --- /dev/null +++ b/wg-events/COMMITTEE-HOWTO.md @@ -0,0 +1,432 @@ +# Committee Member How-To + +Step-by-step guide for wg-events committee members handling grant +applications, from arrival through reimbursement. + +--- + +## 1. Moderating Incoming Messages + +The events-grants@ list is moderated. Non-subscribers can send to it +but their messages are held for moderator approval. + +### Check for held messages + +Visit: + + https://webmod.apache.org/ + +Log in with your Apache credentials. Select the `events-grants` list. +Held messages appear in queue. For each: + +- **Approve** if it's a legitimate application (matches one of our + subject formats: `[TRAVEL GRANT]`, `[MEETUP]`, `[SPRINT]`, + `[SUMMIT]`, `[MATERIALS]`) +- **Reject** if it's spam or clearly not an application +- **Hold** if you're unsure -- another moderator will see it + +--- + +## 2. Acknowledging a New Application + +When a new application arrives on-list: + +1. Reply on-list within 5 business days: + +``` +Subject: Re: [TRAVEL GRANT] Name -- Conference, City, Date + +Hi [Name], + +Thank you for your application. I've received it and will begin +evaluation. You can expect a decision within 15 business days. + +If we need any additional information, we'll reply to this thread. + +-- [Your name], wg-events committee +``` + +2. Create the SVN record (see Section 5 below). + +--- + +## 3. Evaluating a Speaker Travel Application + +### 3a. Cost estimation (using the SKILL) + +Use public flight/hotel search to verify the applicant's stated costs. +You can do this manually or use the AI-assisted skill. + +**Manual method:** + +1. Go to https://flights.google.com +2. Search: origin city → destination city, dates matching ~2 days + before conference start to ~1 day after end +3. Note the median economy fare (not cheapest redeye, not business) +4. Go to https://www.booking.com or Google Hotels +5. Search the conference city for those dates +6. Look for 3-star hotels within 3 miles of the venue +7. Note the median nightly rate + +**AI-assisted method:** + +If you have an AI assistant available, you can ask it to estimate +travel costs using the procedure in SKILL.md: + +``` +Estimate travel costs for a speaker travel grant: +- From: [origin city] +- To: [destination city] +- Conference dates: [dates] +- Hotel nights: [N] +- Venue address: [address] + +Use public sources only (Google Flights, Booking.com, Skyscanner). +Produce a formatted cost estimate per the SKILL.md template. +``` + +The assistant should search public sources and produce a formatted +estimate. Verify the output against your own spot-check before posting. + +**Post the estimate to the list:** + +``` +Subject: Re: [TRAVEL GRANT] Name -- Conference, City, Date + +COST ESTIMATE +============= +Generated: [today's date] +Source: Google Flights, Booking.com + +Flight (economy, median fare): $[X] +Hotel ([N] nights x $[rate]): $[X] +Ground transport (standard): $[X] +Conference registration: $[X] (or "waived for speakers") + ----- +ESTIMATED TOTAL: $[X] + +Applicant's stated total: $[X] +Variance: [X]% [over/under] + +ASSESSMENT: [Reasonable / High / Low] +``` + +### 3b. Scoring + +Score the application using the 5 criteria from `evaluation-criteria.md`. +Post your evaluation to the list: + +``` +Subject: Re: [TRAVEL GRANT] Name -- Conference, City, Date + +EVALUATION: [Applicant Name] -- [Conference], [Date] +================================================== + +Need: [0-3] -- [one-line rationale] +Apache Relevance: [0-3] -- [one-line rationale] +Conference Quality: [0-3] -- [one-line rationale] +Geographic/Demographic: [0-3] -- [one-line rationale] +Cost Reasonableness: [0-3] -- [one-line rationale] + ----- +TOTAL: [X/15] + +RECOMMENDATION: [APPROVE / DENY / DISCUSS] +AMOUNT: $[recommended amount] +NOTES: [any conditions] +``` + +### 3c. Decision + +- **Two evaluations agree (score >= 8):** Approved. Chair posts + approval notice. 72-hour objection window on list. +- **Disagreement:** Full committee discussion on-list. Majority vote. +- **Chair breaks ties.** + +### 3d. Inter-continental override + +If the travel crosses continents: +- Standard evaluation is not sufficient +- Requires explicit `+1` from a majority of committee members +- Chair posts: "This is inter-continental travel. Requesting override + votes. +1 to approve, -1 to deny." +- 5 business day vote window + +--- + +## 4. Evaluating Meetup/Sprint/Materials Requests + +These are simpler: + +**Meetups (<$400):** +- Single committee member can approve +- Reply on-list: "Approved. Please submit receipts after the event." +- 48-hour objection window + +**Sprints ($1,800):** +- Two committee members must confirm +- Check: Are experienced reviewers confirmed to attend? +- Reply on-list with approval + any conditions + +**Summits ($6,000):** +- **First:** Verify the PMC approval link is valid (click it, confirm + the PMC actually discussed and approved) +- Full committee scores it (same rubric adapted for events) +- Requires ComDev PMC vote (since >$2,000) +- Chair posts recommendation to dev@community with `[VOTE]` subject + +**Materials (pre-approval):** +- Under $100: single committee member approves +- $100-$200: single confirmation sufficient +- Reply: "Pre-approved for up to $[X]. Purchase and submit receipts." + +--- + +## 5. Updating the SVN Repository + +### One-time setup + +Check out the private repo (requires ComDev PMC membership): + +```bash +svn checkout https://svn.apache.org/repos/private/pmc/comdev/events-grants \ + ~/comdev-private/events-grants +``` + +### Creating a new grant record + +When you acknowledge an application, create the record file: + +```bash +cd ~/comdev-private/events-grants/FY2027/speaker-travel/ +# (or meetups/, sprints/, summits/, materials/ as appropriate) + +# Create from template +cp ../../templates/speaker-travel.txt 2027-03-garcia-kubecon-eu.txt + +# Edit -- fill in applicant details, set Status: applied +vi 2027-03-garcia-kubecon-eu.txt + +# Commit +svn add 2027-03-garcia-kubecon-eu.txt +svn ci -m "[events-grants] [speaker-travel] garcia-kubecon-eu: application received" +``` + +### Updating status after approval + +```bash +cd ~/comdev-private/events-grants/FY2027/speaker-travel/ +vi 2027-03-garcia-kubecon-eu.txt +# Change Status: applied → approved +# Fill in: Evaluated by, Score, Decision, Decision date, Approved amount + +svn ci -m "[events-grants] [speaker-travel] garcia-kubecon-eu: APPROVED \$2800" +``` + +### Updating status after reimbursement + +```bash +vi 2027-03-garcia-kubecon-eu.txt +# Change Status: approved → reimbursed +# Fill in: Actual spend, Receipts filed, Reimbursed date, Deliverable URL + +svn ci -m "[events-grants] [speaker-travel] garcia-kubecon-eu: REIMBURSED \$2650" +``` + +### Updating summary.yml + +After any approval or reimbursement, update the ledger: + +```bash +cd ~/comdev-private/events-grants/FY2027/ +vi summary.yml +# Add/update the grant entry in the relevant category +# Recompute totals + +svn ci -m "[events-grants] totals: updated after garcia approval" +``` + +Or use the helper script (see Section 7 below). + +--- + +## 6. Notifying the Applicant + +### Approval notification + +``` +Subject: Re: [TRAVEL GRANT] Name -- Conference, City, Date + +Hi [Name], + +Your speaker travel grant has been approved for $[amount]. + +REIMBURSEMENT PROCESS: +1. Attend the conference and give your talk +2. Within 30 days, provide at least one deliverable: + - Blog post, published slides, video link, or trip report +3. Within 30 days, email your receipts to this list: + - Economy airfare receipt/confirmation + - Hotel receipt (itemized -- room + tax only, no minibar) + - Ground transport receipts (if claiming) +4. We will process reimbursement within 30 days of receiving + complete receipts + +IMPORTANT: +- Reimbursement covers actual costs up to $[amount] +- Keep all receipts (photos/scans are fine) +- Receipts must be itemized (credit card statements alone are + not sufficient) + +Congratulations, and thank you for representing Apache! + +-- [Your name], wg-events committee +``` + +### Denial notification + +``` +Subject: Re: [TRAVEL GRANT] Name -- Conference, City, Date + +Hi [Name], + +Thank you for your application. Unfortunately, we are unable to +approve this request. The primary factors were: + +- [Brief, specific reasons -- e.g., "The estimated costs + significantly exceeded market rates for this route" or + "Inter-continental travel was not approved by committee override"] + +Suggestions for future applications: +- [Specific, actionable -- e.g., "Consider applying for a + same-continent conference" or "Provide booking screenshots to + support your cost estimates"] + +We encourage you to apply again in the future. + +-- [Your name], wg-events committee +``` + +--- + +## 7. Helper Scripts + +Scripts live in `wg-events/bin/`. Both use inline PEP 723 metadata so +they run with `uv run` (no manual install step). + +### bin/update-summary.py + +Recalculates `summary.yml` totals from individual grant `.txt` files. + +```bash +cd ~/comdev-private/events-grants/ +uv run /path/to/comdev-working-groups/wg-events/bin/update-summary.py --fy FY2027 +svn ci -m "[events-grants] totals: recalculated from grant files" +``` + +### bin/validate-application.py + +Quick sanity check on a pasted application form -- verifies all +required fields are present and filled in. + +```bash +# From clipboard +pbpaste | uv run /path/to/comdev-working-groups/wg-events/bin/validate-application.py + +# From a saved file +uv run /path/to/comdev-working-groups/wg-events/bin/validate-application.py < application.txt +``` + +Output: lists any missing or blank required fields, or confirms the +form is complete. + +--- + +## 8. Quarterly Reporting + +Every quarter, the chair produces a public report for +dev@community.apache.org. This shows aggregate numbers only -- no +names, no dollar amounts for individual grants. + +```bash +# Generate from summary.yml +cd ~/comdev-private/events-grants/FY2027/ +uv run bin/update-summary.py --fy FY2027 +# Then manually write the report email: +``` + +**Report template:** + +``` +Subject: [wg-events] Q[N] FY2027 Report + +Hi dev@, + +Here's the quarterly summary for the events grants program: + +SPEAKER TRAVEL GRANTS + Awarded this quarter: [N] + Total awarded FY to date: [N] of [capacity] + Continents represented: [list] + +COMMUNITY EVENTS FUNDED + Meetups this quarter: [N] + Sprints this quarter: [N] + Summits this quarter: [N] + Total events FY to date: [N] + Countries represented: [list] + +DELIVERABLES PRODUCED + Blog posts: [N] + Published slide decks: [N] + Trip reports: [N] + +[Optional: brief narrative about notable outcomes] + +Full details are in the private PMC records. + +-- [Chair name], wg-events +``` + +--- + +## 9. Reimbursement Mechanics + +Once receipts are received and validated: + +1. Verify receipts match the approved scope (economy travel, + mid-range hotel, no alcohol, no upgrades) +2. Calculate reimbursement amount (lesser of: actual spend or + approved amount) +3. Update SVN record to `receipts_filed` +4. Email ASF Treasurer (treasurer@apache.org) with: + - Recipient name and email + - Amount to reimburse + - Brief description ("Speaker Travel Grant -- [Conference]") + - Attach receipts +5. Treasurer processes payment +6. Once confirmed, update SVN record to `reimbursed` +7. Update summary.yml + +--- + +## 10. Annual Checklist + +At the start of each fiscal year: + +```bash +cd ~/comdev-private/events-grants/ +mkdir FY20XX +mkdir FY20XX/{speaker-travel,meetups,sprints,summits,materials} +cp FY2027/summary.yml FY20XX/summary.yml +# Edit: reset all grants lists to empty, reset totals to 0, +# update budget numbers per PMC decision +vi FY20XX/summary.yml +svn add FY20XX +svn ci -m "[events-grants] FY20XX: initialized" +``` + +At end of fiscal year: +- Ensure all outstanding grants are resolved (reimbursed or withdrawn) +- Produce final annual summary +- Report unspent funds to ComDev PMC +- Archive completed FY (no deletion -- history stays in SVN) diff --git a/wg-events/README.md b/wg-events/README.md new file mode 100644 index 0000000..5c3a73f --- /dev/null +++ b/wg-events/README.md @@ -0,0 +1,119 @@ +# wg-events: Event Support & Speaker Travel (PROPOSED) + +> **Status: PROPOSED / RFC** +> +> This working group and its processes are not yet funded or active. +> This document describes how we believe the program could work if +> budget is approved. Nothing here is final. +> +> **Discussion of any aspect of this proposal should go to +> dev@community.apache.org** -- not to this repo's issue tracker. +> Please use subject prefix `[wg-events]` for threading. + +--- + +## Charter (proposed) + +wg-events manages the intake, evaluation, and disbursement of ComDev +event support funds. This includes: + +- Evening meetup funding for ALC chapters and project communities +- Contributor sprint underwriting +- Single-day project summit support +- Speaker Travel Grants for non-Apache conferences +- Event materials reimbursement + +## Structural Rules + +- **Chair:** [TBD -- elected by WG members, confirmed by ComDev PMC] +- **Membership:** Open to any ASF committer; active participation + required (at least one action per quarter) +- **Sunset clause:** If this WG produces no funded events in 6 months, + it dissolves and responsibility reverts to the ComDev PMC directly +- **Reporting:** Quarterly summary to dev@community.apache.org showing + events funded, amounts disbursed, and outcomes reported +- **Decision-making:** Lazy consensus on the WG private list for + routine grants; PMC vote required for contingency spend + +## Coordination + +This WG operates in close coordination with: + +- **VP Conferences / planners@apachecon.com** -- for events co-located + with Community Over Code or using ApacheCon infrastructure +- **Travel Assistance Committee (TAC)** -- Speaker Travel Grant criteria + and process should align with TAC precedent +- **VP Brand Management** -- trademark review for event naming + +## Programs + +| Program | Process | +|---------|---------| +| Evening meetups | [meetup-request.md](meetup-request.md) | +| Contributor sprints | [sprint-request.md](sprint-request.md) | +| Single-day summits | [summit-request.md](summit-request.md) | +| Speaker Travel Grants | [speaker-travel-grant.md](speaker-travel-grant.md) | +| Event materials | [materials-reimbursement.md](materials-reimbursement.md) | + +Budget allocations across these programs are managed internally by the +ComDev PMC and are not published to avoid gaming the system. + +## Mailing List + +All grant requests and processing happen on a private mailing list: + + events-grants@community.apache.org + +Subscribers: ComDev PMC members + Travel Grant Committee members (TBD). + +Private because applications may contain personal financial information +(employer status, inability to self-fund, etc.) that applicants should +not be required to share publicly. + +**All processing happens on-list in structured formats** defined in +this directory. No side-channel approvals. + +## Record-Keeping + +Actual grant amounts, award decisions, and financial records are stored +in the private ComDev PMC SVN repository: + + https://svn.apache.org/repos/private/pmc/comdev/ + +This information is not public. Only aggregate statistics (number of +events funded, number of grants awarded) are reported in the quarterly +summary to dev@community.apache.org. + +## Eligibility (all programs) + +This fund targets projects and contributors who **cannot get support +elsewhere**: + +- Individual contributors whose employers don't cover travel/events +- Communities growing in regions without big-tech presence +- ALC chapters hosting regular community events + +**Not eligible:** + +- Projects with multiple vendor sponsors already funding their events +- Speakers whose employers routinely cover conference travel +- Events with existing corporate sponsorship covering costs + +Principle: **ASF resources go where the market won't.** + +## Files in this directory + +| File | Purpose | +|------|---------| +| README.md | This file -- WG charter and overview | +| speaker-travel-grant.md | Full process for Speaker Travel Grants | +| application-form.md | Copy-paste form for applicants | +| evaluation-criteria.md | How the committee evaluates applications | +| meetup-request.md | Process for meetup funding requests | +| sprint-request.md | Process for sprint funding requests | +| summit-request.md | Process for summit funding requests | +| materials-reimbursement.md | How to get event materials reimbursed | +| svn-data-format.md | Private SVN directory structure and record formats | +| summary-format.md | summary.yml schema reference and field documentation | +| COMMITTEE-HOWTO.md | Step-by-step operations guide for committee members | +| SKILL.md | AI-assisted cost estimation skill | diff --git a/wg-events/SKILL.md b/wg-events/SKILL.md new file mode 100644 index 0000000..9fb5c98 --- /dev/null +++ b/wg-events/SKILL.md @@ -0,0 +1,126 @@ +# SKILL: Travel Grant Cost Estimation + +## Purpose + +When a Speaker Travel Grant application arrives, a committee member +(or an AI assistant) uses this procedure to produce an independent +cost estimate for the proposed trip. This estimate is compared against +the applicant's stated costs to check reasonableness. + +## Inputs (from application form) + +- Origin city/country +- Destination city/country +- Conference dates (to determine travel dates) +- Number of hotel nights needed + +## Estimation Procedure + +### 1. Airfare Estimate + +Use **public flight search engines** to estimate economy class airfare: + +- **Google Flights** (https://flights.google.com): Search origin → + destination for dates ~2 days before conference start and ~1 day + after conference end. Note the median economy fare. +- **Skyscanner** (https://skyscanner.com): Cross-reference for the + same route/dates. +- **Kiwi.com** (https://kiwi.com): Useful for multi-city or budget + carrier routes. + +Record: +- Cheapest reasonable fare (not 3-stop redeyes) +- Median fare across options +- Use median as the estimate + +**Rules of thumb (2026):** +- US domestic: $250-600 depending on route/lead time +- US to Europe: $600-1200 +- US to Asia: $800-1500 +- Intra-Europe: $100-400 +- Within Asia: $200-600 +- Any route to/from remote locations: add 30% premium + +### 2. Hotel Estimate + +Use **public hotel search** to estimate mid-range accommodation: + +- **Google Hotels** or **Booking.com**: Search for the conference + city on the conference dates. +- Look for: 3-star hotel within reasonable distance of venue +- If the conference has a hotel block rate published on their + website, use that. + +Record: +- Conference hotel block rate (if published) +- Median 3-star rate near venue +- Use whichever is lower as the estimate + +**Rules of thumb (2026):** +- US major cities: $150-250/night +- US smaller cities: $100-150/night +- European cities: $120-200/night +- Asian cities: $60-150/night +- Conference hotels (block rate): often 10-20% below market + +### 3. Ground Transport + +Standard estimates (don't research individually): +- Airport transfers (round trip): $50-100 (US/Europe), $20-50 (Asia) +- Local transit during conference: $20-50 + +### 4. Conference Registration + +- Check conference website for registration fee +- If early-bird is still available, use that +- Many conferences waive fees for speakers -- check and note + +### 5. Compile Estimate + +``` +COST ESTIMATE: [Applicant] -- [Conference] +========================================== +Generated: [date] +Source: Public fare search (Google Flights, Booking.com) + +Flight (economy, median fare): $[X] +Hotel ([N] nights x $[rate]): $[X] +Ground transport (standard): $[X] +Conference registration: $[X] (or "waived for speakers") + ----- +ESTIMATED TOTAL: $[X] + +Applicant's stated total: $[X] +Variance: $[X] ([over/under] estimate) + +ASSESSMENT: [Reasonable / High / Low] +NOTES: [any context -- peak dates, limited routes, etc.] +``` + +### 6. Post to List + +Post the estimate to events-grants@ as a reply to the application +thread. The evaluating committee members use this as input for the +"Cost Reasonableness" criterion (0-3 score). + +## Variance Guidelines + +- Within 15% of estimate: Reasonable (score 3) +- 15-30% over estimate: Slight premium, justifiable? (score 2) +- 30-50% over estimate: Needs explanation (score 1) +- >50% over estimate: Ask applicant to clarify or revise (score 0) + +## Tools NOT to Use + +- Do NOT use employer-internal travel tools (AWS Travel, Concur, etc.) +- Do NOT use private/corporate rate databases +- All estimates must be reproducible from public sources so the + applicant could verify the estimate themselves + +## When to Skip Estimation + +- If the requested amount is under $1,000, a formal cost estimate is + optional (committee member can approve based on face-value + reasonableness) +- If the applicant provides booking screenshots showing actual prices, + those can substitute for an independent estimate diff --git a/wg-events/application-form.md b/wg-events/application-form.md new file mode 100644 index 0000000..59778cb --- /dev/null +++ b/wg-events/application-form.md @@ -0,0 +1,88 @@ +# Speaker Travel Grant Application + +Copy and paste the form below into an email to +events-grants@community.apache.org with subject line: + + [TRAVEL GRANT] Your Name -- Conference Name, City, Date + +--- + +## Application Form + +``` +SPEAKER TRAVEL GRANT APPLICATION +================================= + +1. ABOUT YOU + Name: + Apache ID (if any): + Email: + Employer (or "independent/unemployed/student"): + Does your employer provide conference travel funding? [Yes/No/Partial]: + If partial, what does your employer cover? + +2. CONFERENCE DETAILS + Conference name: + Conference URL: + Conference dates: + Conference location (city, country): + Expected attendance (approximate): + Is this an established conference (>2 years running)? [Yes/No]: + +3. YOUR TALK + Talk title: + Talk abstract (2-3 sentences): + Has the talk been accepted? [Yes/Submitted/Invited]: + If accepted, link to acceptance or program page: + Which Apache project(s) does the talk cover? + +4. TRAVEL DETAILS + Traveling from (city, country): + Estimated airfare (economy class): + Estimated hotel (# nights x nightly rate): + Conference registration fee (if any): + Other costs (ground transport, visa, etc.): + TOTAL ESTIMATED COST: + +5. AMOUNT REQUESTED + Amount requested from ComDev (up to $3,000): + Are you receiving partial funding from another source? [Yes/No]: + If yes, how much and from whom? + +6. EXPECTED DELIVERABLES + (Check all you commit to providing after the event) + [ ] Blog post on blogs.apache.org or personal blog + [ ] Slides published publicly (SpeakerDeck, GitHub, etc.) + [ ] Video recording shared (if conference records) + [ ] Trip report email to dev@community.apache.org + [ ] Social media post(s) about the talk/event + +7. ANYTHING ELSE + (Optional: context on why this grant matters to you or your + community, prior speaking experience, etc.) +``` + +--- + +## What happens next + +1. Your application arrives on the private events-grants@ list +2. A committee member acknowledges receipt within 5 business days +3. The committee evaluates per [evaluation-criteria.md](evaluation-criteria.md) +4. Decision communicated within 15 business days of submission +5. If approved, you'll receive reimbursement instructions + +## Important notes + +- Maximum grant: $3,000 +- We will independently verify your cost estimates by checking current + economy airfare rates and reasonable hotel options within 3 miles of + the venue. Inflated requests will be rejected. +- **Same-continent travel is preferred.** Inter-continental travel + requests (e.g., US to Europe, Asia to Americas) require a full + committee override and are approved only in exceptional cases. +- Grants are reimbursement-based: you pay upfront, submit receipts + after the event, and receive reimbursement +- You must deliver at least ONE of the deliverables in section 6 + within 30 days of the event +- One grant per person per fiscal year diff --git a/wg-events/bin/update-summary.py b/wg-events/bin/update-summary.py new file mode 100644 index 0000000..e9e9f83 --- /dev/null +++ b/wg-events/bin/update-summary.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +""" +Recalculate summary.yml totals from individual grant .txt files. + +Usage: + uv run update-summary.py [--fy FY2027] + +Requires: pyyaml +""" +# /// script +# requires-python = ">=3.9" +# dependencies = ["pyyaml"] +# /// + +import sys +import re +from pathlib import Path +import yaml + +FY = sys.argv[2] if len(sys.argv) > 2 and sys.argv[1] == "--fy" else "FY2027" +BASE = Path.home() / "comdev-private" / "events-grants" / FY + +CATEGORIES = { + "speaker_travel": "speaker-travel", + "meetups": "meetups", + "sprints": "sprints", + "summits": "summits", + "materials": "materials", +} + + +def parse_grant_file(path): + """Extract key fields from a .txt grant record.""" + content = path.read_text() + fields = {} + for line in content.splitlines(): + if ":" in line and not line.startswith(" ") and not line.startswith("#"): + key, _, val = line.partition(":") + fields[key.strip().lower()] = val.strip() + return fields + + +def main(): + summary_path = BASE / "summary.yml" + if not summary_path.exists(): + print(f"ERROR: {summary_path} not found") + sys.exit(1) + + summary = yaml.safe_load(summary_path.read_text()) + summary["last_updated"] = str(__import__("datetime").date.today()) + + for cat_key, dir_name in CATEGORIES.items(): + cat_dir = BASE / dir_name + if not cat_dir.exists(): + continue + + grants = [] + approved_total = 0 + disbursed_total = 0 + approved_count = 0 + disbursed_count = 0 + + for f in sorted(cat_dir.glob("*.txt")): + fields = parse_grant_file(f) + status = fields.get("status", "applied").lower() + approved = int(re.sub(r"[^\d]", "", fields.get("approved amount", "0")) or 0) + disbursed = int(re.sub(r"[^\d]", "", fields.get("actual spend", "0")) or 0) + + if status not in ("denied", "withdrawn"): + approved_count += 1 + approved_total += approved + if status == "reimbursed": + disbursed_count += 1 + disbursed_total += disbursed + + grants.append({ + "id": f.stem, + "approved": approved, + "disbursed": disbursed, + "status": status, + }) + + budget = summary[cat_key]["budget"] + summary[cat_key]["grants"] = grants + summary[cat_key]["totals"] = { + "approved_count": approved_count, + "approved_amount": approved_total, + "disbursed_count": disbursed_count, + "disbursed_amount": disbursed_total, + "remaining": budget - approved_total, + } + + # Grand totals + grand_budget = sum(summary[k]["budget"] for k in CATEGORIES) + grand_approved = sum(summary[k]["totals"]["approved_amount"] for k in CATEGORIES) + grand_disbursed = sum(summary[k]["totals"]["disbursed_amount"] for k in CATEGORIES) + summary["grand_totals"] = { + "budget": grand_budget, + "approved_amount": grand_approved, + "disbursed_amount": grand_disbursed, + "remaining": grand_budget - grand_approved, + } + + summary_path.write_text(yaml.dump(summary, default_flow_style=False, sort_keys=False)) + print(f"Updated {summary_path}") + print(f" Approved: ${grand_approved:,} / ${grand_budget:,}") + print(f" Disbursed: ${grand_disbursed:,}") + print(f" Remaining: ${grand_budget - grand_approved:,}") + + +if __name__ == "__main__": + main() diff --git a/wg-events/bin/validate-application.py b/wg-events/bin/validate-application.py new file mode 100644 index 0000000..771cb06 --- /dev/null +++ b/wg-events/bin/validate-application.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 +""" +Validate a pasted application form for completeness. + +Usage: + uv run validate-application.py < application.txt + pbpaste | uv run validate-application.py + +Checks that all required fields are filled in (not blank after the colon). +""" +# /// script +# requires-python = ">=3.9" +# dependencies = [] +# /// + +import sys + +REQUIRED_FIELDS = { + "SPEAKER TRAVEL": [ + "Name:", "Email:", "Conference name:", "Conference dates:", + "Conference location", "Talk title:", "Has the talk been accepted?", + "Traveling from", "TOTAL ESTIMATED COST:", "Amount requested", + ], + "MEETUP FUNDING": [ + "Name:", "Email:", "Date:", "Venue", "Expected attendance:", + "TOTAL REQUESTED", + ], + "SPRINT FUNDING": [ + "Name:", "Apache ID:", "Date:", "Venue", "Apache project:", + "TOTAL REQUESTED", "reviewers will be present", + ], + "SUMMIT FUNDING": [ + "Name:", "Apache ID:", "Date:", "Venue", "Apache project:", + "TOTAL REQUESTED", "PMC APPROVAL", + ], + "MATERIALS PRE-APPROVAL": [ + "Event name:", "Event date:", "TOTAL REQUESTED:", "Name:", "Email:", + ], +} + + +def main(): + text = sys.stdin.read() + + # Detect form type + form_type = None + for key in REQUIRED_FIELDS: + if key in text: + form_type = key + break + + if not form_type: + print("ERROR: Could not identify form type.") + print("Expected one of:", list(REQUIRED_FIELDS.keys())) + sys.exit(1) + + print(f"Form type: {form_type}") + print() + + missing = [] + for field in REQUIRED_FIELDS[form_type]: + # Find the field and check if there's content after it + idx = text.find(field) + if idx == -1: + missing.append(f"MISSING FIELD: '{field}' not found in form") + continue + # Get the rest of the line after the field label + line_end = text.find("\n", idx) + if line_end == -1: + line_end = len(text) + value = text[idx + len(field):line_end].strip() + if not value or value in ("$", "$[X]", "[", ""): + missing.append(f"BLANK: '{field}' has no value") + + if missing: + print(f"ISSUES ({len(missing)}):") + for m in missing: + print(f" - {m}") + sys.exit(1) + else: + print("All required fields present and filled.") + sys.exit(0) + + +if __name__ == "__main__": + main() diff --git a/wg-events/evaluation-criteria.md b/wg-events/evaluation-criteria.md new file mode 100644 index 0000000..f6e1bca --- /dev/null +++ b/wg-events/evaluation-criteria.md @@ -0,0 +1,98 @@ +# Speaker Travel Grant -- Evaluation Criteria + +The Travel Grant Committee uses the following criteria to evaluate +applications. Each criterion is scored 0-3 (0=does not meet, +1=partially meets, 2=meets, 3=strongly meets). Minimum score for +approval: 8/15. + +## Criteria + +### 1. Need (0-3) + +Does the applicant genuinely lack other funding sources? + +- 3: Independent/unemployed/student, no employer funding possible +- 2: Employer provides no travel budget for conferences +- 1: Employer covers partial costs but not enough for this trip +- 0: Employer would cover this if asked; applicant hasn't asked + +### 2. Apache Relevance (0-3) + +Does the talk advance awareness/adoption of Apache projects? + +- 3: Talk is primarily about an Apache project or The Apache Way +- 2: Talk features Apache technology as a major component +- 1: Talk mentions Apache projects among other technologies +- 0: No clear Apache connection + +### 3. Conference Quality (0-3) + +Is this a meaningful venue that reaches a relevant audience? + +- 3: Established conference (>3 years), >500 attendees, relevant + technical audience +- 2: Established regional conference or newer conference with strong + program committee +- 1: Smaller/newer event but still curated (has a CFP process) +- 0: Uncurated event, or event primarily run by a single vendor + +### 4. Geographic/Demographic Reach (0-3) + +Does this grant support underrepresented regions or communities? + +- 3: Speaker from a region with low ASF presence; event in a + region we're trying to grow +- 2: Either speaker OR event is in an underrepresented region +- 1: Standard region but speaker is from an underrepresented + demographic in tech +- 0: Both speaker and event are in well-represented regions + +### 5. Cost Reasonableness (0-3) + +Is the requested amount proportional to the trip? + +- 3: Request covers only necessary costs; estimate aligns with + market rates for the route/city +- 2: Slight premium but justifiable (peak travel dates, limited + flight options) +- 1: Some costs seem inflatable but within range +- 0: Request appears excessive for the trip described + +## Decision Process + +- Committee member posts evaluation to events-grants@ using + the [evaluation template](evaluation-template.md) +- Second committee member confirms or challenges within 5 days +- If two members agree (score >= 8): approved via lazy consensus +- If disagreement: full committee discussion, majority vote +- Chair breaks ties + +## Evaluation Template + +``` +EVALUATION: [Applicant Name] -- [Conference], [Date] +================================================== + +Need: [0-3] -- [one-line rationale] +Apache Relevance: [0-3] -- [one-line rationale] +Conference Quality: [0-3] -- [one-line rationale] +Geographic/Demographic: [0-3] -- [one-line rationale] +Cost Reasonableness: [0-3] -- [one-line rationale] + ----- +TOTAL: [X/15] + +RECOMMENDATION: [APPROVE / DENY / DISCUSS] +AMOUNT: $[recommended amount, may differ from request] +NOTES: [any conditions or suggestions] +``` + +## Disqualifying Factors (instant denial) + +- Applicant's employer is known to fund conference travel and + applicant has not demonstrated they asked and were denied +- Event is organized by applicant's employer as a product event +- Inter-continental travel without full committee override + (same-continent travel is the default expectation) +- Talk has not been accepted (speculative applications) +- Applicant received a grant in the current fiscal year +- Event conflicts with ASF Code of Conduct or values diff --git a/wg-events/materials-reimbursement.md b/wg-events/materials-reimbursement.md new file mode 100644 index 0000000..cea6783 --- /dev/null +++ b/wg-events/materials-reimbursement.md @@ -0,0 +1,94 @@ +# Event Materials Reimbursement -- Process + +## Overview + +Event organizers can be reimbursed up to $200 per event for materials +purchased locally. **All requests must be pre-approved** before purchase. + +## What's covered + +- Stickers (ASF logo, project logos) +- Name badges and lanyards +- Signage (directional signs, welcome banners -- printed locally) +- Power strips and extension cords (if venue doesn't provide) +- Markers, sticky notes, whiteboard supplies (for BarCamp/sprint) +- Printed handouts (getting started guides, etc.) + +## What's NOT covered + +- T-shirts (separate program -- ambassador kits) +- Food/drinks (covered under meetup/sprint/summit budgets) +- AV equipment purchases (rental is OK under sprint/summit) +- Anything that's primarily promotional for a company + +## Process + +### 1. Pre-approval request + +Copy the form below into an email to events-grants@community.apache.org +with subject: + + [MATERIALS] Pre-approval -- Event Name, Date + +### 2. Approval + +Committee member approves on-list (48hr lazy consensus for <$100; +single confirmation for $100-$200). + +### 3. Purchase + +Once approved, purchase the materials. + +### 4. Receipt submission + +Reply to the approval thread with receipts (photos or PDFs) and +subject: + + [MATERIALS] Receipts -- Event Name, Date -- $Amount + +### 5. Reimbursement + +Processed within 30 days of receipt submission. + +--- + +## Pre-Approval Request Form + +Copy and paste into your email: + +``` +MATERIALS PRE-APPROVAL REQUEST +=============================== + +1. EVENT + Event name: + Event date: + Event type: [Meetup / Sprint / Summit] + Associated funding request (if any): [link to approval thread] + +2. MATERIALS NEEDED + Item | Estimated Cost + ------------------------------|--------------- + [e.g., 100 stickers] | $[X] + [e.g., 20 name badges] | $[X] + [e.g., directional signage] | $[X] + [e.g., 2 power strips] | $[X] + | + TOTAL REQUESTED: | $[X] (max $200) + +3. PURCHASE PLAN + Where will you buy these? (local print shop, office supply + store, online vendor, etc.): + +4. ORGANIZER + Name: + Apache ID (if any): + Email: +``` + +## Limits + +- Up to $200 per event +- Must be pre-approved before purchase +- Receipts required for reimbursement (photos are fine) +- One materials claim per event diff --git a/wg-events/meetup-request.md b/wg-events/meetup-request.md new file mode 100644 index 0000000..20716b5 --- /dev/null +++ b/wg-events/meetup-request.md @@ -0,0 +1,74 @@ +# Meetup Funding Request -- Process + +## Overview + +ComDev funds up to $400 per meetup for food and supplies. Venues are +expected to be donated. Target: 24 meetups/year (2/month). Priority +given to ALC chapters. + +## Request Format + +Copy and paste the form below into an email to +events-grants@community.apache.org. Fill in all fields. Use subject +line: + + [MEETUP] Project/ALC -- City, Date + +``` +MEETUP FUNDING REQUEST +====================== + +1. ORGANIZER + Name: + Apache ID (if any): + ALC Chapter (if applicable): + Email: + +2. EVENT DETAILS + Date: + Time: + Venue (name + address): + Venue cost: $0 (donated) / $[amount if not free] + Expected attendance: + Event page URL (if exists): + +3. PROJECT/TOPIC + Which Apache project(s) or topic area? + Brief description of planned activity (talks, demos, social): + +4. BUDGET + Food (pizza/catering, describe): $ + Drinks: $ + Supplies (plates, napkins, etc.): $ + Other (specify): $ + TOTAL REQUESTED (max $400): $ + +5. SPONSORSHIP + Are you seeking local sponsors? [Yes/No]: + If yes, what is the sponsor covering? +``` + +## Approval Process + +- **Under $300:** Single committee member approval (lazy consensus, + 48hr objection window) +- **$300-$400:** Two committee members confirm + +Turnaround: 5 business days. + +## After the Event + +Post a brief report to dev@community.apache.org: +- How many people attended +- What happened (topics, any notable outcomes) +- Photo (optional, with consent) + +Submit receipts to events-grants@ for reimbursement. + +## Notes + +- Venues are expected to be donated. If venue rental is required, + this becomes a sprint or summit request (higher budget tier). +- Priority goes to ALC chapters, then project communities without + existing meetup sponsorship. +- One funded meetup per organizer per month maximum. diff --git a/wg-events/speaker-travel-grant.md b/wg-events/speaker-travel-grant.md new file mode 100644 index 0000000..c7f4f83 --- /dev/null +++ b/wg-events/speaker-travel-grant.md @@ -0,0 +1,100 @@ +# Speaker Travel Grant -- Process + +## Overview + +The Speaker Travel Grant provides up to $3,000 to ASF contributors +who have talks accepted at non-Apache conferences but lack employer +funding for travel. + +## End-to-end process + +### 1. Application + +Applicant copies the form from [application-form.md](application-form.md) +and emails it to events-grants@community.apache.org with subject: + + [TRAVEL GRANT] Name -- Conference, City, Date + +### 2. Acknowledgment (within 5 business days) + +A committee member replies on-list confirming receipt and noting +any missing information. + +### 3. Cost Estimation + +A committee member (or AI-assisted skill -- see SKILL.md) estimates +reasonable costs for the trip: + +- Flight: based on public fare comparison (Google Flights, Skyscanner) +- Hotel: based on conference-block rate or mid-range hotel near venue +- Ground transport: standard estimate for the city + +The estimate is posted to the list as a sanity check against the +applicant's stated costs. + +### 4. Evaluation (within 15 business days) + +Two committee members score the application using +[evaluation-criteria.md](evaluation-criteria.md) and post evaluations +to the list. + +- Both score >= 8/15: approved (lazy consensus, 72hr objection window) +- Disagreement: full committee discussion, majority vote +- Chair breaks ties + +### 5. Notification + +Committee chair emails the applicant (cc: events-grants@) with: + +- **If approved:** Confirmation of grant amount, reimbursement + instructions, deliverable expectations, and deadline +- **If denied:** Brief explanation of which criteria were not met, + and suggestion for strengthening future applications + +### 6. Event attendance + +Applicant attends the conference and gives their talk. + +### 7. Deliverables (within 30 days of event) + +Applicant provides at least ONE of: +- Blog post (blogs.apache.org or personal) +- Slides published publicly +- Video link (if recorded) +- Trip report to dev@community.apache.org +- Social media coverage + +### 8. Reimbursement + +Applicant emails receipts to events-grants@. Committee chair +triggers reimbursement through ASF Treasurer. + +Reimbursement covers actual costs up to the approved amount. +No advance payment; receipts required. + +### 9. Reporting + +Committee chair logs the grant in the quarterly report: +- Applicant name, conference, amount disbursed +- Link to deliverable(s) + +## Timeline summary + +| Step | Owner | SLA | +|------|-------|-----| +| Submit application | Applicant | Anytime | +| Acknowledge receipt | Committee | 5 business days | +| Post cost estimate | Committee | 10 business days | +| Score + decision | Committee (2 members) | 15 business days | +| Notify applicant | Chair | 2 business days after decision | +| Attend event | Applicant | Per conference dates | +| Submit deliverable | Applicant | 30 days post-event | +| Submit receipts | Applicant | 30 days post-event | +| Process reimbursement | Chair + Treasurer | 30 days after receipts | + +## Capacity + +10 grants per fiscal year at up to $3,000 each ($30,000 total). +Applications are processed on a rolling basis until funds are +exhausted. If budget is exhausted, remaining applications are +waitlisted for the next fiscal year. diff --git a/wg-events/sprint-request.md b/wg-events/sprint-request.md new file mode 100644 index 0000000..4b7bb3c --- /dev/null +++ b/wg-events/sprint-request.md @@ -0,0 +1,71 @@ +# Contributor Sprint Funding Request -- Process + +## Overview + +ComDev funds up to $1,800 per contributor sprint (full day, ~15 +people). Covers venue + catering for a focused coding day. Target: +10 sprints/year. + +## Request Format + +Copy and paste the form below into an email to +events-grants@community.apache.org. Fill in all fields. Use subject +line: + + [SPRINT] Project -- City, Date + +``` +SPRINT FUNDING REQUEST +====================== + +1. ORGANIZER + Name: + Apache ID: + Role on project (committer/PMC/etc.): + Email: + +2. EVENT DETAILS + Date: + Start/end time: + Venue (name + address): + Venue cost: $0 (donated) / $[amount] + Expected attendance: + Event page URL (if exists): + +3. PROJECT + Apache project: + What will participants work on? (curated issues, docs, release + prep, etc.): + Link to curated issue list (if available): + How many experienced reviewers will be present to review PRs? + +4. BUDGET + Venue (if not donated): $ + Catering (lunch + snacks + coffee): $ + Supplies (power strips, signage, badges): $ + Other (specify): $ + TOTAL REQUESTED (max $1,800): $ + +5. OUTREACH PLAN + How will you promote this to potential participants? + Will newcomers be explicitly welcomed and paired with mentors? +``` + +## Approval Process + +- Two committee members evaluate and approve (lazy consensus, + 72hr objection window on list) +- Key factor: Are experienced reviewers confirmed to be present? + (A sprint without reviewers produces orphaned PRs) + +Turnaround: 10 business days. + +## After the Event + +Post a report to dev@community.apache.org: +- Attendance count +- PRs submitted / issues closed / docs written +- New contributors onboarded (if any) +- What worked, what you'd change + +Submit receipts to events-grants@ for reimbursement. diff --git a/wg-events/summary-format.md b/wg-events/summary-format.md new file mode 100644 index 0000000..963f1b4 --- /dev/null +++ b/wg-events/summary-format.md @@ -0,0 +1,213 @@ +# summary.yml Data Format + +## Purpose + +`summary.yml` is the fiscal-year ledger for the events grants program. +It lives in the private SVN repo at: + + https://svn.apache.org/repos/private/pmc/comdev/events-grants/FY20XX/summary.yml + +It is **internal only** -- budget amounts and individual grant details +are never published. Only aggregate counts go in the quarterly public +report. + +## Who updates it + +The wg-events committee chair (or designee) updates this file after +each grant approval and each reimbursement disbursement. + +## When to update + +- After a grant is approved: add entry to the relevant `grants` list, + update `totals` +- After receipts are filed and reimbursement is processed: update + `disbursed` on the entry, update `totals` +- After any status change worth tracking + +## Schema + +```yaml +# ----------------------------------------------------------- +# Events Grants Ledger -- FY2027 +# INTERNAL ONLY -- do not publish dollar amounts +# ----------------------------------------------------------- + +fiscal_year: FY2027 # string, format "FY" + 4-digit year +last_updated: 2027-03-15 # ISO date, updated on every commit + +# ----- Per-category sections ----- +# Each category has: budget, grants (list), totals (computed) + +speaker_travel: + budget: 30000 # integer, dollars, set at start of FY + + grants: # list of individual grants + - id: "2027-01-spitzer-iceberg-summit" # matches filename in speaker-travel/ + applicant: "Russell Spitzer" # display name + conference: "Apache Iceberg Summit" + date: 2027-02-15 # conference start date + approved: 2400 # integer, dollars approved + disbursed: 2400 # integer, dollars actually paid out + status: reimbursed # see Status Values below + + - id: "2027-03-garcia-kubecon-eu" + applicant: "Maria Garcia" + conference: "KubeCon EU" + date: 2027-04-02 + approved: 2800 + disbursed: 0 + status: approved + + totals: # recompute after every change + approved_count: 2 # number of grants approved + approved_amount: 5200 # sum of all approved + disbursed_count: 1 # number fully reimbursed + disbursed_amount: 2400 # sum of all disbursed + remaining: 24800 # budget - approved_amount + +meetups: + budget: 9600 + + grants: + - id: "2027-02-alc-bangalore-feb" + organizer: "Sagara Gunathunga" + project: "general" # or specific project name + location: "Bangalore, India" + date: 2027-02-22 + approved: 350 + disbursed: 320 + status: reimbursed + + totals: + approved_count: 1 + approved_amount: 350 + disbursed_count: 1 + disbursed_amount: 320 + remaining: 9250 + +sprints: + budget: 18000 + grants: [] + totals: + approved_count: 0 + approved_amount: 0 + disbursed_count: 0 + disbursed_amount: 0 + remaining: 18000 + +summits: + budget: 18000 + grants: [] + totals: + approved_count: 0 + approved_amount: 0 + disbursed_count: 0 + disbursed_amount: 0 + remaining: 18000 + +materials: + budget: 4000 + grants: [] + totals: + approved_count: 0 + approved_amount: 0 + disbursed_count: 0 + disbursed_amount: 0 + remaining: 4000 + +# ----- Grand totals ----- +# Recompute from category totals after every change + +grand_totals: + budget: 79600 + approved_amount: 5550 + disbursed_amount: 2720 + remaining: 74050 +``` + +## Field Reference + +### Top-level fields + +| Field | Type | Description | +|-------|------|-------------| +| fiscal_year | string | "FY" + year (e.g., "FY2027") | +| last_updated | date | ISO date of last edit | + +### Category fields (speaker_travel, meetups, sprints, summits, materials) + +| Field | Type | Description | +|-------|------|-------------| +| budget | integer | Allocated dollars for this category this FY | + +### Grant entry fields + +| Field | Type | Required | Description | +|-------|------|----------|-------------| +| id | string | yes | Matches the .txt filename (without extension) | +| applicant / organizer | string | yes | Person's display name | +| conference / project | string | yes | What it's for | +| location | string | meetups/sprints/summits only | City, Country | +| date | date | yes | Event start date | +| approved | integer | yes | Dollars approved (0 if pending) | +| disbursed | integer | yes | Dollars paid out (0 until reimbursed) | +| status | string | yes | See Status Values below | + +### Totals fields (computed -- update manually after each change) + +| Field | Type | Description | +|-------|------|-------------| +| approved_count | integer | Number of grants with status != denied | +| approved_amount | integer | Sum of all `approved` fields | +| disbursed_count | integer | Number with status == reimbursed | +| disbursed_amount | integer | Sum of all `disbursed` fields | +| remaining | integer | budget - approved_amount | + +## Status Values + +| Status | Meaning | +|--------|---------| +| applied | Application received, not yet evaluated | +| approved | Evaluated and approved; awaiting event + receipts | +| denied | Evaluated and denied | +| completed | Event attended; awaiting receipts | +| receipts_filed | Receipts submitted; awaiting reimbursement | +| reimbursed | Money paid out; grant complete | +| withdrawn | Applicant withdrew or event cancelled | + +## Commit Convention + +One `svn ci` per logical change. Commit message format: + + [events-grants] [category] id: description + +Examples: + + [events-grants] [speaker-travel] garcia-kubecon-eu: approved $2800 + [events-grants] [meetups] alc-bangalore-feb: reimbursed $320 + [events-grants] totals: updated after March disbursements + +## Quarterly Public Report + +Generated from this file but **stripped of dollar amounts and names**. +Public report shows only: + +- Number of grants awarded per category +- Number of events funded per category +- Geographic distribution (continents/countries) +- Total events count and total people reached (estimated) + +Script to generate: TBD (simple Python that reads summary.yml and +outputs the aggregate markdown). + +## Versioning + +This format will evolve. Breaking changes get a version bump at the +top of the file: + +```yaml +format_version: 1 # increment on breaking schema changes +``` + +Non-breaking additions (new optional fields) don't require a version +bump. diff --git a/wg-events/summit-request.md b/wg-events/summit-request.md new file mode 100644 index 0000000..5184359 --- /dev/null +++ b/wg-events/summit-request.md @@ -0,0 +1,99 @@ +# Single-Day Project Summit Funding Request -- Process + +## Overview + +ComDev funds up to $6,000 per single-day project summit (~40 people, +full day with catering and AV). For projects that want a focused +community day but lack corporate sponsorship. Target: 3 summits/year. + +## Request Format + +Copy and paste the form below into an email to +events-grants@community.apache.org. Fill in all fields. Use subject +line: + + [SUMMIT] Project -- City, Date + +``` +SUMMIT FUNDING REQUEST +====================== + +1. ORGANIZER + Name: + Apache ID: + Role on project: + Email: + Co-organizers (if any): + +2. EVENT DETAILS + Date: + Start/end time: + Venue (name + address): + Venue cost: $ + Expected attendance: + Event page URL (if exists): + +3. PROJECT & PROGRAM + Apache project: + Why does this project need a summit now? (new release, community + growth, governance transition, etc.): + Draft agenda or program outline: + Confirmed speakers/facilitators: + +4. BUDGET (detailed) + Venue rental: $ + Catering (breakfast/lunch/breaks, per-person estimate): $ + AV equipment rental (if needed): $ + Signage and printed materials: $ + Speaker expenses (if any): $ + Other (specify): $ + TOTAL REQUESTED (max $6,000): $ + +5. SPONSORSHIP & CO-FUNDING + Have you sought corporate sponsors for this event? [Yes/No]: + If yes, what did they offer? + Is any portion funded by other sources? (employer, donations, etc.) + What happens if ComDev funding is not available? (event cancelled, + reduced scope, etc.) + +6. PMC APPROVAL (REQUIRED) + Link to lists.apache.org thread showing your project PMC has + discussed and approved this summit request: + +7. EXPECTED OUTCOMES + What does success look like for this event? + How will you measure it? +``` + +## Approval Process + +- **Prerequisite:** Application MUST include a link to a + lists.apache.org thread where the requesting project's PMC + discussed and approved the summit. Applications without this + are returned without evaluation. +- Full committee review (all members invited to score) +- Minimum two evaluations posted to list +- ComDev PMC vote required (since this is >$2,000) +- Chair presents recommendation to PMC with committee scores + +Turnaround: 20 business days (allow time for PMC vote cycle). + +## After the Event + +Post a detailed report to dev@community.apache.org: +- Attendance count and demographics +- Program delivered vs. planned +- Outcomes achieved +- Financial summary (actual spend vs. budget) +- Lessons learned + +Submit receipts to events-grants@ for reimbursement. + +## Notes + +- Multi-day events are NOT funded through this program. Those require + external sponsorship and fall under VP Conferences. +- Summits that are essentially vendor product launches (even for an + Apache project) do not qualify. The event must be genuinely + community-organized and community-benefiting. +- Preference given to projects that have never had a community event. diff --git a/wg-events/svn-data-format.md b/wg-events/svn-data-format.md new file mode 100644 index 0000000..dd51878 --- /dev/null +++ b/wg-events/svn-data-format.md @@ -0,0 +1,344 @@ +# SVN Data Format & Directory Structure + +## Location + +All grant tracking data lives in the private ComDev PMC SVN repo: + + https://svn.apache.org/repos/private/pmc/comdev/events-grants/ + +## Directory Structure + +``` +events-grants/ +├── README.txt ← This format spec +├── FY2027/ +│ ├── speaker-travel/ +│ │ ├── 2027-01-spitzer-iceberg-summit.txt +│ │ ├── 2027-03-garcia-kubecon-eu.txt +│ │ └── ... +│ ├── meetups/ +│ │ ├── 2027-02-alc-bangalore-feb.txt +│ │ ├── 2027-03-flink-meetup-berlin.txt +│ │ └── ... +│ ├── sprints/ +│ │ ├── 2027-04-tomcat-sprint-london.txt +│ │ └── ... +│ ├── summits/ +│ │ ├── 2027-06-nuttx-community-day.txt +│ │ └── ... +│ ├── materials/ +│ │ ├── 2027-02-alc-bangalore-feb.txt +│ │ └── ... +│ └── summary.yml ← Running FY ledger (YAML) +├── FY2028/ +│ └── ... +└── templates/ + ├── speaker-travel.txt + ├── meetup.txt + ├── sprint.txt + ├── summit.txt + └── materials.txt +``` + +## Naming Convention + +Files are named: `YYYY-MM-shortname-event.txt` + +- YYYY-MM: Month the grant was approved +- shortname: Applicant last name or ALC/project name +- event: Brief event identifier + +## File Formats + +All files are plain text, fixed-field format. One file per grant. + +--- + +### Speaker Travel Grant Record + +``` +SPEAKER TRAVEL GRANT +==================== +Status: [APPLIED | APPROVED | DENIED | COMPLETED | REIMBURSED] + +Applicant: [name] +Apache ID: [id or "none"] +Email: [email] + +Conference: [name] +Location: [city, country] +Dates: [YYYY-MM-DD to YYYY-MM-DD] +Talk title: [title] +Apache project: [project name] + +Travel from: [city, country] +Continent match: [same-continent | inter-continental (override)] + +Applied: YYYY-MM-DD +Evaluated by: [evaluator1], [evaluator2] +Score: [X/15] +Decision: [APPROVED | DENIED] +Decision date: YYYY-MM-DD +Approved amount: $[X] + +Actual spend: $[X] (filled after receipts) +Receipts filed: YYYY-MM-DD +Reimbursed: YYYY-MM-DD +Reimbursed via: [method -- e.g., "ASF Treasurer wire"] + +Deliverable: [URL to blog post / slides / trip report] +Deliverable date: YYYY-MM-DD + +Notes: +[free-form notes, one per line] +``` + +--- + +### Meetup Grant Record + +``` +MEETUP GRANT +============ +Status: [APPLIED | APPROVED | COMPLETED | REIMBURSED] + +Organizer: [name] +Apache ID: [id or "none"] +ALC Chapter: [name or "none"] +Email: [email] + +Event: [description] +Project: [Apache project or "general"] +Location: [city, country] +Date: YYYY-MM-DD +Attendance: [expected] / [actual] (actual filled post-event) + +Applied: YYYY-MM-DD +Approved by: [committee member] +Approved amount: $[X] + +Actual spend: $[X] +Receipts filed: YYYY-MM-DD +Reimbursed: YYYY-MM-DD + +Report posted: [Yes/No] (to dev@community) +Report date: YYYY-MM-DD + +Notes: +[free-form] +``` + +--- + +### Sprint Grant Record + +``` +SPRINT GRANT +============ +Status: [APPLIED | APPROVED | COMPLETED | REIMBURSED] + +Organizer: [name] +Apache ID: [id] +Email: [email] + +Project: [Apache project] +Location: [city, country] +Date: YYYY-MM-DD +Attendance: [expected] / [actual] +Reviewers present: [count] + +Applied: YYYY-MM-DD +Evaluated by: [evaluator1], [evaluator2] +Approved amount: $[X] + +Actual spend: $[X] +Receipts filed: YYYY-MM-DD +Reimbursed: YYYY-MM-DD + +Outcomes: + PRs submitted: [count] + Issues closed: [count] + New contributors: [count] + +Report posted: [Yes/No] +Report date: YYYY-MM-DD + +Notes: +[free-form] +``` + +--- + +### Summit Grant Record + +``` +SUMMIT GRANT +============ +Status: [APPLIED | APPROVED | COMPLETED | REIMBURSED] + +Organizer: [name] +Apache ID: [id] +Email: [email] + +Project: [Apache project] +PMC approval: [URL to lists.apache.org thread] +Location: [city, country] +Date: YYYY-MM-DD +Attendance: [expected] / [actual] + +Applied: YYYY-MM-DD +Evaluated by: [evaluator1], [evaluator2] +ComDev PMC vote: [thread URL or date] +Approved amount: $[X] + +Actual spend: $[X] +Receipts filed: YYYY-MM-DD +Reimbursed: YYYY-MM-DD + +Report posted: [Yes/No] +Report date: YYYY-MM-DD + +Notes: +[free-form] +``` + +--- + +### Materials Reimbursement Record + +``` +MATERIALS REIMBURSEMENT +======================= +Status: [PRE-APPROVED | RECEIPTS FILED | REIMBURSED] + +Organizer: [name] +Email: [email] +Event: [event name and date] +Associated grant: [link to meetup/sprint/summit file, if any] + +Pre-approved: YYYY-MM-DD +Approved by: [committee member] +Approved amount: $[X] + +Items: + [item] -- $[X] + [item] -- $[X] + [item] -- $[X] + +Actual spend: $[X] +Receipts filed: YYYY-MM-DD +Reimbursed: YYYY-MM-DD + +Notes: +[free-form] +``` + +--- + +### summary.yml (per fiscal year) + +YAML format -- human-editable, machine-parseable, supports comments. + +```yaml +# FY2027 Events Grants Ledger +# Updated by committee chair after each disbursement +# INTERNAL ONLY -- do not publish dollar amounts + +fiscal_year: FY2027 +last_updated: 2027-01-15 + +speaker_travel: + budget: 30000 + grants: + - id: 2027-01-spitzer-iceberg-summit + approved: 2400 + disbursed: 2400 + status: reimbursed + - id: 2027-03-garcia-kubecon-eu + approved: 2800 + disbursed: 0 + status: approved + totals: + approved_count: 2 + approved_amount: 5200 + disbursed_count: 1 + disbursed_amount: 2400 + remaining: 24800 + +meetups: + budget: 9600 + grants: + - id: 2027-02-alc-bangalore-feb + approved: 350 + disbursed: 320 + status: reimbursed + totals: + approved_count: 1 + approved_amount: 350 + disbursed_count: 1 + disbursed_amount: 320 + remaining: 9250 + +sprints: + budget: 18000 + grants: [] + totals: + approved_count: 0 + approved_amount: 0 + disbursed_count: 0 + disbursed_amount: 0 + remaining: 18000 + +summits: + budget: 18000 + grants: [] + totals: + approved_count: 0 + approved_amount: 0 + disbursed_count: 0 + disbursed_amount: 0 + remaining: 18000 + +materials: + budget: 4000 + grants: [] + totals: + approved_count: 0 + approved_amount: 0 + disbursed_count: 0 + disbursed_amount: 0 + remaining: 4000 + +# Computed from above -- update after each change +grand_totals: + budget: 79600 + approved_amount: 5550 + disbursed_amount: 2720 + remaining: 74050 +``` + +**Why YAML:** +- Comments allowed (annotations, dates, context) +- Human-editable with any text editor (no trailing-comma traps) +- `yaml.safe_load()` in Python for reporting scripts +- Diff-friendly in SVN (one field per line) +- Individual grant entries are minimal (just id + amounts + status) + with full detail in the per-grant .txt files + +## Workflow + +1. Application arrives on events-grants@ list +2. Committee member creates the record file in SVN with Status: APPLIED +3. As evaluation/approval happens, update the file +4. After reimbursement, update to REIMBURSED and fill actual amounts +5. Update summary.txt with running totals after each disbursement +6. Quarterly: use summary.txt to generate the public report + (aggregate numbers only -- no names or specific amounts published) + +## Notes + +- All files are plain text -- editable with any text editor +- One `svn ci` per status change (keeps clean history) +- Commit messages: "[events-grants] [type] shortname: status change" + e.g., "[events-grants] [speaker-travel] garcia: APPROVED $2,400" +- Budget amounts in summary.txt are internal -- never published