ATS resume rewriter: section-by-section rewrite to resume.yaml to template, with skill confirmation UX #72

Closed
opened 2026-04-06 09:07:31 -07:00 by pyr0ball · 1 comment
Owner

Implemented

Backend

  • build_review_diff() in resume_optimizer.py — produces per-section diffs: skills_diff (per-chip), text_diff (summary), bullets_diff (experience per-entry)
  • export_pdf() in resume_optimizer.py — ReportLab single-column PDF (Helvetica, ATS-safe)
  • save_resume_draft(), get_resume_draft(), finalize_resume(), get_resume_archive() added to db.py
  • Migration 003_resume_review.sql adds resume_draft_json and resume_archive_json columns
  • Task runner enters awaiting_review after hallucination check passes; writes structured diff to resume_draft_json
  • db_migrate.py hardened: PRAGMA-based pre-check prevents duplicate ADD COLUMN failures from recording as applied when columns are missing
  • Cloud middleware now runs migration on each per-user DB at first request

API (new endpoints)

  • GET /api/jobs/{id}/resume_optimizer/review — returns draft diff
  • POST /api/jobs/{id}/resume_optimizer/review — apply decisions, finalize, archive
  • GET /api/jobs/{id}/resume_optimizer/export-pdf — ReportLab PDF download
  • GET /api/jobs/{id}/resume_optimizer/history — past versions newest-first

Vue (ResumeOptimizerPanel.vue)

  • Skills review: per-chip checkboxes (all approved by default, user un-checks skills they do not have)
  • Summary review: side-by-side original vs proposed, accept/reject toggle
  • Experience review: per-entry accept/reject with bullet diff
  • Finalize Resume button → resolves awaiting_review, writes final text
  • Download .txt + Download PDF buttons
  • Version history: collapsible list of past versions with Restore
## Implemented **Backend** - `build_review_diff()` in `resume_optimizer.py` — produces per-section diffs: `skills_diff` (per-chip), `text_diff` (summary), `bullets_diff` (experience per-entry) - `export_pdf()` in `resume_optimizer.py` — ReportLab single-column PDF (Helvetica, ATS-safe) - `save_resume_draft()`, `get_resume_draft()`, `finalize_resume()`, `get_resume_archive()` added to `db.py` - Migration `003_resume_review.sql` adds `resume_draft_json` and `resume_archive_json` columns - Task runner enters `awaiting_review` after hallucination check passes; writes structured diff to `resume_draft_json` - `db_migrate.py` hardened: PRAGMA-based pre-check prevents duplicate ADD COLUMN failures from recording as applied when columns are missing - Cloud middleware now runs migration on each per-user DB at first request **API** (new endpoints) - `GET /api/jobs/{id}/resume_optimizer/review` — returns draft diff - `POST /api/jobs/{id}/resume_optimizer/review` — apply decisions, finalize, archive - `GET /api/jobs/{id}/resume_optimizer/export-pdf` — ReportLab PDF download - `GET /api/jobs/{id}/resume_optimizer/history` — past versions newest-first **Vue** (`ResumeOptimizerPanel.vue`) - Skills review: per-chip checkboxes (all approved by default, user un-checks skills they do not have) - Summary review: side-by-side original vs proposed, accept/reject toggle - Experience review: per-entry accept/reject with bullet diff - Finalize Resume button → resolves `awaiting_review`, writes final text - Download .txt + Download PDF buttons - Version history: collapsible list of past versions with Restore
Author
Owner

Decisions locked:

  1. resume.yaml scope: per-job. Each application gets its own tailored copy stored in the DB (new column on jobs or a dedicated resume_drafts table). A history/archive view lets users pull a previous tailored resume as a starting point for a new application.

  2. Skill confirmation flow: async. Task runner saves suggested skills and sets status to awaiting_review. UI surfaces confirm/reject chips. Confirming resumes the rewrite pass. Task thread is not blocked.

  3. Template: reportlab for v1 (already in env, no new deps). HTML + wkhtmltopdf is a premium follow-on for custom template designs.

Decisions locked: 1. **resume.yaml scope**: per-job. Each application gets its own tailored copy stored in the DB (new column on jobs or a dedicated resume_drafts table). A history/archive view lets users pull a previous tailored resume as a starting point for a new application. 2. **Skill confirmation flow**: async. Task runner saves suggested skills and sets status to awaiting_review. UI surfaces confirm/reject chips. Confirming resumes the rewrite pass. Task thread is not blocked. 3. **Template**: reportlab for v1 (already in env, no new deps). HTML + wkhtmltopdf is a premium follow-on for custom template designs.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: Circuit-Forge/peregrine#72
No description provided.