Finds open conference CFPs relevant to the user across Java/AI/developer conferences, with persistent sent/dismissed/remind state and source-aware Sessionize verification. NanoClaw per-chat overlay, loaded via containerConfig.additionalTiles.
74
93%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Advisory
Suggest reviewing before use
Conference CFP discovery for NanoClaw. Finds open calls-for-papers relevant to the user across Java/AI/developer conferences, ranks them by relevance, and maintains persistent per-CFP state (sent / dismissed / remind) across sessions so the same conference is never surfaced twice.
Per-chat overlay tile. Install via NanoClaw's containerConfig.additionalTiles mechanism.
developers.events, javaconferences.org, plus targeted web search for gapssent / dismissed / remind / approved / conflict status per CFP in cfp-state.json, immutable once the user acts on an entrytessl install jbaruch/nanoclaw-conferencesAdd to a chat's overlay tile list via update_group_config:
additionalTiles: ["nanoclaw-conferences"]Load the overlay at the main or trusted tier — the skill reads /workspace/trusted/user_professional.md for the user's speaking topics.
The CFP pipeline calls the Sessionize universal API deterministically from its own scripts (so the large responses never enter the agent's context — see jbaruch/nanoclaw-conferences#7/#9), which needs two host-injected keys in the container environment:
| Variable | Used by | Sent as |
|---|---|---|
SESSIONIZE_SPEAKER_KEY | discover-open-cfps.py (Step 2) | X-API-KEY header to .../open-cfps |
SESSIONIZE_EVENT_API_KEY | verify-sessionize.py (Step 5) | X-API-KEY header to .../event?slug= |
SESSIONIZE_API_BASE optionally overrides the https://sessionize.com/api/universal base (tests / proxying). These are the same keys the NanoClaw host already holds for its sessionize_* tools; the plugin reads them from the injected environment and bundles no secret of its own. Remaining data comes from the host fetch_markdown tool and public JSON feeds (developers.events, javaconferences.org); the sessionize_* MCP tools remain available for ad-hoc queries.
The skill reads and writes files under the shared /workspace/group/ mount:
| File | Access | Owner |
|---|---|---|
cfp-state.json | read+write | this plugin (schema-versioned, owner-migrated) |
cfp-suppressed-today.json | write | this plugin |
cfp-priorities.json | read | owner-managed |
RELEVANCE-CRITERIA.md | read | owner-managed |
travel-schedule.json | read | written by nanoclaw-admin's nightly-external-sync (co-loaded) |
user_professional.md | read (/workspace/trusted/) | owner-managed |
Reads of admin-owned files resolve because admin co-loads with this overlay in the same chat via the shared mount; each is optional and degrades gracefully when absent.
| Skill | Description |
|---|---|
| check-cfps | Finds open CFPs relevant to the user across Java/AI/developer conferences and maintains persistent CFP state (sent/dismissed/remind) in cfp-state.json. Use when the user asks about upcoming conferences, call for papers, speaking opportunities, CFP deadlines, or where to submit a talk proposal. |
| nightly-cfp-sync | Cadence wrapper (cron 30 6, precheck-gated by a filesystem cadence cursor) that runs check-cfps on a schedule, consumes the CFP list internally, and surfaces only a stale-verification notice. Emits the observable-silence cursor marker the silent-success watchdog reads. |
The skill bundle includes deterministic scripts the agent invokes from the SKILL.md steps:
scripts/check-cfps-fetch.py — fetches + filters CFPs from the public feeds, applies the source-list and blocklistscripts/discover-open-cfps.py — Step 2 deterministic Sessionize open-CFP discovery via the speaker API (candidate shape and filter rules in its docstring)scripts/prepare-sessionize-batch.py — routes entries by effective source and derives Sessionize slugs for a single batched verification callscripts/apply-sessionize-results.py — joins batched Sessionize results back to entries and emits per-entry verdictsscripts/verify-sessionize.py — Step 5 verification driver: collapses prepare → live universal-API round-trip → apply into one invocation and writes the verify-evidence.json markerscripts/backfill-source.py — infers a missing source from the cfp_url hostscripts/backfill-name.py — derives a fallback name for nameless records from the slug or cfp_urlscripts/expire-cfps.py — expires stale non-Sessionize open/approved entries whose deadline passedscripts/match-priorities.py — deterministic priority-interest prefilterscripts/dedup-by-url.py — collapses entries whose cfp_url normalises to the same host+path, preserving the highest-priority source attribution and inheriting missing metadata from dropped copiesscripts/commit-state.py — lock-owning committer for the Step 8 working-set write (the agent never writes cfp-state.json directly)scripts/stamp-schema-version.py — owner-side schema_version stamper for cfp-state.jsonscripts/stamp-last-checked.py — evidence-gated single writer of the _last_checked freshness heartbeat (exit 3 = verification not evidenced)scripts/run-state.py — per-run checkpoint store for resumable runs (begin/save/load/invalidate/done; schema in references/run-state.md)scripts/audit-sessionize-key-drift.py — reports Sessionize slug drift in stored statescripts/state_lock.py — shared advisory-flock module (not a CLI) that serialises every cfp-state.json mutator's read-modify-writeThe nightly-cfp-sync cadence wrapper carries its own scripts:
scripts/precheck-nightly-cfp-sync.py — fire-time precheck that gates wake-ups by the cadence cursorscripts/stamp-cursor.py — advances the nightly-cfp-sync-cursor.json success cursor after a clean runnightly-cfp-sync cadence wrapper alongside check-cfps, so the plugin owns both the user-driven CFP lookup and its scheduled refresh (mirrors nanoclaw-flight-assist bundling its sync-tripit cadence driver with check-travel-bookings). The wrapper materialises one scheduled_tasks row in chats that load this overlay.check-cfps from nanoclaw-admin as a standalone per-chat overlay tile. Full multi-source discovery, source-aware Sessionize verification, AI relevance routing, persistent state with owner-side schema migration, travel-conflict detection, and priority-interest tagging.See CHANGELOG.md for version history.
.tessl-plugin
skills
check-cfps
scripts
nightly-cfp-sync