job-analyzer — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited job-analyzer (Agent Skill) and scored it 87/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 3 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 3 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The user shares a single job description, pasted text, a URL, or both, and wants to know if it's worth pursuing.
If a URL is provided, fetch it. If fetching fails or the page is JS-heavy (LinkedIn etc.), ask the user to paste the text.
Identify:
For each significant requirement, rate against my background (from $PERSONAL/career/impact-doc.md). $PERSONAL is the personal-docs sibling directory defined in CLAUDE.md. Resolve it once at the start of the session and reuse.
| Requirement | Rating | Justification |
|---|---|---|
| 7+ years backend | Strong | 7 years across AWS + Bill |
| Kubernetes at scale | Moderate | Used at Bill, not deep operator-level |
| ML systems | Gap | No direct experience |
Use Strong / Moderate / Gap — three buckets, no fence-sitting. Each justification must cite something concrete from my career, not generic claims.
Scan the Job Description's language, not just its requirements:
One of:
After producing the analysis, persist it to disk so downstream skills (resume-builder, interview-prep) and future sessions can reference it.
Folder convention: $PERSONAL/applications/<company-slug>/<role-slug>/role.md
Slug rules:
Apple Inc. → apple. Stripe, Inc. → stripe. Meta Platforms → meta.Staff Software Engineer, Payments Infrastructure → staff-payments-infra. Keep it short enough to skim in the folder tree (≤ 5 words).If the target file already exists, prompt the user:
## Fit analysis (re-run on YYYY-MM-DD) section below the existing one. Default for re-runs after updating impact-doc.md or goals.md. Preserves history.Tracking state (stage, outcome, date applied, referral, match level) is optional. role.md may mirror these fields when the user provides them inline, but never prompt for them and never invent values. Only write a tracking field when the user has explicitly said something that fills it (e.g., "I applied today" → set date_applied; "recruiter call scheduled" → set stage: recruiter-screen; "Alice referred me" → set referral: Alice Smith). Otherwise omit the field entirely.
The match_level field is the only exception: when first creating role.md from a fit analysis, derive it from the verdict (great-fit / stretch / poor-fit). The user can edit or remove it later.
Schema (single file, YAML frontmatter + body):
---
position: Staff Software Engineer, Payments Infrastructure
company: Stripe
location: San Francisco, CA
work_mode: hybrid # remote | hybrid | onsite | unknown
job_id: 6173829 # if available, else null
link: https://stripe.com/jobs/... # canonical posting URL
date_added: 2026-05-11 # today's date when first created
comp_range: $280k-$380k TC # if stated in Job Description, else null
tech_stack: [Ruby, Go, Kafka, Postgres]
# Optional tracking fields. Omit any the user has not provided.
# Only mirror what the user mentions inline; never prompt, never invent.
match_level: great-fit # great-fit | stretch | poor-fit (derived from verdict on creation)
stage: # applied | recruiter-screen | hm-call | tech-screen | onsite | offer | accepted | declined | rejected | withdrawn | closed
outcome: # active | accepted | declined | rejected | withdrawn | closed
date_applied: # ISO date, only if user has said they applied
referral: # name of person who referred, if any
---
## Fit analysis
(the Strong/Moderate/Gap table + red/green flags + verdict + recommendations from steps 3–6)
## Job Description
(full pasted Job Description text, verbatim, so we don't lose it if the URL rots)
## Notes
(empty placeholder for the user's ongoing free-form notes — questions, recruiter context, follow-ups)After writing, tell the user the absolute path it landed at (resolved from $PERSONAL), e.g. Saved to <absolute>/career-agent-personal-docs/applications/stripe/staff-payments-infra/role.md.
Concise. Table for the requirements grid, prose for everything else. No filler. End with the verdict in bold so I can scan it. Mention the saved path on the last line.
interview-prep's job.resume-builder's job. You can note "this would benefit from a tailored resume emphasizing X" and stop.role.md without prompting.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.