[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M74YEP224H6Z9Q2K16YZ47K8":3,"skill-same:01M74YEP224H6Z9Q2K16YZ47K8":57},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":29,"commitSha":30,"skillDirectory":31,"forksCount":32,"repositoryHtmlUrl":33,"repositoryHomepageUrl":6,"ownerHtmlUrl":34,"ownerBlogUrl":35,"ownerDescription":36,"updatedAt":37,"install":38,"resources":50},"01M74YEP224H6Z9Q2K16YZ47K8","review-render",null,"Visually QA a rendered resume PDF and auto-fix layout\u002Fcontent defects in a bounded loop: render → screenshot → deterministic gate → vision rubric → apply one fix → re-render, until it passes or hits a pass cap. Catches widows, under-fill, overflow, orphaned headers, and imbalance that text-only logic can't see.","jain777\u002Fjobclaw-skills","jain777","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F57412580?v=4","01M74YCRYXSRMZFKERV6JS8M5D","Jeevesh Jain","01M74YCRZK4C3NNAEDWG5W8YMP",7,"MIT","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-render\u002FSKILL.md",[],[],"2026-11-11 17:31:23",false,"---\nname: review-render\ndescription: >\n  Visually QA a rendered resume PDF and auto-fix layout\u002Fcontent defects in a bounded\n  loop: render → screenshot → deterministic gate → vision rubric → apply one fix →\n  re-render, until it passes or hits a pass cap. Catches widows, under-fill, overflow,\n  orphaned headers, and imbalance that text-only logic can't see.\nwhen_to_use: >\n  Use right after render-resume produces a PDF — especially in autonomous runs where no\n  human eyes the page — to verify and tighten the visual result before it goes out.\nuser-invocable: true\ncontext: fork\nallowed-tools: Read, Write, Edit, Bash\n---\n\n# review-render\n\nA rendered resume has defects that are **invisible in the JSON and only show up on the page** — a bullet wrapping with two dangling words, a half-empty page, content spilling one line onto page 2, an orphaned section header. This skill closes the loop the way a human does: **make it, look at it, fix it, repeat** — bounded so it always terminates.\n\nArchitecture split (see [`..\u002F..\u002F_shared\u002FRULES.md`](..\u002F..\u002F_shared\u002FRULES.md)): **rendercv renders; this skill (the brain) judges and decides the fix.** Rendering levers live in `render-resume`; the visual judgment and content edits live here.\n\n`render-resume` **hands off to this skill as its mandatory final step** (its §6 Self-QA) — so every resume is visually QA'd, not just ones where someone remembers to ask. You can also invoke it standalone on any existing rendered resume.\n\n## Inputs\n- The JSON-Resume intermediate: `resumes\u002F\u003Cname>.json` (the editable source of content fixes).\n- The output PDF path: `resumes\u002F\u003Cname>.pdf`.\n- Optional: target `--max-pages`, `--theme` (else from `meta.theme`).\n\n## The loop (max **3** passes — never loop forever)\n\n**1. Render with page PNGs**\n```\npython3 skills\u002Frender-resume\u002Fscripts\u002Frender.py \\\n    --data resumes\u002F\u003Cname>.json --out resumes\u002F\u003Cname>.pdf --emit-png \\\n    [--max-pages 1|2] [--theme T] [--date-col 3.3cm] [--density snug|compact|dense|tight]\n```\nThis writes the PDF plus `resumes\u002F\u003Cname>.p1.png, .p2.png, …`.\n\n**2. Deterministic gate (cheap — no vision tokens)**\n```\nskills\u002Frender-resume\u002F.venv\u002Fbin\u002Fpython skills\u002Frender-resume\u002Fscripts\u002Fqa_report.py resumes\u002F\u003Cname>.p*.png\n```\nReturns `{pages, page_fills, last_page_fill, flags}`. Flags: `underfilled`, `sparse_last_page`, `overflow_risk`.\n\n**3. Vision rubric** — **Read** each `.pN.png` and score it against [`reference\u002Frubric.md`](reference\u002Frubric.md). Record each issue as `{dimension, severity (critical\u002Fmajor\u002Fminor), where, suggested fix}`.\n\n**4. Decide**\n- **PASS** when the deterministic `flags` are empty **and** the rubric has no critical\u002Fmajor issue (score ≥ 90). Report and stop.\n- Otherwise pick the **single highest-severity issue**, apply **exactly one** fix from the vocabulary below, and go back to step 1.\n- After **3 passes**, stop regardless; report the best version + any residual issues and a recommendation.\n\n**5. Clean up** the `.pN.png` files (and any `.rendercv.yaml`) unless the caller asked to keep them.\n\n## Fix vocabulary (issue → lever)\n\nApply ONE per pass, then re-render and re-judge — never stack blind changes.\n\n| Issue | Fix (try in this order) |\n|---|---|\n| **Widow \u002F overflow line** (bullet wraps, 1–2 words dangle) | `--date-col 3.3cm` (more bullet width). If it persists, **tighten that specific bullet** in the JSON by 3–6 words — preserve meaning and keep the metric. |\n| **Underfilled single page** (`underfilled`, bottom whitespace) | **Restore** a previously-cut bullet\u002Fsection to the JSON (preferred — recovers lost context), or force a lighter density (`--density snug`\u002F`compact`). |\n| **Spills to 2 pages, sparse last page** (`sparse_last_page` \u002F `overflow_risk`) | If content is ~1 page: trim the lowest-value bullet(s) per `tailor-resume`'s rubric, or `--max-pages 1` to densify. If genuinely 1.5+ pages: `--max-pages 2` and rebalance so the last page is >50% full. |\n| **Orphaned section header** at page bottom | Step density one notch, or trim\u002Frestore one line to shift the break. |\n| **Inconsistent dates \u002F bullet glyphs \u002F tense** | Fix in the JSON (formatting) — not a renderer concern. |\n| **Section imbalance or wrong order** | Reorder\u002Frebalance sections in the JSON. |\n\n## Rules\n- **One fix per pass.** Re-render and re-evaluate before the next change.\n- **No fabrication.** \"Tighten\" = cut words, never invent. Content edits obey `tailor-resume`'s rubric and `_shared\u002FRULES.md` (incl. never quoting `context.*`).\n- **Always terminates.** Hard cap of 3 passes; if still failing, stop and recommend (e.g., \"content is genuinely two pages — use `--max-pages 2`\").\n- **Layout first, content second.** Prefer a rendering lever (date-col, density) before editing real content, so context isn't lost to cosmetics.\n\n## Output\nA concise QA report: **PASS\u002FFAIL**, final score, the **iteration log** (per pass: what the gate + rubric flagged → the one fix applied → the new result), and the final PDF path.\n\n## Next steps\nResume passed QA. Next: `\u002Fwrite-cover-letter`, then apply — or `\u002Fapply-to-job` to finish the package.\n","# review-render\n\nA rendered resume has defects that are **invisible in the JSON and only show up on the page** — a bullet wrapping with two dangling words, a half-empty page, content spilling one line onto page 2, an orphaned section header. This skill closes the loop the way a human does: **make it, look at it, fix it, repeat** — bounded so it always terminates.\n\nArchitecture split (see [`..\u002F..\u002F_shared\u002FRULES.md`](..\u002F..\u002F_shared\u002FRULES.md)): **rendercv renders; this skill (the brain) judges and decides the fix.** Rendering levers live in `render-resume`; the visual judgment and content edits live here.\n\n`render-resume` **hands off to this skill as its mandatory final step** (its §6 Self-QA) — so every resume is visually QA'd, not just ones where someone remembers to ask. You can also invoke it standalone on any existing rendered resume.\n\n## Inputs\n- The JSON-Resume intermediate: `resumes\u002F\u003Cname>.json` (the editable source of content fixes).\n- The output PDF path: `resumes\u002F\u003Cname>.pdf`.\n- Optional: target `--max-pages`, `--theme` (else from `meta.theme`).\n\n## The loop (max **3** passes — never loop forever)\n\n**1. Render with page PNGs**\n```\npython3 skills\u002Frender-resume\u002Fscripts\u002Frender.py \\\n    --data resumes\u002F\u003Cname>.json --out resumes\u002F\u003Cname>.pdf --emit-png \\\n    [--max-pages 1|2] [--theme T] [--date-col 3.3cm] [--density snug|compact|dense|tight]\n```\nThis writes the PDF plus `resumes\u002F\u003Cname>.p1.png, .p2.png, …`.\n\n**2. Deterministic gate (cheap — no vision tokens)**\n```\nskills\u002Frender-resume\u002F.venv\u002Fbin\u002Fpython skills\u002Frender-resume\u002Fscripts\u002Fqa_report.py resumes\u002F\u003Cname>.p*.png\n```\nReturns `{pages, page_fills, last_page_fill, flags}`. Flags: `underfilled`, `sparse_last_page`, `overflow_risk`.\n\n**3. Vision rubric** — **Read** each `.pN.png` and score it against [`reference\u002Frubric.md`](reference\u002Frubric.md). Record each issue as `{dimension, severity (critical\u002Fmajor\u002Fminor), where, suggested fix}`.\n\n**4. Decide**\n- **PASS** when the deterministic `flags` are empty **and** the rubric has no critical\u002Fmajor issue (score ≥ 90). Report and stop.\n- Otherwise pick the **single highest-severity issue**, apply **exactly one** fix from the vocabulary below, and go back to step 1.\n- After **3 passes**, stop regardless; report the best version + any residual issues and a recommendation.\n\n**5. Clean up** the `.pN.png` files (and any `.rendercv.yaml`) unless the caller asked to keep them.\n\n## Fix vocabulary (issue → lever)\n\nApply ONE per pass, then re-render and re-judge — never stack blind changes.\n\n| Issue | Fix (try in this order) |\n|---|---|\n| **Widow \u002F overflow line** (bullet wraps, 1–2 words dangle) | `--date-col 3.3cm` (more bullet width). If it persists, **tighten that specific bullet** in the JSON by 3–6 words — preserve meaning and keep the metric. |\n| **Underfilled single page** (`underfilled`, bottom whitespace) | **Restore** a previously-cut bullet\u002Fsection to the JSON (preferred — recovers lost context), or force a lighter density (`--density snug`\u002F`compact`). |\n| **Spills to 2 pages, sparse last page** (`sparse_last_page` \u002F `overflow_risk`) | If content is ~1 page: trim the lowest-value bullet(s) per `tailor-resume`'s rubric, or `--max-pages 1` to densify. If genuinely 1.5+ pages: `--max-pages 2` and rebalance so the last page is >50% full. |\n| **Orphaned section header** at page bottom | Step density one notch, or trim\u002Frestore one line to shift the break. |\n| **Inconsistent dates \u002F bullet glyphs \u002F tense** | Fix in the JSON (formatting) — not a renderer concern. |\n| **Section imbalance or wrong order** | Reorder\u002Frebalance sections in the JSON. |\n\n## Rules\n- **One fix per pass.** Re-render and re-evaluate before the next change.\n- **No fabrication.** \"Tighten\" = cut words, never invent. Content edits obey `tailor-resume`'s rubric and `_shared\u002FRULES.md` (incl. never quoting `context.*`).\n- **Always terminates.** Hard cap of 3 passes; if still failing, stop and recommend (e.g., \"content is genuinely two pages — use `--max-pages 2`\").\n- **Layout first, content second.** Prefer a rendering lever (date-col, density) before editing real content, so context isn't lost to cosmetics.\n\n## Output\nA concise QA report: **PASS\u002FFAIL**, final score, the **iteration log** (per pass: what the gate + rubric flagged → the one fix applied → the new result), and the final PDF path.\n\n## Next steps\nResume passed QA. Next: `\u002Fwrite-cover-letter`, then apply — or `\u002Fapply-to-job` to finish the package.\n",{"name":5,"context":24,"description":25,"when_to_use":26,"allowed-tools":27,"user-invocable":28},"fork","Visually QA a rendered resume PDF and auto-fix layout\u002Fcontent defects in a bounded loop: render → screenshot → deterministic gate → vision rubric → apply one fix → re-render, until it passes or hits a pass cap. Catches widows, under-fill, overflow, orphaned headers, and imbalance that text-only logic can't see.\n","Use right after render-resume produces a PDF — especially in autonomous runs where no human eyes the page — to verify and tighten the visual result before it goes out.\n","Read, Write, Edit, Bash",true,"main","68211e04d37044c49c3a91f3a29ce9647fada95f","skills\u002Freview-render",1,"https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills","https:\u002F\u002Fgithub.com\u002Fjain777","https:\u002F\u002Fjeevesh.me\u002F","Product Manager | Builder | Claude Coder","2026-06-09 13:47:19",{"source":8,"skillName":5,"commands":39,"prompt":49,"zipAvailable":28},[40,43,46],{"tool":41,"command":42},"npx","npx skills add jain777\u002Fjobclaw-skills --skill review-render",{"tool":44,"command":45},"bunx","bunx skills add jain777\u002Fjobclaw-skills --skill review-render",{"tool":47,"command":48},"pnpm","pnpm dlx skills add jain777\u002Fjobclaw-skills --skill review-render","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-render\u002FSKILL.md",[51],{"path":52,"resourceType":53,"resourceTypeDesc":54,"sizeBytes":55,"sourceHtmlUrl":56},"reference\u002Frubric.md","REFERENCE","参考文档",3126,"https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Freview-render\u002Freference\u002Frubric.md",[58,65,72,79,86,93],{"skillNo":59,"name":60,"nameZh":6,"description":61,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":62,"categories":63,"keywords":64,"publishedAt":19},"01M74YF759275CXY2ZWZBA1PD0","write-outreach","Write a short, profile-grounded cold outreach message to a recruiter, hiring manager, or potential referrer — LinkedIn DM or email — with one clear CTA and no flattery.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwrite-outreach\u002FSKILL.md",[],[],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":19},"01M74YF3WPDQ9D2PJ00XWH29EA","write-cover-letter","Produce a job-specific, profile-grounded cover letter in markdown — ≤ 350 words, ≤ 1 page, three paragraphs (hook → two quantified proofs → fit close). Reuses keywords from a prior tailor-resume sidecar when present. Writes a JSON sidecar reserved for a future \u002Frender-resume --kind cover-letter (rendercv).","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fwrite-cover-letter\u002FSKILL.md",[],[],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":19},"01M74YF106JXZQ3DMDMVR722YH","triage-inbox","Classify a recruiting email (or a batch) into one of the 10 canonical email classes, extract structured fields (company \u002F role \u002F dates \u002F links \u002F asks \u002F deadline \u002F sentiment), and suggest the next action. Writes inbox\u002Ftriage-\u003CYYYY-MM-DD>.json — consumed by infer-status and draft-reply.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftriage-inbox\u002FSKILL.md",[],[],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":83,"categories":84,"keywords":85,"publishedAt":19},"01M74YEX348VFDH9FG9C00WKG3","tailor-resume","Produce a job-specific, ATS-optimized resume from the user's master profile and a target job — reordering, reframing, and surfacing the most relevant real experience and keywords. Enforces a content rubric (bullet shape, length, parallel grammar, metric coverage), then renders a polished PDF by default (via render-resume) and visually QAs it. Never fabricates.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Ftailor-resume\u002FSKILL.md",[],[],{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":19},"01M74YESFCVSEG3C0AB8QXVJBR","score-fit","Score how well the user's master profile fits a specific job — an ATS-style match percentage with matched\u002Fmissing keywords, strengths, gaps, and a clear apply-or-skip recommendation. Optionally writes a structured sidecar that tailor-resume consumes.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fscore-fit\u002FSKILL.md",[],[],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":19},"01M74YEHQPVC64D5BS57BY2EYB","research-company","Build a structured company × role brief — compensation, day-to-day, career growth, recent news, community sentiment (Reddit \u002F Blind \u002F Glassdoor), red flags, and a \"fit for this user\" view. Heavy reasoning — runs forked. Writes companies\u002F\u003Cslug>.{md,json} sidecars consumed by prep-interview and coach-negotiation.","https:\u002F\u002Fgithub.com\u002Fjain777\u002Fjobclaw-skills\u002Fblob\u002Fmain\u002Fskills\u002Fresearch-company\u002FSKILL.md",[],[]]