feat: add OpenClaw skill adaptations for career-ops modes#376
feat: add OpenClaw skill adaptations for career-ops modes#376gzhang33 wants to merge 4 commits intosantifer:mainfrom
Conversation
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.
📝 WalkthroughWalkthroughAdds 10 new OpenClaw skill specification documents under Changes
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
Estimated code review effort🎯 2 (Simple) | ⏱️ ~12 minutes Possibly related PRs
Suggested labels
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.mdskill 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.
| ## Deduplication | ||
|
|
||
| Check against three sources before adding: | ||
| 1. `scan-history.tsv` — URL exact match already seen |
There was a problem hiding this comment.
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.
| 1. `scan-history.tsv` — URL exact match already seen | |
| 1. `data/scan-history.tsv` — URL exact match already seen |
|
|
||
| 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. |
There was a problem hiding this comment.
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.
| 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. |
| | Source | Path | | ||
| |--------|------| | ||
| | Job Profile | `data/job_profile.json` | | ||
| | Existing PDFs | `data/*.pdf` | | ||
| | PDF Generator | `scripts/generate_resume_pdf.py` | |
There was a problem hiding this comment.
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.
| - **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 |
There was a problem hiding this comment.
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.
| - **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 |
| ## 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 | | ||
|
|
There was a problem hiding this comment.
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.
| ## 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. |
| --- | ||
| 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. | ||
| --- |
There was a problem hiding this comment.
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.
| ## Reference Data | ||
|
|
||
| - Candidate profile: `cv.md` in project root (proof points for Sentence 2) | ||
| - Application context: `applications.md` for company/role details |
There was a problem hiding this comment.
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.
| - Application context: `applications.md` for company/role details | |
| - Application context: `data/applications.md` for company/role details |
| ### Phase 1 — Setup | ||
|
|
||
| 1. Verify Playwright + Chromium installed | ||
| 2. Load user profile from `assets/job_profile.json` |
There was a problem hiding this comment.
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).
| 2. Load user profile from `assets/job_profile.json` | |
| 2. Load user profile from `config/profile.yml` |
| | 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`. | ||
|
|
There was a problem hiding this comment.
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).
| 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 |
There was a problem hiding this comment.
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.
| 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 |
There was a problem hiding this comment.
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
📒 Files selected for processing (10)
openclaw-skills/deep-research/SKILL.mdopenclaw-skills/followup-tracker/SKILL.mdopenclaw-skills/interview-prep/SKILL.mdopenclaw-skills/jd-evaluator/SKILL.mdopenclaw-skills/job-api-search/SKILL.mdopenclaw-skills/job-auto-submit/SKILL.mdopenclaw-skills/linkedin-outreach/SKILL.mdopenclaw-skills/openclaw-career-tracker/SKILL.mdopenclaw-skills/rejection-patterns/SKILL.mdopenclaw-skills/resume-ats-generator/SKILL.md
| ```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 | ||
| ``` |
There was a problem hiding this comment.
🧹 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.
| ``` | ||
| | # | App# | Date | Company | Role | Channel | Contact | Notes | | ||
| ``` |
There was a problem hiding this comment.
🧹 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.
| ``` | |
| | # | 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.
| ``` | ||
| Evaluated → Applied → Responded → Contacted → Interview → Offer | ||
| → Rejected | ||
| → Discarded | ||
| ``` |
There was a problem hiding this comment.
🧹 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.
| | 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 | |
There was a problem hiding this comment.
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.
| ### Schema (per row) | ||
|
|
||
| - `id`, `date`, `company`, `role`, `score` (1-5), `status` (state machine), `pdf` (✅/❌), `report` (link or ✅/❌) |
There was a problem hiding this comment.
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.
| ### 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.
| ## 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. |
There was a problem hiding this comment.
🧩 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.mdRepository: santifer/career-ops
Length of output: 710
🏁 Script executed:
# Find a sample report file
fd 'reports/.*\.md$' -x head -50 {} \; | head -100Repository: 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:
- Read base data from
applications.md(status, score, company, date) - For each row, load the linked report file and extract metadata (archetype, blockers, tech_gaps)
- 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)
There was a problem hiding this comment.
Actionable comments posted: 5
♻️ Duplicate comments (5)
openclaw-skills/openclaw-career-tracker/SKILL.md (2)
10-13:⚠️ Potential issue | 🟠 MajorTracker schema example is missing the
Notescolumn.Line 12 defines
| # | Date | Company | Role | Score | Status | PDF | Report |but the canonical tracker format includesNotes. 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 | 🔴 CriticalAlign status values with canonical states (
templates/states.yml).The current chain includes non-canonical entries (
Contacted,DO NOT APPLY) and omitsSKIP. 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 | 🟡 MinorNormalize fenced code blocks for markdownlint compliance.
Several fences are still missing language tags, and the nested
sessions_spawnfence 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 | 🟠 MajorUse the canonical tracker-additions filename contract.
Line 100 uses
batch/tracker-additions/{id}.tsv, which diverges from the required{num}-{company-slug}.tsvpattern 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 | 🟡 MinorAdd language identifiers to remaining fenced blocks.
The scan-history sample and output-summary template fences are still unlabeled. Use
tsvandtext(ormarkdown) 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
📒 Files selected for processing (4)
openclaw-skills/job-api-search/SKILL.mdopenclaw-skills/job-auto-submit/SKILL.mdopenclaw-skills/openclaw-career-tracker/SKILL.mdopenclaw-skills/resume-ats-generator/SKILL.md
| 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` |
There was a problem hiding this comment.
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.
| Use the template in `cv-template.html`. Replace `{{...}}` placeholders with customized content: | ||
|
|
There was a problem hiding this comment.
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).
There was a problem hiding this comment.
Actionable comments posted: 10
♻️ Duplicate comments (7)
openclaw-skills/pdf/SKILL.md (3)
27-27:⚠️ Potential issue | 🟡 MinorRenumber the duplicated checklist step for unambiguous execution.
Line 27 repeats
15.; this should be16..🤖 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 | 🟠 MajorFix template path to the repository location.
The instruction points to
cv-template.html, but template references should usetemplates/cv-template.htmlto 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 | 🟠 MajorRead candidate name from the schema-backed field (
candidate.full_name).Using
namehere 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 | 🟡 MinorResolve remaining markdownlint fence violations (language + blank lines).
There are still unlabeled fences and the nested
sessions_spawnfence 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.mdat 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 thetext; 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 | 🔴 CriticalData contract mismatch with tracker schema breaks this skill’s core parsing.
This spec reads
applications.md(root) and expects columns likearchetype,remote_policy,blockers,tech_gaps,company_sizedirectly from tracker rows, but tracker data is defined indata/applications.mdwith base columns only. Parse base tracker fields fromdata/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 | 🟠 MajorAvoid 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 | 🟡 MinorClean 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
📒 Files selected for processing (9)
openclaw-skills/batch/SKILL.mdopenclaw-skills/contacto/SKILL.mdopenclaw-skills/deep/SKILL.mdopenclaw-skills/followup/SKILL.mdopenclaw-skills/oferta/SKILL.mdopenclaw-skills/patterns/SKILL.mdopenclaw-skills/pdf/SKILL.mdopenclaw-skills/scan/SKILL.mdopenclaw-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 |
There was a problem hiding this comment.
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.
| - 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: |
There was a problem hiding this comment.
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.
| **Date:** YYYY-MM-DD | ||
| **URL:** [job posting URL if available] | ||
|
|
There was a problem hiding this comment.
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.
| **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 |
There was a problem hiding this comment.
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.
| `{###}` = next sequential number (zero-padded). Find the next number by listing existing reports. | ||
|
|
There was a problem hiding this comment.
🧹 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.
| `{###}` = 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). |
There was a problem hiding this comment.
🧹 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) |
There was a problem hiding this comment.
🧹 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.
| **Applications analyzed:** {total} | ||
| **Date range:** {from} to {to} | ||
| **Outcomes:** {positive} positive, {negative} negative, {self_filtered} self-filtered, {pending} pending | ||
|
|
There was a problem hiding this comment.
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} pendingAs 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.
| **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.
| 4. **Save the found URL in portals.yml** for future scans | ||
|
|
There was a problem hiding this comment.
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.
| 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) | ||
|
|
There was a problem hiding this comment.
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
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (4)
openclaw-skills/pdf/SKILL.md (2)
71-71:⚠️ Potential issue | 🟠 MajorFix template path to match repository layout.
Use
templates/cv-template.htmlinstead ofcv-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 | 🟠 MajorUse the canonical profile field for candidate name extraction.
Reading
namefromconfig/profile.ymlis 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 | 🟠 MajorUpdate cross-skill references to the actual mode name (
contacto).
linkedin-outreachis inconsistent with this PR’s OpenClaw mode naming and can break skill routing. Replace these references withcontacto.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 | 🟠 MajorDo not instruct auto-updating
portals.yml; require manual user edits instead.These steps still direct the agent to save/update
careers_urlinportals.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
📒 Files selected for processing (4)
openclaw-skills/batch/SKILL.mdopenclaw-skills/followup/SKILL.mdopenclaw-skills/pdf/SKILL.mdopenclaw-skills/scan/SKILL.md
| 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) |
There was a problem hiding this comment.
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 -->
Summary
Adapts all career-ops modes into OpenClaw skill format under
openclaw-skills/.Each mode is preserved as-is with minimal changes:
sessions_spawn,browser,web_search,web_fetch)name+description)No changes to existing modes, scripts, or configuration.
Closes #377
Included modes
deepinterview-prepofertapatternscontactofollowupscanbatchpdftrackerWhy a separate directory
Keeps original modes untouched. OpenClaw users get a drop-in
skills/directory.Summary by CodeRabbit