Parse CFP
Turn a live Call for Papers into the machine-readable venue profile that the
rest of this repo runs on. Output is a venues/conferences/<venue>-<year>.yml
file conforming to venues/schema.yml, plus a human-readable requirements card.
Downstream consumers: preflight-check, tailor-to-venue, write-rebuttal,
prepare-camera-ready, select-venue.
When to use
- The user pastes a CFP, author-guidelines, or submission-instructions URL.
- "What are the requirements / deadlines / page limits for VENUE YEAR?"
- A profile in
venues/conferences/ is missing or a year out of date.
Inputs
- A CFP URL. If the user only names a venue, check
venues/conferences/<venue>-<year>.yml for a cfp_url first; an older
year's profile usually links the venue website where the new CFP lives.
venues/schema.yml — read it before writing the profile; it defines every
field and the mandatory verified: provenance block.
- The matching
venues/families/<family>.yml for family-level defaults.
CONTACT_EMAIL env var (used in the polite fetch User-Agent; the script
prompts if unset).
Process
Scope one venue + one year. Read venues/schema.yml. If a profile for
this venue-year already exists, treat it as hints to re-verify, never as
ground truth.
Fetch the CFP page. Run:
python3 scripts/fetch_cfp.py "<cfp-url>"
The script fetches ONE page per invocation, rate-limits to 1 request/second
per host, backs off exponentially on HTTP 429, caches under .cache/
(gitignored) for 24h, and prints readable text with link targets as [url].
It exits nonzero with a clear message on failure. Then fetch the handful of
follow-up pages you actually need — per-track submission pages, the
deadlines page, the camera-ready/author-kit page — one invocation each,
never a site crawl.
- Exit code 3 = non-HTML content (a PDF CFP, a JSON API response); the
body is saved under
.cache/ — read that file directly.
- "very little text extracted" warning = JavaScript-rendered page; ask the
user to paste the page text and mark the profile
needs-verification.
Never fill gaps from memory.
Verify the year. Confirm the page heading and dates match the requested
year before extracting — stale CFPs survive at near-identical URLs. Wrong
year: tell the user and locate the current page.
Extract every schema field following
references/extraction-guide.md. The
non-negotiables:
- Numbers (page limits, char limits, dates) only from fetched text; missing
fact =
null + an explanatory note. Never infer, never recall.
- Page limits must capture what is EXCLUDED (references? appendix?
checklist?) with the CFP's sentence quoted verbatim in the track
notes.
- Deadlines: record the stated timezone — AoE is common, not universal
(SIGSPATIAL uses Pacific Time). Abstract registration is a separate,
earlier deadline at most venues.
llm_policy and dual_submission: verbatim quotes, never paraphrased.
Normalize the template invocation, submission system, rebuttal format,
and camera-ready rail using
references/templates-and-systems.md.
Derive \documentclass options from the family table (add
review,anonymous only for double/triple-blind venues) and comment when an
invocation is family-derived rather than printed in the CFP.
Emit the YAML to venues/conferences/<venue>-<year>.yml:
id equals the filename stem; family references an existing family file.
- Fill the mandatory
verified: block — today's date, every URL fetched
(with a comment on which facts each supplied), and an honest
confidence: (verified-live only if all critical facts came off live
pages today).
Validate. Run python3 tools/validate_venues.py from the repo root
(needs PyYAML; if unavailable, check the file manually against
venues/schema.yml field by field).
Present the requirements card to the user: a short table of deadlines
(with timezone), per-track limits with their exclusions, blind level,
template invocation, submission URL, rebuttal format, and LLM policy. End
with the verification notice: "Profile extracted from on .
Re-verify deadlines and page limits against the live CFP before submitting —
CFPs change mid-cycle and a stale limit can cause a desk reject."
Worked mini-example
User pastes https://sigspatial2026.sigspatial.org/research-submission.html.
After fetching, the Research-track section reads: "papers are limited to 10
pages (excluding references), with up to 2 additional pages after the references
to be used for appendices", deadlines are stated as "11:59 PM Pacific Time",
and the submission link points at easychair.org/conferences/?conf=acmsigspatial2026.
That extracts to:
id: sigspatial-2026
deadlines:
abstract: 2026-05-29
paper: 2026-06-05
timezone: PT # CFP says "Pacific Time", NOT AoE — recorded verbatim
tracks:
- name: Research
page_limit: 10
page_limit_excludes: [references, appendix]
notes: >
CFP verbatim: "papers are limited to 10 pages (excluding references),
with up to 2 additional pages after the references ... for appendices."
review:
blind: single # CFP lists author names — single, not double
submission_system: easychair
verified:
date: 2026-06-21
source_urls:
- https://sigspatial2026.sigspatial.org/research-submission.html # limits, deadlines, blind
confidence: verified-live
Two traps this example surfaces and the guide handles: the timezone is Pacific,
not the AoE default, and the page limit excludes both references AND the
appendix — encoded explicitly so preflight-check can enforce it. The page
heading is confirmed to say 2026 before any of this is extracted.
Output
venues/conferences/<venue>-<year>.yml — schema-conformant, year-versioned,
with provenance.
- An inline requirements-card summary with the re-verify warning.
Guardrails
- Never fabricate a deadline, limit, or policy.
null + note beats a guess.
- Quote LLM-use and dual-submission policies verbatim; paraphrase can invert
compliance meaning.
- GET-only. Never log in to, register with, or submit to any submission system
on the user's behalf.
- Never fabricate citations. This skill emits venue metadata only; if a paper
reference is ever needed downstream, route it through
verify-citations.
- One page per script invocation; no bulk crawling. The cache lives under
.cache/ and stays out of git — do not commit fetched CFP text to the repo.
- Always include the re-verify-against-live-CFP notice in the final answer.
Source verification (mandatory)
This skill originates venue facts, so source verification is mandatory without exception:
- The venue is the user's choice; build its rules on demand, never from memory or a prior year.
- Search the web for the live CFP / author-instructions page and read the primary source — never state a fact from a search snippet you didn't open, and never from a deadline aggregator without confirming on the official site.
- Double-check every desk-reject-class fact (deadline, page limit + exclusions, blind level, template, submission system) against a second source; if sources disagree, surface the conflict — do not pick silently.
- Record a clickable reference link and the date for every fact in the profile's
verified.source_urls; set confidence to verified-live/corroborated only when sourced, else needs-verification. A fact with no link is emitted as unverified, never asserted.
Bundled files
- references/extraction-guide.md —
field-by-field extraction rules, cue phrases, and the trap list.
- references/templates-and-systems.md —
template invocations by family, submission-system URL patterns, rebuttal
taxonomy, camera-ready rails.
scripts/fetch_cfp.py — polite single-page fetcher (run it; do not reimplement
fetching by hand).
1---2name: parse-cfp3description: Parses a conference Call for Papers (CFP) URL into a machine-checkable requirements card - deadlines with timezone (AoE vs local), per-track page limits including/excluding references, single/double/triple-blind level, exact LaTeX template invocation, LLM/AI-use policy, rebuttal format, and submission system (OpenReview, CMT, EasyChair, HotCRP, PCS) - emitted as a year-versioned venue-profile YAML conforming to venues/schema.yml. Use when the user shares a CFP or author-instructions URL, asks what a venue's submission requirements, deadlines, page limits, or anonymity rules are, or wants a venue profile under venues/conferences/ created or refreshed for a new submission cycle.4---56# Parse CFP78Turn a live Call for Papers into the machine-readable venue profile that the9rest of this repo runs on. Output is a `venues/conferences/<venue>-<year>.yml`10file conforming to `venues/schema.yml`, plus a human-readable requirements card.11Downstream consumers: `preflight-check`, `tailor-to-venue`, `write-rebuttal`,12`prepare-camera-ready`, `select-venue`.1314## When to use1516- The user pastes a CFP, author-guidelines, or submission-instructions URL.17- "What are the requirements / deadlines / page limits for VENUE YEAR?"18- A profile in `venues/conferences/` is missing or a year out of date.1920## Inputs2122- A CFP URL. If the user only names a venue, check23 `venues/conferences/<venue>-<year>.yml` for a `cfp_url` first; an older24 year's profile usually links the venue website where the new CFP lives.25- `venues/schema.yml` — read it before writing the profile; it defines every26 field and the mandatory `verified:` provenance block.27- The matching `venues/families/<family>.yml` for family-level defaults.28- `CONTACT_EMAIL` env var (used in the polite fetch User-Agent; the script29 prompts if unset).3031## Process32331. **Scope one venue + one year.** Read `venues/schema.yml`. If a profile for34 this venue-year already exists, treat it as hints to re-verify, never as35 ground truth.36372. **Fetch the CFP page.** Run:3839 ```40 python3 scripts/fetch_cfp.py "<cfp-url>"41 ```4243 The script fetches ONE page per invocation, rate-limits to 1 request/second44 per host, backs off exponentially on HTTP 429, caches under `.cache/`45 (gitignored) for 24h, and prints readable text with link targets as `[url]`.46 It exits nonzero with a clear message on failure. Then fetch the handful of47 follow-up pages you actually need — per-track submission pages, the48 deadlines page, the camera-ready/author-kit page — one invocation each,49 never a site crawl.50 - Exit code 3 = non-HTML content (a PDF CFP, a JSON API response); the51 body is saved under `.cache/` — read that file directly.52 - "very little text extracted" warning = JavaScript-rendered page; ask the53 user to paste the page text and mark the profile `needs-verification`.54 Never fill gaps from memory.55563. **Verify the year.** Confirm the page heading and dates match the requested57 year before extracting — stale CFPs survive at near-identical URLs. Wrong58 year: tell the user and locate the current page.59604. **Extract every schema field** following61 [references/extraction-guide.md](references/extraction-guide.md). The62 non-negotiables:63 - Numbers (page limits, char limits, dates) only from fetched text; missing64 fact = `null` + an explanatory note. Never infer, never recall.65 - Page limits must capture what is EXCLUDED (references? appendix?66 checklist?) with the CFP's sentence quoted verbatim in the track `notes`.67 - Deadlines: record the stated timezone — AoE is common, not universal68 (SIGSPATIAL uses Pacific Time). Abstract registration is a separate,69 earlier deadline at most venues.70 - `llm_policy` and `dual_submission`: verbatim quotes, never paraphrased.71725. **Normalize** the template invocation, submission system, rebuttal format,73 and camera-ready rail using74 [references/templates-and-systems.md](references/templates-and-systems.md).75 Derive `\documentclass` options from the family table (add76 `review,anonymous` only for double/triple-blind venues) and comment when an77 invocation is family-derived rather than printed in the CFP.78796. **Emit the YAML** to `venues/conferences/<venue>-<year>.yml`:80 - `id` equals the filename stem; `family` references an existing family file.81 - Fill the mandatory `verified:` block — today's date, every URL fetched82 (with a comment on which facts each supplied), and an honest83 `confidence:` (`verified-live` only if all critical facts came off live84 pages today).85867. **Validate.** Run `python3 tools/validate_venues.py` from the repo root87 (needs PyYAML; if unavailable, check the file manually against88 `venues/schema.yml` field by field).89908. **Present the requirements card** to the user: a short table of deadlines91 (with timezone), per-track limits with their exclusions, blind level,92 template invocation, submission URL, rebuttal format, and LLM policy. End93 with the verification notice: *"Profile extracted from <cfp_url> on <date>.94 Re-verify deadlines and page limits against the live CFP before submitting —95 CFPs change mid-cycle and a stale limit can cause a desk reject."*9697## Worked mini-example9899User pastes `https://sigspatial2026.sigspatial.org/research-submission.html`.100After fetching, the Research-track section reads: *"papers are limited to 10101pages (excluding references), with up to 2 additional pages after the references102to be used for appendices"*, deadlines are stated as *"11:59 PM Pacific Time"*,103and the submission link points at `easychair.org/conferences/?conf=acmsigspatial2026`.104That extracts to:105106```yaml107id: sigspatial-2026108deadlines:109 abstract: 2026-05-29110 paper: 2026-06-05111 timezone: PT # CFP says "Pacific Time", NOT AoE — recorded verbatim112tracks:113 - name: Research114 page_limit: 10115 page_limit_excludes: [references, appendix]116 notes: >117 CFP verbatim: "papers are limited to 10 pages (excluding references),118 with up to 2 additional pages after the references ... for appendices."119review:120 blind: single # CFP lists author names — single, not double121 submission_system: easychair122verified:123 date: 2026-06-21124 source_urls:125 - https://sigspatial2026.sigspatial.org/research-submission.html # limits, deadlines, blind126 confidence: verified-live127```128129Two traps this example surfaces and the guide handles: the timezone is Pacific,130not the AoE default, and the page limit excludes both references AND the131appendix — encoded explicitly so `preflight-check` can enforce it. The page132heading is confirmed to say 2026 before any of this is extracted.133134## Output135136- `venues/conferences/<venue>-<year>.yml` — schema-conformant, year-versioned,137 with provenance.138- An inline requirements-card summary with the re-verify warning.139140## Guardrails141142- Never fabricate a deadline, limit, or policy. `null` + note beats a guess.143- Quote LLM-use and dual-submission policies verbatim; paraphrase can invert144 compliance meaning.145- GET-only. Never log in to, register with, or submit to any submission system146 on the user's behalf.147- Never fabricate citations. This skill emits venue metadata only; if a paper148 reference is ever needed downstream, route it through `verify-citations`.149- One page per script invocation; no bulk crawling. The cache lives under150 `.cache/` and stays out of git — do not commit fetched CFP text to the repo.151- Always include the re-verify-against-live-CFP notice in the final answer.152153## Source verification (mandatory)154155This skill *originates* venue facts, so source verification is mandatory without exception:156157- The venue is the **user's choice**; build its rules **on demand**, never from memory or a prior year.158- **Search the web for the live CFP / author-instructions page and read the primary source** — never state a fact from a search snippet you didn't open, and never from a deadline aggregator without confirming on the official site.159- **Double-check every desk-reject-class fact** (deadline, page limit + exclusions, blind level, template, submission system) against a second source; if sources disagree, surface the conflict — do not pick silently.160- **Record a clickable reference link and the date for every fact** in the profile's `verified.source_urls`; set `confidence` to `verified-live`/`corroborated` only when sourced, else `needs-verification`. A fact with no link is emitted as unverified, never asserted.161162## Bundled files163164- [references/extraction-guide.md](references/extraction-guide.md) —165 field-by-field extraction rules, cue phrases, and the trap list.166- [references/templates-and-systems.md](references/templates-and-systems.md) —167 template invocations by family, submission-system URL patterns, rebuttal168 taxonomy, camera-ready rails.169- `scripts/fetch_cfp.py` — polite single-page fetcher (run it; do not reimplement170 fetching by hand).