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 <[email protected]>
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: [email protected] 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
[email protected]. 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 ([email protected]) 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
+> [email protected]** -- 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 [email protected] 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 / [email protected]** -- 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:
+
+    [email protected]
+
+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 [email protected].
+
+## 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
[email protected] 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 [email protected]
+   [ ] 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 [email protected]
+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
[email protected]. 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 [email protected]:
+- 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 [email protected] 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 [email protected]
+- 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
[email protected]. 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 [email protected]:
+- 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
[email protected]. 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 [email protected]:
+- 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

Reply via email to