Core method (read this first)
Do not search for low-quality content like "Top 10 High-Paying AI Careers"— their interests are not neutral; they are customer-acquisition funnels for course/training institutions. The truly honest demand signal is real open positions on BOSS Zhipin: if a position is open and pays well = someone is really spending money to buy this capability; more positions = rising demand, fewer = red ocean. Then overlay your capability profile and pick out the intersection of the three circles: "high salary × you can learn it × still needed in the AI era."
Iron rules
- The primary source is real recruitment data(BOSS adapter + recruitment trends); "career recommendation" low-quality content is not used as a basis.
- Never rely on memory. Salary range, position heat, and skill requirements must all be retrieved in real time (BOSS / web search plus year).
- Every position first goes through AI impact classification(
ai-impact-taxonomy.md): replacement-type positions are directly discouraged; only recommend enhancement / emerging ones. - For each position, calculate learnability based on the user's starting point(
learnability-rubric.md); those below the threshold are not listed as top choices. - Converge by tier(
role-tiers.md): do not recommend unreachable algorithm positions to S0, and do not recommend annotation to S3. - Any opportunity with "training/referral/job guarantee" must pass anti-scam checks(
anti-scam-rubric.md)。 - Honestly label the boundaries of BOSS data: salary figures are obfuscated by fonts (▯ placeholders), so only the range is obtained; exact values require the user to manually view the detail page.
- Detail pages are read-only and require the user to specify them: only read detail links explicitly selected by the user; the user may choose any number from the candidates, or choose fewer or none. When reading, keep it low-frequency and sequential, and extract only the position title, company, salary, location/address, and JD/requirement text; do not read/save HR information, do not click "Chat Now," and do not perform unselected bulk scraping.
Process
Step 0 — Read context
- Read
.skill-state.jsonto get the profile +profile.start_tier(none → route toskill-init)。 - Read
../../shared-references/role-tiers.md(route by tier). - Read
../../shared-references/ai-impact-taxonomy.md(direction gate). - Read
../../shared-references/learnability-rubric.md(learnability scoring). - Read
../../shared-references/anti-scam-rubric.md(anti-scam, used for training/referral types). - Read
lessons.md(if it exists): the user's past review notes; prioritize referring to them. - Before any write to
found_at/found_at_full, first get the current time using the system time:
date '+%Y-%m-%d %H:%M %Z %z'
found_at write the date,found_at_full write the specific time and time zone, following the user's system time zone (e.g.,2026-06-26 22:06 CST +0800). When displaying to the user, write it as 2026-06-26 22:06(本机时区 + UTC 偏移,如 中国标准时间 CST,UTC+8), and do not hard-code it to the time of some fixed country.
Step 1 — Lock search terms by tier
First limit the direction scope by start_tier (role-tiers), then combine it with the user's transferable abilities and list 3–6 BOSS search keywords.
- S0 →
AI内容运营AIGC运营AI标注数字人运营AI客服 - S1 →
AIGC运营AI营销Prompt工程AI设计AI视频 - S2 →
AI应用开发LLM应用大模型应用AI工程Agent开发 - S3 →
<用户行业>AIAI解决方案行业AI产品AI合规
Adjust the terms based on the user's transferable abilities; do not force a template. Say the terms to be searched to the user first for confirmation.
Step 2 — Retrieve real recruitment data (BOSS adapter, human-in-the-loop)
Use ../../adapters/boss。This is semi-automatic and requires user cooperation. First tell the user the steps:
cd ../../adapters/boss # 相对 skill 目录;实际路径见安装位置
./launch-chrome.sh # 起【有界面】Chrome,用户扫码登录 BOSS,弹滑块手动过
node diagnose-cdp.mjs 9222 # 可选:确认当前环境能读 Chrome 调试端口
node read-boss.mjs "AIGC运营" 100010000 9222 1 # 搜词读第 1 页列表 → JSON(城市码默认全国)
node read-boss-detail.mjs 9222 "https://www.zhipin.com/job_detail/..." # 用户明确选中后,只读选中的 JD
- Run once per keyword, get back JSON (job title / salary magnitude / company / list-page tags / detail link / diagnostics). List-page tags are usually only enough to judge experience/education/internship duration; full skill requirements still require the user to manually paste the JD.
- Salary is on the order of
▯▯-▯▯Kmagnitude(BOSS font obfuscation, the adapter does not crack it) — the digit structure leaks the magnitude, which is enough to distinguish tiers; for exact values have the user manually open 2–3 detail pages to look. - Cannot get the real JD requirements list page: first look at the list page to filter candidates, give the user 2–5 jobs worth looking at; only after the user explicitly says "read these JDs" use
read-boss-detail.mjsto read 1–3 detail pages. If detail reading fails, then have the user manually paste the JD. - If
diagnostics.maybeNeedLogin/blocked/cardCount=0: prompt the user to log in / pass verification / rerun; if the selectors have rotted, send the diagnostics back for recalibration. - If unable to connect to
127.0.0.1:9222: first runnode diagnose-cdp.mjs 9222. If it is readable in a normal terminal but not readable inside the Codex/Claude sandbox, that means non-sandbox permissions are needed to read the local Chrome debugging port; it does not mean the adapter selectors are broken. - ⚠️ Low frequency, read-only list page, no pagination / no entering details / no private messages (anti-scraping risk control + ToS + anti-fraud A6).
If the user is currently unable to log in to run the adapter: fall back to WebSearch for "<job> recruiting requirements salary 2026 / market report", butclearly mark this as secondhand retelling, not as good as first-hand BOSS。
Step 2.5 — page-by-page screening rhythm (at most 3 pages)
Do not read all BOSS search results in one go. Proceed according to the rhythm below:
- Read the list for page N of the current keyword (starting from page 1).
- Use the user profile + anti-fraud rubric for rough screening, provide the user with 2–5 candidates "worth opening the JD for", and explain why; at the same time call out obvious deterrent items (such as high pay with zero experience, commission, training, customer acquisition, financial cold calling).
- After viewing each page, prompt the user that they can adjust the screening requirements (such as no internships, only Shenzhen, exclude sales/commission, salary floor, only full-time, only English/overseas direction). If the user adjusts requirements, screen subsequent pages according to the new requirements.
- Wait for the user to make an explicit choice, then call
read-boss-detail.mjsto read detail pages. The user can choose any number from the candidates, and can also choose fewer or none; if there is no explicit choice, do not read details. When many are chosen at once, read sequentially at low frequency and organize in batches in the output, to avoid concurrency/high frequency triggering risk control. - Based on the JD, do a gap analysis and a preliminary learnability judgment. Jobs already read/chosen by the user will not be recommended again on subsequent pages, only reviewed together in the final summary.
- After the user completes the second round of selection and finishes reading JDs, if enough comparable jobs have been accumulated (usually 4–8 JDs or 2–3 clear directions), proactively prompt that a stage report/job report can be generated now; the user may also choose to continue looking at page 3.
- Continue to the next page until 3 pages have been viewed, the user asks to stop, or 2–3 sufficiently strong candidate directions have been found.
- After viewing at most 3 pages, give the user a stage summary: pages viewed, candidate jobs, JDs read, JDs pending, deterrent patterns, screening requirements the user adjusted along the way, and recommended next steps.
Step 3 — Web cross-validation of AI impact and trends
For each candidate job, according to ai-impact-taxonomy.md judge augmentation/newly created/replacement:
- Check the order of magnitude of the number of jobs for the same term on BOSS (rising/shrinking).
- WebSearch (add year):
<岗位> 招聘趋势 2026、<岗位> 会不会被AI取代, industry employment reports (use only interest-neutral sources). - Mark replacement-type directly as "discourage", even if positions still exist now.
Step 4 — Calculate learnability for each candidate role (core increment)
Score according to learnability-rubric.md 's L1–L5 (0–10), combining JD requirements vs the user's transferable:
- Listyour gaps(which blocks are missing, item by item; which are transferable).
- Give learnability score + verdict(highly learnable/medium/strenuous/discourage).
- Givehonest timeline: based on the user's N hours per week, roughly how many months until they can submit resumes.
Step 5 — Anti-scam filtering (only for training/referral/outsourcing types)
If a path involves paid training/referrals/guaranteed employment, run it through anti-scam-rubric.md, and mark the verdict. The position itself (direct company hiring) generally does not cross the red line, but if the company cannot be found/there are B signals such as zero-threshold high-salary JDs, also mark it truthfully.
Step 6 — Output (use a unified format for each candidate role)
岗位:<名称>
AI 影响:增强 ⬆️ / 新生 🆕 / 替代 ⬇️
薪资量级:<▯ 量级 + 单位>(精确值需手动看详情页)
需求热度:<同词岗位量级/趋势 + 来源年份>
你的差距:<逐条;可迁移的标出来>
可学性:x/10(L1–L5 一句话)
判定:✅ 高可学 / ⚠️ 中等 / ⛔ 吃力 / ❌ 劝退
诚实周期:<以每周 N 小时算,几个月到能投简历>
Sort comprehensively by learnability × salary,recommend 2–3 intersection roles first, and also list the discouraged ones and explain why (to avoid the user stepping into the trap themselves).
Step 7 — Persist to disk
Write the candidate roles into .skill-state.json 's candidate_roles[](including ai_impact / salary_band / demand / gap / learnability_score / learnability_verdict / honest_timeline / scam_verdict / found_at=today's date / found_at_full=specific time and time zone / status=candidate).
Prompt the user:"I choose role XX as my study plan" → go to skill-plan。