CodeWalnut resume shortlisting
Use this workflow as decision support for a human hiring team. Evaluate only job-relevant evidence in the resumes. Do not use or infer age, gender, caste, race, religion, disability, marital/family status, nationality, photographs, or other protected/personal traits. Do not penalize names, addresses, employment gaps, graduation dates, resume aesthetics, or non-native writing. Omit phone numbers, email addresses, street addresses, and unrelated personal details from outputs.
Load the evaluation framework
Before evaluating candidates, read:
references/profile-routing.md to identify React, Java, and full-stack tracks and assign the required profile classification.
references/rubric.md for the shared P0-P3 evidence levels and the Java backend track when Java/Spring evidence is plausible.
references/frontend-react-rubric.md for the React track when React evidence is plausible.
references/historical-patterns.md only to calibrate Java backend evidence and tier boundaries. Never use its earlier frontend-led backend rejections against a React candidate.
references/input-handling.md for uploaded, folder, Drive, duplicate, scan, and failure handling.
references/output-format.md for the required Markdown and JSON structures.
references/google-sheets-workflow.md when the input is a Google Sheet or the user asks for recurring/incremental row processing.
Treat the rubrics as evidence frameworks rather than technology checklists. A candidate does not need every named tool. Strong core React capability can justify shortlisting a frontend candidate without optional differentiators, and a strong specialization on one side of a Java + React profile should not be averaged into a rejection.
Workflow
1. Establish the input set
- For a Google Sheet or Drive-hosted Office workbook, follow
references/google-sheets-workflow.md first. Read the shortlisted tab before selecting candidates. Treat matched candidates already present there as authoritative shortlisted records, then select the first five reviewable source rows whose Resume Status - CW is neither shortlisted nor not shortlisted.
- Resolve every uploaded PDF or Microsoft Word resume (
.docx, .docm, or legacy .doc), including supported files in supplied folders or reachable through the supplied Drive source.
- Build a manifest before scoring. Record source filename, page count when available, duplicate status, extraction status, and any access/read error.
- If a Drive folder is inaccessible, state the exact blocker and ask for connector authorization, a public link, a ZIP, or direct uploads. Never silently score only the accessible subset.
- Deduplicate identical files, but report every duplicate filename in the intake summary.
When local paths and pypdf are available, scripts/extract_resume_text.py can create page-aware PDF extraction JSON. Use scripts/extract_word_resume_text.py for OOXML Word text, then render the Word document to page images and inspect every page when a supported renderer is available. If rendering is unavailable, complete, coherent OOXML/provider extraction is an acceptable fallback and the candidate remains reviewable. Native document tools are equally acceptable.
2. Read each resume completely
- Extract PDF text page by page. For Word resumes, extract OOXML/provider text and render the document to page images when supported. Inspect every rendered Word page, and inspect rendered PDF pages when extraction is empty, suspiciously short, scrambled, or missing visible sections. If Word rendering is unavailable but extraction is complete and coherent, read the entire extracted document and lower confidence only for content that could not be structurally verified.
- Read all pages. Do not stop after the summary or skills list.
- Create an internal evidence sheet for role chronology, hands-on production work, projects, architecture, UI/data behavior, testing, delivery, ownership, and measurable outcomes.
- Distinguish what the candidate demonstrated, supported, merely claimed, or did not show using P3-P0 evidence levels.
- Treat technology-list entries as P1 until a work or project example explains how they were used.
- Treat precise but implausible or internally inconsistent claims as verification questions, not accusations. Lower confidence rather than inventing a fact.
3. Classify the profile and choose tracks
Use references/profile-routing.md after reading the whole resume:
- Score the React rubric for credible React-focused work.
- Score the Java backend rubric for credible Java/Spring backend work.
- Score both independently for a plausible Java + React full-stack profile.
- Do not call a candidate full stack merely because both technologies appear in a skills list.
- Do not reject a strong React candidate for lacking Java, or a strong Java candidate solely because React is weaker.
Assign exactly one required profile classification from profile-routing.md and record the primary fit as react_frontend, java_backend, or java_react_full_stack.
4. Evaluate engineering substance
For Java evidence, look for mechanisms and consequences across production Java/Spring delivery, APIs, relational data, architecture/reliability, messaging/caching, testing, platform delivery, ownership, and engineering documentation. Apply references/rubric.md.
For React evidence, look for mechanisms and consequences across:
- React and TypeScript production depth;
- component architecture, hooks, reuse, and state choices;
- forms, routing, authentication, REST/API and server-state handling;
- complex tables, grids, dashboards, real-time updates, and performance behavior;
- testing fundamentals and maintainable component design;
- design systems, accessibility, build/deployment, and micro-frontends;
- end-to-end ownership and measurable impact.
Apply references/frontend-react-rubric.md. Missing Storybook, WebSockets, SSE, Playwright, Docker, Module Federation, Vite, or any other single supporting technology is not an automatic rejection. Functional equivalents count.
For full-stack candidates, assess both sides independently and look for actual production integration across UI, APIs, security, contracts, data flow, testing, and delivery. Do not let keyword breadth substitute for depth.
Do not assume absent resume detail means absent ability. Record it as “missing or unverified,” reduce the relevant evidence score, and propose an interview question.
5. Apply gates, tiers, and ranking
- Apply the core gate and category weights for every active track.
- Use
profile-routing.md to derive the overall score from the primary fit. Do not average a strong specialization down because the other track is weak.
- Strong Java plus strong React is the highest-priority full-stack pattern when both sides are production-oriented.
- Moderate evidence on both sides is not automatically stronger than one deep specialization; require supporting project complexity, ownership, or production scope.
- “Best Shortlisted” is exceptional and is never forced. Assign at most one per batch, only when the applicable Best gate and clear-margin rule are met. A full-stack Best also needs a strong second track and demonstrated integration.
- Rank mixed-role batches by recommendation tier first, then evidence quality, production depth, ownership, confidence, and fit for the stated primary role. Cross-track scores are not perfectly interchangeable.
- Raw years, employer prestige, degree prestige, writing polish, and keyword count are not tie-breakers.
- In incremental Sheet mode, the batch contains exactly five successfully reviewable candidates when at least five eligible rows are available, otherwise all remaining reviewable candidates. Existing
shortlisted and not shortlisted decisions are never re-ranked or re-reviewed.
6. Produce auditable outputs
Return the output for the active input mode described in references/output-format.md. When the environment is writable, also save:
shortlist_report.md
shortlist_results.json
Use scripts/validate_evaluation.py shortlist_results.json when JSON is created. Fix validation failures before delivery.
For each evaluated candidate include:
- profile classification, primary fit, active track scores, recommendation, and overall score;
- evidence confidence and concise rationale;
- demonstrated strengths with page/source citations;
- weaknesses relative to the strongest relevant role;
- missing or unverified requirements;
- concrete interview/verification questions.
Put unreadable or blocked files in the data-quality section without fabricating a score.
For successfully evaluated Google Sheet rows, write shortlisted in Resume Status - CW for any shortlisted recommendation and not shortlisted for Rejected. Before every write, re-read the source status cell and shortlisted-tab identities. Append a shortlisted candidate only when no second-tab row matches, and copy only fields that map reliably from source headers. Leave inaccessible, missing, or unreadable resumes unevaluated so a later run can retry them.
7. Quality check
Before finishing, verify:
- discovered resumes = evaluated resumes + unreadable/blocked resumes + true duplicates;
- no candidate was omitted;
- every candidate has exactly one allowed profile classification and an evidence-supported primary fit;
- every plausible Java + React candidate was evaluated on both tracks independently;
- a strong React candidate was not rejected merely for missing optional frontend tools or Java depth;
- a strong Java candidate was not rejected solely for weaker React evidence;
- skill-list mentions did not receive production-level credit;
- every positive claim is traceable to resume evidence;
- rejections explain the job-related gap without insulting language;
- no protected/personal trait or contact detail influenced or appears in the recommendation;
- ranking, track scores, overall score, tier, and prose agree;
- the report explicitly says a human should make the final employment decision;
- in Google Sheet mode, every second-tab candidate was reconciled before the batch, canonical statuses were skipped, and only intended status cells plus duplicate-checked append rows changed.
1---2name: codewalnut-backend-resume-shortlisting-skill3description: Evaluate and rank CodeWalnut candidates for Java backend, React frontend, and Java + React full-stack roles using evidence-weighted rubrics. Use this skill whenever a user asks to shortlist, screen, compare, rank, classify, or explain hiring recommendations for resumes in PDF or Microsoft Word format from uploads, local folders, Google Drive, or a two-tab Google Sheet. In Sheet mode, reconcile the shortlisted tab first, review at most five unevaluated candidates per run, update Resume Status - CW with shortlisted or not shortlisted, and append shortlisted candidates without duplicates.4---56# CodeWalnut resume shortlisting78Use this workflow as decision support for a human hiring team. Evaluate only job-relevant evidence in the resumes. Do not use or infer age, gender, caste, race, religion, disability, marital/family status, nationality, photographs, or other protected/personal traits. Do not penalize names, addresses, employment gaps, graduation dates, resume aesthetics, or non-native writing. Omit phone numbers, email addresses, street addresses, and unrelated personal details from outputs.910## Load the evaluation framework1112Before evaluating candidates, read:13141. `references/profile-routing.md` to identify React, Java, and full-stack tracks and assign the required profile classification.152. `references/rubric.md` for the shared P0-P3 evidence levels and the Java backend track when Java/Spring evidence is plausible.163. `references/frontend-react-rubric.md` for the React track when React evidence is plausible.174. `references/historical-patterns.md` only to calibrate Java backend evidence and tier boundaries. Never use its earlier frontend-led backend rejections against a React candidate.185. `references/input-handling.md` for uploaded, folder, Drive, duplicate, scan, and failure handling.196. `references/output-format.md` for the required Markdown and JSON structures.207. `references/google-sheets-workflow.md` when the input is a Google Sheet or the user asks for recurring/incremental row processing.2122Treat the rubrics as evidence frameworks rather than technology checklists. A candidate does not need every named tool. Strong core React capability can justify shortlisting a frontend candidate without optional differentiators, and a strong specialization on one side of a Java + React profile should not be averaged into a rejection.2324## Workflow2526### 1. Establish the input set2728- For a Google Sheet or Drive-hosted Office workbook, follow `references/google-sheets-workflow.md` first. Read the shortlisted tab before selecting candidates. Treat matched candidates already present there as authoritative `shortlisted` records, then select the first five reviewable source rows whose **Resume Status - CW** is neither `shortlisted` nor `not shortlisted`.29- Resolve every uploaded PDF or Microsoft Word resume (`.docx`, `.docm`, or legacy `.doc`), including supported files in supplied folders or reachable through the supplied Drive source.30- Build a manifest before scoring. Record source filename, page count when available, duplicate status, extraction status, and any access/read error.31- If a Drive folder is inaccessible, state the exact blocker and ask for connector authorization, a public link, a ZIP, or direct uploads. Never silently score only the accessible subset.32- Deduplicate identical files, but report every duplicate filename in the intake summary.3334When local paths and `pypdf` are available, `scripts/extract_resume_text.py` can create page-aware PDF extraction JSON. Use `scripts/extract_word_resume_text.py` for OOXML Word text, then render the Word document to page images and inspect every page when a supported renderer is available. If rendering is unavailable, complete, coherent OOXML/provider extraction is an acceptable fallback and the candidate remains reviewable. Native document tools are equally acceptable.3536### 2. Read each resume completely3738- Extract PDF text page by page. For Word resumes, extract OOXML/provider text and render the document to page images when supported. Inspect every rendered Word page, and inspect rendered PDF pages when extraction is empty, suspiciously short, scrambled, or missing visible sections. If Word rendering is unavailable but extraction is complete and coherent, read the entire extracted document and lower confidence only for content that could not be structurally verified.39- Read all pages. Do not stop after the summary or skills list.40- Create an internal evidence sheet for role chronology, hands-on production work, projects, architecture, UI/data behavior, testing, delivery, ownership, and measurable outcomes.41- Distinguish what the candidate **demonstrated**, **supported**, merely **claimed**, or did **not show** using P3-P0 evidence levels.42- Treat technology-list entries as P1 until a work or project example explains how they were used.43- Treat precise but implausible or internally inconsistent claims as verification questions, not accusations. Lower confidence rather than inventing a fact.4445### 3. Classify the profile and choose tracks4647Use `references/profile-routing.md` after reading the whole resume:4849- Score the React rubric for credible React-focused work.50- Score the Java backend rubric for credible Java/Spring backend work.51- Score both independently for a plausible Java + React full-stack profile.52- Do not call a candidate full stack merely because both technologies appear in a skills list.53- Do not reject a strong React candidate for lacking Java, or a strong Java candidate solely because React is weaker.5455Assign exactly one required profile classification from `profile-routing.md` and record the primary fit as `react_frontend`, `java_backend`, or `java_react_full_stack`.5657### 4. Evaluate engineering substance5859For Java evidence, look for mechanisms and consequences across production Java/Spring delivery, APIs, relational data, architecture/reliability, messaging/caching, testing, platform delivery, ownership, and engineering documentation. Apply `references/rubric.md`.6061For React evidence, look for mechanisms and consequences across:6263- React and TypeScript production depth;64- component architecture, hooks, reuse, and state choices;65- forms, routing, authentication, REST/API and server-state handling;66- complex tables, grids, dashboards, real-time updates, and performance behavior;67- testing fundamentals and maintainable component design;68- design systems, accessibility, build/deployment, and micro-frontends;69- end-to-end ownership and measurable impact.7071Apply `references/frontend-react-rubric.md`. Missing Storybook, WebSockets, SSE, Playwright, Docker, Module Federation, Vite, or any other single supporting technology is not an automatic rejection. Functional equivalents count.7273For full-stack candidates, assess both sides independently and look for actual production integration across UI, APIs, security, contracts, data flow, testing, and delivery. Do not let keyword breadth substitute for depth.7475Do not assume absent resume detail means absent ability. Record it as “missing or unverified,” reduce the relevant evidence score, and propose an interview question.7677### 5. Apply gates, tiers, and ranking7879- Apply the core gate and category weights for every active track.80- Use `profile-routing.md` to derive the overall score from the primary fit. Do not average a strong specialization down because the other track is weak.81- Strong Java plus strong React is the highest-priority full-stack pattern when both sides are production-oriented.82- Moderate evidence on both sides is not automatically stronger than one deep specialization; require supporting project complexity, ownership, or production scope.83- “Best Shortlisted” is exceptional and is never forced. Assign at most one per batch, only when the applicable Best gate and clear-margin rule are met. A full-stack Best also needs a strong second track and demonstrated integration.84- Rank mixed-role batches by recommendation tier first, then evidence quality, production depth, ownership, confidence, and fit for the stated primary role. Cross-track scores are not perfectly interchangeable.85- Raw years, employer prestige, degree prestige, writing polish, and keyword count are not tie-breakers.86- In incremental Sheet mode, the batch contains exactly five successfully reviewable candidates when at least five eligible rows are available, otherwise all remaining reviewable candidates. Existing `shortlisted` and `not shortlisted` decisions are never re-ranked or re-reviewed.8788### 6. Produce auditable outputs8990Return the output for the active input mode described in `references/output-format.md`. When the environment is writable, also save:9192- `shortlist_report.md`93- `shortlist_results.json`9495Use `scripts/validate_evaluation.py shortlist_results.json` when JSON is created. Fix validation failures before delivery.9697For each evaluated candidate include:9899- profile classification, primary fit, active track scores, recommendation, and overall score;100- evidence confidence and concise rationale;101- demonstrated strengths with page/source citations;102- weaknesses relative to the strongest relevant role;103- missing or unverified requirements;104- concrete interview/verification questions.105106Put unreadable or blocked files in the data-quality section without fabricating a score.107108For successfully evaluated Google Sheet rows, write `shortlisted` in **Resume Status - CW** for any shortlisted recommendation and `not shortlisted` for `Rejected`. Before every write, re-read the source status cell and shortlisted-tab identities. Append a shortlisted candidate only when no second-tab row matches, and copy only fields that map reliably from source headers. Leave inaccessible, missing, or unreadable resumes unevaluated so a later run can retry them.109110### 7. Quality check111112Before finishing, verify:113114- discovered resumes = evaluated resumes + unreadable/blocked resumes + true duplicates;115- no candidate was omitted;116- every candidate has exactly one allowed profile classification and an evidence-supported primary fit;117- every plausible Java + React candidate was evaluated on both tracks independently;118- a strong React candidate was not rejected merely for missing optional frontend tools or Java depth;119- a strong Java candidate was not rejected solely for weaker React evidence;120- skill-list mentions did not receive production-level credit;121- every positive claim is traceable to resume evidence;122- rejections explain the job-related gap without insulting language;123- no protected/personal trait or contact detail influenced or appears in the recommendation;124- ranking, track scores, overall score, tier, and prose agree;125- the report explicitly says a human should make the final employment decision;126- in Google Sheet mode, every second-tab candidate was reconciled before the batch, canonical statuses were skipped, and only intended status cells plus duplicate-checked append rows changed.