Ein Claude Skill, der die Interview-Scorecards eines abgelehnten Kandidaten (und, wenn verfügbar, BrightHire- oder Metaview-Transkripte) verarbeitet, eine evidenzbasierte Absage-E-Mail oder Gesprächsleitfaden-Notizen für den Recruiter-Anruf entwirft und die recruiter-seitigen Notizen für den Anruf produziert. Ersetzt die Formular-Absage, die die Candidate Experience beschädigt, durch personalisiertes Feedback, das der Kandidat tatsächlich verwenden kann — und verweigert die Ausführung, wenn das Rubrik fehlt, der Loop nicht konvergiert hat oder der Fall jurisdiktionsseitig markiert ist.
Wann verwenden
Der Kandidat hat mindestens ein Onsite oder eine Final-Stage-Runde erreicht, wo er gemäß den Kosten des Recruiting-Funnels genug Zeit investiert hat, um eine echte Antwort zu verdienen.
Das Team hat mindestens zwei abgezeichnete Scorecards für den Kandidaten (Ashbysubmitted: true, Greenhousestatus: complete, Leverstate: completed). Eine Scorecard ist die Perspektive eines Interviewers; der Skill verweigert die Synthese von Feedback aus einer einzigen Perspektive, da dies das Unternehmen dem Risiko selektiver Beweisführung aussetzt.
Eine Rollenrubrik existiert unter rubrics/<role_id>.yaml mit Verhaltensankern pro Dimension (dieselbe Quelle, die der Interview-Debrief-Skill liest). Der Skill bewertet anhand von Rubrik-Ankern, nicht anhand von Freitext-Scorecard-Prosa.
Der Kandidat hat ausdrücklich Feedback angefordert (schriftlich im ATS festgehalten), ODER die Aufenthalts-Jurisdiktion des Kandidaten ist eine, in der unaufgefordertes Feedback kein dokumentiertes Risiko gemäß der HR-Rechtsberatung des Benutzers trägt.
Ein Recruiter überprüft und bearbeitet jeden Entwurf vor dem Versand. Der Skill schreibt Entwürfe auf die Festplatte und stoppt; er definiert keine send-Aktion.
Wann NICHT verwenden
Automatisches Versenden ohne Recruiter-Überprüfung. KI-entworfenes und gesendetes Absagefeedback ist der zuverlässigste Weg, einen EEOC-, ADA- oder staatlichen Arbeitsrechtsfall zu produzieren. Der Recruiter ist das Gate. Wenn das Ziel darin besteht, den Menschen aus dem Loop zu entfernen, ist dies der falsche Workflow.
Kandidaten, die in Deny-Jurisdiktionen kein Feedback angefordert haben. Frankreich (Code du travail-Risiko bei dokumentierten Absagegründen), Deutschland (AGG § 22 Beweislastverschiebung) und jede Jurisdiktion, die die HR-Rechtsberatung des Benutzers mit unsolicited_feedback: deny in der Richtliniendatei markiert hat. Der Skill verweigert in diesen Fällen spezifische Angaben und schreibt stattdessen die generische Ablehnungsvorlage. Bearbeiten Sie die Richtliniendatei nicht, um einen Deny-Jurisdiktionsfall zu bestehen.
Fälle, die die Rechtsabteilung markiert hat. Aktiver Streit, unbearbeiteter Anfrage auf Anpassung oder eine laufende Beschwerde. Der Skill gibt einen generischen Ablehnungsentwurf zurück und meldet die Markierung dem Recruiter. Spezifika zu einem markierten Fall werden zu Beweismitteln im Streit.
Absagen in frühen Phasen (Lebenslaufprüfung, Recruiter-Screening). Standardmäßige Ablehnung ist das richtige Werkzeug; die Pro-Kandidaten-Modellkosten und die Recruiter-Überprüfungszeit zahlen sich nicht in der oberen Trichterstufe aus. Der Skill ist für Kandidaten, die mindestens ein Onsite erreicht haben.
Vergleichsranking (Sie waren unser zweiter Wahl, wir hatten stärkere Kandidaten). Der Skill verweigert die Ausführung — das Rubrik-zu-Feedback-Mapping enthält diese Sprache nicht, und die Blocklist grep sie heraus. Vergleichsranking ist das, was eine konstruktive Absage in einen Glassdoor-Beitrag verwandelt.
Prozessverbesserungsanfragen (Kandidaten um Feedback zum Interview, eine Empfehlung oder ein Testimonial bitten). Gegenanfragen in einer Absage-E-Mail sind ein EEOC-Zeugenerklärungsrisiko und ein Schaden für die Candidate Experience. Die Blocklist fängt sie ab.
Einrichtung
Bundle ablegen. Platzieren Sie apps/web/public/artifacts/rejection-feedback-claude-skill/SKILL.md in Ihrem Claude Code Skills-Verzeichnis (oder claude.ai benutzerdefinierte Skills mit Tier-A-Autorisierung für Kandidatendaten gemäß KI-Richtlinie).
Rubrikquelle konfigurieren. Der Skill liest Rollenrubriken aus rubrics/<role_id>.yaml — gleicher Pfad wie der Interview-Debrief-Skill. Wenn die Rubrik nicht existiert, verweigert der Skill die Ausführung. Strukturiertes Interviewing ist die Voraussetzung, nicht dieser Skill.
Rubrik-zu-Feedback-Mapping ausfüllen. Kopieren Sie references/1-rubric-to-feedback-mapping.md und ersetzen Sie die Vorlagenformulierungen durch die genehmigten kandidatenseitigen Formulierungen Ihres Teams pro Rubrikdimension. Holen Sie einmalig die Genehmigung der HR-Rechtsberatung für die genehmigte Formulierung ein; das Prüfprotokoll erfasst den SHA-256 des Mappings pro Lauf, sodass Revisionen im Retro sichtbar sind.
Jurisdiktions-Richtliniendatei schreiben. Eine YAML-Datei mit einem Block pro Jurisdiktion, in der Ihr Unternehmen einstellt. Jeder Block setzt unsolicited_feedback: allow oder deny und verweist auf das relevante HR-Rechtsberatungs-Memo. Das Bundle liefert eine Vorlage; die Deny-Standardwerte sind Frankreich, Deutschland und jede Jurisdiktion mit aktiver beschäftigungsrechtlicher Guidance gegen dokumentierte Absagegründe.
ATS API konfigurieren. Ashby, Greenhouse oder Lever API-Token mit Lesezugriff auf Scorecards und Kandidaten. Der Skill ruft Scorecards nach candidate_id ab; er akzeptiert keinen eingefügten Scorecard-Text, da dieser nicht auf den Quell-Interviewer zurückverfolgt werden kann.
Optional: Transkript-Bundle konfigurieren. BrightHire oder Metaview API-Zugriff. Wenn eine transcript_id bereitgestellt wird, vergleicht der Skill Scorecard-Behauptungen mit Transkript-Turns in Schritt 4.
Trockendurchlauf mit einem geschlossenen Kandidaten. Führen Sie den Skill für einen Kandidaten aus, der im letzten Quartal bereits abgelehnt wurde. Vergleichen Sie den Entwurf des Skills mit dem, was der Recruiter tatsächlich gesendet hat. Passen Sie das Rubrik-zu-Feedback-Mapping an, wenn die Kalibrierung abweicht — das Mapping, nicht das Modell, ist in der Regel der Hebel.
Was der Skill tatsächlich tut
Sechs Schritte, in Reihenfolge. Die Reihenfolge ist wichtig: Jurisdiktions-Gating und Scorecard-Validierung erfolgen, bevor das LLM jemals Kandidateninhalte liest, da das Freischalten des Modells auf Scorecard-Text in einem Deny-Jurisdiktionsfall einen Modellaufruf-Protokolleintrag mit kandidatenidentifizierenden Daten hinterlässt, die das Unternehmen nicht aufbewahren musste.
Jurisdiktionsrichtlinie und Einwilligung validieren. Schlagen Sie die Jurisdiktion des Kandidaten in der Richtliniendatei nach. Wenn die Richtlinie unsolicited_feedback: deny lautet und der Kandidat kein schriftliches Feedback angefordert hat, stoppen Sie Spezifika und wechseln zur generischen Ablehnungsvorlage. Die Entscheidung, die Einwilligung vor dem Abrufen von Scorecards zu prüfen, hält die Datenminimierungsgeschichte für DSGVO Art. 5(1)(c) sauber.
Scorecards (und optional Transkript) abrufen. Abruf über die ATS API. Entwürfe fallen lassen. Wenn der Loop weniger als zwei abgezeichnete Scorecards hat, stoppen — Feedback, das aus der Perspektive eines Interviewers synthetisiert wurde, ist eine Meinung, kein Feedback, und setzt das Unternehmen dem Risiko selektiver Beweisführung aus.
Dimensionen und Belege identifizieren. Berechnen Sie den kross-interviewer-Mittelwert und die Standardabweichung pro Rubrikdimension. Oberflächliche Dimensionen, bei denen Mittelwert ≥ 4 (Stärke, warme Eröffnung) und Mittelwert ≤ 2 (Lücke Kandidat). Verweigern Sie die Darstellung jeder Dimension mit einer kross-interviewer-Standardabweichung ≥ 1,5 — der Loop hat nicht konvergiert, und Feedback zu einer nicht konvergierten Dimension würde einer „aber Interviewer X hat mich mit 5 bewertet”-Herausforderung nicht standhalten. Für jede angezeigte Dimension ziehen Sie wörtliche Belege aus den Scorecards (oder dem Transkript, wenn verfügbar). Kein wörtlicher String → die Dimension wird nicht angezeigt.
Gegen das Rubrik-zu-Feedback-Mapping entwerfen. Übersetzen Sie höchstens eine Stärke und eine Lücke in kandidatenseitige Sprache unter Verwendung von references/1-rubric-to-feedback-mapping.md. Begrenzen Sie auf jeweils eine, damit der Entwurf nicht wie eine defensive Liste wirkt. Die Substitutions-Slots des Mappings werden aus strukturierten Feldern (Scorecard, Rubrik-Anker) oder der Genehmigungsliste ausgefüllt — das LLM schreibt niemals einen Substitutionswert frei, was der Schutz gegen falsche Spezifika ist.
Bias- und Falsch-Spezifika-Screening. Durchsuchen Sie den Entwurf gegen references/2-banned-phrase-blocklist.md. Jeder Treffer hält den Lauf an und zeigt den offendierenden String. Überprüfen Sie, dass jede spezifische Behauptung auf einen wörtlichen Beleg-String aus Schritt 3 zurückgeführt werden kann — Behauptungen ohne Quelle stoppen. Dies ist ein separater Durchgang von Schritt 4; der Screening-Durchgang sieht nur den Entwurfstext, ohne Kenntnis der zugrunde liegenden Scorecards, sodass er eine gesperrte Phrase nicht als „aber der Interviewer meinte X” rationalisieren kann.
Auf Festplatte und Prüfprotokoll schreiben. Schreiben Sie drafts/<candidate-id>.md und (für route: call) drafts/<candidate-id>-call-notes.md gemäß dem Format in references/3-output-format.md. Fügen Sie eine JSONL-Zeile an audit/<YYYY-MM>.jsonl an mit candidate_id_hash (SHA-256, nicht rohe ID), rubric_sha256, blocklist_sha256, mapping_sha256, angezeigten Dimensionen, Blocklist-Treffern, Modell-ID, Zeitstempel. Kein kandidatenidentifizierender Freitext in der Prüfzeile.
Das wörtliche E-Mail-Format, der generische Ablehnungs-Fallback und die Anrufnotizen-Vorlage leben in references/3-output-format.md. Das Format ist festgelegt, da nachgelagerte Verbraucher — Recruiter, Kandidat und zukünftige Prüfer — vorhersehbare Sprache ohne recruiter-spezifische Abweichungen benötigen.
Kostenrealität
Pro Absageentwurf, mit Claude Sonnet 4.5:
LLM-Token — typischerweise 12-25k Eingabe-Token (Rubrik-YAML + Scorecards + Skill-Anweisungen + Referenzdateien) und 0,5-1,5k Ausgabe-Token (der Entwurf plus Anrufnotizen). Bei Sonnet 4.5 sind das ca. 5-10 Cent pro Entwurf. Ein Recruiter-Team mit 200 Absageentwürfen pro Monat gibt 10-20 Dollar an Modellkosten aus.
ATS API-Kosten — null bei Ashby (kostenlose API), Greenhouse (im Tarif enthalten), Lever (enthalten). Transkript-Abrufe gegen BrightHire oder Metaview werden gegen den Pro-Seat-Plan angerechnet; Absagefeedback-Abrufe sind schreibgeschützt und verbrauchen keine neuen Transkript-Credits.
Recruiter-Zeit — der Gewinn liegt hier. Manuelles Verfassen einer durchdachten, evidenzbasierten Absage-E-Mail aus Scorecards dauert 20-30 Minuten pro Kandidat, wenn der Recruiter es gut macht, oder 3 Minuten, wenn er einen Formularbrief einfügt (was die meisten Teams in großem Maßstab letztlich tun). Der Skill produziert den 20-Minuten-Entwurf in unter 30 Sekunden; der Recruiter überprüft und bearbeitet in 4-7 Minuten. Nettoeinsparung: ca. 15-20 Minuten pro Absage auf dem Qualitätsniveau des durchdachten Entwurfs — das sind rund 50-60 Stunden pro Monat für ein Team mit 200 Absagen.
Einrichtungszeit — 30 Minuten für das Rubrik-zu-Feedback-Mapping und die Jurisdiktionsrichtlinie, wenn das Team bereits irgendwo genehmigte kandidatenseitige Formulierungen hat; länger, wenn die HR-Rechtsberatung noch nicht zu Absagefeedback-Sprache konsultiert wurde (dann ist dieses Gespräch die Voraussetzung, nicht dieser Skill).
Der Candidate Experience-Compound-Return. Kandidaten, die mit spezifischem, evidenzbasiertem Feedback abgelehnt werden, bewerben sich eher erneut, empfehlen eher andere und hinterlassen wesentlich seltener schädliche Glassdoor-Bewertungen — in der Recruiting-Literatur häufig zitierte Behauptungen liegen im Bereich 30-50% für Wiederbewerbungsabsicht, obwohl wir keine primäre Quelle für diese Zahlen haben und sie als richtungsweisend behandeln. Der Compound-Return zeigt sich in der Pipeline-Dichte ein Jahr später, nicht im Monat, in dem der Entwurf gesendet wurde.
Erfolgsmetrik
Verfolgen Sie drei Zahlen pro Monat im ATS:
Recruiter-Bearbeitungsabstand pro Entwurf. Die Anzahl der Zeichen, die der Recruiter zwischen dem Entwurf des Skills und der gesendeten Nachricht ändert. Wenn der Bearbeitungsabstand gegen null tendiert, genehmigt der Recruiter per Stempelverfahren — bringen Sie dies im Retro zur Sprache und überprüfen Sie das Rubrik-zu-Feedback-Mapping. Wenn der Bearbeitungsabstand konstant hoch ist, ist das Mapping falsch kalibriert.
Kandidaten-Antwortrate auf die Absage. Antworten auf eine Absage-E-Mail sind in der Regel Dankesnotizen und zukünftige Bewerbungshinweise (gutes Signal) oder Eskalationsnotizen (schlechtes Signal). Verfolgen Sie die Eskalationsrate als Prozentsatz der gesendeten Absagen. Ein Team, das Formblattabsagen verschickt, sieht typischerweise unter 1% Eskalation; das Ziel mit diesem Skill ist es, bei oder unter diesem Basiswert zu bleiben, nicht darüber. Wenn die Eskalationsrate steigt, produziert das Rubrik-zu-Feedback-Mapping Sprache, die falsch ankommt — neu einstellen.
Wiederbewerbungsrate innerhalb von 12 Monaten. Kandidaten, die durch diesen Skill abgelehnt wurden, versus Kandidaten, die durch den alten Formularbrief abgelehnt wurden, gemessen über die nächsten 12 Monate. Der Compound-Vorteil zeigt sich hier, nicht in Modellausgaben oder im Absage-Thread selbst.
vs. Alternativen
vs. Ashbys integrierte Ablehnungsvorlagen. Ashby (und Greenhouse, Lever) liefern Ablehnungsvorlagen mit Zusammenführungsfeldern für Kandidatenname und Rolle. Sie sind Vorlagen, kein Feedback — die Zusammenführungsfelder ziehen keine Scorecard-Belege, und es gibt keine rubrikbasierte Sprachschicht. Verwenden Sie Ashby-Vorlagen für Top-of-Funnel-Absagen, wo Vorlagen ehrlich sind. Verwenden Sie diesen Skill für Absagen in späten Phasen, wo Vorlagen gegenüber der Zeit, die der Kandidat investiert hat, abweisend wirken.
vs. generische Absage-E-Mails. Generische Absage ist die richtige Antwort in Deny-Jurisdiktionsfällen, wenn keine Einwilligung erteilt wurde und wenn die Rubrik kein vertretbares Spezifikum ergeben hat. Der Skill schreibt die generische Ablehnungsvorlage in diesen Fällen Byte für Byte. Der Unterschied ist, dass der Skill die Entscheidung deterministisch gemäß Jurisdiktionsrichtlinie und Rubrikoutput trifft, anstatt dass der Recruiter aus Erschöpfung auf generisch zurückgreift.
vs. manuell vom Recruiter geschriebene Notizen. Manuelle Notizen sind der Goldstandard für Senior- oder VIP-referenzierte Kandidaten, bei denen der Recruiter den Beziehungskontext und die Zeit hat. Der Skill zahlt sich beim Volumen aus — die 80% der Late-Stage-Absagen, bei denen der Recruiter sonst einen Formularbrief einfügen würde, da manuelles Entwerfen in großem Maßstab nicht in den Tag passt. Für das Senior-Tier bietet die Anrufnotizen-Datei dem Recruiter einen strukturierten Ausgangspunkt für den Anruf, und der Recruiter improvisiert von dort.
vs. einem LLM ohne Rubrikdatei und ohne Blocklist. Dies ist der Fehlermodus, gegen den der Skill entwickelt wurde. Ein LLM, das allein aus Scorecards entwirft, ohne Rubrik-Grundlage, ohne Banned-Phrase-Blocklist und ohne Prüfprotokoll, produziert schnellen, selbstsicheren, plausibel klingenden Ablehnungstext — und ungefähr jeder zwanzigste Entwurf enthält ein halluziniertes Zitat, ein Vergleichsranking oder einen Proxy für eine geschützte Klasse. Die Checklisten-Dateien des Bundles sind es, die die Fehlerrate gegen null bewegen.
Fallstricke
EEOC-implizierende Sprache. Geschützt durch die Banned-Phrase-Blocklist in references/2-banned-phrase-blocklist.md, die als separater Durchgang in Schritt 5 ohne Kenntnis der zugrunde liegenden Scorecards läuft. Treffer stoppen den Lauf und zeigen den offendierenden String. Bearbeiten Sie die Blocklist nicht, um einen Entwurf zu bestehen — korrigieren Sie stattdessen die Rubrik oder die Scorecard-Sprache.
Falsche Spezifika vom LLM. Geschützt durch die Regel „keine Synthese ohne wörtliche Zitierung” in Schritt 3. Jede Behauptung im Entwurf muss auf einen wörtlichen String aus einer abgezeichneten Scorecard oder einem Transkript zurückführbar sein. Kein wörtlicher String → die Dimension wird nicht angezeigt. Dies ist der Schutz gegen den häufigsten Fehlermodus von LLM-erstelltem Feedback — plausibel klingende Zitate, die kein Interviewer tatsächlich geschrieben hat, die dem Kandidaten als Fakten präsentiert werden.
Vergleichsranking-Sprache. Geschützt durch das Rubrik-zu-Feedback-Mapping in references/1-rubric-to-feedback-mapping.md, das keine vergleichenden Formulierungen enthält, und durch die Blocklist in Schritt 5, die sie auffängt, wenn sie einschleicht. Vergleichsranking ist das, was eine konstruktive Absage in einen Glassdoor-Beitrag verwandelt.
Selektives Beweisrisiko. Geschützt durch Schritt 2 (Stopp, wenn der Loop weniger als zwei abgezeichnete Scorecards hat) und Schritt 3 (Verweigung der Darstellung von Dimensionen mit kross-interviewer-Standardabweichung bei oder über 1,5). Interviewer-Uneinigkeit wird nicht zu Kandidatenfeedback.
Auto-Send-Drift. Geschützt durch das Fehlen jeglicher send-Aktion im Skill. Entwürfe werden in drafts/<candidate-id>.md für den Recruiter zur Überprüfung, Bearbeitung und zum Versand aus dem ATS-Postausgang geschrieben. Der Recruiter ist das Gate.
Generischer-Boilerplate-Schaden. Geschützt durch Schritt 3’s Weigerung, eine Dimension ohne wörtlichen Beleg anzuzeigen — wenn die Rubrik nichts Sicheres zum Teilen ergibt, schreibt der Skill die generische Ablehnungsvorlage statt schwache Spezifika zu synthetisieren. Generische Absage ist ehrlich; schwache Spezifika sind schlimmer als keine Spezifika.
PII im Prüfprotokoll. Geschützt durch Schritt 6, der nur candidate_id_hash (SHA-256) schreibt, niemals die rohe Kandidaten-ID, den Namen oder den Scorecard-Text. Das Prüfprotokoll dient der Lauf-Reproduzierbarkeit, nicht der Kandidatendatenaufbewahrung. Kandidatenseitige Entwürfe leben in drafts/ unter der eigenen Aufbewahrungsrichtlinie des Recruiters.
Kalibrierungsdrift über Rollen und Senioritätsstufen. Geschützt durch rollenspezifische Rubrik-YAMLs und durch das Rubrik-zu-Feedback-Mapping, das pro Team versioniert ist. Senior-Leadership-Absagen brauchen eine andere Rahmung als Einstiegspositionen; die Mapping-Datei ist der Ort dafür, nicht der Skill-Code.
Datenschutz und Datenresidenz. Stellen Sie sicher, dass der Skill im Rahmen von Tier-A-Enterprise-KI gemäß KI-Richtlinie betrieben wird. Interview-Inhalte sind sensibel; der Kandidat hat nicht zugestimmt, dass sie von einem Drittanbieter-Modell verarbeitet werden, es sei denn, Ihre KI-Richtlinie und Ihre Scorecard-Erhebungs-Einwilligungssprache decken dies ausdrücklich ab.
Stack
Das Skill-Bundle befindet sich unter apps/web/public/artifacts/rejection-feedback-claude-skill/ und enthält:
SKILL.md — die Skill-Definition
references/1-rubric-to-feedback-mapping.md — pro Team ausfüllen, HR-rechtsberatungsgenehmigte Formulierungen pro Rubrikdimension
references/2-banned-phrase-blocklist.md — Vorab-Prüfungen des Entwurfs (nicht bearbeiten, um biased Entwürfe zu bestehen)
references/3-output-format.md — das wörtliche E-Mail-, generische Ablehnungs- und Anrufnotizen-Format
Tools, die der Workflow voraussetzt: Claude (das Modell), Ashby oder Greenhouse oder Lever (das ATS, in dem die Scorecards liegen), und optional BrightHire oder Metaview (Interview-Transkripte für reichhaltigere Beleg-Grundlage). Geschwister-Workflow, der die Rubrikquelle teilt: der Interview-Debrief-Skill.
---
name: rejection-feedback
description: Take a rejected candidate's interview scorecards and (where available) transcripts, draft an evidence-grounded rejection email or recruiter-call talking points, and produce the recruiter-side notes for the call. Always stops at a recruiter-review gate; never sends. Refuses to draft when the rubric is missing or the case is jurisdiction-flagged.
---
# Rejection feedback
## When to invoke
Use this skill when a recruiter needs to send personalized post-interview feedback to a candidate who reached at least an onsite or final-stage loop, and the team has structured scorecards plus a role rubric on file. Take the candidate's scorecards (across all interviewers), the role rubric, the recruiter-relationship context (was feedback explicitly offered? requested?), and the candidate's residency jurisdiction as input. Produce a Markdown rejection email draft, optional recruiter-call talking-point notes, and a one-line routing recommendation.
Do NOT invoke this skill for:
- **Auto-sending without recruiter review.** The skill writes drafts to disk and stops. There is no `send` action defined anywhere in this skill. Auto-sent rejection feedback is the single most reliable way to produce an inappropriate-content incident under EEOC, ADA, or state employment law. The recruiter is the gate.
- **Candidates who have not requested feedback in jurisdictions where unsolicited feedback creates risk.** Specifically: France (Code du travail risk on documented rejection reasons), Germany (AGG §22 evidentiary shift), and any jurisdiction where the recruiter's HR-counsel guidance disallows unsolicited specifics. The skill reads the `jurisdiction_policy.yaml` file and refuses to draft specifics for any jurisdiction marked `unsolicited_feedback: deny`.
- **EEOC-implicating language or protected-class proxies.** "Cultural fit", age inferences from graduation year, family-status references, national-origin references, accent commentary, gendered descriptors ("aggressive", "abrasive", "soft"), pregnancy-status references, disability or accommodation references. The banned-phrase blocklist in `references/2-banned-phrase-blocklist.md` runs as the final check before the draft is written. Any hit halts the run with the offending string surfaced.
- **Cases legal has flagged.** If the candidate file has a flag for active dispute, accommodation request unaddressed, or a complaint on record, the skill returns "decline to provide specific feedback — legal flag present" and writes a generic-decline draft instead.
- **Rejections from earlier stages** (resume screen, recruiter screen). Templated decline is the right tool there. This skill is for candidates who invested significant time and earned a real answer, per the [recruiting funnel](/en/learn/recruiting-funnel-metrics/) cost.
## Inputs
- Required: `candidate_id` — the ATS record ID ([Ashby](/en/tools/ashby/), [Greenhouse](/en/tools/greenhouse/), or [Lever](/en/tools/lever/)). The skill pulls scorecards via the ATS API; it does not accept pasted scorecard text, because pasted text cannot be audited back to the source interviewer.
- Required: `role_id` — used to load the role's rubric from `rubrics/<role_id>.yaml` (same source the [interview debrief skill](/en/workflows/interview-debrief-summary-skill/) reads). Without a rubric the skill refuses to run; ungrounded feedback is how false specifics get drafted.
- Required: `jurisdiction` — ISO 3166 country code for the candidate's residency at time of application. Drives which jurisdiction-policy block applies.
- Required: `feedback_requested` — boolean. `true` only if the candidate explicitly asked for feedback (in writing, captured in the ATS). `false` defaults to a generic-decline draft in jurisdictions where the policy file flags unsolicited specifics as risk.
- Optional: `transcript_id` — pointer to a [BrightHire](/en/tools/brighthire/) or [Metaview](/en/tools/metaview/) transcript bundle for the loop. When present, the skill cross-references scorecard claims against transcript evidence; when absent, the skill works from scorecards alone and labels the draft accordingly.
- Optional: `route` — one of `email`, `call`, `auto`. `auto` (default) picks based on stage reached and seniority per the routing rules in `references/3-output-format.md`.
## Reference files
Always read the following from `references/` before drafting. Without them the draft is generic, ungrounded, and risks tripping a banned phrase.
- `references/1-rubric-to-feedback-mapping.md` — the mapping from rubric dimensions to safely-sharable, candidate-facing feedback language. Replace the template placeholders with your team's approved phrasing before first use.
- `references/2-banned-phrase-blocklist.md` — the blocklist the skill greps the draft against in step 5. Patterns include EEOC-implicating terms, protected-class proxies, comparative-ranking language, and unverifiable specifics. Do not edit this file to make a draft pass.
- `references/3-output-format.md` — the literal email and call-notes format, including the routing rules.
## Method
Run these six steps in order. Steps 1-3 are deterministic gating; steps 4-5 use the LLM for synthesis and screening; step 6 is the audit log. The order matters — letting the LLM draft against unchecked scorecards produces fast, confident, EEOC-implicating output.
### 1. Validate jurisdiction policy and consent
Open `references/jurisdiction-policy.yaml` (user-supplied; template shipped in the bundle). Look up the candidate's `jurisdiction`. If `unsolicited_feedback: deny` and `feedback_requested: false`, halt specifics and switch to the generic-decline template at the top of `references/3-output-format.md`. Log the reason in the audit line.
The choice to gate on consent before pulling scorecards is deliberate: specifics drafted and then discarded still leave a model-call log entry with candidate-identifying scorecard text. Gating up front keeps the data-minimization story clean for GDPR Art. 5(1)(c).
### 2. Pull scorecards and (optional) transcript
Fetch all scorecards for `candidate_id` via the ATS API. Validate that every scorecard is signed-off (Ashby `submitted: true`, Greenhouse `status: complete`, Lever `state: completed`). Drop drafts. If the loop has fewer than two completed scorecards, halt — feedback synthesized from one interviewer's view is not feedback, it is an opinion, and exposes the firm to selective-evidence claims.
When `transcript_id` is provided, fetch the transcript bundle. The skill will cite scorecard claims against transcript turns in step 4.
### 3. Identify dimensions and evidence
For each rubric dimension, compute the cross-interviewer mean score and the standard deviation. Flag dimensions where:
- mean ≥ 4 (candidate strength, surface as the warm opening)
- mean ≤ 2 (candidate gap, candidate for feedback if safe)
- standard deviation ≥ 1.5 (interviewer disagreement — do NOT cite this dimension; the loop did not converge and the feedback would not survive a "but interviewer X scored me 5" challenge)
For each surfaced dimension, pull the verbatim evidence quotes from the scorecards (or transcript, when available). Every claim in the final draft must cite a verbatim string from the evidence pool. No verbatim string → the dimension is not surfaced.
The "no synthesis without verbatim citation" rule is the guard against false specifics. LLMs drafting feedback from scorecards will, without this rule, invent quotes that sound plausible — "the candidate struggled with system-design tradeoffs" — that no interviewer ever wrote. False specifics cited back to the candidate are how rejection-feedback workflows generate complaint emails.
### 4. Draft against the rubric-to-feedback mapping
Translate at most one strength and one gap into candidate-facing language using `references/1-rubric-to-feedback-mapping.md`. Cap at one of each so the draft does not read as a defensive list. Comparative ranking ("we had stronger candidates", "you were our second choice") is forbidden — the mapping file does not contain the language and step 5 greps it out.
For `route: call`, also draft recruiter-side talking points: bullet-point observations, the suggested phrasing for the gap, and two to three pre-prepared responses to likely candidate questions ("Was there anything I could have done differently?", "Will you keep me in mind for future roles?", "Can I get a second look?").
### 5. Bias and false-specifics screening
Grep the draft against `references/2-banned-phrase-blocklist.md`. Any hit halts the run with the offending string surfaced. Then verify that every specific claim in the draft maps back to a verbatim evidence string from step 3 — if a claim has no source, halt.
This is a separate pass from step 4 by design. The screening pass sees only the draft text, with no awareness of the underlying scorecards, so it cannot rationalize a banned phrase as "but the interviewer meant X".
### 6. Write to disk and audit log
Write the draft to `drafts/<candidate-id>.md` per the format in `references/3-output-format.md`. Write the call notes (if applicable) to `drafts/<candidate-id>-call-notes.md`. Append one JSONL line to `audit/<YYYY-MM>.jsonl` containing: `run_id`, `candidate_id_hash` (SHA-256, not raw ID), `role_id`, `jurisdiction`, `feedback_requested`, `route`, `rubric_sha256`, `dimensions_surfaced`, `blocklist_hits` (zero on success), `model_id`, `timestamp`. No candidate-identifying free text in this line.
Surface the path to the recruiter and exit. The recruiter reviews, edits, and sends from the ATS or their own outbox.
## Output format
Literal example of the email draft the skill writes to `drafts/<candidate-id>.md` for a candidate who reached an onsite for a Senior Backend Engineer role and explicitly requested feedback:
```markdown
Subject: Update on your Senior Backend Engineer interview at Acme
Hi Jamie,
Thank you for the time you invested in our interview process — the
take-home, the system-design loop, and the conversations with the
team. We appreciated the care you put into each stage.
After the team's debrief, we have decided not to move forward with
your candidacy for this role.
You asked for feedback, so here is what stood out from the loop:
- **What went well.** Your take-home submission was clear, well-tested,
and included a thoughtful note on the failure-mode tradeoffs. Two
interviewers cited the test coverage specifically.
- **Where the team landed differently.** In the system-design round,
the discussion of consistency-vs-availability tradeoffs at the
database layer did not surface the read-replica option that the
role frequently requires reasoning about. This was the dimension
that drove the team's decision.
This feedback is specific to the loop you ran with us; it is not a
ranking against other candidates and it is not a comment on your
overall engineering ability.
If a future role at Acme matches your background, we would welcome
your application.
Best,
{Recruiter name}
```
Literal example of the recruiter call-notes file written to `drafts/<candidate-id>-call-notes.md`:
```markdown
# Call notes — Jamie L. (Senior Backend Engineer)
## Frame
- Open with thanks for the time invested.
- Lead with the take-home strength (specific: test coverage note).
- Single gap: system-design read-replica reasoning. One sentence,
no piling on.
## Suggested phrasing for the gap
"In the system-design conversation, the team was looking for the
read-replica option as part of the consistency-availability tradeoff,
and that did not come up. That was the dimension that drove the
decision for this specific role."
## Likely candidate questions
Q: "Was there anything I could have done differently?"
A: Acknowledge the question. Refer back to the single gap. Do NOT
add new feedback dimensions on the call — anything not in the
written draft is off-script and creates inconsistency risk.
Q: "Will you keep me in mind for future roles?"
A: Yes if true; specifics on what kind of role. Do NOT promise a
timeline.
Q: "Can I get a second-look interview?"
A: No. The decision is final. The recruiter reiterates appreciation
and closes.
## Off-script
If the candidate raises a discrimination concern, comparative-ranking
question, or accommodation issue, the recruiter says "let me come
back to you on that" and routes to HR / counsel. The recruiter does
NOT improvise an answer.
```
Literal example of the routing recommendation appended to the draft file:
```markdown
---
Routing: call (stage: onsite, seniority: senior, prior referrer: yes)
Recruiter review required before send.
```
## Watch-outs
- **EEOC-implicating language.** *Guard:* the banned-phrase blocklist in `references/2-banned-phrase-blocklist.md` runs as a separate pass in step 5, with no awareness of the underlying scorecards, so it cannot rationalize a hit. Any hit halts the run with the offending string surfaced. Do not edit the blocklist to make a draft pass — fix the rubric or the scorecard language instead.
- **False specifics from the LLM.** *Guard:* the "no synthesis without verbatim citation" rule in step 3. Every claim in the draft must trace to a verbatim string from a signed-off scorecard or transcript. No verbatim string → the dimension is not surfaced. This is the guard against the most common failure mode of LLM-drafted feedback — plausible-sounding quotes that no interviewer actually wrote.
- **Comparative ranking language.** *Guard:* the rubric-to-feedback mapping in `references/1-rubric-to-feedback-mapping.md` does not contain comparative phrasing ("stronger candidates", "second choice"), and the blocklist in step 5 catches it if it slips in. Comparative ranking is what turns a constructive rejection into a Glassdoor post.
- **Selective-evidence risk.** *Guard:* step 2 halts if the loop has under two signed-off scorecards. Step 3 refuses to surface dimensions with cross-interviewer standard deviation at or above 1.5 — interviewer disagreement does not become candidate feedback.
- **Auto-send drift.** *Guard:* the skill defines no `send` action. Drafts are written to `drafts/<candidate-id>.md` for the recruiter to review, edit, and send from the ATS outbox. AI-drafted-and-sent rejection feedback without review damages [candidate experience](/en/learn/candidate-experience/) and produces incidents.
- **PII in the audit log.** *Guard:* step 6 writes only `candidate_id_hash` (SHA-256), never the raw candidate ID, name, or scorecard text. The audit line is for run reproducibility, not candidate data retention.
- **Generic boilerplate harm.** *Guard:* if step 3 cannot surface a rubric dimension that has both mean ≤ 2 and a verbatim evidence string, the skill writes the generic-decline template from `references/3-output-format.md` rather than synthesizing weak specifics. Generic decline is honest; weak specifics are worse than no specifics.
# Rubric-to-feedback mapping — TEMPLATE
> Replace this template with your team's approved candidate-facing
> phrasing per rubric dimension. The rejection-feedback skill reads
> this file in step 4 to translate scorecard language (which is
> internal, often blunt) into candidate-facing language (which must
> be specific, evidence-grounded, and EEOC-safe). Without this file
> the skill will not draft specifics — it falls back to the generic
> decline template.
## How this file is used
The skill matches each surfaced dimension (from step 3) against the `dimension_id` below, then uses the `candidate_facing_phrasing` template, substituting in the verbatim evidence string from the scorecard or transcript.
If a dimension is surfaced by step 3 but has no entry below, the skill will NOT draft specifics for it — the dimension is dropped. This forces the team to deliberate on candidate-facing phrasing once, in writing, rather than letting the LLM improvise per run.
## Dimension entries
### dimension_id: technical_depth
**internal_label**: Technical depth (1-5)
**rubric_anchors**:
- 5: Reasons fluently across multiple layers of the stack; explores tradeoffs unprompted.
- 4: Reasons clearly within their primary layer; surfaces tradeoffs when asked.
- 3: Recalls correct patterns; tradeoff reasoning needs prompting.
- 2: Recalls patterns inconsistently; tradeoff reasoning absent or shallow.
- 1: Patterns incorrect or contradicted under follow-up.
**candidate_facing_phrasing** (used for mean ≤ 2):
```
In the {round_name} round, the team was looking for {specific_topic}
as part of {specific_decision_context}, and that did not come up.
That was the dimension that drove the decision for this specific
role.
```
Substitution sources:
- `{round_name}` → from scorecard `interview_round` field
- `{specific_topic}` → from `references/2-banned-phrase-blocklist.md` approved-topics list (NEVER free-text from the LLM)
- `{specific_decision_context}` → from rubric anchor text
**candidate_facing_phrasing** (used for mean ≥ 4, opening only):
```
{Strength_observation}. {Interviewer_count_phrase} cited
{specific_evidence} specifically.
```
---
### dimension_id: system_design
**internal_label**: System design (1-5)
**rubric_anchors**:
- 5: Drives the design conversation; surfaces consistency, availability, and operational tradeoffs unprompted.
- 4: Engages with tradeoffs when prompted; covers most major axes.
- 3: Engages with tradeoffs when prompted; covers one or two axes.
- 2: Tradeoff reasoning shallow; misses major axes that the role requires.
- 1: Cannot construct a system that meets the stated requirements.
**candidate_facing_phrasing** (used for mean ≤ 2):
Same template as `technical_depth`.
---
### dimension_id: collaboration
**internal_label**: Collaboration (1-5)
**rubric_anchors**:
- 5: Specific examples of cross-functional work, named tradeoffs, named outcomes.
- 4: Specific examples, less explicit on tradeoff reasoning.
- 3: General examples, no specifics on tradeoffs or outcomes.
- 2: Vague examples or examples that do not show collaboration evidence.
- 1: No relevant examples surfaced.
**candidate_facing_phrasing** (used for mean ≤ 2):
Same template as `technical_depth`. **Constraint:** never use the words "communication", "fit", "soft skills", or "executive presence" in the candidate-facing draft for this dimension. Those terms are on the banned-phrase blocklist because they correlate with bias claims.
---
## Constraints across all dimensions
- One strength and one gap per draft, maximum. The skill caps at one of each in step 4.
- Every substitution slot is filled from a structured field (scorecard, transcript, rubric anchor) or from the approved-topics list. The LLM never free-texts a substitution value.
- Comparative ranking is not in this file and is on the blocklist. If you find yourself adding "vs other candidates" phrasing, stop and revisit the rubric anchors instead.
- Update this file when the team revises rubric anchors. The skill's audit log captures `rubric_sha256` per run, so revisions are visible in retro.
## Last edited
{YYYY-MM-DD}
# Banned-phrase blocklist
> The rejection-feedback skill greps the final draft against every
> pattern below in step 5 (bias and false-specifics screening). Any
> hit halts the run with the offending string surfaced. Do NOT edit
> this file to make a draft pass — fix the rubric, the scorecard
> language, or the rubric-to-feedback mapping instead.
## A. EEOC-implicating language
A1. **Protected-class proxies.** Any of the following terms or patterns in the draft halts the run:
- `culture fit`, `cultural fit`, `culture add` (without an accompanying behavioral-anchor citation)
- `team fit`, `not a fit` (when used as the substantive reason)
- `personality`, `chemistry`, `vibes`
- `executive presence`, `leadership presence`, `gravitas`
- `polish`, `polished`, `lacks polish`
- `aggressive`, `abrasive`, `pushy` (gendered descriptors)
- `soft`, `nice`, `quiet`, `meek` (inverse gendered descriptors)
- `mature`, `seasoned`, `young`, `energetic`, `digital native` (age proxies)
- `accent`, `articulate`, `well-spoken` (national-origin proxies)
- `family`, `kids`, `pregnant`, `maternity`, `paternity`, `parental` (family-status proxies)
- `accommodation`, `disability`, `health` (any reference to accommodation discussions in the rejection text)
- `religion`, `church`, `prayer`
- `marital`, `married`, `single`
- `name origin`, `surname` (any commentary on the candidate's name)
- `school`, `university`, `Ivy`, `tier-1`, `top-N` (when used as the substantive reason — schools may appear in factual context but not as the rejection driver)
A2. **Comparative ranking language.** Halts the run:
- `stronger candidates`, `better candidates`, `more qualified`
- `second choice`, `runner-up`, `not the top choice`
- `closer fit elsewhere`, `closer match`
- `pool was strong`, `competitive pool`
- `we found someone`, `we hired someone`, `the role is filled` (these belong in a separate sentence about the role status, not framed as a candidate ranking)
- Any phrase that implies a relative ordering of the candidate against unnamed others.
A3. **Defamation-risk language.** Halts the run:
- `dishonest`, `misleading`, `lied`, `lying`
- `unprepared`, `did not try`, `did not care`
- `arrogant`, `entitled`, `difficult`
- `concerning`, `red flag`, `worrying`
- Any subjective-character claim that could be cited against the firm in a defamation action.
## B. False-specifics patterns
B1. **Quote markers without source.** Halts the run if the draft contains any quoted string (`"…"` or `'…'`) that does not appear verbatim in the scorecard or transcript pool from step 2.
B2. **Numeric claims without source.** Halts if the draft contains a numeric claim (`scored X`, `Y out of Z`, `X% of`) — interview scores are internal calibration data, not candidate-facing content.
B3. **Interviewer-identifying claims.** Halts if the draft names an interviewer, references an interviewer's role beyond the generic "the team", or attributes a quote to a specific person. Interviewer identities are protected and naming them creates retaliation risk.
B4. **Round-identifying claims that could not have happened.** Halts if the draft references a round (`take-home`, `system design`, `behavioral`, `pair programming`) that is not present in the scorecard set for this candidate. The skill validates round names against the loop's actual structure.
## C. Process-risk language
C1. **Promises about the future.** Halts the run:
- `we will reach out`, `we'll be in touch`, `next time`
- `definitely apply again`, `you will get an offer`
- `keep your resume on file` (varies by jurisdiction whether this is permissible — neutral phrasing is "we welcome a future application")
- Any timeline commitment.
C2. **Process-improvement requests from the candidate.** Halts if the draft asks the candidate for feedback, a referral, or a testimonial. Reverse asks in a rejection email are an EEOC-witness-statement risk and a candidate-experience harm.
C3. **Unsolicited specifics in deny-jurisdiction cases.** The skill's step 1 should have caught this, but as a defense-in-depth check: if the run's `jurisdiction_policy` returned `unsolicited_feedback: deny` and `feedback_requested: false`, the draft must match the generic-decline template byte-for-byte. Any deviation halts.
## D. Approved-topics list (positive list, used by step 4)
The rubric-to-feedback mapping's `{specific_topic}` substitution slot pulls from this list. The LLM never free-texts a topic string.
- `consistency-availability tradeoffs`
- `read-replica reasoning`
- `caching layer reasoning`
- `failure-mode reasoning`
- `test coverage`
- `error-handling specificity`
- `data-modeling tradeoffs`
- `query-pattern reasoning`
- `migration sequencing`
- `deployment sequencing`
- `cross-team coordination examples`
- `tradeoff reasoning under time pressure`
Add to this list only after team review. Topics added here are permitted to appear in candidate-facing drafts.
## E. Maintenance
This file is version-controlled. The skill captures the SHA-256 of this file in the audit log per run, so the blocklist used on a given date is reproducible. If a candidate raises a claim against a specific draft, the audit log answers "was the blocklist of date X in effect at the time of the draft" — yes or no, no judgment call.
## Last edited
{YYYY-MM-DD}
# Output format
> The rejection-feedback skill writes drafts in exactly the formats
> below. The recruiter reviews and edits in their own outbox or in
> the ATS; the skill never sends.
## Routing rules
The skill picks a route per the matrix below. The recruiter can override.
| Stage reached | Seniority | feedback_requested | Default route |
|---|---|---|---|
| onsite | senior+ | true | call |
| onsite | senior+ | false | email (generic if jurisdiction denies) |
| onsite | mid / junior | true | email (specific) |
| onsite | mid / junior | false | email (generic) |
| final loop | any | any | call (overrides above) |
| referred-by-VIP | any | any | call (recruiter judgment) |
| earlier than onsite | any | any | OUT OF SCOPE — use templated decline |
`senior+` = staff, principal, manager, director. `referred-by-VIP` = candidate has a `referrer_priority: high` flag in the ATS.
## Email format — specific feedback (consent + safe jurisdiction)
```markdown
Subject: Update on your {role_title} interview at {company_name}
Hi {candidate_first_name},
Thank you for the time you invested in our interview process — the
{round_1_label}, {round_2_label}, and the conversations with the
team. We appreciated the care you put into each stage.
After the team's debrief, we have decided not to move forward with
your candidacy for this role.
You asked for feedback, so here is what stood out from the loop:
- **What went well.** {strength_phrasing_from_mapping}.
- **Where the team landed differently.** {gap_phrasing_from_mapping}.
This was the dimension that drove the team's decision.
This feedback is specific to the loop you ran with us; it is not a
ranking against other candidates and it is not a comment on your
overall engineering ability.
If a future role at {company_name} matches your background, we would
welcome your application.
Best,
{recruiter_first_name}
```
Constraints baked into this template:
- One strength, one gap. No more.
- The phrase "not a ranking against other candidates" is mandatory, because it pre-empts the most common candidate response loop ("how did I compare").
- The phrase "not a comment on your overall engineering ability" is mandatory, because it isolates the feedback to this loop and pre-empts the "you said I am bad at engineering" escalation.
- "We would welcome your application" — neutral future language. Not "we will reach out", not "next time".
## Email format — generic decline (deny jurisdiction OR no consent OR no surfacable specific)
```markdown
Subject: Update on your {role_title} interview at {company_name}
Hi {candidate_first_name},
Thank you for the time you invested in our interview process. We
appreciated the care you put into each stage.
After the team's debrief, we have decided not to move forward with
your candidacy for this role.
If a future role at {company_name} matches your background, we
would welcome your application.
Best,
{recruiter_first_name}
```
This is the safe default. The skill writes this template byte-for-byte when:
- `jurisdiction_policy` returned `unsolicited_feedback: deny` and `feedback_requested: false`
- step 3 surfaced no rubric dimension with both `mean ≤ 2` AND a verbatim evidence string
- a legal flag on the candidate file is present
- the loop has under two signed-off scorecards
Generic decline is honest. Weak specifics are worse than no specifics.
## Call-notes format
```markdown
# Call notes — {candidate_first_name} {candidate_last_initial}. ({role_title})
## Frame
- Open with thanks for the time invested.
- Lead with the strength: {strength_phrasing_from_mapping}.
- Single gap: {gap_topic_from_approved_list}. One sentence, no piling
on.
## Suggested phrasing for the gap
"{gap_phrasing_from_mapping}"
## Likely candidate questions
Q: "Was there anything I could have done differently?"
A: Acknowledge the question. Refer back to the single gap. Do NOT
add new feedback dimensions on the call — anything not in the
written draft is off-script and creates inconsistency risk.
Q: "Will you keep me in mind for future roles?"
A: Yes if true; specifics on what kind of role. Do NOT promise a
timeline.
Q: "Can I get a second-look interview?"
A: No. The decision is final. The recruiter reiterates appreciation
and closes.
Q: "Who else interviewed?"
A: Decline. Interviewer identities are protected. "I cannot share
that, but I can tell you the team weighed the input from every
round."
Q: "What did interviewer X think?"
A: Decline. Same reason. "I cannot break out individual scores; the
decision was a team decision."
## Off-script
If the candidate raises a discrimination concern, comparative-ranking
question, or accommodation issue, the recruiter says "let me come
back to you on that" and routes to HR / counsel. The recruiter does
NOT improvise an answer.
## Call duration target
10-15 minutes. Past 20 minutes, the call is no longer feedback —
it is an extended negotiation about the decision, and that is not
a useful place to be.
```
## Audit-log line format
One JSON object per line in `audit/<YYYY-MM>.jsonl`:
```json
{
"run_id": "uuid-v4",
"candidate_id_hash": "sha256-of-candidate-id",
"role_id": "role-slug",
"jurisdiction": "US-CA",
"feedback_requested": true,
"route": "email",
"rubric_sha256": "abcdef...",
"blocklist_sha256": "abcdef...",
"mapping_sha256": "abcdef...",
"dimensions_surfaced": ["technical_depth"],
"blocklist_hits": 0,
"model_id": "claude-sonnet-4-5",
"timestamp": "2026-05-03T14:00:00Z"
}
```
No raw candidate ID, no candidate name, no scorecard text, no draft text. The audit log is for run reproducibility, not data retention. Candidate-facing drafts live in `drafts/<id>.md` under the recruiter's own retention policy.
## Last edited
{YYYY-MM-DD}