Turn a conference's Call for Papers into a merge-ready venue profile — the
community-contribution loop that grows the
data moat. Output is one
new file,
venues/conferences/<venue>-<year>.yml
, that passes validation and
arrives with provenance, plus a prepared (never auto-opened) pull request.
Every other venue-aware skill (
,
,
,
) runs on these profiles, so a wrong
fact here becomes someone else's desk reject. Accuracy beats completeness.
-
Scope one venue, one year. Read
. If
already has this venue:
- same year → switch to refreshing that file (re-verify every fact live);
- older year → copy forward into a NEW file. Never edit last year's file
into this year's; profiles are year-versioned on purpose, and every
copied fact must be re-verified against the live CFP.
-
Scaffold the skeleton. Pick the family from the walkthrough table,
then run from the repo root:
python3 skills/add-venue-profile/scripts/init_profile.py <venue>-<year> \
--family <family> --cfp-url "<url>"
This writes a schema-shaped skeleton with TODO markers and a
provenance block. It refuses to overwrite existing
profiles and rejects unknown families (listing the valid ones).
-
Fetch the live CFP. Run:
python3 skills/add-venue-profile/scripts/fetch_cfp.py "<cfp-url>"
One page per invocation (rate-limited, cached under
, gitignored).
Fetch only the follow-up pages you need — per-track pages, the deadline
table, camera-ready instructions — one call each, never a site crawl.
Exit 3 means the CFP is a PDF: read the saved file directly. A
"very little text extracted" warning means a JavaScript-rendered page: ask
the user to paste the text and keep
confidence: needs-verification
.
Confirm the page's year matches the requested year before extracting —
stale CFPs survive at near-identical URLs.
-
Fill every field following
references/profile-walkthrough.md
(field-by-field rules, the family table, the trap list). Non-negotiables:
- Numbers and dates only from fetched text. Missing fact = plus an
explanatory note — never inferred, never recalled from training data.
- Page limits must record what is EXCLUDED, with the CFP's sentence
quoted verbatim in the track .
- Deadlines carry the CFP's stated timezone — AoE is common, not
universal.
- and are verbatim quotes, never
paraphrased.
-
Build the alias table (
,
,
)
using the single-lookup API patterns in the walkthrough. Aliases make the
profile searchable by
/
; a
with a
"searched, not found" comment beats a guess.
-
Complete the block honestly — today's date, every URL
facts came from (annotate which facts each page supplied), and a
the evidence actually supports.
only if all
critical facts came off live pages today.
-
Validate. Run from the repo root:
python3 skills/add-venue-profile/scripts/validate_profile.py \
venues/conferences/<venue>-<year>.yml --strict
Fix every ERROR. Resolve each WARN or carry a one-line justification into
the PR body. The script is offline and stdlib-only (uses PyYAML when
present); CI runs the equivalent
, so a clean
strict pass here predicts a green check.
-
Prep the PR following
references/pr-checklist.md: a branch named
, a single-file diff, the PR body template with
provenance and warning justifications. Show the user the final diff and
the exact
command — and only run it if the user explicitly
asks. Never open, push, or submit anything unprompted.
-
Close with the freshness notice: "Profile built from <cfp_url> on
<date>. CFPs change mid-cycle — re-verify deadlines and page limits
against the live page before relying on this profile, and expect reviewers
to spot-check it."