career-development — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited career-development (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
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.
This file is the Plane 1 knowledge anchor for the Career Development workflow (ARCH-0040). As a Plane 1 skill it lives under .claude/skills/career-development/ and provides structured knowledge — it does not execute binaries. When activated, it compares the candidate's current skills against demand (either every job in the tracker, or one target posting), produces a prioritized gap heatmap, finds real learning resources via web search, sequences them into a study order, and persists a markdown report under upskill/. It operates under the no-fabrication rule (ARCH-0007), the read-before-write invariant, and never invents learning resources.
This skill backs the /upskill command (.claude/commands/upskill.md) and the dashboard's Upskill surface, which reads the reports this skill writes (upskill/report-*.md).
| File | When to Read |
|---|---|
../job-application-assistant/01-candidate-profile.md | Always — the source of the candidate's current skills, education, and experience to diff against |
../job-application-assistant/04-job-evaluation.md | For the candidate's stated strong/weak areas and career goals, to weight and frame gaps |
This skill also reads, outside the skill directory:
| Source | Mode | Purpose |
|---|---|---|
job_search_tracker.csv (repo root) | Aggregate | Role, company, and fit_rating per tracked application |
upskill/report-YYYY-MM-DD.md (most recent) | Aggregate | Previous report, for delta comparison (REQ-3010) |
| Job posting (URL or pasted text) | Targeted | The single posting to analyze |
The skill runs the same six analytical stages in both modes; what differs is the input and how priority is computed.
Decide the mode from the invocation:
job_search_tracker.csv; for each row extract role, company, and fit_rating.report — tell the user honestly: "You have no tracked applications yet. Run `/search` and `/apply` first, or give me a job URL for a targeted analysis (`/upskill <url>`)."
01-candidate-profile.md) for current skills.upskill/report-YYYY-MM-DD.md and load the most recent for delta (REQ-3010)./upskill <url> or pasted posting text. Analyzes one posting.WebFetch. If the fetch fails, ask the user to paste theposting text (DEC-011) — never abort.
context.
The report's date is today's date (YYYY-MM-DD), available from context.
Extract required and preferred technical skills from the source(s) and diff against the profile.
gap_weight(skill) = sum over postings mentioning it of ((100 − fit_rating) / 100 × occurrence). Lower-fit jobs contribute more (the candidate is further from those roles).
each group.
"Python" covers "Python scripting"; "AWS" covers "Amazon Web Services".
Reason holistically about gaps mechanical diffing misses. Consider and tag each:
[domain] — domain/industry knowledge gaps[soft] — soft-skill gaps (leadership, stakeholder management, communication)[tooling] — tooling/process gaps (CI/CD, IaC, agile practices)[credential] — certifications/credentials. Flag a credential gap only when **multiplepostings** list it as preferred (aggregate) or it is explicitly required (targeted).
No duplication with Pass 1.
Combine Pass 1 + Pass 2 into a prioritized table, printed to the terminal before the learning plan:
| Priority | Skill / Area | Type | Gap Source |
|---|
priority).
entry unless the user asks (REQ-3011).
For every Critical and High gap (and Medium gaps too if the total gap count is fewer than 5), produce a learning entry:
the current year in queries so results are fresh.
books for domain knowledge.
what they already know, and where to start.
If a genuine resource cannot be found for a gap, say so plainly rather than inventing one.
Suggest a numbered, dependency-aware sequence:
| # | Topic | Type | Estimated Time | Note (dependencies) |
|---|
Ordering rules: dependencies first → Critical before High before Medium → quick wins early → domain knowledge last. Show the total estimated time at the bottom.
Always write the report, even if the user seems satisfied with the terminal output.
upskill/report-YYYY-MM-DD.mdupskill/report-YYYY-MM-DD-<company-slug>-<role-slug>.mdSlugs are lowercase, hyphen-separated, alphanumeric. The report contains, in order:
the previous heatmap now present in the profile; New gaps — skills in the current heatmap not in the previous report. Omit this section in targeted mode or when no previous report exists.
Reports are personal output: written under upskill/, never modified after creation, and git-ignored. The dashboard's Upskill surface renders them as-is.
URL resolves. An empty tracker or unfetchable posting yields an honest message, not a fabricated or empty report.
writing anything.
not fetch a posting.
04-job-evaluation.md's stated goals and strong/weak areas toframe priorities — a gap that blocks the candidate's stated direction outranks an incidental one.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.