Skip to content

feat: add OpenClaw skill adaptations for career-ops modes#376

Open
gzhang33 wants to merge 4 commits intosantifer:mainfrom
gzhang33:feat/openclaw-skills
Open

feat: add OpenClaw skill adaptations for career-ops modes#376
gzhang33 wants to merge 4 commits intosantifer:mainfrom
gzhang33:feat/openclaw-skills

Conversation

@gzhang33
Copy link
Copy Markdown

@gzhang33 gzhang33 commented Apr 19, 2026

Summary

Adapts all career-ops modes into OpenClaw skill format under openclaw-skills/.

Each mode is preserved as-is with minimal changes:

  • Claude Code tool calls → OpenClaw equivalents (sessions_spawn, browser, web_search, web_fetch)
  • Spanish → English translation
  • YAML frontmatter added (name + description)

No changes to existing modes, scripts, or configuration.

Closes #377

Included modes

Mode Description
deep 6-axis company research
interview-prep Company-specific interview intelligence
oferta Full 7-block (A-G) JD evaluation
patterns Application outcome analysis
contacto LinkedIn outreach messages
followup Follow-up cadence tracking
scan Portal scanner with 3-level discovery
batch Bulk job processing
pdf ATS-optimized resume generation
tracker Application status tracking

Why a separate directory

Keeps original modes untouched. OpenClaw users get a drop-in skills/ directory.

Summary by CodeRabbit

  • New Features
    • Interview Prep: company- and role-specific interview reports
    • Batch Processing: bulk job posting processing with resumable state
    • LinkedIn Outreach: tailored outreach message generator by contact type
    • Company Research: six-axis deep research reports
    • Follow-up Management: cadence dashboard and draft generation
    • Job Evaluation (Oferta): full JD vs profile assessment and scoring
    • Pattern Analysis: applications conversion and blocker insights
    • PDF Generation: ATS-optimized, personalized resume PDFs
    • Portal Scanning: multi-source job discovery and de-duplication
    • Application Tracker: centralized tracker view and statistics

Adapted 10 career-ops modes into standalone OpenClaw skills:

New skills (6):
- deep-research: 6-axis company research
- interview-prep: Company-specific interview intelligence
- jd-evaluator: Full 7-block (A-G) JD evaluation
- rejection-patterns: Application outcome analysis
- linkedin-outreach: Tailored LinkedIn messages
- followup-tracker: Follow-up cadence dashboard

Upgraded skills (4):
- job-api-search: 3-level scanning with liveness checks
- job-auto-submit: Batch processing with dedup
- resume-ats-generator: ATS optimization with archetype detection
- openclaw-career-tracker: Full state machine with stats dashboard

All skills use generic file paths — no private data.
Copilot AI review requested due to automatic review settings April 19, 2026 09:48
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 19, 2026

📝 Walkthrough

Walkthrough

Adds 10 new OpenClaw skill specification documents under openclaw-skills/ describing workflows for job discovery/scan, batch processing, PDF resume generation, interview prep, deep company research, outreach/contact messages, follow-ups, JD evaluation (oferta), pattern analysis, and an applications tracker. These are documentation-only additions; no code or public API changes.

Changes

Cohort / File(s) Summary
Job Discovery & Batch
openclaw-skills/scan/SKILL.md, openclaw-skills/batch/SKILL.md
Defines a three-level scan pipeline (browser Level‑1, ATS API Level‑2, web_search Level‑3) with title filtering, deduplication, liveness verification, scan-history writing, and pipeline appends; and a batch conductor/runner model for bulk JD processing with per-posting workers, state tracking, resumability, and error/retry behaviors.
Interview Prep & Company Research
openclaw-skills/interview-prep/SKILL.md, openclaw-skills/deep/SKILL.md
Specifies an Interview Prep 7‑step flow (web research, process overview, round breakdowns, question categorization, story-bank mapping, tech checklist, company signals) and a Deep Research 6‑axis company analysis with sourcing/citation rules and output report layout.
Outreach & Follow-up
openclaw-skills/contacto/SKILL.md, openclaw-skills/followup/SKILL.md
Introduces a 3‑sentence LinkedIn outreach framework with rules by contact type and a follow-up cadence/dashboard workflow that computes urgency, generates drafts for urgent/overdue items, records follow-ups, and updates trackers.
JD Evaluation & PDF Generation
openclaw-skills/oferta/SKILL.md, openclaw-skills/pdf/SKILL.md
Adds a full JD evaluation (A–G blocks: role summary, CV mapping, negotiation, comp research, personalization, interview plan, legitimacy scoring) with archetype detection; and an ATS-optimized PDF pipeline (keyword extraction/injection, HTML→PDF, optional Canva design path) with strict formatting and citation rules.
Patterns & Tracker
openclaw-skills/patterns/SKILL.md, openclaw-skills/tracker/SKILL.md
Defines pattern-analysis over applications (funnels, score stats, archetype performance, blockers, recommended thresholds) with report output, and documents the applications tracker schema, status semantics, and tracker statistics display.

Sequence Diagram(s)

sequenceDiagram
    participant Conductor as Conductor
    participant Browser as Browser (Level‑1)
    participant ATS as ATS APIs (Level‑2)
    participant Search as WebSearch (Level‑3)
    participant Store as ScanHistory / Pipeline
    Conductor->>Browser: visit careers_url, extract postings
    Conductor->>ATS: fetch provider APIs/feeds, parse postings
    Conductor->>Search: run search queries, collect result URLs
    alt Level‑3 URL found
        Conductor->>Browser: verify liveness (sequential)
        Browser-->>Conductor: active / expired result
    end
    Conductor->>Store: dedupe vs scan-history & pipeline
    Conductor->>Store: append verified, non-duplicate postings to pipeline.md and data/scan-history.tsv
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • docs(scan): clarify scan.mjs is API-only; Playwright/WebSearch is the… #354: Related scan workflow coverage; discusses scan implementation tiers (API vs agent-executed browser/web_search) that overlap with the new scan spec.
  • #377: feat: OpenClaw skill adaptations — make career-ops compatible with OpenClaw agents: motivation and checklist aligning with this PR’s addition of openclaw-skills/ skills for OpenClaw compatibility.

Suggested labels

📄 docs, ⚠️ agent-behavior

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: add OpenClaw skill adaptations for career-ops modes' directly and concisely summarizes the main change: adding a new openclaw-skills/ directory with skill files adapted for OpenClaw agents.
Linked Issues check ✅ Passed All PR objectives from issue #377 are met: 10 skill files added to openclaw-skills/ directory, Claude Code tools replaced with OpenClaw equivalents (web_search, browser, sessions_spawn), English language used, YAML frontmatter included, and original mode names preserved.
Out of Scope Changes check ✅ Passed All changes are in-scope: only new openclaw-skills/ documentation files are added; no modifications to existing modes, scripts, or configuration files occur.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Welcome to career-ops, @gzhang33! Thanks for your first PR.

A few things to know:

  • Tests will run automatically — check the status below
  • Make sure you've linked a related issue (required for features)
  • Read CONTRIBUTING.md if you haven't

We'll review your PR soon. Join our Discord if you have questions.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds a set of OpenClaw-compatible, standalone skills that adapt the existing “career-ops” modes into reusable skill modules.

Changes:

  • Added 10 new openclaw-skills/*/SKILL.md skill definitions covering scanning, evaluation, tracking, outreach, follow-ups, interview prep, research, and ATS resume generation.
  • Defined per-skill workflows, inputs/outputs, and expected data files (tracker, scan history, reports).
  • Introduced a more elaborate application-tracking “state machine” and batch-processing guidance for scanning/submission flows.

Reviewed changes

Copilot reviewed 10 out of 10 changed files in this pull request and generated 14 comments.

Show a summary per file
File Description
openclaw-skills/deep-research/SKILL.md 6-axis company research workflow and report output format
openclaw-skills/followup-tracker/SKILL.md Follow-up dashboard logic + draft/recording workflow
openclaw-skills/interview-prep/SKILL.md Interview intel research workflow + report format
openclaw-skills/jd-evaluator/SKILL.md 7-block JD evaluation rubric including legitimacy checks
openclaw-skills/job-api-search/SKILL.md 3-level job discovery scanner (browser, ATS APIs, web search)
openclaw-skills/job-auto-submit/SKILL.md Single + batch auto-apply workflow with worker spawning and state tracking
openclaw-skills/linkedin-outreach/SKILL.md Message frameworks for different LinkedIn contact types
openclaw-skills/openclaw-career-tracker/SKILL.md Application tracker state machine and dashboard metrics definition
openclaw-skills/rejection-patterns/SKILL.md Outcome/pattern analysis workflow and report template
openclaw-skills/resume-ats-generator/SKILL.md ATS resume/cover letter/screening answer generation workflow + PDF generation guidance

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread openclaw-skills/job-api-search/SKILL.md Outdated
## Deduplication

Check against three sources before adding:
1. `scan-history.tsv` — URL exact match already seen
Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deduplication references scan-history.tsv without the data/ prefix, but the canonical path (and later in this file) is data/scan-history.tsv. Use a single canonical path throughout so history/dedup reads and writes target the same file.

Suggested change
1. `scan-history.tsv` — URL exact match already seen
1. `data/scan-history.tsv` — URL exact match already seen

Copilot uses AI. Check for mistakes.

Application tracker stored as Markdown: `applications.md` in the project root.

Columns (TSV or table format): company, role, status, score, archetype, remote_policy, blockers, tech_gaps, date, notes.
Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The declared tracker columns don’t include company_size, but later steps require extracting it. Add company_size to the column contract (line 14) or remove it from the required extracted fields to keep the parsing requirements consistent.

Suggested change
Columns (TSV or table format): company, role, status, score, archetype, remote_policy, blockers, tech_gaps, date, notes.
Columns (TSV or table format): company, role, status, score, archetype, remote_policy, blockers, tech_gaps, company_size, date, notes.

Copilot uses AI. Check for mistakes.
Comment on lines +12 to +16
| Source | Path |
|--------|------|
| Job Profile | `data/job_profile.json` |
| Existing PDFs | `data/*.pdf` |
| PDF Generator | `scripts/generate_resume_pdf.py` |
Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These data source paths/commands don’t match the repo layout: PDFs are stored under output/ (not data/*.pdf), there is no scripts/ directory, and scripts/generate_resume_pdf.py doesn’t exist (PDF generation is via generate-pdf.mjs). Update the referenced paths/commands so the skill is runnable in this repo.

Copilot uses AI. Check for mistakes.
Comment on lines +17 to +22
- **Evaluation report:** `reports/{company-slug}.md` (if exists)

## Inputs (Required)

1. **Company name** + **role title**
2. Evaluation report (if exists) — for archetype, gaps, matched proof points
Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The evaluation report path pattern here (reports/{company-slug}.md) doesn’t match the report filename format produced by the evaluator (reports/{###}-{company-slug}-{YYYY-MM-DD}.md). Update this to reference the latest matching report (by slug) or accept an explicit report link/input.

Suggested change
- **Evaluation report:** `reports/{company-slug}.md` (if exists)
## Inputs (Required)
1. **Company name** + **role title**
2. Evaluation report (if exists) — for archetype, gaps, matched proof points
- **Evaluation report:** latest matching `reports/{###}-{company-slug}-{YYYY-MM-DD}.md` for the company slug, or an explicit report path/link if provided
## Inputs (Required)
1. **Company name** + **role title**
2. Evaluation report (optional but recommended) — use an explicitly provided report path/link, or the latest matching report for the company slug if one exists; use it for archetype, gaps, matched proof points

Copilot uses AI. Check for mistakes.
Comment on lines +18 to +30
## Reference Files — Read When Needed

| File | When to Read |
|------|-------------|
| `references/ats-optimization.md` | Before generating resume — ATS keyword rules, formatting constraints |
| `references/best-practices.md` | Before writing content — quality standards, bullet-point structure |
| `references/resume-templates.md` | When choosing format — chronological/functional/combination structures |
| `references/resume-generation-workflow.md` | During Phase 4 — JSON schema, PDF generation commands, page verification, role-specific filtering, form-fill snippet |
| `references/cover-letter-framework.md` | Before Phase 5 — structure, writing rules, anti-AI voice patterns |
| `references/anti-ai-voice-guide.md` | Before delivering any text — checklist to eliminate AI-sounding language |
| `references/screening_qa_framework.md` | During Phase 6 — role-specific screening answer templates |
| `references/user-profile-reference.md` | When verifying user data — full profile details |

Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This skill references multiple references/*.md documents, but there is no references/ directory in the repo. Either include these reference docs in the PR or point to existing documentation (e.g., docs/ / modes/) so the skill can actually follow its own workflow.

Suggested change
## Reference Files — Read When Needed
| File | When to Read |
|------|-------------|
| `references/ats-optimization.md` | Before generating resume — ATS keyword rules, formatting constraints |
| `references/best-practices.md` | Before writing content — quality standards, bullet-point structure |
| `references/resume-templates.md` | When choosing format — chronological/functional/combination structures |
| `references/resume-generation-workflow.md` | During Phase 4 — JSON schema, PDF generation commands, page verification, role-specific filtering, form-fill snippet |
| `references/cover-letter-framework.md` | Before Phase 5 — structure, writing rules, anti-AI voice patterns |
| `references/anti-ai-voice-guide.md` | Before delivering any text — checklist to eliminate AI-sounding language |
| `references/screening_qa_framework.md` | During Phase 6 — role-specific screening answer templates |
| `references/user-profile-reference.md` | When verifying user data — full profile details |
## Operational Guidance
Use the following guidance directly within this skill instead of relying on external `references/*.md` files.
### ATS and formatting rules
- Mirror exact skill and tool phrasing from the job description where truthful and supported by the user profile.
- Prefer standard section headings such as `Summary`, `Skills`, `Experience`, `Education`, and `Projects`.
- Avoid tables, text boxes, icons, headers/footers with critical information, multi-column layouts, and heavy graphics in resume output.
- Keep formatting simple and parser-friendly; use consistent dates, locations, and bullet structure.
### Resume content standards
- Write concise, outcome-oriented bullets starting with strong action verbs.
- Prioritise quantified impact, scope, ownership, and technologies used.
- Focus first on the most relevant experience for the target role.
- Do not invent metrics, employers, dates, projects, authorisation status, or qualifications.
### Resume format selection
- Default to chronological format unless the user requests otherwise.
- Use functional or combination structure only when the user's background makes chronology materially less effective.
- Optimise the top third of page one for a 6-second recruiter scan: target title, key skills, and strongest evidence.
### Resume generation workflow notes
- During resume generation, preserve a structured intermediate representation suitable for JSON-based export and PDF rendering.
- Verify page length, section order, role relevance, and keyword coverage before finalising output.
- Tailor highlighted projects and bullets to the detected variant: `embedded`, `fullstack`, `iot`, or `general`.
- Produce form-fill snippets consistent with the final resume and cover letter content.
### Cover letter guidance
- Structure cover letters as: opening fit statement, 1-2 evidence paragraphs, company/role alignment, and concise close.
- Keep tone specific, professional, and grounded in the user's actual experience.
- Avoid generic flattery, vague enthusiasm, and unsupported claims.
### Anti-AI voice check
- Remove repetitive sentence patterns, inflated adjectives, and overly polished generic phrasing.
- Prefer concrete details, varied cadence, and direct statements over abstract buzzwords.
- Before delivering any text, do a final pass to make sure it sounds like a capable human professional, not a template.
### Screening answers guidance
- Keep answers truthful, concise, and aligned with the resume.
- Prefer direct responses first, then brief supporting detail.
- For eligibility, sponsorship, location, compensation, or start-date questions, use verified user data only.
### User profile verification
- When verifying user data, rely on `data/job_profile.json` and the user's existing PDFs listed above.
- Cross-check graduation year, degree, employment dates, contact info, and work authorisation before drafting materials.

Copilot uses AI. Check for mistakes.
Comment on lines +1 to +4
---
name: job-auto-submit
description: Apply to jobs individually or in batch mode. Single-apply handles one job at a time with Playwright automation across LinkedIn, Indeed, Glassdoor. Batch mode processes multiple JDs sequentially with state tracking, dedup, and error recovery. Use when user says "apply to jobs", "auto-apply", "batch apply", or wants to automate application submission.
---
Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This skill description and setup still depend on Playwright/Chromium, which conflicts with the PR description’s stated adaptation of Playwright → OpenClaw browser tool. Either update the workflow to use OpenClaw browser tooling, or adjust the PR description/skill text so the runtime requirements match.

Copilot uses AI. Check for mistakes.
## Reference Data

- Candidate profile: `cv.md` in project root (proof points for Sentence 2)
- Application context: `applications.md` for company/role details
Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reference data points to applications.md, but the canonical tracker path in this repo is data/applications.md (see DATA_CONTRACT.md). Update this reference to avoid sending the agent to a non-standard file location.

Suggested change
- Application context: `applications.md` for company/role details
- Application context: `data/applications.md` for company/role details

Copilot uses AI. Check for mistakes.
### Phase 1 — Setup

1. Verify Playwright + Chromium installed
2. Load user profile from `assets/job_profile.json`
Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

assets/job_profile.json is referenced as the profile source, but there is no assets/ directory in the repo and other docs/tools use config/profile.yml and/or data/* for user data. Please point to an existing canonical path (or document the expected file creation).

Suggested change
2. Load user profile from `assets/job_profile.json`
2. Load user profile from `config/profile.yml`

Copilot uses AI. Check for mistakes.
Comment thread openclaw-skills/job-api-search/SKILL.md Outdated
Comment on lines +45 to +48
| Teamtailor | `https://{company}.teamtailor.com/jobs.rss` | RSS items → `title`, `link` |

Use `web_fetch` for GET endpoints. For POST (Ashby, Workday), use `exec` with `curl`.

Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This workflow instructs using an exec tool with curl for POST requests. The PR description calls out OpenClaw tools like browser, web_search, and sessions_spawn, but not an exec capability. If OpenClaw doesn’t support arbitrary command execution, replace this with an HTTP-capable tool (or clearly document that exec is required).

Copilot uses AI. Check for mistakes.
1. **Posting freshness** — date posted, apply button state
2. **Description quality** — tech specificity, team context, realistic requirements, salary mention, boilerplate ratio
3. **Company hiring signals** — search for layoffs/hiring freeze (2-3 queries)
4. **Reposting detection** — check `scan-history.tsv` for same company+role with different URL
Copy link

Copilot AI Apr 19, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reposting detection refers to scan-history.tsv, but the repo’s canonical scan history file is data/scan-history.tsv (per DATA_CONTRACT.md and existing modes). Update this reference so the skill checks the right file.

Suggested change
4. **Reposting detection** — check `scan-history.tsv` for same company+role with different URL
4. **Reposting detection** — check `data/scan-history.tsv` for same company+role with different URL

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 14

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@openclaw-skills/deep-research/SKILL.md`:
- Around line 64-90: The fenced code block in SKILL.md is missing a language
identifier; update the opening triple-backtick to include "markdown" (i.e.,
change ``` to ```markdown) so the template header block (the "# Deep Research:
[Company] — [Role]" section and subsequent lines) is marked as markdown for
proper syntax highlighting and linting.

In `@openclaw-skills/followup-tracker/SKILL.md`:
- Around line 83-93: The fenced code block containing the follow-up template in
SKILL.md lacks a language identifier; update the opening triple-backtick for the
block that starts with "## Follow-up: {Company} — {Role} (#{num})" to include a
language (e.g., change ``` to ```markdown or ```text) so the template is
properly annotated and rendered.
- Around line 28-33: The fenced code block in SKILL.md containing the dashboard
template needs a language identifier; update the triple-backtick fence that
currently precedes "Follow-up Dashboard — {date}" to include a language (e.g.,
"text" or "markdown") so the block starts with ```text (or ```markdown) to
ensure proper syntax highlighting and rendering of the template content.
- Around line 100-102: The fenced code block that shows the table header uses
unmarked triple backticks; update that block to include the markdown language
identifier by changing the opening fence from ``` to ```markdown so the table
header line "| # | App# | Date | Company | Role | Channel | Contact | Notes |"
is treated as Markdown for linting and syntax highlighting.
- Around line 108-116: The fenced code block in SKILL.md contains a template
list without a language identifier; update the block that starts with "- {N}
applications tracked" (the summary template) to add a language tag (e.g.,
```markdown or ```text) immediately after the opening backticks so the block is
rendered correctly and syntax-highlighted where supported.

In `@openclaw-skills/job-api-search/SKILL.md`:
- Around line 98-102: Update the fenced code block that shows the TSV schema
header (the block containing "url\tfirst_seen\tsource\ttitle\tcompany\tstatus")
to include a language identifier after the opening triple backticks (use "tsv"
or "text"), e.g. replace "```" with "```tsv", so the example explicitly declares
the block format for syntax/highlighting tools.
- Around line 106-118: The fenced code block containing the summary template
(the triple-backtick block that starts with "Scan — {YYYY-MM-DD}") is missing a
language identifier; add a language token (e.g., ```text or ```markdown)
immediately after the opening backticks so the block is properly labeled—update
the SKILL.md code fence that surrounds the "Scan — {YYYY-MM-DD}" template to
include the chosen identifier.

In `@openclaw-skills/job-auto-submit/SKILL.md`:
- Around line 74-79: Update the Markdown code fences in SKILL.md to satisfy
markdownlint rules: add explicit language identifiers (e.g., ```tsv, ```text,
```javascript) for the TSV and text blocks shown in the diffs, and ensure the
nested JavaScript fence around the sessions_spawn({ ... }) snippet is surrounded
by blank lines (an empty line before the opening ```javascript and after the
closing ```). Apply the same fixes to the other affected blocks referenced
(lines similar to the TSV table at 85-90, the TSV/status table at 99-106, and
the Batch header block at 133-141) so each fenced block has a language tag and
proper surrounding blank lines for nested fences.
- Line 57: Define and document a concrete tracker contract: replace the vague
"applications tracker" reference with a specific storage path/name and a JSON
schema (fields, types, unique key) used by this skill; update the deduplication
logic (the "dedup checks") to use the declared unique key from that schema and
change the write operations ("Record to applications tracker" and the other
write) to serialize against that schema so reads/writes are consistent and
deterministic across skills.

In `@openclaw-skills/openclaw-career-tracker/SKILL.md`:
- Around line 12-16: The fenced code block containing the state machine diagram
(the block starting with the triple backticks and the lines "Evaluated → Applied
→ Responded → Contacted → Interview → Offer → Rejected → Discarded") is missing
a language identifier; update that opening fence to include a language label
(e.g., change ``` to ```text) so the diagram block is lint-compliant while
preserving the diagram content.
- Around line 70-72: The schema in openclaw-career-tracker/SKILL.md omits the
notes column required by followup-tracker (which updates the Notes column in
data/applications.md); update the Schema (per row) list to include a `notes`
field (e.g., `id, date, company, role, score, status, pdf, report, notes`) and
ensure any examples or validations in SKILL.md reference `notes` so the
documented schema matches followup-tracker behavior.
- Around line 20-29: Update the status table in SKILL.md so each status uses the
canonical capitalized names that other code and learnings expect: replace
`evaluated`, `applied`, `responded`, `contacted`, `interview`, `offer`,
`rejected`, `discarded` with Evaluated, Applied, Responded, Contacted,
Interview, Offer, Rejected, Discarded and add the missing SKIP entry (matching
templates/states.yml exactly); ensure the Trigger column stays unchanged but the
Status column values match the canonical symbols used by followup-tracker and
rejection-patterns.
- Around line 31-38: Update the Valid Transitions list to use capitalized status
names (e.g., change "evaluated" to "Evaluated", "applied" to "Applied",
"responded" to "Responded", "contacted" to "Contacted", "interview" to
"Interview", "offer" to "Offer", "rejected" to "Rejected", "discarded" to
"Discarded") so the transition rules in SKILL.md match the canonical status
casing; also ensure the terminal-state sentence uses the capitalized names
(e.g., "Any terminal state (Offer, Rejected, Discarded) → no further
transitions").

In `@openclaw-skills/rejection-patterns/SKILL.md`:
- Around line 10-14: The skill currently assumes columns archetype,
remote_policy, blockers, tech_gaps exist in applications.md but the canonical
tracker (openclaw-career-tracker/SKILL.md) only exposes id, date, company, role,
score, status, pdf, report; update the skill to read base rows from
applications.md (company, role, status, score, date) and for each row use the
report column to open the linked report file and extract archetype, blockers and
tech_gaps (parsing the report metadata), and separately read config/profile.yml
to apply remote_policy filtering; alternatively, if you prefer a simpler change,
remove all references to archetype, remote_policy, blockers, tech_gaps from the
skill and restrict analysis to the base tracker columns
(id,date,company,role,score,status,pdf,report).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: c6c69fa8-91d3-4398-b2be-22c3a56c61b8

📥 Commits

Reviewing files that changed from the base of the PR and between 1d60ad5 and 445247b.

📒 Files selected for processing (10)
  • openclaw-skills/deep-research/SKILL.md
  • openclaw-skills/followup-tracker/SKILL.md
  • openclaw-skills/interview-prep/SKILL.md
  • openclaw-skills/jd-evaluator/SKILL.md
  • openclaw-skills/job-api-search/SKILL.md
  • openclaw-skills/job-auto-submit/SKILL.md
  • openclaw-skills/linkedin-outreach/SKILL.md
  • openclaw-skills/openclaw-career-tracker/SKILL.md
  • openclaw-skills/rejection-patterns/SKILL.md
  • openclaw-skills/resume-ats-generator/SKILL.md

Comment on lines +64 to +90
```markdown
# Deep Research: [Company] — [Role]

**Date:** YYYY-MM-DD
**URL:** [job posting URL if available]

## 1. AI Strategy
[findings]

## 2. Recent Moves (Last 6 Months)
[findings]

## 3. Engineering Culture
[findings]

## 4. Challenges
[findings]

## 5. Competitors & Differentiation
[findings]

## 6. Candidate Angle
[personalized recommendations]

## Sources
- [URL] — brief description
```
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Add language identifier to fenced code block.

The markdown template example should specify markdown as the language identifier for better syntax highlighting and linting compliance.

📝 Proposed fix
-```
+```markdown
 # Deep Research: [Company] — [Role]
 
 **Date:** YYYY-MM-DD
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)

[warning] 83-83: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/deep-research/SKILL.md` around lines 64 - 90, The fenced code
block in SKILL.md is missing a language identifier; update the opening
triple-backtick to include "markdown" (i.e., change ``` to ```markdown) so the
template header block (the "# Deep Research: [Company] — [Role]" section and
subsequent lines) is marked as markdown for proper syntax highlighting and
linting.

Comment thread openclaw-skills/followup/SKILL.md Outdated
Comment thread openclaw-skills/followup/SKILL.md Outdated
Comment thread openclaw-skills/followup/SKILL.md Outdated
Comment on lines +100 to +102
```
| # | App# | Date | Company | Role | Channel | Contact | Notes |
```
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Add language identifier to fenced code block.

The table header example should specify markdown as the language identifier for linting compliance.

📝 Proposed fix
-   ```
+   ```markdown
    | # | App# | Date | Company | Role | Channel | Contact | Notes |
    ```
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
```
| # | App# | Date | Company | Role | Channel | Contact | Notes |
```
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/followup-tracker/SKILL.md` around lines 100 - 102, The fenced
code block that shows the table header uses unmarked triple backticks; update
that block to include the markdown language identifier by changing the opening
fence from ``` to ```markdown so the table header line "| # | App# | Date |
Company | Role | Channel | Contact | Notes |" is treated as Markdown for linting
and syntax highlighting.

Comment thread openclaw-skills/followup/SKILL.md Outdated
Comment on lines +12 to +16
```
Evaluated → Applied → Responded → Contacted → Interview → Offer
→ Rejected
→ Discarded
```
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Add language identifier to fenced code block.

The state machine diagram should specify a language identifier (e.g., text or leave it as a diagram) for linting compliance.

📝 Proposed fix
-```
+```text
 Evaluated → Applied → Responded → Contacted → Interview → Offer
                                                     → Rejected
                                                     → Discarded
🧰 Tools
🪛 markdownlint-cli2 (0.22.0)

[warning] 12-12: Fenced code blocks should have a language specified

(MD040, fenced-code-language)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/openclaw-career-tracker/SKILL.md` around lines 12 - 16, The
fenced code block containing the state machine diagram (the block starting with
the triple backticks and the lines "Evaluated → Applied → Responded → Contacted
→ Interview → Offer → Rejected → Discarded") is missing a language identifier;
update that opening fence to include a language label (e.g., change ``` to
```text) so the diagram block is lint-compliant while preserving the diagram
content.

Comment on lines +20 to +29
| Status | Meaning | Trigger |
|--------|---------|---------|
| `evaluated` | JD scored, not yet applied | Evaluation complete |
| `applied` | Candidate submitted application | User confirms submission |
| `responded` | Inbound reply from recruiter/company | User receives reply |
| `contacted` | Candidate proactively reached out (outbound LinkedIn, email) | User confirms outreach |
| `interview` | Interview scheduled or completed | User confirms interview |
| `offer` | Received job offer | User confirms offer |
| `rejected` | Rejected at any stage | Rejection received |
| `discarded` | Candidate decided not to pursue | User decides to skip |
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Critical: Status names must use capitalized casing to match canonical states.

The status definitions use lowercase (evaluated, applied, responded, etc.), but followup-tracker (lines 21-24) and rejection-patterns (lines 14-30) filter on capitalized status names (Applied, Responded, Interview). Based on learnings, canonical statuses from templates/states.yml are capitalized: Evaluated, Applied, Responded, Interview, Offer, Rejected, Discarded, SKIP. This casing mismatch will cause filtering logic to fail across skills.

Additionally, the SKIP status is referenced in learnings and rejection-patterns but is missing from this status table.

🔧 Proposed fix to use capitalized canonical statuses
 ### Status Definitions
 
 | Status | Meaning | Trigger |
 |--------|---------|---------|
-| `evaluated` | JD scored, not yet applied | Evaluation complete |
-| `applied` | Candidate submitted application | User confirms submission |
-| `responded` | Inbound reply from recruiter/company | User receives reply |
-| `contacted` | Candidate proactively reached out (outbound LinkedIn, email) | User confirms outreach |
-| `interview` | Interview scheduled or completed | User confirms interview |
-| `offer` | Received job offer | User confirms offer |
-| `rejected` | Rejected at any stage | Rejection received |
-| `discarded` | Candidate decided not to pursue | User decides to skip |
+| `Evaluated` | JD scored, not yet applied | Evaluation complete |
+| `Applied` | Candidate submitted application | User confirms submission |
+| `Responded` | Inbound reply from recruiter/company | User receives reply |
+| `Contacted` | Candidate proactively reached out (outbound LinkedIn, email) | User confirms outreach |
+| `Interview` | Interview scheduled or completed | User confirms interview |
+| `Offer` | Received job offer | User confirms offer |
+| `Rejected` | Rejected at any stage | Rejection received |
+| `Discarded` | Candidate decided not to pursue | User decides to skip |
+| `SKIP` | Candidate chose not to evaluate/apply | Manual skip decision |

Based on learnings, canonical statuses must match templates/states.yml exactly: Evaluated, Applied, Responded, Interview, Offer, Rejected, Discarded, SKIP.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/openclaw-career-tracker/SKILL.md` around lines 20 - 29,
Update the status table in SKILL.md so each status uses the canonical
capitalized names that other code and learnings expect: replace `evaluated`,
`applied`, `responded`, `contacted`, `interview`, `offer`, `rejected`,
`discarded` with Evaluated, Applied, Responded, Contacted, Interview, Offer,
Rejected, Discarded and add the missing SKIP entry (matching
templates/states.yml exactly); ensure the Trigger column stays unchanged but the
Status column values match the canonical symbols used by followup-tracker and
rejection-patterns.

Comment thread openclaw-skills/openclaw-career-tracker/SKILL.md Outdated
Comment on lines +70 to +72
### Schema (per row)

- `id`, `date`, `company`, `role`, `score` (1-5), `status` (state machine), `pdf` (✅/❌), `report` (link or ✅/❌)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Major: Schema missing notes field required by followup-tracker.

The schema definition lists eight fields (id, date, company, role, score, status, pdf, report) but does not include a notes column. However, followup-tracker/SKILL.md line 104 explicitly updates "the Notes column in data/applications.md" with follow-up timestamps. This creates a schema mismatch risk if implementations strictly enforce the documented schema.

📋 Proposed fix to add notes field
 ### Schema (per row)
 
-- `id`, `date`, `company`, `role`, `score` (1-5), `status` (state machine), `pdf` (✅/❌), `report` (link or ✅/❌)
+- `id`, `date`, `company`, `role`, `score` (1-5), `status` (state machine), `pdf` (✅/❌), `report` (link or ✅/❌), `notes` (optional text)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
### Schema (per row)
- `id`, `date`, `company`, `role`, `score` (1-5), `status` (state machine), `pdf` (✅/❌), `report` (link or ✅/❌)
### Schema (per row)
- `id`, `date`, `company`, `role`, `score` (1-5), `status` (state machine), `pdf` (✅/❌), `report` (link or ✅/❌), `notes` (optional text)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/openclaw-career-tracker/SKILL.md` around lines 70 - 72, The
schema in openclaw-career-tracker/SKILL.md omits the notes column required by
followup-tracker (which updates the Notes column in data/applications.md);
update the Schema (per row) list to include a `notes` field (e.g., `id, date,
company, role, score, status, pdf, report, notes`) and ensure any examples or
validations in SKILL.md reference `notes` so the documented schema matches
followup-tracker behavior.

Comment on lines +10 to +14
## Data Source

Application tracker stored as Markdown: `applications.md` in the project root.

Columns (TSV or table format): company, role, status, score, archetype, remote_policy, blockers, tech_gaps, date, notes.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Check the actual schema/columns defined in applications.md or templates

# Search for applications.md schema/header definitions
rg -n -A5 -B2 'applications\.md|Schema|Date.*Company.*Role' --glob '*.md' --glob '*.yml'

# Check if archetype, remote_policy, blockers, tech_gaps are defined anywhere
ast-grep --pattern 'archetype'
rg -n 'archetype|remote_policy|blockers|tech_gaps' --glob '*.md' --glob '*.yml'

Repository: santifer/career-ops

Length of output: 50377


🏁 Script executed:

sed -n '30,45p' openclaw-skills/rejection-patterns/SKILL.md

Repository: santifer/career-ops

Length of output: 710


🏁 Script executed:

# Find a sample report file
fd 'reports/.*\.md$' -x head -50 {} \; | head -100

Repository: santifer/career-ops

Length of output: 45


Architectural mismatch: fields exist in reports, not tracker columns.

Line 14 and line 36 instruct parsing archetype, remote_policy, blockers, tech_gaps from applications.md, but the authoritative tracker schema (defined in openclaw-career-tracker/SKILL.md line 72) only contains: id, date, company, role, score, status, pdf, report.

These enrichment fields are stored in evaluation report files (accessible via the report column), not as tracker columns. The skill must be redesigned to:

  1. Read base data from applications.md (status, score, company, date)
  2. For each row, load the linked report file and extract metadata (archetype, blockers, tech_gaps)
  3. Read user config (config/profile.yml) for remote_policy filtering if needed

Alternatively, restrict the analysis to base tracker columns only and remove the report-dependent fields.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/rejection-patterns/SKILL.md` around lines 10 - 14, The skill
currently assumes columns archetype, remote_policy, blockers, tech_gaps exist in
applications.md but the canonical tracker (openclaw-career-tracker/SKILL.md)
only exposes id, date, company, role, score, status, pdf, report; update the
skill to read base rows from applications.md (company, role, status, score,
date) and for each row use the report column to open the linked report file and
extract archetype, blockers and tech_gaps (parsing the report metadata), and
separately read config/profile.yml to apply remote_policy filtering;
alternatively, if you prefer a simpler change, remove all references to
archetype, remote_policy, blockers, tech_gaps from the skill and restrict
analysis to the base tracker columns
(id,date,company,role,score,status,pdf,report).

Strictly preserve original mode workflows for scan, batch, pdf, and tracker.
Only adapt tool references (Claude Code → OpenClaw) and translate Spanish → English.
No content removed, summarized, or added beyond tool adaptation.

Line count comparison (original → adapted):
- scan (226) → job-api-search (230)
- batch (104) → job-auto-submit (112)
- pdf (179) → resume-ats-generator (184)
- tracker (23) → openclaw-career-tracker (28)
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

♻️ Duplicate comments (5)
openclaw-skills/openclaw-career-tracker/SKILL.md (2)

10-13: ⚠️ Potential issue | 🟠 Major

Tracker schema example is missing the Notes column.

Line 12 defines | # | Date | Company | Role | Score | Status | PDF | Report | but the canonical tracker format includes Notes. Please include it to avoid schema drift.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/openclaw-career-tracker/SKILL.md` around lines 10 - 13, The
tracker header row in SKILL.md currently lists "| # | Date | Company | Role |
Score | Status | PDF | Report |" but omits the canonical "Notes" column; update
that header (the Tracker format line) to include "Notes" (e.g., "| # | Date |
Company | Role | Score | Status | PDF | Report | Notes |") so the schema matches
the canonical tracker format and prevents drift.

15-20: ⚠️ Potential issue | 🔴 Critical

Align status values with canonical states (templates/states.yml).

The current chain includes non-canonical entries (Contacted, DO NOT APPLY) and omits SKIP. This creates cross-skill state mismatch risk for filtering and updates.

Based on learnings: "Use only canonical statuses from templates/states.yml (Evaluated, Applied, Responded, Interview, Offer, Rejected, Discarded, SKIP)..."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/openclaw-career-tracker/SKILL.md` around lines 15 - 20,
Update SKILL.md to use only the canonical status values defined in
templates/states.yml: replace the current chain and remove non-canonical entries
`Contacted` and `DO NOT APPLY`, add the missing `SKIP`, and ensure the ordered
sequence is Evaluated → Applied → Responded → Interview → Offer / Rejected /
Discarded / SKIP; update the brief bullet descriptions (e.g., for `Applied` and
`Responded`) to match these canonical meanings and check for any other local
references in this file that must map exactly to the statuses in
templates/states.yml.
openclaw-skills/job-auto-submit/SKILL.md (2)

12-25: ⚠️ Potential issue | 🟡 Minor

Normalize fenced code blocks for markdownlint compliance.

Several fences are still missing language tags, and the nested sessions_spawn fence should keep blank lines around it for MD031/MD040 consistency.

Also applies to: 31-39, 51-58, 80-85

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/job-auto-submit/SKILL.md` around lines 12 - 25, The markdown
fences in SKILL.md lack language tags and some fenced blocks (notably the nested
`sessions_spawn` block and the fences producing `report .md + PDF +
tracker-line`) need blank lines before and after to satisfy markdownlint rules
MD031/MD040; update each triple-backtick fence to include an appropriate
language (e.g., ```text or ```bash) and ensure the `sessions_spawn` fenced
section has a blank line above and below, and apply the same normalization to
the other affected ranges (lines referenced around `Posting 1`, `Posting 2`, and
the final merge into `applications.md + summary`) so all fenced blocks are
consistently tagged and separated.

97-101: ⚠️ Potential issue | 🟠 Major

Use the canonical tracker-additions filename contract.

Line 100 uses batch/tracker-additions/{id}.tsv, which diverges from the required {num}-{company-slug}.tsv pattern and can break downstream merge/dedup expectations.

Suggested spec fix
-3. Tracker line in `batch/tracker-additions/{id}.tsv`
+3. Tracker line in `batch/tracker-additions/{num}-{company-slug}.tsv` (single-line TSV)

Based on learnings: "Write tracker additions as single-line TSV files to batch/tracker-additions/{num}-{company-slug}.tsv..."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/job-auto-submit/SKILL.md` around lines 97 - 101, Update the
tracker filename spec in SKILL.md: replace the line that currently lists
"Tracker line in `batch/tracker-additions/{id}.tsv`" with the canonical pattern
"batch/tracker-additions/{num}-{company-slug}.tsv" and add that tracker
additions must be single-line TSV files (per the existing guidance "Write
tracker additions as single-line TSV files to
`batch/tracker-additions/{num}-{company-slug}.tsv`") so downstream merge/dedup
logic receives the expected filename format.
openclaw-skills/job-api-search/SKILL.md (1)

168-174: ⚠️ Potential issue | 🟡 Minor

Add language identifiers to remaining fenced blocks.

The scan-history sample and output-summary template fences are still unlabeled. Use tsv and text (or markdown) for lint/tooling consistency.

Also applies to: 178-190

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/job-api-search/SKILL.md` around lines 168 - 174, The two
unlabeled fenced blocks— the "scan-history" sample block and the
"output-summary" template block in SKILL.md—should be updated to include
language identifiers for tooling: change the scan-history block fence from ```
to ```tsv and change the output-summary/template fence from ``` to ```text (or
```markdown) so linting and rendering correctly recognize the content; update
both the block shown in the 168–174 range (scan-history sample) and the block
referenced at 178–190 (output-summary template).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@openclaw-skills/job-api-search/SKILL.md`:
- Around line 102-121: The numbered steps in SKILL.md under "Level 3 —
web_search queries" are duplicated and restart (two different "6." and "7.")
causing ambiguity; update the sequence so numbering is monotonic (e.g., 6, 7, 8,
9, 10, 11) across the affected headings and substeps including "Level 3 —
web_search queries", "Filter by title", "Deduplicate", and "Verify liveness of
web_search results (Level 3)" so each major step and substep has a unique
increasing number for correct agent execution and maintenance.
- Around line 139-141: The SKILL.md step currently hardcodes adding pipeline
entries to the "Pendientes" section; change the instruction so entries are
appended to the pipeline's pending header in a language-flexible way rather than
the literal "Pendientes" string. Update the text around pipeline.md "Pendientes"
so it either references a generic placeholder (e.g., `{pending_section}`) or
instructs to detect any pending-like header (examples: "Pending", "Pendientes",
"En attente") and append `- [ ] {url} | {company} | {title}` under that detected
header; keep the scan-history.tsv recording unchanged.

In `@openclaw-skills/resume-ats-generator/SKILL.md`:
- Around line 24-25: The docs incorrectly instruct reading `name` from
`config/profile.yml`; update the extraction step to read `candidate.full_name`
instead, then normalize that value to kebab-case lowercase (e.g. "John Doe" →
"john-doe") and use that normalized `{candidate}` when writing HTML to
`/tmp/cv-{candidate}-{company}.html`; ensure all references in the SKILL.md step
(the name extraction and normalization lines) mention `candidate.full_name` as
the source.
- Around line 26-27: The pipeline checklist has a duplicate step number: both
"Execute: `exec` to run `node generate-pdf.mjs
/tmp/cv-{candidate}-{company}.html
output/cv-{candidate}-{company}-{YYYY-MM-DD}.pdf --format={letter|a4}`" and
"Report: PDF path, page count, keyword coverage %" are labeled `15.`; rename the
second occurrence (the "Report: PDF path, page count, keyword coverage %") to
`16.` so the checklist steps are sequential and unambiguous.
- Around line 71-72: Update the template reference in SKILL.md: replace the
incorrect template name "cv-template.html" with the actual location
"templates/cv-template.html" wherever the instruction says to use the template
so the documented path matches the repository structure and avoids
file-not-found errors.

---

Duplicate comments:
In `@openclaw-skills/job-api-search/SKILL.md`:
- Around line 168-174: The two unlabeled fenced blocks— the "scan-history"
sample block and the "output-summary" template block in SKILL.md—should be
updated to include language identifiers for tooling: change the scan-history
block fence from ``` to ```tsv and change the output-summary/template fence from
``` to ```text (or ```markdown) so linting and rendering correctly recognize the
content; update both the block shown in the 168–174 range (scan-history sample)
and the block referenced at 178–190 (output-summary template).

In `@openclaw-skills/job-auto-submit/SKILL.md`:
- Around line 12-25: The markdown fences in SKILL.md lack language tags and some
fenced blocks (notably the nested `sessions_spawn` block and the fences
producing `report .md + PDF + tracker-line`) need blank lines before and after
to satisfy markdownlint rules MD031/MD040; update each triple-backtick fence to
include an appropriate language (e.g., ```text or ```bash) and ensure the
`sessions_spawn` fenced section has a blank line above and below, and apply the
same normalization to the other affected ranges (lines referenced around
`Posting 1`, `Posting 2`, and the final merge into `applications.md + summary`)
so all fenced blocks are consistently tagged and separated.
- Around line 97-101: Update the tracker filename spec in SKILL.md: replace the
line that currently lists "Tracker line in `batch/tracker-additions/{id}.tsv`"
with the canonical pattern "batch/tracker-additions/{num}-{company-slug}.tsv"
and add that tracker additions must be single-line TSV files (per the existing
guidance "Write tracker additions as single-line TSV files to
`batch/tracker-additions/{num}-{company-slug}.tsv`") so downstream merge/dedup
logic receives the expected filename format.

In `@openclaw-skills/openclaw-career-tracker/SKILL.md`:
- Around line 10-13: The tracker header row in SKILL.md currently lists "| # |
Date | Company | Role | Score | Status | PDF | Report |" but omits the canonical
"Notes" column; update that header (the Tracker format line) to include "Notes"
(e.g., "| # | Date | Company | Role | Score | Status | PDF | Report | Notes |")
so the schema matches the canonical tracker format and prevents drift.
- Around line 15-20: Update SKILL.md to use only the canonical status values
defined in templates/states.yml: replace the current chain and remove
non-canonical entries `Contacted` and `DO NOT APPLY`, add the missing `SKIP`,
and ensure the ordered sequence is Evaluated → Applied → Responded → Interview →
Offer / Rejected / Discarded / SKIP; update the brief bullet descriptions (e.g.,
for `Applied` and `Responded`) to match these canonical meanings and check for
any other local references in this file that must map exactly to the statuses in
templates/states.yml.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 4da7c2da-e15c-4ff7-a18b-cc5cb5dd952a

📥 Commits

Reviewing files that changed from the base of the PR and between 445247b and afbe5d3.

📒 Files selected for processing (4)
  • openclaw-skills/job-api-search/SKILL.md
  • openclaw-skills/job-auto-submit/SKILL.md
  • openclaw-skills/openclaw-career-tracker/SKILL.md
  • openclaw-skills/resume-ats-generator/SKILL.md

Comment thread openclaw-skills/scan/SKILL.md Outdated
Comment thread openclaw-skills/scan/SKILL.md Outdated
Comment on lines +24 to +25
13. Read `name` from `config/profile.yml` → normalize to kebab-case lowercase (e.g. "John Doe" → "john-doe") → `{candidate}`
14. Write HTML to `/tmp/cv-{candidate}-{company}.html`
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Use the correct profile field path for candidate name extraction.

Line 24 says to read name from config/profile.yml, but the documented profile schema uses candidate.full_name. This will fail name normalization in real runs.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/resume-ats-generator/SKILL.md` around lines 24 - 25, The docs
incorrectly instruct reading `name` from `config/profile.yml`; update the
extraction step to read `candidate.full_name` instead, then normalize that value
to kebab-case lowercase (e.g. "John Doe" → "john-doe") and use that normalized
`{candidate}` when writing HTML to `/tmp/cv-{candidate}-{company}.html`; ensure
all references in the SKILL.md step (the name extraction and normalization
lines) mention `candidate.full_name` as the source.

Comment thread openclaw-skills/pdf/SKILL.md Outdated
Comment on lines +71 to +72
Use the template in `cv-template.html`. Replace `{{...}}` placeholders with customized content:

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Fix template path to match repository structure.

Line 71 points to cv-template.html, while the template is under templates/cv-template.html. The current path will produce file-not-found behavior.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/resume-ats-generator/SKILL.md` around lines 71 - 72, Update
the template reference in SKILL.md: replace the incorrect template name
"cv-template.html" with the actual location "templates/cv-template.html"
wherever the instruction says to use the template so the documented path matches
the repository structure and avoids file-not-found errors.

Rename all skills back to original career-ops mode names:
- deep-research → deep
- jd-evaluator → oferta
- rejection-patterns → patterns
- linkedin-outreach → contacto
- followup-tracker → followup
- job-api-search → scan
- job-auto-submit → batch
- resume-ats-generator → pdf
- openclaw-career-tracker → tracker

Also fix oferta frontmatter (compress multi-line description).
@gzhang33 gzhang33 changed the title feat: OpenClaw skill adaptations for all career-ops modes feat: add OpenClaw skill adaptations for career-ops modes Apr 19, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

♻️ Duplicate comments (7)
openclaw-skills/pdf/SKILL.md (3)

27-27: ⚠️ Potential issue | 🟡 Minor

Renumber the duplicated checklist step for unambiguous execution.

Line 27 repeats 15.; this should be 16..

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/pdf/SKILL.md` at line 27, The checklist has a duplicated
"15." entry; update the duplicate numbering to "16." so the sequence is
unambiguous by changing the list item that reads "15. Report: PDF path, page
count, keyword coverage %" to "16. Report: PDF path, page count, keyword
coverage %". Ensure the rest of the ordered list remains consecutive after this
change.

71-71: ⚠️ Potential issue | 🟠 Major

Fix template path to the repository location.

The instruction points to cv-template.html, but template references should use templates/cv-template.html to match project layout.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/pdf/SKILL.md` at line 71, Update the template reference in
SKILL.md so it points to the repository layout: replace occurrences of
"cv-template.html" with "templates/cv-template.html" (e.g., in the usage
instruction "Use the template in `cv-template.html`" change it to "Use the
template in `templates/cv-template.html`") to ensure the path matches the
project's templates directory.

24-24: ⚠️ Potential issue | 🟠 Major

Read candidate name from the schema-backed field (candidate.full_name).

Using name here is inconsistent with the profile schema and can fail candidate slug generation.

Based on learnings, "In onboarding Step 2, if config/profile.yml is missing, copy from config/profile.example.yml and then prompt for name, email, location, timezone, target roles, and salary range".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/pdf/SKILL.md` at line 24, The code currently reads `name`
from config/profile.yml to build the `{candidate}` slug; change it to read the
schema-backed field `candidate.full_name`, normalize it to kebab-case lowercase
(e.g. "John Doe" -> "john-doe") before using it as `{candidate}`, and ensure
slug generation handles missing/empty values gracefully. Also add an onboarding
fallback: if `config/profile.yml` is missing, copy `config/profile.example.yml`
to `config/profile.yml` and then prompt the user to fill `candidate.full_name`,
`email`, `location`, `timezone`, `target roles`, and `salary range` so the
profile file is populated before slug creation. Ensure any functions/modules
that construct the slug or load the profile reference `candidate.full_name`
instead of `name`.
openclaw-skills/batch/SKILL.md (1)

12-12: ⚠️ Potential issue | 🟡 Minor

Resolve remaining markdownlint fence violations (language + blank lines).

There are still unlabeled fences and the nested sessions_spawn fence is missing required blank-line separation. This matches the previously reported lint issue in this file lineage.

Proposed fix (pattern)
-```
+```text
 Main Agent (browser conductor)
 ...

- +text
batch/
...


-      ```
+      
+      ```javascript
      sessions_spawn({
        ...
      })
+      
      ```

-```
+```tsv
id	url	status	started_at	completed_at	report_num	score	error	retries
...
</details>


Also applies to: 31-31, 51-58, 80-80

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @openclaw-skills/batch/SKILL.md at line 12, Update SKILL.md to fix
markdownlint fence violations by labeling all code fences with appropriate
languages and ensuring blank-line separation for nested fences; specifically,
add language labels (e.g., text, javascript, tsv) to the unlabeled fences and
insert a blank line before and after the nested sessions_spawn fence so the

text; apply the same pattern to the other occurrences flagged (around the "Main
Agent (browser conductor)" block, the batch/ block, and the tsv table block) so
each fenced block is labeled and properly separated.
openclaw-skills/patterns/SKILL.md (1)

12-14: ⚠️ Potential issue | 🔴 Critical

Data contract mismatch with tracker schema breaks this skill’s core parsing.

This spec reads applications.md (root) and expects columns like archetype, remote_policy, blockers, tech_gaps, company_size directly from tracker rows, but tracker data is defined in data/applications.md with base columns only. Parse base tracker fields from data/applications.md, then enrich from linked report files if needed.

Based on learnings, "In onboarding Step 4, if data/applications.md does not exist, create it with a tracker table header (# Applications Tracker with columns: #, Date, Company, Role, Score, Status, PDF, Report, Notes)".

Also applies to: 36-37

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/patterns/SKILL.md` around lines 12 - 14, The skill currently
expects rich columns from a root-level applications.md but the actual tracker
lives at data/applications.md with only base columns; update the parsing logic
to read the base tracker from data/applications.md (columns: #, Date, Company,
Role, Score, Status, PDF, Report, Notes), then enrich each row by loading linked
report files (Report/PDF) to extract archetype, remote_policy, blockers,
tech_gaps, company_size when present; additionally, implement the onboarding
Step 4 behavior to create data/applications.md with the tracker table header if
it does not exist. Ensure changes reference the tracker filename
"data/applications.md", the reporter fields "Report"/"PDF", and the onboarding
step "Onboarding Step 4" so reviewers can locate and validate the updates.
openclaw-skills/scan/SKILL.md (2)

140-140: ⚠️ Potential issue | 🟠 Major

Avoid hardcoding only the "Pendientes" pipeline section.

Appending only to "Pendientes" is brittle for localized pipeline headers. Detect/use the pending-equivalent section label dynamically.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/scan/SKILL.md` at line 140, The instruction hardcodes the
"Pendientes" pipeline section when appending (`a. Add to pipeline.md
"Pendientes" section: - [ ] {url} | {company} | {title}`), which breaks for
other locales; update the logic that appends to pipeline.md to first detect the
pending-equivalent header dynamically (e.g., scan headers in pipeline.md for a
known set of localized labels or match a pattern/metadata indicating pending
status), then append the checklist line under the matched header instead of the
literal "Pendientes"; update the code that constructs the entry (the
pipeline-appending routine referenced in SKILL.md) to fallback to a configurable
default or create a new pending section if no match is found.

14-14: ⚠️ Potential issue | 🟡 Minor

Clean up remaining markdownlint issues (fence language + ordered-list numbering).

There are unresolved MD040/MD029 findings in this section, and these were previously reported for this file lineage.

Also applies to: 111-111, 116-116, 168-168, 178-178

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/scan/SKILL.md` at line 14, The markdown has MD040/MD029
issues: add explicit fence languages to the triple-backtick code blocks (replace
``` with ```bash or appropriate language) and normalize the ordered list
numbering in the SKILL.md section so list items are either sequentially numbered
or use the recommended repeated "1." style (ensure consistent indentation and
blank lines around the list); update the fenced code blocks and the ordered list
entries where you see only ``` and nonconforming numerals to resolve MD040 and
MD029.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@openclaw-skills/contacto/SKILL.md`:
- Line 68: Update the canonical tracker path in SKILL.md by replacing the
reference "Application context: `applications.md`" with "Application context:
`data/applications.md`" so it matches the repository's OpenClaw path convention;
locate the exact line with the phrase Application context or the string
`applications.md` and change it to `data/applications.md`.

In `@openclaw-skills/deep/SKILL.md`:
- Around line 67-69: The SKILL.md report header is missing the required
"Legitimacy" field; locate the header section containing the "**URL:**" line in
openclaw-skills/deep/SKILL.md and add a new "**Legitimacy:**" header line (same
formatting) alongside "**URL:**" (e.g., directly below or next to the URL entry)
so the report includes both required fields in the header.
- Line 52: The README entry in SKILL.md references "profile.yml" but the project
uses "config/profile.yml"; update the single occurrence in SKILL.md so it uses
the canonical path "config/profile.yml" (replace "profile.yml" with
"config/profile.yml") to ensure lookups use the same config location across the
skill.

In `@openclaw-skills/followup/SKILL.md`:
- Line 17: The cross-skill reference in SKILL.md uses the old mode name
"linkedin-outreach" which will break routing; update that reference (and any
other occurrences, e.g., at the other noted line) to the new skill/mode name
"contacto" so all cross-skill links match the renamed skill; search for and
replace "linkedin-outreach" with "contacto" in the SKILL.md content and confirm
any surrounding documentation text still reads correctly.

In `@openclaw-skills/oferta/SKILL.md`:
- Line 172: Clarify the tracker filename pattern by updating the instruction
"Append TSV row to `batch/tracker-additions/`" to specify that files must follow
the batch tracker naming convention, e.g. use `batch/tracker-additions/{id}.tsv`
(one TSV per evaluation) so contributors know to create a new `{id}.tsv` file
rather than editing `data/applications.md`; reference this pattern when
mentioning `batch/tracker-additions/` in SKILL.md and any examples that describe
tracker integration.
- Around line 143-144: Clarify the `{###}` sequential-number rule by explicitly
describing the algorithm: list existing report filenames, extract the numeric
portion, sort numerically (not lexicographically), take the maximum, add 1, and
zero-pad to three digits; include a concrete example command (e.g., using
shell/awk/sort or a short pseudocode snippet) showing how to extract numbers and
compute the next `{###}` and note behavior for no existing reports (start at
001) and for gaps in the sequence.
- Line 180: The sentence "Generate content in the JD's language (English
default)" is ambiguous about when English is used; update the wording in
SKILL.md so it clearly states the fallback behavior — e.g., change the line to
indicate that content should be generated in the JD's detected language and that
English should be used only as the default when the JD's language cannot be
detected or is not specified, ensuring the phrase "JD's language" and "English
default" are explicit about detection and fallback.

In `@openclaw-skills/patterns/SKILL.md`:
- Around line 57-60: The report header in SKILL.md currently lists "Applications
analyzed: {total}", "Date range: {from} to {to}", and "Outcomes: ..." but omits
the required URL and Legitimacy fields; update the header template in SKILL.md
(the block containing {total}, {from}, {to}, {positive}, {negative},
{self_filtered}, {pending}) to insert two new lines formatted exactly as "URL:
{url}" and "Legitimacy: {legitimacy}" (using whatever template placeholders your
system uses) so the generated reports include the mandatory URL and Legitimacy
fields.

In `@openclaw-skills/scan/SKILL.md`:
- Around line 216-217: The docs currently instruct automatic persistence to
portals.yml ("Save the found URL in portals.yml"); change this to explicitly
state that portals.yml is user-owned and must NOT be auto-updated by the scan
flow — e.g., remove or replace the auto-write instruction with a note telling
users to manually add any discovered URL to portals.yml themselves. Update the
same guidance at the other instance referenced (the content around step 225) so
both occurrences discourage auto-writing and instruct manual editing of
portals.yml.

In `@openclaw-skills/tracker/SKILL.md`:
- Around line 15-20: The status vocabulary in SKILL.md includes non-canonical
entries ("Contacted", "DO NOT APPLY")—replace them with only the canonical
statuses defined in templates/states.yml (Evaluated, Applied, Responded,
Interview, Offer, Rejected, Discarded, SKIP) and remove any bold/markdown or
extra text; update the status line and the three bullet explanations so they
match the canonical names exactly (use SKIP instead of DO NOT APPLY and remove
"Contacted" entirely), ensuring the status list and each mapping use only the
canonical tokens.

---

Duplicate comments:
In `@openclaw-skills/batch/SKILL.md`:
- Line 12: Update SKILL.md to fix markdownlint fence violations by labeling all
code fences with appropriate languages and ensuring blank-line separation for
nested fences; specifically, add language labels (e.g., text, javascript, tsv)
to the unlabeled fences and insert a blank line before and after the nested
sessions_spawn fence so the ```javascript fenced block around sessions_spawn is
separated from surrounding text; apply the same pattern to the other occurrences
flagged (around the "Main Agent (browser conductor)" block, the batch/ block,
and the tsv table block) so each fenced block is labeled and properly separated.

In `@openclaw-skills/patterns/SKILL.md`:
- Around line 12-14: The skill currently expects rich columns from a root-level
applications.md but the actual tracker lives at data/applications.md with only
base columns; update the parsing logic to read the base tracker from
data/applications.md (columns: #, Date, Company, Role, Score, Status, PDF,
Report, Notes), then enrich each row by loading linked report files (Report/PDF)
to extract archetype, remote_policy, blockers, tech_gaps, company_size when
present; additionally, implement the onboarding Step 4 behavior to create
data/applications.md with the tracker table header if it does not exist. Ensure
changes reference the tracker filename "data/applications.md", the reporter
fields "Report"/"PDF", and the onboarding step "Onboarding Step 4" so reviewers
can locate and validate the updates.

In `@openclaw-skills/pdf/SKILL.md`:
- Line 27: The checklist has a duplicated "15." entry; update the duplicate
numbering to "16." so the sequence is unambiguous by changing the list item that
reads "15. Report: PDF path, page count, keyword coverage %" to "16. Report: PDF
path, page count, keyword coverage %". Ensure the rest of the ordered list
remains consecutive after this change.
- Line 71: Update the template reference in SKILL.md so it points to the
repository layout: replace occurrences of "cv-template.html" with
"templates/cv-template.html" (e.g., in the usage instruction "Use the template
in `cv-template.html`" change it to "Use the template in
`templates/cv-template.html`") to ensure the path matches the project's
templates directory.
- Line 24: The code currently reads `name` from config/profile.yml to build the
`{candidate}` slug; change it to read the schema-backed field
`candidate.full_name`, normalize it to kebab-case lowercase (e.g. "John Doe" ->
"john-doe") before using it as `{candidate}`, and ensure slug generation handles
missing/empty values gracefully. Also add an onboarding fallback: if
`config/profile.yml` is missing, copy `config/profile.example.yml` to
`config/profile.yml` and then prompt the user to fill `candidate.full_name`,
`email`, `location`, `timezone`, `target roles`, and `salary range` so the
profile file is populated before slug creation. Ensure any functions/modules
that construct the slug or load the profile reference `candidate.full_name`
instead of `name`.

In `@openclaw-skills/scan/SKILL.md`:
- Line 140: The instruction hardcodes the "Pendientes" pipeline section when
appending (`a. Add to pipeline.md "Pendientes" section: - [ ] {url} | {company}
| {title}`), which breaks for other locales; update the logic that appends to
pipeline.md to first detect the pending-equivalent header dynamically (e.g.,
scan headers in pipeline.md for a known set of localized labels or match a
pattern/metadata indicating pending status), then append the checklist line
under the matched header instead of the literal "Pendientes"; update the code
that constructs the entry (the pipeline-appending routine referenced in
SKILL.md) to fallback to a configurable default or create a new pending section
if no match is found.
- Line 14: The markdown has MD040/MD029 issues: add explicit fence languages to
the triple-backtick code blocks (replace ``` with ```bash or appropriate
language) and normalize the ordered list numbering in the SKILL.md section so
list items are either sequentially numbered or use the recommended repeated "1."
style (ensure consistent indentation and blank lines around the list); update
the fenced code blocks and the ordered list entries where you see only ``` and
nonconforming numerals to resolve MD040 and MD029.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: d7f550d9-d768-4130-a799-eadab73922cc

📥 Commits

Reviewing files that changed from the base of the PR and between afbe5d3 and effae82.

📒 Files selected for processing (9)
  • openclaw-skills/batch/SKILL.md
  • openclaw-skills/contacto/SKILL.md
  • openclaw-skills/deep/SKILL.md
  • openclaw-skills/followup/SKILL.md
  • openclaw-skills/oferta/SKILL.md
  • openclaw-skills/patterns/SKILL.md
  • openclaw-skills/pdf/SKILL.md
  • openclaw-skills/scan/SKILL.md
  • openclaw-skills/tracker/SKILL.md

## Reference Data

- Candidate profile: `cv.md` in project root (proof points for Sentence 2)
- Application context: `applications.md` for company/role details
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Use the canonical tracker path to avoid file-not-found in OpenClaw runs.

Line 68 points to applications.md, but this PR’s stated OpenClaw path convention is data/applications.md. Please align this reference.

Proposed fix
-- Application context: `applications.md` for company/role details
+- Application context: `data/applications.md` for company/role details
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- Application context: `applications.md` for company/role details
- Application context: `data/applications.md` for company/role details
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/contacto/SKILL.md` at line 68, Update the canonical tracker
path in SKILL.md by replacing the reference "Application context:
`applications.md`" with "Application context: `data/applications.md`" so it
matches the repository's OpenClaw path convention; locate the exact line with
the phrase Application context or the string `applications.md` and change it to
`data/applications.md`.

- Market positioning vs alternatives

### Axis 6: Candidate Angle
Based on the candidate profile from cv.md and profile.yml:
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Fix inconsistent profile path reference.

Line 52 says profile.yml, but this skill otherwise uses config/profile.yml. Keep one canonical path to avoid lookup errors.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/deep/SKILL.md` at line 52, The README entry in SKILL.md
references "profile.yml" but the project uses "config/profile.yml"; update the
single occurrence in SKILL.md so it uses the canonical path "config/profile.yml"
(replace "profile.yml" with "config/profile.yml") to ensure lookups use the same
config location across the skill.

Comment on lines +67 to +69
**Date:** YYYY-MM-DD
**URL:** [job posting URL if available]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add required Legitimacy header field to the report template.

The report header includes **URL:** but omits **Legitimacy:**, which is required for Markdown reports in this repo.

Proposed fix
 **Date:** YYYY-MM-DD
 **URL:** [job posting URL if available]
+**Legitimacy:** [High/Medium/Low + short rationale]

As per coding guidelines, "**/*.md: All reports must include URL and Legitimacy fields in the header — format as URL: and Legitimacy: in the report".

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
**Date:** YYYY-MM-DD
**URL:** [job posting URL if available]
**Date:** YYYY-MM-DD
**URL:** [job posting URL if available]
**Legitimacy:** [High/Medium/Low + short rationale]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/deep/SKILL.md` around lines 67 - 69, The SKILL.md report
header is missing the required "Legitimacy" field; locate the header section
containing the "**URL:**" line in openclaw-skills/deep/SKILL.md and add a new
"**Legitimacy:**" header line (same formatting) alongside "**URL:**" (e.g.,
directly below or next to the URL entry) so the report includes both required
fields in the header.

- **Evaluation reports**: `reports/` directory
- **User profile**: `config/profile.yml`
- **CV**: `cv.md`
- **LinkedIn outreach**: Use `linkedin-outreach` skill framework
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Update cross-skill reference to the actual skill name (contacto).

This file references linkedin-outreach, but the OpenClaw skill set in this PR uses the renamed mode name (contacto). Keep references consistent to avoid failed skill routing.

Also applies to: 68-68

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/followup/SKILL.md` at line 17, The cross-skill reference in
SKILL.md uses the old mode name "linkedin-outreach" which will break routing;
update that reference (and any other occurrences, e.g., at the other noted line)
to the new skill/mode name "contacto" so all cross-skill links match the renamed
skill; search for and replace "linkedin-outreach" with "contacto" in the
SKILL.md content and confirm any surrounding documentation text still reads
correctly.

Comment on lines +143 to +144
`{###}` = next sequential number (zero-padded). Find the next number by listing existing reports.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Consider clarifying the sequential numbering algorithm.

The instruction mentions finding the next sequential number by listing existing reports, but doesn't specify the algorithm or provide an example command. Adding a concrete method would reduce ambiguity.

💡 Suggested enhancement
 `{###}` = next sequential number (zero-padded). Find the next number by listing existing reports.
+
+Example: `ls reports/ | grep -oP '^\d+' | sort -n | tail -1` to find the highest number, then increment.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
`{###}` = next sequential number (zero-padded). Find the next number by listing existing reports.
`{###}` = next sequential number (zero-padded). Find the next number by listing existing reports.
Example: `ls reports/ | grep -oP '^\d+' | sort -n | tail -1` to find the highest number, then increment.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/oferta/SKILL.md` around lines 143 - 144, Clarify the `{###}`
sequential-number rule by explicitly describing the algorithm: list existing
report filenames, extract the numeric portion, sort numerically (not
lexicographically), take the maximum, add 1, and zero-pad to three digits;
include a concrete example command (e.g., using shell/awk/sort or a short
pseudocode snippet) showing how to extract numbers and compute the next `{###}`
and note behavior for no existing reports (start at 001) and for gaps in the
sequence.


### Register in tracker

Append TSV row to `batch/tracker-additions/` (never edit `data/applications.md` directly).
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Clarify tracker filename pattern for consistency.

The instruction specifies the directory but not the filename format. Based on the batch skill pattern shown in relevant snippets, tracker additions use a specific naming convention like batch/tracker-additions/{id}.tsv.

Consider specifying the complete filename pattern to ensure consistency across skills.

📝 Suggested clarification
-Append TSV row to `batch/tracker-additions/` (never edit `data/applications.md` directly).
+Append TSV row to `batch/tracker-additions/{company-slug}-{YYYY-MM-DD}.tsv` (never edit `data/applications.md` directly).

This aligns with the batch skill's tracker integration pattern where each evaluation produces a separate TSV file that's later merged.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/oferta/SKILL.md` at line 172, Clarify the tracker filename
pattern by updating the instruction "Append TSV row to
`batch/tracker-additions/`" to specify that files must follow the batch tracker
naming convention, e.g. use `batch/tracker-additions/{id}.tsv` (one TSV per
evaluation) so contributors know to create a new `{id}.tsv` file rather than
editing `data/applications.md`; reference this pattern when mentioning
`batch/tracker-additions/` in SKILL.md and any examples that describe tracker
integration.

- Native English, short sentences, action verbs, no passive voice
- Never invent experience or metrics
- Never recommend comp below market rate
- Generate content in the JD's language (English default)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Minor: Clarify language generation fallback logic.

The phrasing "Generate content in the JD's language (English default)" could be clearer about when English is used versus when the JD's language is detected and applied.

✏️ Suggested rewording
-Generate content in the JD's language (English default)
+Generate content in English (or adapt to the JD's language if explicitly specified)

This makes it clearer that English is the primary language unless the JD is in a different language.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/oferta/SKILL.md` at line 180, The sentence "Generate content
in the JD's language (English default)" is ambiguous about when English is used;
update the wording in SKILL.md so it clearly states the fallback behavior —
e.g., change the line to indicate that content should be generated in the JD's
detected language and that English should be used only as the default when the
JD's language cannot be detected or is not specified, ensuring the phrase "JD's
language" and "English default" are explicit about detection and fallback.

Comment on lines +57 to +60
**Applications analyzed:** {total}
**Date range:** {from} to {to}
**Outcomes:** {positive} positive, {negative} negative, {self_filtered} self-filtered, {pending} pending

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add required URL and Legitimacy fields to the report header template.

The generated report header currently omits both mandatory fields.

Proposed fix
 **Applications analyzed:** {total}
 **Date range:** {from} to {to}
+**URL:** N/A (pattern analysis from local tracker)
+**Legitimacy:** [High/Medium/Low + short rationale]
 **Outcomes:** {positive} positive, {negative} negative, {self_filtered} self-filtered, {pending} pending

As per coding guidelines, "**/*.md: All reports must include URL and Legitimacy fields in the header — format as URL: and Legitimacy: in the report".

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
**Applications analyzed:** {total}
**Date range:** {from} to {to}
**Outcomes:** {positive} positive, {negative} negative, {self_filtered} self-filtered, {pending} pending
**Applications analyzed:** {total}
**Date range:** {from} to {to}
**URL:** N/A (pattern analysis from local tracker)
**Legitimacy:** [High/Medium/Low + short rationale]
**Outcomes:** {positive} positive, {negative} negative, {self_filtered} self-filtered, {pending} pending
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/patterns/SKILL.md` around lines 57 - 60, The report header in
SKILL.md currently lists "Applications analyzed: {total}", "Date range: {from}
to {to}", and "Outcomes: ..." but omits the required URL and Legitimacy fields;
update the header template in SKILL.md (the block containing {total}, {from},
{to}, {positive}, {negative}, {self_filtered}, {pending}) to insert two new
lines formatted exactly as "URL: {url}" and "Legitimacy: {legitimacy}" (using
whatever template placeholders your system uses) so the generated reports
include the mandatory URL and Legitimacy fields.

Comment on lines +216 to +217
4. **Save the found URL in portals.yml** for future scans

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Do not auto-write portals.yml; keep it user-owned.

These steps instruct automatic persistence into portals.yml, but this config is explicitly user-managed and should not be auto-updated by scanning flows.

Based on learnings, "Portal configuration file is user-owned and NEVER auto-updated — store custom job portal query configs here".

Also applies to: 225-225

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/scan/SKILL.md` around lines 216 - 217, The docs currently
instruct automatic persistence to portals.yml ("Save the found URL in
portals.yml"); change this to explicitly state that portals.yml is user-owned
and must NOT be auto-updated by the scan flow — e.g., remove or replace the
auto-write instruction with a note telling users to manually add any discovered
URL to portals.yml themselves. Update the same guidance at the other instance
referenced (the content around step 225) so both occurrences discourage
auto-writing and instruct manual editing of portals.yml.

Comment on lines +15 to +20
Possible statuses: `Evaluated` → `Applied` → `Responded` → `Contacted` → `Interview` → `Offer` / `Rejected` / `Discarded` / `DO NOT APPLY`

- `Applied` = the candidate submitted their application
- `Responded` = A recruiter/company contacted the candidate and they responded (inbound)
- `Contacted` = The candidate proactively contacted someone at the company (outbound, e.g. LinkedIn power move)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Status vocabulary conflicts with canonical tracker states.

Contacted and DO NOT APPLY are outside the canonical state set used across tracker tooling. This can cause inconsistent status normalization and downstream analysis drift. Replace with canonical statuses only (including SKIP).

Based on learnings, "Use canonical statuses from templates/states.yml only (Evaluated, Applied, Responded, Interview, Offer, Rejected, Discarded, SKIP), without markdown bold, dates, or extra text in the status field".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/tracker/SKILL.md` around lines 15 - 20, The status vocabulary
in SKILL.md includes non-canonical entries ("Contacted", "DO NOT APPLY")—replace
them with only the canonical statuses defined in templates/states.yml
(Evaluated, Applied, Responded, Interview, Offer, Rejected, Discarded, SKIP) and
remove any bold/markdown or extra text; update the status line and the three
bullet explanations so they match the canonical names exactly (use SKIP instead
of DO NOT APPLY and remove "Contacted" entirely), ensuring the status list and
each mapping use only the canonical tokens.

- Add language identifiers to all bare code fences (MD040)
- Fix duplicate step numbering in scan (6→7→8→9→10→11→12→13)
- Fix duplicate step 15 in pdf (15→16)
- Replace hardcoded 'Pendientes' in scan with generic pending section lookup
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (4)
openclaw-skills/pdf/SKILL.md (2)

71-71: ⚠️ Potential issue | 🟠 Major

Fix template path to match repository layout.

Use templates/cv-template.html instead of cv-template.html; otherwise this workflow points to a non-existent file in this repo layout.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/pdf/SKILL.md` at line 71, Update the template path in the
README/instructions so it points to the actual file location: replace
occurrences of "cv-template.html" with "templates/cv-template.html" in
openclaw-skills/pdf/SKILL.md (the line that reads "Use the template in
`cv-template.html`. Replace `{{...}}` placeholders...") so the workflow
references the correct template in the repo layout.

24-24: ⚠️ Potential issue | 🟠 Major

Use the canonical profile field for candidate name extraction.

Reading name from config/profile.yml is inconsistent with the documented candidate schema used elsewhere. Use the canonical candidate name field and normalize from that source.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/pdf/SKILL.md` at line 24, Replace reading `name` from
`config/profile.yml` with reading the canonical candidate name field used across
the project (e.g. `candidate.name` from the candidate profile/schema) and then
normalize that value to kebab-case lowercase (as the current step 13 specifies).
Update any references in SKILL.md that instruct reading `name` so they
explicitly point to `candidate.name` and keep the existing normalization step
(normalize to kebab-case, e.g. "John Doe" → "john-doe").
openclaw-skills/followup/SKILL.md (1)

17-17: ⚠️ Potential issue | 🟠 Major

Update cross-skill references to the actual mode name (contacto).

linkedin-outreach is inconsistent with this PR’s OpenClaw mode naming and can break skill routing. Replace these references with contacto.

Also applies to: 68-68

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/followup/SKILL.md` at line 17, Update cross-skill references
that incorrectly use the mode name `linkedin-outreach` to the actual OpenClaw
mode name `contacto`; search the SKILL.md for occurrences of the literal token
`linkedin-outreach` (including the entry labeled "LinkedIn outreach") and
replace them with `contacto` so skill routing matches this PR’s mode name (also
update any duplicate instances).
openclaw-skills/scan/SKILL.md (1)

40-40: ⚠️ Potential issue | 🟠 Major

Do not instruct auto-updating portals.yml; require manual user edits instead.

These steps still direct the agent to save/update careers_url in portals.yml, which conflicts with the user-owned config contract. Replace with wording that discovered URLs should be surfaced in output for manual user update.

Based on learnings, "Portal configuration file is user-owned and NEVER auto-updated — store custom job portal query configs here".

Also applies to: 216-217, 225-225

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@openclaw-skills/scan/SKILL.md` at line 40, The README/skill text currently
tells the agent to auto-save/update portals.yml with discovered careers_url,
which violates the user-owned config rule; update the SKILL.md wording
(references: the phrase "careers_url" and any sentences mentioning "portals.yml"
and "save/update") to instead instruct the agent to surface any discovered
careers_url in its output or logs and prompt the user to manually add it to
portals.yml (do not describe or implement auto-updating). Apply this change to
all occurrences of that behavior in the file (including the lines that mention
saving/updating portals.yml and the duplicate sections around the portals.yml
guidance).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@openclaw-skills/batch/SKILL.md`:
- Around line 50-59: The fenced code block in SKILL.md step "d. Execute via
sessions_spawn" violates MD031 because there are no blank lines immediately
before and after the triple-backtick fence; add a single blank line above the
opening ```text line and a single blank line after the closing ``` so the nested
fence is separated from surrounding list items, leaving the sessions_spawn
snippet (the lines starting with sessions_spawn({ ... }) and the ``` fences)
otherwise unchanged.

---

Duplicate comments:
In `@openclaw-skills/followup/SKILL.md`:
- Line 17: Update cross-skill references that incorrectly use the mode name
`linkedin-outreach` to the actual OpenClaw mode name `contacto`; search the
SKILL.md for occurrences of the literal token `linkedin-outreach` (including the
entry labeled "LinkedIn outreach") and replace them with `contacto` so skill
routing matches this PR’s mode name (also update any duplicate instances).

In `@openclaw-skills/pdf/SKILL.md`:
- Line 71: Update the template path in the README/instructions so it points to
the actual file location: replace occurrences of "cv-template.html" with
"templates/cv-template.html" in openclaw-skills/pdf/SKILL.md (the line that
reads "Use the template in `cv-template.html`. Replace `{{...}}`
placeholders...") so the workflow references the correct template in the repo
layout.
- Line 24: Replace reading `name` from `config/profile.yml` with reading the
canonical candidate name field used across the project (e.g. `candidate.name`
from the candidate profile/schema) and then normalize that value to kebab-case
lowercase (as the current step 13 specifies). Update any references in SKILL.md
that instruct reading `name` so they explicitly point to `candidate.name` and
keep the existing normalization step (normalize to kebab-case, e.g. "John Doe" →
"john-doe").

In `@openclaw-skills/scan/SKILL.md`:
- Line 40: The README/skill text currently tells the agent to auto-save/update
portals.yml with discovered careers_url, which violates the user-owned config
rule; update the SKILL.md wording (references: the phrase "careers_url" and any
sentences mentioning "portals.yml" and "save/update") to instead instruct the
agent to surface any discovered careers_url in its output or logs and prompt the
user to manually add it to portals.yml (do not describe or implement
auto-updating). Apply this change to all occurrences of that behavior in the
file (including the lines that mention saving/updating portals.yml and the
duplicate sections around the portals.yml guidance).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: bef534f1-eb7e-4a80-be8f-629569d32fc7

📥 Commits

Reviewing files that changed from the base of the PR and between effae82 and dbac7d6.

📒 Files selected for processing (4)
  • openclaw-skills/batch/SKILL.md
  • openclaw-skills/followup/SKILL.md
  • openclaw-skills/pdf/SKILL.md
  • openclaw-skills/scan/SKILL.md

Comment on lines +50 to +59
d. Execute via sessions_spawn:
```text
sessions_spawn({
label: "📄 Process posting {id}",
task: "[batch-prompt.md content] Process this posting. URL: {url}. JD: /tmp/batch-jd-{id}.txt. Report: {num}. ID: {id}",
mode: "run",
runTimeoutSeconds: 300
})
```
e. Update `batch-state.tsv` (completed/failed + score + report_num)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Add blank lines around the nested fence to satisfy MD031.

The fenced block under step d. needs a blank line before and after the fence.

Proposed fix
-   d. Execute via sessions_spawn:
-```text
+   d. Execute via sessions_spawn:
+
+```text
       sessions_spawn({
         label: "📄 Process posting {id}",
         task: "[batch-prompt.md content] Process this posting. URL: {url}. JD: /tmp/batch-jd-{id}.txt. Report: {num}. ID: {id}",
         mode: "run",
         runTimeoutSeconds: 300
       })
  • e. Update batch-state.tsv (completed/failed + score + report_num)
</details>

<details>
<summary>🧰 Tools</summary>

<details>
<summary>🪛 markdownlint-cli2 (0.22.0)</summary>

[warning] 51-51: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

---

[warning] 58-58: Fenced code blocks should be surrounded by blank lines

(MD031, blanks-around-fences)

</details>

</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @openclaw-skills/batch/SKILL.md around lines 50 - 59, The fenced code block
in SKILL.md step "d. Execute via sessions_spawn" violates MD031 because there
are no blank lines immediately before and after the triple-backtick fence; add a
single blank line above the opening text line and a single blank line after the closing so the nested fence is separated from surrounding list items,
leaving the sessions_spawn snippet (the lines starting with sessions_spawn({ ...
}) and the ``` fences) otherwise unchanged.


</details>

<!-- fingerprinting:phantom:triton:hawk:78e5276e-bfb9-41ec-b4f2-247347178a0d -->

<!-- This is an auto-generated comment by CodeRabbit -->

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: OpenClaw skill adaptations — make career-ops compatible with OpenClaw agents

2 participants