- .env.example documents the production model (gpt-4o-mini-2024-07-18) and a
4000-token output cap; the model rejects caps above 16384 with a 400, which
the old 32768 value triggered on every llm_call request.
- llm_setup: safe default cap and per-call token/cache usage logging.
- agent/prompt: job posts precede the resume so the stable block hits the
prompt cache for every CV after the first in a sync run.
- inbox: On-Hold rescan pairs candidates with active jobs only; scores against
closed roles were paid for and never shown.
- app: ruff formatting for the config/model edits from main, and an accurate
comment on why gpt-4o-mini is admitted while the rest of gpt-4o is not.
Verified live on gpt-4o-mini: llm_call and the scorer both succeed, the
28-check scoring audit passes, ruff/mypy/pytest pass for app.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Deploy to S3 / checks (push) Failing after 2m24sDetails
Deploy to S3 / deploy (push) Has been skippedDetails
The bank used to be write-only: a CV uploaded with no job carried only its
full text, so nothing could search or rank it. Now the employment agent's
extraction (title, company, education, plus new skills and years_experience,
both clamped to what the resume actually states) is stored on the row, and
the bank is ranked against a job the moment that job opens.
- New CV Bank screen at /cvbank replaces Talent Pool; the inline bank card
moves out of CV Import. One table, two populations: speculative uploads,
and silver medalists (rejected applicants scoring >= CV_BANK_SILVER_FLOOR,
read live from their application rather than copied).
- matching/ranking.py: the tier-1 keyword ranker moves out of
talent/plugins.py so Find Talent and the bank share one implementation;
talent/plugins.py re-exports it and its numbers are unchanged.
- Taskiq tasks in job.candidate.bank_tasks: backfill profiles for CVs
banked before extraction existed, and rank the bank when a job opens so
recruiters are told about matches above CV_BANK_SUGGEST_THRESHOLD.
Retention (CV_BANK_RETENTION_MONTHS) is stamped on the row at upload; the
sweep flags expired rows and never deletes.
- Migrations 029 (bank profile columns) and 030 (per-job bank matches).
- Routes: POST /candidate/cv-bank/score, GET /candidate/cv-bank/suggestions.
- README: The CV Bank, plus the retention and deletion policy.
Also in this change:
- Inbox, Sheet Forms: has_linkedin / has_resume filters, tri-valued so
"no link" is a real filter and NULL rows are kept in it; tab badge counts
now narrow with the list and the search box.
- Hiring-manager candidate rows carry the ATS score and band.
- Tests: analytics dashboard merge logic, employment extraction clamps,
form-data filters, manager candidate serializer, CV Bank mapper.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>