# How to Provide Feedback to Improve the AI's Generation Quality in AI-Job-Search

> Improve AI generation quality by editing source files like CLAUDE.md and skill definitions directly. Learn how to fine-tune AI output effectively for better results.

- Repository: [Mads Lorentzen/ai-job-search](https://github.com/MadsLorentzen/ai-job-search)
- Tags: how-to-guide
- Published: 2026-07-09

---

**You improve the AI's generation quality by editing the structured source files—specifically [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) and the skill definitions in `.claude/skills/job-application-assistant/`—rather than correcting the generated output directly.**

The AI-Job-Search repository leverages Claude Code agents to read your candidate profile, evaluate job postings, and draft LaTeX CVs and cover letters. Because all generation is deterministic—templates filled from structured data—providing feedback means updating the input files that the agents consume during the six-phase pipeline.

## Understanding the Feedback Architecture

The system processes your application through a rigid pipeline where each phase reads specific files. To provide effective feedback, you must modify the source files before the agents consume them.

### Phase 1: Profile Onboarding

During onboarding, the agent reads [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) (your master candidate profile) and the modular skill files under `.claude/skills/job-application-assistant/`. These include:
- [`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md) (personal data, education, experience)
- [`02-behavioral-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/02-behavioral-profile.md) (soft skills, work style)
- [`03-skill-definitions.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/03-skill-definitions.md) (hard skills and competencies)

**Feedback method:** Edit [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) to correct factual errors or enrich your experience descriptions. Keep information modular by using the separate markdown files to prevent data drift.

### Phase 2: Job-Fit Evaluation

The agent evaluates fit by reading [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md), which contains the **scoring rubric** and weighting for five fit dimensions (skill match, experience match, cultural fit, etc.).

**Feedback method:** Adjust the rubric weights to align with your priorities. For example, increase `skill_match_weight` if you want the AI to prioritize technical competencies over years of experience.

### Phase 3: LaTeX Document Drafting

The drafter agent assembles documents by reading [`05-cv-templates.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/05-cv-templates.md) and [`06-cover-letter-templates.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/06-cover-letter-templates.md), which define LaTeX assembly rules, page limits, and bullet-point styles.

**Feedback method:** Modify template rules if outputs appear generic or miss critical details. You can also edit `cv/main_example.tex` directly to adjust spacing guards like `\needspace{5\baselineskip}`.

### Phase 4: The Reviewer Loop

A reviewer agent critiques the drafted LaTeX against the job posting. This critique lives in temporary memory, not on disk, meaning you cannot edit it directly.

**Feedback method:** Influence the reviewer by clearing the session and re-running the `/apply` command after you have improved the underlying profile or templates.

### Phase 5: ATS Verification

The pipeline validates output using [`tools/lint_skills.py`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tools/lint_skills.py), which enforces strict schema compliance on skill files, and extracts text from compiled PDFs using `pdftotext` to verify contact details.

**Feedback method:** Run `python tools/lint_skills.py` locally to catch schema violations early. Ensure PDFs contain literal contact details—otherwise the ATS check will flag the output as malformed.

### Phase 6: Continuous Learning

The optional `/upskill` command generates reports surfacing competency gaps, while [`tools/convert_salary_excel.py`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tools/convert_salary_excel.py) provides benchmarking data.

**Feedback method:** When the AI repeatedly suggests missing skills, run `/upskill https://example.com/job`, then feed the generated learning plan back into [`02-behavioral-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/02-behavioral-profile.md) by adding new competencies.

## Practical Steps to Provide Feedback

Follow these specific workflows to inject quality improvements into the system.

### Update the Candidate Profile

Open the master profile for editing:

```bash
nano CLAUDE.md

```

Add precise skill entries to reduce hallucinations:

```markdown
- **Primary:** Python (pandas, scikit-learn), Docker, Git
- **Secondary:** Rust, Go, Terraform

```

The job-application-assistant skill reads these fields at runtime from [`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md).

### Adjust the Scoring Weights

Edit [`/.claude/skills/job-application-assistant/04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main//.claude/skills/job-application-assistant/04-job-evaluation.md) to re-weight fit dimensions:

```diff
- skill_match_weight: 0.3
- experience_match_weight: 0.2
+ skill_match_weight: 0.4
+ experience_match_weight: 0.25

```

Save and re-run the workflow:

```bash
claude /apply https://jobindex.dk/job/1234567

```

### Refine CV Templates

To prevent orphaned section titles, insert spacing guards in `cv/main_example.tex`:

```latex
\needspace{5\baselineskip}
\cventry{2020--2022}{Senior Engineer}{Acme Corp}{Copenhagen}{}

```

Compile locally to verify:

```bash
lualatex cv/main_example.tex

```

### Validate with CI Linting

Enforce schema correctness before submitting:

```bash
python tools/lint_skills.py

```

Fix any errors in the offending skill files (e.g., missing `description` fields) to prevent malformed prompts that degrade output quality.

### Use the Upskill Command for Gap Analysis

Generate feedback on missing competencies:

```bash
claude /upskill https://jobindex.dk/job/9876543

```

Add the most relevant suggested skills to [`02-behavioral-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/02-behavioral-profile.md), then re-run `/apply` to see improved matches.

## Summary

- **Edit source files, not outputs:** Modify [`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md) and the `.claude/skills/` definitions to change what the AI generates.
- **Adjust the rubric:** Tweak weights in [`04-job-evaluation.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/04-job-evaluation.md) to prioritize skills or experience based on your target roles.
- **Template precision:** Update [`05-cv-templates.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/05-cv-templates.md) and [`06-cover-letter-templates.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/06-cover-letter-templates.md) to control LaTeX formatting and prevent generic phrasing.
- **Enforce schema:** Run [`tools/lint_skills.py`](https://github.com/MadsLorentzen/ai-job-search/blob/main/tools/lint_skills.py) to ensure skill files pass CI validation and produce valid prompts.
- **Close the loop:** Use `/upskill` to identify gaps, update your profile, and re-run `/apply` to verify improvements in the reviewer loop.

## Frequently Asked Questions

### Why can't I edit the generated LaTeX directly to provide feedback?

The reviewer agent operates in an isolated loop that critiques drafts without modifying them. Because the system is deterministic, any changes you make to the output would be overwritten on the next run. Instead, update the **input** files ([`CLAUDE.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/CLAUDE.md), templates, or rubrics) so the drafter produces better output natively.

### How do I know if my skill files are causing quality issues?

Run `python tools/lint_skills.py` from the repository root. This CI-style validator enforces strict JSON/YAML schema on all files under `.claude/skills/`. If the linter reports missing required fields or malformed YAML, the agents receive incomplete prompts, leading to hallucinations or generic text.

### What is the difference between `/apply` and `/upskill` commands?

The `/apply` command triggers the full pipeline: it reads your profile, evaluates the job posting, drafts LaTeX documents, and runs the reviewer loop. The `/upskill` command analyzes a specific job posting against your current skills and generates a learning plan without drafting documents. Use `/upskill` to identify gaps, update your profile, then run `/apply` to generate improved applications.

### Where should I add new technical skills to improve generation accuracy?

Add primary technical skills to [`01-candidate-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/01-candidate-profile.md) under the hard skills section, and secondary or emerging skills to [`02-behavioral-profile.md`](https://github.com/MadsLorentzen/ai-job-search/blob/main/02-behavioral-profile.md). The agents reference these files during the job-fit evaluation phase, and precise categorization ensures the drafter includes relevant competencies in the final LaTeX output.