alterlab-recommendation-letters

$npx mdskill add AlterLab-IEU/AlterLab-Academic-Skills/alterlab-recommendation-letters

Drafts evidence-anchored academic recommendation letters from structured prompts.

  • Writes recommendation letters for admissions, hiring, tenure, fellowships, and awards.
  • Uses Read, Write, Edit tools and Python scripts letter_scaffold.py and claim_guard.py.
  • Calibrates specificity and register based on letter type and supplied candidate dossier.
  • Outputs a draft letter and optionally lints it for unsupported claims via claim_guard.py.

SKILL.md

.github/skills/alterlab-recommendation-lettersView on GitHub ↗
---
name: alterlab-recommendation-letters
description: "Drafts evidence-anchored academic reference and recommendation letters across types — graduate admission, faculty hiring, tenure/promotion external review, fellowship, and award nomination — from a structured prompt of candidate accomplishments, role context, evaluator relationship, and audience, calibrating specificity and register to the letter type and running a no-fabrication guard that flags unsupported superlatives, unanchored rankings, and claims with no evidence in the supplied dossier. Ships scripts/letter_scaffold.py to emit a typed section skeleton and scripts/claim_guard.py to lint a draft for evidence-free assertions. Use when the request is to write a recommendation or reference letter for a student or colleague, a tenure or promotion external-review letter, a fellowship or award nomination, or to check a letter draft for unsupported claims. For a candidate writing their own CV, research statement, or career narrative prefer alterlab-academic-career. Part of the AlterLab Academic Skills suite."
license: MIT
allowed-tools: Read Write Edit Bash(python:*) Bash
compatibility: No API key, account, or network required — generates letters from the supplied dossier via the Read/Write/Edit tools plus two stdlib-only helpers (scripts/letter_scaffold.py, scripts/claim_guard.py) run through `uv run python`. The recommender always reviews, signs, and submits the final letter themselves.
metadata:
  skill-author: AlterLab
  version: "1.0.0"
  last_updated: "2026-06-06"
  depends_on: "alterlab-academic-career (owns the candidate's OWN CV/statements; this skill writes ABOUT a candidate for a third party)"
---

# Recommendation Letters — Evidence-Anchored References Written *About* a Candidate

The faculty task this skill owns is writing **about someone else**: the letter a
professor sends to an admissions committee, a hiring chair, a tenure case, or a
fellowship panel. It is the mirror image of `alterlab-academic-career`, which
helps the *candidate* write their own CV and statements. Here the author is the
**recommender**, the subject is a third party, and the failure mode is not
modesty but **fabrication** — the warm letter full of superlatives that an
evaluator cannot act on because nothing is anchored to evidence.

This skill turns a structured dossier (what the recommender actually knows) into
a letter whose every strong claim is **earned by a specific, checkable
example**, with specificity and register **calibrated to the letter type**.

## When to Use This Skill

Use this skill when the request is to **draft, revise, or evidence-check a letter
written about a candidate by a recommender**:

- "Write a recommendation letter for my PhD student applying to postdocs."
- "I'm a reference for a colleague's faculty application — draft the letter."
- "I've been asked for an external review letter for X's tenure case."
- "Draft a fellowship / award nomination for my mentee."
- "Here's my draft letter — flag anything I claim without backing it up."
- "Make this reference letter more specific; it reads like boilerplate."

The skill always treats the recommender as the author of record: it produces a
**draft for them to verify, edit, sign, and submit**, never a letter it claims to
send or to vouch for on its own authority.

### Does NOT Trigger

| The request is really… | Route to | Why |
|---|---|---|
| The candidate's **own** CV, research/teaching statement, cover letter, tenure dossier, promotion narrative | `alterlab-academic-career` | Self-authored career documents, not a third party writing *about* the candidate |
| A **peer-review report** judging a manuscript's quality with an accept/revise/reject verdict | `alterlab-peer-review` | Editorial quality judgment of a paper, not a personal reference for a person |
| A **structured peer review of a full manuscript** (core-pipeline reviewer) | `alterlab-paper-reviewer` | Section-by-section manuscript critique, not a recommendation about a candidate |
| **Türkiye doçentlik** eligibility / point computation for an associate-professor case | `alterlab-docentlik-eligibility` | ÜAK criteria scoring, not a prose reference letter |
| **Academic-incentive (akademik teşvik)** point computation | `alterlab-akademik-tesvik` | YÖK incentive points, not a letter |
| Checking that the **citations** in a letter or dossier actually exist | `alterlab-citation-verifier` | Bibliographic existence verification, not letter-claim evidence-anchoring |
| Designing a **course, rubric, or syllabus** for the student | `alterlab-teaching-design` | Course/instructional design, not a reference about the student |
| Writing a **grant proposal** or **post-award report** | `alterlab-research-grants` / `alterlab-grant-reporting` | Funding documents, not personal references |

If the candidate is writing about *themselves*, stop and hand off to
`alterlab-academic-career`. The two skills are deliberately disjoint.

---

## The Five Letter Types (calibration table)

Each type has a different **reader**, **decision**, and **register**. The scaffold
script keys off this taxonomy. Full per-type guidance, openings, and worked
structure live in `references/letter_types.md`.

| Type | Reader / decision | Calibration |
|---|---|---|
| **Graduate admission** | Admissions committee deciding fit for a program | Potential + trajectory; compare against the cohort the recommender has taught; concrete classroom/research moments |
| **Faculty hiring** | Search committee / department deciding a colleague | Independence, research program, collegiality, teaching; position within the subfield |
| **Tenure / promotion external review** | P&T committee + administration weighing a permanent decision | Arms-length, evaluative, often **comparative against named peers** at career stage; assess impact and standing, *not* advocacy |
| **Fellowship** | Selection panel awarding a competitive named award | Distinctiveness vs a strong applicant pool; why *this* candidate, *this* award |
| **Award nomination** | Awards committee citing achievement | Citation-style; the single defining contribution and its significance |

The external-review letter is the one most often miswritten as an advocacy
letter. It is **not**: tenure reviewers are asked to *evaluate*, and a letter that
only praises reads as uninformative. `references/letter_types.md` spells out the
register shift and the standard "would this person get tenure here?" prompt.

---

## The Core Discipline: Evidence-Anchored Claims

Every adjective must be **cashed out by a specific example**. The pattern:

> **Claim → Evidence → Significance.**
> *"She is an unusually independent researcher"* (claim) *"— in her second year
> she reframed the project after a null result, designed the follow-up assay
> herself, and that pivot became the paper's central finding"* (evidence) *"—
> work I would expect from a senior postdoc, not a second-year student"*
> (significance / calibration).

A claim with no evidence in the dossier is the single most common defect. The
**no-fabrication guard** (`scripts/claim_guard.py`) lints a draft for exactly
this: unsupported superlatives ("the best student I have ever had"), unanchored
rankings ("top 1%"), and evaluative adjectives that no nearby sentence backs with
a concrete instance. It **does not invent** the missing evidence — it flags the
claim and asks the recommender to supply the example or soften the claim.

**Calibrated specificity** is the companion rule: superlatives and rankings are
*allowed and valuable* — but only when the recommender can ground them ("top 2 of
the ~40 PhD students I have advised in 18 years"). An ungrounded "top 1%" is
weaker than a grounded "the strongest of the six students in this year's lab."
See `references/evidence_and_specificity.md` for the claim taxonomy, the ranking
grammar, and the rhetoric of comparison.

### Hard rule — zero fabrication

This skill writes **only** from the supplied dossier. It must never:

- invent achievements, metrics, rankings, dates, or anecdotes the recommender did
  not provide;
- assert a comparison ("top 5%") the recommender did not make;
- manufacture a relationship detail (how long / in what capacity they were known).

When the dossier is thin, the correct output is **a draft with bracketed gaps**
(`[recommender: a specific example of independence here]`) plus a short list of
the facts the recommender must supply — not a fluent letter that papers over the
holes with plausible fiction. A letter is a signed personal attestation; inventing
its content is a research-integrity problem, not a style choice.

---

## Workflow

### 1. Collect the dossier (structured intake)

Ask for, or extract from what was provided: **letter type**; **candidate name +
role**; **target** (program/position/award + institution); **relationship**
(capacity and duration the recommender knew the candidate); the candidate's
**accomplishments** (with any metrics, artifacts, anecdotes); **the specific
qualities** the target asks to be addressed; and **deadline / length norms**.
`references/intake_checklist.md` is the full prompt list; missing fields become
bracketed gaps, never invented content.

### 2. Scaffold the letter

```bash
uv run python skills/faculty-life/alterlab-recommendation-letters/scripts/letter_scaffold.py \
    --type tenure-external \
    --candidate "Dr. A. Yılmaz" \
    --relationship "external reviewer; known through the field since 2016" \
    --out letter_skeleton.md
```

The scaffold emits a **type-appropriate section skeleton** — opening that states
the relationship and basis for assessment, body sections matched to the type's
evaluation dimensions (e.g. independence/impact/standing for external review;
potential/trajectory/fit for admission), and a calibrated closing. Each section
carries an inline reminder of the *Claim → Evidence → Significance* pattern. Pass
`--list-types` to see the five supported types. The script is stdlib-only.

### 3. Draft from the dossier

Fill each section using only dossier facts. Lead every evaluative claim with the
specific example that earns it. Match the register to the type (advocacy for
admission/fellowship; arms-length evaluation for external review).

### 4. Run the no-fabrication guard

```bash
uv run python skills/faculty-life/alterlab-recommendation-letters/scripts/claim_guard.py \
    letter_draft.md --json
```

It returns each flagged sentence with a reason (`unsupported-superlative`,
`unanchored-ranking`, `evidence-free-claim`) and a fix prompt. Resolve every flag
by **adding the recommender's evidence or softening the claim** — never by
inventing support. Re-run until clean (exit 0).

### 5. Final review hand-off

Present the draft plus: the list of bracketed gaps the recommender must fill, the
guard's residual flags, and a one-line reminder that the recommender must verify
every factual claim and sign/submit it themselves.

---

## Self-Check Before Returning a Letter

- **Every superlative earned?** Each "best/strongest/exceptional" is followed by a
  concrete, dossier-sourced instance — or it is bracketed for the recommender.
- **No invented facts.** Nothing in the letter — metric, ranking, anecdote, date —
  is absent from the supplied dossier.
- **Register matches type.** External-review reads as evaluation, not cheerleading;
  admission/fellowship reads as grounded advocacy.
- **Relationship stated up front.** The opening makes the basis for the assessment
  explicit (how, how long, in what capacity).
- **Gaps surfaced, not filled.** Thin areas appear as bracketed asks, not fiction.
- **Right skill?** A self-authored career document belongs to
  `alterlab-academic-career`; hand it off.

---

## References

- `references/letter_types.md` — per-type readers, openings, structure, and the
  external-review register shift.
- `references/evidence_and_specificity.md` — Claim → Evidence → Significance,
  the claim taxonomy, ranking grammar, and comparison rhetoric.
- `references/intake_checklist.md` — the structured dossier intake prompt and how
  thin fields become bracketed gaps.

Part of the AlterLab Academic Skills suite.

More from AlterLab-IEU/AlterLab-Academic-Skills

SkillDescription
alterlab-abm-mesaBuilds agent-based models of social systems with Mesa 3 — the current AgentSet API (model.agents.shuffle_do('step'), auto-assigned unique_id, mandatory super().__init__(seed=...)), cell spaces (mesa.discrete_space OrthogonalMooreGrid / classic mesa.space grids), the DataCollector, batch_run parameter sweeps, and SolaraViz — for emergence, segregation, diffusion, opinion dynamics, and cooperation models. It uses the Mesa 3.x API (the old mesa.time schedulers like RandomActivation are removed) and treats the model as a generative theory to be validated, not just run. Use when the request mentions an agent-based model, Mesa, simulating interacting agents, or emergent macro behavior from micro rules. For discrete-event (queueing/process) simulation prefer alterlab-simpy; for reinforcement learning prefer alterlab-stable-baselines3. Part of the AlterLab Academic Skills suite.
alterlab-academic-careerPrepares academic career documents and professional-development materials for faculty and researchers. Use when drafting academic CVs, research statements, teaching philosophies, diversity statements, faculty-position cover letters, tenure dossiers, promotion narratives, academic portfolios, or mentorship statements, and when planning conference-networking strategy, building academic web presence, setting up ORCID profiles, or understanding impact metrics. Part of the AlterLab Academic Skills suite.
alterlab-accreditation-aolScaffolds program-level Assurance-of-Learning (AoL) documentation for AACSB (2020 Standard 5) and ABET (Criterion 3 Student Outcomes, Criterion 4 Continuous Improvement) accreditation — program learning outcomes / competency goals, curriculum-to-outcome mapping matrices, direct- and indirect-assessment plans, rubric design, and closing-the-loop continuous-improvement narratives — and validates the structure of an outcome-mapping matrix with scripts/aol_matrix.py. Use when the user needs AACSB or ABET assurance-of-learning material, a program-learning-outcomes set, a curriculum/outcome map or coverage matrix, a direct/indirect assessment plan, a closing-the-loop report, or accreditation self-study text. For single-course design or course rubrics prefer alterlab-teaching-design; for post-award grant reports prefer alterlab-grant-reporting. Part of the AlterLab Academic Skills suite.
alterlab-adaptyvSubmits and tracks protein-testing experiments on the Adaptyv Bio Foundry cloud lab (wet-lab validation), and optimizes protein sequences before submission with computational tools (NetSolP, SoluProt, SolubleMPNN, ESM). Use when designing proteins that need wet-lab validation - binding/affinity screening, expression testing, thermostability, or fluorescence assays - or when submitting experiments to the Foundry API, browsing the target catalog, tracking experiment status, retrieving results, or pre-screening sequences for solubility/expression. Triggers on "Adaptyv", "Foundry API", "cloud lab", "biolayer interferometry / BLI", "wet-lab validation". Part of the AlterLab Academic Skills suite.
alterlab-aeonRuns time series machine learning with the aeon library — classification, regression, clustering, forecasting, anomaly detection, segmentation, and similarity search via scikit-learn compatible APIs. Use when working with temporal data, sequential patterns, or time-indexed observations (univariate or multivariate) that need specialized algorithms beyond standard ML approaches. Part of the AlterLab Academic Skills suite.
alterlab-akademik-tesvikComputes the annual Turkish academic-incentive (akademik teşvik) score for Devlet (state) university öğretim elemanı (academic staff) from a classified activity list, applying the verified Akademik Teşvik Ödeneği Yönetmeliği (2018/11834) Faaliyet Hesaplama Tablosu headline puanları (Proje 20, Araştırma 15, Yayın 30, Patent 30, Atıf 30, Tebliğ 20, Ödül 20) with the k (author-count), p (Q1 1/Q2 0.8/Q3 0.5/Q4 0.25), and r (project-role) coefficients via türü puanı = Σ(faaliyet oranları) × headline (MADDE 8/2), then enforcing the per-type headline ceilings, the 100 cap (MADDE 8/3), and the net-30 payment gate (MADDE 10/3) in a deterministic scripts/tesvik_score.py. Use when the user wants to calculate akademik teşvik puanı, check the en az 30 (net-30) threshold, apply TABLO 4 ceilings, or estimate teşvik eligibility; keeps its coefficients separate from doçentlik scoring. For doçentlik point eligibility prefer alterlab-docentlik-eligibility. Part of the AlterLab Academic Skills suite.
alterlab-alpha-vantageAccesses real-time and historical stock market data, forex rates, cryptocurrency prices, commodities, economic indicators, and 50+ technical indicators via the Alpha Vantage API (requires a free API key from alphavantage.co). Use when fetching stock prices (OHLCV), company fundamentals (income statement, balance sheet, cash flow), earnings, options data, market news/sentiment, insider transactions, GDP, CPI, treasury yields, gold/silver/oil prices, Bitcoin/crypto prices, forex exchange rates, or calculating technical indicators (SMA, EMA, MACD, RSI, Bollinger Bands). Part of the AlterLab Academic Skills suite.
alterlab-alphafoldPredict protein 3D structures with AlphaFold2 via ColabFold — MMseqs2-accelerated MSAs, monomer and AlphaFold2-Multimer complex folding, and confidence-based validation (pLDDT, pTM/ipTM, PAE). Use when folding a protein sequence or complex from FASTA, generating a predicted structure with confidence metrics, ranking models, or checking self-consistency of a design. For co-folding a protein WITH a small-molecule ligand or predicting binding affinity prefer alterlab-boltz; for antibody–antigen or one-FASTA multi-entity complexes prefer alterlab-chai; to LOOK UP an already-computed structure prefer alterlab-alphafold-db; for ESM embeddings or inverse folding prefer alterlab-esm. Part of the AlterLab Academic Skills suite.
alterlab-alphafold-dbAccess the AlphaFold DB of 200M+ AI-PREDICTED protein structures — retrieve models by UniProt accession, download PDB/mmCIF files, and analyze prediction confidence metrics (pLDDT, PAE). Use when a UniProt ID needs a computationally predicted 3D structure or when no experimental structure exists, for homology modeling, protein engineering, or structure-based drug discovery; for EXPERIMENTALLY determined structures (X-ray, cryo-EM, NMR) prefer alterlab-pdb, and for protein sequences, annotations, or accession ID mapping prefer alterlab-uniprot instead. Part of the AlterLab Academic Skills suite.
alterlab-anndataBuild, slice, concatenate, read, and write AnnData annotated data matrices (obs, var, X, layers, obsm, uns) — the scverse data STRUCTURE, not an analysis pipeline. Use when creating or wrangling .h5ad/zarr files, managing cell and gene annotations, concatenating batches, or handling layers/obsm/backed-mode; for the QC, normalization, clustering, UMAP, and differential-expression analysis pipeline prefer alterlab-scanpy instead, and for RNA velocity from spliced/unspliced layers prefer alterlab-scvelo instead. Part of the AlterLab Academic Skills suite.