Ingest Resume History Skill
When to use
First-time setup, or whenever the user adds new source material (old resumes, work-history notes) to inbox/ and wants it merged into content/master.yaml.
Hard rules
- Never overwrite
master.yamlwithout showing diffs and getting explicit approval. - Always run
bun run ingestfirst to produce the extracted text. Do not try to read PDFs directly. - Dedupe conservatively. Prefer flagging possible duplicates to the user over silently merging them.
Workflow
1. Extract
Run:
bun run ingest
This reads everything in inbox/ and writes plain-text versions to inbox/.extracted/.
2. Read everything
- All files in
inbox/.extracted/ - Current
content/master.yaml(if it exists; may be the example)
3. Propose a reconciled master
Build a proposed master.yaml that:
- Collects roles across all sources, keyed by
(company, title, start)for dedupe. - Merges bullet variants for the same role: prefer longer/more specific wording; flag conflicts to the user.
- Assigns stable IDs. ID scheme:
<company-slug>-<startYear>for roles;<role-id>-<keyword>for bullets. - Preserves any existing IDs in the current
master.yamlexactly — do not renumber.
Present the proposal as:
- A list of new roles being added (with reasoning: "from Acme-2023.pdf").
- A list of new bullets per existing role.
- A list of possible duplicates you'd like confirmation on.
4. Apply on approval
On explicit user approval, write the full proposed master.yaml. Commit:
git add content/master.yaml
git commit -m "Ingest history from inbox"
5. Archive originals
Move processed PDFs from inbox/ to jobs/archive/<inferred-company>/ (create folder if needed). For each moved PDF, create a stub job.md next to it with whatever context you can infer from filename or content. If inference is weak, write "inferred context TBD" and flag to the user.
Editing discipline
- When re-running ingest on new files, update master incrementally — do not regenerate from scratch.
- If a source file contradicts existing master content (e.g., different dates for the same role), raise the conflict to the user rather than picking a winner.