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.
71
89%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
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 gaps in interactive checkssent / 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). The plugin reads keys from the injected environment and bundles no secret of its own. Public JSON feeds supply additional candidates. Interactive checks can use web research and the host fetch_markdown tool.
Scheduled syncs use the feed and Sessionize scripts throughout discovery, verification, relevance analysis, and travel checks. They do not discover web-only candidates or research missing metadata. Ambiguous Sessionize topics retain the lean-relevant policy; non-Sessionize candidates without enough topic evidence produce a notice. New uncertain candidates remain unsaved and eligible for later discovery; existing relevance decisions are preserved. Unknown exact conference dates carry a travel-check warning. State writes and the evidence-gated nightly cursor complete in the same invocation.
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 verification failures or missing-topic-evidence notices. 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/update-travel-warnings.py — applies exact-date warning updates to the final working set from the agent's date-availability judgments before commitscripts/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, gated on this run's verification heartbeat (--since run-start input; predicate in the script); refuses (exit 3) on a run that skipped verification so the cadence retries instead of resting on an unverified passnightly-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.json declares this repo's dev-time plugin dependencies.
jbaruch/* dependency floats at latest (Runtime-Managed Manifest Carve-Out, jbaruch/coding-policy: dependency-management).finsi/codex-review is third-party and pins. No dependency scanner covers the tessl ecosystem. Renewal cadence: quarterly — run tessl outdated and bump the pin in its own commit.