Log LLM generation start/completion events at info level with timing and character metrics. Add warning logging when PotionPicker initialization fails, improving observability for model availability and performance monitoring.
Remove char limits; expand template variants
Hemprasad Badgujar
c408892
Removed arbitrary character ceilings that silently discarded well-formed explanations without improving output quality. Instead:
- Relaxed reasoning char limit in compose.py (removed 500 char trim)
- Separated summary and experience truncation in engine.py (independent 500/900 budgets) so verbose summaries no longer starve role descriptions
- Removed upper bound in tiers.py polish() check (kept 120 char floor)
- Expanded all template banks from ~6 to 9 variants each for better phrasing diversity
- Expanded BEHAVIOR_TAGS from 3-4 to 5 variants per slot
Length constraints are now enforced at generation time (max_tokens) and validation (floor only), allowing grounded, well-structured prose through.
Explain: natural 'relevant to the requirement' tail, high variety
Hemprasad Badgujar
c5b9caf
The closing clause read mechanically ("with keyword matches on skills,
job titles and education") and felt templated (always "with...", always
ending "requirements").
- Reframe as natural recruiter English: the matched fields are RELEVANT
to the role's requirements, e.g. "skills, title and education map
cleanly to the brief" / "a close fit on skills and title".
- 18 varied tails with DIFFERENT openers (", with" / "; <clause>" / ", a
match on" / ", strong on") and DIFFERENT ending nouns (role / brief /
spec / posting / listing / needs / ask / requirements) so it never
reads as a fixed template.
- field label "job titles" -> "title"; update the LLM one-shot to match.
Verified over a full run: 81/100 distinct signal sentences, 100/100
distinct reasonings, 0 "with"-prefixed, ending nouns spread, max 497
chars, 0 dashes. 93 tests pass.
Explain: A+B sentence structure, behavioral framing, more variety
Hemprasad Badgujar
362838c
Reasoning rewrite per feedback — present strengths then behavior, no
template feel, no AI-looking em-dashes.
- Structure (A+B): S1 identity + fit verdict; S2 strengths (+<=1 soft gap
on T3/T4); S3 behavioral signals as a NARRATIVE (open to work, in
recruiter demand, active in open source) not a data dump; S4 why-ranked
(dominant signal + which JD fields matched lexically).
- Drop the rank ordinal ("top 10") — redundant with the rank column;
replace with concrete signal + BM25 field-hit detail.
- Variety so it doesn't read as a template: varied openers, connectives
(and / as well as), gap pivots (though / albeit / the main gap being),
and 5 behavior-sentence forms. Result: 100/100 distinct reasonings.
- No em-dashes anywhere (commas/periods/colons only).
- Grammar fixes: a/an before vowels, no doubled connectives, no
"...is that <noun phrase>", no doubled seniority ("Lead Staff").
- Length guard: trims keyword tail then strengths so every line <500.
- Location promoted in…