You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@community.apache.org by rb...@apache.org on 2026/07/17 16:33:32 UTC
(comdev-working-groups) branch wg-events created (now 773d72c)
This is an automated email from the ASF dual-hosted git repository.
rbowen pushed a change to branch wg-events
in repository https://gitbox.apache.org/repos/asf/comdev-working-groups.git
at 773d72c Add wg-events: proposed event support & speaker travel working group
This branch includes the following new commits:
new 773d72c Add wg-events: proposed event support & speaker travel working group
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(comdev-working-groups) 01/01: Add wg-events: proposed event support & speaker travel working group
Posted by rb...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
rbowen pushed a commit to branch wg-events
in repository https://gitbox.apache.org/repos/asf/comdev-working-groups.git
commit 773d72cba370ac81ee57ef5186cb8b8e2d180092
Author: Rich Bowen <rb...@rcbowen.com>
AuthorDate: Fri Jul 17 12:32:59 2026 -0400
Add wg-events: proposed event support & speaker travel working group
Proposed structure for managing ComDev event grants, including:
- Charter and structural rules (README)
- Speaker travel grant process with scoring rubric
- Meetup/sprint/summit/materials request forms (copy-paste email format)
- Evaluation criteria (5-criterion, 0-3 scoring)
- Private SVN data format for grant tracking (summary.yml schema)
- Committee operations howto (moderation, evaluation, SVN workflow)
- Helper scripts (update-summary.py, validate-application.py)
- SKILL for AI-assisted cost estimation from public sources
All content marked PROPOSED/RFC. Not active until budget is approved.
Discussion: dev@community.apache.org with [wg-events] prefix.
---
wg-events/COMMITTEE-HOWTO.md | 432 ++++++++++++++++++++++++++++++++++
wg-events/README.md | 119 ++++++++++
wg-events/SKILL.md | 126 ++++++++++
wg-events/application-form.md | 88 +++++++
wg-events/bin/update-summary.py | 112 +++++++++
wg-events/bin/validate-application.py | 86 +++++++
wg-events/evaluation-criteria.md | 98 ++++++++
wg-events/materials-reimbursement.md | 94 ++++++++
wg-events/meetup-request.md | 74 ++++++
wg-events/speaker-travel-grant.md | 100 ++++++++
wg-events/sprint-request.md | 71 ++++++
wg-events/summary-format.md | 213 +++++++++++++++++
wg-events/summit-request.md | 99 ++++++++
wg-events/svn-data-format.md | 344 +++++++++++++++++++++++++++
14 files changed, 2056 insertions(+)
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