Model or dataset
GresonKwan/JobOK avatar
GresonKwan/JobOK

JobOK refuses to write a single line you cannot prove, and keeps every case in a dated folder

Job OK: 面向中文求职者的证据驱动求职 Agent Skill,支持优势挖掘、岗位匹配、简历优化、面试训练和投递跟踪。

409 stars4 forksPythonMIT

At a glance

What is it?
An agent skill for Chinese-language job hunting that turns a real resume into evidence files, match scores and interview stories. It never applies to a job on your behalf, marks unsupported claims with a needs_proof tag, and leaves every submission to you.
Who is it for?
Use it if your problem is that your resume says participated and responsible without actions and results, and you are willing to answer questions for an hour before any editing starts. Skip it if you want applications to go out on their own, since that is explicitly out of scope.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 106 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 27, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The refusal list is longer than the feature list

The document spends a dedicated section on what it will not do, and the list is specific rather than modest. It does not invent experience, does not promise an offer, does not auto-apply, does not message recruiters by itself, does not bulk scrape job boards, does not bypass logins, captchas or platform limits, and does not rank candidates or make hiring decisions on an employer's behalf.

That last one matters most for scope. The tool works on your side of the transaction only, and the safety section repeats it: anything involving a submission, a direct message, a resume upload or a platform action is yours to confirm and execute.

The framing is a response to a specific failure mode rather than general caution. The stated problem is that AI resume editing drifts from improving expression into packaging and invention, so the design puts the burden on traceability instead.

Every strength has to walk a four step chain before it counts

The strengths module refuses to record a claim on assertion. Each entry walks evidence, then behavior, then capability, then job signal, and a strength missing any link is not finished. The output is a strengths.md file, and the missing evidence has to be written down too.

Four artifacts carry that discipline through the rest of the workflow. profile.yaml collects target city, role, constraints and risks before any resume editing happens, which puts intake ahead of rewriting. experience-assets.md turns projects, internships, clubs, self-study and part-time work into real material. target-roles.csv generates three to five verifiable role directions and explicitly refuses personality divination.

The stated complaints this targets are legible in the output schema: resumes full of participated, assisted and responsible with no action and no result, and interviews that fall apart once a project detail is probed.

Match scoring has a numeric floor that puts jobs in a holding pool

Job matching writes job-matches.csv and sorts postings by evidence fit, hard requirements, interest, real-world constraints and risk. Scores come with a threshold attached, and the worked example is explicit about it: postings scoring below 60 go into an observation pool and are not recommended for application.

The input side is constrained on purpose. jobs.jsonl holds real postings you provide, and the description says that covers pasted text, screenshots, links and exported tables. The JD standardization step normalizes whatever you brought in before scoring touches it.

A 60 point floor is the one hard number in the system, and it is a behavioral rule rather than a marketing claim: it exists so the tool can tell you not to apply somewhere, which is the opposite of what an application bot does.

Resume suggestions come back tagged when the evidence is missing

The resume module writes resume-review.md, and every recommendation has to trace back to real experience. Content that lacks supporting evidence is not dropped, it is tagged needs_proof and left visible.

That single tag carries most of the design. A system that silently omits a claim looks clean; a system that flags it tells you where your story is thin, and the flagged line is a to-do item rather than a failure. Resume versions are then written into a resume-versions/ subfolder, so you keep one file per target rather than overwriting the one you sent.

The user prompt for this module repeats the instruction as a request rather than a setting: do not invent experience, mark anything lacking evidence as needs_proof. There is no documented switch to turn it off.

Install paths differ by where the skill directory lives

The primary route is conversational. In an agent that supports skills, you say:

text
帮我安装这个 Skill:https://github.com/GresonKwan/JobOK

Then restart the agent or open a new session and invoke it with $job-ok. Two manual fallbacks cover the rest. A user-level clone for Codex:

bash
git clone https://github.com/GresonKwan/JobOK.git ~/.codex/skills/job-ok

And a project-level clone, which scopes the skill to the current repository:

bash
git clone https://github.com/GresonKwan/JobOK.git .agents/skills/job-ok

A ZIP download and manual copy works the same way. Installation notes for Claude Code, Codex and project-level installs live in docs/install-cn.md, and the skill name on disk is job-ok even though the repository is JobOK.

Parsing a resume is the only step that needs a dependency install

Basic use requires nothing installed. The dependency install exists for one purpose, parsing PDF and DOCX resumes:

bash
python3 -m pip install -r requirements-optional.txt

A mirror is given for networks inside China:

bash
python3 -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements-optional.txt

So the practical consequence is that a pasted resume or a text JD needs no Python environment at all, while an uploaded PDF does. If your resume is a PDF and the install fails for network reasons, that second command is the documented path rather than a debugging exercise.

The repository itself is small: SKILL.md, an agents/openai.yaml, references/, assets/templates/, scripts/, examples/quick-start/, docs/, and a requirements-optional.txt at the top level.

Each run writes into its own dated case folder

Running the skill creates a directory named for the date and a user slug, job-search-cases/<yyyy-mm-dd-user-slug>/, holding the whole pipeline as files rather than as chat history:

text
job-search-cases/<yyyy-mm-dd-user-slug>/
├── brief.yaml
├── raw/
│   ├── resume/
│   └── job-posts/

Inside it sit profile.yaml, experience-assets.md, strengths.md, target-roles.csv, jobs.jsonl, job-matches.csv, resume-review.md, a resume-versions/ directory, interview-story-bank.md, interview-practice.md, application-tracker.csv and review-log.md.

The dated folder is what makes comparison possible. Running the workflow twice produces two directories you can diff, and the application tracker keeps submissions, replies, interviews, rejections and retrospectives as rows. Nothing is stored anywhere else, since there is no backend to store it in.

Editorial conclusion

Use it if your problem is that your resume says participated and responsible without actions and results, and you are willing to answer questions for an hour before any editing starts. Skip it if you want applications to go out on their own, since that is explicitly out of scope. Before trusting any of its output, open jobs.jsonl and check that the postings are ones you actually supplied, and read any line still carrying needs_proof before it goes into a resume version.

Frequently asked questions

Does JobOK apply to jobs for me automatically?

No. It does not auto-apply, does not message recruiters, does not bulk scrape job boards, and does not bypass logins, captchas or platform limits. Every submission, direct message, resume upload and platform action is yours to confirm and perform.

How do I install the JobOK skill in Codex?

Clone the repository into the skill directory with git clone https://github.com/GresonKwan/JobOK.git ~/.codex/skills/job-ok, then restart the agent or open a new session. A project-level install clones into .agents/skills/job-ok instead.

What does needs_proof mean in a JobOK resume review?

It marks resume content that has no supporting evidence behind it. The review does not delete such lines or invent support for them, so anything still carrying the tag is a gap in your own material rather than a finished claim.

Does JobOK need Python packages installed to work?

No for basic use. The dependency install from requirements-optional.txt is only needed to parse PDF and DOCX resumes. Inside China, the documented mirror uses the Tsinghua PyPI index with the -i flag.

Which job boards can I bring JobOK postings from?

You can paste postings from Boss Zhipin, Liepin, LinkedIn and school career sites, and you can upload screenshots, exported tables or a visible browser page. The skill organizes and analyzes only what you authorize it to receive.

Official sources

  1. GresonKwan/JobOK on GitHub
  2. Issues
  3. License: MIT
  4. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/gresonkwan-jobok.svg)](https://hysenlabs.com/projects/gresonkwan-jobok)