Skip to content

Output and reports

A run whose audit passes writes four files per job, plus the report it prints to your terminal. When the audit fails you get the report only — see When the audit fails.

Where files land

output/                                   ← --output-dir (default ./output)
├── resume_converted.md                   ← only when the input was .docx or .pdf
└── acme_corp-senior_engineer/            ← --output-pattern
    ├── acme_corp-jane_doe.md             ← --resume-name-pattern
    ├── acme_corp-jane_doe.pdf
    ├── acme_corp-jane_doe.docx
    ├── acme_corp-jane_doe_report.md
    └── resume_debug.md                   ← only with --debug

The three resume files hold the same content. All three are rendered from the structured CV the writer produced; the PDF and DOCX share one template so they look the same.

Styles

Pick a template with --style (default modern). Every style is single-column with no tables, so ATS (Applicant Tracking System) parsers read it top to bottom.

Style Look
modern Sans-serif, navy headings with a thin rule (default)
classic Serif, black uppercase headings — conservative
compact Sans-serif, teal headings, tight spacing — fits more on one page
uv run sira tailor <JOB_URL> <RESUME_PATH> --style classic

The Markdown file uses the same section order: name and contact line, Summary, Skills (one bold category per line), Experience, Projects, Education, Certifications, Publications. Empty sections are omitted.

Naming patterns

Pattern option Default Controls
--output-pattern {company_name}-{job_title} the per-job subdirectory
--resume-name-pattern {company_name}-{full_name} the resume base filename

Available variables: {company_name}, {job_title}, {full_name}, {timestamp} (today as YYYYMMDD).

Each value is lowercased, spaces become underscores, and every other character is stripped — so Acme Corp becomes acme_corp. A resolved name containing a path separator, .., an absolute path, or a control character is rejected and the run exits with code 1 before writing anything.

# One directory per job title, one file per day
uv run sira tailor <JOB_URL> <RESUME_PATH> \
  --output-pattern "{job_title}" \
  --resume-name-pattern "{full_name}-{timestamp}"

The self-review report

The report is the honest half of the tool. The resume shows your work in its best light; the report tells you where that light does not reach.

flowchart LR
    ORIG["Original CV<br/>(parsed)"] --> DIFF["compute_cv_diff()<br/>pure Python"]
    TAIL["Tailored CV"] --> DIFF
    JOB["JobAnalysis<br/>(skills, keywords)"] --> MATCH["match_skills()<br/>skill judge + evidence"] --> GAP["compute_gap_analysis()<br/>compute_match_score()<br/>pure Python"]
    ORIG --> MATCH
    DIFF --> RPT
    GAP --> RPT
    AUD["AuditResult<br/>(scores, issues)"] --> RPT["report_agent"]
    RPT --> OUT["FinalReport<br/>match score + verdict"]

The pure Python box matters: the diff, the gap analysis, the score and the verdict are computed in plain code. A model is asked one thing — whether your CV shows each job skill, with a quote as evidence — and cannot flatter you beyond that, because it never touches the numbers.

Sections in the report

Section What it tells you
Match Score & Recommendation A 0–100 score and a verdict: Strong Match, Partial Match, or Weak Match, with the reasoning. Score = 0.6·hard + 0.2·soft + 0.2·keywords coverage.
What Changed Whether the summary was rewritten, which skills moved up or down, and which bullet points were rephrased for each role.
Keyword Coverage Which ATS keywords from the posting appear in your resume, which do not, and the percentage covered.
Skills Covered Hard and soft skills the job asks for that your resume shows — by meaning, not only exact words — each with the resume line that proves it, and the coverage percentages that feed the score.
Skill Gaps Hard and soft skills the job asks for that are genuinely absent from your resume.
Suggestions to Strengthen Your Application Concrete things to do — usually about experience you should add to the original resume, not to this tailored copy.
Audit Summary The auditor's feedback on tone, authenticity, and rule compliance.

The same content is printed to your terminal at the end of a run.

Reading the audit scores

Two 0–10 scores come out of the auditor:

Score Good value Meaning
hallucination_score low 0 means nothing was invented. The pass criterion is ≤ 2.
ai_cliche_score low 10 means it reads like a robot. The pass criterion is ≤ 3.

The auditor also checks that every hyperlink from your original resume survives in [text](url) form. A dropped link fails the audit.

When the audit fails

A failed audit is not a crash. Sira:

  1. Prints the auditor's feedback,
  2. Skips writing the resume files,
  3. Still writes and prints the report,
  4. Exits with code 0.

The report tells you what to fix. Feed it back with re-tailor, or re-run with more attempts:

uv run sira tailor <JOB_URL> <RESUME_PATH> --write-attempts 3 --review-iterations 2

Converted and debug files

  • resume_converted.md is written into --output-dir whenever your input was a .docx or .pdf. It is the Markdown that the parser actually saw — useful when the parser missed something and you want to know whether the conversion or the model was at fault.
  • resume_debug.md is written into the job directory only with --debug, and holds the same converted text alongside extra console diagnostics.