skillfulagents/public-skillset/sheets-registry
Claude Code and agent skill by skillfulagents/public-skillset
- community
Checking that the SKILL.md file is still in the repository.
Multi-owner shared state for the recruiting pipeline — sourced candidates, ownership (who advanced whom), outreach queue/cadence events, and suppression live in a shared Google Sheet so multiple agent installs (the hiring lead, a teammate) cooperate without double-contacting anyone. Use for every advance, send, reply, and pre-write ownership check, and to push/pull longlists at session boundaries.
Install
npx vskill@latest install skillfulagents/public-skillset/sheets-registrySKILL.md
Shared Candidate Registry
Sheet: {{COMPANY}} Recruiting — Shared Candidate Registry — id + URL in /workspace/pipeline/registry.json. Identity: OWNER env var in /workspace/.env (alice on one install, bob on another). Every write is stamped with it. registry.py refuses writes without it.
Data model
- `events` tab — append-only source of ordering/audit truth. One row per material action:
ts, actor, candidate_key, role, action, payload(JSON). Actions:sourced, advanced, rejected-by-tim, suppressed, queued, held, sent, accepted, replied, link-shared, booked, unresponsive, status. Sheets append order settles races: first `advanced` row wins ownership; the loser backs off and flags. Cadence math (+4d/+10d follow-ups) runs offsentevents withpayload.type = initial. - `candidates` tab — current state, upserted. One row per
(candidate_key, role): core columns (score, status, owner, queue_state, ashby ids…) + the full longlist record as JSON inpayload. This is what dashboards render. candidate_key=in/<linkedin-slug>(same normalize rule aslonglist.py).
Ownership rules
- First Advance wins.
advancedevent setsowner(never overwritten). Owner's install is solely responsible for outreach + nurture — sends go through that person's LinkedIn seat. - Contact by ANY owner suppresses for all.
checkexits 3 if anysent/accepted/replied/link-shared/bookedevent exists. - `push` never touches rows owned by someone else — it skips and reports them.
- Local longlist files are this install's working cache; the Sheet is truth. On divergence, the Sheet wins for
owner, contact state, and queue state.
Commands
Mandatory call sites (contract with the other skills)
- Session start (any recurring session):
reconcile --file <longlist> --role <slug>— merges Sheet truth (owner/contact/queue state, other-owner finds) into the local longlist before doing anything. - Session end (search sessions):
push --file <longlist> --role <slug>so new harvest/scoring is visible to all owners. - Before ANY advance (calibration-feedback):
check— exit 2 means the other owner got there first: skip the Ashby create/queue, flag in summary. Then append theadvancedevent, re-readcheckoutput; if another actor'sadvancedrow landed first, back off (undo nothing in Ashby yet — create happens after the check). - Before ANY send (13:35 batch, follow-ups, InMail):
check— exit 3 = already contacted by someone, skip. Queue drain =queue(owner-scoped); never send forowner != me. - After every outreach action: append the matching event (
queued/sent/accepted/replied/link-shared/booked/unresponsive) withpayload{channel, type, variant, message?}— this replacesoutreach-log.jsonl, which is legacy read-only. - Ashby notes + stages remain the pipeline-of-record mirror for advanced candidates (unchanged rule); the Sheet adds the cross-install layer.
Onboarding a new owner (any {{COMPANY}} teammate)
The Sheet lives on the {{COMPANY}} shared drive → Recruiting folder (moved 2026-08-06), so every company Google account already has access — no per-person sharing step.
A fresh install (unzipped collaborator bundle) needs exactly one connection:
- Connect Google Sheets with their company Google account (
request_connected_account, toolkitgooglesheets). - First-run setup (agent does this automatically when
OWNERorGSHEETS_ACCOUNT_IDis missing from.env): setGSHEETS_ACCOUNT_IDfrom the connected account, deriveOWNERfrom the account email prefix (e.g.teammate@{{COMPANY_DOMAIN}}→mike), confirm with the user, write both to.env, then runregistry.py statsto verify access.registry.jsonships in the collaborator bundle with the spreadsheet id — nothing to configure there. On a fresh customer install (public template — no `registry.json` in the bundle): run `registry.py init` once to create a brand-new registry Sheet, then move it to a shared drive folder if teammates will run their own installs. - Their sends use their own LinkedIn seat; their advances land in Ashby stamped with their
OWNERin the note's#outreachline.
Security
- Security scanPassed, 90 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingagents/recruiting-agent/.claude/skills/sheets-registry/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/skillfulagents/public-skillset/sheets-registry)