refactor: fold /setup_docs into /setup as third onboarding path (#9)

* refactor: fold /setup_docs into /setup as third onboarding path

- Auto-detect documents/ at /setup Step 0; offer three paths (documents
  folder, single CV import, interview).
- Inline document-driven merge logic into setup.md as Path A: read-before-
  write, additive vs. conflicting bucket merge with per-conflict prompts,
  inference labeling for behavioral and style files, STAR-stub generation
  instead of fabrication.
- Step 3 substeps for skill files skip when Path A populated them; non-
  skill substeps (CLAUDE.md, cv/main_example.tex, search-queries.md)
  always run. Path C interview preserved verbatim. /setup --section <name>
  update flow preserved.
- Delete .claude/commands/setup_docs.md.
- Update /reset prompts to point only at /setup. Update documents/README.md
  to reference /setup throughout. Update README.md to drop the standalone
  /setup_docs section and add upskill/ to the skills tree.
- Remove the trailing comma left in .claude/settings.local.json after the
  PR #6 revert (was technically invalid JSON).

Single onboarding entry point. documents/ folder convention unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

* docs(README): finish readme alignment for the /setup fold

- Update onboarding-paths tip to reflect three paths (was "Either"
  before /setup_docs landed in PR #6).
- Add documents/ and upskill/ entries to the file tree, both relied
  on by the new /setup Path A and by /upskill respectively.
- Add a brief "Other commands" section briefly describing /expand and
  /upskill so users discover them without having to read individual
  command files. /reset stays in the existing "Starting over"
  subsection, now linked from the new section.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Mads Lorentzen
2026-04-29 09:57:33 +02:00
committed by GitHub
co-authored by Claude Opus 4.7
parent 2ba441f3fb
commit 974b29ec3a
6 changed files with 284 additions and 413 deletions
+10 -13
View File
@@ -1,6 +1,6 @@
# /reset - Reset Candidate Profile Data # /reset - Reset Candidate Profile Data
You are resetting parts of the job search framework back to a blank state so the user can start fresh with `/setup` or `/setup_docs`. You are resetting parts of the job search framework back to a blank state so the user can start fresh with `/setup`.
**This command is destructive.** Nothing is deleted until the user explicitly confirms. Follow these steps exactly in order. **This command is destructive.** Nothing is deleted until the user explicitly confirms. Follow these steps exactly in order.
@@ -18,7 +18,7 @@ If `$ARGUMENTS` is empty or does not contain a recognized scope keyword, ask:
> **What would you like to reset?** > **What would you like to reset?**
> >
> - **`profile`** — Clears candidate data from the skill files (profile, behavioral, STAR examples, profile statements). The framework structure and writing rules are preserved. Use this to re-run `/setup` or `/setup_docs` from scratch. > - **`profile`** — Clears candidate data from the skill files (profile, behavioral, STAR examples, profile statements). The framework structure and writing rules are preserved. Use this to re-run `/setup` from scratch.
> >
> - **`documents`** — Deletes all files you've placed in the `documents/` folder (CV PDFs, LinkedIn export, diplomas, references, past applications). The folder structure and `README.md` are preserved. > - **`documents`** — Deletes all files you've placed in the `documents/` folder (CV PDFs, LinkedIn export, diplomas, references, past applications). The folder structure and `README.md` are preserved.
> >
@@ -119,7 +119,7 @@ Wait for the user's response.
```markdown ```markdown
# Candidate Profile # Candidate Profile
<!-- Run /setup or /setup_docs to populate this file --> <!-- Run /setup to populate this file -->
## Identity ## Identity
@@ -143,7 +143,7 @@ Wait for the user's response.
```markdown ```markdown
# Behavioral Profile # Behavioral Profile
<!-- Run /setup or /setup_docs to populate this file --> <!-- Run /setup to populate this file -->
## Overview ## Overview
@@ -165,21 +165,21 @@ Wait for the user's response.
```markdown ```markdown
**Profile statement templates:** **Profile statement templates:**
<!-- Run /setup or /setup_docs to populate role-specific profile statements --> <!-- Run /setup to populate role-specific profile statements -->
``` ```
Leave all other content in `05-cv-templates.md` intact. Leave all other content in `05-cv-templates.md` intact.
**For `07-interview-prep.md`**, locate and remove: **For `07-interview-prep.md`**, locate and remove:
- The entire `## Ready-Made STAR Examples` section and all numbered STAR examples under it - The entire `## Ready-Made STAR Examples` section and all numbered STAR examples under it
- Any `## STAR Candidates (Complete Manually)` section added by `/setup_docs` - Any `## STAR Candidates (Complete Manually)` section added by `/setup` Path A
Replace with: Replace with:
```markdown ```markdown
## Ready-Made STAR Examples ## Ready-Made STAR Examples
<!-- Run /setup or /setup_docs to populate STAR examples from your actual experience --> <!-- Run /setup to populate STAR examples from your actual experience -->
``` ```
Leave all other content in `07-interview-prep.md` intact (STAR format explanation, tough questions, questions to ask interviewers, phone/video tips, follow-up etiquette, roleplay guidelines). Leave all other content in `07-interview-prep.md` intact (STAR format explanation, tough questions, questions to ask interviewers, phone/video tips, follow-up etiquette, roleplay guidelines).
@@ -215,13 +215,10 @@ After the reset is complete, report:
Then tell the user what to do next based on what was reset: Then tell the user what to do next based on what was reset:
**If profile was reset:** **If profile was reset:**
> Your candidate profile is now blank. To repopulate it: > Your candidate profile is now blank. Run `/setup` to repopulate it. The command auto-detects any files in your `documents/` folder and offers to read from there; otherwise it walks you through a CV import or interactive interview.
> - Run `/setup_docs` if you have documents in the `documents/` folder — it will re-read them and rebuild the profile files.
> - Run `/setup` for an interactive interview to fill in your profile from scratch.
> - You can also run `/setup_docs` first, then `/setup` to fill in anything the documents didn't cover.
**If documents were reset:** **If documents were reset:**
> The `documents/` folder is now empty. Add your career documents and run `/setup_docs` to populate your profile. See `documents/README.md` for instructions on what to put where. > The `documents/` folder is now empty. Add your career documents and run `/setup` to populate your profile. See `documents/README.md` for instructions on what to put where.
**If both were reset:** **If both were reset:**
> Both your profile files and documents folder are now empty. Add documents to `documents/` and run `/setup_docs`, or run `/setup` for an interactive setup interview. > Both your profile files and documents folder are now empty. Add documents to `documents/` (or skip and use the CV import / interview path), then run `/setup`.
+239 -31
View File
@@ -1,42 +1,244 @@
# /setup - Profile Onboarding Interview # /setup - Profile Onboarding
You are running the onboarding setup for the AI Job Search framework. Your goal is to collect the user's professional information and populate all profile files so the `/apply` workflow works out of the box. You are running the onboarding setup for the AI Job Search framework. Your goal is to collect the user's professional information and populate all profile files so the `/apply` workflow works out of the box.
There are three paths into setup. Step 0 picks the right one; all three converge on Step 3 (file generation) and Step 4 (confirmation).
--- ---
## Step 0: Welcome & Choose Path ## Step 0: Welcome & Choose Path
Welcome the user and explain what this setup does. Then offer two paths: If `$ARGUMENTS` contains `--section <name>`, skip directly to that section in Path C for an update-only flow. Do not run the path-selection prompt below.
Otherwise, before greeting the user, scan the `documents/` folder. Use Glob with `documents/**/*` and count files per subfolder (`cv/`, `linkedin/`, `diplomas/`, `references/`, `applications/`).
Then welcome the user with a single message that lists three paths. The wording changes based on what was found.
**If `documents/` has files** in one or more subfolders, lead with Path A:
> **Welcome to the AI Job Search setup!** > **Welcome to the AI Job Search setup!**
> >
> I'll help you set up your professional profile so Claude can evaluate job postings, tailor CVs, write cover letters, and prepare you for interviews. > I'll help you build your professional profile so Claude can evaluate job postings, tailor CVs, write cover letters, and prepare you for interviews.
> >
> **Two ways to get started:** > I see files in your `documents/` folder: [list per subfolder, e.g. "2 in cv/, 1 in linkedin/, 3 in references/"]. Three ways to start:
> >
> **Path A: Import from CV (recommended)** - Share your existing CV or resume (mention the file with @ or paste the text). I'll extract your information automatically and ask follow-up questions for anything missing. > **Path A: Read my documents folder** (recommended for what you have) - I'll read everything in `documents/`, cross-reference for consistency, and build your profile from real source materials. Idempotent and safe to re-run as you add more documents.
> >
> **Path B: Interview mode** - I'll walk you through structured questions section by section. Great if you're starting from scratch. > **Path B: Single CV import** - Paste or @-mention a single CV/resume here. I'll extract it and ask follow-up questions for what's missing.
> >
> Which do you prefer? > **Path C: Interview mode** - I'll walk you through structured questions section by section.
>
> Which would you like?
If the user specifies `$ARGUMENTS` containing `--section <name>`, skip to that section only for updating. **If `documents/` is empty or missing**, surface Path A as a "do this if you have materials" option:
> **Welcome to the AI Job Search setup!**
>
> I'll help you build your professional profile so Claude can evaluate job postings, tailor CVs, write cover letters, and prepare you for interviews.
>
> Three ways to start:
>
> **Path A: Documents folder** (best signal if you have several materials) - Drop your CV / LinkedIn export / diplomas / reference letters in the `documents/` folder, then say "go". I'll read everything and build your profile from it. See `documents/README.md` for the folder layout.
>
> **Path B: Single CV import** - Paste or @-mention a single CV/resume here. I'll extract it and ask follow-up questions for what's missing.
>
> **Path C: Interview mode** - I'll walk you through structured questions section by section. Good if you're starting from scratch.
>
> Which would you like?
Wait for the user's choice. If they pick A but the folder is still empty, tell them what to add (point at `documents/README.md`) and stop.
--- ---
## Path A: Document Import ## Path A: Documents Folder
If the user provides a CV/resume: Reads structured documents in `documents/`, cross-references them for consistency, and merges extracted data into the seven profile skill files. Read-before-write and idempotent: changes already present will not be proposed again.
1. Read the document thoroughly Follow these steps **exactly in order**.
2. Extract all structured information: name, contact, education, experience, skills, publications, awards
3. Present a summary of what was extracted ### Step A1: Inventory
4. Ask follow-up questions for gaps (behavioral profile, career goals, deal-breakers, salary expectations, references)
5. Proceed to file generation (Step 3) Use Glob with `documents/**/*` to scan the full tree. Print:
```
## Documents Found
**cv/**: [list files, or "(empty)"]
**linkedin/**: [list files, or "(empty)"]
**diplomas/**: [list files, or "(empty)"]
**references/**: [list files, or "(empty)"]
**applications/**: [list subfolders with their files, or "(empty)"]
I will read these and cross-reference before proposing any changes.
```
If every subfolder is empty, stop and tell the user to populate the folder. Point at `documents/README.md` for the layout.
### Step A2: Read Existing Skill Files
Read these in parallel before extracting anything. You must know what is already there to make the merge intelligent.
- `.claude/skills/job-application-assistant/01-candidate-profile.md`
- `.claude/skills/job-application-assistant/02-behavioral-profile.md`
- `.claude/skills/job-application-assistant/03-writing-style.md`
- `.claude/skills/job-application-assistant/04-job-evaluation.md`
- `.claude/skills/job-application-assistant/05-cv-templates.md`
- `.claude/skills/job-application-assistant/06-cover-letter-templates.md`
- `.claude/skills/job-application-assistant/07-interview-prep.md`
Hold this content in context throughout Path A. Do not re-read.
### Step A3: Parse Documents
Read each document found in Step A1. Process subfolders in this order: `cv/`, `linkedin/`, `diplomas/`, `references/`, `applications/`.
**`cv/` documents:** name, contact (email, phone, LinkedIn, GitHub), education (degree, institution, dates, thesis), work experience (title, company, dates, location, bullets), skills, publications, awards, profile/summary.
**`linkedin/` documents:** About/summary section (full text, used for behavioral inference), work experience, education, skills and endorsements, certifications, volunteer work, publications, recommendations received (full text). If multiple LinkedIn exports are present, use the most recently modified file.
**`diplomas/` documents:** official degree title and level, institution name (official spelling), graduation date, grade or distinction or GPA if visible.
**`references/` documents:** referee name, title, organization; full text of the letter (extract specific quotes); competency language used.
**`applications/<company>_<role>/` subfolders:**
- `job_posting.md`: role title, company, required skills, experience level, sector, role type
- `cover_letter.tex`: opening structure, body structure, bullet style, closing, recurring phrases
- `cv_draft.tex`: profile statement, section ordering, framing for this role type
- `outcome.md`: status (hired/rejected/no_response/interview_only), interview stages, notes
After reading, proceed to Step A4 without intermediate output. The user sees a complete picture in Step A6.
### Step A4: Cross-Reference Check
Before mapping anything to skill files, check for inconsistencies:
- Date mismatches between CV / LinkedIn / diploma
- Title mismatches across documents for the same role
- Education mismatches (degree name, graduation date)
- Employer name variations
If inconsistencies are found, present them as a numbered list and wait for the user to resolve each one before continuing:
```
## Cross-Reference Issues Found
These need to be resolved before I continue. For each one, tell me which version is correct.
1. **Role title mismatch - [COMPANY]:**
CV says: "[TITLE_A]"
LinkedIn says: "[TITLE_B]"
Which is correct?
2. ...
```
If no inconsistencies, state "No cross-reference issues found." and continue.
### Step A5: Build Change Sets
For each skill file, compare extracted document content against the current file content from Step A2. Build two buckets.
**Additive changes:** entirely new content not in the skill file in any form. Examples: a certification not in `01-candidate-profile.md`, a new endorsement skill, a referee not yet listed, a new behavioral quote from a reference letter, a new award.
**Conflicting changes:** content that touches something already in a skill file but disagrees. Examples: a different date range for an existing job, a different job title for the same role, a different graduation date than what is recorded.
**Inference rules** (apply when populating from inferred sources):
- **`02-behavioral-profile.md`:** Source is LinkedIn About + recommendation letters. Extract recurring themes, adjectives, phrases about how the candidate works. Add only to "Strongest Behavioral Traits", "How [Candidate] Works Best", or "Management Style Preferences" sections. Do not overwrite existing scored assessments. Always label inferred additions: *[Inferred from LinkedIn About / Reference letter - review before relying on this]*
- **`03-writing-style.md`:** Source is `cover_letter.tex` files. Extract recurring patterns. Add as observations under "## Patterns Observed in Past Applications". Do not modify existing rules. Only add if 2+ cover letters show a genuine pattern.
- **`04-job-evaluation.md`:** Source is `job_posting.md` + `outcome.md` pairs. If an application reached interview or offer: note role type and sector as a confirmed strong-fit signal. If 2+ applications repeat a no-response or rejection pattern: note it. Add findings under "## Calibration from Past Applications". Do not modify the existing scoring framework.
- **`05-cv-templates.md`:** Source is `cv_draft.tex` files. Extract any profile statement that does not already appear in templates. Label with: *[Used for: <company>_<role>]*
- **`06-cover-letter-templates.md`:** Source is `cover_letter.tex` files. Extract opening patterns, bullet structures, closing formulations. Add only what is structurally distinct from existing templates.
- **`07-interview-prep.md`:** Source is CV bullets, LinkedIn descriptions, reference letter quotes. Identify achievements not yet covered by an existing STAR example. Do NOT draft full STAR examples. Add stubs under "## STAR Candidates (Complete Manually)":
```markdown
### [Achievement title]
**Source:** [CV / LinkedIn / Reference letter - role/company]
**What happened:** [one sentence]
**Why it matters:** [interview question types this could answer]
**S/T/A/R stub:**
- Situation:
- Task:
- Action:
- Result:
```
### Step A6: Present and Confirm Changes
Present the full change set before writing anything.
**Additive changes** (single grouped list, organized by target file):
```
## Proposed Additive Changes
### 01-candidate-profile.md
- [ ] New certification: [title], [issuer], [date] - extracted from LinkedIn
- [ ] New reference: [name, title, company]
Quote: "[relevant quote]"
### 02-behavioral-profile.md
- [ ] New behavioral observation [labeled as inference]: "[phrase]"
[and so on per file]
```
Then ask:
> **Apply all additive changes?** These add new content without touching anything already in the files.
> Reply **yes** to apply all, or list the numbers you want to skip.
Wait for the response. Apply only the confirmed items.
**Conflicting changes** (one at a time):
```
## Conflict 1 of [N]: Job title - [COMPANY]
**Current in 01-candidate-profile.md:**
[TITLE_A] - [COMPANY] ([START]-[END])
**Proposed (from LinkedIn export):**
[TITLE_B] - [COMPANY] ([START]-[END])
Options:
[keep] Keep the existing text
[replace] Replace with the version from the document
[manual] I'll edit this myself - skip for now
```
Wait for the user's choice on each conflict. If no conflicts, state "No conflicting changes found." and skip this section.
### Step A7: Write Confirmed Changes and Fill Gaps
Apply the confirmed changes with the Edit tool. Make targeted edits only. Do not rewrite entire files. State which changes were applied per file. If a file has no confirmed changes, state "No changes made to [filename]."
Documents cover skills, experience, education, references, and behavioral signal. They do not cover everything `/apply` and `/scrape` need. After the writes, ask follow-up questions for gaps:
- Career goals and target role types
- What excites the user in their next role
- Deal-breakers and must-haves
- Salary expectations / baseline (optional)
- Commute or location constraints (if not visible from CV)
- Job search configuration (use the questions from Path C Section 9 below)
Then proceed to Step 3 to populate the non-skill files (`CLAUDE.md`, `cv/main_example.tex`, `.claude/skills/job-scraper/search-queries.md`). Step 3 will detect that the seven skill files are already populated and skip those substeps.
--- ---
## Path B: Interview Mode ## Path B: Single CV Import
If the user provides a single CV/resume:
1. Read the document thoroughly.
2. Extract all structured information: name, contact, education, experience, skills, publications, awards.
3. Present a summary of what was extracted.
4. Ask follow-up questions for gaps (behavioral profile, career goals, deal-breakers, salary expectations, references).
5. Proceed to Step 3 (file generation).
---
## Path C: Interview Mode
Walk through each section conversationally. Ask questions naturally, not as a form. Let the user answer in their own words and you'll structure the data. Walk through each section conversationally. Ask questions naturally, not as a form. Let the user answer in their own words and you'll structure the data.
@@ -86,7 +288,7 @@ If not, ask behavioral questions:
- "What work environments do you thrive in?" - "What work environments do you thrive in?"
- "What drains your energy at work?" - "What drains your energy at work?"
- "How do you prefer to work in teams?" - "How do you prefer to work in teams?"
- "How do you make decisions - quickly or deliberately?" - "How do you make decisions, quickly or deliberately?"
- "What's your communication style?" - "What's your communication style?"
- Synthesize answers into a behavioral profile - Synthesize answers into a behavioral profile
@@ -124,18 +326,18 @@ This proactive suggestion step helps users discover career paths they might not
## Step 3: Generate Profile Files ## Step 3: Generate Profile Files
Once all information is collected (via either path), generate the following files: Once data collection is complete, generate or finish populating the following files. **For Path A**, the seven skill files are already populated by Step A7; check each before writing and skip if its content is no longer placeholder text.
### 1. Update `CLAUDE.md` ### 1. Update `CLAUDE.md`
Replace all `[PLACEHOLDER]` tokens with the user's actual information. Keep the structure, workflow, and verification checklist intact. Replace all `[PLACEHOLDER]` tokens with the user's actual information. Keep the structure, workflow, and verification checklist intact.
### 2. Populate `01-candidate-profile.md` ### 2. Populate `01-candidate-profile.md` *(Path B and C; skip if Path A populated it)*
Write the full candidate profile with structured sections: Identity, Education, Professional Experience, Independent Projects, Technical Skills, Publications, Awards, References. Write the full candidate profile with structured sections: Identity, Education, Professional Experience, Independent Projects, Technical Skills, Publications, Awards, References.
### 3. Populate `02-behavioral-profile.md` ### 3. Populate `02-behavioral-profile.md` *(Path B and C; skip if Path A populated it)*
Write the behavioral profile based on assessment results or synthesized answers. Write the behavioral profile based on assessment results or synthesized answers.
### 4. Update `04-job-evaluation.md` ### 4. Update `04-job-evaluation.md` *(Path B and C; skip if Path A populated it)*
Replace skill match areas with the user's actual skills: Replace skill match areas with the user's actual skills:
- Strong match areas: [their primary skills] - Strong match areas: [their primary skills]
- Moderate match areas: [their secondary skills] - Moderate match areas: [their secondary skills]
@@ -143,17 +345,17 @@ Replace skill match areas with the user's actual skills:
Update career goals and motivation filters with their actual preferences. Update career goals and motivation filters with their actual preferences.
### 5. Update `05-cv-templates.md` ### 5. Update `05-cv-templates.md` *(Path B and C; skip if Path A populated it)*
Add role-specific profile statement templates based on their background. Add role-specific profile statement templates based on their background.
### 6. Update `07-interview-prep.md` ### 6. Update `07-interview-prep.md` *(Path B and C; skip if Path A populated it)*
Create STAR examples from their actual experience (at least 3-4 examples). Create STAR examples from their actual experience (at least 3-4 examples). Path A leaves STAR stubs under "## STAR Candidates (Complete Manually)" rather than full examples; if any stubs are present, mention them in Step 4 so the user knows to flesh them out.
### 7. Update `cv/main_example.tex` ### 7. Update `cv/main_example.tex`
Replace placeholder personal data with their actual name, contact info, and add their education and most recent experience entries. Replace placeholder personal data with their actual name, contact info, and add their education and most recent experience entries.
### 8. Generate `.claude/skills/job-scraper/search-queries.md` ### 8. Generate `.claude/skills/job-scraper/search-queries.md`
Replace all placeholder tokens in the search queries file with the user's actual information from Section 9: Replace all placeholder tokens in the search queries file with the user's actual information from Section 9 (or the equivalent follow-up questions in Path A's Step A7):
- Replace `[YOUR_PRIMARY_ROLE_TYPE]`, `[YOUR_PRIMARY_JOB_TITLE]`, etc. with actual role titles - Replace `[YOUR_PRIMARY_ROLE_TYPE]`, `[YOUR_PRIMARY_JOB_TITLE]`, etc. with actual role titles
- Replace `[YOUR_KEY_SKILL]`, `[YOUR_DOMAIN_KEYWORD_1]`, etc. with actual skills and domain terms - Replace `[YOUR_KEY_SKILL]`, `[YOUR_DOMAIN_KEYWORD_1]`, etc. with actual skills and domain terms
- Replace `[YOUR_CITY]`, `[YOUR_COUNTRY]`, `[YOUR_REGION]` with actual location - Replace `[YOUR_CITY]`, `[YOUR_COUNTRY]`, `[YOUR_REGION]` with actual location
@@ -186,13 +388,19 @@ Present a summary:
> - Run `/apply` with a job posting URL to see the full application workflow > - Run `/apply` with a job posting URL to see the full application workflow
> - Run `/setup --section search` later to update your search queries as your priorities evolve > - Run `/setup --section search` later to update your search queries as your priorities evolve
If Path A left any STAR stubs in `07-interview-prep.md`, also note:
> Path A flagged [N] STAR candidate stubs in `07-interview-prep.md` that need your situation/task/action/result details before you use them in interviews.
--- ---
## Design Principles ## Design Principles
- Each section is a natural conversation, not a form - Three onboarding paths converge on the same skill files. Step 0 picks the right path based on what's in `documents/`. Steps 3 and 4 are shared.
- The user can skip optional sections - Path A is read-before-write and idempotent. Re-running it as documents are added does not duplicate or overwrite existing content; conflicts are surfaced for explicit resolution.
- Synthesize answers into structured formats (the user doesn't need to know markdown or LaTeX) - Path A labels inferred behavioral or style additions so the user can review them critically before relying on them.
- Can be re-run with `--section <name>` to update specific sections (e.g., `/setup --section search` to reconfigure job search queries without re-doing the full profile) - Each section in Path C is a natural conversation, not a form. The user can skip optional sections.
- Section 9 (search) proactively suggests role types the user may not have considered - Synthesize answers into structured formats (the user does not need to know markdown or LaTeX).
- At the end, suggest running `/scrape` and `/apply` with a test job posting - Can be re-run with `--section <name>` to update specific sections (e.g., `/setup --section search` to reconfigure job search queries without re-doing the full profile).
- Section 9 (search) in Path C, and the equivalent follow-up questions in Path A, proactively suggest role types the user may not have considered.
- At the end, suggest running `/scrape` and `/apply` with a test job posting.
-333
View File
@@ -1,333 +0,0 @@
# /setup_docs - Document-Based Profile Population
You are populating the candidate skill files by reading from the user's `documents/` folder. This command complements `/setup` — it extracts structured data from real documents and merges it into the skill files. The interactive `/setup` command remains available for refinement afterward.
Read **all** existing skill files before writing anything. Match their exact style, tone, and structure.
Follow these steps **exactly in order**. Do not skip steps.
---
## Step 0: Check for Documents
Check whether the `documents/` folder exists and contains files:
```
documents/cv/
documents/linkedin/
documents/diplomas/
documents/references/
documents/applications/
```
Use Glob to check each subfolder for any files. If the `documents/` folder is missing entirely, or all subfolders are empty, stop and tell the user:
> **No documents found.**
>
> Create a `documents/` folder at the root of this repo and add your career documents to it. The expected structure is:
>
> ```
> documents/
> ├── cv/ ← Your master CV (PDF or .tex)
> ├── linkedin/ ← LinkedIn profile export (PDF via Save to PDF)
> ├── diplomas/ ← Degree certificates (PDF)
> ├── references/ ← Reference letters (PDF, .txt, or .md)
> └── applications/
> └── <company>_<role>/
> ├── job_posting.md
> ├── cover_letter.tex
> ├── cv_draft.tex
> └── outcome.md
> ```
>
> See `documents/README.md` for full instructions. Once you've added documents, re-run `/setup_docs`.
If at least one subfolder has files, continue.
---
## Step 1: Inventory
Scan the full `documents/` tree and print a clear inventory of what was found. Use Glob with `documents/**/*` to list all files.
Present the inventory as:
```
## Documents Found
**cv/**: [list files, or "empty"]
**linkedin/**: [list files, or "empty"]
**diplomas/**: [list files, or "empty"]
**references/**: [list files, or "empty"]
**applications/**: [list subfolders with their files, or "empty"]
I will now read these documents and cross-reference their content before proposing any changes to the skill files.
```
---
## Step 2: Read All Existing Skill Files
Before extracting anything, read the current state of all seven skill files. This is required to make the merge intelligent — you must know what's already there before proposing additions or flagging conflicts.
Read all of these in parallel:
- `.claude/skills/job-application-assistant/01-candidate-profile.md`
- `.claude/skills/job-application-assistant/02-behavioral-profile.md`
- `.claude/skills/job-application-assistant/03-writing-style.md`
- `.claude/skills/job-application-assistant/04-job-evaluation.md`
- `.claude/skills/job-application-assistant/05-cv-templates.md`
- `.claude/skills/job-application-assistant/06-cover-letter-templates.md`
- `.claude/skills/job-application-assistant/07-interview-prep.md`
Hold this content in context throughout the rest of the command. Do not re-read these files later.
---
## Step 3: Parse Documents
Read each document found in Step 1. Process subfolders in this order: `cv/``linkedin/``diplomas/``references/``applications/`.
For each document type, extract the following:
### cv/ documents
- Full name, contact information (email, phone, LinkedIn, GitHub)
- Education entries: degree, institution, dates, thesis topic
- Work experience: title, company, dates, location, bullet points
- Skills and technologies
- Publications and awards
- Any profile statement or summary section
### linkedin/ documents
- About/summary section (full text — used for behavioral inference)
- Work experience: title, company, dates, description bullets
- Education entries
- Skills and endorsements list
- Certifications and licenses
- Volunteer work
- Publications
- Recommendations received (full text — used for behavioral inference and reference enrichment)
If multiple LinkedIn exports are present, use the most recently modified file and note the others were skipped.
### diplomas/ documents
- Official degree title and level
- Institution name (official spelling)
- Graduation date
- Any grade, distinction, or GPA if visible
### references/ documents
- Referee name, title, organization
- Full text of the letter (extract specific quotes)
- Competency language used (phrases that describe how you work)
### applications/ subfolders
For each `<company>_<role>/` subfolder, read whichever files are present:
**`job_posting.md`**: Extract role title, company, required skills, experience level, key responsibilities. Note the sector and role type.
**`cover_letter.tex`**: Extract the opening paragraph structure, the body paragraph structure, the bullet list style, the closing. Note recurring phrases or framings.
**`cv_draft.tex`**: Extract the profile statement used, section ordering, and how experience was framed for this role type.
**`outcome.md`**: Extract status (hired/rejected/no_response/interview_only), interview stages reached, and any notes.
After reading all documents, proceed to Step 4 without presenting intermediate output. You will present a complete picture in Step 5.
---
## Step 4: Cross-Reference Check
Before mapping anything to skill files, check for inconsistencies across documents. Look for:
- **Date mismatches**: Does the CV show the same start/end dates for each role as LinkedIn? As the diploma?
- **Title mismatches**: Does the job title in the CV match LinkedIn for the same role?
- **Education mismatches**: Does the degree name and graduation date match across CV, diploma, and LinkedIn?
- **Employer name variations**: Is the same company spelled differently across documents?
If inconsistencies are found, present them now as a numbered list before proceeding:
```
## Cross-Reference Issues Found
These inconsistencies need to be resolved before I continue. For each one, tell me which version is correct:
1. **Role title mismatch — [COMPANY_NAME]:**
CV says: "[TITLE_A]"
LinkedIn says: "[TITLE_B]"
Which is correct?
2. [next issue]
```
Wait for the user to resolve all cross-reference issues before continuing to Step 5. If no inconsistencies are found, state "No cross-reference issues found." and continue immediately.
---
## Step 5: Build Change Sets
For each skill file, compare the extracted document content against the current skill file content from Step 2. Build two buckets of proposed changes:
### Additive changes
Content that is entirely new — not present in the skill file in any form. Examples:
- A certification that doesn't appear anywhere in `01-candidate-profile.md`
- A new skill keyword from LinkedIn endorsements not in the skills section
- A volunteer entry not mentioned anywhere
- A referee not currently listed in the references section
- A new behavioral quote from a reference letter
- A new award
### Conflicting changes
Content that touches something already in a skill file but disagrees with it. Examples:
- A different date range for an existing job entry
- A different job title for the same role
- A bullet describing a role in a way that contradicts the existing description
- A diploma showing a different graduation date than what's recorded
**Inference rules — apply these when populating files from inferred sources:**
**For `02-behavioral-profile.md` (behavioral inference):**
- Source: LinkedIn About section, recommendation letters
- Extract: recurring themes, adjectives used to describe you, phrases about how you work
- Only add to sections like "Strongest Behavioral Traits", "How [Candidate] Works Best", or "Management Style Preferences". Do not overwrite or supplement any existing scored assessments or competency tables already in the file — treat those as authoritative.
- Always label inferred additions clearly: *[Inferred from LinkedIn About / Reference letter — review before relying on this]*
**For `03-writing-style.md` (style inference from cover letters):**
- Source: `cover_letter.tex` files in `applications/`
- Extract: recurring structural patterns, opening paragraph styles, any phrases that appear across multiple letters
- Add these as observations under a new section "## Patterns Observed in Past Applications" — do not modify existing rules
- Only add if at least 2 cover letters are present and a genuine pattern is visible
**For `04-job-evaluation.md` (calibration from past applications):**
- Source: `job_posting.md` + `outcome.md` pairs
- If an application reached interview stage or resulted in an offer: note the role type and sector as a confirmed strong-fit signal
- If an application received no response or rejection: note only if the pattern repeats across 2+ applications (single data points are noise)
- Add findings under a new section "## Calibration from Past Applications" — do not modify existing scoring framework
**For `05-cv-templates.md` (profile statement extraction):**
- Source: `cv_draft.tex` files in `applications/`
- Extract any profile statement that doesn't already appear in the templates file
- Add it under the appropriate role type heading with a label: *[Used for: <company>_<role>]*
**For `06-cover-letter-templates.md` (structure extraction from past letters):**
- Source: `cover_letter.tex` files in `applications/`
- Extract: opening paragraph patterns, bullet list structures, closing formulations
- Add only what is structurally distinct from the existing templates
**For `07-interview-prep.md` (STAR candidates from achievements):**
- Source: CV bullets, LinkedIn descriptions, reference letter quotes
- Identify achievements not yet covered by an existing STAR example
- Do NOT draft full STAR examples — instead, add a stub under a new section "## STAR Candidates (Complete Manually)":
```markdown
### [Achievement title]
**Source:** [CV / LinkedIn / Reference letter — role/company]
**What happened:** [one sentence summary of the achievement]
**Why it matters:** [which interview question types this could answer]
**S/T/A/R stub:**
- Situation:
- Task:
- Action:
- Result:
```
---
## Step 6: Present and Confirm Changes
Present the full change set before writing anything. Structure the presentation by skill file.
### Additive changes
Show all additive changes in a single grouped list, organized by target file:
```
## Proposed Additive Changes
These are new items not currently in the skill files. They will be added exactly as shown.
### 01-candidate-profile.md
- [ ] New certification: [title], [issuer], [date] — extracted from LinkedIn
- [ ] New reference: [name, title, company] — extracted from reference letter
Quote: "[relevant quote]"
### 02-behavioral-profile.md
- [ ] New behavioral observation [labeled as inference]: "[phrase from LinkedIn About]"
[...and so on for each file with additive changes]
```
Then ask:
> **Apply all additive changes?** These add new content without touching anything already in the files.
> Reply **yes** to apply all, or list the numbers you want to skip.
Wait for the user's response before proceeding. Apply only the confirmed items.
### Conflicting changes
Present each conflict individually, one at a time:
```
## Conflict 1 of [N]: Job title — [COMPANY_NAME]
**Current in 01-candidate-profile.md:**
[TITLE_A] — [COMPANY_NAME] ([START][END])
**Proposed (from LinkedIn export):**
[TITLE_B] — [COMPANY_NAME] ([START][END])
Options:
[keep] Keep the existing text
[replace] Replace with the version from the document
[manual] I'll edit this myself — skip for now
```
Wait for the user's choice on each conflict before presenting the next one.
If there are no conflicts, state "No conflicting changes found." and skip this section.
---
## Step 7: Write Confirmed Changes
After all confirmations are collected, apply the changes. Edit each affected skill file using the Edit tool, making targeted changes only. Do not rewrite entire files.
For each file edited, state which changes were applied.
If a skill file has no confirmed changes, state "No changes made to [filename]."
---
## Step 8: Summary Report
After all writes are complete, present the full summary:
```
## /setup_docs Complete
### What was populated
[For each skill file that received changes, list what was added or updated]
### What was skipped
[List any documents that were present but yielded no new information — with a brief reason]
### Needs manual attention
[List any gaps, ambiguous inferences, STAR stubs, or items flagged during cross-reference resolution]
### Next steps
- Review the STAR stubs in `07-interview-prep.md` and complete them with specific actions and results
- Run `/setup` at any time for an interactive interview to refine sections that documents can't fully populate (behavioral profile depth, career goals, salary expectations)
- Run `/apply <job posting URL>` to generate your first tailored application
- Re-run `/setup_docs` whenever you add new documents to the `documents/` folder
```
---
## Design Principles
- **Read before write.** All skill files are read before any changes are proposed. This makes every run idempotent — changes already present will not be proposed again.
- **Two-bucket merge.** Additive changes (low risk) get a single bulk confirmation. Conflicts (high risk) get individual decisions. This minimizes friction without sacrificing control.
- **Inference is labeled.** When populating behavioral or style files from inferred sources (tone analysis, pattern extraction), the inserted content is always labeled as inferred so it can be reviewed critically before being relied on.
- **Graceful degradation.** Empty subfolders are noted but do not cause errors. The command works with whatever documents are present.
- **Past applications as signal.** outcome.md data is treated as calibration input to `04-job-evaluation.md`, not as hard overrides. Single data points are not extrapolated.
- **Never fabricate.** If a document is ambiguous or partially readable, flag it for manual review rather than inferring content that may be wrong.
+1 -1
View File
@@ -5,7 +5,7 @@
"Bash(python3:*)", "Bash(python3:*)",
"Bash(python:*)", "Bash(python:*)",
"Bash(curl:*)", "Bash(curl:*)",
"Bash(bun:*)", "Bash(bun:*)"
] ]
} }
} }
+23 -24
View File
@@ -61,26 +61,7 @@ claude
/setup /setup
``` ```
Claude will ask about your background, skills, and career goals, then populate all profile files automatically. You can import from an existing CV or answer questions interactively. The setup also configures your job search queries so `/scrape` works immediately. `/setup` offers three paths: read your `documents/` folder if you have one populated (CV PDF, LinkedIn export, diplomas, reference letters, past applications), import a single CV pasted in chat, or walk through an interview. It auto-detects what you have and asks. Documents-folder mode is idempotent and safe to re-run as you add more material; see `documents/README.md` for the layout.
**Alternative: populate from documents**
If you have a collection of career documents (CV PDF, LinkedIn export, diplomas, reference letters, past applications), drop them in the `documents/` folder and run `/setup_docs` instead. It reads all documents, cross-references them for consistency, and merges extracted data into your profile files. Safe to re-run as you add new documents.
```
documents/
├── cv/ ← Your master CV (PDF or .tex)
├── linkedin/ ← LinkedIn profile export (Save to PDF)
├── diplomas/ ← Degree certificates
├── references/ ← Reference letters
└── applications/
└── company_role/
├── job_posting.md
├── cover_letter.tex
└── outcome.md
```
See `documents/README.md` for full instructions.
### 4. Search for jobs ### 4. Search for jobs
@@ -104,6 +85,15 @@ If the URL can't be fetched (some job portals block automated access), you can p
This runs the full workflow: evaluate fit, draft CV + cover letter, review with a second agent, revise, and present the final output. This runs the full workflow: evaluate fit, draft CV + cover letter, review with a second agent, revise, and present the final output.
## Other commands
`/setup`, `/scrape`, and `/apply` form the core workflow. Two more commands extend it once your profile is in place:
- **`/expand`** enriches your profile by scanning public sources you've already linked in it (GitHub repos, portfolio site, Kaggle, Google Scholar) and looking up syllabi for named courses and certifications. Discovered competencies are added to your profile with a source tag. Useful right after `/setup` to surface skills that documents alone don't make explicit.
- **`/upskill`** analyzes the gap between your profile and your tracked job postings (or a single posting via `/upskill <URL>`). Produces a prioritized heatmap of skill gaps and a learning plan with web-searched study resources and time estimates. Useful for career planning between applications.
`/reset` is also available, see [Starting over](#starting-over) below.
## File structure ## File structure
``` ```
@@ -112,8 +102,8 @@ ai-job-search/
├── .claude/ ├── .claude/
│ ├── commands/ │ ├── commands/
│ │ ├── apply.md # /apply workflow (drafter-reviewer) │ │ ├── apply.md # /apply workflow (drafter-reviewer)
│ │ ├── setup.md # /setup onboarding interview │ │ ├── setup.md # /setup onboarding (documents folder, CV import, or interview)
│ │ ├── setup_docs.md # /setup_docs document-based profile population │ │ ├── expand.md # /expand competency enrichment from documents and online presence
│ │ └── reset.md # /reset wipe profile data or documents folder │ │ └── reset.md # /reset wipe profile data or documents folder
│ ├── skills/ │ ├── skills/
│ │ ├── job-application-assistant/ # Core application skill │ │ ├── job-application-assistant/ # Core application skill
@@ -125,7 +115,8 @@ ai-job-search/
│ │ │ ├── 05-cv-templates.md # LaTeX CV structure + tailoring rules │ │ │ ├── 05-cv-templates.md # LaTeX CV structure + tailoring rules
│ │ │ ├── 06-cover-letter-templates.md # LaTeX cover letter templates │ │ │ ├── 06-cover-letter-templates.md # LaTeX cover letter templates
│ │ │ └── 07-interview-prep.md # STAR examples + interview framework │ │ │ └── 07-interview-prep.md # STAR examples + interview framework
│ │ ── job-scraper/ # Job search orchestration │ │ ── job-scraper/ # Job search orchestration
│ │ └── upskill/ # /upskill skill gap analysis and learning plan
│ └── settings.local.json # Claude Code permissions │ └── settings.local.json # Claude Code permissions
├── .agents/skills/ # Job portal CLI tools (Denmark) ├── .agents/skills/ # Job portal CLI tools (Denmark)
│ ├── jobbank-search/ # Akademikernes Jobbank │ ├── jobbank-search/ # Akademikernes Jobbank
@@ -137,11 +128,19 @@ ai-job-search/
├── cover_letters/ ├── cover_letters/
│ ├── cover.cls # Custom cover letter LaTeX class │ ├── cover.cls # Custom cover letter LaTeX class
│ └── OpenFonts/ # Lato + Raleway fonts │ └── OpenFonts/ # Lato + Raleway fonts
├── documents/ # Career source materials for /setup Path A and /expand
│ ├── README.md # Folder layout instructions
│ ├── cv/ # Master CV (PDF or .tex)
│ ├── linkedin/ # LinkedIn profile export (PDF)
│ ├── diplomas/ # Degree certificates and transcripts
│ ├── references/ # Reference letters
│ └── applications/ # Past application records (<company>_<role>/)
├── salary_lookup.py # Salary benchmarking tool (BYO data) ├── salary_lookup.py # Salary benchmarking tool (BYO data)
├── tools/ ├── tools/
│ ├── convert_salary_excel.py # Convert salary Excel to JSON │ ├── convert_salary_excel.py # Convert salary Excel to JSON
│ └── README_SALARY_TOOL.md # Salary tool setup instructions │ └── README_SALARY_TOOL.md # Salary tool setup instructions
├── job_scraper/ # Scraper state (seen jobs, results) ├── job_scraper/ # Scraper state (seen jobs, results)
├── upskill/ # /upskill report output (markdown reports per run)
├── job_search_tracker.csv # Application tracking spreadsheet ├── job_search_tracker.csv # Application tracking spreadsheet
└── SETUP.md # Detailed setup guide └── SETUP.md # Detailed setup guide
``` ```
@@ -225,7 +224,7 @@ The single biggest factor in output quality is how much detail you put into your
- **Role descriptions:** Don't just list job titles. Describe what you actually did in each position: specific projects, tools used, responsibilities, and measurable achievements. The more material you provide, the more precisely the system can reframe your experience for different roles. - **Role descriptions:** Don't just list job titles. Describe what you actually did in each position: specific projects, tools used, responsibilities, and measurable achievements. The more material you provide, the more precisely the system can reframe your experience for different roles.
- **Skills in context:** Instead of listing "Python" or "project management," describe how and where you applied them. "Built ML pipelines for customer churn prediction in Python using scikit-learn" gives the system far more to work with than "Python, machine learning." - **Skills in context:** Instead of listing "Python" or "project management," describe how and where you applied them. "Built ML pipelines for customer churn prediction in Python using scikit-learn" gives the system far more to work with than "Python, machine learning."
- **Either onboarding path works:** Whether you import an existing CV or answer questions interactively via `/setup`, the principle is the same: richer input produces sharper output. - **All onboarding paths work:** Whether you point `/setup` at your `documents/` folder, paste a single CV, or walk through the interview, the principle is the same: richer input produces sharper output.
### Career path discovery ### Career path discovery
+11 -11
View File
@@ -1,6 +1,6 @@
# Documents Folder # Documents Folder
This folder holds your actual career documents. The `/setup_docs` command reads everything here and uses it to populate the candidate skill files under `.claude/skills/job-application-assistant/`. It is safe to re-run `/setup_docs` as you add new documents — it merges intelligently and will never overwrite existing content without asking you first. This folder holds your actual career documents. The `/setup` command reads everything here and uses it to populate the candidate skill files under `.claude/skills/job-application-assistant/`. It is safe to re-run `/setup` as you add new documents — it merges intelligently and will never overwrite existing content without asking you first.
--- ---
@@ -29,14 +29,14 @@ Your master CV — the most complete, unedited version of your professional reco
**Supported formats:** `.pdf`, `.tex` **Supported formats:** `.pdf`, `.tex`
**What `/setup_docs` extracts:** **What `/setup` extracts:**
- Work experience (titles, companies, dates, bullet points) - Work experience (titles, companies, dates, bullet points)
- Education (degrees, institutions, dates, thesis topics) - Education (degrees, institutions, dates, thesis topics)
- Technical skills - Technical skills
- Awards and publications - Awards and publications
- Contact information - Contact information
**Naming:** Any filename works. If multiple files are present, `/setup_docs` reads all of them and cross-references for consistency. **Naming:** Any filename works. If multiple files are present, `/setup` reads all of them and cross-references for consistency.
**Tip:** Keep your most comprehensive CV here (not a tailored variant). The skill files are the canonical source — tailored CVs are generated per application by `/apply`. **Tip:** Keep your most comprehensive CV here (not a tailored variant). The skill files are the canonical source — tailored CVs are generated per application by `/apply`.
@@ -50,7 +50,7 @@ Your LinkedIn profile exported as a PDF.
**Supported formats:** `.pdf` **Supported formats:** `.pdf`
**What `/setup_docs` extracts:** **What `/setup` extracts:**
- Work experience and dates (cross-referenced against your CV) - Work experience and dates (cross-referenced against your CV)
- Skills and endorsements - Skills and endorsements
- Education - Education
@@ -60,7 +60,7 @@ Your LinkedIn profile exported as a PDF.
- About/summary section (used to infer behavioral profile additions) - About/summary section (used to infer behavioral profile additions)
- Recommendations received (may enrich reference context) - Recommendations received (may enrich reference context)
**Naming:** Any filename works. Only one LinkedIn export is expected; if multiple are present, `/setup_docs` uses the most recently modified one. **Naming:** Any filename works. Only one LinkedIn export is expected; if multiple are present, `/setup` uses the most recently modified one.
--- ---
@@ -70,7 +70,7 @@ Degree certificates, transcripts, and any official qualifications.
**Supported formats:** `.pdf` **Supported formats:** `.pdf`
**What `/setup_docs` extracts:** **What `/setup` extracts:**
- Degree titles and official names (used to verify education entries) - Degree titles and official names (used to verify education entries)
- Graduation dates - Graduation dates
- Grades or distinctions (if visible) - Grades or distinctions (if visible)
@@ -86,7 +86,7 @@ Reference letters from former managers, supervisors, or collaborators.
**Supported formats:** `.pdf`, `.txt`, `.md` **Supported formats:** `.pdf`, `.txt`, `.md`
**What `/setup_docs` extracts:** **What `/setup` extracts:**
- Referee name, title, and organization - Referee name, title, and organization
- Specific quotes and assessments (added to the references section of `01-candidate-profile.md`) - Specific quotes and assessments (added to the references section of `01-candidate-profile.md`)
- Competency language used by referees (adds behavioral signal to `02-behavioral-profile.md`) - Competency language used by referees (adds behavioral signal to `02-behavioral-profile.md`)
@@ -111,7 +111,7 @@ applications/
### Files within each application folder ### Files within each application folder
**`job_posting.md`** — Paste the full job posting text here. Used by `/setup_docs` to infer which skills and role types you have targeted, and to calibrate `04-job-evaluation.md`. **`job_posting.md`** — Paste the full job posting text here. Used by `/setup` to infer which skills and role types you have targeted, and to calibrate `04-job-evaluation.md`.
**`cover_letter.tex`** — The cover letter you actually submitted. Used to extract writing style patterns and structure for `06-cover-letter-templates.md`. **`cover_letter.tex`** — The cover letter you actually submitted. Used to extract writing style patterns and structure for `06-cover-letter-templates.md`.
@@ -139,7 +139,7 @@ What would you do differently?
Any signal about what they valued or didn't? Any signal about what they valued or didn't?
``` ```
**What `/setup_docs` learns from outcome.md:** **What `/setup` learns from outcome.md:**
- Which role types and companies have led to interviews (signals strong fit areas) - Which role types and companies have led to interviews (signals strong fit areas)
- Which applications did not progress (informs the experience match calibration in `04-job-evaluation.md`) - Which applications did not progress (informs the experience match calibration in `04-job-evaluation.md`)
- Interview feedback, if you recorded it, can surface new STAR candidates - Interview feedback, if you recorded it, can surface new STAR candidates
@@ -148,7 +148,7 @@ Any signal about what they valued or didn't?
## File Format Notes ## File Format Notes
| Format | Readable by `/setup_docs` | Notes | | Format | Readable by `/setup` | Notes |
|--------|--------------------------|-------| |--------|--------------------------|-------|
| `.pdf` | Yes | Parsed directly with the Read tool | | `.pdf` | Yes | Parsed directly with the Read tool |
| `.tex` | Yes | LaTeX source — structure and content both readable | | `.tex` | Yes | LaTeX source — structure and content both readable |
@@ -159,7 +159,7 @@ Any signal about what they valued or didn't?
--- ---
## Re-running `/setup_docs` ## Re-running `/setup`
The command is designed to be re-run as your document collection grows. Each run: The command is designed to be re-run as your document collection grows. Each run: