Track multiple submission cycles per conference
All checks were successful
Build and deploy static pages / build-and-push (push) Successful in 13s

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-17 19:55:07 +02:00
parent f132f6bc46
commit 2e95ede9c3
18 changed files with 595 additions and 218 deletions

View File

@@ -142,14 +142,16 @@ WikiCFP is the primary deadline source but has several quirks that required work
**Direct ID lookup**: Add `wikicfp_id: "<event_id>"` to a venue entry in `venues.yaml` to skip the search and fetch that page directly. This avoids wrong matches on common acronyms. Verified IDs for the cloud-edge topic:
| Venue | WikiCFP event ID |
| --- | --- |
| SOSP | 191399 |
| EuroSys | 186524 |
| SoCC | 191071 |
| Middleware | 190153 |
| IPDPS | 189093 |
| HPDC | 191029 |
| Venue | WikiCFP event ID | |
| --- | --- | --- |
| SOSP | 191399 | |
| EuroSys | 186524 | superseded — `source: manual` (two cycles) |
| SoCC | 191071 | superseded — `source: manual` (two cycles) |
| Middleware | 190153 | superseded — `source: manual` (two cycles) |
| IPDPS | 189093 | superseded — `source: manual` (2027 edition) |
| HPDC | 191029 | |
A venue whose `deadlines.yaml` entry says `source: manual` is skipped by the fetcher regardless of its `wikicfp_id`; the ID is kept so the lookup still works if the entry is ever handed back to WikiCFP.
**Skipping search**: Set `wikicfp_id: false` to skip WikiCFP entirely for a venue (e.g., ATC, SC, SEC — where the search returns wrong events). Deadlines for these must be filled manually.
@@ -167,6 +169,47 @@ ATC:
cfp_url: https://sigops.org/s/conferences/atc/2026/cfp.html
```
### Multiple Submission Cycles
Many systems conferences run more than one submission round per year, all feeding the same event. Recording only one round makes the site claim a conference has been missed when a later round is still open. Give such a venue a `cycles` list instead of top-level deadline fields:
```yaml
EuroSys:
source: manual
event_dates: Apr 19-23, 2027 # event fields stay at the top level
location: Rabat, Morocco
cfp_url: https://2027.eurosys.org/cfp.html
cycles:
- name: Spring # free text, verbatim from the CFP
abstract_deadline: May 7, 2026
submission_deadline: May 14, 2026
notification: Aug 21, 2026
camera_ready: Sep 25, 2026
- name: Fall
abstract_deadline: Sep 17, 2026
submission_deadline: Sep 24, 2026
notification: Jan 29, 2027
camera_ready: Mar 5, 2027
```
Cycle fields are `name`, `abstract_deadline`, `submission_deadline`, `notification`, `camera_ready`, plus an optional per-cycle `cfp_url` where a venue publishes a separate call per round. Everything else (`source`, `event_dates`, `location`, `cfp_url`) describes the event and stays at the top level.
**Single-round venues need no change.** `load_deadlines()` folds a flat entry into a one-element `cycles` list on read, so the two shapes are interchangeable and only genuinely multi-round venues need the extra nesting.
What the generator does with cycles:
| Output | Behaviour |
| --- | --- |
| Venue page | Multi-cycle venues get a **Submission Cycles** table with every round; the next open one is bolded and marked `(next)`. Single-cycle venues keep the **Upcoming Deadline** block unchanged. |
| Venue index | One row per venue, showing the next open cycle with its name appended to the paper deadline. |
| Calendar table | One row per cycle, with a `Cycle` column, sorted by paper deadline. |
| Calendar grid | One event set per cycle; titles read `EuroSys Fall — paper deadline`. Elapsed cycles are kept — the grid is time-indexed, so past rounds only show when you navigate back to their month. |
| Front matter | `next_deadline` / `abstract_deadline` / `notification` / `camera_ready` reflect the **next** cycle. Multi-cycle venues additionally carry `cycles` and `next_cycle`. |
"Next" means the earliest cycle whose paper deadline has not passed; if every round has elapsed, the last one, so a page shows the most recent round rather than going blank.
**WikiCFP cannot express this.** It lists one deadline set per event, so a multi-round venue fetched from WikiCFP will silently record whichever round WikiCFP happens to hold. Research such venues from the CFP itself and mark them `source: manual` — otherwise the next fetcher run overwrites the extra rounds. SoCC, Middleware and IPDPS were converted this way even though they still carry `wikicfp_id` in `venues.yaml`.
---
## `venues.yaml` Schema