Sync applied
A job-search pipeline that runs on your machine — fetches postings, scores each against a rubric you wrote, and hands you a ranked worklist. It does not apply for you.
npx -y skills add Ben-Bot-22/job-hunt-kit --skill sync-appliedAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 14 days oldThe repository was created 14 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Sync Ben's applied-jobs Google Sheet into the triage dedup cache (applied.json) so already-applied roles never resurface
SKILL.md
3.7 KB, as published. Nobody here has run it
Pull Ben's applied-jobs Google Sheet, normalize its messy rows, and write them into the triage dedup cache
(data/corpus/applied.json) so the ranker never re-surfaces a job he has already applied to. Full
reference: docs/operating/triage-applied-sync.md.
The sheet is free-form and inconsistent — company is often blank, the title lands in whichever column
Ben pasted into (job-id OR description), and identity is sometimes only inferable from the link
domain. That mess is why this step uses your judgment to normalize, not a column map.
1. Read the sheet
Load the Drive tool once: ToolSearch select:mcp__claude_ai_Google_Drive__read_file_content.
Read profile/profile.yaml → applied_sheet for the id, then read_file_content(fileId: <that id>).
(The id is never written down here — it is one user's Sheet, and a skill that ships must not carry it.
If the read fails because it's a fresh/headless session
with no Google connector, tell Ben and ask him to paste a CSV export instead — then normalize that.)
2. Normalize every non-empty row → JSON
For each row that has any of company / title / link, produce ONE object. Reconcile the mess:
- title — take the real role title, wherever it sits (
job-idcol like "Sr. Software Engineer, Studio", or thedescriptioncol like "Software Engineer III"). Strip req numbers / locations mashed into it (e.g.Python developer (BBBH1688426) Georgia, USA→ title "Python Developer", city "Georgia"). - company — use the
hiring companycol; if blank, infer from the link domain (careers-gotyto.icims.com→ Tyto;recruiting.ultipro.com/HEA1015→ All One Health) or leave blank. - city — only if clearly present (e.g. "Broad Run, VA", "Dayton"); else "".
- url — the raw link as-is (the tool re-normalizes LinkedIn/Indeed tracking cruft; don't hand-edit).
- confidence —
highwhen company+title are clear (clean or confidently inferred);mediumwhen one was inferred with some doubt;lowwhen the row is genuinely ambiguous (a bare HN/company link, no real title). Onlyhigh/mediumauto-block;lowis surfaced for Ben, not silently hidden — so when in doubt, uselow. A false dedup (hiding a job he never applied to) is worse than one resurfacing. - note — one short phrase: how you inferred it, or why it's low.
- row — the sheet's
No.
Write the array to a scratch file, e.g. <scratchpad>/applied-rows.json:
[{"row":29,"apply_date":"6/30","company":"NationMind LLC","title":"AI Engineer Developer","city":"","url":"","confidence":"high","note":"clean company+title"}]
3. Persist into the cache
Run from the repo root:
.venv/bin/python -m triage --sync-applied <scratchpad>/applied-rows.json
It computes the canonical keys (same composite_id the ranker uses, plus a normalized-URL key), REPLACES
applied.json (the sheet is the source of truth), and prints how many were auto-blocked vs held for review.
4. Report to Ben
Give a tight summary: N records synced, N auto-blocked, and list the "held for review" rows (the
low-confidence ones) by row number + best-guess so he can eyeball or clean them in the sheet. Mention that
keeping the sheet's hiring company + title columns clean on new rows makes future syncs bulletproof.
Rules
- Read-only on the sheet — never write back to Google.
- The sheet fully replaces
applied.jsoneach run; don't try to merge by hand. - The sync runs ONE WAY: the Sheet is Ben's own dashboard and nothing here ever writes to it.