14
Job Search AI구직 지원 프레임워크
A job application framework that runs on your own machine — and a demo that had to stop pretending before it was worth shipping.자신의 기계에서 도는 구직 지원 프레임워크 — 그리고 내보낼 가치를 갖기 전에 흉내내기를 멈춰야 했던 데모.
The problem
Every application wants the same CV said differently, and the documents involved — your full history, your salary floor, what you will not accept — are among the more private things you own. Hosted résumé tools want them on their servers. But the harder problem turned out to be one the tool created itself: a demo that returns a plausible number is indistinguishable from a tool that works. This one had a dashboard of invented statistics, a badge reading “0% Fabrication”, and a repository containing a fact-grounding rule that forbids inventing numbers. Pasting in a posting for a pastry chef — laminated dough, 5am starts, no computers involved whatsoever — returned a 92% alignment score, a PASS on a salary range nobody had stated, and 100% on Python.지원할 때마다 같은 이력서를 다르게 말해야 하고, 거기 들어가는 문서 — 전체 경력, 최소 희망 연봉, 받아들일 수 없는 조건 — 는 가진 것 중 사적인 편에 속합니다. 호스팅형 이력서 도구들은 그것을 자기 서버에 올리길 원합니다. 그런데 더 어려운 문제는 도구가 스스로 만든 것이었습니다: 그럴듯한 숫자를 돌려주는 데모는 실제로 작동하는 도구와 구별되지 않습니다. 이 앱에는 지어낸 통계로 채운 대시보드와 “0% Fabrication” 배지가 있었고, 같은 레포 안에 숫자를 지어내는 것을 금지하는 fact-grounding 규칙이 있었습니다. 제빵사 구인공고를 붙여넣으면 — 라미네이션 반죽, 새벽 5시 출근, 컴퓨터는 전혀 관여하지 않음 — 92% 적합도와, 아무도 명시하지 않은 급여 범위에 대한 PASS와, Python 100%가 돌아왔습니다.
What it does
The pipeline is a set of Claude Code skills and commands: score a posting, tailor a CV to it, draft a letter, build an interview pack. It reads your documents off your own disk and nothing leaves it, and a fact-grounding protocol governs every output — rephrasing and reordering allowed, inventing a metric or a technology forbidden. The web dashboard is now split honestly. Its evaluator computes: paste a posting and a CV and it reports keyword coverage against a lexicon, a per-category breakdown, a constraint audit that parses salary, work arrangement and years out of the posting text, and — the useful half — the terms the posting asks for that your CV does not contain. All of it deterministic, in the browser, with no API key, which is what lets a static page show a real number. Every other tab is a placeholder and says so on screen, and the notice is rendered once above the tab content so a tab added later cannot ship without it.파이프라인은 Claude Code 스킬과 커맨드 묶음입니다: 공고 평가, 이력서 튜닝, 커버레터 초안, 면접 준비 팩. 사용자 디스크에서 문서를 읽고 아무것도 밖으로 나가지 않으며, fact-grounding 프로토콜이 모든 출력을 통제합니다 — 재표현과 재배열은 허용, 수치나 기술을 지어내는 것은 금지. 웹 대시보드는 이제 정직하게 갈라졌습니다. 평가기는 실제로 계산합니다: 공고와 이력서를 붙여넣으면 어휘집 대비 키워드 커버리지, 카테고리별 분석, 공고 텍스트에서 급여·근무형태·연차를 파싱한 제약 감사, 그리고 — 유용한 절반 — 공고가 요구하는데 이력서에 없는 용어 목록을 냅니다. 전부 결정론적이고, 브라우저 안에서, API 키 없이 — 그것이 정적 페이지가 진짜 숫자를 보여줄 수 있는 이유입니다. 나머지 탭은 placeholder이고 화면에 그렇다고 적혀 있으며, 그 고지는 탭 콘텐츠 위에 한 번만 렌더링되어 나중에 추가되는 탭이 그것 없이 배포될 수 없게 했습니다.
Why it matters
Two rules live in the matching code rather than in the interface, because an interface is where a rule goes to be forgotten. A posting containing no term the lexicon recognises returns no score and says why — the pastry-chef posting is now a test case rather than a 92%. And an unstated constraint is reported as NOT STATED, never as a pass; the third verdict exists because the previous version passed a salary check against a range it had invented. The wording moved with the mechanics: the tool will not say “strong match” or “highly recommended”, and a test asserts it says no such thing, because coverage is a property of two documents rather than a prediction about an interview. What it measures is your document, not you — a skill you have and did not write down scores zero here, exactly as it does in a real screen, which is why the gap list matters more than the score. Twenty-nine tests, gated in CI, no key required to run them — two of them added after the deployed page read “hybrid retrieval” in a fully remote posting as a hybrid work arrangement.두 규칙이 인터페이스가 아니라 매칭 코드 안에 있습니다. 인터페이스는 규칙이 잊히러 가는 곳이기 때문입니다. 어휘집이 인식하는 용어가 하나도 없는 공고는 점수를 내지 않고 이유를 말합니다 — 제빵사 공고는 이제 92%가 아니라 테스트 케이스입니다. 그리고 명시되지 않은 제약은 통과가 아니라 NOT STATED로 보고됩니다. 세 번째 판정값이 존재하는 이유는 이전 버전이 자기가 지어낸 급여 범위에 통과를 줬기 때문입니다. 문구도 함께 움직였습니다: 이 도구는 “strong match”나 “highly recommended”를 말하지 않고, 그런 말을 하지 않는지 검사하는 테스트가 있습니다. 커버리지는 두 문서의 속성이지 면접에 대한 예측이 아니기 때문입니다. 이것이 재는 것은 당신이 아니라 당신의 문서입니다 — 갖고 있지만 적지 않은 스킬은 여기서 0점이고, 실제 서류전형에서도 그렇습니다. 그래서 갭 목록이 점수보다 중요합니다. 테스트 29개, CI에서 게이트, 실행에 키 불필요 — 그중 둘은 배포된 페이지가 완전 재택 공고의 “hybrid retrieval”을 하이브리드 근무형태로 읽은 뒤에 추가됐습니다.
Claude Code skillsIn-browser matchingFact groundingLocal & privateVitest + CI