Skip to content
All builds

SeamResume Tailor

What it does for you

Tailors a resume to one job posting using only a confirmed master profile, turns every unsupported requirement into a question, and traces every line back to its source bullet.

Seam screenshot

Screenshots

Seam screenshot 1

In more detail

Seam turns one master resume into a version tailored to a specific job posting. It only uses bullets you have already written and confirmed. If the job asks for something your profile does not show, Seam asks you about it instead of writing it in.

Honest limits

I did not hand-review every line of the core. The test suite and the guard are what I am trusting. Claude mode was not called live. The Google Fonts request failed in the build sandbox, so screenshots show fallback fonts. The page budget estimates lines from character counts, not rendered height.

How I built it

This was one of the Claude Cowork projects. I told Cowork to one-shot all of them, and I set the rule that shapes this one: never invent experience, gaps become questions, and the demo uses a fictional person so no real history is in the repo. Cowork specced it, built the core, the UI, the server, and the 205-assertion test suite, checked the screenshots, rendered sample PDFs, and wrote the docs in one autonomous pass.

Cowork designed the scoring, a synonym map of about 70 terms, the one-page line budget, and the guard rules. It wrote the demo data so every case shows up: a must-have gap (Airflow), a years gap (dbt), and a spelling mirror (PostgreSQL to Postgres). A missing skill becomes a question like "The posting lists Airflow. Have you used it?" and never becomes resume text.

The key piece is one guard function that referees both the local engine and the optional Claude mode. Every output line carries the id of the bullet it came from. The guard accepts "cut refresh from 5 hours to 40 minutes by rebuilding 64 dbt models" and rejects "cut refresh time 90%," because 90% was never in the source.

What I learned

  • The fabrication check has to compare each output line against its own source bullet, not the whole profile. A number like 40 exists somewhere in the profile, so a profile-wide check would let a rephrase move it into the wrong bullet. Per-bullet sets for numbers and terms close that hole.
  • A light rephrase can trip a proper-noun check. Mirroring "Postgres" for "PostgreSQL" adds a capitalized word the source never had, so the guard allows aliases of terms already in that bullet and nothing else.
  • Requirement priority works best as the max over every line a term appears in. Looker shows up in a neutral line and again under "Nice to have," and taking the highest priority gave the right answer in every demo case.
  • Experience math needs merged month ranges with inclusive ends. Summing jobs double counts overlaps, and a missed end month makes a 12-month role read as 11, which is enough to flip a "3+ years" check.

What carried forward

It follows the sprint's tested-core pattern: one DOM-free module (tailor.js) used by the page and verify.mjs, plus serve.mjs. It also ships a Cowork skill that runs the same workflow with Drive, Chrome, and Gmail as read-only inputs and draft-only outputs. The per-line guard idea sits next to #71's recomputed citation check and #77's quoted evidence: in all three, the AI's output has to prove itself in code.

The next day, #86 Candor imported tailor.js from this folder instead of rewriting it: the job-post analyzer, the term vocabulary with aliases, and guardText, the fabrication check. Candor built its bigger evidence-locked guard on top. It is the only Cowork build whose code a Claude Code project imports.

If I took it further

I would add a small profile editor so someone can answer a gap question and add the bullet right there instead of editing JSON. I would also import an existing resume as a draft the person confirms line by line.

#076 Built with Claude Cowork September 23, 2026 205 automated checks

Want one like this?