{"owner":"tw93","repo":"Kami","hasSkills":true,"totalSkillsCount":111,"totalTokensCount":59903,"categories":["marketplace","root-instruction","anthropic-skill","claude-rule","plugin-manifest"],"hasMcp":false,"mcpConfig":null,"found":[".claude-plugin/marketplace.json","llms.txt","skills/kami/SKILL.md","plugins/kami/skills/kami/SKILL.md",".agents/plugins/marketplace.json","evals/equity-report-charts-en/prompt.md","site/llms.txt","AGENTS.md","CLAUDE.md","evals/landing-page-en/prompt.md","evals/letter-ko/prompt.md","evals/long-doc-cn/prompt.md","evals/one-pager-en/prompt.md","evals/portfolio-cn/prompt.md","evals/resume-cn/prompt.md","evals/slides-en/prompt.md","skills/kami/CHEATSHEET.md","evals/equity-report-charts-en/graders/content-fidelity.md","evals/equity-report-charts-en/graders/no-placeholders.md","evals/equity-report-charts-en/graders/pdf-created.md","evals/equity-report-charts-en/graders/skill-fired.md","evals/equity-report-cn/graders/content-fidelity.md","evals/equity-report-cn/graders/no-placeholders.md","evals/equity-report-cn/graders/pdf-created.md","evals/equity-report-cn/graders/skill-fired.md","evals/landing-page-en/graders/content-fidelity.md","evals/landing-page-en/graders/html-created.md","evals/landing-page-en/graders/no-placeholders.md","evals/landing-page-en/graders/skill-fired.md","evals/letter-ko/graders/content-fidelity.md","evals/letter-ko/graders/no-placeholders.md","evals/letter-ko/graders/pdf-created.md","evals/letter-ko/graders/skill-fired.md","evals/long-doc-cn/graders/content-fidelity.md","evals/long-doc-cn/graders/no-placeholders.md","evals/long-doc-cn/graders/pdf-created.md","evals/long-doc-cn/graders/skill-fired.md","evals/one-pager-en/graders/content-fidelity.md","evals/one-pager-en/graders/no-invented-metrics.md","evals/one-pager-en/graders/no-placeholders.md","evals/one-pager-en/graders/pdf-created.md","evals/one-pager-en/graders/skill-fired.md","evals/portfolio-cn/graders/content-fidelity.md","evals/portfolio-cn/graders/no-placeholders.md","evals/portfolio-cn/graders/pdf-created.md","evals/portfolio-cn/graders/skill-fired.md","evals/resume-cn/graders/content-fidelity.md","evals/resume-cn/graders/no-placeholders.md","evals/resume-cn/graders/pdf-created.md","evals/resume-cn/graders/skill-fired.md","evals/slides-en/graders/content-fidelity.md","evals/slides-en/graders/no-placeholders.md","evals/slides-en/graders/pdf-created.md","evals/slides-en/graders/skill-fired.md","plugins/kami/.claude-plugin/plugin.json","plugins/kami/.codex-plugin/plugin.json","skills/kami/references/anti-patterns.md","skills/kami/references/brand-profile.md","skills/kami/references/brand.example.md","skills/kami/references/checks_thresholds.json","skills/kami/references/deck-preflight.md","skills/kami/references/design.md","skills/kami/references/diagrams.md","skills/kami/references/mermaid-theme.json","skills/kami/references/mermaid.md","skills/kami/references/production.md","skills/kami/references/resume-writing.md","skills/kami/references/tokens.json","skills/kami/references/writing.md","skills/kami/scripts/package.json","plugins/kami/skills/kami/CHEATSHEET.md","skills/kami/references/schemas/changelog.json","skills/kami/references/schemas/equity-report.json","skills/kami/references/schemas/landing-page.json","skills/kami/references/schemas/letter.json","skills/kami/references/schemas/long-doc.json","skills/kami/references/schemas/one-pager.json","skills/kami/references/schemas/portfolio.json","skills/kami/references/schemas/resume.json","skills/kami/references/schemas/slides.json","skills/kami/scripts/mathjax-runtime/package-lock.json","skills/kami/scripts/mathjax-runtime/package.json","plugins/kami/skills/kami/references/anti-patterns.md","plugins/kami/skills/kami/references/brand-profile.md","plugins/kami/skills/kami/references/brand.example.md","plugins/kami/skills/kami/references/checks_thresholds.json","plugins/kami/skills/kami/references/deck-preflight.md","plugins/kami/skills/kami/references/design.md","plugins/kami/skills/kami/references/diagrams.md","plugins/kami/skills/kami/references/mermaid-theme.json","plugins/kami/skills/kami/references/mermaid.md","plugins/kami/skills/kami/references/production.md","plugins/kami/skills/kami/references/resume-writing.md","plugins/kami/skills/kami/references/tokens.json","plugins/kami/skills/kami/references/writing.md","plugins/kami/skills/kami/scripts/package.json","skills/kami/assets/templates/marp/slides-marp-en.md","skills/kami/assets/templates/marp/slides-marp.md","plugins/kami/skills/kami/references/schemas/changelog.json","plugins/kami/skills/kami/references/schemas/equity-report.json","plugins/kami/skills/kami/references/schemas/landing-page.json","plugins/kami/skills/kami/references/schemas/letter.json","plugins/kami/skills/kami/references/schemas/long-doc.json","plugins/kami/skills/kami/references/schemas/one-pager.json","plugins/kami/skills/kami/references/schemas/portfolio.json","plugins/kami/skills/kami/references/schemas/resume.json","plugins/kami/skills/kami/references/schemas/slides.json","plugins/kami/skills/kami/scripts/mathjax-runtime/package-lock.json","plugins/kami/skills/kami/scripts/mathjax-runtime/package.json","plugins/kami/skills/kami/assets/templates/marp/slides-marp-en.md","plugins/kami/skills/kami/assets/templates/marp/slides-marp.md"],"skills":{".claude-plugin/marketplace.json":"{\n  \"name\": \"kami\",\n  \"description\": \"Document typesetting skill for Claude Code.\",\n  \"owner\": {\n    \"name\": \"Tw93\",\n    \"email\": \"hitw93@gmail.com\"\n  },\n  \"plugins\": [\n    {\n      \"name\": \"kami\",\n      \"version\": \"1.18.0\",\n      \"description\": \"Typeset professional documents and landing pages with the Kami design system.\",\n      \"category\": \"documents\",\n      \"source\": \"./plugins/kami\",\n      \"homepage\": \"https://github.com/tw93/kami\"\n    }\n  ]\n}\n","llms.txt":"site/llms.txt","skills/kami/SKILL.md":"---\nname: kami\ndescription: 'Typeset professional documents with Kami templates: resumes, one-pagers, white papers, letters, portfolios, and slide decks. Use when asked to 做 PDF / 排版 / 简历 / 一页纸 / PPT / slides, or to create a Kami landing page. Not for auditing or restyling an existing product site.'\n---\n\n# kami · 紙\n\n**紙 · かみ** means paper in Japanese.\n\nGood content deserves good paper. Use Kami’s templates and layout rules to create documents and landing pages with serif fonts, warm backgrounds, and ink-blue accents.\n\nPart of `Kaku · Waza · Kami` - Kaku writes code, Waza drills habits, **Kami delivers documents**.\n\nCommands and paths below are relative to this skill's directory. Keep the document in the user's working directory and call the scripts from there by their full path (`python3 <skill>/scripts/build.py ...`); relative file arguments resolve from your working directory first.\n\n**Update check (non-blocking).** At the start of a task, run `bash scripts/check-update.sh`. It keeps a local daily marker and, at most once a day, reads Kami's latest published GitHub Release; it uploads no document or task content and stays silent when offline or sandboxed. When it prints a line about a newer Kami, relay it and continue.\n\n**Brand profile.** If `~/.config/kami/brand.md` (or the legacy `~/.kami/brand.md`) exists, read `references/brand-profile.md` and apply it. Precedence: explicit prompt > editorial judgment > habit notes > frontmatter defaults > built-in defaults. The profile fills gaps silently and never overrides the current conversation. When the user names another project as the visual reference, run the style scan in the same file. When they give only a brand website, `python3 scripts/brand_extract.py <url>` drafts a profile; show the draft and use it for this document only after they accept it.\n\n## 1 · Lock the contract\n\nBefore creating or changing an output, lock six things: language, template, output formats, page or length target, visual acceptance, and the verification command. Infer them from the request, then state the contract to the user in one short line in their language (template, length, formats, the figures you plan, any missing material) and continue without waiting. If they push back, adjust.\n\n**Question budget.** Infer first. Ask at most once, in one compact question with at most two parts, and only when two or more of purpose, audience, hard constraints, or success are genuinely unresolvable, or two templates genuinely both fit. Otherwise take the smallest reasonable assumption and report it at the end.\n\nRoute by the artifact's current state:\n\n| Current task | Mode | Contract |\n|---|---|---|\n| New document or substantial restructuring | **New document** | Lock the contract, write `content.json` with `brief` + `content`, then fill and deliver |\n| Text replacement, translation, or factual correction in an existing artifact | **Content-only** | Preserve CSS and layout unless the new copy proves a fit defect |\n| User supplies a render or screenshot and rejects how it looks | **Visual repair** | Treat the render as the brief; follow «Feedback protocol» |\n| Standalone generated illustration, cover, social card, or redraw | **Generated asset** | Lock the semantic brief before pixels (`references/diagrams.md` section 11); preserve accepted parts across iterations |\n\nUse the nearest existing template and check. Do not add a template, shared CSS layer, dependency, script flag, or optional mode unless the request cannot be met without it.\n\n### Language\n\n| User language | HTML templates | Slides (PDF default) | Slides (PPTX, only when an editable deck is requested) | Slides (Marp) |\n|---|---|---|---|---|\n| Chinese (primary) | `*.html` | `slides-weasy.html` | `slides.py` | `slides-marp.md` |\n| English | `*-en.html` | `slides-weasy-en.html` | `slides-en.py` | `slides-marp-en.md` |\n| Japanese (best-effort) | `*.html`, JP Mincho first | `slides-weasy.html` | `slides.py` | `slides-marp.md` |\n| Korean | `*-ko.html` | `slides-weasy-ko.html` | `slides-en.py` only if PPTX is required | `slides-marp.md` |\n| Other (best-effort) | CJK or EN path by script coverage | `slides-weasy.html` or `-en` | `slides.py` / `slides-en.py` | `slides-marp.md` or `-en` |\n\nJapanese, Korean, and other languages need a visual pass on the page images before shipping. Reference docs are shared English specs.\n\n### Document type\n\n| User says | Document | CN template | EN template | KO template |\n|---|---|---|---|---|\n| \"one-pager / 方案 / 执行摘要 / exec summary\" | One-Pager | `one-pager.html` | `one-pager-en.html` | `one-pager-ko.html` |\n| \"white paper / 白皮书 / 长文 / 年度总结 / technical report\" | Long Doc | `long-doc.html` | `long-doc-en.html` | `long-doc-ko.html` |\n| \"formal letter / 信件 / 辞职信 / 推荐信 / memo\" | Letter | `letter.html` | `letter-en.html` | `letter-ko.html` |\n| \"portfolio / 作品集 / case studies\" | Portfolio | `portfolio.html` | `portfolio-en.html` | `portfolio-ko.html` |\n| \"resume / CV / 简历 / 履歴書\" | Resume | `resume.html` | `resume-en.html` | `resume-ko.html` |\n| \"slides / PPT / deck / 演示\" | Slides | `slides-weasy.html` | `slides-weasy-en.html` | `slides-weasy-ko.html` |\n| \"个股研报 / equity report / 估值分析 / investment memo / 股票分析\" | Equity Report | `equity-report.html` | `equity-report-en.html` | `equity-report-ko.html` |\n| \"更新日志 / changelog / release notes / 版本记录\" | Changelog | `changelog.html` | `changelog-en.html` | `changelog-ko.html` |\n| \"landing page / 落地页 / 官网 / product page / 产品页\" | Landing Page | `landing-page.html` | `landing-page-en.html` | `landing-page-ko.html` |\n\nWhen two cells both fit, decide from the signals before asking:\n\n| Signal | Document |\n|---|---|\n| 1 page for investors, recruiters, or an executive summary | one-pager |\n| 1 page of formal correspondence (sales, hiring, resignation, memo) | letter |\n| Exactly 2 pages of career narrative with project bullets | resume |\n| 3-6 visual-heavy pages showcasing projects | portfolio |\n| 6-15 pages of sustained argument, low visual density | long-doc |\n| Presentation flow, one assertion per slide | slides |\n| Metrics dashboard plus thesis plus price or risk view | equity-report |\n| Version-by-version release facts | changelog |\n| Product showcase, pricing, screenshots, FAQ for a browser | landing-page |\n\nAsk only in cases like \"1.5 pages of career story, heavy visuals\" (resume or portfolio?) or \"2 pages of exec summary with metric tiles\" (one-pager or equity-report?).\n\n- **Changelog vs. release notes**: the changelog template is a styled document. GitHub release notes are a separate deliverable; use `/write`.\n- **Landing page**: screen-first HTML, no PDF. Fill the `{{PLACEHOLDER}}` values and comment blocks and save a ready-to-serve file. The accent follows the product: use its own main color, ask the user to pick when it has none, and keep ink-blue only as the fallback (`references/design.md` Section 11 «Accent on a product site»). Companion files (`landing-page-*.example`) and the production site mode (docs, help, releases, legal pages, or more than two locales) live in `references/design.md` Section 11. Keep project-specific release artifacts, payment providers, appcast rules, and private local paths out of Kami.\n- **Diagrams inside a document** come from `assets/diagrams/` (eighteen types), not a template. `references/diagrams.md` section 1 picks the type; extract the `<svg>` block into a `<figure>`. The same file owns architecture boards, diagrams maintained in the user's repo, and generated raster illustrations.\n- **Charts from data** (pick and embed them without asking) are generated, never drawn by hand: write the numbers as a spec and run `python3 scripts/build.py --chart spec.json -o chart.svg` (`references/diagrams.md` section 9).\n- **Slides**: read `references/deck-preflight.md` before drafting.\n\n## 2 · Sources, materials, and content\n\n**Source check.** When the document names a company, product, person, release date, version, funding round, metric, market fact, or technical spec, work from primary sources, note source and date for the facts that drive it, and ask when sources conflict (`references/writing.md` «5. Sources before phrasing»). Skip it for personal drafts where the user supplied everything.\n\n**Material check.** A branded subject needs what makes it recognizable: logo, product image or current UI screenshot, and brand colors when the document is branded (`references/writing.md` «6. Materials serve recognition»). When the request names no logo but the brand profile has one, fill the commented `.brand-logo` slot in `one-pager` / `portfolio` / `slides-weasy` (expand `~` to an absolute path; leave the slot commented if the file is missing). An explicit logo in the current request always wins.\n\n**Gap report.** Everything the template needs that the input lacks, missing facts and missing materials alike, goes into one compact table shown once, with one question only when a missing item would change the deliverable. Inside the document, mark a gap as `[DATA NEEDED: what]`. Never fill a gap with a guess, a stock image, an approximated logo, or an invented value.\n\n**Distill.** Unless the content already maps one-to-one onto the template sections or the user said to use it as-is, distill it. Every factual claim, number, date, name, source, and material reference from the input must land in a template section or in the gap report.\n\n**Content IR (new documents).** Write the distilled content and the locked contract to `content.json` next to the working HTML before filling. Read `references/schemas/<type>.json` first: its `$comment` notes carry the per-field quality bar. The envelope is strict: only `type`, `lang` (`cn`, `en`, `ko`, `zh-TW`, ...), `brief`, and `content`.\n\n```json\n{\n  \"type\": \"resume\",\n  \"lang\": \"cn\",\n  \"brief\": {\n    \"audience\": \"Hiring manager for a senior product role\",\n    \"job\": \"Earn an interview by proving scope and outcomes\",\n    \"template\": \"resume\",\n    \"formats\": [\"html\", \"pdf\"],\n    \"page_target\": 2,\n    \"narrative\": \"Scope first, then evidence, then fit\",\n    \"required_facts\": [\"team size\", \"measured outcomes\"],\n    \"required_assets\": [],\n    \"acceptance_checks\": [\"two pages\", \"all atomic facts survive\"],\n    \"preserve\": [],\n    \"explicit_deviations\": []\n  },\n  \"content\": { ... }\n}\n```\n\n`type` is a schema name in `references/schemas/` (one-pager, letter, resume, long-doc, portfolio, slides, equity-report, changelog, landing-page). For a visual repair, add `target`, `evidence`, and `preserve` to `brief`. Validate before layout with `python3 scripts/build.py --check-content content.json` and fix errors by fixing the content (or asking for the fact), never by loosening structure. Short atomic values (names, metrics, dates, bullets) must survive into the document verbatim; values over 80 characters may be rephrased.\n\n## 3 · Read the right amount\n\nRead the lowest tier that covers the task. The templates already carry every token and component, so a new document does not need the full design spec.\n\n| Task | Read |\n|---|---|\n| Content-only change | `CHEATSHEET.md` |\n| Layout tweak within spec | `CHEATSHEET.md` + the template |\n| New document | the template + `CHEATSHEET.md` + `references/schemas/<type>.json` + the `references/writing.md` sections for that type («Per-document strategies», «Quality bars by document type»); open `references/design.md` only for the component or rule you are about to change |\n| Resume | + `references/resume-writing.md` |\n| Slides, long-doc, portfolio, equity-report, changelog | + `references/writing.md` «Page density» |\n| Slides | + `references/deck-preflight.md` and the `references/design.md` section 8 «Deck Recipe» it points to |\n| Diagram | `references/diagrams.md`; `references/mermaid.md` when the source is Mermaid text |\n| Company, product, market, or branded subject | `references/writing.md` sections 5-6 |\n| Rendering bug, font issue, overflow | `references/production.md` Part 4 (and the design spec if CSS is the cause) |\n| Reviewing an AI-generated draft | `references/anti-patterns.md` |\n\n## 4 · Fill the template\n\n- Copy the template into the working directory; never write HTML from scratch. CSS stays untouched during a content fill. A layout change stays within spec, and a real style change moves `references/design.md` and the sibling templates together, never one file.\n- Meet the quality bar for the type in `references/writing.md` «Quality bars by document type»: a resume bullet needs action, honest scope, and an observable result; an equity report needs variant perception and quantified catalysts; slides need assertion titles. Structure is necessary, not sufficient.\n- Do not invent metrics, financial data, or statistics, and keep any figure you compute from the supplied ones next to its inputs or marked as derived; do not describe stock images as placeholders; do not pad slots (three real projects do not become five). Avoid the patterns in `references/anti-patterns.md`.\n- Tables separate rows with whitespace first and neutral hairlines second; decoration earns its place only by encoding data, state, grouping, or a relationship (`references/design.md` «Table (kami-table)» and «Subtractive rule»).\n- Resume: run the recruiter pass in `references/resume-writing.md` before building.\n- Mathematics is strict LaTeX: author formulas only as inline `\\( ... \\)` or display `\\[ ... \\]` in rendered body text, never as Unicode approximations, ASCII fractions, screenshots, or raw TeX on the page. `--deliver` renders them to MathJax SVG in place; it needs Node.js 20 or 22+ and `bash scripts/ensure_mathjax.sh` once.\n- Code blocks with `class=\"language-*\"` are highlighted when optional `Pygments` is installed; without it they render monochrome.\n\nFill the four metadata placeholders in `<head>`; WeasyPrint writes them into the PDF:\n\n| CN | EN | Rule |\n|---|---|---|\n| `{{作者}}` | `{{AUTHOR}}` | Resume, letter, portfolio: the person's name from the document. Others: leave it, the build infers it from `git config user.name`, then `KAMI_AUTHOR` |\n| `{{摘要}}` | `{{DESCRIPTION}}` | One sentence (≤150 chars) from the first two paragraphs |\n| `{{关键词}}` | `{{KEYWORDS}}` | 3-5 keywords from the title and section headings |\n| `{{文档标题}}` etc. | `{{DOC_TITLE}}` etc. | From the H1 or `.header .title` |\n\nKeep `<meta name=\"generator\" content=\"Kami\">` as is.\n\n**Output formats.** Do not ask; decide from context. Any document: HTML + PDF (PDF is the deliverable, HTML the source). Slides: HTML + PDF, plus PPTX only when an editable deck is requested. \"分享 / 发朋友圈 / share / post / preview\": add PNG. \"嵌入 / 插图 / embed in another doc\": PNG only. Landing page: the static HTML file. Word or `.docx` for long-doc, proposal, or equity-report: the PDF plus a DOCX through `references/production.md` Part 5. An explicit format request overrides all of this.\n\n## 5 · Deliver\n\nOne command finishes a document. Run it from the document's directory, fix every `ERROR`, and re-run until it reports `READY`:\n\n```bash\npython3 scripts/build.py --deliver filled.html content.json\n```\n\nIt checks the HTML (placeholders, strict math rendered in place, Markdown residue, generated charts against their data, template style, content coverage), renders the PDF next to it, then checks the PDF (page contract, resume balance, the font that actually drew CJK text, residue, density, orphans) and exports page images. `WARN` lines point at where to look, not at failures. `GAP` lines are the `[DATA NEEDED]` markers you must report.\n\nThen do the part no script can: open every page image and walk the printed checklist. One hit means a whole-document sweep for that class of issue. Fix the three most visible defects per round, re-run `--deliver`, and stop after three rounds; list what is still wrong rather than looping. If the host cannot view images, send the image paths and the checklist to the user instead of skipping the pass. A missing CJK serif shows no fallback boxes, only a heavier, flatter page, which is why the font gate exists; never call a CJK document visually verified without it.\n\nOther surfaces:\n\n- **Landing pages and any browser surface**: `--deliver` checks the HTML only. Screenshot the responsive matrix in every shipped locale before calling it done (`references/design.md` «Responsive screenshot verification»); do not wait for the user to ask about mobile.\n- **Editable PPTX**: `python3 scripts/build.py --verify slides` (or `slides-en`) and `--check-rhythm`.\n- **Missing dependencies or fonts**: `python3 scripts/build.py --doctor` reports what is installed; `bash scripts/ensure-fonts.sh` recovers CJK fonts (the commercial TsangerJinKai02 never ships inside the skill package). Render failures and their fixes: `references/production.md` Part 4.\n\n**Fresh review.** After `READY` and the image pass, review once from the contract rather than from your own rationale: reread `brief`, the coverage result, and the page images; check every acceptance item and `preserve` boundary; fix P0/P1 findings, each tied to the page or element that proves it. Use an isolated reviewer when the host has one.\n\n**Definition of done.** The closing message gives:\n\n1. The path of every deliverable, in every promised format.\n2. The `--deliver` verdict and page count against the contract.\n3. Every `[DATA NEEDED]` gap and every assumption you made, listed.\n4. The visual verdict stated honestly: when page images could not be inspected, say \"build verified, visuals unconfirmed\", not \"done\".\n\n## Feedback protocol\n\nWhen the user gives visual feedback (\"looks off\", \"太挤了\", \"not elegant\"), inspect the current render before asking them to choose a value. The render is the evidence; the user's negative label is the acceptance signal.\n\n1. Name the concrete defect in one sentence: page or surface, viewport or state, and whether it is density, hierarchy, alignment, type, color, cropping, or text fit.\n2. Lock the repair boundary: `target` is allowed to change; `preserve` names the adjacent pages, sections, content, and shared tokens that must stay stable. Ask only when two plausible targets would produce materially different artifacts.\n3. Make the smallest content, geometry, spacing, typography, crop, or token change that fixes the defect. Never hide a content problem by shrinking type first.\n4. Verify the affected matrix rather than one screenshot:\n   - PDF: target page, neighboring pages, total page count, font result, and every locale or template variant reached by a shared token.\n   - Screen: the breakpoint, tablet, and baseline matrix in `references/design.md` «Responsive screenshot verification»; every shipped locale; affected default, focus/selected, loading, empty/error, and transition states only when the surface has them.\n   - PPTX: editable source plus a rendered PDF or opened-deck inspection.\n   - Generated asset: target slot at its smallest display size plus sibling assets in the same deliverable.\n\nNever say \"I'll adjust the spacing\" without naming the exact property and its new value.\n\n**Escalate after two rounds.** If the same element is still not approved after two adjustment rounds, stop nudging values and produce one comparison artifact: the current state plus 2-3 labeled variants (A/B/C) of the same content in the product's actual frame and background, changing only the compared property. For choices with no objective criterion (typeface, accent color, logo), start there: a specimen sheet of up to 5 labeled half-page blocks with identical title-plus-paragraph content. After the pick, apply it everywhere and rebuild what it touches in the same round.\n\n## When not to use this skill\n\n- The user explicitly wants Material, Fluent, or a Tailwind default: a different design language.\n- Dark, cyberpunk, or futurist aesthetics (this is deliberately anti-future).\n- Saturated multi-color palettes (this has one accent).\n- Cartoon, animation, or illustration style (this is editorial).\n- Dynamic web app UI (this is for print and static documents).\n","plugins/kami/skills/kami/SKILL.md":"---\nname: kami\ndescription: 'Typeset professional documents with Kami templates: resumes, one-pagers, white papers, letters, portfolios, and slide decks. Use when asked to 做 PDF / 排版 / 简历 / 一页纸 / PPT / slides, or to create a Kami landing page. Not for auditing or restyling an existing product site.'\n---\n\n# kami · 紙\n\n**紙 · かみ** means paper in Japanese.\n\nGood content deserves good paper. Use Kami’s templates and layout rules to create documents and landing pages with serif fonts, warm backgrounds, and ink-blue accents.\n\nPart of `Kaku · Waza · Kami` - Kaku writes code, Waza drills habits, **Kami delivers documents**.\n\nCommands and paths below are relative to this skill's directory. Keep the document in the user's working directory and call the scripts from there by their full path (`python3 <skill>/scripts/build.py ...`); relative file arguments resolve from your working directory first.\n\n**Update check (non-blocking).** At the start of a task, run `bash scripts/check-update.sh`. It keeps a local daily marker and, at most once a day, reads Kami's latest published GitHub Release; it uploads no document or task content and stays silent when offline or sandboxed. When it prints a line about a newer Kami, relay it and continue.\n\n**Brand profile.** If `~/.config/kami/brand.md` (or the legacy `~/.kami/brand.md`) exists, read `references/brand-profile.md` and apply it. Precedence: explicit prompt > editorial judgment > habit notes > frontmatter defaults > built-in defaults. The profile fills gaps silently and never overrides the current conversation. When the user names another project as the visual reference, run the style scan in the same file. When they give only a brand website, `python3 scripts/brand_extract.py <url>` drafts a profile; show the draft and use it for this document only after they accept it.\n\n## 1 · Lock the contract\n\nBefore creating or changing an output, lock six things: language, template, output formats, page or length target, visual acceptance, and the verification command. Infer them from the request, then state the contract to the user in one short line in their language (template, length, formats, the figures you plan, any missing material) and continue without waiting. If they push back, adjust.\n\n**Question budget.** Infer first. Ask at most once, in one compact question with at most two parts, and only when two or more of purpose, audience, hard constraints, or success are genuinely unresolvable, or two templates genuinely both fit. Otherwise take the smallest reasonable assumption and report it at the end.\n\nRoute by the artifact's current state:\n\n| Current task | Mode | Contract |\n|---|---|---|\n| New document or substantial restructuring | **New document** | Lock the contract, write `content.json` with `brief` + `content`, then fill and deliver |\n| Text replacement, translation, or factual correction in an existing artifact | **Content-only** | Preserve CSS and layout unless the new copy proves a fit defect |\n| User supplies a render or screenshot and rejects how it looks | **Visual repair** | Treat the render as the brief; follow «Feedback protocol» |\n| Standalone generated illustration, cover, social card, or redraw | **Generated asset** | Lock the semantic brief before pixels (`references/diagrams.md` section 11); preserve accepted parts across iterations |\n\nUse the nearest existing template and check. Do not add a template, shared CSS layer, dependency, script flag, or optional mode unless the request cannot be met without it.\n\n### Language\n\n| User language | HTML templates | Slides (PDF default) | Slides (PPTX, only when an editable deck is requested) | Slides (Marp) |\n|---|---|---|---|---|\n| Chinese (primary) | `*.html` | `slides-weasy.html` | `slides.py` | `slides-marp.md` |\n| English | `*-en.html` | `slides-weasy-en.html` | `slides-en.py` | `slides-marp-en.md` |\n| Japanese (best-effort) | `*.html`, JP Mincho first | `slides-weasy.html` | `slides.py` | `slides-marp.md` |\n| Korean | `*-ko.html` | `slides-weasy-ko.html` | `slides-en.py` only if PPTX is required | `slides-marp.md` |\n| Other (best-effort) | CJK or EN path by script coverage | `slides-weasy.html` or `-en` | `slides.py` / `slides-en.py` | `slides-marp.md` or `-en` |\n\nJapanese, Korean, and other languages need a visual pass on the page images before shipping. Reference docs are shared English specs.\n\n### Document type\n\n| User says | Document | CN template | EN template | KO template |\n|---|---|---|---|---|\n| \"one-pager / 方案 / 执行摘要 / exec summary\" | One-Pager | `one-pager.html` | `one-pager-en.html` | `one-pager-ko.html` |\n| \"white paper / 白皮书 / 长文 / 年度总结 / technical report\" | Long Doc | `long-doc.html` | `long-doc-en.html` | `long-doc-ko.html` |\n| \"formal letter / 信件 / 辞职信 / 推荐信 / memo\" | Letter | `letter.html` | `letter-en.html` | `letter-ko.html` |\n| \"portfolio / 作品集 / case studies\" | Portfolio | `portfolio.html` | `portfolio-en.html` | `portfolio-ko.html` |\n| \"resume / CV / 简历 / 履歴書\" | Resume | `resume.html` | `resume-en.html` | `resume-ko.html` |\n| \"slides / PPT / deck / 演示\" | Slides | `slides-weasy.html` | `slides-weasy-en.html` | `slides-weasy-ko.html` |\n| \"个股研报 / equity report / 估值分析 / investment memo / 股票分析\" | Equity Report | `equity-report.html` | `equity-report-en.html` | `equity-report-ko.html` |\n| \"更新日志 / changelog / release notes / 版本记录\" | Changelog | `changelog.html` | `changelog-en.html` | `changelog-ko.html` |\n| \"landing page / 落地页 / 官网 / product page / 产品页\" | Landing Page | `landing-page.html` | `landing-page-en.html` | `landing-page-ko.html` |\n\nWhen two cells both fit, decide from the signals before asking:\n\n| Signal | Document |\n|---|---|\n| 1 page for investors, recruiters, or an executive summary | one-pager |\n| 1 page of formal correspondence (sales, hiring, resignation, memo) | letter |\n| Exactly 2 pages of career narrative with project bullets | resume |\n| 3-6 visual-heavy pages showcasing projects | portfolio |\n| 6-15 pages of sustained argument, low visual density | long-doc |\n| Presentation flow, one assertion per slide | slides |\n| Metrics dashboard plus thesis plus price or risk view | equity-report |\n| Version-by-version release facts | changelog |\n| Product showcase, pricing, screenshots, FAQ for a browser | landing-page |\n\nAsk only in cases like \"1.5 pages of career story, heavy visuals\" (resume or portfolio?) or \"2 pages of exec summary with metric tiles\" (one-pager or equity-report?).\n\n- **Changelog vs. release notes**: the changelog template is a styled document. GitHub release notes are a separate deliverable; use `/write`.\n- **Landing page**: screen-first HTML, no PDF. Fill the `{{PLACEHOLDER}}` values and comment blocks and save a ready-to-serve file. The accent follows the product: use its own main color, ask the user to pick when it has none, and keep ink-blue only as the fallback (`references/design.md` Section 11 «Accent on a product site»). Companion files (`landing-page-*.example`) and the production site mode (docs, help, releases, legal pages, or more than two locales) live in `references/design.md` Section 11. Keep project-specific release artifacts, payment providers, appcast rules, and private local paths out of Kami.\n- **Diagrams inside a document** come from `assets/diagrams/` (eighteen types), not a template. `references/diagrams.md` section 1 picks the type; extract the `<svg>` block into a `<figure>`. The same file owns architecture boards, diagrams maintained in the user's repo, and generated raster illustrations.\n- **Charts from data** (pick and embed them without asking) are generated, never drawn by hand: write the numbers as a spec and run `python3 scripts/build.py --chart spec.json -o chart.svg` (`references/diagrams.md` section 9).\n- **Slides**: read `references/deck-preflight.md` before drafting.\n\n## 2 · Sources, materials, and content\n\n**Source check.** When the document names a company, product, person, release date, version, funding round, metric, market fact, or technical spec, work from primary sources, note source and date for the facts that drive it, and ask when sources conflict (`references/writing.md` «5. Sources before phrasing»). Skip it for personal drafts where the user supplied everything.\n\n**Material check.** A branded subject needs what makes it recognizable: logo, product image or current UI screenshot, and brand colors when the document is branded (`references/writing.md` «6. Materials serve recognition»). When the request names no logo but the brand profile has one, fill the commented `.brand-logo` slot in `one-pager` / `portfolio` / `slides-weasy` (expand `~` to an absolute path; leave the slot commented if the file is missing). An explicit logo in the current request always wins.\n\n**Gap report.** Everything the template needs that the input lacks, missing facts and missing materials alike, goes into one compact table shown once, with one question only when a missing item would change the deliverable. Inside the document, mark a gap as `[DATA NEEDED: what]`. Never fill a gap with a guess, a stock image, an approximated logo, or an invented value.\n\n**Distill.** Unless the content already maps one-to-one onto the template sections or the user said to use it as-is, distill it. Every factual claim, number, date, name, source, and material reference from the input must land in a template section or in the gap report.\n\n**Content IR (new documents).** Write the distilled content and the locked contract to `content.json` next to the working HTML before filling. Read `references/schemas/<type>.json` first: its `$comment` notes carry the per-field quality bar. The envelope is strict: only `type`, `lang` (`cn`, `en`, `ko`, `zh-TW`, ...), `brief`, and `content`.\n\n```json\n{\n  \"type\": \"resume\",\n  \"lang\": \"cn\",\n  \"brief\": {\n    \"audience\": \"Hiring manager for a senior product role\",\n    \"job\": \"Earn an interview by proving scope and outcomes\",\n    \"template\": \"resume\",\n    \"formats\": [\"html\", \"pdf\"],\n    \"page_target\": 2,\n    \"narrative\": \"Scope first, then evidence, then fit\",\n    \"required_facts\": [\"team size\", \"measured outcomes\"],\n    \"required_assets\": [],\n    \"acceptance_checks\": [\"two pages\", \"all atomic facts survive\"],\n    \"preserve\": [],\n    \"explicit_deviations\": []\n  },\n  \"content\": { ... }\n}\n```\n\n`type` is a schema name in `references/schemas/` (one-pager, letter, resume, long-doc, portfolio, slides, equity-report, changelog, landing-page). For a visual repair, add `target`, `evidence`, and `preserve` to `brief`. Validate before layout with `python3 scripts/build.py --check-content content.json` and fix errors by fixing the content (or asking for the fact), never by loosening structure. Short atomic values (names, metrics, dates, bullets) must survive into the document verbatim; values over 80 characters may be rephrased.\n\n## 3 · Read the right amount\n\nRead the lowest tier that covers the task. The templates already carry every token and component, so a new document does not need the full design spec.\n\n| Task | Read |\n|---|---|\n| Content-only change | `CHEATSHEET.md` |\n| Layout tweak within spec | `CHEATSHEET.md` + the template |\n| New document | the template + `CHEATSHEET.md` + `references/schemas/<type>.json` + the `references/writing.md` sections for that type («Per-document strategies», «Quality bars by document type»); open `references/design.md` only for the component or rule you are about to change |\n| Resume | + `references/resume-writing.md` |\n| Slides, long-doc, portfolio, equity-report, changelog | + `references/writing.md` «Page density» |\n| Slides | + `references/deck-preflight.md` and the `references/design.md` section 8 «Deck Recipe» it points to |\n| Diagram | `references/diagrams.md`; `references/mermaid.md` when the source is Mermaid text |\n| Company, product, market, or branded subject | `references/writing.md` sections 5-6 |\n| Rendering bug, font issue, overflow | `references/production.md` Part 4 (and the design spec if CSS is the cause) |\n| Reviewing an AI-generated draft | `references/anti-patterns.md` |\n\n## 4 · Fill the template\n\n- Copy the template into the working directory; never write HTML from scratch. CSS stays untouched during a content fill. A layout change stays within spec, and a real style change moves `references/design.md` and the sibling templates together, never one file.\n- Meet the quality bar for the type in `references/writing.md` «Quality bars by document type»: a resume bullet needs action, honest scope, and an observable result; an equity report needs variant perception and quantified catalysts; slides need assertion titles. Structure is necessary, not sufficient.\n- Do not invent metrics, financial data, or statistics, and keep any figure you compute from the supplied ones next to its inputs or marked as derived; do not describe stock images as placeholders; do not pad slots (three real projects do not become five). Avoid the patterns in `references/anti-patterns.md`.\n- Tables separate rows with whitespace first and neutral hairlines second; decoration earns its place only by encoding data, state, grouping, or a relationship (`references/design.md` «Table (kami-table)» and «Subtractive rule»).\n- Resume: run the recruiter pass in `references/resume-writing.md` before building.\n- Mathematics is strict LaTeX: author formulas only as inline `\\( ... \\)` or display `\\[ ... \\]` in rendered body text, never as Unicode approximations, ASCII fractions, screenshots, or raw TeX on the page. `--deliver` renders them to MathJax SVG in place; it needs Node.js 20 or 22+ and `bash scripts/ensure_mathjax.sh` once.\n- Code blocks with `class=\"language-*\"` are highlighted when optional `Pygments` is installed; without it they render monochrome.\n\nFill the four metadata placeholders in `<head>`; WeasyPrint writes them into the PDF:\n\n| CN | EN | Rule |\n|---|---|---|\n| `{{作者}}` | `{{AUTHOR}}` | Resume, letter, portfolio: the person's name from the document. Others: leave it, the build infers it from `git config user.name`, then `KAMI_AUTHOR` |\n| `{{摘要}}` | `{{DESCRIPTION}}` | One sentence (≤150 chars) from the first two paragraphs |\n| `{{关键词}}` | `{{KEYWORDS}}` | 3-5 keywords from the title and section headings |\n| `{{文档标题}}` etc. | `{{DOC_TITLE}}` etc. | From the H1 or `.header .title` |\n\nKeep `<meta name=\"generator\" content=\"Kami\">` as is.\n\n**Output formats.** Do not ask; decide from context. Any document: HTML + PDF (PDF is the deliverable, HTML the source). Slides: HTML + PDF, plus PPTX only when an editable deck is requested. \"分享 / 发朋友圈 / share / post / preview\": add PNG. \"嵌入 / 插图 / embed in another doc\": PNG only. Landing page: the static HTML file. Word or `.docx` for long-doc, proposal, or equity-report: the PDF plus a DOCX through `references/production.md` Part 5. An explicit format request overrides all of this.\n\n## 5 · Deliver\n\nOne command finishes a document. Run it from the document's directory, fix every `ERROR`, and re-run until it reports `READY`:\n\n```bash\npython3 scripts/build.py --deliver filled.html content.json\n```\n\nIt checks the HTML (placeholders, strict math rendered in place, Markdown residue, generated charts against their data, template style, content coverage), renders the PDF next to it, then checks the PDF (page contract, resume balance, the font that actually drew CJK text, residue, density, orphans) and exports page images. `WARN` lines point at where to look, not at failures. `GAP` lines are the `[DATA NEEDED]` markers you must report.\n\nThen do the part no script can: open every page image and walk the printed checklist. One hit means a whole-document sweep for that class of issue. Fix the three most visible defects per round, re-run `--deliver`, and stop after three rounds; list what is still wrong rather than looping. If the host cannot view images, send the image paths and the checklist to the user instead of skipping the pass. A missing CJK serif shows no fallback boxes, only a heavier, flatter page, which is why the font gate exists; never call a CJK document visually verified without it.\n\nOther surfaces:\n\n- **Landing pages and any browser surface**: `--deliver` checks the HTML only. Screenshot the responsive matrix in every shipped locale before calling it done (`references/design.md` «Responsive screenshot verification»); do not wait for the user to ask about mobile.\n- **Editable PPTX**: `python3 scripts/build.py --verify slides` (or `slides-en`) and `--check-rhythm`.\n- **Missing dependencies or fonts**: `python3 scripts/build.py --doctor` reports what is installed; `bash scripts/ensure-fonts.sh` recovers CJK fonts (the commercial TsangerJinKai02 never ships inside the skill package). Render failures and their fixes: `references/production.md` Part 4.\n\n**Fresh review.** After `READY` and the image pass, review once from the contract rather than from your own rationale: reread `brief`, the coverage result, and the page images; check every acceptance item and `preserve` boundary; fix P0/P1 findings, each tied to the page or element that proves it. Use an isolated reviewer when the host has one.\n\n**Definition of done.** The closing message gives:\n\n1. The path of every deliverable, in every promised format.\n2. The `--deliver` verdict and page count against the contract.\n3. Every `[DATA NEEDED]` gap and every assumption you made, listed.\n4. The visual verdict stated honestly: when page images could not be inspected, say \"build verified, visuals unconfirmed\", not \"done\".\n\n## Feedback protocol\n\nWhen the user gives visual feedback (\"looks off\", \"太挤了\", \"not elegant\"), inspect the current render before asking them to choose a value. The render is the evidence; the user's negative label is the acceptance signal.\n\n1. Name the concrete defect in one sentence: page or surface, viewport or state, and whether it is density, hierarchy, alignment, type, color, cropping, or text fit.\n2. Lock the repair boundary: `target` is allowed to change; `preserve` names the adjacent pages, sections, content, and shared tokens that must stay stable. Ask only when two plausible targets would produce materially different artifacts.\n3. Make the smallest content, geometry, spacing, typography, crop, or token change that fixes the defect. Never hide a content problem by shrinking type first.\n4. Verify the affected matrix rather than one screenshot:\n   - PDF: target page, neighboring pages, total page count, font result, and every locale or template variant reached by a shared token.\n   - Screen: the breakpoint, tablet, and baseline matrix in `references/design.md` «Responsive screenshot verification»; every shipped locale; affected default, focus/selected, loading, empty/error, and transition states only when the surface has them.\n   - PPTX: editable source plus a rendered PDF or opened-deck inspection.\n   - Generated asset: target slot at its smallest display size plus sibling assets in the same deliverable.\n\nNever say \"I'll adjust the spacing\" without naming the exact property and its new value.\n\n**Escalate after two rounds.** If the same element is still not approved after two adjustment rounds, stop nudging values and produce one comparison artifact: the current state plus 2-3 labeled variants (A/B/C) of the same content in the product's actual frame and background, changing only the compared property. For choices with no objective criterion (typeface, accent color, logo), start there: a specimen sheet of up to 5 labeled half-page blocks with identical title-plus-paragraph content. After the pick, apply it everywhere and rebuild what it touches in the same round.\n\n## When not to use this skill\n\n- The user explicitly wants Material, Fluent, or a Tailwind default: a different design language.\n- Dark, cyberpunk, or futurist aesthetics (this is deliberately anti-future).\n- Saturated multi-color palettes (this has one accent).\n- Cartoon, animation, or illustration style (this is editorial).\n- Dynamic web app UI (this is for print and static documents).\n",".agents/plugins/marketplace.json":"{\n  \"name\": \"kami\",\n  \"interface\": {\n    \"displayName\": \"Kami\"\n  },\n  \"plugins\": [\n    {\n      \"name\": \"kami\",\n      \"source\": {\n        \"source\": \"local\",\n        \"path\": \"./plugins/kami\"\n      },\n      \"policy\": {\n        \"installation\": \"AVAILABLE\",\n        \"authentication\": \"ON_INSTALL\"\n      },\n      \"category\": \"Productivity\"\n    }\n  ]\n}\n","evals/equity-report-charts-en/prompt.md":"---\nplugins: [\"../../plugins/kami\"]\ntags: [equity-report, en, charts]\nmax_turns: 150\ntimeout_seconds: 2400\nallowed_tools: [Read, Glob, Grep, Skill, Bash, Write, Edit, TodoWrite]\n---\n\nWrite an equity research note as a PDF in the current directory. The company is Northgate Robotics, a made-up name for an internal training case, so use only the numbers below and add no outside data. Don't ask me questions, just finish it. Name the source file report.html and the PDF report.pdf.\n\n- Business: warehouse picking robots sold with a software subscription.\n- Revenue: FY2023 $412M, FY2024 $538M, FY2025 $701M. Show this as a bar or line chart.\n- FY2025 revenue mix: robot hardware 61%, software subscriptions 27%, services 12%. Show this as a donut chart.\n- Gross margin: FY2023 34.0%, FY2024 36.5%, FY2025 39.2%.\n- Share price $46, 180M shares outstanding.\n- Our view: FY2026 revenue $880M, rating Overweight, 12-month target price $58.\n- Risks: two customers make up 38% of revenue; a chip supply shortage could delay deliveries.\n","site/llms.txt":"# Kami\n\n> A warm parchment design system for AI-assisted professional documents. One accent color, serif fonts and clear heading levels, and consistent spacing.\n\n## Author\n- Name: Tw93\n- Site: https://tw93.fun\n- Stable entity ID: https://tw93.fun/#person\n\n\n## What is Kami\nKami gives AI agents templates and layout rules for documents and landing pages. It includes one-pagers, resumes, portfolios, slides, long documents, letters, equity reports, and changelogs. Defaults include a warm parchment background (#f5f4ed), ink-blue accents (#1B365D), and Charter/TsangerJinKai serif fonts. A white-background option is available for printing.\n\nKami installs into the agent that uses it and runs on that machine. There is no hosted Kami API, no account, and no API key: the integration surface is a local MCP server, JSON content schemas, and CLI checks.\n\n## When to use Kami\nReach for Kami when the user wants a finished document whose appearance matters, and a plain text answer would not be enough:\n- \"Make me a resume / CV\" -> `resume`\n- \"Turn this into a one-pager, product brief, or intro sheet\" -> `one-pager`\n- \"Write a formal letter, offer, or notice\" -> `letter`\n- \"Build a slide deck for this talk\" -> `slides` (PDF, or editable PPTX)\n- \"Write this research, spec, or report up as a document\" -> `long-doc`\n- \"Show my work, case studies, or portfolio\" -> `portfolio`\n- \"Analyze this company or stock and produce a report\" -> `equity-report`\n- \"Write release notes for this version\" -> `changelog`\n- \"Draw an architecture diagram, flowchart, timeline, or chart to embed\" -> one of 18 inline SVG diagram types\n- \"Build a landing page in this style\" -> browser-only `landing-page` template\n\nDo not reach for Kami for chat answers, code files, or content where the user only wants the text. Kami's cost is layout work; it pays off when the artifact is handed to someone else.\n\nHow an agent should call Kami: install the skill, fill the matching content schema, fill the template HTML, then finish with `python3 scripts/build.py --deliver filled.html content.json`, which runs every document check, renders the PDF, and exports page images for the perceptual pass, or drive the same steps as tools through the local MCP server. Judgment lives in SKILL.md; execution lives in the scripts.\n\n## Key Pages\n- [English showcase](https://kami.tw93.fun): Design system overview with live demos\n- [Developers](https://kami.tw93.fun/developers): Agent and developer integration surface\n- [About](https://kami.tw93.fun/about): What Kami is and who maintains it\n- [Contact](https://kami.tw93.fun/contact): Support and reporting channels\n- [Privacy](https://kami.tw93.fun/privacy): What this site and the skill collect\n- [Chinese showcase](https://kami.tw93.fun/index-zh.html): Chinese version\n- [Japanese showcase](https://kami.tw93.fun/index-ja.html): Japanese version (best-effort CJK path)\n- [Korean showcase](https://kami.tw93.fun/index-ko.html): Korean version (best-effort CJK path)\n- [Traditional Chinese showcase](https://kami.tw93.fun/index-tw.html): Traditional Chinese version\n- [GitHub](https://github.com/tw93/kami): Source code and templates\n\n## Install\n- Claude Code, Codex, Cursor, and other agents: `npx skills add tw93/kami -a claude-code codex cursor -g -y`\n- Claude Code plugin (v2.1.142+): `/plugin marketplace add tw93/kami` then `/plugin install kami@kami`\n- Codex plugin: `codex plugin marketplace add tw93/kami && codex plugin add kami@kami`\n- Claude Desktop: download the release asset `kami.zip` from GitHub Releases (not the source-code ZIP) and upload it via Customize > Skills > \"+\" > Create skill\n- MCP client: `claude mcp add kami -- python3 <checkout>/skills/kami/scripts/mcp_server.py`\n\n## Templates\n- 8 document template types: One-pager, Letter, Resume, Long document, Portfolio, Slides, Equity report, Changelog\n- 18 diagram types: architecture, architecture board, flowchart, quadrant, bar chart, line chart, donut chart, state machine, timeline, swimlane, tree, layer stack, venn, candlestick, waterfall, sequence, class, ER\n\n## Agent Interfaces\n- Content contracts: `references/schemas/<type>.json` carries the per-type structure and quality bar; new `content.json` files also carry an artifact `brief` with target, preserve boundary, evidence, and acceptance checks; validate before layout and check coverage after filling with `python3 scripts/build.py --check-content content.json [filled.html]`\n- Deterministic checks: placeholders, markdown residue, page density, orphan lines, slide rhythm, and a perceptual pass that exports page images with a fixed review checklist (`--check-visual`)\n- MCP server: `python3 scripts/mcp_server.py` speaks MCP over stdio with tools kami_templates / kami_doctor / kami_render / kami_check / kami_deliver / kami_screenshot, so agents can diagnose, render, and verify without loading the skill prompt\n\n## Machine-Readable Files\n- MCP server card: https://kami.tw93.fun/.well-known/mcp/server-card.json\n- Agent Skills index: https://kami.tw93.fun/.well-known/agent-skills/index.json\n- Skill definition: https://kami.tw93.fun/SKILL.md\n- Homepage as Markdown: https://kami.tw93.fun/index.md (a request to `/` carrying `Accept: text/markdown`, or `/?mode=agent`, redirects here)\n- Developer surface: https://kami.tw93.fun/developers.md and https://kami.tw93.fun/developers/llms.txt\n- Template and diagram catalog: https://kami.tw93.fun/feeds/catalog.jsonld (indexed by https://kami.tw93.fun/schemamap.xml)\n\n## Links\n- GitHub: https://github.com/tw93\n- Blog: https://tw93.fun\n- AI Profile: https://tw93.fun/llms-full.txt\n","AGENTS.md":"# Kami Agent Guide\n\n## Project\n\nKami is a document-generation skill and template system: self-contained editorial HTML\ntemplates rendered to PDF / PPTX / PNG, plus reference specs, demo assets, and a\npackaged skill archive. `SKILL.md` is the runtime manual for producing a document.\nThis file is the maintenance guide for changing the repository itself, and it records\nthe traps that a fresh read of the code does not reveal.\n\n## Layout\n\nOne repository, three top-level roles, and the install tools only ever copy the first:\n\n- `skills/kami/` is the skill and the only thing users install: `SKILL.md`,\n  `CHEATSHEET.md`, `VERSION`, `LICENSE`, `references/`, `scripts/`, and the light\n  `assets/` (templates, diagrams, logo, the two small font files). `npx skills add\n  tw93/kami` copies exactly this directory; `bash scripts/package-skill.sh` zips it\n  as `kami/` for Claude Desktop; `plugins/kami/skills/kami/` is a generated copy of it\n  inside the Claude and Codex plugin. Ignored render output lives in\n  `skills/kami/assets/examples/`. Every skill-relative path in `SKILL.md`\n  resolves inside this directory, so nothing here may reach up into the repo.\n- `site/` is kami.tw93.fun. The Vercel project's Root Directory is `site` (project\n  setting, not a file), so only this tree deploys and `site/vercel.json` is the only\n  Vercel config. It carries the pages, `styles.css`, `llms.txt`, `robots.txt`,\n  `sitemap.xml`, `vercel.json`, `.well-known/`, `feeds/`, and the heavy showcase and\n  demo assets. Skill facts it shows (`SKILL.md`, the discovery files) are generated\n  into it, never hand-copied. `/SKILL.md` and `/kami-skill.md` send\n  `X-Robots-Tag: noindex`: agents can still fetch the markdown, and search\n  engines should not score that file as an HTML page.\n- The root holds repository tooling only: `scripts/` (`build_metadata.py`,\n  `package-skill.sh`, `release_gate.py`, `draft-release-notes.py`, `tests/`),\n  `assets/fonts/` (the commercial TTFs; run `bash skills/kami/scripts/ensure-fonts.sh`\n  once after cloning to copy them into the skill's ignored `assets/fonts/`, otherwise\n  templates fall back to jsDelivr), `evals/` (the end-to-end skill eval suite, see\n  Evals below), `docs/`, and `.github/`.\n\nRun skill-side commands from `skills/kami/` (`cd skills/kami && python3\nscripts/build.py --check`); the paths below are written from that directory unless\nthey start with `scripts/build_metadata.py`, `scripts/package-skill.sh`,\n`scripts/release_gate.py`, or `scripts/tests/`, which live at the root. Paths under\n`site/`, `plugins/`, `docs/`, `.github/`, `.claude-plugin/`, and `.agents/` are also\nrelative to the repository root.\n\n## Repository Map\n\nOnly the entries whose role is not obvious from the filename:\n\n- `SKILL.md` - skill routing plus the document-side build and verify commands.\n  `CHEATSHEET.md` - quick design reference. Both ship inside the package.\n- `references/design.md`, `writing.md`, `production.md`, `diagrams.md` - full specs.\n  `production.md` Part 4 is the single source of truth for render failures, their\n  verified causes, and their fixes; add pitfalls there, not here.\n  `docs/release.md` - release notes, release flow, demo screenshot regeneration.\n  `anti-patterns.md`, `resume-writing.md`, `mermaid.md`, `deck-preflight.md`,\n  `brand-profile.md` and `brand.example.md` - scoped guides.\n- `references/tokens.json` (color tokens, drift-checked by `scripts/tokens.py`),\n  `references/mermaid-theme.json` (Kami to beautiful-mermaid theme, kept in sync with\n  `tokens.json`), `references/checks_thresholds.json` (rhythm / density / orphan /\n  visual thresholds read by `checks.py` and `visual.py`). These are live inputs to\n  gates: editing a number changes what passes.\n- `references/schemas/` - one JSON Schema subset per document type. The `$comment`\n  fields carry the per-field quality bar distilled from `writing.md`, so schema edits\n  and `writing.md` edits move together.\n- `scripts/shared.py` - the canonical registries (`HTML_TEMPLATES`,\n  `SCREEN_TEMPLATES`, `PPTX_TEMPLATES`, `MARP_TEMPLATES`, `DIAGRAM_TEMPLATES`) and each template's\n  `build_max_pages`. `build.py` derives its internal build targets from them;\n  Marp stays discovery-only because it uses an external CLI. Add or remove a\n  template or diagram here, never in a per-script dict.\n- `scripts/render.py` - the single render entry (`render_pdf`, `build_slides`, PDF\n  metadata stamping). `build.py`, `verify.py`, and `mcp_server.py` all call it; never\n  open a second WeasyPrint call site.\n- `scripts/diagram_geometry.py` checks annotated architecture SVG through the existing\n  lint entry points. Keep geometry in the actual rect/line/polyline attributes,\n  never a second JSON source. Mark node rectangles, edge shafts and label masks;\n  leave boundary frames and arrowheads unmarked. Static mask checks do not replace\n  rendered text-fit and arrowhead inspection.\n- `scripts/deliver.py` - `build.py --deliver`, the one command `SKILL.md` gives an\n  agent to finish a document: every document gate in a fixed order, the render, page\n  images, and a single READY / NOT READY verdict. It owns the order; the individual\n  `--check-*` flags stay for debugging one gate. Template family comes from content IR\n  `type`, else from stylesheet overlap with the registered templates.\n  `deliver(args, result)` also fills a dict with the same outcome for the MCP\n  `kami_deliver` tool; `mcp_server.DELIVER_GATE_RULES` maps every deliver gate to a\n  `kami_check` rule or declares it deliver-only, and `test_mcp` fails on a new gate\n  that is in neither.\n- `scripts/chart.py` - `build.py --chart` / `--check-charts`: data spec to SVG for\n  bar, line, hbar, donut, candlestick, and waterfall. Chart geometry lives only here;\n  each SVG embeds its spec in `data-kami-spec` and the drift gate regenerates and\n  compares the marks. The five chart files in `assets/diagrams/` are its output for\n  their demo data: change a chart's look in `chart.py` and regenerate them, never\n  edit their SVG by hand (`--check` fails on drift).\n- `scripts/brand_extract.py` - drafts a brand profile from a public website (colors,\n  fonts, logo candidates, one contrast-checked accent). It fetches only the page and\n  same-site stylesheets and never writes into `~/.config/kami/`.\n- `scripts/html_visibility.py` - shared static HTML/CSS visibility analysis for\n  `content.py` coverage and `checks.py` residue checks. Keep its conservative\n  coverage and residue modes distinct; it does not implement browser layout.\n- `scripts/tests/test_build.py` - the stable test entry point; sibling `test_*.py`\n  modules group tests by responsibility, with counters and fixtures in `support.py`.\n  `scripts/tests/corpus/<gate>/{flag,pass}/` is the labelled corpus for the PDF\n  gates (orphans, density, resume balance), rendered and judged by `test_corpus.py`.\n  Before changing a value in `checks_thresholds.json`, run it and read the per-gate\n  `CORPUS:` line; a fixture that flips is the cost of the change, not noise.\n- `scripts/mermaid_normalize.py` - re-themes a beautiful-mermaid SVG to the Kami\n  palette and makes it WeasyPrint-safe. Pure Python, no Node, ships in the package.\n- `scripts/mcp_server.py` - zero-dependency MCP stdio server exposing\n  `kami_templates` / `kami_doctor` / `kami_render` / `kami_check` /\n  `kami_deliver` / `kami_screenshot`, so an MCP-capable agent can diagnose, render, and verify\n  without reading `SKILL.md`. Register\n  with `claude mcp add kami -- python3 <checkout>/skills/kami/scripts/mcp_server.py`.\n- `scripts/math_render.py`, `scripts/mathjax_svg.js`, `scripts/ensure_mathjax.sh`,\n  `scripts/mathjax-runtime/` - strict LaTeX to MathJax SVG; `render.py` imports\n  `math_render`. This is the only Node dependency (Node 20 or 22+, refused otherwise),\n  installed on demand by `ensure_mathjax.sh` from the tracked `package-lock.json`;\n  all four ship in the package allowlist.\n- `scripts/site_facts.py` - public-site fact drift checks (install commands, version,\n  template and diagram counts across `site/index*.html`, the root `README.md`,\n  `site/llms.txt`), wired into `build.py --check`; it resolves those files through\n  `shared.REPO_ROOT` / `shared.SITE_ROOT` and skips itself in an installed skill.\n- `scripts/check-update.sh` - quiet daily update check invoked from `SKILL.md`;\n  writes a local cache marker, then resolves the latest published GitHub Release\n  at most once per day. It uploads no user document or task content and stays\n  silent on failure.\n- `site/assets/showcase/` - README and public-site screenshots only.\n  `site/assets/demos/` - README showcase demos. Neither is part of the skill.\n- `assets/diagrams/src/*.mmd` - Mermaid source of the sequence / class / er diagrams.\n  `assets/templates/marp/` - the Markdown-first Marp deck variant.\n- `dist/` is ignored. The release archive is built by `release.yml` from\n  `skills/kami` and uploaded as a release asset; nothing tracks it.\n- `plugins/kami/`, `.claude-plugin/marketplace.json`,\n  `.agents/plugins/marketplace.json`, and the site's discovery files are\n  **generated**; see Generated Mirrors below.\n- Public site surface under `site/`: `index.html` plus `index-zh|en|ja|ko|tw.html`,\n  the English-only prose pages `developers|about|contact|privacy.html`, `styles.css`,\n  `llms.txt`, `robots.txt`, `sitemap.xml`, `vercel.json`. `styles.css` is Kami's own site shell\n  (language switcher, gallery, responsive behavior, `.hero.doc` / `.prose` for the\n  prose pages); generic template rules never belong there.\n- Agent-facing site surface, also under `site/`: `index.md` (Markdown twin of the homepage; `vercel.json`\n  *redirects* `/` here for `Accept: text/markdown` and `/?mode=agent`, because Vercel\n  applies `rewrites` only after the filesystem and `/` always matches `index.html`),\n  `developers|about|contact|privacy.md`, `developers/llms.txt`, and the generated\n  `.well-known/agent-skills/index.json`, `.well-known/mcp/server-card.json`,\n  `feeds/catalog.jsonld`, `schemamap.xml`, `kami-skill.md` (served at `/SKILL.md` through a rewrite; it must not be named `SKILL.md`, or the skills CLI installs the site). Every new prose page needs its `.md` twin,\n  a `rewrites` entry for the extensionless URL, and a `sitemap.xml` row.\n  The `has`-conditioned redirects and the `Link` headers are only observable on a\n  deploy: verify them with `curl -sI` against the preview URL, never locally.\n- `.github/workflows/check.yml` (PR/push CI) and `release.yml` (tag-triggered build\n  and asset upload).\n\nReference docs are English-first and never forked per language. Inline CJK examples\nare fine where the rule itself is about CJK typography (term annotation, punctuation,\nspacing); language-specific output differences (CN/EN/KO) live in templates, not in\nduplicated reference files.\n\n## Commands\n\n`python3 scripts/build.py --help` prints the authoritative flag list and the module\nmap. Read it instead of trusting any copy; hand-maintained lists here have gone stale\nbefore. The commands it does not cover:\n\n```bash\n# from the repository root\npython3 scripts/build_metadata.py            # regenerate plugins/kami, marketplaces, site discovery files\npython3 scripts/build_metadata.py --check    # drift check for the same\nbash scripts/package-skill.sh dist/kami.zip  # build the Claude Desktop archive from skills/kami\npython3 scripts/tests/test_build.py          # full test suite\npython3 scripts/draft-release-notes.py V1.4.0..HEAD --version V1.4.1 --title \"Steadier Hand\"\nclaude plugin eval . --runs 2 --ablation none -j 4 --keep-temp --trust-plugin --no-publish \\\n  --threshold 0 --judge-model sonnet --allow-tools Bash Write Edit   # end-to-end skill evals\npython3 evals/score.py                       # deterministic gates over the newest eval run\n# from skills/kami\nbash scripts/ensure-fonts.sh                 # recover missing or truncated CJK fonts\npython3 scripts/mcp_server.py                # MCP stdio server (render / check / screenshot)\npython3 scripts/mermaid_normalize.py raw.svg -o clean.svg\n```\n\n## Working Rules\n\n- `SKILL.md` is loaded whole on every trigger, so it carries routing, the execution\n  contract, hard prohibitions, `--deliver`, and the feedback protocol, nothing else.\n  Type-specific procedure (page density, resume recruiter pass, landing site mode,\n  charts, illustrations) lives in the reference the tier table already sends the\n  agent to. Before adding a paragraph to `SKILL.md`, name the eval case it fixes;\n  before removing one, run the suite and compare against the last baseline.\n\n- Style changes must update `references/design.md` and the matching template tokens.\n- A CSS snippet in a reference doc is a shipped artifact, not prose: an agent copies\n  it before it reads a template. Every fenced `css` / `html` block is scanned by\n  `--check-docs` (inside `--check`) with the template rule set, and every `var()` it\n  names must resolve to a registered token or one a shipped template defines. Teach\n  from a component a template actually has; a recipe for assembling a new container\n  is how a document ends up carrying three unrelated emphasis languages. Tag a\n  deliberate counter-example inline with `/* avoid */` so the scan reads it as the\n  lesson rather than the violation.\n- A change touching template tokens, shared CSS gestures, or `references/design.md`\n  visual rules must rebuild the affected demo outputs (`site/assets/demos/*.pdf` / `*.png`)\n  in the same change, not as a later cleanup. Demos inline their CSS by copy, so they\n  silently keep the old style otherwise. Report the sweep: rebuilt N demos, K\n  unaffected. The off-palette guard in `scripts/lint.py` scans `site/assets/demos/*.html`\n  for stale hexes as a backstop, but it cannot see rendered PDFs or PNGs.\n  Repository scans must reject an empty expected demo set; installed skills may\n  skip the site because it is outside their distribution boundary. Test both modes\n  with a known violating demo whenever repository paths change.\n- Templates intentionally inline their CSS rather than share a `_kami.css` partial:\n  each template must stay a single self-contained HTML file the user can copy-paste\n  with no build step. Fix CSS drift by applying the same change across the affected\n  templates, never by introducing a build-time include.\n- For document or template tasks, lock the output contract before editing: language,\n  template, output format, page or length target, visual acceptance check, and\n  verification command.\n- Prefer the nearest existing template and deterministic verifier. Do not add a\n  template, shared CSS layer, dependency, script flag, or optional mode unless the\n  current request cannot be satisfied without it. A new template copies the nearest\n  existing one, stays aligned with `references/design.md`, and adds demo coverage; a\n  new document type also needs a schema in `references/schemas/`.\n- Slides default to WeasyPrint HTML-to-PDF templates unless the user explicitly needs\n  editable PPTX output.\n- Mermaid diagrams: never embed raw beautiful-mermaid SVG into a PDF-bound template.\n  WeasyPrint cannot resolve `color-mix()`, render `<foreignObject>`, or fetch a\n  runtime web font, so always pipe through `scripts/mermaid_normalize.py` first\n  (`--check` enforces this). `xychart-beta` is browser-only because it styles through\n  `<style>` class selectors; use the hand-drawn chart diagrams for PDF. Full flow in\n  `references/mermaid.md`.\n- Do not use graphic emoticons in docs, template comments, or script output. Use `OK:`\n  and `ERROR:` for script status text.\n- Do not use em dashes (U+2014) in repository docs, generated documents, template\n  comments, or site copy; use colons, commas, periods, or parentheses. Self-check:\n  `grep -rn \"$(printf '\\342\\200\\224')\" README.md site/llms.txt site/index*.html`. Teaching\n  counter-examples inside `references/anti-patterns.md` are exempt; its rule #28\n  covers the generated-document side.\n- For hosted-site or public-landing work, separate generic template work from Kami's\n  own website first. Generic behavior lives in `assets/templates/landing-page*` and\n  `references/`; Kami site facts live across `site/index*.html`, `site/styles.css`,\n  `README.md`, `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, and\n  `site/vercel.json`. Public facts are wider\n  than the hero: pricing, install path, version, release, support, analytics, FAQ, and\n  positioning claims move together across pages, metadata, AI files, and download\n  links. Do not leave a site-only analytics or tracking change contradicting the\n  \"no analytics\" copy elsewhere.\n- Landing or documentation-site work follows `references/design.md` Section 11 «Landing\n  Page (screen-first)»: its «Documentation site» subsection for the doc shell (sidebar\n  rail, on-this-page TOC, borderless prev/next pager), then the «Responsive\n  screenshot verification» subsection that closes the section (breakpoint, tablet, and baseline screenshots\n  per locale, objective line-widow scan) before shipping.\n- Content changes should avoid CSS churn unless layout behavior is part of the task.\n- Public copy states the product function before design terminology. Write each locale\n  naturally, preserve approved taglines and personal stories, and keep claims identical\n  across HTML, Markdown, metadata, and FAQ JSON-LD. Writing rules and schema comments\n  must not require poetic captions, invented benefits, numeric filler, or rewrite quotas.\n  Distinguish local document processing from update checks, remote assets, and the AI\n  provider’s data handling.\n- Brand profile support is optional context. Keep public examples in `references/`; do\n  not hard-code a maintainer's private local profile.\n- Demo, reference-example, and handoff content distilled from a maintainer's private\n  documents (resume, business proposal, pricing, client names) must be de-identified\n  before it lands in the repo: swap in public figures, public projects, or invented\n  generic data. Job-search, quote, and engagement-period fields count as sensitive\n  even without names. List the swapped-out identifying signals in the handoff report;\n  do not rely on the maintainer to spot leftovers.\n- Do not commit one-off review reports or diagnostic snapshots as durable docs.\n  Extract the stable rule into `AGENTS.md`, `SKILL.md`, or `references/`, then discard\n  the report.\n\n## Issue And PR Maintenance\n\n- Use official GitHub API or CLI for issue and PR work. Read the complete discussion,\n  associated PRs, current source, and relevant tests before deciding what to change.\n- Before each modification, check related local and live remote commits, branches,\n  worktrees, accessible existing agent conversations, and the project inventory.\n  Report the deduplication evidence and current owner before starting implementation.\n- Validate an existing fix rather than implementing it again. When another conversation\n  owns work in progress, leave implementation with that owner and report its verified\n  identifier and status. Do not modify another conversation's uncommitted work.\n- State access and inventory coverage gaps explicitly. A missing search result is not\n  evidence that nobody owns the work; do not bypass reading restrictions.\n- Perform development, builds, and tests in the user's local Mac checkout and\n  branch. Do not default to creating a new PR, opening a cloud execution environment,\n  or manually triggering remote CI. Preserve existing PRs and existing push-triggered\n  CI; do not disable or reconfigure them. Pushes may continue under applicable\n  specific authorization. Preserve the current branch while branch selection is\n  unclear; do not switch or merge into main based on this workflow preference.\n- Preserve the current checkout and user changes. Implement repairs on a separate\n  branch or worktree, locate the cause before targeted tests, and avoid concurrent\n  heavy builds. Never clean real user data to test a repair.\n- Close a duplicate, verified resolved item, or clearly unrelated report only when the\n  evidence and applicable user authorization support closure. Keep unresolved or\n  uncertain reports open; an empty queue is not a correctness goal.\n- Before implementing any change to a user interface, visual effect, interaction,\n  user-facing parameter, or configuration default, present the concrete change to\n  the user and obtain explicit confirmation. General repair or push authorization\n  does not replace this confirmation. Include the issue, original behavior, proposed\n  change, necessity, and alternatives. Pause and isolate any such unapproved work\n  already in progress; do not submit or ship it. Report any already pushed changes\n  accurately and do not roll them back without authorization. Internal repairs that\n  do not change user behavior may continue under their applicable authorization.\n- Confirm applicable authorization separately for commits, pushes, merges, and\n  releases. Distinguish code fixed, tests passed, committed, released, and user retested.\n- Keep reusable project guidance in this repository. Follow the existing rule above\n  for one-off reports and diagnostics; do not mix temporary run status, private paths,\n  personal information, or conversation identifiers into public maintenance guidance.\n- If there are no open issues or PRs, report the verified result without inventing\n  code changes or unnecessary repair branches.\n\n## Generated Mirrors\n\n`plugins/kami/skills/kami/` mirrors the distributable files from `skills/kami/`;\nthe two plugin manifests live in the outer `plugins/kami/` directory. The generated\ncopy excludes local fonts, render output, and caches. `.claude-plugin/marketplace.json`\nand `.agents/plugins/marketplace.json`\npoint at it. Edit `skills/kami/` only and let `python3 scripts/build_metadata.py\n--check` catch drift. Regenerate after any change under `skills/kami/`.\n\nThe same generator owns the site's machine-readable files under `site/`:\n`.well-known/agent-skills/index.json` (carries a SHA-256 digest of `SKILL.md`, so any\nskill edit changes it), `.well-known/mcp/server-card.json` (version plus the tool list\nparsed out of `scripts/mcp_server.py` without importing it), `feeds/catalog.jsonld`\n(built from `HTML_TEMPLATES` / `DIAGRAM_TEMPLATES`), `schemamap.xml`, and\n`kami-skill.md` (the copy served at `/SKILL.md`). Never hand-edit these; change the source and\nregenerate.\n\nMarketplace, plugin path, version, or install-path changes need runtime installation\nproof, not metadata proof. Claude Code: an isolated `HOME=/tmp/...` smoke with\n`claude plugin marketplace add <path>`, `claude plugin install kami@kami`,\n`claude plugin details kami@kami`, confirming the installed cache is the lightweight\n`plugins/kami` tree. Codex: an isolated `CODEX_HOME=/tmp/...` smoke with\n`codex plugin marketplace add <path>`, `codex plugin add kami@kami`,\n`codex plugin list`.\n\n## Refactor And Packaging Hard Stops\n\n- The shipped archive must be the output of `bash scripts/package-skill.sh`: a\n  top-level `kami/` directory under a 6 MB ceiling. A hand-zipped checkout is\n  rejected on size.\n- `scripts/package-skill.sh` packages `git ls-files skills/kami`, so an untracked new\n  module passes every local import and silently disappears from the archive. When\n  adding a runtime module, confirm it is tracked by Git before calling the change done.\n- The archive is not tracked. `release.yml` builds it from the tagged commit and\n  uploads it, so a fix reaches `npx skills add` and plugin installs on the next `main`\n  push but reaches Claude Desktop users only at the next release; name the channel\n  that actually carries the fix before saying \"fixed, please update\".\n- A versioned release must come from a commit reachable from `origin/main` with a\n  successful exact-SHA `check.yml` run triggered by a `main` push. Published\n  same-version assets are immutable in practice: a rerun may reuse `kami.zip` only\n  when its entry names and payloads are identical, otherwise cut a new patch version.\n- If `python3 scripts/build.py --verify` fails only because the host Python lacks PPTX\n  fallback dependencies such as `python-pptx`, verify `slides` and `slides-en` from a\n  temporary venv instead of treating the environment miss as a source regression.\n- Resume templates (`assets/templates/resume.html`, `resume-en.html`, `resume-ko.html`) carry a two-page\n  contract. Do not fix overflow by shrinking type or spacing globally first. Verify\n  with `python3 scripts/build.py --verify resume`, `--verify resume-en`, and `--verify resume-ko`.\n- Demo files such as `site/assets/demos/demo-resume-ko.html` own demo content, not the\n  template contract. Durable rules go into templates or `references/`.\n\n## CI Gotchas\n\nApplies when editing `.github/workflows/*.yml` or adding a test with a heavy\ndependency.\n\n- `check.yml` has two jobs. `lint-and-test` runs dependency-light lint, metadata,\n  and package gates. `verify-render` installs `weasyprint` / `pypdf` / `PyMuPDF` /\n  `Pygments` / `python-pptx`, sets up Node 22 and runs `bash scripts/ensure_mathjax.sh`, then\n  installs the checkout with `npx skills add` under a throwaway `HOME` and asserts\n  the bare install is the kami skill alone (`SKILL.md` and `scripts/build.py`\n  present, no `index.html`, no `site/`, no `TsangerJinKai02-W04.ttf`, unpacked tree\n  under 6000 KB, a separate ceiling from the 6 MB ZIP limit under Refactor And\n  Packaging Hard Stops), which is why a layout or size regression surfaces under a\n  job named `render and verify`. It then runs the full test suite before template\n  verification, including the three unlimited-page long-doc targets for rendered\n  TOC counters. Tests that need an optional render dependency use the suite's\n  explicit `SKIP:` counter and fail when a CI-required dependency is unavailable;\n  never turn a skip into `OK:`.\n- CI installs its Python dependencies and the skills CLI unpinned on purpose: users\n  install the same unpinned way, so an upstream release that breaks Kami should turn\n  CI red before it reaches them.\n- Validate workflow edits with the CI run for the exact pushed commit on the authorized\n  branch; do not create a feature branch solely for validation. A local pass does not\n  prove CI font or dependency availability: check cache manifests, Ubuntu fallback\n  fonts (DejaVu / Liberation), and the absence of commercial fonts (Charter / TsangerJinKai02).\n- Host-versus-CI differences are expressed as explicit opt-in env vars, currently\n  `KAMI_ALLOW_FALLBACK_ONLY` (accept fallback fonts), `KAMI_AUTHOR`, `KAMI_FONT_DIR`,\n  `KAMI_PACKAGE_ROOT_NAME`, `KAMI_PACKAGE_MAX_BYTES`, and `KAMI_UPDATE_URL`. That is\n  already the ceiling: before adding another, move the behavior into a `--ci-mode`\n  flag or a config file rather than letting `KAMI_*` sprawl.\n\n## Current Risk Areas\n\n- WeasyPrint rendering is sensitive to font availability, solid hex tag backgrounds,\n  page breaks, CJK fallback, and synthetic bold. Verify visually for template changes.\n- Slide output has three paths: `slides-weasy*.html` for default PDF decks,\n  `slides*.py` for the editable PPTX fallback, and\n  `assets/templates/marp/slides-marp*.{md,css}` for Markdown-first Marp decks.\n- Marp theme CSS inlines a full copy of the design tokens because Marp themes must be\n  self-contained. `build.py --sync` / `--check` token-sync those files and the CSS\n  lint rules scan them (both walk `shared.iter_template_files`), so token drift is\n  caught. The remaining hole: the off-palette hex guard globs `*.html` only\n  (`TEMPLATES/*.html` and `site/assets/demos/*.html`), so an off-palette color in Marp CSS\n  still needs eyeball review.\n- Resume targets require exactly two pages in all three language variants. Other\n  `build_max_pages` values in `scripts/shared.py` are ceilings (one-pager 1, letter 1,\n  changelog 2, equity-report 3; long-doc, portfolio, and slides-weasy are `0` =\n  unlimited). Other undershooting documents are not flagged, so \"this long-doc came out\n  at 3 pages\" is an authoring judgment call, not a gate failure. Landing pages are\n  browser-only HTML with no page count at all.\n- `scripts/render.py` sets PDF `/Author` from `git config user.name` or `KAMI_AUTHOR`\n  only when the template still holds an author placeholder. `/Producer` and `/Creator`\n  stay `Kami`.\n- Long-doc TOCs use WeasyPrint `target-counter()` and stable chapter ids for rendered\n  page numbers; do not reintroduce hand-written `.toc-page` spans. The row anchor must\n  stay `display: block` with the numeral floated right: WeasyPrint 70.0 resolves\n  `target-counter` to 0 on a flex anchor, and a `0` is valid-looking text that only the\n  `--verify` link cross-check catches (production.md pitfall 24). Running headers\n  default to `h1`. If a filled document does not use `h1` for chapter titles, add\n  `.running-title` to the element that should drive the header.\n- AI and public visibility spans `site/index*.html`, `site/llms.txt`, `site/robots.txt`,\n  `site/sitemap.xml`, FAQ JSON-LD, README install text, diagram counts, and release archive\n  links. Diagram count and names must stay aligned across `SKILL.md`, `CHEATSHEET.md`,\n  `README.md`, `index*.html`, and `assets/diagrams/`.\n\n## Critical Line-Break Scan\n\nApplies before handing off any user-visible typeset deliverable (rendered PDF,\n`README.md`, public site page).\n\n- Scan page by page for three wrap candidates: a trailing line of only 1-2 words\n  (orphan), a line one word away from wrapping, and a line that wraps early without\n  filling its container. Confirm each in rendered context; an intentional short line\n  is valid and does not need rewriting to make the count zero.\n- Split the work: `python3 scripts/build.py --check-orphans <pdf>` and\n  `--check-density <pdf>` catch PDF orphans and sparse pages deterministically; the\n  manual pass covers what they cannot see, near-wrap and premature-wrap states inside\n  a page, plus non-PDF surfaces (README and the responsive matrix in `references/design.md`).\n- One confirmed defect means a whole-document sweep for that class, not a single-spot fix. Check container geometry and forced breaks before shortening copy; preserve\n  facts and approved wording. Do not shrink type to dodge a wrap; deliberate layout\n  changes must re-pass `python3 scripts/build.py --check` and the page-count\n  contract.\n\n## Evals\n\n`evals/<case>/` holds end-to-end cases for `claude plugin eval`: a realistic request\nwith invented data (`prompt.md`), and graders for skill trigger, PDF (or HTML)\ncreation, and unfilled placeholders, plus fact fidelity in the HTML. Fact fidelity is\na `regex` grader wherever the facts are literal (one-pager-en, resume-cn): LLM judges\nsplit on derived figures and reported false FAILs on outputs whose facts were all\npresent. Keep an LLM judge only for what a pattern cannot read (Korean-only text,\nassertion titles, arithmetic). `evals/score.py` then applies Kami's own gates to each\nkept run workspace (page contract, atomic facts in the PDF text, fonts, density,\nresidue, style, resume balance, generated chart count), which the harness cannot run\nitself; it is read-only unless given `--write`, which saves `gate-scores.json`. One\nsuite run is 9 cases, 18 document builds at `--runs 2`, at roughly $1-3 each.\n\n- Run it after any change to `SKILL.md`, a reference the tier table routes to, a\n  template, or a gate an agent relies on, and compare against the previous run on the\n  same cases; one run per case is noise, use `--runs 2` or more.\n- The harness reads the plugin from `plugins/kami` live. Never run\n  `scripts/build_metadata.py` while a suite is running, and regenerate it before a run\n  so the suite tests the current skill.\n- A file grader takes an exact path; globs such as `*.html` fail with \"path does not\n  exist\". Every prompt pins its output file names for that reason.\n- Kept workspaces live under `/private/tmp/e-*/sealed/home/cwd` with mode 000;\n  `score.py` opens them itself. Results stay in the ignored `evals/results/`.\n- Mathematics is not covered: the sandbox cannot install the MathJax runtime.\n- LLM fidelity rubrics carry the case's full brief, because a judge that sees only a\n  partial fact list fails supplied facts as invented. On artifacts over about 15k\n  characters the harness judge is unreliable: before treating its FAIL as real,\n  re-judge the stored `evidence` HTML with the same rubric (`claude -p --model sonnet`)\n  and read the stated reason. In the 2026-10-15 baseline that split four failing cases\n  into two noisy votes and two real unlabelled derived figures.\n- resume-cn deliberately supplies thin notes (three employers, eight bullets). The\n  expected behavior is two honest pages with `[DATA NEEDED]` gaps and a reported\n  balance shortfall (`references/resume-writing.md` «Thin source»). `--deliver` and\n  `score.py` both read that through `checks.resume_thin_source` and treat it as a\n  reported gap rather than a balance failure.\n\n## Verification\n\n`SKILL.md` «5 · Deliver» owns the document side: `build.py --deliver` runs every\ndocument gate (placeholders, math, residue, style, content coverage, render, page\ncontract, resume balance, fonts, density, orphans, page images) in order and ends\nin one verdict. This section covers the maintenance side only.\n\n- Template or CSS changes: `python3 scripts/build.py --check` (CSS lint, token sync,\n  base/variant cross-template `:root` consistency, currently CN to EN and CN to KO)\n  plus `--verify` for the affected targets, or full `--verify` when the change is\n  cross-template.\n- Script changes: `python3 scripts/tests/test_build.py` and\n  `python3 scripts/build.py --check`. Run full `--verify` only when the render\n  pipeline itself changed (`render.py`, `verify.py`, WeasyPrint handling).\n- Font-stack changes (any `--serif` / `--mono` / SVG `text` chain): rebuild the\n  examples, then `python3 scripts/build.py --check-fonts assets/examples/*.pdf`. The\n  page-count contract cannot see which family actually drew the text, and a wrong one\n  renders cleanly; this is how the diagram labels were found splitting mid-word across\n  two faces.\n- Demo changes: regenerate the affected demo outputs and confirm page counts stay in\n  range. Font issues: `bash scripts/ensure-fonts.sh`, then rebuild the target.\n- MCP server changes: smoke the stdio protocol end to end (initialize, tools/list, one\n  tools/call per changed tool) through a scripted stdin session, and check that output\n  stays newline-delimited JSON with no stray prints on stdout.\n- Packaging changes: `bash scripts/package-skill.sh dist/kami.zip`, then `unzip -l\n  dist/kami.zip` to inspect for accidental large fonts, cache files, or a missing new\n  helper.\n- Marketplace or plugin changes: `python3 scripts/build_metadata.py --check` plus the\n  isolated install smoke described under Generated Mirrors.\n- Public site or AI visibility changes: check `site/index*.html`, README,\n  `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, JSON-LD, FAQ, install links, and download links\n  together, then serve the page and verify the responsive matrix in\n  `references/design.md` per locale.\n\n## Fonts\n\n`references/production.md` Part 1 «Fonts» owns the full stack: per-language family\nchains, fallbacks, `@font-face` paths, and the recovery flow. Two facts that must not\ndrift out of it:\n\n- `Source Han Serif KR` is the real family name inside the bundled OTFs and must stay\n  in every Korean fallback chain, otherwise fontconfig cannot resolve the\n  `ensure-fonts.sh`-downloaded font by name on an offline Linux skill install.\n- CJK families lead every stack that CJK text can reach, Latin faces trail. A leading\n  Latin serif ends the stack walk for characters it lacks, which sends each ideograph\n  to fontconfig separately and splits words across two faces inside inline SVG\n  (`production.md` pitfall #4.1). The `-en` templates are the deliberate exception:\n  they are Latin documents, so `Charter` stays first there.\n- The commercial TsangerJinKai02 files never ship inside the skill package, so a\n  sandboxed install has no primary CJK serif and falls through the chain. Keep the\n  chain wide (Source Han Serif SC and CN, Noto Serif CJK SC and Noto Serif SC, Songti\n  SC, STSong, SimSun) so it lands on some serif rather than a system sans.\n- `bash scripts/ensure-fonts.sh` downloads into the XDG user font dir\n  (`${XDG_DATA_HOME:-~/.local/share}/fonts/kami`, override with `KAMI_FONT_DIR`),\n  never into the skill's `assets/fonts`, so an installed Claude Desktop skill stays\n  small. Inside a repo checkout it first restores missing or truncated font files from the root\n  `assets/fonts/` into the skill's ignored font directory. It downloads to the user\n  font directory only when usable fonts are still missing. Commercial use of TsangerJinKai02 requires\n  the appropriate license.\n\n## Releasing\n\n`docs/release.md` owns release notes format, the tag and asset flow, and demo\nscreenshot regeneration commands. Read it when cutting or refreshing a release.\n","CLAUDE.md":"# Kami Agent Guide\n\n## Project\n\nKami is a document-generation skill and template system: self-contained editorial HTML\ntemplates rendered to PDF / PPTX / PNG, plus reference specs, demo assets, and a\npackaged skill archive. `SKILL.md` is the runtime manual for producing a document.\nThis file is the maintenance guide for changing the repository itself, and it records\nthe traps that a fresh read of the code does not reveal.\n\n## Layout\n\nOne repository, three top-level roles, and the install tools only ever copy the first:\n\n- `skills/kami/` is the skill and the only thing users install: `SKILL.md`,\n  `CHEATSHEET.md`, `VERSION`, `LICENSE`, `references/`, `scripts/`, and the light\n  `assets/` (templates, diagrams, logo, the two small font files). `npx skills add\n  tw93/kami` copies exactly this directory; `bash scripts/package-skill.sh` zips it\n  as `kami/` for Claude Desktop; `plugins/kami/skills/kami/` is a generated copy of it\n  inside the Claude and Codex plugin. Ignored render output lives in\n  `skills/kami/assets/examples/`. Every skill-relative path in `SKILL.md`\n  resolves inside this directory, so nothing here may reach up into the repo.\n- `site/` is kami.tw93.fun. The Vercel project's Root Directory is `site` (project\n  setting, not a file), so only this tree deploys and `site/vercel.json` is the only\n  Vercel config. It carries the pages, `styles.css`, `llms.txt`, `robots.txt`,\n  `sitemap.xml`, `vercel.json`, `.well-known/`, `feeds/`, and the heavy showcase and\n  demo assets. Skill facts it shows (`SKILL.md`, the discovery files) are generated\n  into it, never hand-copied. `/SKILL.md` and `/kami-skill.md` send\n  `X-Robots-Tag: noindex`: agents can still fetch the markdown, and search\n  engines should not score that file as an HTML page.\n- The root holds repository tooling only: `scripts/` (`build_metadata.py`,\n  `package-skill.sh`, `release_gate.py`, `draft-release-notes.py`, `tests/`),\n  `assets/fonts/` (the commercial TTFs; run `bash skills/kami/scripts/ensure-fonts.sh`\n  once after cloning to copy them into the skill's ignored `assets/fonts/`, otherwise\n  templates fall back to jsDelivr), `evals/` (the end-to-end skill eval suite, see\n  Evals below), `docs/`, and `.github/`.\n\nRun skill-side commands from `skills/kami/` (`cd skills/kami && python3\nscripts/build.py --check`); the paths below are written from that directory unless\nthey start with `scripts/build_metadata.py`, `scripts/package-skill.sh`,\n`scripts/release_gate.py`, or `scripts/tests/`, which live at the root. Paths under\n`site/`, `plugins/`, `docs/`, `.github/`, `.claude-plugin/`, and `.agents/` are also\nrelative to the repository root.\n\n## Repository Map\n\nOnly the entries whose role is not obvious from the filename:\n\n- `SKILL.md` - skill routing plus the document-side build and verify commands.\n  `CHEATSHEET.md` - quick design reference. Both ship inside the package.\n- `references/design.md`, `writing.md`, `production.md`, `diagrams.md` - full specs.\n  `production.md` Part 4 is the single source of truth for render failures, their\n  verified causes, and their fixes; add pitfalls there, not here.\n  `docs/release.md` - release notes, release flow, demo screenshot regeneration.\n  `anti-patterns.md`, `resume-writing.md`, `mermaid.md`, `deck-preflight.md`,\n  `brand-profile.md` and `brand.example.md` - scoped guides.\n- `references/tokens.json` (color tokens, drift-checked by `scripts/tokens.py`),\n  `references/mermaid-theme.json` (Kami to beautiful-mermaid theme, kept in sync with\n  `tokens.json`), `references/checks_thresholds.json` (rhythm / density / orphan /\n  visual thresholds read by `checks.py` and `visual.py`). These are live inputs to\n  gates: editing a number changes what passes.\n- `references/schemas/` - one JSON Schema subset per document type. The `$comment`\n  fields carry the per-field quality bar distilled from `writing.md`, so schema edits\n  and `writing.md` edits move together.\n- `scripts/shared.py` - the canonical registries (`HTML_TEMPLATES`,\n  `SCREEN_TEMPLATES`, `PPTX_TEMPLATES`, `MARP_TEMPLATES`, `DIAGRAM_TEMPLATES`) and each template's\n  `build_max_pages`. `build.py` derives its internal build targets from them;\n  Marp stays discovery-only because it uses an external CLI. Add or remove a\n  template or diagram here, never in a per-script dict.\n- `scripts/render.py` - the single render entry (`render_pdf`, `build_slides`, PDF\n  metadata stamping). `build.py`, `verify.py`, and `mcp_server.py` all call it; never\n  open a second WeasyPrint call site.\n- `scripts/diagram_geometry.py` checks annotated architecture SVG through the existing\n  lint entry points. Keep geometry in the actual rect/line/polyline attributes,\n  never a second JSON source. Mark node rectangles, edge shafts and label masks;\n  leave boundary frames and arrowheads unmarked. Static mask checks do not replace\n  rendered text-fit and arrowhead inspection.\n- `scripts/deliver.py` - `build.py --deliver`, the one command `SKILL.md` gives an\n  agent to finish a document: every document gate in a fixed order, the render, page\n  images, and a single READY / NOT READY verdict. It owns the order; the individual\n  `--check-*` flags stay for debugging one gate. Template family comes from content IR\n  `type`, else from stylesheet overlap with the registered templates.\n  `deliver(args, result)` also fills a dict with the same outcome for the MCP\n  `kami_deliver` tool; `mcp_server.DELIVER_GATE_RULES` maps every deliver gate to a\n  `kami_check` rule or declares it deliver-only, and `test_mcp` fails on a new gate\n  that is in neither.\n- `scripts/chart.py` - `build.py --chart` / `--check-charts`: data spec to SVG for\n  bar, line, hbar, donut, candlestick, and waterfall. Chart geometry lives only here;\n  each SVG embeds its spec in `data-kami-spec` and the drift gate regenerates and\n  compares the marks. The five chart files in `assets/diagrams/` are its output for\n  their demo data: change a chart's look in `chart.py` and regenerate them, never\n  edit their SVG by hand (`--check` fails on drift).\n- `scripts/brand_extract.py` - drafts a brand profile from a public website (colors,\n  fonts, logo candidates, one contrast-checked accent). It fetches only the page and\n  same-site stylesheets and never writes into `~/.config/kami/`.\n- `scripts/html_visibility.py` - shared static HTML/CSS visibility analysis for\n  `content.py` coverage and `checks.py` residue checks. Keep its conservative\n  coverage and residue modes distinct; it does not implement browser layout.\n- `scripts/tests/test_build.py` - the stable test entry point; sibling `test_*.py`\n  modules group tests by responsibility, with counters and fixtures in `support.py`.\n  `scripts/tests/corpus/<gate>/{flag,pass}/` is the labelled corpus for the PDF\n  gates (orphans, density, resume balance), rendered and judged by `test_corpus.py`.\n  Before changing a value in `checks_thresholds.json`, run it and read the per-gate\n  `CORPUS:` line; a fixture that flips is the cost of the change, not noise.\n- `scripts/mermaid_normalize.py` - re-themes a beautiful-mermaid SVG to the Kami\n  palette and makes it WeasyPrint-safe. Pure Python, no Node, ships in the package.\n- `scripts/mcp_server.py` - zero-dependency MCP stdio server exposing\n  `kami_templates` / `kami_doctor` / `kami_render` / `kami_check` /\n  `kami_deliver` / `kami_screenshot`, so an MCP-capable agent can diagnose, render, and verify\n  without reading `SKILL.md`. Register\n  with `claude mcp add kami -- python3 <checkout>/skills/kami/scripts/mcp_server.py`.\n- `scripts/math_render.py`, `scripts/mathjax_svg.js`, `scripts/ensure_mathjax.sh`,\n  `scripts/mathjax-runtime/` - strict LaTeX to MathJax SVG; `render.py` imports\n  `math_render`. This is the only Node dependency (Node 20 or 22+, refused otherwise),\n  installed on demand by `ensure_mathjax.sh` from the tracked `package-lock.json`;\n  all four ship in the package allowlist.\n- `scripts/site_facts.py` - public-site fact drift checks (install commands, version,\n  template and diagram counts across `site/index*.html`, the root `README.md`,\n  `site/llms.txt`), wired into `build.py --check`; it resolves those files through\n  `shared.REPO_ROOT` / `shared.SITE_ROOT` and skips itself in an installed skill.\n- `scripts/check-update.sh` - quiet daily update check invoked from `SKILL.md`;\n  writes a local cache marker, then resolves the latest published GitHub Release\n  at most once per day. It uploads no user document or task content and stays\n  silent on failure.\n- `site/assets/showcase/` - README and public-site screenshots only.\n  `site/assets/demos/` - README showcase demos. Neither is part of the skill.\n- `assets/diagrams/src/*.mmd` - Mermaid source of the sequence / class / er diagrams.\n  `assets/templates/marp/` - the Markdown-first Marp deck variant.\n- `dist/` is ignored. The release archive is built by `release.yml` from\n  `skills/kami` and uploaded as a release asset; nothing tracks it.\n- `plugins/kami/`, `.claude-plugin/marketplace.json`,\n  `.agents/plugins/marketplace.json`, and the site's discovery files are\n  **generated**; see Generated Mirrors below.\n- Public site surface under `site/`: `index.html` plus `index-zh|en|ja|ko|tw.html`,\n  the English-only prose pages `developers|about|contact|privacy.html`, `styles.css`,\n  `llms.txt`, `robots.txt`, `sitemap.xml`, `vercel.json`. `styles.css` is Kami's own site shell\n  (language switcher, gallery, responsive behavior, `.hero.doc` / `.prose` for the\n  prose pages); generic template rules never belong there.\n- Agent-facing site surface, also under `site/`: `index.md` (Markdown twin of the homepage; `vercel.json`\n  *redirects* `/` here for `Accept: text/markdown` and `/?mode=agent`, because Vercel\n  applies `rewrites` only after the filesystem and `/` always matches `index.html`),\n  `developers|about|contact|privacy.md`, `developers/llms.txt`, and the generated\n  `.well-known/agent-skills/index.json`, `.well-known/mcp/server-card.json`,\n  `feeds/catalog.jsonld`, `schemamap.xml`, `kami-skill.md` (served at `/SKILL.md` through a rewrite; it must not be named `SKILL.md`, or the skills CLI installs the site). Every new prose page needs its `.md` twin,\n  a `rewrites` entry for the extensionless URL, and a `sitemap.xml` row.\n  The `has`-conditioned redirects and the `Link` headers are only observable on a\n  deploy: verify them with `curl -sI` against the preview URL, never locally.\n- `.github/workflows/check.yml` (PR/push CI) and `release.yml` (tag-triggered build\n  and asset upload).\n\nReference docs are English-first and never forked per language. Inline CJK examples\nare fine where the rule itself is about CJK typography (term annotation, punctuation,\nspacing); language-specific output differences (CN/EN/KO) live in templates, not in\nduplicated reference files.\n\n## Commands\n\n`python3 scripts/build.py --help` prints the authoritative flag list and the module\nmap. Read it instead of trusting any copy; hand-maintained lists here have gone stale\nbefore. The commands it does not cover:\n\n```bash\n# from the repository root\npython3 scripts/build_metadata.py            # regenerate plugins/kami, marketplaces, site discovery files\npython3 scripts/build_metadata.py --check    # drift check for the same\nbash scripts/package-skill.sh dist/kami.zip  # build the Claude Desktop archive from skills/kami\npython3 scripts/tests/test_build.py          # full test suite\npython3 scripts/draft-release-notes.py V1.4.0..HEAD --version V1.4.1 --title \"Steadier Hand\"\nclaude plugin eval . --runs 2 --ablation none -j 4 --keep-temp --trust-plugin --no-publish \\\n  --threshold 0 --judge-model sonnet --allow-tools Bash Write Edit   # end-to-end skill evals\npython3 evals/score.py                       # deterministic gates over the newest eval run\n# from skills/kami\nbash scripts/ensure-fonts.sh                 # recover missing or truncated CJK fonts\npython3 scripts/mcp_server.py                # MCP stdio server (render / check / screenshot)\npython3 scripts/mermaid_normalize.py raw.svg -o clean.svg\n```\n\n## Working Rules\n\n- `SKILL.md` is loaded whole on every trigger, so it carries routing, the execution\n  contract, hard prohibitions, `--deliver`, and the feedback protocol, nothing else.\n  Type-specific procedure (page density, resume recruiter pass, landing site mode,\n  charts, illustrations) lives in the reference the tier table already sends the\n  agent to. Before adding a paragraph to `SKILL.md`, name the eval case it fixes;\n  before removing one, run the suite and compare against the last baseline.\n\n- Style changes must update `references/design.md` and the matching template tokens.\n- A CSS snippet in a reference doc is a shipped artifact, not prose: an agent copies\n  it before it reads a template. Every fenced `css` / `html` block is scanned by\n  `--check-docs` (inside `--check`) with the template rule set, and every `var()` it\n  names must resolve to a registered token or one a shipped template defines. Teach\n  from a component a template actually has; a recipe for assembling a new container\n  is how a document ends up carrying three unrelated emphasis languages. Tag a\n  deliberate counter-example inline with `/* avoid */` so the scan reads it as the\n  lesson rather than the violation.\n- A change touching template tokens, shared CSS gestures, or `references/design.md`\n  visual rules must rebuild the affected demo outputs (`site/assets/demos/*.pdf` / `*.png`)\n  in the same change, not as a later cleanup. Demos inline their CSS by copy, so they\n  silently keep the old style otherwise. Report the sweep: rebuilt N demos, K\n  unaffected. The off-palette guard in `scripts/lint.py` scans `site/assets/demos/*.html`\n  for stale hexes as a backstop, but it cannot see rendered PDFs or PNGs.\n  Repository scans must reject an empty expected demo set; installed skills may\n  skip the site because it is outside their distribution boundary. Test both modes\n  with a known violating demo whenever repository paths change.\n- Templates intentionally inline their CSS rather than share a `_kami.css` partial:\n  each template must stay a single self-contained HTML file the user can copy-paste\n  with no build step. Fix CSS drift by applying the same change across the affected\n  templates, never by introducing a build-time include.\n- For document or template tasks, lock the output contract before editing: language,\n  template, output format, page or length target, visual acceptance check, and\n  verification command.\n- Prefer the nearest existing template and deterministic verifier. Do not add a\n  template, shared CSS layer, dependency, script flag, or optional mode unless the\n  current request cannot be satisfied without it. A new template copies the nearest\n  existing one, stays aligned with `references/design.md`, and adds demo coverage; a\n  new document type also needs a schema in `references/schemas/`.\n- Slides default to WeasyPrint HTML-to-PDF templates unless the user explicitly needs\n  editable PPTX output.\n- Mermaid diagrams: never embed raw beautiful-mermaid SVG into a PDF-bound template.\n  WeasyPrint cannot resolve `color-mix()`, render `<foreignObject>`, or fetch a\n  runtime web font, so always pipe through `scripts/mermaid_normalize.py` first\n  (`--check` enforces this). `xychart-beta` is browser-only because it styles through\n  `<style>` class selectors; use the hand-drawn chart diagrams for PDF. Full flow in\n  `references/mermaid.md`.\n- Do not use graphic emoticons in docs, template comments, or script output. Use `OK:`\n  and `ERROR:` for script status text.\n- Do not use em dashes (U+2014) in repository docs, generated documents, template\n  comments, or site copy; use colons, commas, periods, or parentheses. Self-check:\n  `grep -rn \"$(printf '\\342\\200\\224')\" README.md site/llms.txt site/index*.html`. Teaching\n  counter-examples inside `references/anti-patterns.md` are exempt; its rule #28\n  covers the generated-document side.\n- For hosted-site or public-landing work, separate generic template work from Kami's\n  own website first. Generic behavior lives in `assets/templates/landing-page*` and\n  `references/`; Kami site facts live across `site/index*.html`, `site/styles.css`,\n  `README.md`, `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, and\n  `site/vercel.json`. Public facts are wider\n  than the hero: pricing, install path, version, release, support, analytics, FAQ, and\n  positioning claims move together across pages, metadata, AI files, and download\n  links. Do not leave a site-only analytics or tracking change contradicting the\n  \"no analytics\" copy elsewhere.\n- Landing or documentation-site work follows `references/design.md` Section 11 «Landing\n  Page (screen-first)»: its «Documentation site» subsection for the doc shell (sidebar\n  rail, on-this-page TOC, borderless prev/next pager), then the «Responsive\n  screenshot verification» subsection that closes the section (breakpoint, tablet, and baseline screenshots\n  per locale, objective line-widow scan) before shipping.\n- Content changes should avoid CSS churn unless layout behavior is part of the task.\n- Public copy states the product function before design terminology. Write each locale\n  naturally, preserve approved taglines and personal stories, and keep claims identical\n  across HTML, Markdown, metadata, and FAQ JSON-LD. Writing rules and schema comments\n  must not require poetic captions, invented benefits, numeric filler, or rewrite quotas.\n  Distinguish local document processing from update checks, remote assets, and the AI\n  provider’s data handling.\n- Brand profile support is optional context. Keep public examples in `references/`; do\n  not hard-code a maintainer's private local profile.\n- Demo, reference-example, and handoff content distilled from a maintainer's private\n  documents (resume, business proposal, pricing, client names) must be de-identified\n  before it lands in the repo: swap in public figures, public projects, or invented\n  generic data. Job-search, quote, and engagement-period fields count as sensitive\n  even without names. List the swapped-out identifying signals in the handoff report;\n  do not rely on the maintainer to spot leftovers.\n- Do not commit one-off review reports or diagnostic snapshots as durable docs.\n  Extract the stable rule into `AGENTS.md`, `SKILL.md`, or `references/`, then discard\n  the report.\n\n## Issue And PR Maintenance\n\n- Use official GitHub API or CLI for issue and PR work. Read the complete discussion,\n  associated PRs, current source, and relevant tests before deciding what to change.\n- Before each modification, check related local and live remote commits, branches,\n  worktrees, accessible existing agent conversations, and the project inventory.\n  Report the deduplication evidence and current owner before starting implementation.\n- Validate an existing fix rather than implementing it again. When another conversation\n  owns work in progress, leave implementation with that owner and report its verified\n  identifier and status. Do not modify another conversation's uncommitted work.\n- State access and inventory coverage gaps explicitly. A missing search result is not\n  evidence that nobody owns the work; do not bypass reading restrictions.\n- Perform development, builds, and tests in the user's local Mac checkout and\n  branch. Do not default to creating a new PR, opening a cloud execution environment,\n  or manually triggering remote CI. Preserve existing PRs and existing push-triggered\n  CI; do not disable or reconfigure them. Pushes may continue under applicable\n  specific authorization. Preserve the current branch while branch selection is\n  unclear; do not switch or merge into main based on this workflow preference.\n- Preserve the current checkout and user changes. Implement repairs on a separate\n  branch or worktree, locate the cause before targeted tests, and avoid concurrent\n  heavy builds. Never clean real user data to test a repair.\n- Close a duplicate, verified resolved item, or clearly unrelated report only when the\n  evidence and applicable user authorization support closure. Keep unresolved or\n  uncertain reports open; an empty queue is not a correctness goal.\n- Before implementing any change to a user interface, visual effect, interaction,\n  user-facing parameter, or configuration default, present the concrete change to\n  the user and obtain explicit confirmation. General repair or push authorization\n  does not replace this confirmation. Include the issue, original behavior, proposed\n  change, necessity, and alternatives. Pause and isolate any such unapproved work\n  already in progress; do not submit or ship it. Report any already pushed changes\n  accurately and do not roll them back without authorization. Internal repairs that\n  do not change user behavior may continue under their applicable authorization.\n- Confirm applicable authorization separately for commits, pushes, merges, and\n  releases. Distinguish code fixed, tests passed, committed, released, and user retested.\n- Keep reusable project guidance in this repository. Follow the existing rule above\n  for one-off reports and diagnostics; do not mix temporary run status, private paths,\n  personal information, or conversation identifiers into public maintenance guidance.\n- If there are no open issues or PRs, report the verified result without inventing\n  code changes or unnecessary repair branches.\n\n## Generated Mirrors\n\n`plugins/kami/skills/kami/` mirrors the distributable files from `skills/kami/`;\nthe two plugin manifests live in the outer `plugins/kami/` directory. The generated\ncopy excludes local fonts, render output, and caches. `.claude-plugin/marketplace.json`\nand `.agents/plugins/marketplace.json`\npoint at it. Edit `skills/kami/` only and let `python3 scripts/build_metadata.py\n--check` catch drift. Regenerate after any change under `skills/kami/`.\n\nThe same generator owns the site's machine-readable files under `site/`:\n`.well-known/agent-skills/index.json` (carries a SHA-256 digest of `SKILL.md`, so any\nskill edit changes it), `.well-known/mcp/server-card.json` (version plus the tool list\nparsed out of `scripts/mcp_server.py` without importing it), `feeds/catalog.jsonld`\n(built from `HTML_TEMPLATES` / `DIAGRAM_TEMPLATES`), `schemamap.xml`, and\n`kami-skill.md` (the copy served at `/SKILL.md`). Never hand-edit these; change the source and\nregenerate.\n\nMarketplace, plugin path, version, or install-path changes need runtime installation\nproof, not metadata proof. Claude Code: an isolated `HOME=/tmp/...` smoke with\n`claude plugin marketplace add <path>`, `claude plugin install kami@kami`,\n`claude plugin details kami@kami`, confirming the installed cache is the lightweight\n`plugins/kami` tree. Codex: an isolated `CODEX_HOME=/tmp/...` smoke with\n`codex plugin marketplace add <path>`, `codex plugin add kami@kami`,\n`codex plugin list`.\n\n## Refactor And Packaging Hard Stops\n\n- The shipped archive must be the output of `bash scripts/package-skill.sh`: a\n  top-level `kami/` directory under a 6 MB ceiling. A hand-zipped checkout is\n  rejected on size.\n- `scripts/package-skill.sh` packages `git ls-files skills/kami`, so an untracked new\n  module passes every local import and silently disappears from the archive. When\n  adding a runtime module, confirm it is tracked by Git before calling the change done.\n- The archive is not tracked. `release.yml` builds it from the tagged commit and\n  uploads it, so a fix reaches `npx skills add` and plugin installs on the next `main`\n  push but reaches Claude Desktop users only at the next release; name the channel\n  that actually carries the fix before saying \"fixed, please update\".\n- A versioned release must come from a commit reachable from `origin/main` with a\n  successful exact-SHA `check.yml` run triggered by a `main` push. Published\n  same-version assets are immutable in practice: a rerun may reuse `kami.zip` only\n  when its entry names and payloads are identical, otherwise cut a new patch version.\n- If `python3 scripts/build.py --verify` fails only because the host Python lacks PPTX\n  fallback dependencies such as `python-pptx`, verify `slides` and `slides-en` from a\n  temporary venv instead of treating the environment miss as a source regression.\n- Resume templates (`assets/templates/resume.html`, `resume-en.html`, `resume-ko.html`) carry a two-page\n  contract. Do not fix overflow by shrinking type or spacing globally first. Verify\n  with `python3 scripts/build.py --verify resume`, `--verify resume-en`, and `--verify resume-ko`.\n- Demo files such as `site/assets/demos/demo-resume-ko.html` own demo content, not the\n  template contract. Durable rules go into templates or `references/`.\n\n## CI Gotchas\n\nApplies when editing `.github/workflows/*.yml` or adding a test with a heavy\ndependency.\n\n- `check.yml` has two jobs. `lint-and-test` runs dependency-light lint, metadata,\n  and package gates. `verify-render` installs `weasyprint` / `pypdf` / `PyMuPDF` /\n  `Pygments` / `python-pptx`, sets up Node 22 and runs `bash scripts/ensure_mathjax.sh`, then\n  installs the checkout with `npx skills add` under a throwaway `HOME` and asserts\n  the bare install is the kami skill alone (`SKILL.md` and `scripts/build.py`\n  present, no `index.html`, no `site/`, no `TsangerJinKai02-W04.ttf`, unpacked tree\n  under 6000 KB, a separate ceiling from the 6 MB ZIP limit under Refactor And\n  Packaging Hard Stops), which is why a layout or size regression surfaces under a\n  job named `render and verify`. It then runs the full test suite before template\n  verification, including the three unlimited-page long-doc targets for rendered\n  TOC counters. Tests that need an optional render dependency use the suite's\n  explicit `SKIP:` counter and fail when a CI-required dependency is unavailable;\n  never turn a skip into `OK:`.\n- CI installs its Python dependencies and the skills CLI unpinned on purpose: users\n  install the same unpinned way, so an upstream release that breaks Kami should turn\n  CI red before it reaches them.\n- Validate workflow edits with the CI run for the exact pushed commit on the authorized\n  branch; do not create a feature branch solely for validation. A local pass does not\n  prove CI font or dependency availability: check cache manifests, Ubuntu fallback\n  fonts (DejaVu / Liberation), and the absence of commercial fonts (Charter / TsangerJinKai02).\n- Host-versus-CI differences are expressed as explicit opt-in env vars, currently\n  `KAMI_ALLOW_FALLBACK_ONLY` (accept fallback fonts), `KAMI_AUTHOR`, `KAMI_FONT_DIR`,\n  `KAMI_PACKAGE_ROOT_NAME`, `KAMI_PACKAGE_MAX_BYTES`, and `KAMI_UPDATE_URL`. That is\n  already the ceiling: before adding another, move the behavior into a `--ci-mode`\n  flag or a config file rather than letting `KAMI_*` sprawl.\n\n## Current Risk Areas\n\n- WeasyPrint rendering is sensitive to font availability, solid hex tag backgrounds,\n  page breaks, CJK fallback, and synthetic bold. Verify visually for template changes.\n- Slide output has three paths: `slides-weasy*.html` for default PDF decks,\n  `slides*.py` for the editable PPTX fallback, and\n  `assets/templates/marp/slides-marp*.{md,css}` for Markdown-first Marp decks.\n- Marp theme CSS inlines a full copy of the design tokens because Marp themes must be\n  self-contained. `build.py --sync` / `--check` token-sync those files and the CSS\n  lint rules scan them (both walk `shared.iter_template_files`), so token drift is\n  caught. The remaining hole: the off-palette hex guard globs `*.html` only\n  (`TEMPLATES/*.html` and `site/assets/demos/*.html`), so an off-palette color in Marp CSS\n  still needs eyeball review.\n- Resume targets require exactly two pages in all three language variants. Other\n  `build_max_pages` values in `scripts/shared.py` are ceilings (one-pager 1, letter 1,\n  changelog 2, equity-report 3; long-doc, portfolio, and slides-weasy are `0` =\n  unlimited). Other undershooting documents are not flagged, so \"this long-doc came out\n  at 3 pages\" is an authoring judgment call, not a gate failure. Landing pages are\n  browser-only HTML with no page count at all.\n- `scripts/render.py` sets PDF `/Author` from `git config user.name` or `KAMI_AUTHOR`\n  only when the template still holds an author placeholder. `/Producer` and `/Creator`\n  stay `Kami`.\n- Long-doc TOCs use WeasyPrint `target-counter()` and stable chapter ids for rendered\n  page numbers; do not reintroduce hand-written `.toc-page` spans. The row anchor must\n  stay `display: block` with the numeral floated right: WeasyPrint 70.0 resolves\n  `target-counter` to 0 on a flex anchor, and a `0` is valid-looking text that only the\n  `--verify` link cross-check catches (production.md pitfall 24). Running headers\n  default to `h1`. If a filled document does not use `h1` for chapter titles, add\n  `.running-title` to the element that should drive the header.\n- AI and public visibility spans `site/index*.html`, `site/llms.txt`, `site/robots.txt`,\n  `site/sitemap.xml`, FAQ JSON-LD, README install text, diagram counts, and release archive\n  links. Diagram count and names must stay aligned across `SKILL.md`, `CHEATSHEET.md`,\n  `README.md`, `index*.html`, and `assets/diagrams/`.\n\n## Critical Line-Break Scan\n\nApplies before handing off any user-visible typeset deliverable (rendered PDF,\n`README.md`, public site page).\n\n- Scan page by page for three wrap candidates: a trailing line of only 1-2 words\n  (orphan), a line one word away from wrapping, and a line that wraps early without\n  filling its container. Confirm each in rendered context; an intentional short line\n  is valid and does not need rewriting to make the count zero.\n- Split the work: `python3 scripts/build.py --check-orphans <pdf>` and\n  `--check-density <pdf>` catch PDF orphans and sparse pages deterministically; the\n  manual pass covers what they cannot see, near-wrap and premature-wrap states inside\n  a page, plus non-PDF surfaces (README and the responsive matrix in `references/design.md`).\n- One confirmed defect means a whole-document sweep for that class, not a single-spot fix. Check container geometry and forced breaks before shortening copy; preserve\n  facts and approved wording. Do not shrink type to dodge a wrap; deliberate layout\n  changes must re-pass `python3 scripts/build.py --check` and the page-count\n  contract.\n\n## Evals\n\n`evals/<case>/` holds end-to-end cases for `claude plugin eval`: a realistic request\nwith invented data (`prompt.md`), and graders for skill trigger, PDF (or HTML)\ncreation, and unfilled placeholders, plus fact fidelity in the HTML. Fact fidelity is\na `regex` grader wherever the facts are literal (one-pager-en, resume-cn): LLM judges\nsplit on derived figures and reported false FAILs on outputs whose facts were all\npresent. Keep an LLM judge only for what a pattern cannot read (Korean-only text,\nassertion titles, arithmetic). `evals/score.py` then applies Kami's own gates to each\nkept run workspace (page contract, atomic facts in the PDF text, fonts, density,\nresidue, style, resume balance, generated chart count), which the harness cannot run\nitself; it is read-only unless given `--write`, which saves `gate-scores.json`. One\nsuite run is 9 cases, 18 document builds at `--runs 2`, at roughly $1-3 each.\n\n- Run it after any change to `SKILL.md`, a reference the tier table routes to, a\n  template, or a gate an agent relies on, and compare against the previous run on the\n  same cases; one run per case is noise, use `--runs 2` or more.\n- The harness reads the plugin from `plugins/kami` live. Never run\n  `scripts/build_metadata.py` while a suite is running, and regenerate it before a run\n  so the suite tests the current skill.\n- A file grader takes an exact path; globs such as `*.html` fail with \"path does not\n  exist\". Every prompt pins its output file names for that reason.\n- Kept workspaces live under `/private/tmp/e-*/sealed/home/cwd` with mode 000;\n  `score.py` opens them itself. Results stay in the ignored `evals/results/`.\n- Mathematics is not covered: the sandbox cannot install the MathJax runtime.\n- LLM fidelity rubrics carry the case's full brief, because a judge that sees only a\n  partial fact list fails supplied facts as invented. On artifacts over about 15k\n  characters the harness judge is unreliable: before treating its FAIL as real,\n  re-judge the stored `evidence` HTML with the same rubric (`claude -p --model sonnet`)\n  and read the stated reason. In the 2026-10-15 baseline that split four failing cases\n  into two noisy votes and two real unlabelled derived figures.\n- resume-cn deliberately supplies thin notes (three employers, eight bullets). The\n  expected behavior is two honest pages with `[DATA NEEDED]` gaps and a reported\n  balance shortfall (`references/resume-writing.md` «Thin source»). `--deliver` and\n  `score.py` both read that through `checks.resume_thin_source` and treat it as a\n  reported gap rather than a balance failure.\n\n## Verification\n\n`SKILL.md` «5 · Deliver» owns the document side: `build.py --deliver` runs every\ndocument gate (placeholders, math, residue, style, content coverage, render, page\ncontract, resume balance, fonts, density, orphans, page images) in order and ends\nin one verdict. This section covers the maintenance side only.\n\n- Template or CSS changes: `python3 scripts/build.py --check` (CSS lint, token sync,\n  base/variant cross-template `:root` consistency, currently CN to EN and CN to KO)\n  plus `--verify` for the affected targets, or full `--verify` when the change is\n  cross-template.\n- Script changes: `python3 scripts/tests/test_build.py` and\n  `python3 scripts/build.py --check`. Run full `--verify` only when the render\n  pipeline itself changed (`render.py`, `verify.py`, WeasyPrint handling).\n- Font-stack changes (any `--serif` / `--mono` / SVG `text` chain): rebuild the\n  examples, then `python3 scripts/build.py --check-fonts assets/examples/*.pdf`. The\n  page-count contract cannot see which family actually drew the text, and a wrong one\n  renders cleanly; this is how the diagram labels were found splitting mid-word across\n  two faces.\n- Demo changes: regenerate the affected demo outputs and confirm page counts stay in\n  range. Font issues: `bash scripts/ensure-fonts.sh`, then rebuild the target.\n- MCP server changes: smoke the stdio protocol end to end (initialize, tools/list, one\n  tools/call per changed tool) through a scripted stdin session, and check that output\n  stays newline-delimited JSON with no stray prints on stdout.\n- Packaging changes: `bash scripts/package-skill.sh dist/kami.zip`, then `unzip -l\n  dist/kami.zip` to inspect for accidental large fonts, cache files, or a missing new\n  helper.\n- Marketplace or plugin changes: `python3 scripts/build_metadata.py --check` plus the\n  isolated install smoke described under Generated Mirrors.\n- Public site or AI visibility changes: check `site/index*.html`, README,\n  `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, JSON-LD, FAQ, install links, and download links\n  together, then serve the page and verify the responsive matrix in\n  `references/design.md` per locale.\n\n## Fonts\n\n`references/production.md` Part 1 «Fonts» owns the full stack: per-language family\nchains, fallbacks, `@font-face` paths, and the recovery flow. Two facts that must not\ndrift out of it:\n\n- `Source Han Serif KR` is the real family name inside the bundled OTFs and must stay\n  in every Korean fallback chain, otherwise fontconfig cannot resolve the\n  `ensure-fonts.sh`-downloaded font by name on an offline Linux skill install.\n- CJK families lead every stack that CJK text can reach, Latin faces trail. A leading\n  Latin serif ends the stack walk for characters it lacks, which sends each ideograph\n  to fontconfig separately and splits words across two faces inside inline SVG\n  (`production.md` pitfall #4.1). The `-en` templates are the deliberate exception:\n  they are Latin documents, so `Charter` stays first there.\n- The commercial TsangerJinKai02 files never ship inside the skill package, so a\n  sandboxed install has no primary CJK serif and falls through the chain. Keep the\n  chain wide (Source Han Serif SC and CN, Noto Serif CJK SC and Noto Serif SC, Songti\n  SC, STSong, SimSun) so it lands on some serif rather than a system sans.\n- `bash scripts/ensure-fonts.sh` downloads into the XDG user font dir\n  (`${XDG_DATA_HOME:-~/.local/share}/fonts/kami`, override with `KAMI_FONT_DIR`),\n  never into the skill's `assets/fonts`, so an installed Claude Desktop skill stays\n  small. Inside a repo checkout it first restores missing or truncated font files from the root\n  `assets/fonts/` into the skill's ignored font directory. It downloads to the user\n  font directory only when usable fonts are still missing. Commercial use of TsangerJinKai02 requires\n  the appropriate license.\n\n## Releasing\n\n`docs/release.md` owns release notes format, the tag and asset flow, and demo\nscreenshot regeneration commands. Read it when cutting or refreshing a release.\n","evals/landing-page-en/prompt.md":"---\nplugins: [\"../../plugins/kami\"]\ntags: [landing-page, en, screen]\nmax_turns: 150\ntimeout_seconds: 2400\nallowed_tools: [Read, Glob, Grep, Skill, Bash, Write, Edit, TodoWrite]\n---\n\nMake a landing page for my product as a single HTML file in the current directory, named index.html. It is a web page only, no PDF needed. Don't ask me questions, just make reasonable calls and tell me at the end what's missing.\n\nProduct: Ledgerly, bookkeeping for freelancers.\n- Import bank statements as CSV and Ledgerly sorts transactions into tax categories.\n- Sends invoices and chases late payments automatically.\n- Beta users say month-end bookkeeping takes 40% less time.\n- 1,800 freelancers are in the beta.\n- Pricing: $12 per month, 14-day free trial, no card needed.\n- Call to action: start the free trial.\n\nI don't have customer logos or testimonials yet.\n","evals/letter-ko/prompt.md":"---\nplugins: [\"../../plugins/kami\"]\ntags: [letter, ko]\nmax_turns: 150\ntimeout_seconds: 2400\nallowed_tools: [Read, Glob, Grep, Skill, Bash, Write, Edit, TodoWrite]\n---\n\n다음 내용으로 한국어 추천서를 PDF로 만들어 현재 디렉터리에 저장해 주세요. 질문하지 말고 바로 완성해 주세요. HTML 파일은 letter.html, PDF는 letter.pdf로 저장해 주세요.\n\n- 추천인: 박서연, 한빛데이터 데이터플랫폼팀 팀장\n- 추천 대상: 김도윤, 같은 팀 데이터 엔지니어로 2년 4개월 함께 근무\n- 지원처: 서울대학교 데이터사이언스대학원 석사과정\n- 김도윤은 실시간 로그 파이프라인을 Kafka와 Flink로 재구축해 데이터 지연을 45분에서 90초로 줄였습니다.\n- 사내 데이터 품질 검사 도구를 직접 설계해 18개 팀이 사용하고 있습니다.\n- 신입 3명의 온보딩을 맡아 멘토링했습니다.\n- 통계 공부에 관심이 많아 퇴근 후 온라인 과정을 수료했습니다.\n- 날짜: 2026년 9월 20일\n","evals/long-doc-cn/prompt.md":"# Long-doc-cn Skill\n\nPath: `evals/long-doc-cn/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/prompt.md)","evals/one-pager-en/prompt.md":"# One-pager-en Skill\n\nPath: `evals/one-pager-en/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/prompt.md)","evals/portfolio-cn/prompt.md":"# Portfolio-cn Skill\n\nPath: `evals/portfolio-cn/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/prompt.md)","evals/resume-cn/prompt.md":"# Resume-cn Skill\n\nPath: `evals/resume-cn/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/prompt.md)","evals/slides-en/prompt.md":"# Slides-en Skill\n\nPath: `evals/slides-en/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/prompt.md)","skills/kami/CHEATSHEET.md":"# Kami Skill\n\nPath: `skills/kami/CHEATSHEET.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/CHEATSHEET.md)","evals/equity-report-charts-en/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/content-fidelity.md)","evals/equity-report-charts-en/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/no-placeholders.md)","evals/equity-report-charts-en/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/pdf-created.md)","evals/equity-report-charts-en/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/skill-fired.md)","evals/equity-report-cn/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/equity-report-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/content-fidelity.md)","evals/equity-report-cn/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/equity-report-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/no-placeholders.md)","evals/equity-report-cn/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/equity-report-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/pdf-created.md)","evals/equity-report-cn/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/equity-report-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/skill-fired.md)","evals/landing-page-en/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/landing-page-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/content-fidelity.md)","evals/landing-page-en/graders/html-created.md":"# Graders Skill\n\nPath: `evals/landing-page-en/graders/html-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/html-created.md)","evals/landing-page-en/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/landing-page-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/no-placeholders.md)","evals/landing-page-en/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/landing-page-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/skill-fired.md)","evals/letter-ko/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/letter-ko/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/content-fidelity.md)","evals/letter-ko/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/letter-ko/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/no-placeholders.md)","evals/letter-ko/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/letter-ko/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/pdf-created.md)","evals/letter-ko/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/letter-ko/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/skill-fired.md)","evals/long-doc-cn/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/long-doc-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/content-fidelity.md)","evals/long-doc-cn/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/long-doc-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/no-placeholders.md)","evals/long-doc-cn/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/long-doc-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/pdf-created.md)","evals/long-doc-cn/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/long-doc-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/skill-fired.md)","evals/one-pager-en/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/content-fidelity.md)","evals/one-pager-en/graders/no-invented-metrics.md":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/no-invented-metrics.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/no-invented-metrics.md)","evals/one-pager-en/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/no-placeholders.md)","evals/one-pager-en/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/pdf-created.md)","evals/one-pager-en/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/skill-fired.md)","evals/portfolio-cn/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/portfolio-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/content-fidelity.md)","evals/portfolio-cn/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/portfolio-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/no-placeholders.md)","evals/portfolio-cn/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/portfolio-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/pdf-created.md)","evals/portfolio-cn/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/portfolio-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/skill-fired.md)","evals/resume-cn/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/resume-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/content-fidelity.md)","evals/resume-cn/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/resume-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/no-placeholders.md)","evals/resume-cn/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/resume-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/pdf-created.md)","evals/resume-cn/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/resume-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/skill-fired.md)","evals/slides-en/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/slides-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/content-fidelity.md)","evals/slides-en/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/slides-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/no-placeholders.md)","evals/slides-en/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/slides-en/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/pdf-created.md)","evals/slides-en/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/slides-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/skill-fired.md)","plugins/kami/.claude-plugin/plugin.json":"# claude-plugin Plugin Manifest\n\nPath: `plugins/kami/.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/.claude-plugin/plugin.json)","plugins/kami/.codex-plugin/plugin.json":"# codex-plugin Plugin Manifest\n\nPath: `plugins/kami/.codex-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/.codex-plugin/plugin.json)","skills/kami/references/anti-patterns.md":"# References Skill\n\nPath: `skills/kami/references/anti-patterns.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/anti-patterns.md)","skills/kami/references/brand-profile.md":"# References Skill\n\nPath: `skills/kami/references/brand-profile.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/brand-profile.md)","skills/kami/references/brand.example.md":"# References Skill\n\nPath: `skills/kami/references/brand.example.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/brand.example.md)","skills/kami/references/checks_thresholds.json":"# References Skill\n\nPath: `skills/kami/references/checks_thresholds.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/checks_thresholds.json)","skills/kami/references/deck-preflight.md":"# References Skill\n\nPath: `skills/kami/references/deck-preflight.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/deck-preflight.md)","skills/kami/references/design.md":"# References Skill\n\nPath: `skills/kami/references/design.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/design.md)","skills/kami/references/diagrams.md":"# References Skill\n\nPath: `skills/kami/references/diagrams.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/diagrams.md)","skills/kami/references/mermaid-theme.json":"# References Skill\n\nPath: `skills/kami/references/mermaid-theme.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/mermaid-theme.json)","skills/kami/references/mermaid.md":"# References Skill\n\nPath: `skills/kami/references/mermaid.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/mermaid.md)","skills/kami/references/production.md":"# References Skill\n\nPath: `skills/kami/references/production.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/production.md)","skills/kami/references/resume-writing.md":"# References Skill\n\nPath: `skills/kami/references/resume-writing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/resume-writing.md)","skills/kami/references/tokens.json":"# References Skill\n\nPath: `skills/kami/references/tokens.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/tokens.json)","skills/kami/references/writing.md":"# References Skill\n\nPath: `skills/kami/references/writing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/writing.md)","skills/kami/scripts/package.json":"# Scripts Skill\n\nPath: `skills/kami/scripts/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/scripts/package.json)","plugins/kami/skills/kami/CHEATSHEET.md":"# Kami Skill\n\nPath: `plugins/kami/skills/kami/CHEATSHEET.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/CHEATSHEET.md)","skills/kami/references/schemas/changelog.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/changelog.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/changelog.json)","skills/kami/references/schemas/equity-report.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/equity-report.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/equity-report.json)","skills/kami/references/schemas/landing-page.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/landing-page.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/landing-page.json)","skills/kami/references/schemas/letter.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/letter.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/letter.json)","skills/kami/references/schemas/long-doc.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/long-doc.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/long-doc.json)","skills/kami/references/schemas/one-pager.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/one-pager.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/one-pager.json)","skills/kami/references/schemas/portfolio.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/portfolio.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/portfolio.json)","skills/kami/references/schemas/resume.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/resume.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/resume.json)","skills/kami/references/schemas/slides.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/slides.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/slides.json)","skills/kami/scripts/mathjax-runtime/package-lock.json":"# Mathjax-runtime Skill\n\nPath: `skills/kami/scripts/mathjax-runtime/package-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/scripts/mathjax-runtime/package-lock.json)","skills/kami/scripts/mathjax-runtime/package.json":"# Mathjax-runtime Skill\n\nPath: `skills/kami/scripts/mathjax-runtime/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/scripts/mathjax-runtime/package.json)","plugins/kami/skills/kami/references/anti-patterns.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/anti-patterns.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/anti-patterns.md)","plugins/kami/skills/kami/references/brand-profile.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/brand-profile.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/brand-profile.md)","plugins/kami/skills/kami/references/brand.example.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/brand.example.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/brand.example.md)","plugins/kami/skills/kami/references/checks_thresholds.json":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/checks_thresholds.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/checks_thresholds.json)","plugins/kami/skills/kami/references/deck-preflight.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/deck-preflight.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/deck-preflight.md)","plugins/kami/skills/kami/references/design.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/design.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/design.md)","plugins/kami/skills/kami/references/diagrams.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/diagrams.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/diagrams.md)","plugins/kami/skills/kami/references/mermaid-theme.json":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/mermaid-theme.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/mermaid-theme.json)","plugins/kami/skills/kami/references/mermaid.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/mermaid.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/mermaid.md)","plugins/kami/skills/kami/references/production.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/production.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/production.md)","plugins/kami/skills/kami/references/resume-writing.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/resume-writing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/resume-writing.md)","plugins/kami/skills/kami/references/tokens.json":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/tokens.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/tokens.json)","plugins/kami/skills/kami/references/writing.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/writing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/writing.md)","plugins/kami/skills/kami/scripts/package.json":"# Scripts Skill\n\nPath: `plugins/kami/skills/kami/scripts/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/scripts/package.json)","skills/kami/assets/templates/marp/slides-marp-en.md":"# Marp Skill\n\nPath: `skills/kami/assets/templates/marp/slides-marp-en.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/assets/templates/marp/slides-marp-en.md)","skills/kami/assets/templates/marp/slides-marp.md":"# Marp Skill\n\nPath: `skills/kami/assets/templates/marp/slides-marp.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/assets/templates/marp/slides-marp.md)","plugins/kami/skills/kami/references/schemas/changelog.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/changelog.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/changelog.json)","plugins/kami/skills/kami/references/schemas/equity-report.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/equity-report.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/equity-report.json)","plugins/kami/skills/kami/references/schemas/landing-page.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/landing-page.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/landing-page.json)","plugins/kami/skills/kami/references/schemas/letter.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/letter.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/letter.json)","plugins/kami/skills/kami/references/schemas/long-doc.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/long-doc.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/long-doc.json)","plugins/kami/skills/kami/references/schemas/one-pager.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/one-pager.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/one-pager.json)","plugins/kami/skills/kami/references/schemas/portfolio.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/portfolio.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/portfolio.json)","plugins/kami/skills/kami/references/schemas/resume.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/resume.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/resume.json)","plugins/kami/skills/kami/references/schemas/slides.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/slides.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/slides.json)","plugins/kami/skills/kami/scripts/mathjax-runtime/package-lock.json":"# Mathjax-runtime Skill\n\nPath: `plugins/kami/skills/kami/scripts/mathjax-runtime/package-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/scripts/mathjax-runtime/package-lock.json)","plugins/kami/skills/kami/scripts/mathjax-runtime/package.json":"# Mathjax-runtime Skill\n\nPath: `plugins/kami/skills/kami/scripts/mathjax-runtime/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/scripts/mathjax-runtime/package.json)","plugins/kami/skills/kami/assets/templates/marp/slides-marp-en.md":"# Marp Skill\n\nPath: `plugins/kami/skills/kami/assets/templates/marp/slides-marp-en.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/assets/templates/marp/slides-marp-en.md)","plugins/kami/skills/kami/assets/templates/marp/slides-marp.md":"# Marp Skill\n\nPath: `plugins/kami/skills/kami/assets/templates/marp/slides-marp.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/assets/templates/marp/slides-marp.md)"},"files":{".claude-plugin/marketplace.json":"{\n  \"name\": \"kami\",\n  \"description\": \"Document typesetting skill for Claude Code.\",\n  \"owner\": {\n    \"name\": \"Tw93\",\n    \"email\": \"hitw93@gmail.com\"\n  },\n  \"plugins\": [\n    {\n      \"name\": \"kami\",\n      \"version\": \"1.18.0\",\n      \"description\": \"Typeset professional documents and landing pages with the Kami design system.\",\n      \"category\": \"documents\",\n      \"source\": \"./plugins/kami\",\n      \"homepage\": \"https://github.com/tw93/kami\"\n    }\n  ]\n}\n","llms.txt":"site/llms.txt","skills/kami/SKILL.md":"---\nname: kami\ndescription: 'Typeset professional documents with Kami templates: resumes, one-pagers, white papers, letters, portfolios, and slide decks. Use when asked to 做 PDF / 排版 / 简历 / 一页纸 / PPT / slides, or to create a Kami landing page. Not for auditing or restyling an existing product site.'\n---\n\n# kami · 紙\n\n**紙 · かみ** means paper in Japanese.\n\nGood content deserves good paper. Use Kami’s templates and layout rules to create documents and landing pages with serif fonts, warm backgrounds, and ink-blue accents.\n\nPart of `Kaku · Waza · Kami` - Kaku writes code, Waza drills habits, **Kami delivers documents**.\n\nCommands and paths below are relative to this skill's directory. Keep the document in the user's working directory and call the scripts from there by their full path (`python3 <skill>/scripts/build.py ...`); relative file arguments resolve from your working directory first.\n\n**Update check (non-blocking).** At the start of a task, run `bash scripts/check-update.sh`. It keeps a local daily marker and, at most once a day, reads Kami's latest published GitHub Release; it uploads no document or task content and stays silent when offline or sandboxed. When it prints a line about a newer Kami, relay it and continue.\n\n**Brand profile.** If `~/.config/kami/brand.md` (or the legacy `~/.kami/brand.md`) exists, read `references/brand-profile.md` and apply it. Precedence: explicit prompt > editorial judgment > habit notes > frontmatter defaults > built-in defaults. The profile fills gaps silently and never overrides the current conversation. When the user names another project as the visual reference, run the style scan in the same file. When they give only a brand website, `python3 scripts/brand_extract.py <url>` drafts a profile; show the draft and use it for this document only after they accept it.\n\n## 1 · Lock the contract\n\nBefore creating or changing an output, lock six things: language, template, output formats, page or length target, visual acceptance, and the verification command. Infer them from the request, then state the contract to the user in one short line in their language (template, length, formats, the figures you plan, any missing material) and continue without waiting. If they push back, adjust.\n\n**Question budget.** Infer first. Ask at most once, in one compact question with at most two parts, and only when two or more of purpose, audience, hard constraints, or success are genuinely unresolvable, or two templates genuinely both fit. Otherwise take the smallest reasonable assumption and report it at the end.\n\nRoute by the artifact's current state:\n\n| Current task | Mode | Contract |\n|---|---|---|\n| New document or substantial restructuring | **New document** | Lock the contract, write `content.json` with `brief` + `content`, then fill and deliver |\n| Text replacement, translation, or factual correction in an existing artifact | **Content-only** | Preserve CSS and layout unless the new copy proves a fit defect |\n| User supplies a render or screenshot and rejects how it looks | **Visual repair** | Treat the render as the brief; follow «Feedback protocol» |\n| Standalone generated illustration, cover, social card, or redraw | **Generated asset** | Lock the semantic brief before pixels (`references/diagrams.md` section 11); preserve accepted parts across iterations |\n\nUse the nearest existing template and check. Do not add a template, shared CSS layer, dependency, script flag, or optional mode unless the request cannot be met without it.\n\n### Language\n\n| User language | HTML templates | Slides (PDF default) | Slides (PPTX, only when an editable deck is requested) | Slides (Marp) |\n|---|---|---|---|---|\n| Chinese (primary) | `*.html` | `slides-weasy.html` | `slides.py` | `slides-marp.md` |\n| English | `*-en.html` | `slides-weasy-en.html` | `slides-en.py` | `slides-marp-en.md` |\n| Japanese (best-effort) | `*.html`, JP Mincho first | `slides-weasy.html` | `slides.py` | `slides-marp.md` |\n| Korean | `*-ko.html` | `slides-weasy-ko.html` | `slides-en.py` only if PPTX is required | `slides-marp.md` |\n| Other (best-effort) | CJK or EN path by script coverage | `slides-weasy.html` or `-en` | `slides.py` / `slides-en.py` | `slides-marp.md` or `-en` |\n\nJapanese, Korean, and other languages need a visual pass on the page images before shipping. Reference docs are shared English specs.\n\n### Document type\n\n| User says | Document | CN template | EN template | KO template |\n|---|---|---|---|---|\n| \"one-pager / 方案 / 执行摘要 / exec summary\" | One-Pager | `one-pager.html` | `one-pager-en.html` | `one-pager-ko.html` |\n| \"white paper / 白皮书 / 长文 / 年度总结 / technical report\" | Long Doc | `long-doc.html` | `long-doc-en.html` | `long-doc-ko.html` |\n| \"formal letter / 信件 / 辞职信 / 推荐信 / memo\" | Letter | `letter.html` | `letter-en.html` | `letter-ko.html` |\n| \"portfolio / 作品集 / case studies\" | Portfolio | `portfolio.html` | `portfolio-en.html` | `portfolio-ko.html` |\n| \"resume / CV / 简历 / 履歴書\" | Resume | `resume.html` | `resume-en.html` | `resume-ko.html` |\n| \"slides / PPT / deck / 演示\" | Slides | `slides-weasy.html` | `slides-weasy-en.html` | `slides-weasy-ko.html` |\n| \"个股研报 / equity report / 估值分析 / investment memo / 股票分析\" | Equity Report | `equity-report.html` | `equity-report-en.html` | `equity-report-ko.html` |\n| \"更新日志 / changelog / release notes / 版本记录\" | Changelog | `changelog.html` | `changelog-en.html` | `changelog-ko.html` |\n| \"landing page / 落地页 / 官网 / product page / 产品页\" | Landing Page | `landing-page.html` | `landing-page-en.html` | `landing-page-ko.html` |\n\nWhen two cells both fit, decide from the signals before asking:\n\n| Signal | Document |\n|---|---|\n| 1 page for investors, recruiters, or an executive summary | one-pager |\n| 1 page of formal correspondence (sales, hiring, resignation, memo) | letter |\n| Exactly 2 pages of career narrative with project bullets | resume |\n| 3-6 visual-heavy pages showcasing projects | portfolio |\n| 6-15 pages of sustained argument, low visual density | long-doc |\n| Presentation flow, one assertion per slide | slides |\n| Metrics dashboard plus thesis plus price or risk view | equity-report |\n| Version-by-version release facts | changelog |\n| Product showcase, pricing, screenshots, FAQ for a browser | landing-page |\n\nAsk only in cases like \"1.5 pages of career story, heavy visuals\" (resume or portfolio?) or \"2 pages of exec summary with metric tiles\" (one-pager or equity-report?).\n\n- **Changelog vs. release notes**: the changelog template is a styled document. GitHub release notes are a separate deliverable; use `/write`.\n- **Landing page**: screen-first HTML, no PDF. Fill the `{{PLACEHOLDER}}` values and comment blocks and save a ready-to-serve file. The accent follows the product: use its own main color, ask the user to pick when it has none, and keep ink-blue only as the fallback (`references/design.md` Section 11 «Accent on a product site»). Companion files (`landing-page-*.example`) and the production site mode (docs, help, releases, legal pages, or more than two locales) live in `references/design.md` Section 11. Keep project-specific release artifacts, payment providers, appcast rules, and private local paths out of Kami.\n- **Diagrams inside a document** come from `assets/diagrams/` (eighteen types), not a template. `references/diagrams.md` section 1 picks the type; extract the `<svg>` block into a `<figure>`. The same file owns architecture boards, diagrams maintained in the user's repo, and generated raster illustrations.\n- **Charts from data** (pick and embed them without asking) are generated, never drawn by hand: write the numbers as a spec and run `python3 scripts/build.py --chart spec.json -o chart.svg` (`references/diagrams.md` section 9).\n- **Slides**: read `references/deck-preflight.md` before drafting.\n\n## 2 · Sources, materials, and content\n\n**Source check.** When the document names a company, product, person, release date, version, funding round, metric, market fact, or technical spec, work from primary sources, note source and date for the facts that drive it, and ask when sources conflict (`references/writing.md` «5. Sources before phrasing»). Skip it for personal drafts where the user supplied everything.\n\n**Material check.** A branded subject needs what makes it recognizable: logo, product image or current UI screenshot, and brand colors when the document is branded (`references/writing.md` «6. Materials serve recognition»). When the request names no logo but the brand profile has one, fill the commented `.brand-logo` slot in `one-pager` / `portfolio` / `slides-weasy` (expand `~` to an absolute path; leave the slot commented if the file is missing). An explicit logo in the current request always wins.\n\n**Gap report.** Everything the template needs that the input lacks, missing facts and missing materials alike, goes into one compact table shown once, with one question only when a missing item would change the deliverable. Inside the document, mark a gap as `[DATA NEEDED: what]`. Never fill a gap with a guess, a stock image, an approximated logo, or an invented value.\n\n**Distill.** Unless the content already maps one-to-one onto the template sections or the user said to use it as-is, distill it. Every factual claim, number, date, name, source, and material reference from the input must land in a template section or in the gap report.\n\n**Content IR (new documents).** Write the distilled content and the locked contract to `content.json` next to the working HTML before filling. Read `references/schemas/<type>.json` first: its `$comment` notes carry the per-field quality bar. The envelope is strict: only `type`, `lang` (`cn`, `en`, `ko`, `zh-TW`, ...), `brief`, and `content`.\n\n```json\n{\n  \"type\": \"resume\",\n  \"lang\": \"cn\",\n  \"brief\": {\n    \"audience\": \"Hiring manager for a senior product role\",\n    \"job\": \"Earn an interview by proving scope and outcomes\",\n    \"template\": \"resume\",\n    \"formats\": [\"html\", \"pdf\"],\n    \"page_target\": 2,\n    \"narrative\": \"Scope first, then evidence, then fit\",\n    \"required_facts\": [\"team size\", \"measured outcomes\"],\n    \"required_assets\": [],\n    \"acceptance_checks\": [\"two pages\", \"all atomic facts survive\"],\n    \"preserve\": [],\n    \"explicit_deviations\": []\n  },\n  \"content\": { ... }\n}\n```\n\n`type` is a schema name in `references/schemas/` (one-pager, letter, resume, long-doc, portfolio, slides, equity-report, changelog, landing-page). For a visual repair, add `target`, `evidence`, and `preserve` to `brief`. Validate before layout with `python3 scripts/build.py --check-content content.json` and fix errors by fixing the content (or asking for the fact), never by loosening structure. Short atomic values (names, metrics, dates, bullets) must survive into the document verbatim; values over 80 characters may be rephrased.\n\n## 3 · Read the right amount\n\nRead the lowest tier that covers the task. The templates already carry every token and component, so a new document does not need the full design spec.\n\n| Task | Read |\n|---|---|\n| Content-only change | `CHEATSHEET.md` |\n| Layout tweak within spec | `CHEATSHEET.md` + the template |\n| New document | the template + `CHEATSHEET.md` + `references/schemas/<type>.json` + the `references/writing.md` sections for that type («Per-document strategies», «Quality bars by document type»); open `references/design.md` only for the component or rule you are about to change |\n| Resume | + `references/resume-writing.md` |\n| Slides, long-doc, portfolio, equity-report, changelog | + `references/writing.md` «Page density» |\n| Slides | + `references/deck-preflight.md` and the `references/design.md` section 8 «Deck Recipe» it points to |\n| Diagram | `references/diagrams.md`; `references/mermaid.md` when the source is Mermaid text |\n| Company, product, market, or branded subject | `references/writing.md` sections 5-6 |\n| Rendering bug, font issue, overflow | `references/production.md` Part 4 (and the design spec if CSS is the cause) |\n| Reviewing an AI-generated draft | `references/anti-patterns.md` |\n\n## 4 · Fill the template\n\n- Copy the template into the working directory; never write HTML from scratch. CSS stays untouched during a content fill. A layout change stays within spec, and a real style change moves `references/design.md` and the sibling templates together, never one file.\n- Meet the quality bar for the type in `references/writing.md` «Quality bars by document type»: a resume bullet needs action, honest scope, and an observable result; an equity report needs variant perception and quantified catalysts; slides need assertion titles. Structure is necessary, not sufficient.\n- Do not invent metrics, financial data, or statistics, and keep any figure you compute from the supplied ones next to its inputs or marked as derived; do not describe stock images as placeholders; do not pad slots (three real projects do not become five). Avoid the patterns in `references/anti-patterns.md`.\n- Tables separate rows with whitespace first and neutral hairlines second; decoration earns its place only by encoding data, state, grouping, or a relationship (`references/design.md` «Table (kami-table)» and «Subtractive rule»).\n- Resume: run the recruiter pass in `references/resume-writing.md` before building.\n- Mathematics is strict LaTeX: author formulas only as inline `\\( ... \\)` or display `\\[ ... \\]` in rendered body text, never as Unicode approximations, ASCII fractions, screenshots, or raw TeX on the page. `--deliver` renders them to MathJax SVG in place; it needs Node.js 20 or 22+ and `bash scripts/ensure_mathjax.sh` once.\n- Code blocks with `class=\"language-*\"` are highlighted when optional `Pygments` is installed; without it they render monochrome.\n\nFill the four metadata placeholders in `<head>`; WeasyPrint writes them into the PDF:\n\n| CN | EN | Rule |\n|---|---|---|\n| `{{作者}}` | `{{AUTHOR}}` | Resume, letter, portfolio: the person's name from the document. Others: leave it, the build infers it from `git config user.name`, then `KAMI_AUTHOR` |\n| `{{摘要}}` | `{{DESCRIPTION}}` | One sentence (≤150 chars) from the first two paragraphs |\n| `{{关键词}}` | `{{KEYWORDS}}` | 3-5 keywords from the title and section headings |\n| `{{文档标题}}` etc. | `{{DOC_TITLE}}` etc. | From the H1 or `.header .title` |\n\nKeep `<meta name=\"generator\" content=\"Kami\">` as is.\n\n**Output formats.** Do not ask; decide from context. Any document: HTML + PDF (PDF is the deliverable, HTML the source). Slides: HTML + PDF, plus PPTX only when an editable deck is requested. \"分享 / 发朋友圈 / share / post / preview\": add PNG. \"嵌入 / 插图 / embed in another doc\": PNG only. Landing page: the static HTML file. Word or `.docx` for long-doc, proposal, or equity-report: the PDF plus a DOCX through `references/production.md` Part 5. An explicit format request overrides all of this.\n\n## 5 · Deliver\n\nOne command finishes a document. Run it from the document's directory, fix every `ERROR`, and re-run until it reports `READY`:\n\n```bash\npython3 scripts/build.py --deliver filled.html content.json\n```\n\nIt checks the HTML (placeholders, strict math rendered in place, Markdown residue, generated charts against their data, template style, content coverage), renders the PDF next to it, then checks the PDF (page contract, resume balance, the font that actually drew CJK text, residue, density, orphans) and exports page images. `WARN` lines point at where to look, not at failures. `GAP` lines are the `[DATA NEEDED]` markers you must report.\n\nThen do the part no script can: open every page image and walk the printed checklist. One hit means a whole-document sweep for that class of issue. Fix the three most visible defects per round, re-run `--deliver`, and stop after three rounds; list what is still wrong rather than looping. If the host cannot view images, send the image paths and the checklist to the user instead of skipping the pass. A missing CJK serif shows no fallback boxes, only a heavier, flatter page, which is why the font gate exists; never call a CJK document visually verified without it.\n\nOther surfaces:\n\n- **Landing pages and any browser surface**: `--deliver` checks the HTML only. Screenshot the responsive matrix in every shipped locale before calling it done (`references/design.md` «Responsive screenshot verification»); do not wait for the user to ask about mobile.\n- **Editable PPTX**: `python3 scripts/build.py --verify slides` (or `slides-en`) and `--check-rhythm`.\n- **Missing dependencies or fonts**: `python3 scripts/build.py --doctor` reports what is installed; `bash scripts/ensure-fonts.sh` recovers CJK fonts (the commercial TsangerJinKai02 never ships inside the skill package). Render failures and their fixes: `references/production.md` Part 4.\n\n**Fresh review.** After `READY` and the image pass, review once from the contract rather than from your own rationale: reread `brief`, the coverage result, and the page images; check every acceptance item and `preserve` boundary; fix P0/P1 findings, each tied to the page or element that proves it. Use an isolated reviewer when the host has one.\n\n**Definition of done.** The closing message gives:\n\n1. The path of every deliverable, in every promised format.\n2. The `--deliver` verdict and page count against the contract.\n3. Every `[DATA NEEDED]` gap and every assumption you made, listed.\n4. The visual verdict stated honestly: when page images could not be inspected, say \"build verified, visuals unconfirmed\", not \"done\".\n\n## Feedback protocol\n\nWhen the user gives visual feedback (\"looks off\", \"太挤了\", \"not elegant\"), inspect the current render before asking them to choose a value. The render is the evidence; the user's negative label is the acceptance signal.\n\n1. Name the concrete defect in one sentence: page or surface, viewport or state, and whether it is density, hierarchy, alignment, type, color, cropping, or text fit.\n2. Lock the repair boundary: `target` is allowed to change; `preserve` names the adjacent pages, sections, content, and shared tokens that must stay stable. Ask only when two plausible targets would produce materially different artifacts.\n3. Make the smallest content, geometry, spacing, typography, crop, or token change that fixes the defect. Never hide a content problem by shrinking type first.\n4. Verify the affected matrix rather than one screenshot:\n   - PDF: target page, neighboring pages, total page count, font result, and every locale or template variant reached by a shared token.\n   - Screen: the breakpoint, tablet, and baseline matrix in `references/design.md` «Responsive screenshot verification»; every shipped locale; affected default, focus/selected, loading, empty/error, and transition states only when the surface has them.\n   - PPTX: editable source plus a rendered PDF or opened-deck inspection.\n   - Generated asset: target slot at its smallest display size plus sibling assets in the same deliverable.\n\nNever say \"I'll adjust the spacing\" without naming the exact property and its new value.\n\n**Escalate after two rounds.** If the same element is still not approved after two adjustment rounds, stop nudging values and produce one comparison artifact: the current state plus 2-3 labeled variants (A/B/C) of the same content in the product's actual frame and background, changing only the compared property. For choices with no objective criterion (typeface, accent color, logo), start there: a specimen sheet of up to 5 labeled half-page blocks with identical title-plus-paragraph content. After the pick, apply it everywhere and rebuild what it touches in the same round.\n\n## When not to use this skill\n\n- The user explicitly wants Material, Fluent, or a Tailwind default: a different design language.\n- Dark, cyberpunk, or futurist aesthetics (this is deliberately anti-future).\n- Saturated multi-color palettes (this has one accent).\n- Cartoon, animation, or illustration style (this is editorial).\n- Dynamic web app UI (this is for print and static documents).\n","plugins/kami/skills/kami/SKILL.md":"---\nname: kami\ndescription: 'Typeset professional documents with Kami templates: resumes, one-pagers, white papers, letters, portfolios, and slide decks. Use when asked to 做 PDF / 排版 / 简历 / 一页纸 / PPT / slides, or to create a Kami landing page. Not for auditing or restyling an existing product site.'\n---\n\n# kami · 紙\n\n**紙 · かみ** means paper in Japanese.\n\nGood content deserves good paper. Use Kami’s templates and layout rules to create documents and landing pages with serif fonts, warm backgrounds, and ink-blue accents.\n\nPart of `Kaku · Waza · Kami` - Kaku writes code, Waza drills habits, **Kami delivers documents**.\n\nCommands and paths below are relative to this skill's directory. Keep the document in the user's working directory and call the scripts from there by their full path (`python3 <skill>/scripts/build.py ...`); relative file arguments resolve from your working directory first.\n\n**Update check (non-blocking).** At the start of a task, run `bash scripts/check-update.sh`. It keeps a local daily marker and, at most once a day, reads Kami's latest published GitHub Release; it uploads no document or task content and stays silent when offline or sandboxed. When it prints a line about a newer Kami, relay it and continue.\n\n**Brand profile.** If `~/.config/kami/brand.md` (or the legacy `~/.kami/brand.md`) exists, read `references/brand-profile.md` and apply it. Precedence: explicit prompt > editorial judgment > habit notes > frontmatter defaults > built-in defaults. The profile fills gaps silently and never overrides the current conversation. When the user names another project as the visual reference, run the style scan in the same file. When they give only a brand website, `python3 scripts/brand_extract.py <url>` drafts a profile; show the draft and use it for this document only after they accept it.\n\n## 1 · Lock the contract\n\nBefore creating or changing an output, lock six things: language, template, output formats, page or length target, visual acceptance, and the verification command. Infer them from the request, then state the contract to the user in one short line in their language (template, length, formats, the figures you plan, any missing material) and continue without waiting. If they push back, adjust.\n\n**Question budget.** Infer first. Ask at most once, in one compact question with at most two parts, and only when two or more of purpose, audience, hard constraints, or success are genuinely unresolvable, or two templates genuinely both fit. Otherwise take the smallest reasonable assumption and report it at the end.\n\nRoute by the artifact's current state:\n\n| Current task | Mode | Contract |\n|---|---|---|\n| New document or substantial restructuring | **New document** | Lock the contract, write `content.json` with `brief` + `content`, then fill and deliver |\n| Text replacement, translation, or factual correction in an existing artifact | **Content-only** | Preserve CSS and layout unless the new copy proves a fit defect |\n| User supplies a render or screenshot and rejects how it looks | **Visual repair** | Treat the render as the brief; follow «Feedback protocol» |\n| Standalone generated illustration, cover, social card, or redraw | **Generated asset** | Lock the semantic brief before pixels (`references/diagrams.md` section 11); preserve accepted parts across iterations |\n\nUse the nearest existing template and check. Do not add a template, shared CSS layer, dependency, script flag, or optional mode unless the request cannot be met without it.\n\n### Language\n\n| User language | HTML templates | Slides (PDF default) | Slides (PPTX, only when an editable deck is requested) | Slides (Marp) |\n|---|---|---|---|---|\n| Chinese (primary) | `*.html` | `slides-weasy.html` | `slides.py` | `slides-marp.md` |\n| English | `*-en.html` | `slides-weasy-en.html` | `slides-en.py` | `slides-marp-en.md` |\n| Japanese (best-effort) | `*.html`, JP Mincho first | `slides-weasy.html` | `slides.py` | `slides-marp.md` |\n| Korean | `*-ko.html` | `slides-weasy-ko.html` | `slides-en.py` only if PPTX is required | `slides-marp.md` |\n| Other (best-effort) | CJK or EN path by script coverage | `slides-weasy.html` or `-en` | `slides.py` / `slides-en.py` | `slides-marp.md` or `-en` |\n\nJapanese, Korean, and other languages need a visual pass on the page images before shipping. Reference docs are shared English specs.\n\n### Document type\n\n| User says | Document | CN template | EN template | KO template |\n|---|---|---|---|---|\n| \"one-pager / 方案 / 执行摘要 / exec summary\" | One-Pager | `one-pager.html` | `one-pager-en.html` | `one-pager-ko.html` |\n| \"white paper / 白皮书 / 长文 / 年度总结 / technical report\" | Long Doc | `long-doc.html` | `long-doc-en.html` | `long-doc-ko.html` |\n| \"formal letter / 信件 / 辞职信 / 推荐信 / memo\" | Letter | `letter.html` | `letter-en.html` | `letter-ko.html` |\n| \"portfolio / 作品集 / case studies\" | Portfolio | `portfolio.html` | `portfolio-en.html` | `portfolio-ko.html` |\n| \"resume / CV / 简历 / 履歴書\" | Resume | `resume.html` | `resume-en.html` | `resume-ko.html` |\n| \"slides / PPT / deck / 演示\" | Slides | `slides-weasy.html` | `slides-weasy-en.html` | `slides-weasy-ko.html` |\n| \"个股研报 / equity report / 估值分析 / investment memo / 股票分析\" | Equity Report | `equity-report.html` | `equity-report-en.html` | `equity-report-ko.html` |\n| \"更新日志 / changelog / release notes / 版本记录\" | Changelog | `changelog.html` | `changelog-en.html` | `changelog-ko.html` |\n| \"landing page / 落地页 / 官网 / product page / 产品页\" | Landing Page | `landing-page.html` | `landing-page-en.html` | `landing-page-ko.html` |\n\nWhen two cells both fit, decide from the signals before asking:\n\n| Signal | Document |\n|---|---|\n| 1 page for investors, recruiters, or an executive summary | one-pager |\n| 1 page of formal correspondence (sales, hiring, resignation, memo) | letter |\n| Exactly 2 pages of career narrative with project bullets | resume |\n| 3-6 visual-heavy pages showcasing projects | portfolio |\n| 6-15 pages of sustained argument, low visual density | long-doc |\n| Presentation flow, one assertion per slide | slides |\n| Metrics dashboard plus thesis plus price or risk view | equity-report |\n| Version-by-version release facts | changelog |\n| Product showcase, pricing, screenshots, FAQ for a browser | landing-page |\n\nAsk only in cases like \"1.5 pages of career story, heavy visuals\" (resume or portfolio?) or \"2 pages of exec summary with metric tiles\" (one-pager or equity-report?).\n\n- **Changelog vs. release notes**: the changelog template is a styled document. GitHub release notes are a separate deliverable; use `/write`.\n- **Landing page**: screen-first HTML, no PDF. Fill the `{{PLACEHOLDER}}` values and comment blocks and save a ready-to-serve file. The accent follows the product: use its own main color, ask the user to pick when it has none, and keep ink-blue only as the fallback (`references/design.md` Section 11 «Accent on a product site»). Companion files (`landing-page-*.example`) and the production site mode (docs, help, releases, legal pages, or more than two locales) live in `references/design.md` Section 11. Keep project-specific release artifacts, payment providers, appcast rules, and private local paths out of Kami.\n- **Diagrams inside a document** come from `assets/diagrams/` (eighteen types), not a template. `references/diagrams.md` section 1 picks the type; extract the `<svg>` block into a `<figure>`. The same file owns architecture boards, diagrams maintained in the user's repo, and generated raster illustrations.\n- **Charts from data** (pick and embed them without asking) are generated, never drawn by hand: write the numbers as a spec and run `python3 scripts/build.py --chart spec.json -o chart.svg` (`references/diagrams.md` section 9).\n- **Slides**: read `references/deck-preflight.md` before drafting.\n\n## 2 · Sources, materials, and content\n\n**Source check.** When the document names a company, product, person, release date, version, funding round, metric, market fact, or technical spec, work from primary sources, note source and date for the facts that drive it, and ask when sources conflict (`references/writing.md` «5. Sources before phrasing»). Skip it for personal drafts where the user supplied everything.\n\n**Material check.** A branded subject needs what makes it recognizable: logo, product image or current UI screenshot, and brand colors when the document is branded (`references/writing.md` «6. Materials serve recognition»). When the request names no logo but the brand profile has one, fill the commented `.brand-logo` slot in `one-pager` / `portfolio` / `slides-weasy` (expand `~` to an absolute path; leave the slot commented if the file is missing). An explicit logo in the current request always wins.\n\n**Gap report.** Everything the template needs that the input lacks, missing facts and missing materials alike, goes into one compact table shown once, with one question only when a missing item would change the deliverable. Inside the document, mark a gap as `[DATA NEEDED: what]`. Never fill a gap with a guess, a stock image, an approximated logo, or an invented value.\n\n**Distill.** Unless the content already maps one-to-one onto the template sections or the user said to use it as-is, distill it. Every factual claim, number, date, name, source, and material reference from the input must land in a template section or in the gap report.\n\n**Content IR (new documents).** Write the distilled content and the locked contract to `content.json` next to the working HTML before filling. Read `references/schemas/<type>.json` first: its `$comment` notes carry the per-field quality bar. The envelope is strict: only `type`, `lang` (`cn`, `en`, `ko`, `zh-TW`, ...), `brief`, and `content`.\n\n```json\n{\n  \"type\": \"resume\",\n  \"lang\": \"cn\",\n  \"brief\": {\n    \"audience\": \"Hiring manager for a senior product role\",\n    \"job\": \"Earn an interview by proving scope and outcomes\",\n    \"template\": \"resume\",\n    \"formats\": [\"html\", \"pdf\"],\n    \"page_target\": 2,\n    \"narrative\": \"Scope first, then evidence, then fit\",\n    \"required_facts\": [\"team size\", \"measured outcomes\"],\n    \"required_assets\": [],\n    \"acceptance_checks\": [\"two pages\", \"all atomic facts survive\"],\n    \"preserve\": [],\n    \"explicit_deviations\": []\n  },\n  \"content\": { ... }\n}\n```\n\n`type` is a schema name in `references/schemas/` (one-pager, letter, resume, long-doc, portfolio, slides, equity-report, changelog, landing-page). For a visual repair, add `target`, `evidence`, and `preserve` to `brief`. Validate before layout with `python3 scripts/build.py --check-content content.json` and fix errors by fixing the content (or asking for the fact), never by loosening structure. Short atomic values (names, metrics, dates, bullets) must survive into the document verbatim; values over 80 characters may be rephrased.\n\n## 3 · Read the right amount\n\nRead the lowest tier that covers the task. The templates already carry every token and component, so a new document does not need the full design spec.\n\n| Task | Read |\n|---|---|\n| Content-only change | `CHEATSHEET.md` |\n| Layout tweak within spec | `CHEATSHEET.md` + the template |\n| New document | the template + `CHEATSHEET.md` + `references/schemas/<type>.json` + the `references/writing.md` sections for that type («Per-document strategies», «Quality bars by document type»); open `references/design.md` only for the component or rule you are about to change |\n| Resume | + `references/resume-writing.md` |\n| Slides, long-doc, portfolio, equity-report, changelog | + `references/writing.md` «Page density» |\n| Slides | + `references/deck-preflight.md` and the `references/design.md` section 8 «Deck Recipe» it points to |\n| Diagram | `references/diagrams.md`; `references/mermaid.md` when the source is Mermaid text |\n| Company, product, market, or branded subject | `references/writing.md` sections 5-6 |\n| Rendering bug, font issue, overflow | `references/production.md` Part 4 (and the design spec if CSS is the cause) |\n| Reviewing an AI-generated draft | `references/anti-patterns.md` |\n\n## 4 · Fill the template\n\n- Copy the template into the working directory; never write HTML from scratch. CSS stays untouched during a content fill. A layout change stays within spec, and a real style change moves `references/design.md` and the sibling templates together, never one file.\n- Meet the quality bar for the type in `references/writing.md` «Quality bars by document type»: a resume bullet needs action, honest scope, and an observable result; an equity report needs variant perception and quantified catalysts; slides need assertion titles. Structure is necessary, not sufficient.\n- Do not invent metrics, financial data, or statistics, and keep any figure you compute from the supplied ones next to its inputs or marked as derived; do not describe stock images as placeholders; do not pad slots (three real projects do not become five). Avoid the patterns in `references/anti-patterns.md`.\n- Tables separate rows with whitespace first and neutral hairlines second; decoration earns its place only by encoding data, state, grouping, or a relationship (`references/design.md` «Table (kami-table)» and «Subtractive rule»).\n- Resume: run the recruiter pass in `references/resume-writing.md` before building.\n- Mathematics is strict LaTeX: author formulas only as inline `\\( ... \\)` or display `\\[ ... \\]` in rendered body text, never as Unicode approximations, ASCII fractions, screenshots, or raw TeX on the page. `--deliver` renders them to MathJax SVG in place; it needs Node.js 20 or 22+ and `bash scripts/ensure_mathjax.sh` once.\n- Code blocks with `class=\"language-*\"` are highlighted when optional `Pygments` is installed; without it they render monochrome.\n\nFill the four metadata placeholders in `<head>`; WeasyPrint writes them into the PDF:\n\n| CN | EN | Rule |\n|---|---|---|\n| `{{作者}}` | `{{AUTHOR}}` | Resume, letter, portfolio: the person's name from the document. Others: leave it, the build infers it from `git config user.name`, then `KAMI_AUTHOR` |\n| `{{摘要}}` | `{{DESCRIPTION}}` | One sentence (≤150 chars) from the first two paragraphs |\n| `{{关键词}}` | `{{KEYWORDS}}` | 3-5 keywords from the title and section headings |\n| `{{文档标题}}` etc. | `{{DOC_TITLE}}` etc. | From the H1 or `.header .title` |\n\nKeep `<meta name=\"generator\" content=\"Kami\">` as is.\n\n**Output formats.** Do not ask; decide from context. Any document: HTML + PDF (PDF is the deliverable, HTML the source). Slides: HTML + PDF, plus PPTX only when an editable deck is requested. \"分享 / 发朋友圈 / share / post / preview\": add PNG. \"嵌入 / 插图 / embed in another doc\": PNG only. Landing page: the static HTML file. Word or `.docx` for long-doc, proposal, or equity-report: the PDF plus a DOCX through `references/production.md` Part 5. An explicit format request overrides all of this.\n\n## 5 · Deliver\n\nOne command finishes a document. Run it from the document's directory, fix every `ERROR`, and re-run until it reports `READY`:\n\n```bash\npython3 scripts/build.py --deliver filled.html content.json\n```\n\nIt checks the HTML (placeholders, strict math rendered in place, Markdown residue, generated charts against their data, template style, content coverage), renders the PDF next to it, then checks the PDF (page contract, resume balance, the font that actually drew CJK text, residue, density, orphans) and exports page images. `WARN` lines point at where to look, not at failures. `GAP` lines are the `[DATA NEEDED]` markers you must report.\n\nThen do the part no script can: open every page image and walk the printed checklist. One hit means a whole-document sweep for that class of issue. Fix the three most visible defects per round, re-run `--deliver`, and stop after three rounds; list what is still wrong rather than looping. If the host cannot view images, send the image paths and the checklist to the user instead of skipping the pass. A missing CJK serif shows no fallback boxes, only a heavier, flatter page, which is why the font gate exists; never call a CJK document visually verified without it.\n\nOther surfaces:\n\n- **Landing pages and any browser surface**: `--deliver` checks the HTML only. Screenshot the responsive matrix in every shipped locale before calling it done (`references/design.md` «Responsive screenshot verification»); do not wait for the user to ask about mobile.\n- **Editable PPTX**: `python3 scripts/build.py --verify slides` (or `slides-en`) and `--check-rhythm`.\n- **Missing dependencies or fonts**: `python3 scripts/build.py --doctor` reports what is installed; `bash scripts/ensure-fonts.sh` recovers CJK fonts (the commercial TsangerJinKai02 never ships inside the skill package). Render failures and their fixes: `references/production.md` Part 4.\n\n**Fresh review.** After `READY` and the image pass, review once from the contract rather than from your own rationale: reread `brief`, the coverage result, and the page images; check every acceptance item and `preserve` boundary; fix P0/P1 findings, each tied to the page or element that proves it. Use an isolated reviewer when the host has one.\n\n**Definition of done.** The closing message gives:\n\n1. The path of every deliverable, in every promised format.\n2. The `--deliver` verdict and page count against the contract.\n3. Every `[DATA NEEDED]` gap and every assumption you made, listed.\n4. The visual verdict stated honestly: when page images could not be inspected, say \"build verified, visuals unconfirmed\", not \"done\".\n\n## Feedback protocol\n\nWhen the user gives visual feedback (\"looks off\", \"太挤了\", \"not elegant\"), inspect the current render before asking them to choose a value. The render is the evidence; the user's negative label is the acceptance signal.\n\n1. Name the concrete defect in one sentence: page or surface, viewport or state, and whether it is density, hierarchy, alignment, type, color, cropping, or text fit.\n2. Lock the repair boundary: `target` is allowed to change; `preserve` names the adjacent pages, sections, content, and shared tokens that must stay stable. Ask only when two plausible targets would produce materially different artifacts.\n3. Make the smallest content, geometry, spacing, typography, crop, or token change that fixes the defect. Never hide a content problem by shrinking type first.\n4. Verify the affected matrix rather than one screenshot:\n   - PDF: target page, neighboring pages, total page count, font result, and every locale or template variant reached by a shared token.\n   - Screen: the breakpoint, tablet, and baseline matrix in `references/design.md` «Responsive screenshot verification»; every shipped locale; affected default, focus/selected, loading, empty/error, and transition states only when the surface has them.\n   - PPTX: editable source plus a rendered PDF or opened-deck inspection.\n   - Generated asset: target slot at its smallest display size plus sibling assets in the same deliverable.\n\nNever say \"I'll adjust the spacing\" without naming the exact property and its new value.\n\n**Escalate after two rounds.** If the same element is still not approved after two adjustment rounds, stop nudging values and produce one comparison artifact: the current state plus 2-3 labeled variants (A/B/C) of the same content in the product's actual frame and background, changing only the compared property. For choices with no objective criterion (typeface, accent color, logo), start there: a specimen sheet of up to 5 labeled half-page blocks with identical title-plus-paragraph content. After the pick, apply it everywhere and rebuild what it touches in the same round.\n\n## When not to use this skill\n\n- The user explicitly wants Material, Fluent, or a Tailwind default: a different design language.\n- Dark, cyberpunk, or futurist aesthetics (this is deliberately anti-future).\n- Saturated multi-color palettes (this has one accent).\n- Cartoon, animation, or illustration style (this is editorial).\n- Dynamic web app UI (this is for print and static documents).\n",".agents/plugins/marketplace.json":"{\n  \"name\": \"kami\",\n  \"interface\": {\n    \"displayName\": \"Kami\"\n  },\n  \"plugins\": [\n    {\n      \"name\": \"kami\",\n      \"source\": {\n        \"source\": \"local\",\n        \"path\": \"./plugins/kami\"\n      },\n      \"policy\": {\n        \"installation\": \"AVAILABLE\",\n        \"authentication\": \"ON_INSTALL\"\n      },\n      \"category\": \"Productivity\"\n    }\n  ]\n}\n","evals/equity-report-charts-en/prompt.md":"---\nplugins: [\"../../plugins/kami\"]\ntags: [equity-report, en, charts]\nmax_turns: 150\ntimeout_seconds: 2400\nallowed_tools: [Read, Glob, Grep, Skill, Bash, Write, Edit, TodoWrite]\n---\n\nWrite an equity research note as a PDF in the current directory. The company is Northgate Robotics, a made-up name for an internal training case, so use only the numbers below and add no outside data. Don't ask me questions, just finish it. Name the source file report.html and the PDF report.pdf.\n\n- Business: warehouse picking robots sold with a software subscription.\n- Revenue: FY2023 $412M, FY2024 $538M, FY2025 $701M. Show this as a bar or line chart.\n- FY2025 revenue mix: robot hardware 61%, software subscriptions 27%, services 12%. Show this as a donut chart.\n- Gross margin: FY2023 34.0%, FY2024 36.5%, FY2025 39.2%.\n- Share price $46, 180M shares outstanding.\n- Our view: FY2026 revenue $880M, rating Overweight, 12-month target price $58.\n- Risks: two customers make up 38% of revenue; a chip supply shortage could delay deliveries.\n","site/llms.txt":"# Kami\n\n> A warm parchment design system for AI-assisted professional documents. One accent color, serif fonts and clear heading levels, and consistent spacing.\n\n## Author\n- Name: Tw93\n- Site: https://tw93.fun\n- Stable entity ID: https://tw93.fun/#person\n\n\n## What is Kami\nKami gives AI agents templates and layout rules for documents and landing pages. It includes one-pagers, resumes, portfolios, slides, long documents, letters, equity reports, and changelogs. Defaults include a warm parchment background (#f5f4ed), ink-blue accents (#1B365D), and Charter/TsangerJinKai serif fonts. A white-background option is available for printing.\n\nKami installs into the agent that uses it and runs on that machine. There is no hosted Kami API, no account, and no API key: the integration surface is a local MCP server, JSON content schemas, and CLI checks.\n\n## When to use Kami\nReach for Kami when the user wants a finished document whose appearance matters, and a plain text answer would not be enough:\n- \"Make me a resume / CV\" -> `resume`\n- \"Turn this into a one-pager, product brief, or intro sheet\" -> `one-pager`\n- \"Write a formal letter, offer, or notice\" -> `letter`\n- \"Build a slide deck for this talk\" -> `slides` (PDF, or editable PPTX)\n- \"Write this research, spec, or report up as a document\" -> `long-doc`\n- \"Show my work, case studies, or portfolio\" -> `portfolio`\n- \"Analyze this company or stock and produce a report\" -> `equity-report`\n- \"Write release notes for this version\" -> `changelog`\n- \"Draw an architecture diagram, flowchart, timeline, or chart to embed\" -> one of 18 inline SVG diagram types\n- \"Build a landing page in this style\" -> browser-only `landing-page` template\n\nDo not reach for Kami for chat answers, code files, or content where the user only wants the text. Kami's cost is layout work; it pays off when the artifact is handed to someone else.\n\nHow an agent should call Kami: install the skill, fill the matching content schema, fill the template HTML, then finish with `python3 scripts/build.py --deliver filled.html content.json`, which runs every document check, renders the PDF, and exports page images for the perceptual pass, or drive the same steps as tools through the local MCP server. Judgment lives in SKILL.md; execution lives in the scripts.\n\n## Key Pages\n- [English showcase](https://kami.tw93.fun): Design system overview with live demos\n- [Developers](https://kami.tw93.fun/developers): Agent and developer integration surface\n- [About](https://kami.tw93.fun/about): What Kami is and who maintains it\n- [Contact](https://kami.tw93.fun/contact): Support and reporting channels\n- [Privacy](https://kami.tw93.fun/privacy): What this site and the skill collect\n- [Chinese showcase](https://kami.tw93.fun/index-zh.html): Chinese version\n- [Japanese showcase](https://kami.tw93.fun/index-ja.html): Japanese version (best-effort CJK path)\n- [Korean showcase](https://kami.tw93.fun/index-ko.html): Korean version (best-effort CJK path)\n- [Traditional Chinese showcase](https://kami.tw93.fun/index-tw.html): Traditional Chinese version\n- [GitHub](https://github.com/tw93/kami): Source code and templates\n\n## Install\n- Claude Code, Codex, Cursor, and other agents: `npx skills add tw93/kami -a claude-code codex cursor -g -y`\n- Claude Code plugin (v2.1.142+): `/plugin marketplace add tw93/kami` then `/plugin install kami@kami`\n- Codex plugin: `codex plugin marketplace add tw93/kami && codex plugin add kami@kami`\n- Claude Desktop: download the release asset `kami.zip` from GitHub Releases (not the source-code ZIP) and upload it via Customize > Skills > \"+\" > Create skill\n- MCP client: `claude mcp add kami -- python3 <checkout>/skills/kami/scripts/mcp_server.py`\n\n## Templates\n- 8 document template types: One-pager, Letter, Resume, Long document, Portfolio, Slides, Equity report, Changelog\n- 18 diagram types: architecture, architecture board, flowchart, quadrant, bar chart, line chart, donut chart, state machine, timeline, swimlane, tree, layer stack, venn, candlestick, waterfall, sequence, class, ER\n\n## Agent Interfaces\n- Content contracts: `references/schemas/<type>.json` carries the per-type structure and quality bar; new `content.json` files also carry an artifact `brief` with target, preserve boundary, evidence, and acceptance checks; validate before layout and check coverage after filling with `python3 scripts/build.py --check-content content.json [filled.html]`\n- Deterministic checks: placeholders, markdown residue, page density, orphan lines, slide rhythm, and a perceptual pass that exports page images with a fixed review checklist (`--check-visual`)\n- MCP server: `python3 scripts/mcp_server.py` speaks MCP over stdio with tools kami_templates / kami_doctor / kami_render / kami_check / kami_deliver / kami_screenshot, so agents can diagnose, render, and verify without loading the skill prompt\n\n## Machine-Readable Files\n- MCP server card: https://kami.tw93.fun/.well-known/mcp/server-card.json\n- Agent Skills index: https://kami.tw93.fun/.well-known/agent-skills/index.json\n- Skill definition: https://kami.tw93.fun/SKILL.md\n- Homepage as Markdown: https://kami.tw93.fun/index.md (a request to `/` carrying `Accept: text/markdown`, or `/?mode=agent`, redirects here)\n- Developer surface: https://kami.tw93.fun/developers.md and https://kami.tw93.fun/developers/llms.txt\n- Template and diagram catalog: https://kami.tw93.fun/feeds/catalog.jsonld (indexed by https://kami.tw93.fun/schemamap.xml)\n\n## Links\n- GitHub: https://github.com/tw93\n- Blog: https://tw93.fun\n- AI Profile: https://tw93.fun/llms-full.txt\n","AGENTS.md":"# Kami Agent Guide\n\n## Project\n\nKami is a document-generation skill and template system: self-contained editorial HTML\ntemplates rendered to PDF / PPTX / PNG, plus reference specs, demo assets, and a\npackaged skill archive. `SKILL.md` is the runtime manual for producing a document.\nThis file is the maintenance guide for changing the repository itself, and it records\nthe traps that a fresh read of the code does not reveal.\n\n## Layout\n\nOne repository, three top-level roles, and the install tools only ever copy the first:\n\n- `skills/kami/` is the skill and the only thing users install: `SKILL.md`,\n  `CHEATSHEET.md`, `VERSION`, `LICENSE`, `references/`, `scripts/`, and the light\n  `assets/` (templates, diagrams, logo, the two small font files). `npx skills add\n  tw93/kami` copies exactly this directory; `bash scripts/package-skill.sh` zips it\n  as `kami/` for Claude Desktop; `plugins/kami/skills/kami/` is a generated copy of it\n  inside the Claude and Codex plugin. Ignored render output lives in\n  `skills/kami/assets/examples/`. Every skill-relative path in `SKILL.md`\n  resolves inside this directory, so nothing here may reach up into the repo.\n- `site/` is kami.tw93.fun. The Vercel project's Root Directory is `site` (project\n  setting, not a file), so only this tree deploys and `site/vercel.json` is the only\n  Vercel config. It carries the pages, `styles.css`, `llms.txt`, `robots.txt`,\n  `sitemap.xml`, `vercel.json`, `.well-known/`, `feeds/`, and the heavy showcase and\n  demo assets. Skill facts it shows (`SKILL.md`, the discovery files) are generated\n  into it, never hand-copied. `/SKILL.md` and `/kami-skill.md` send\n  `X-Robots-Tag: noindex`: agents can still fetch the markdown, and search\n  engines should not score that file as an HTML page.\n- The root holds repository tooling only: `scripts/` (`build_metadata.py`,\n  `package-skill.sh`, `release_gate.py`, `draft-release-notes.py`, `tests/`),\n  `assets/fonts/` (the commercial TTFs; run `bash skills/kami/scripts/ensure-fonts.sh`\n  once after cloning to copy them into the skill's ignored `assets/fonts/`, otherwise\n  templates fall back to jsDelivr), `evals/` (the end-to-end skill eval suite, see\n  Evals below), `docs/`, and `.github/`.\n\nRun skill-side commands from `skills/kami/` (`cd skills/kami && python3\nscripts/build.py --check`); the paths below are written from that directory unless\nthey start with `scripts/build_metadata.py`, `scripts/package-skill.sh`,\n`scripts/release_gate.py`, or `scripts/tests/`, which live at the root. Paths under\n`site/`, `plugins/`, `docs/`, `.github/`, `.claude-plugin/`, and `.agents/` are also\nrelative to the repository root.\n\n## Repository Map\n\nOnly the entries whose role is not obvious from the filename:\n\n- `SKILL.md` - skill routing plus the document-side build and verify commands.\n  `CHEATSHEET.md` - quick design reference. Both ship inside the package.\n- `references/design.md`, `writing.md`, `production.md`, `diagrams.md` - full specs.\n  `production.md` Part 4 is the single source of truth for render failures, their\n  verified causes, and their fixes; add pitfalls there, not here.\n  `docs/release.md` - release notes, release flow, demo screenshot regeneration.\n  `anti-patterns.md`, `resume-writing.md`, `mermaid.md`, `deck-preflight.md`,\n  `brand-profile.md` and `brand.example.md` - scoped guides.\n- `references/tokens.json` (color tokens, drift-checked by `scripts/tokens.py`),\n  `references/mermaid-theme.json` (Kami to beautiful-mermaid theme, kept in sync with\n  `tokens.json`), `references/checks_thresholds.json` (rhythm / density / orphan /\n  visual thresholds read by `checks.py` and `visual.py`). These are live inputs to\n  gates: editing a number changes what passes.\n- `references/schemas/` - one JSON Schema subset per document type. The `$comment`\n  fields carry the per-field quality bar distilled from `writing.md`, so schema edits\n  and `writing.md` edits move together.\n- `scripts/shared.py` - the canonical registries (`HTML_TEMPLATES`,\n  `SCREEN_TEMPLATES`, `PPTX_TEMPLATES`, `MARP_TEMPLATES`, `DIAGRAM_TEMPLATES`) and each template's\n  `build_max_pages`. `build.py` derives its internal build targets from them;\n  Marp stays discovery-only because it uses an external CLI. Add or remove a\n  template or diagram here, never in a per-script dict.\n- `scripts/render.py` - the single render entry (`render_pdf`, `build_slides`, PDF\n  metadata stamping). `build.py`, `verify.py`, and `mcp_server.py` all call it; never\n  open a second WeasyPrint call site.\n- `scripts/diagram_geometry.py` checks annotated architecture SVG through the existing\n  lint entry points. Keep geometry in the actual rect/line/polyline attributes,\n  never a second JSON source. Mark node rectangles, edge shafts and label masks;\n  leave boundary frames and arrowheads unmarked. Static mask checks do not replace\n  rendered text-fit and arrowhead inspection.\n- `scripts/deliver.py` - `build.py --deliver`, the one command `SKILL.md` gives an\n  agent to finish a document: every document gate in a fixed order, the render, page\n  images, and a single READY / NOT READY verdict. It owns the order; the individual\n  `--check-*` flags stay for debugging one gate. Template family comes from content IR\n  `type`, else from stylesheet overlap with the registered templates.\n  `deliver(args, result)` also fills a dict with the same outcome for the MCP\n  `kami_deliver` tool; `mcp_server.DELIVER_GATE_RULES` maps every deliver gate to a\n  `kami_check` rule or declares it deliver-only, and `test_mcp` fails on a new gate\n  that is in neither.\n- `scripts/chart.py` - `build.py --chart` / `--check-charts`: data spec to SVG for\n  bar, line, hbar, donut, candlestick, and waterfall. Chart geometry lives only here;\n  each SVG embeds its spec in `data-kami-spec` and the drift gate regenerates and\n  compares the marks. The five chart files in `assets/diagrams/` are its output for\n  their demo data: change a chart's look in `chart.py` and regenerate them, never\n  edit their SVG by hand (`--check` fails on drift).\n- `scripts/brand_extract.py` - drafts a brand profile from a public website (colors,\n  fonts, logo candidates, one contrast-checked accent). It fetches only the page and\n  same-site stylesheets and never writes into `~/.config/kami/`.\n- `scripts/html_visibility.py` - shared static HTML/CSS visibility analysis for\n  `content.py` coverage and `checks.py` residue checks. Keep its conservative\n  coverage and residue modes distinct; it does not implement browser layout.\n- `scripts/tests/test_build.py` - the stable test entry point; sibling `test_*.py`\n  modules group tests by responsibility, with counters and fixtures in `support.py`.\n  `scripts/tests/corpus/<gate>/{flag,pass}/` is the labelled corpus for the PDF\n  gates (orphans, density, resume balance), rendered and judged by `test_corpus.py`.\n  Before changing a value in `checks_thresholds.json`, run it and read the per-gate\n  `CORPUS:` line; a fixture that flips is the cost of the change, not noise.\n- `scripts/mermaid_normalize.py` - re-themes a beautiful-mermaid SVG to the Kami\n  palette and makes it WeasyPrint-safe. Pure Python, no Node, ships in the package.\n- `scripts/mcp_server.py` - zero-dependency MCP stdio server exposing\n  `kami_templates` / `kami_doctor` / `kami_render` / `kami_check` /\n  `kami_deliver` / `kami_screenshot`, so an MCP-capable agent can diagnose, render, and verify\n  without reading `SKILL.md`. Register\n  with `claude mcp add kami -- python3 <checkout>/skills/kami/scripts/mcp_server.py`.\n- `scripts/math_render.py`, `scripts/mathjax_svg.js`, `scripts/ensure_mathjax.sh`,\n  `scripts/mathjax-runtime/` - strict LaTeX to MathJax SVG; `render.py` imports\n  `math_render`. This is the only Node dependency (Node 20 or 22+, refused otherwise),\n  installed on demand by `ensure_mathjax.sh` from the tracked `package-lock.json`;\n  all four ship in the package allowlist.\n- `scripts/site_facts.py` - public-site fact drift checks (install commands, version,\n  template and diagram counts across `site/index*.html`, the root `README.md`,\n  `site/llms.txt`), wired into `build.py --check`; it resolves those files through\n  `shared.REPO_ROOT` / `shared.SITE_ROOT` and skips itself in an installed skill.\n- `scripts/check-update.sh` - quiet daily update check invoked from `SKILL.md`;\n  writes a local cache marker, then resolves the latest published GitHub Release\n  at most once per day. It uploads no user document or task content and stays\n  silent on failure.\n- `site/assets/showcase/` - README and public-site screenshots only.\n  `site/assets/demos/` - README showcase demos. Neither is part of the skill.\n- `assets/diagrams/src/*.mmd` - Mermaid source of the sequence / class / er diagrams.\n  `assets/templates/marp/` - the Markdown-first Marp deck variant.\n- `dist/` is ignored. The release archive is built by `release.yml` from\n  `skills/kami` and uploaded as a release asset; nothing tracks it.\n- `plugins/kami/`, `.claude-plugin/marketplace.json`,\n  `.agents/plugins/marketplace.json`, and the site's discovery files are\n  **generated**; see Generated Mirrors below.\n- Public site surface under `site/`: `index.html` plus `index-zh|en|ja|ko|tw.html`,\n  the English-only prose pages `developers|about|contact|privacy.html`, `styles.css`,\n  `llms.txt`, `robots.txt`, `sitemap.xml`, `vercel.json`. `styles.css` is Kami's own site shell\n  (language switcher, gallery, responsive behavior, `.hero.doc` / `.prose` for the\n  prose pages); generic template rules never belong there.\n- Agent-facing site surface, also under `site/`: `index.md` (Markdown twin of the homepage; `vercel.json`\n  *redirects* `/` here for `Accept: text/markdown` and `/?mode=agent`, because Vercel\n  applies `rewrites` only after the filesystem and `/` always matches `index.html`),\n  `developers|about|contact|privacy.md`, `developers/llms.txt`, and the generated\n  `.well-known/agent-skills/index.json`, `.well-known/mcp/server-card.json`,\n  `feeds/catalog.jsonld`, `schemamap.xml`, `kami-skill.md` (served at `/SKILL.md` through a rewrite; it must not be named `SKILL.md`, or the skills CLI installs the site). Every new prose page needs its `.md` twin,\n  a `rewrites` entry for the extensionless URL, and a `sitemap.xml` row.\n  The `has`-conditioned redirects and the `Link` headers are only observable on a\n  deploy: verify them with `curl -sI` against the preview URL, never locally.\n- `.github/workflows/check.yml` (PR/push CI) and `release.yml` (tag-triggered build\n  and asset upload).\n\nReference docs are English-first and never forked per language. Inline CJK examples\nare fine where the rule itself is about CJK typography (term annotation, punctuation,\nspacing); language-specific output differences (CN/EN/KO) live in templates, not in\nduplicated reference files.\n\n## Commands\n\n`python3 scripts/build.py --help` prints the authoritative flag list and the module\nmap. Read it instead of trusting any copy; hand-maintained lists here have gone stale\nbefore. The commands it does not cover:\n\n```bash\n# from the repository root\npython3 scripts/build_metadata.py            # regenerate plugins/kami, marketplaces, site discovery files\npython3 scripts/build_metadata.py --check    # drift check for the same\nbash scripts/package-skill.sh dist/kami.zip  # build the Claude Desktop archive from skills/kami\npython3 scripts/tests/test_build.py          # full test suite\npython3 scripts/draft-release-notes.py V1.4.0..HEAD --version V1.4.1 --title \"Steadier Hand\"\nclaude plugin eval . --runs 2 --ablation none -j 4 --keep-temp --trust-plugin --no-publish \\\n  --threshold 0 --judge-model sonnet --allow-tools Bash Write Edit   # end-to-end skill evals\npython3 evals/score.py                       # deterministic gates over the newest eval run\n# from skills/kami\nbash scripts/ensure-fonts.sh                 # recover missing or truncated CJK fonts\npython3 scripts/mcp_server.py                # MCP stdio server (render / check / screenshot)\npython3 scripts/mermaid_normalize.py raw.svg -o clean.svg\n```\n\n## Working Rules\n\n- `SKILL.md` is loaded whole on every trigger, so it carries routing, the execution\n  contract, hard prohibitions, `--deliver`, and the feedback protocol, nothing else.\n  Type-specific procedure (page density, resume recruiter pass, landing site mode,\n  charts, illustrations) lives in the reference the tier table already sends the\n  agent to. Before adding a paragraph to `SKILL.md`, name the eval case it fixes;\n  before removing one, run the suite and compare against the last baseline.\n\n- Style changes must update `references/design.md` and the matching template tokens.\n- A CSS snippet in a reference doc is a shipped artifact, not prose: an agent copies\n  it before it reads a template. Every fenced `css` / `html` block is scanned by\n  `--check-docs` (inside `--check`) with the template rule set, and every `var()` it\n  names must resolve to a registered token or one a shipped template defines. Teach\n  from a component a template actually has; a recipe for assembling a new container\n  is how a document ends up carrying three unrelated emphasis languages. Tag a\n  deliberate counter-example inline with `/* avoid */` so the scan reads it as the\n  lesson rather than the violation.\n- A change touching template tokens, shared CSS gestures, or `references/design.md`\n  visual rules must rebuild the affected demo outputs (`site/assets/demos/*.pdf` / `*.png`)\n  in the same change, not as a later cleanup. Demos inline their CSS by copy, so they\n  silently keep the old style otherwise. Report the sweep: rebuilt N demos, K\n  unaffected. The off-palette guard in `scripts/lint.py` scans `site/assets/demos/*.html`\n  for stale hexes as a backstop, but it cannot see rendered PDFs or PNGs.\n  Repository scans must reject an empty expected demo set; installed skills may\n  skip the site because it is outside their distribution boundary. Test both modes\n  with a known violating demo whenever repository paths change.\n- Templates intentionally inline their CSS rather than share a `_kami.css` partial:\n  each template must stay a single self-contained HTML file the user can copy-paste\n  with no build step. Fix CSS drift by applying the same change across the affected\n  templates, never by introducing a build-time include.\n- For document or template tasks, lock the output contract before editing: language,\n  template, output format, page or length target, visual acceptance check, and\n  verification command.\n- Prefer the nearest existing template and deterministic verifier. Do not add a\n  template, shared CSS layer, dependency, script flag, or optional mode unless the\n  current request cannot be satisfied without it. A new template copies the nearest\n  existing one, stays aligned with `references/design.md`, and adds demo coverage; a\n  new document type also needs a schema in `references/schemas/`.\n- Slides default to WeasyPrint HTML-to-PDF templates unless the user explicitly needs\n  editable PPTX output.\n- Mermaid diagrams: never embed raw beautiful-mermaid SVG into a PDF-bound template.\n  WeasyPrint cannot resolve `color-mix()`, render `<foreignObject>`, or fetch a\n  runtime web font, so always pipe through `scripts/mermaid_normalize.py` first\n  (`--check` enforces this). `xychart-beta` is browser-only because it styles through\n  `<style>` class selectors; use the hand-drawn chart diagrams for PDF. Full flow in\n  `references/mermaid.md`.\n- Do not use graphic emoticons in docs, template comments, or script output. Use `OK:`\n  and `ERROR:` for script status text.\n- Do not use em dashes (U+2014) in repository docs, generated documents, template\n  comments, or site copy; use colons, commas, periods, or parentheses. Self-check:\n  `grep -rn \"$(printf '\\342\\200\\224')\" README.md site/llms.txt site/index*.html`. Teaching\n  counter-examples inside `references/anti-patterns.md` are exempt; its rule #28\n  covers the generated-document side.\n- For hosted-site or public-landing work, separate generic template work from Kami's\n  own website first. Generic behavior lives in `assets/templates/landing-page*` and\n  `references/`; Kami site facts live across `site/index*.html`, `site/styles.css`,\n  `README.md`, `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, and\n  `site/vercel.json`. Public facts are wider\n  than the hero: pricing, install path, version, release, support, analytics, FAQ, and\n  positioning claims move together across pages, metadata, AI files, and download\n  links. Do not leave a site-only analytics or tracking change contradicting the\n  \"no analytics\" copy elsewhere.\n- Landing or documentation-site work follows `references/design.md` Section 11 «Landing\n  Page (screen-first)»: its «Documentation site» subsection for the doc shell (sidebar\n  rail, on-this-page TOC, borderless prev/next pager), then the «Responsive\n  screenshot verification» subsection that closes the section (breakpoint, tablet, and baseline screenshots\n  per locale, objective line-widow scan) before shipping.\n- Content changes should avoid CSS churn unless layout behavior is part of the task.\n- Public copy states the product function before design terminology. Write each locale\n  naturally, preserve approved taglines and personal stories, and keep claims identical\n  across HTML, Markdown, metadata, and FAQ JSON-LD. Writing rules and schema comments\n  must not require poetic captions, invented benefits, numeric filler, or rewrite quotas.\n  Distinguish local document processing from update checks, remote assets, and the AI\n  provider’s data handling.\n- Brand profile support is optional context. Keep public examples in `references/`; do\n  not hard-code a maintainer's private local profile.\n- Demo, reference-example, and handoff content distilled from a maintainer's private\n  documents (resume, business proposal, pricing, client names) must be de-identified\n  before it lands in the repo: swap in public figures, public projects, or invented\n  generic data. Job-search, quote, and engagement-period fields count as sensitive\n  even without names. List the swapped-out identifying signals in the handoff report;\n  do not rely on the maintainer to spot leftovers.\n- Do not commit one-off review reports or diagnostic snapshots as durable docs.\n  Extract the stable rule into `AGENTS.md`, `SKILL.md`, or `references/`, then discard\n  the report.\n\n## Issue And PR Maintenance\n\n- Use official GitHub API or CLI for issue and PR work. Read the complete discussion,\n  associated PRs, current source, and relevant tests before deciding what to change.\n- Before each modification, check related local and live remote commits, branches,\n  worktrees, accessible existing agent conversations, and the project inventory.\n  Report the deduplication evidence and current owner before starting implementation.\n- Validate an existing fix rather than implementing it again. When another conversation\n  owns work in progress, leave implementation with that owner and report its verified\n  identifier and status. Do not modify another conversation's uncommitted work.\n- State access and inventory coverage gaps explicitly. A missing search result is not\n  evidence that nobody owns the work; do not bypass reading restrictions.\n- Perform development, builds, and tests in the user's local Mac checkout and\n  branch. Do not default to creating a new PR, opening a cloud execution environment,\n  or manually triggering remote CI. Preserve existing PRs and existing push-triggered\n  CI; do not disable or reconfigure them. Pushes may continue under applicable\n  specific authorization. Preserve the current branch while branch selection is\n  unclear; do not switch or merge into main based on this workflow preference.\n- Preserve the current checkout and user changes. Implement repairs on a separate\n  branch or worktree, locate the cause before targeted tests, and avoid concurrent\n  heavy builds. Never clean real user data to test a repair.\n- Close a duplicate, verified resolved item, or clearly unrelated report only when the\n  evidence and applicable user authorization support closure. Keep unresolved or\n  uncertain reports open; an empty queue is not a correctness goal.\n- Before implementing any change to a user interface, visual effect, interaction,\n  user-facing parameter, or configuration default, present the concrete change to\n  the user and obtain explicit confirmation. General repair or push authorization\n  does not replace this confirmation. Include the issue, original behavior, proposed\n  change, necessity, and alternatives. Pause and isolate any such unapproved work\n  already in progress; do not submit or ship it. Report any already pushed changes\n  accurately and do not roll them back without authorization. Internal repairs that\n  do not change user behavior may continue under their applicable authorization.\n- Confirm applicable authorization separately for commits, pushes, merges, and\n  releases. Distinguish code fixed, tests passed, committed, released, and user retested.\n- Keep reusable project guidance in this repository. Follow the existing rule above\n  for one-off reports and diagnostics; do not mix temporary run status, private paths,\n  personal information, or conversation identifiers into public maintenance guidance.\n- If there are no open issues or PRs, report the verified result without inventing\n  code changes or unnecessary repair branches.\n\n## Generated Mirrors\n\n`plugins/kami/skills/kami/` mirrors the distributable files from `skills/kami/`;\nthe two plugin manifests live in the outer `plugins/kami/` directory. The generated\ncopy excludes local fonts, render output, and caches. `.claude-plugin/marketplace.json`\nand `.agents/plugins/marketplace.json`\npoint at it. Edit `skills/kami/` only and let `python3 scripts/build_metadata.py\n--check` catch drift. Regenerate after any change under `skills/kami/`.\n\nThe same generator owns the site's machine-readable files under `site/`:\n`.well-known/agent-skills/index.json` (carries a SHA-256 digest of `SKILL.md`, so any\nskill edit changes it), `.well-known/mcp/server-card.json` (version plus the tool list\nparsed out of `scripts/mcp_server.py` without importing it), `feeds/catalog.jsonld`\n(built from `HTML_TEMPLATES` / `DIAGRAM_TEMPLATES`), `schemamap.xml`, and\n`kami-skill.md` (the copy served at `/SKILL.md`). Never hand-edit these; change the source and\nregenerate.\n\nMarketplace, plugin path, version, or install-path changes need runtime installation\nproof, not metadata proof. Claude Code: an isolated `HOME=/tmp/...` smoke with\n`claude plugin marketplace add <path>`, `claude plugin install kami@kami`,\n`claude plugin details kami@kami`, confirming the installed cache is the lightweight\n`plugins/kami` tree. Codex: an isolated `CODEX_HOME=/tmp/...` smoke with\n`codex plugin marketplace add <path>`, `codex plugin add kami@kami`,\n`codex plugin list`.\n\n## Refactor And Packaging Hard Stops\n\n- The shipped archive must be the output of `bash scripts/package-skill.sh`: a\n  top-level `kami/` directory under a 6 MB ceiling. A hand-zipped checkout is\n  rejected on size.\n- `scripts/package-skill.sh` packages `git ls-files skills/kami`, so an untracked new\n  module passes every local import and silently disappears from the archive. When\n  adding a runtime module, confirm it is tracked by Git before calling the change done.\n- The archive is not tracked. `release.yml` builds it from the tagged commit and\n  uploads it, so a fix reaches `npx skills add` and plugin installs on the next `main`\n  push but reaches Claude Desktop users only at the next release; name the channel\n  that actually carries the fix before saying \"fixed, please update\".\n- A versioned release must come from a commit reachable from `origin/main` with a\n  successful exact-SHA `check.yml` run triggered by a `main` push. Published\n  same-version assets are immutable in practice: a rerun may reuse `kami.zip` only\n  when its entry names and payloads are identical, otherwise cut a new patch version.\n- If `python3 scripts/build.py --verify` fails only because the host Python lacks PPTX\n  fallback dependencies such as `python-pptx`, verify `slides` and `slides-en` from a\n  temporary venv instead of treating the environment miss as a source regression.\n- Resume templates (`assets/templates/resume.html`, `resume-en.html`, `resume-ko.html`) carry a two-page\n  contract. Do not fix overflow by shrinking type or spacing globally first. Verify\n  with `python3 scripts/build.py --verify resume`, `--verify resume-en`, and `--verify resume-ko`.\n- Demo files such as `site/assets/demos/demo-resume-ko.html` own demo content, not the\n  template contract. Durable rules go into templates or `references/`.\n\n## CI Gotchas\n\nApplies when editing `.github/workflows/*.yml` or adding a test with a heavy\ndependency.\n\n- `check.yml` has two jobs. `lint-and-test` runs dependency-light lint, metadata,\n  and package gates. `verify-render` installs `weasyprint` / `pypdf` / `PyMuPDF` /\n  `Pygments` / `python-pptx`, sets up Node 22 and runs `bash scripts/ensure_mathjax.sh`, then\n  installs the checkout with `npx skills add` under a throwaway `HOME` and asserts\n  the bare install is the kami skill alone (`SKILL.md` and `scripts/build.py`\n  present, no `index.html`, no `site/`, no `TsangerJinKai02-W04.ttf`, unpacked tree\n  under 6000 KB, a separate ceiling from the 6 MB ZIP limit under Refactor And\n  Packaging Hard Stops), which is why a layout or size regression surfaces under a\n  job named `render and verify`. It then runs the full test suite before template\n  verification, including the three unlimited-page long-doc targets for rendered\n  TOC counters. Tests that need an optional render dependency use the suite's\n  explicit `SKIP:` counter and fail when a CI-required dependency is unavailable;\n  never turn a skip into `OK:`.\n- CI installs its Python dependencies and the skills CLI unpinned on purpose: users\n  install the same unpinned way, so an upstream release that breaks Kami should turn\n  CI red before it reaches them.\n- Validate workflow edits with the CI run for the exact pushed commit on the authorized\n  branch; do not create a feature branch solely for validation. A local pass does not\n  prove CI font or dependency availability: check cache manifests, Ubuntu fallback\n  fonts (DejaVu / Liberation), and the absence of commercial fonts (Charter / TsangerJinKai02).\n- Host-versus-CI differences are expressed as explicit opt-in env vars, currently\n  `KAMI_ALLOW_FALLBACK_ONLY` (accept fallback fonts), `KAMI_AUTHOR`, `KAMI_FONT_DIR`,\n  `KAMI_PACKAGE_ROOT_NAME`, `KAMI_PACKAGE_MAX_BYTES`, and `KAMI_UPDATE_URL`. That is\n  already the ceiling: before adding another, move the behavior into a `--ci-mode`\n  flag or a config file rather than letting `KAMI_*` sprawl.\n\n## Current Risk Areas\n\n- WeasyPrint rendering is sensitive to font availability, solid hex tag backgrounds,\n  page breaks, CJK fallback, and synthetic bold. Verify visually for template changes.\n- Slide output has three paths: `slides-weasy*.html` for default PDF decks,\n  `slides*.py` for the editable PPTX fallback, and\n  `assets/templates/marp/slides-marp*.{md,css}` for Markdown-first Marp decks.\n- Marp theme CSS inlines a full copy of the design tokens because Marp themes must be\n  self-contained. `build.py --sync` / `--check` token-sync those files and the CSS\n  lint rules scan them (both walk `shared.iter_template_files`), so token drift is\n  caught. The remaining hole: the off-palette hex guard globs `*.html` only\n  (`TEMPLATES/*.html` and `site/assets/demos/*.html`), so an off-palette color in Marp CSS\n  still needs eyeball review.\n- Resume targets require exactly two pages in all three language variants. Other\n  `build_max_pages` values in `scripts/shared.py` are ceilings (one-pager 1, letter 1,\n  changelog 2, equity-report 3; long-doc, portfolio, and slides-weasy are `0` =\n  unlimited). Other undershooting documents are not flagged, so \"this long-doc came out\n  at 3 pages\" is an authoring judgment call, not a gate failure. Landing pages are\n  browser-only HTML with no page count at all.\n- `scripts/render.py` sets PDF `/Author` from `git config user.name` or `KAMI_AUTHOR`\n  only when the template still holds an author placeholder. `/Producer` and `/Creator`\n  stay `Kami`.\n- Long-doc TOCs use WeasyPrint `target-counter()` and stable chapter ids for rendered\n  page numbers; do not reintroduce hand-written `.toc-page` spans. The row anchor must\n  stay `display: block` with the numeral floated right: WeasyPrint 70.0 resolves\n  `target-counter` to 0 on a flex anchor, and a `0` is valid-looking text that only the\n  `--verify` link cross-check catches (production.md pitfall 24). Running headers\n  default to `h1`. If a filled document does not use `h1` for chapter titles, add\n  `.running-title` to the element that should drive the header.\n- AI and public visibility spans `site/index*.html`, `site/llms.txt`, `site/robots.txt`,\n  `site/sitemap.xml`, FAQ JSON-LD, README install text, diagram counts, and release archive\n  links. Diagram count and names must stay aligned across `SKILL.md`, `CHEATSHEET.md`,\n  `README.md`, `index*.html`, and `assets/diagrams/`.\n\n## Critical Line-Break Scan\n\nApplies before handing off any user-visible typeset deliverable (rendered PDF,\n`README.md`, public site page).\n\n- Scan page by page for three wrap candidates: a trailing line of only 1-2 words\n  (orphan), a line one word away from wrapping, and a line that wraps early without\n  filling its container. Confirm each in rendered context; an intentional short line\n  is valid and does not need rewriting to make the count zero.\n- Split the work: `python3 scripts/build.py --check-orphans <pdf>` and\n  `--check-density <pdf>` catch PDF orphans and sparse pages deterministically; the\n  manual pass covers what they cannot see, near-wrap and premature-wrap states inside\n  a page, plus non-PDF surfaces (README and the responsive matrix in `references/design.md`).\n- One confirmed defect means a whole-document sweep for that class, not a single-spot fix. Check container geometry and forced breaks before shortening copy; preserve\n  facts and approved wording. Do not shrink type to dodge a wrap; deliberate layout\n  changes must re-pass `python3 scripts/build.py --check` and the page-count\n  contract.\n\n## Evals\n\n`evals/<case>/` holds end-to-end cases for `claude plugin eval`: a realistic request\nwith invented data (`prompt.md`), and graders for skill trigger, PDF (or HTML)\ncreation, and unfilled placeholders, plus fact fidelity in the HTML. Fact fidelity is\na `regex` grader wherever the facts are literal (one-pager-en, resume-cn): LLM judges\nsplit on derived figures and reported false FAILs on outputs whose facts were all\npresent. Keep an LLM judge only for what a pattern cannot read (Korean-only text,\nassertion titles, arithmetic). `evals/score.py` then applies Kami's own gates to each\nkept run workspace (page contract, atomic facts in the PDF text, fonts, density,\nresidue, style, resume balance, generated chart count), which the harness cannot run\nitself; it is read-only unless given `--write`, which saves `gate-scores.json`. One\nsuite run is 9 cases, 18 document builds at `--runs 2`, at roughly $1-3 each.\n\n- Run it after any change to `SKILL.md`, a reference the tier table routes to, a\n  template, or a gate an agent relies on, and compare against the previous run on the\n  same cases; one run per case is noise, use `--runs 2` or more.\n- The harness reads the plugin from `plugins/kami` live. Never run\n  `scripts/build_metadata.py` while a suite is running, and regenerate it before a run\n  so the suite tests the current skill.\n- A file grader takes an exact path; globs such as `*.html` fail with \"path does not\n  exist\". Every prompt pins its output file names for that reason.\n- Kept workspaces live under `/private/tmp/e-*/sealed/home/cwd` with mode 000;\n  `score.py` opens them itself. Results stay in the ignored `evals/results/`.\n- Mathematics is not covered: the sandbox cannot install the MathJax runtime.\n- LLM fidelity rubrics carry the case's full brief, because a judge that sees only a\n  partial fact list fails supplied facts as invented. On artifacts over about 15k\n  characters the harness judge is unreliable: before treating its FAIL as real,\n  re-judge the stored `evidence` HTML with the same rubric (`claude -p --model sonnet`)\n  and read the stated reason. In the 2026-10-15 baseline that split four failing cases\n  into two noisy votes and two real unlabelled derived figures.\n- resume-cn deliberately supplies thin notes (three employers, eight bullets). The\n  expected behavior is two honest pages with `[DATA NEEDED]` gaps and a reported\n  balance shortfall (`references/resume-writing.md` «Thin source»). `--deliver` and\n  `score.py` both read that through `checks.resume_thin_source` and treat it as a\n  reported gap rather than a balance failure.\n\n## Verification\n\n`SKILL.md` «5 · Deliver» owns the document side: `build.py --deliver` runs every\ndocument gate (placeholders, math, residue, style, content coverage, render, page\ncontract, resume balance, fonts, density, orphans, page images) in order and ends\nin one verdict. This section covers the maintenance side only.\n\n- Template or CSS changes: `python3 scripts/build.py --check` (CSS lint, token sync,\n  base/variant cross-template `:root` consistency, currently CN to EN and CN to KO)\n  plus `--verify` for the affected targets, or full `--verify` when the change is\n  cross-template.\n- Script changes: `python3 scripts/tests/test_build.py` and\n  `python3 scripts/build.py --check`. Run full `--verify` only when the render\n  pipeline itself changed (`render.py`, `verify.py`, WeasyPrint handling).\n- Font-stack changes (any `--serif` / `--mono` / SVG `text` chain): rebuild the\n  examples, then `python3 scripts/build.py --check-fonts assets/examples/*.pdf`. The\n  page-count contract cannot see which family actually drew the text, and a wrong one\n  renders cleanly; this is how the diagram labels were found splitting mid-word across\n  two faces.\n- Demo changes: regenerate the affected demo outputs and confirm page counts stay in\n  range. Font issues: `bash scripts/ensure-fonts.sh`, then rebuild the target.\n- MCP server changes: smoke the stdio protocol end to end (initialize, tools/list, one\n  tools/call per changed tool) through a scripted stdin session, and check that output\n  stays newline-delimited JSON with no stray prints on stdout.\n- Packaging changes: `bash scripts/package-skill.sh dist/kami.zip`, then `unzip -l\n  dist/kami.zip` to inspect for accidental large fonts, cache files, or a missing new\n  helper.\n- Marketplace or plugin changes: `python3 scripts/build_metadata.py --check` plus the\n  isolated install smoke described under Generated Mirrors.\n- Public site or AI visibility changes: check `site/index*.html`, README,\n  `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, JSON-LD, FAQ, install links, and download links\n  together, then serve the page and verify the responsive matrix in\n  `references/design.md` per locale.\n\n## Fonts\n\n`references/production.md` Part 1 «Fonts» owns the full stack: per-language family\nchains, fallbacks, `@font-face` paths, and the recovery flow. Two facts that must not\ndrift out of it:\n\n- `Source Han Serif KR` is the real family name inside the bundled OTFs and must stay\n  in every Korean fallback chain, otherwise fontconfig cannot resolve the\n  `ensure-fonts.sh`-downloaded font by name on an offline Linux skill install.\n- CJK families lead every stack that CJK text can reach, Latin faces trail. A leading\n  Latin serif ends the stack walk for characters it lacks, which sends each ideograph\n  to fontconfig separately and splits words across two faces inside inline SVG\n  (`production.md` pitfall #4.1). The `-en` templates are the deliberate exception:\n  they are Latin documents, so `Charter` stays first there.\n- The commercial TsangerJinKai02 files never ship inside the skill package, so a\n  sandboxed install has no primary CJK serif and falls through the chain. Keep the\n  chain wide (Source Han Serif SC and CN, Noto Serif CJK SC and Noto Serif SC, Songti\n  SC, STSong, SimSun) so it lands on some serif rather than a system sans.\n- `bash scripts/ensure-fonts.sh` downloads into the XDG user font dir\n  (`${XDG_DATA_HOME:-~/.local/share}/fonts/kami`, override with `KAMI_FONT_DIR`),\n  never into the skill's `assets/fonts`, so an installed Claude Desktop skill stays\n  small. Inside a repo checkout it first restores missing or truncated font files from the root\n  `assets/fonts/` into the skill's ignored font directory. It downloads to the user\n  font directory only when usable fonts are still missing. Commercial use of TsangerJinKai02 requires\n  the appropriate license.\n\n## Releasing\n\n`docs/release.md` owns release notes format, the tag and asset flow, and demo\nscreenshot regeneration commands. Read it when cutting or refreshing a release.\n","CLAUDE.md":"# Kami Agent Guide\n\n## Project\n\nKami is a document-generation skill and template system: self-contained editorial HTML\ntemplates rendered to PDF / PPTX / PNG, plus reference specs, demo assets, and a\npackaged skill archive. `SKILL.md` is the runtime manual for producing a document.\nThis file is the maintenance guide for changing the repository itself, and it records\nthe traps that a fresh read of the code does not reveal.\n\n## Layout\n\nOne repository, three top-level roles, and the install tools only ever copy the first:\n\n- `skills/kami/` is the skill and the only thing users install: `SKILL.md`,\n  `CHEATSHEET.md`, `VERSION`, `LICENSE`, `references/`, `scripts/`, and the light\n  `assets/` (templates, diagrams, logo, the two small font files). `npx skills add\n  tw93/kami` copies exactly this directory; `bash scripts/package-skill.sh` zips it\n  as `kami/` for Claude Desktop; `plugins/kami/skills/kami/` is a generated copy of it\n  inside the Claude and Codex plugin. Ignored render output lives in\n  `skills/kami/assets/examples/`. Every skill-relative path in `SKILL.md`\n  resolves inside this directory, so nothing here may reach up into the repo.\n- `site/` is kami.tw93.fun. The Vercel project's Root Directory is `site` (project\n  setting, not a file), so only this tree deploys and `site/vercel.json` is the only\n  Vercel config. It carries the pages, `styles.css`, `llms.txt`, `robots.txt`,\n  `sitemap.xml`, `vercel.json`, `.well-known/`, `feeds/`, and the heavy showcase and\n  demo assets. Skill facts it shows (`SKILL.md`, the discovery files) are generated\n  into it, never hand-copied. `/SKILL.md` and `/kami-skill.md` send\n  `X-Robots-Tag: noindex`: agents can still fetch the markdown, and search\n  engines should not score that file as an HTML page.\n- The root holds repository tooling only: `scripts/` (`build_metadata.py`,\n  `package-skill.sh`, `release_gate.py`, `draft-release-notes.py`, `tests/`),\n  `assets/fonts/` (the commercial TTFs; run `bash skills/kami/scripts/ensure-fonts.sh`\n  once after cloning to copy them into the skill's ignored `assets/fonts/`, otherwise\n  templates fall back to jsDelivr), `evals/` (the end-to-end skill eval suite, see\n  Evals below), `docs/`, and `.github/`.\n\nRun skill-side commands from `skills/kami/` (`cd skills/kami && python3\nscripts/build.py --check`); the paths below are written from that directory unless\nthey start with `scripts/build_metadata.py`, `scripts/package-skill.sh`,\n`scripts/release_gate.py`, or `scripts/tests/`, which live at the root. Paths under\n`site/`, `plugins/`, `docs/`, `.github/`, `.claude-plugin/`, and `.agents/` are also\nrelative to the repository root.\n\n## Repository Map\n\nOnly the entries whose role is not obvious from the filename:\n\n- `SKILL.md` - skill routing plus the document-side build and verify commands.\n  `CHEATSHEET.md` - quick design reference. Both ship inside the package.\n- `references/design.md`, `writing.md`, `production.md`, `diagrams.md` - full specs.\n  `production.md` Part 4 is the single source of truth for render failures, their\n  verified causes, and their fixes; add pitfalls there, not here.\n  `docs/release.md` - release notes, release flow, demo screenshot regeneration.\n  `anti-patterns.md`, `resume-writing.md`, `mermaid.md`, `deck-preflight.md`,\n  `brand-profile.md` and `brand.example.md` - scoped guides.\n- `references/tokens.json` (color tokens, drift-checked by `scripts/tokens.py`),\n  `references/mermaid-theme.json` (Kami to beautiful-mermaid theme, kept in sync with\n  `tokens.json`), `references/checks_thresholds.json` (rhythm / density / orphan /\n  visual thresholds read by `checks.py` and `visual.py`). These are live inputs to\n  gates: editing a number changes what passes.\n- `references/schemas/` - one JSON Schema subset per document type. The `$comment`\n  fields carry the per-field quality bar distilled from `writing.md`, so schema edits\n  and `writing.md` edits move together.\n- `scripts/shared.py` - the canonical registries (`HTML_TEMPLATES`,\n  `SCREEN_TEMPLATES`, `PPTX_TEMPLATES`, `MARP_TEMPLATES`, `DIAGRAM_TEMPLATES`) and each template's\n  `build_max_pages`. `build.py` derives its internal build targets from them;\n  Marp stays discovery-only because it uses an external CLI. Add or remove a\n  template or diagram here, never in a per-script dict.\n- `scripts/render.py` - the single render entry (`render_pdf`, `build_slides`, PDF\n  metadata stamping). `build.py`, `verify.py`, and `mcp_server.py` all call it; never\n  open a second WeasyPrint call site.\n- `scripts/diagram_geometry.py` checks annotated architecture SVG through the existing\n  lint entry points. Keep geometry in the actual rect/line/polyline attributes,\n  never a second JSON source. Mark node rectangles, edge shafts and label masks;\n  leave boundary frames and arrowheads unmarked. Static mask checks do not replace\n  rendered text-fit and arrowhead inspection.\n- `scripts/deliver.py` - `build.py --deliver`, the one command `SKILL.md` gives an\n  agent to finish a document: every document gate in a fixed order, the render, page\n  images, and a single READY / NOT READY verdict. It owns the order; the individual\n  `--check-*` flags stay for debugging one gate. Template family comes from content IR\n  `type`, else from stylesheet overlap with the registered templates.\n  `deliver(args, result)` also fills a dict with the same outcome for the MCP\n  `kami_deliver` tool; `mcp_server.DELIVER_GATE_RULES` maps every deliver gate to a\n  `kami_check` rule or declares it deliver-only, and `test_mcp` fails on a new gate\n  that is in neither.\n- `scripts/chart.py` - `build.py --chart` / `--check-charts`: data spec to SVG for\n  bar, line, hbar, donut, candlestick, and waterfall. Chart geometry lives only here;\n  each SVG embeds its spec in `data-kami-spec` and the drift gate regenerates and\n  compares the marks. The five chart files in `assets/diagrams/` are its output for\n  their demo data: change a chart's look in `chart.py` and regenerate them, never\n  edit their SVG by hand (`--check` fails on drift).\n- `scripts/brand_extract.py` - drafts a brand profile from a public website (colors,\n  fonts, logo candidates, one contrast-checked accent). It fetches only the page and\n  same-site stylesheets and never writes into `~/.config/kami/`.\n- `scripts/html_visibility.py` - shared static HTML/CSS visibility analysis for\n  `content.py` coverage and `checks.py` residue checks. Keep its conservative\n  coverage and residue modes distinct; it does not implement browser layout.\n- `scripts/tests/test_build.py` - the stable test entry point; sibling `test_*.py`\n  modules group tests by responsibility, with counters and fixtures in `support.py`.\n  `scripts/tests/corpus/<gate>/{flag,pass}/` is the labelled corpus for the PDF\n  gates (orphans, density, resume balance), rendered and judged by `test_corpus.py`.\n  Before changing a value in `checks_thresholds.json`, run it and read the per-gate\n  `CORPUS:` line; a fixture that flips is the cost of the change, not noise.\n- `scripts/mermaid_normalize.py` - re-themes a beautiful-mermaid SVG to the Kami\n  palette and makes it WeasyPrint-safe. Pure Python, no Node, ships in the package.\n- `scripts/mcp_server.py` - zero-dependency MCP stdio server exposing\n  `kami_templates` / `kami_doctor` / `kami_render` / `kami_check` /\n  `kami_deliver` / `kami_screenshot`, so an MCP-capable agent can diagnose, render, and verify\n  without reading `SKILL.md`. Register\n  with `claude mcp add kami -- python3 <checkout>/skills/kami/scripts/mcp_server.py`.\n- `scripts/math_render.py`, `scripts/mathjax_svg.js`, `scripts/ensure_mathjax.sh`,\n  `scripts/mathjax-runtime/` - strict LaTeX to MathJax SVG; `render.py` imports\n  `math_render`. This is the only Node dependency (Node 20 or 22+, refused otherwise),\n  installed on demand by `ensure_mathjax.sh` from the tracked `package-lock.json`;\n  all four ship in the package allowlist.\n- `scripts/site_facts.py` - public-site fact drift checks (install commands, version,\n  template and diagram counts across `site/index*.html`, the root `README.md`,\n  `site/llms.txt`), wired into `build.py --check`; it resolves those files through\n  `shared.REPO_ROOT` / `shared.SITE_ROOT` and skips itself in an installed skill.\n- `scripts/check-update.sh` - quiet daily update check invoked from `SKILL.md`;\n  writes a local cache marker, then resolves the latest published GitHub Release\n  at most once per day. It uploads no user document or task content and stays\n  silent on failure.\n- `site/assets/showcase/` - README and public-site screenshots only.\n  `site/assets/demos/` - README showcase demos. Neither is part of the skill.\n- `assets/diagrams/src/*.mmd` - Mermaid source of the sequence / class / er diagrams.\n  `assets/templates/marp/` - the Markdown-first Marp deck variant.\n- `dist/` is ignored. The release archive is built by `release.yml` from\n  `skills/kami` and uploaded as a release asset; nothing tracks it.\n- `plugins/kami/`, `.claude-plugin/marketplace.json`,\n  `.agents/plugins/marketplace.json`, and the site's discovery files are\n  **generated**; see Generated Mirrors below.\n- Public site surface under `site/`: `index.html` plus `index-zh|en|ja|ko|tw.html`,\n  the English-only prose pages `developers|about|contact|privacy.html`, `styles.css`,\n  `llms.txt`, `robots.txt`, `sitemap.xml`, `vercel.json`. `styles.css` is Kami's own site shell\n  (language switcher, gallery, responsive behavior, `.hero.doc` / `.prose` for the\n  prose pages); generic template rules never belong there.\n- Agent-facing site surface, also under `site/`: `index.md` (Markdown twin of the homepage; `vercel.json`\n  *redirects* `/` here for `Accept: text/markdown` and `/?mode=agent`, because Vercel\n  applies `rewrites` only after the filesystem and `/` always matches `index.html`),\n  `developers|about|contact|privacy.md`, `developers/llms.txt`, and the generated\n  `.well-known/agent-skills/index.json`, `.well-known/mcp/server-card.json`,\n  `feeds/catalog.jsonld`, `schemamap.xml`, `kami-skill.md` (served at `/SKILL.md` through a rewrite; it must not be named `SKILL.md`, or the skills CLI installs the site). Every new prose page needs its `.md` twin,\n  a `rewrites` entry for the extensionless URL, and a `sitemap.xml` row.\n  The `has`-conditioned redirects and the `Link` headers are only observable on a\n  deploy: verify them with `curl -sI` against the preview URL, never locally.\n- `.github/workflows/check.yml` (PR/push CI) and `release.yml` (tag-triggered build\n  and asset upload).\n\nReference docs are English-first and never forked per language. Inline CJK examples\nare fine where the rule itself is about CJK typography (term annotation, punctuation,\nspacing); language-specific output differences (CN/EN/KO) live in templates, not in\nduplicated reference files.\n\n## Commands\n\n`python3 scripts/build.py --help` prints the authoritative flag list and the module\nmap. Read it instead of trusting any copy; hand-maintained lists here have gone stale\nbefore. The commands it does not cover:\n\n```bash\n# from the repository root\npython3 scripts/build_metadata.py            # regenerate plugins/kami, marketplaces, site discovery files\npython3 scripts/build_metadata.py --check    # drift check for the same\nbash scripts/package-skill.sh dist/kami.zip  # build the Claude Desktop archive from skills/kami\npython3 scripts/tests/test_build.py          # full test suite\npython3 scripts/draft-release-notes.py V1.4.0..HEAD --version V1.4.1 --title \"Steadier Hand\"\nclaude plugin eval . --runs 2 --ablation none -j 4 --keep-temp --trust-plugin --no-publish \\\n  --threshold 0 --judge-model sonnet --allow-tools Bash Write Edit   # end-to-end skill evals\npython3 evals/score.py                       # deterministic gates over the newest eval run\n# from skills/kami\nbash scripts/ensure-fonts.sh                 # recover missing or truncated CJK fonts\npython3 scripts/mcp_server.py                # MCP stdio server (render / check / screenshot)\npython3 scripts/mermaid_normalize.py raw.svg -o clean.svg\n```\n\n## Working Rules\n\n- `SKILL.md` is loaded whole on every trigger, so it carries routing, the execution\n  contract, hard prohibitions, `--deliver`, and the feedback protocol, nothing else.\n  Type-specific procedure (page density, resume recruiter pass, landing site mode,\n  charts, illustrations) lives in the reference the tier table already sends the\n  agent to. Before adding a paragraph to `SKILL.md`, name the eval case it fixes;\n  before removing one, run the suite and compare against the last baseline.\n\n- Style changes must update `references/design.md` and the matching template tokens.\n- A CSS snippet in a reference doc is a shipped artifact, not prose: an agent copies\n  it before it reads a template. Every fenced `css` / `html` block is scanned by\n  `--check-docs` (inside `--check`) with the template rule set, and every `var()` it\n  names must resolve to a registered token or one a shipped template defines. Teach\n  from a component a template actually has; a recipe for assembling a new container\n  is how a document ends up carrying three unrelated emphasis languages. Tag a\n  deliberate counter-example inline with `/* avoid */` so the scan reads it as the\n  lesson rather than the violation.\n- A change touching template tokens, shared CSS gestures, or `references/design.md`\n  visual rules must rebuild the affected demo outputs (`site/assets/demos/*.pdf` / `*.png`)\n  in the same change, not as a later cleanup. Demos inline their CSS by copy, so they\n  silently keep the old style otherwise. Report the sweep: rebuilt N demos, K\n  unaffected. The off-palette guard in `scripts/lint.py` scans `site/assets/demos/*.html`\n  for stale hexes as a backstop, but it cannot see rendered PDFs or PNGs.\n  Repository scans must reject an empty expected demo set; installed skills may\n  skip the site because it is outside their distribution boundary. Test both modes\n  with a known violating demo whenever repository paths change.\n- Templates intentionally inline their CSS rather than share a `_kami.css` partial:\n  each template must stay a single self-contained HTML file the user can copy-paste\n  with no build step. Fix CSS drift by applying the same change across the affected\n  templates, never by introducing a build-time include.\n- For document or template tasks, lock the output contract before editing: language,\n  template, output format, page or length target, visual acceptance check, and\n  verification command.\n- Prefer the nearest existing template and deterministic verifier. Do not add a\n  template, shared CSS layer, dependency, script flag, or optional mode unless the\n  current request cannot be satisfied without it. A new template copies the nearest\n  existing one, stays aligned with `references/design.md`, and adds demo coverage; a\n  new document type also needs a schema in `references/schemas/`.\n- Slides default to WeasyPrint HTML-to-PDF templates unless the user explicitly needs\n  editable PPTX output.\n- Mermaid diagrams: never embed raw beautiful-mermaid SVG into a PDF-bound template.\n  WeasyPrint cannot resolve `color-mix()`, render `<foreignObject>`, or fetch a\n  runtime web font, so always pipe through `scripts/mermaid_normalize.py` first\n  (`--check` enforces this). `xychart-beta` is browser-only because it styles through\n  `<style>` class selectors; use the hand-drawn chart diagrams for PDF. Full flow in\n  `references/mermaid.md`.\n- Do not use graphic emoticons in docs, template comments, or script output. Use `OK:`\n  and `ERROR:` for script status text.\n- Do not use em dashes (U+2014) in repository docs, generated documents, template\n  comments, or site copy; use colons, commas, periods, or parentheses. Self-check:\n  `grep -rn \"$(printf '\\342\\200\\224')\" README.md site/llms.txt site/index*.html`. Teaching\n  counter-examples inside `references/anti-patterns.md` are exempt; its rule #28\n  covers the generated-document side.\n- For hosted-site or public-landing work, separate generic template work from Kami's\n  own website first. Generic behavior lives in `assets/templates/landing-page*` and\n  `references/`; Kami site facts live across `site/index*.html`, `site/styles.css`,\n  `README.md`, `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, and\n  `site/vercel.json`. Public facts are wider\n  than the hero: pricing, install path, version, release, support, analytics, FAQ, and\n  positioning claims move together across pages, metadata, AI files, and download\n  links. Do not leave a site-only analytics or tracking change contradicting the\n  \"no analytics\" copy elsewhere.\n- Landing or documentation-site work follows `references/design.md` Section 11 «Landing\n  Page (screen-first)»: its «Documentation site» subsection for the doc shell (sidebar\n  rail, on-this-page TOC, borderless prev/next pager), then the «Responsive\n  screenshot verification» subsection that closes the section (breakpoint, tablet, and baseline screenshots\n  per locale, objective line-widow scan) before shipping.\n- Content changes should avoid CSS churn unless layout behavior is part of the task.\n- Public copy states the product function before design terminology. Write each locale\n  naturally, preserve approved taglines and personal stories, and keep claims identical\n  across HTML, Markdown, metadata, and FAQ JSON-LD. Writing rules and schema comments\n  must not require poetic captions, invented benefits, numeric filler, or rewrite quotas.\n  Distinguish local document processing from update checks, remote assets, and the AI\n  provider’s data handling.\n- Brand profile support is optional context. Keep public examples in `references/`; do\n  not hard-code a maintainer's private local profile.\n- Demo, reference-example, and handoff content distilled from a maintainer's private\n  documents (resume, business proposal, pricing, client names) must be de-identified\n  before it lands in the repo: swap in public figures, public projects, or invented\n  generic data. Job-search, quote, and engagement-period fields count as sensitive\n  even without names. List the swapped-out identifying signals in the handoff report;\n  do not rely on the maintainer to spot leftovers.\n- Do not commit one-off review reports or diagnostic snapshots as durable docs.\n  Extract the stable rule into `AGENTS.md`, `SKILL.md`, or `references/`, then discard\n  the report.\n\n## Issue And PR Maintenance\n\n- Use official GitHub API or CLI for issue and PR work. Read the complete discussion,\n  associated PRs, current source, and relevant tests before deciding what to change.\n- Before each modification, check related local and live remote commits, branches,\n  worktrees, accessible existing agent conversations, and the project inventory.\n  Report the deduplication evidence and current owner before starting implementation.\n- Validate an existing fix rather than implementing it again. When another conversation\n  owns work in progress, leave implementation with that owner and report its verified\n  identifier and status. Do not modify another conversation's uncommitted work.\n- State access and inventory coverage gaps explicitly. A missing search result is not\n  evidence that nobody owns the work; do not bypass reading restrictions.\n- Perform development, builds, and tests in the user's local Mac checkout and\n  branch. Do not default to creating a new PR, opening a cloud execution environment,\n  or manually triggering remote CI. Preserve existing PRs and existing push-triggered\n  CI; do not disable or reconfigure them. Pushes may continue under applicable\n  specific authorization. Preserve the current branch while branch selection is\n  unclear; do not switch or merge into main based on this workflow preference.\n- Preserve the current checkout and user changes. Implement repairs on a separate\n  branch or worktree, locate the cause before targeted tests, and avoid concurrent\n  heavy builds. Never clean real user data to test a repair.\n- Close a duplicate, verified resolved item, or clearly unrelated report only when the\n  evidence and applicable user authorization support closure. Keep unresolved or\n  uncertain reports open; an empty queue is not a correctness goal.\n- Before implementing any change to a user interface, visual effect, interaction,\n  user-facing parameter, or configuration default, present the concrete change to\n  the user and obtain explicit confirmation. General repair or push authorization\n  does not replace this confirmation. Include the issue, original behavior, proposed\n  change, necessity, and alternatives. Pause and isolate any such unapproved work\n  already in progress; do not submit or ship it. Report any already pushed changes\n  accurately and do not roll them back without authorization. Internal repairs that\n  do not change user behavior may continue under their applicable authorization.\n- Confirm applicable authorization separately for commits, pushes, merges, and\n  releases. Distinguish code fixed, tests passed, committed, released, and user retested.\n- Keep reusable project guidance in this repository. Follow the existing rule above\n  for one-off reports and diagnostics; do not mix temporary run status, private paths,\n  personal information, or conversation identifiers into public maintenance guidance.\n- If there are no open issues or PRs, report the verified result without inventing\n  code changes or unnecessary repair branches.\n\n## Generated Mirrors\n\n`plugins/kami/skills/kami/` mirrors the distributable files from `skills/kami/`;\nthe two plugin manifests live in the outer `plugins/kami/` directory. The generated\ncopy excludes local fonts, render output, and caches. `.claude-plugin/marketplace.json`\nand `.agents/plugins/marketplace.json`\npoint at it. Edit `skills/kami/` only and let `python3 scripts/build_metadata.py\n--check` catch drift. Regenerate after any change under `skills/kami/`.\n\nThe same generator owns the site's machine-readable files under `site/`:\n`.well-known/agent-skills/index.json` (carries a SHA-256 digest of `SKILL.md`, so any\nskill edit changes it), `.well-known/mcp/server-card.json` (version plus the tool list\nparsed out of `scripts/mcp_server.py` without importing it), `feeds/catalog.jsonld`\n(built from `HTML_TEMPLATES` / `DIAGRAM_TEMPLATES`), `schemamap.xml`, and\n`kami-skill.md` (the copy served at `/SKILL.md`). Never hand-edit these; change the source and\nregenerate.\n\nMarketplace, plugin path, version, or install-path changes need runtime installation\nproof, not metadata proof. Claude Code: an isolated `HOME=/tmp/...` smoke with\n`claude plugin marketplace add <path>`, `claude plugin install kami@kami`,\n`claude plugin details kami@kami`, confirming the installed cache is the lightweight\n`plugins/kami` tree. Codex: an isolated `CODEX_HOME=/tmp/...` smoke with\n`codex plugin marketplace add <path>`, `codex plugin add kami@kami`,\n`codex plugin list`.\n\n## Refactor And Packaging Hard Stops\n\n- The shipped archive must be the output of `bash scripts/package-skill.sh`: a\n  top-level `kami/` directory under a 6 MB ceiling. A hand-zipped checkout is\n  rejected on size.\n- `scripts/package-skill.sh` packages `git ls-files skills/kami`, so an untracked new\n  module passes every local import and silently disappears from the archive. When\n  adding a runtime module, confirm it is tracked by Git before calling the change done.\n- The archive is not tracked. `release.yml` builds it from the tagged commit and\n  uploads it, so a fix reaches `npx skills add` and plugin installs on the next `main`\n  push but reaches Claude Desktop users only at the next release; name the channel\n  that actually carries the fix before saying \"fixed, please update\".\n- A versioned release must come from a commit reachable from `origin/main` with a\n  successful exact-SHA `check.yml` run triggered by a `main` push. Published\n  same-version assets are immutable in practice: a rerun may reuse `kami.zip` only\n  when its entry names and payloads are identical, otherwise cut a new patch version.\n- If `python3 scripts/build.py --verify` fails only because the host Python lacks PPTX\n  fallback dependencies such as `python-pptx`, verify `slides` and `slides-en` from a\n  temporary venv instead of treating the environment miss as a source regression.\n- Resume templates (`assets/templates/resume.html`, `resume-en.html`, `resume-ko.html`) carry a two-page\n  contract. Do not fix overflow by shrinking type or spacing globally first. Verify\n  with `python3 scripts/build.py --verify resume`, `--verify resume-en`, and `--verify resume-ko`.\n- Demo files such as `site/assets/demos/demo-resume-ko.html` own demo content, not the\n  template contract. Durable rules go into templates or `references/`.\n\n## CI Gotchas\n\nApplies when editing `.github/workflows/*.yml` or adding a test with a heavy\ndependency.\n\n- `check.yml` has two jobs. `lint-and-test` runs dependency-light lint, metadata,\n  and package gates. `verify-render` installs `weasyprint` / `pypdf` / `PyMuPDF` /\n  `Pygments` / `python-pptx`, sets up Node 22 and runs `bash scripts/ensure_mathjax.sh`, then\n  installs the checkout with `npx skills add` under a throwaway `HOME` and asserts\n  the bare install is the kami skill alone (`SKILL.md` and `scripts/build.py`\n  present, no `index.html`, no `site/`, no `TsangerJinKai02-W04.ttf`, unpacked tree\n  under 6000 KB, a separate ceiling from the 6 MB ZIP limit under Refactor And\n  Packaging Hard Stops), which is why a layout or size regression surfaces under a\n  job named `render and verify`. It then runs the full test suite before template\n  verification, including the three unlimited-page long-doc targets for rendered\n  TOC counters. Tests that need an optional render dependency use the suite's\n  explicit `SKIP:` counter and fail when a CI-required dependency is unavailable;\n  never turn a skip into `OK:`.\n- CI installs its Python dependencies and the skills CLI unpinned on purpose: users\n  install the same unpinned way, so an upstream release that breaks Kami should turn\n  CI red before it reaches them.\n- Validate workflow edits with the CI run for the exact pushed commit on the authorized\n  branch; do not create a feature branch solely for validation. A local pass does not\n  prove CI font or dependency availability: check cache manifests, Ubuntu fallback\n  fonts (DejaVu / Liberation), and the absence of commercial fonts (Charter / TsangerJinKai02).\n- Host-versus-CI differences are expressed as explicit opt-in env vars, currently\n  `KAMI_ALLOW_FALLBACK_ONLY` (accept fallback fonts), `KAMI_AUTHOR`, `KAMI_FONT_DIR`,\n  `KAMI_PACKAGE_ROOT_NAME`, `KAMI_PACKAGE_MAX_BYTES`, and `KAMI_UPDATE_URL`. That is\n  already the ceiling: before adding another, move the behavior into a `--ci-mode`\n  flag or a config file rather than letting `KAMI_*` sprawl.\n\n## Current Risk Areas\n\n- WeasyPrint rendering is sensitive to font availability, solid hex tag backgrounds,\n  page breaks, CJK fallback, and synthetic bold. Verify visually for template changes.\n- Slide output has three paths: `slides-weasy*.html` for default PDF decks,\n  `slides*.py` for the editable PPTX fallback, and\n  `assets/templates/marp/slides-marp*.{md,css}` for Markdown-first Marp decks.\n- Marp theme CSS inlines a full copy of the design tokens because Marp themes must be\n  self-contained. `build.py --sync` / `--check` token-sync those files and the CSS\n  lint rules scan them (both walk `shared.iter_template_files`), so token drift is\n  caught. The remaining hole: the off-palette hex guard globs `*.html` only\n  (`TEMPLATES/*.html` and `site/assets/demos/*.html`), so an off-palette color in Marp CSS\n  still needs eyeball review.\n- Resume targets require exactly two pages in all three language variants. Other\n  `build_max_pages` values in `scripts/shared.py` are ceilings (one-pager 1, letter 1,\n  changelog 2, equity-report 3; long-doc, portfolio, and slides-weasy are `0` =\n  unlimited). Other undershooting documents are not flagged, so \"this long-doc came out\n  at 3 pages\" is an authoring judgment call, not a gate failure. Landing pages are\n  browser-only HTML with no page count at all.\n- `scripts/render.py` sets PDF `/Author` from `git config user.name` or `KAMI_AUTHOR`\n  only when the template still holds an author placeholder. `/Producer` and `/Creator`\n  stay `Kami`.\n- Long-doc TOCs use WeasyPrint `target-counter()` and stable chapter ids for rendered\n  page numbers; do not reintroduce hand-written `.toc-page` spans. The row anchor must\n  stay `display: block` with the numeral floated right: WeasyPrint 70.0 resolves\n  `target-counter` to 0 on a flex anchor, and a `0` is valid-looking text that only the\n  `--verify` link cross-check catches (production.md pitfall 24). Running headers\n  default to `h1`. If a filled document does not use `h1` for chapter titles, add\n  `.running-title` to the element that should drive the header.\n- AI and public visibility spans `site/index*.html`, `site/llms.txt`, `site/robots.txt`,\n  `site/sitemap.xml`, FAQ JSON-LD, README install text, diagram counts, and release archive\n  links. Diagram count and names must stay aligned across `SKILL.md`, `CHEATSHEET.md`,\n  `README.md`, `index*.html`, and `assets/diagrams/`.\n\n## Critical Line-Break Scan\n\nApplies before handing off any user-visible typeset deliverable (rendered PDF,\n`README.md`, public site page).\n\n- Scan page by page for three wrap candidates: a trailing line of only 1-2 words\n  (orphan), a line one word away from wrapping, and a line that wraps early without\n  filling its container. Confirm each in rendered context; an intentional short line\n  is valid and does not need rewriting to make the count zero.\n- Split the work: `python3 scripts/build.py --check-orphans <pdf>` and\n  `--check-density <pdf>` catch PDF orphans and sparse pages deterministically; the\n  manual pass covers what they cannot see, near-wrap and premature-wrap states inside\n  a page, plus non-PDF surfaces (README and the responsive matrix in `references/design.md`).\n- One confirmed defect means a whole-document sweep for that class, not a single-spot fix. Check container geometry and forced breaks before shortening copy; preserve\n  facts and approved wording. Do not shrink type to dodge a wrap; deliberate layout\n  changes must re-pass `python3 scripts/build.py --check` and the page-count\n  contract.\n\n## Evals\n\n`evals/<case>/` holds end-to-end cases for `claude plugin eval`: a realistic request\nwith invented data (`prompt.md`), and graders for skill trigger, PDF (or HTML)\ncreation, and unfilled placeholders, plus fact fidelity in the HTML. Fact fidelity is\na `regex` grader wherever the facts are literal (one-pager-en, resume-cn): LLM judges\nsplit on derived figures and reported false FAILs on outputs whose facts were all\npresent. Keep an LLM judge only for what a pattern cannot read (Korean-only text,\nassertion titles, arithmetic). `evals/score.py` then applies Kami's own gates to each\nkept run workspace (page contract, atomic facts in the PDF text, fonts, density,\nresidue, style, resume balance, generated chart count), which the harness cannot run\nitself; it is read-only unless given `--write`, which saves `gate-scores.json`. One\nsuite run is 9 cases, 18 document builds at `--runs 2`, at roughly $1-3 each.\n\n- Run it after any change to `SKILL.md`, a reference the tier table routes to, a\n  template, or a gate an agent relies on, and compare against the previous run on the\n  same cases; one run per case is noise, use `--runs 2` or more.\n- The harness reads the plugin from `plugins/kami` live. Never run\n  `scripts/build_metadata.py` while a suite is running, and regenerate it before a run\n  so the suite tests the current skill.\n- A file grader takes an exact path; globs such as `*.html` fail with \"path does not\n  exist\". Every prompt pins its output file names for that reason.\n- Kept workspaces live under `/private/tmp/e-*/sealed/home/cwd` with mode 000;\n  `score.py` opens them itself. Results stay in the ignored `evals/results/`.\n- Mathematics is not covered: the sandbox cannot install the MathJax runtime.\n- LLM fidelity rubrics carry the case's full brief, because a judge that sees only a\n  partial fact list fails supplied facts as invented. On artifacts over about 15k\n  characters the harness judge is unreliable: before treating its FAIL as real,\n  re-judge the stored `evidence` HTML with the same rubric (`claude -p --model sonnet`)\n  and read the stated reason. In the 2026-10-15 baseline that split four failing cases\n  into two noisy votes and two real unlabelled derived figures.\n- resume-cn deliberately supplies thin notes (three employers, eight bullets). The\n  expected behavior is two honest pages with `[DATA NEEDED]` gaps and a reported\n  balance shortfall (`references/resume-writing.md` «Thin source»). `--deliver` and\n  `score.py` both read that through `checks.resume_thin_source` and treat it as a\n  reported gap rather than a balance failure.\n\n## Verification\n\n`SKILL.md` «5 · Deliver» owns the document side: `build.py --deliver` runs every\ndocument gate (placeholders, math, residue, style, content coverage, render, page\ncontract, resume balance, fonts, density, orphans, page images) in order and ends\nin one verdict. This section covers the maintenance side only.\n\n- Template or CSS changes: `python3 scripts/build.py --check` (CSS lint, token sync,\n  base/variant cross-template `:root` consistency, currently CN to EN and CN to KO)\n  plus `--verify` for the affected targets, or full `--verify` when the change is\n  cross-template.\n- Script changes: `python3 scripts/tests/test_build.py` and\n  `python3 scripts/build.py --check`. Run full `--verify` only when the render\n  pipeline itself changed (`render.py`, `verify.py`, WeasyPrint handling).\n- Font-stack changes (any `--serif` / `--mono` / SVG `text` chain): rebuild the\n  examples, then `python3 scripts/build.py --check-fonts assets/examples/*.pdf`. The\n  page-count contract cannot see which family actually drew the text, and a wrong one\n  renders cleanly; this is how the diagram labels were found splitting mid-word across\n  two faces.\n- Demo changes: regenerate the affected demo outputs and confirm page counts stay in\n  range. Font issues: `bash scripts/ensure-fonts.sh`, then rebuild the target.\n- MCP server changes: smoke the stdio protocol end to end (initialize, tools/list, one\n  tools/call per changed tool) through a scripted stdin session, and check that output\n  stays newline-delimited JSON with no stray prints on stdout.\n- Packaging changes: `bash scripts/package-skill.sh dist/kami.zip`, then `unzip -l\n  dist/kami.zip` to inspect for accidental large fonts, cache files, or a missing new\n  helper.\n- Marketplace or plugin changes: `python3 scripts/build_metadata.py --check` plus the\n  isolated install smoke described under Generated Mirrors.\n- Public site or AI visibility changes: check `site/index*.html`, README,\n  `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, JSON-LD, FAQ, install links, and download links\n  together, then serve the page and verify the responsive matrix in\n  `references/design.md` per locale.\n\n## Fonts\n\n`references/production.md` Part 1 «Fonts» owns the full stack: per-language family\nchains, fallbacks, `@font-face` paths, and the recovery flow. Two facts that must not\ndrift out of it:\n\n- `Source Han Serif KR` is the real family name inside the bundled OTFs and must stay\n  in every Korean fallback chain, otherwise fontconfig cannot resolve the\n  `ensure-fonts.sh`-downloaded font by name on an offline Linux skill install.\n- CJK families lead every stack that CJK text can reach, Latin faces trail. A leading\n  Latin serif ends the stack walk for characters it lacks, which sends each ideograph\n  to fontconfig separately and splits words across two faces inside inline SVG\n  (`production.md` pitfall #4.1). The `-en` templates are the deliberate exception:\n  they are Latin documents, so `Charter` stays first there.\n- The commercial TsangerJinKai02 files never ship inside the skill package, so a\n  sandboxed install has no primary CJK serif and falls through the chain. Keep the\n  chain wide (Source Han Serif SC and CN, Noto Serif CJK SC and Noto Serif SC, Songti\n  SC, STSong, SimSun) so it lands on some serif rather than a system sans.\n- `bash scripts/ensure-fonts.sh` downloads into the XDG user font dir\n  (`${XDG_DATA_HOME:-~/.local/share}/fonts/kami`, override with `KAMI_FONT_DIR`),\n  never into the skill's `assets/fonts`, so an installed Claude Desktop skill stays\n  small. Inside a repo checkout it first restores missing or truncated font files from the root\n  `assets/fonts/` into the skill's ignored font directory. It downloads to the user\n  font directory only when usable fonts are still missing. Commercial use of TsangerJinKai02 requires\n  the appropriate license.\n\n## Releasing\n\n`docs/release.md` owns release notes format, the tag and asset flow, and demo\nscreenshot regeneration commands. Read it when cutting or refreshing a release.\n","evals/landing-page-en/prompt.md":"---\nplugins: [\"../../plugins/kami\"]\ntags: [landing-page, en, screen]\nmax_turns: 150\ntimeout_seconds: 2400\nallowed_tools: [Read, Glob, Grep, Skill, Bash, Write, Edit, TodoWrite]\n---\n\nMake a landing page for my product as a single HTML file in the current directory, named index.html. It is a web page only, no PDF needed. Don't ask me questions, just make reasonable calls and tell me at the end what's missing.\n\nProduct: Ledgerly, bookkeeping for freelancers.\n- Import bank statements as CSV and Ledgerly sorts transactions into tax categories.\n- Sends invoices and chases late payments automatically.\n- Beta users say month-end bookkeeping takes 40% less time.\n- 1,800 freelancers are in the beta.\n- Pricing: $12 per month, 14-day free trial, no card needed.\n- Call to action: start the free trial.\n\nI don't have customer logos or testimonials yet.\n","evals/letter-ko/prompt.md":"---\nplugins: [\"../../plugins/kami\"]\ntags: [letter, ko]\nmax_turns: 150\ntimeout_seconds: 2400\nallowed_tools: [Read, Glob, Grep, Skill, Bash, Write, Edit, TodoWrite]\n---\n\n다음 내용으로 한국어 추천서를 PDF로 만들어 현재 디렉터리에 저장해 주세요. 질문하지 말고 바로 완성해 주세요. HTML 파일은 letter.html, PDF는 letter.pdf로 저장해 주세요.\n\n- 추천인: 박서연, 한빛데이터 데이터플랫폼팀 팀장\n- 추천 대상: 김도윤, 같은 팀 데이터 엔지니어로 2년 4개월 함께 근무\n- 지원처: 서울대학교 데이터사이언스대학원 석사과정\n- 김도윤은 실시간 로그 파이프라인을 Kafka와 Flink로 재구축해 데이터 지연을 45분에서 90초로 줄였습니다.\n- 사내 데이터 품질 검사 도구를 직접 설계해 18개 팀이 사용하고 있습니다.\n- 신입 3명의 온보딩을 맡아 멘토링했습니다.\n- 통계 공부에 관심이 많아 퇴근 후 온라인 과정을 수료했습니다.\n- 날짜: 2026년 9월 20일\n","evals/long-doc-cn/prompt.md":"# Long-doc-cn Skill\n\nPath: `evals/long-doc-cn/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/prompt.md)","evals/one-pager-en/prompt.md":"# One-pager-en Skill\n\nPath: `evals/one-pager-en/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/prompt.md)","evals/portfolio-cn/prompt.md":"# Portfolio-cn Skill\n\nPath: `evals/portfolio-cn/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/prompt.md)","evals/resume-cn/prompt.md":"# Resume-cn Skill\n\nPath: `evals/resume-cn/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/prompt.md)","evals/slides-en/prompt.md":"# Slides-en Skill\n\nPath: `evals/slides-en/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/prompt.md)","skills/kami/CHEATSHEET.md":"# Kami Skill\n\nPath: `skills/kami/CHEATSHEET.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/CHEATSHEET.md)","evals/equity-report-charts-en/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/content-fidelity.md)","evals/equity-report-charts-en/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/no-placeholders.md)","evals/equity-report-charts-en/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/pdf-created.md)","evals/equity-report-charts-en/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/skill-fired.md)","evals/equity-report-cn/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/equity-report-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/content-fidelity.md)","evals/equity-report-cn/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/equity-report-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/no-placeholders.md)","evals/equity-report-cn/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/equity-report-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/pdf-created.md)","evals/equity-report-cn/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/equity-report-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/skill-fired.md)","evals/landing-page-en/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/landing-page-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/content-fidelity.md)","evals/landing-page-en/graders/html-created.md":"# Graders Skill\n\nPath: `evals/landing-page-en/graders/html-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/html-created.md)","evals/landing-page-en/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/landing-page-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/no-placeholders.md)","evals/landing-page-en/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/landing-page-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/skill-fired.md)","evals/letter-ko/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/letter-ko/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/content-fidelity.md)","evals/letter-ko/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/letter-ko/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/no-placeholders.md)","evals/letter-ko/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/letter-ko/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/pdf-created.md)","evals/letter-ko/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/letter-ko/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/skill-fired.md)","evals/long-doc-cn/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/long-doc-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/content-fidelity.md)","evals/long-doc-cn/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/long-doc-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/no-placeholders.md)","evals/long-doc-cn/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/long-doc-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/pdf-created.md)","evals/long-doc-cn/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/long-doc-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/skill-fired.md)","evals/one-pager-en/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/content-fidelity.md)","evals/one-pager-en/graders/no-invented-metrics.md":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/no-invented-metrics.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/no-invented-metrics.md)","evals/one-pager-en/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/no-placeholders.md)","evals/one-pager-en/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/pdf-created.md)","evals/one-pager-en/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/skill-fired.md)","evals/portfolio-cn/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/portfolio-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/content-fidelity.md)","evals/portfolio-cn/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/portfolio-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/no-placeholders.md)","evals/portfolio-cn/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/portfolio-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/pdf-created.md)","evals/portfolio-cn/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/portfolio-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/skill-fired.md)","evals/resume-cn/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/resume-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/content-fidelity.md)","evals/resume-cn/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/resume-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/no-placeholders.md)","evals/resume-cn/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/resume-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/pdf-created.md)","evals/resume-cn/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/resume-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/skill-fired.md)","evals/slides-en/graders/content-fidelity.md":"# Graders Skill\n\nPath: `evals/slides-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/content-fidelity.md)","evals/slides-en/graders/no-placeholders.md":"# Graders Skill\n\nPath: `evals/slides-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/no-placeholders.md)","evals/slides-en/graders/pdf-created.md":"# Graders Skill\n\nPath: `evals/slides-en/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/pdf-created.md)","evals/slides-en/graders/skill-fired.md":"# Graders Skill\n\nPath: `evals/slides-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/skill-fired.md)","plugins/kami/.claude-plugin/plugin.json":"# claude-plugin Plugin Manifest\n\nPath: `plugins/kami/.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/.claude-plugin/plugin.json)","plugins/kami/.codex-plugin/plugin.json":"# codex-plugin Plugin Manifest\n\nPath: `plugins/kami/.codex-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/.codex-plugin/plugin.json)","skills/kami/references/anti-patterns.md":"# References Skill\n\nPath: `skills/kami/references/anti-patterns.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/anti-patterns.md)","skills/kami/references/brand-profile.md":"# References Skill\n\nPath: `skills/kami/references/brand-profile.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/brand-profile.md)","skills/kami/references/brand.example.md":"# References Skill\n\nPath: `skills/kami/references/brand.example.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/brand.example.md)","skills/kami/references/checks_thresholds.json":"# References Skill\n\nPath: `skills/kami/references/checks_thresholds.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/checks_thresholds.json)","skills/kami/references/deck-preflight.md":"# References Skill\n\nPath: `skills/kami/references/deck-preflight.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/deck-preflight.md)","skills/kami/references/design.md":"# References Skill\n\nPath: `skills/kami/references/design.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/design.md)","skills/kami/references/diagrams.md":"# References Skill\n\nPath: `skills/kami/references/diagrams.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/diagrams.md)","skills/kami/references/mermaid-theme.json":"# References Skill\n\nPath: `skills/kami/references/mermaid-theme.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/mermaid-theme.json)","skills/kami/references/mermaid.md":"# References Skill\n\nPath: `skills/kami/references/mermaid.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/mermaid.md)","skills/kami/references/production.md":"# References Skill\n\nPath: `skills/kami/references/production.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/production.md)","skills/kami/references/resume-writing.md":"# References Skill\n\nPath: `skills/kami/references/resume-writing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/resume-writing.md)","skills/kami/references/tokens.json":"# References Skill\n\nPath: `skills/kami/references/tokens.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/tokens.json)","skills/kami/references/writing.md":"# References Skill\n\nPath: `skills/kami/references/writing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/writing.md)","skills/kami/scripts/package.json":"# Scripts Skill\n\nPath: `skills/kami/scripts/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/scripts/package.json)","plugins/kami/skills/kami/CHEATSHEET.md":"# Kami Skill\n\nPath: `plugins/kami/skills/kami/CHEATSHEET.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/CHEATSHEET.md)","skills/kami/references/schemas/changelog.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/changelog.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/changelog.json)","skills/kami/references/schemas/equity-report.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/equity-report.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/equity-report.json)","skills/kami/references/schemas/landing-page.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/landing-page.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/landing-page.json)","skills/kami/references/schemas/letter.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/letter.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/letter.json)","skills/kami/references/schemas/long-doc.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/long-doc.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/long-doc.json)","skills/kami/references/schemas/one-pager.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/one-pager.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/one-pager.json)","skills/kami/references/schemas/portfolio.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/portfolio.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/portfolio.json)","skills/kami/references/schemas/resume.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/resume.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/resume.json)","skills/kami/references/schemas/slides.json":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/slides.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/slides.json)","skills/kami/scripts/mathjax-runtime/package-lock.json":"# Mathjax-runtime Skill\n\nPath: `skills/kami/scripts/mathjax-runtime/package-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/scripts/mathjax-runtime/package-lock.json)","skills/kami/scripts/mathjax-runtime/package.json":"# Mathjax-runtime Skill\n\nPath: `skills/kami/scripts/mathjax-runtime/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/scripts/mathjax-runtime/package.json)","plugins/kami/skills/kami/references/anti-patterns.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/anti-patterns.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/anti-patterns.md)","plugins/kami/skills/kami/references/brand-profile.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/brand-profile.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/brand-profile.md)","plugins/kami/skills/kami/references/brand.example.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/brand.example.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/brand.example.md)","plugins/kami/skills/kami/references/checks_thresholds.json":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/checks_thresholds.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/checks_thresholds.json)","plugins/kami/skills/kami/references/deck-preflight.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/deck-preflight.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/deck-preflight.md)","plugins/kami/skills/kami/references/design.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/design.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/design.md)","plugins/kami/skills/kami/references/diagrams.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/diagrams.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/diagrams.md)","plugins/kami/skills/kami/references/mermaid-theme.json":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/mermaid-theme.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/mermaid-theme.json)","plugins/kami/skills/kami/references/mermaid.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/mermaid.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/mermaid.md)","plugins/kami/skills/kami/references/production.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/production.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/production.md)","plugins/kami/skills/kami/references/resume-writing.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/resume-writing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/resume-writing.md)","plugins/kami/skills/kami/references/tokens.json":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/tokens.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/tokens.json)","plugins/kami/skills/kami/references/writing.md":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/writing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/writing.md)","plugins/kami/skills/kami/scripts/package.json":"# Scripts Skill\n\nPath: `plugins/kami/skills/kami/scripts/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/scripts/package.json)","skills/kami/assets/templates/marp/slides-marp-en.md":"# Marp Skill\n\nPath: `skills/kami/assets/templates/marp/slides-marp-en.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/assets/templates/marp/slides-marp-en.md)","skills/kami/assets/templates/marp/slides-marp.md":"# Marp Skill\n\nPath: `skills/kami/assets/templates/marp/slides-marp.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/assets/templates/marp/slides-marp.md)","plugins/kami/skills/kami/references/schemas/changelog.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/changelog.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/changelog.json)","plugins/kami/skills/kami/references/schemas/equity-report.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/equity-report.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/equity-report.json)","plugins/kami/skills/kami/references/schemas/landing-page.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/landing-page.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/landing-page.json)","plugins/kami/skills/kami/references/schemas/letter.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/letter.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/letter.json)","plugins/kami/skills/kami/references/schemas/long-doc.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/long-doc.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/long-doc.json)","plugins/kami/skills/kami/references/schemas/one-pager.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/one-pager.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/one-pager.json)","plugins/kami/skills/kami/references/schemas/portfolio.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/portfolio.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/portfolio.json)","plugins/kami/skills/kami/references/schemas/resume.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/resume.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/resume.json)","plugins/kami/skills/kami/references/schemas/slides.json":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/slides.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/slides.json)","plugins/kami/skills/kami/scripts/mathjax-runtime/package-lock.json":"# Mathjax-runtime Skill\n\nPath: `plugins/kami/skills/kami/scripts/mathjax-runtime/package-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/scripts/mathjax-runtime/package-lock.json)","plugins/kami/skills/kami/scripts/mathjax-runtime/package.json":"# Mathjax-runtime Skill\n\nPath: `plugins/kami/skills/kami/scripts/mathjax-runtime/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/scripts/mathjax-runtime/package.json)","plugins/kami/skills/kami/assets/templates/marp/slides-marp-en.md":"# Marp Skill\n\nPath: `plugins/kami/skills/kami/assets/templates/marp/slides-marp-en.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/assets/templates/marp/slides-marp-en.md)","plugins/kami/skills/kami/assets/templates/marp/slides-marp.md":"# Marp Skill\n\nPath: `plugins/kami/skills/kami/assets/templates/marp/slides-marp.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/assets/templates/marp/slides-marp.md)"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/AGENTS.md","title":"AI Agent Protocol & Instructions","category":"root-instruction","format":"markdown","content":"# Kami Agent Guide\n\n## Project\n\nKami is a document-generation skill and template system: self-contained editorial HTML\ntemplates rendered to PDF / PPTX / PNG, plus reference specs, demo assets, and a\npackaged skill archive. `SKILL.md` is the runtime manual for producing a document.\nThis file is the maintenance guide for changing the repository itself, and it records\nthe traps that a fresh read of the code does not reveal.\n\n## Layout\n\nOne repository, three top-level roles, and the install tools only ever copy the first:\n\n- `skills/kami/` is the skill and the only thing users install: `SKILL.md`,\n  `CHEATSHEET.md`, `VERSION`, `LICENSE`, `references/`, `scripts/`, and the light\n  `assets/` (templates, diagrams, logo, the two small font files). `npx skills add\n  tw93/kami` copies exactly this directory; `bash scripts/package-skill.sh` zips it\n  as `kami/` for Claude Desktop; `plugins/kami/skills/kami/` is a generated copy of it\n  inside the Claude and Codex plugin. Ignored render output lives in\n  `skills/kami/assets/examples/`. Every skill-relative path in `SKILL.md`\n  resolves inside this directory, so nothing here may reach up into the repo.\n- `site/` is kami.tw93.fun. The Vercel project's Root Directory is `site` (project\n  setting, not a file), so only this tree deploys and `site/vercel.json` is the only\n  Vercel config. It carries the pages, `styles.css`, `llms.txt`, `robots.txt`,\n  `sitemap.xml`, `vercel.json`, `.well-known/`, `feeds/`, and the heavy showcase and\n  demo assets. Skill facts it shows (`SKILL.md`, the discovery files) are generated\n  into it, never hand-copied. `/SKILL.md` and `/kami-skill.md` send\n  `X-Robots-Tag: noindex`: agents can still fetch the markdown, and search\n  engines should not score that file as an HTML page.\n- The root holds repository tooling only: `scripts/` (`build_metadata.py`,\n  `package-skill.sh`, `release_gate.py`, `draft-release-notes.py`, `tests/`),\n  `assets/fonts/` (the commercial TTFs; run `bash skills/kami/scripts/ensure-fonts.sh`\n  once after cloning to copy them into the skill's ignored `assets/fonts/`, otherwise\n  templates fall back to jsDelivr), `evals/` (the end-to-end skill eval suite, see\n  Evals below), `docs/`, and `.github/`.\n\nRun skill-side commands from `skills/kami/` (`cd skills/kami && python3\nscripts/build.py --check`); the paths below are written from that directory unless\nthey start with `scripts/build_metadata.py`, `scripts/package-skill.sh`,\n`scripts/release_gate.py`, or `scripts/tests/`, which live at the root. Paths under\n`site/`, `plugins/`, `docs/`, `.github/`, `.claude-plugin/`, and `.agents/` are also\nrelative to the repository root.\n\n## Repository Map\n\nOnly the entries whose role is not obvious from the filename:\n\n- `SKILL.md` - skill routing plus the document-side build and verify commands.\n  `CHEATSHEET.md` - quick design reference. Both ship inside the package.\n- `references/design.md`, `writing.md`, `production.md`, `diagrams.md` - full specs.\n  `production.md` Part 4 is the single source of truth for render failures, their\n  verified causes, and their fixes; add pitfalls there, not here.\n  `docs/release.md` - release notes, release flow, demo screenshot regeneration.\n  `anti-patterns.md`, `resume-writing.md`, `mermaid.md`, `deck-preflight.md`,\n  `brand-profile.md` and `brand.example.md` - scoped guides.\n- `references/tokens.json` (color tokens, drift-checked by `scripts/tokens.py`),\n  `references/mermaid-theme.json` (Kami to beautiful-mermaid theme, kept in sync with\n  `tokens.json`), `references/checks_thresholds.json` (rhythm / density / orphan /\n  visual thresholds read by `checks.py` and `visual.py`). These are live inputs to\n  gates: editing a number changes what passes.\n- `references/schemas/` - one JSON Schema subset per document type. The `$comment`\n  fields carry the per-field quality bar distilled from `writing.md`, so schema edits\n  and `writing.md` edits move together.\n- `scripts/shared.py` - the canonical registries (`HTML_TEMPLATES`,\n  `SCREEN_TEMPLATES`, `PPTX_TEMPLATES`, `MARP_TEMPLATES`, `DIAGRAM_TEMPLATES`) and each template's\n  `build_max_pages`. `build.py` derives its internal build targets from them;\n  Marp stays discovery-only because it uses an external CLI. Add or remove a\n  template or diagram here, never in a per-script dict.\n- `scripts/render.py` - the single render entry (`render_pdf`, `build_slides`, PDF\n  metadata stamping). `build.py`, `verify.py`, and `mcp_server.py` all call it; never\n  open a second WeasyPrint call site.\n- `scripts/diagram_geometry.py` checks annotated architecture SVG through the existing\n  lint entry points. Keep geometry in the actual rect/line/polyline attributes,\n  never a second JSON source. Mark node rectangles, edge shafts and label masks;\n  leave boundary frames and arrowheads unmarked. Static mask checks do not replace\n  rendered text-fit and arrowhead inspection.\n- `scripts/deliver.py` - `build.py --deliver`, the one command `SKILL.md` gives an\n  agent to finish a document: every document gate in a fixed order, the render, page\n  images, and a single READY / NOT READY verdict. It owns the order; the individual\n  `--check-*` flags stay for debugging one gate. Template family comes from content IR\n  `type`, else from stylesheet overlap with the registered templates.\n  `deliver(args, result)` also fills a dict with the same outcome for the MCP\n  `kami_deliver` tool; `mcp_server.DELIVER_GATE_RULES` maps every deliver gate to a\n  `kami_check` rule or declares it deliver-only, and `test_mcp` fails on a new gate\n  that is in neither.\n- `scripts/chart.py` - `build.py --chart` / `--check-charts`: data spec to SVG for\n  bar, line, hbar, donut, candlestick, and waterfall. Chart geometry lives only here;\n  each SVG embeds its spec in `data-kami-spec` and the drift gate regenerates and\n  compares the marks. The five chart files in `assets/diagrams/` are its output for\n  their demo data: change a chart's look in `chart.py` and regenerate them, never\n  edit their SVG by hand (`--check` fails on drift).\n- `scripts/brand_extract.py` - drafts a brand profile from a public website (colors,\n  fonts, logo candidates, one contrast-checked accent). It fetches only the page and\n  same-site stylesheets and never writes into `~/.config/kami/`.\n- `scripts/html_visibility.py` - shared static HTML/CSS visibility analysis for\n  `content.py` coverage and `checks.py` residue checks. Keep its conservative\n  coverage and residue modes distinct; it does not implement browser layout.\n- `scripts/tests/test_build.py` - the stable test entry point; sibling `test_*.py`\n  modules group tests by responsibility, with counters and fixtures in `support.py`.\n  `scripts/tests/corpus/<gate>/{flag,pass}/` is the labelled corpus for the PDF\n  gates (orphans, density, resume balance), rendered and judged by `test_corpus.py`.\n  Before changing a value in `checks_thresholds.json`, run it and read the per-gate\n  `CORPUS:` line; a fixture that flips is the cost of the change, not noise.\n- `scripts/mermaid_normalize.py` - re-themes a beautiful-mermaid SVG to the Kami\n  palette and makes it WeasyPrint-safe. Pure Python, no Node, ships in the package.\n- `scripts/mcp_server.py` - zero-dependency MCP stdio server exposing\n  `kami_templates` / `kami_doctor` / `kami_render` / `kami_check` /\n  `kami_deliver` / `kami_screenshot`, so an MCP-capable agent can diagnose, render, and verify\n  without reading `SKILL.md`. Register\n  with `claude mcp add kami -- python3 <checkout>/skills/kami/scripts/mcp_server.py`.\n- `scripts/math_render.py`, `scripts/mathjax_svg.js`, `scripts/ensure_mathjax.sh`,\n  `scripts/mathjax-runtime/` - strict LaTeX to MathJax SVG; `render.py` imports\n  `math_render`. This is the only Node dependency (Node 20 or 22+, refused otherwise),\n  installed on demand by `ensure_mathjax.sh` from the tracked `package-lock.json`;\n  all four ship in the package allowlist.\n- `scripts/site_facts.py` - public-site fact drift checks (install commands, version,\n  template and diagram counts across `site/index*.html`, the root `README.md`,\n  `site/llms.txt`), wired into `build.py --check`; it resolves those files through\n  `shared.REPO_ROOT` / `shared.SITE_ROOT` and skips itself in an installed skill.\n- `scripts/check-update.sh` - quiet daily update check invoked from `SKILL.md`;\n  writes a local cache marker, then resolves the latest published GitHub Release\n  at most once per day. It uploads no user document or task content and stays\n  silent on failure.\n- `site/assets/showcase/` - README and public-site screenshots only.\n  `site/assets/demos/` - README showcase demos. Neither is part of the skill.\n- `assets/diagrams/src/*.mmd` - Mermaid source of the sequence / class / er diagrams.\n  `assets/templates/marp/` - the Markdown-first Marp deck variant.\n- `dist/` is ignored. The release archive is built by `release.yml` from\n  `skills/kami` and uploaded as a release asset; nothing tracks it.\n- `plugins/kami/`, `.claude-plugin/marketplace.json`,\n  `.agents/plugins/marketplace.json`, and the site's discovery files are\n  **generated**; see Generated Mirrors below.\n- Public site surface under `site/`: `index.html` plus `index-zh|en|ja|ko|tw.html`,\n  the English-only prose pages `developers|about|contact|privacy.html`, `styles.css`,\n  `llms.txt`, `robots.txt`, `sitemap.xml`, `vercel.json`. `styles.css` is Kami's own site shell\n  (language switcher, gallery, responsive behavior, `.hero.doc` / `.prose` for the\n  prose pages); generic template rules never belong there.\n- Agent-facing site surface, also under `site/`: `index.md` (Markdown twin of the homepage; `vercel.json`\n  *redirects* `/` here for `Accept: text/markdown` and `/?mode=agent`, because Vercel\n  applies `rewrites` only after the filesystem and `/` always matches `index.html`),\n  `developers|about|contact|privacy.md`, `developers/llms.txt`, and the generated\n  `.well-known/agent-skills/index.json`, `.well-known/mcp/server-card.json`,\n  `feeds/catalog.jsonld`, `schemamap.xml`, `kami-skill.md` (served at `/SKILL.md` through a rewrite; it must not be named `SKILL.md`, or the skills CLI installs the site). Every new prose page needs its `.md` twin,\n  a `rewrites` entry for the extensionless URL, and a `sitemap.xml` row.\n  The `has`-conditioned redirects and the `Link` headers are only observable on a\n  deploy: verify them with `curl -sI` against the preview URL, never locally.\n- `.github/workflows/check.yml` (PR/push CI) and `release.yml` (tag-triggered build\n  and asset upload).\n\nReference docs are English-first and never forked per language. Inline CJK examples\nare fine where the rule itself is about CJK typography (term annotation, punctuation,\nspacing); language-specific output differences (CN/EN/KO) live in templates, not in\nduplicated reference files.\n\n## Commands\n\n`python3 scripts/build.py --help` prints the authoritative flag list and the module\nmap. Read it instead of trusting any copy; hand-maintained lists here have gone stale\nbefore. The commands it does not cover:\n\n```bash\n# from the repository root\npython3 scripts/build_metadata.py            # regenerate plugins/kami, marketplaces, site discovery files\npython3 scripts/build_metadata.py --check    # drift check for the same\nbash scripts/package-skill.sh dist/kami.zip  # build the Claude Desktop archive from skills/kami\npython3 scripts/tests/test_build.py          # full test suite\npython3 scripts/draft-release-notes.py V1.4.0..HEAD --version V1.4.1 --title \"Steadier Hand\"\nclaude plugin eval . --runs 2 --ablation none -j 4 --keep-temp --trust-plugin --no-publish \\\n  --threshold 0 --judge-model sonnet --allow-tools Bash Write Edit   # end-to-end skill evals\npython3 evals/score.py                       # deterministic gates over the newest eval run\n# from skills/kami\nbash scripts/ensure-fonts.sh                 # recover missing or truncated CJK fonts\npython3 scripts/mcp_server.py                # MCP stdio server (render / check / screenshot)\npython3 scripts/mermaid_normalize.py raw.svg -o clean.svg\n```\n\n## Working Rules\n\n- `SKILL.md` is loaded whole on every trigger, so it carries routing, the execution\n  contract, hard prohibitions, `--deliver`, and the feedback protocol, nothing else.\n  Type-specific procedure (page density, resume recruiter pass, landing site mode,\n  charts, illustrations) lives in the reference the tier table already sends the\n  agent to. Before adding a paragraph to `SKILL.md`, name the eval case it fixes;\n  before removing one, run the suite and compare against the last baseline.\n\n- Style changes must update `references/design.md` and the matching template tokens.\n- A CSS snippet in a reference doc is a shipped artifact, not prose: an agent copies\n  it before it reads a template. Every fenced `css` / `html` block is scanned by\n  `--check-docs` (inside `--check`) with the template rule set, and every `var()` it\n  names must resolve to a registered token or one a shipped template defines. Teach\n  from a component a template actually has; a recipe for assembling a new container\n  is how a document ends up carrying three unrelated emphasis languages. Tag a\n  deliberate counter-example inline with `/* avoid */` so the scan reads it as the\n  lesson rather than the violation.\n- A change touching template tokens, shared CSS gestures, or `references/design.md`\n  visual rules must rebuild the affected demo outputs (`site/assets/demos/*.pdf` / `*.png`)\n  in the same change, not as a later cleanup. Demos inline their CSS by copy, so they\n  silently keep the old style otherwise. Report the sweep: rebuilt N demos, K\n  unaffected. The off-palette guard in `scripts/lint.py` scans `site/assets/demos/*.html`\n  for stale hexes as a backstop, but it cannot see rendered PDFs or PNGs.\n  Repository scans must reject an empty expected demo set; installed skills may\n  skip the site because it is outside their distribution boundary. Test both modes\n  with a known violating demo whenever repository paths change.\n- Templates intentionally inline their CSS rather than share a `_kami.css` partial:\n  each template must stay a single self-contained HTML file the user can copy-paste\n  with no build step. Fix CSS drift by applying the same change across the affected\n  templates, never by introducing a build-time include.\n- For document or template tasks, lock the output contract before editing: language,\n  template, output format, page or length target, visual acceptance check, and\n  verification command.\n- Prefer the nearest existing template and deterministic verifier. Do not add a\n  template, shared CSS layer, dependency, script flag, or optional mode unless the\n  current request cannot be satisfied without it. A new template copies the nearest\n  existing one, stays aligned with `references/design.md`, and adds demo coverage; a\n  new document type also needs a schema in `references/schemas/`.\n- Slides default to WeasyPrint HTML-to-PDF templates unless the user explicitly needs\n  editable PPTX output.\n- Mermaid diagrams: never embed raw beautiful-mermaid SVG into a PDF-bound template.\n  WeasyPrint cannot resolve `color-mix()`, render `<foreignObject>`, or fetch a\n  runtime web font, so always pipe through `scripts/mermaid_normalize.py` first\n  (`--check` enforces this). `xychart-beta` is browser-only because it styles through\n  `<style>` class selectors; use the hand-drawn chart diagrams for PDF. Full flow in\n  `references/mermaid.md`.\n- Do not use graphic emoticons in docs, template comments, or script output. Use `OK:`\n  and `ERROR:` for script status text.\n- Do not use em dashes (U+2014) in repository docs, generated documents, template\n  comments, or site copy; use colons, commas, periods, or parentheses. Self-check:\n  `grep -rn \"$(printf '\\342\\200\\224')\" README.md site/llms.txt site/index*.html`. Teaching\n  counter-examples inside `references/anti-patterns.md` are exempt; its rule #28\n  covers the generated-document side.\n- For hosted-site or public-landing work, separate generic template work from Kami's\n  own website first. Generic behavior lives in `assets/templates/landing-page*` and\n  `references/`; Kami site facts live across `site/index*.html`, `site/styles.css`,\n  `README.md`, `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, and\n  `site/vercel.json`. Public facts are wider\n  than the hero: pricing, install path, version, release, support, analytics, FAQ, and\n  positioning claims move together across pages, metadata, AI files, and download\n  links. Do not leave a site-only analytics or tracking change contradicting the\n  \"no analytics\" copy elsewhere.\n- Landing or documentation-site work follows `references/design.md` Section 11 «Landing\n  Page (screen-first)»: its «Documentation site» subsection for the doc shell (sidebar\n  rail, on-this-page TOC, borderless prev/next pager), then the «Responsive\n  screenshot verification» subsection that closes the section (breakpoint, tablet, and baseline screenshots\n  per locale, objective line-widow scan) before shipping.\n- Content changes should avoid CSS churn unless layout behavior is part of the task.\n- Public copy states the product function before design terminology. Write each locale\n  naturally, preserve approved taglines and personal stories, and keep claims identical\n  across HTML, Markdown, metadata, and FAQ JSON-LD. Writing rules and schema comments\n  must not require poetic captions, invented benefits, numeric filler, or rewrite quotas.\n  Distinguish local document processing from update checks, remote assets, and the AI\n  provider’s data handling.\n- Brand profile support is optional context. Keep public examples in `references/`; do\n  not hard-code a maintainer's private local profile.\n- Demo, reference-example, and handoff content distilled from a maintainer's private\n  documents (resume, business proposal, pricing, client names) must be de-identified\n  before it lands in the repo: swap in public figures, public projects, or invented\n  generic data. Job-search, quote, and engagement-period fields count as sensitive\n  even without names. List the swapped-out identifying signals in the handoff report;\n  do not rely on the maintainer to spot leftovers.\n- Do not commit one-off review reports or diagnostic snapshots as durable docs.\n  Extract the stable rule into `AGENTS.md`, `SKILL.md`, or `references/`, then discard\n  the report.\n\n## Issue And PR Maintenance\n\n- Use official GitHub API or CLI for issue and PR work. Read the complete discussion,\n  associated PRs, current source, and relevant tests before deciding what to change.\n- Before each modification, check related local and live remote commits, branches,\n  worktrees, accessible existing agent conversations, and the project inventory.\n  Report the deduplication evidence and current owner before starting implementation.\n- Validate an existing fix rather than implementing it again. When another conversation\n  owns work in progress, leave implementation with that owner and report its verified\n  identifier and status. Do not modify another conversation's uncommitted work.\n- State access and inventory coverage gaps explicitly. A missing search result is not\n  evidence that nobody owns the work; do not bypass reading restrictions.\n- Perform development, builds, and tests in the user's local Mac checkout and\n  branch. Do not default to creating a new PR, opening a cloud execution environment,\n  or manually triggering remote CI. Preserve existing PRs and existing push-triggered\n  CI; do not disable or reconfigure them. Pushes may continue under applicable\n  specific authorization. Preserve the current branch while branch selection is\n  unclear; do not switch or merge into main based on this workflow preference.\n- Preserve the current checkout and user changes. Implement repairs on a separate\n  branch or worktree, locate the cause before targeted tests, and avoid concurrent\n  heavy builds. Never clean real user data to test a repair.\n- Close a duplicate, verified resolved item, or clearly unrelated report only when the\n  evidence and applicable user authorization support closure. Keep unresolved or\n  uncertain reports open; an empty queue is not a correctness goal.\n- Before implementing any change to a user interface, visual effect, interaction,\n  user-facing parameter, or configuration default, present the concrete change to\n  the user and obtain explicit confirmation. General repair or push authorization\n  does not replace this confirmation. Include the issue, original behavior, proposed\n  change, necessity, and alternatives. Pause and isolate any such unapproved work\n  already in progress; do not submit or ship it. Report any already pushed changes\n  accurately and do not roll them back without authorization. Internal repairs that\n  do not change user behavior may continue under their applicable authorization.\n- Confirm applicable authorization separately for commits, pushes, merges, and\n  releases. Distinguish code fixed, tests passed, committed, released, and user retested.\n- Keep reusable project guidance in this repository. Follow the existing rule above\n  for one-off reports and diagnostics; do not mix temporary run status, private paths,\n  personal information, or conversation identifiers into public maintenance guidance.\n- If there are no open issues or PRs, report the verified result without inventing\n  code changes or unnecessary repair branches.\n\n## Generated Mirrors\n\n`plugins/kami/skills/kami/` mirrors the distributable files from `skills/kami/`;\nthe two plugin manifests live in the outer `plugins/kami/` directory. The generated\ncopy excludes local fonts, render output, and caches. `.claude-plugin/marketplace.json`\nand `.agents/plugins/marketplace.json`\npoint at it. Edit `skills/kami/` only and let `python3 scripts/build_metadata.py\n--check` catch drift. Regenerate after any change under `skills/kami/`.\n\nThe same generator owns the site's machine-readable files under `site/`:\n`.well-known/agent-skills/index.json` (carries a SHA-256 digest of `SKILL.md`, so any\nskill edit changes it), `.well-known/mcp/server-card.json` (version plus the tool list\nparsed out of `scripts/mcp_server.py` without importing it), `feeds/catalog.jsonld`\n(built from `HTML_TEMPLATES` / `DIAGRAM_TEMPLATES`), `schemamap.xml`, and\n`kami-skill.md` (the copy served at `/SKILL.md`). Never hand-edit these; change the source and\nregenerate.\n\nMarketplace, plugin path, version, or install-path changes need runtime installation\nproof, not metadata proof. Claude Code: an isolated `HOME=/tmp/...` smoke with\n`claude plugin marketplace add <path>`, `claude plugin install kami@kami`,\n`claude plugin details kami@kami`, confirming the installed cache is the lightweight\n`plugins/kami` tree. Codex: an isolated `CODEX_HOME=/tmp/...` smoke with\n`codex plugin marketplace add <path>`, `codex plugin add kami@kami`,\n`codex plugin list`.\n\n## Refactor And Packaging Hard Stops\n\n- The shipped archive must be the output of `bash scripts/package-skill.sh`: a\n  top-level `kami/` directory under a 6 MB ceiling. A hand-zipped checkout is\n  rejected on size.\n- `scripts/package-skill.sh` packages `git ls-files skills/kami`, so an untracked new\n  module passes every local import and silently disappears from the archive. When\n  adding a runtime module, confirm it is tracked by Git before calling the change done.\n- The archive is not tracked. `release.yml` builds it from the tagged commit and\n  uploads it, so a fix reaches `npx skills add` and plugin installs on the next `main`\n  push but reaches Claude Desktop users only at the next release; name the channel\n  that actually carries the fix before saying \"fixed, please update\".\n- A versioned release must come from a commit reachable from `origin/main` with a\n  successful exact-SHA `check.yml` run triggered by a `main` push. Published\n  same-version assets are immutable in practice: a rerun may reuse `kami.zip` only\n  when its entry names and payloads are identical, otherwise cut a new patch version.\n- If `python3 scripts/build.py --verify` fails only because the host Python lacks PPTX\n  fallback dependencies such as `python-pptx`, verify `slides` and `slides-en` from a\n  temporary venv instead of treating the environment miss as a source regression.\n- Resume templates (`assets/templates/resume.html`, `resume-en.html`, `resume-ko.html`) carry a two-page\n  contract. Do not fix overflow by shrinking type or spacing globally first. Verify\n  with `python3 scripts/build.py --verify resume`, `--verify resume-en`, and `--verify resume-ko`.\n- Demo files such as `site/assets/demos/demo-resume-ko.html` own demo content, not the\n  template contract. Durable rules go into templates or `references/`.\n\n## CI Gotchas\n\nApplies when editing `.github/workflows/*.yml` or adding a test with a heavy\ndependency.\n\n- `check.yml` has two jobs. `lint-and-test` runs dependency-light lint, metadata,\n  and package gates. `verify-render` installs `weasyprint` / `pypdf` / `PyMuPDF` /\n  `Pygments` / `python-pptx`, sets up Node 22 and runs `bash scripts/ensure_mathjax.sh`, then\n  installs the checkout with `npx skills add` under a throwaway `HOME` and asserts\n  the bare install is the kami skill alone (`SKILL.md` and `scripts/build.py`\n  present, no `index.html`, no `site/`, no `TsangerJinKai02-W04.ttf`, unpacked tree\n  under 6000 KB, a separate ceiling from the 6 MB ZIP limit under Refactor And\n  Packaging Hard Stops), which is why a layout or size regression surfaces under a\n  job named `render and verify`. It then runs the full test suite before template\n  verification, including the three unlimited-page long-doc targets for rendered\n  TOC counters. Tests that need an optional render dependency use the suite's\n  explicit `SKIP:` counter and fail when a CI-required dependency is unavailable;\n  never turn a skip into `OK:`.\n- CI installs its Python dependencies and the skills CLI unpinned on purpose: users\n  install the same unpinned way, so an upstream release that breaks Kami should turn\n  CI red before it reaches them.\n- Validate workflow edits with the CI run for the exact pushed commit on the authorized\n  branch; do not create a feature branch solely for validation. A local pass does not\n  prove CI font or dependency availability: check cache manifests, Ubuntu fallback\n  fonts (DejaVu / Liberation), and the absence of commercial fonts (Charter / TsangerJinKai02).\n- Host-versus-CI differences are expressed as explicit opt-in env vars, currently\n  `KAMI_ALLOW_FALLBACK_ONLY` (accept fallback fonts), `KAMI_AUTHOR`, `KAMI_FONT_DIR`,\n  `KAMI_PACKAGE_ROOT_NAME`, `KAMI_PACKAGE_MAX_BYTES`, and `KAMI_UPDATE_URL`. That is\n  already the ceiling: before adding another, move the behavior into a `--ci-mode`\n  flag or a config file rather than letting `KAMI_*` sprawl.\n\n## Current Risk Areas\n\n- WeasyPrint rendering is sensitive to font availability, solid hex tag backgrounds,\n  page breaks, CJK fallback, and synthetic bold. Verify visually for template changes.\n- Slide output has three paths: `slides-weasy*.html` for default PDF decks,\n  `slides*.py` for the editable PPTX fallback, and\n  `assets/templates/marp/slides-marp*.{md,css}` for Markdown-first Marp decks.\n- Marp theme CSS inlines a full copy of the design tokens because Marp themes must be\n  self-contained. `build.py --sync` / `--check` token-sync those files and the CSS\n  lint rules scan them (both walk `shared.iter_template_files`), so token drift is\n  caught. The remaining hole: the off-palette hex guard globs `*.html` only\n  (`TEMPLATES/*.html` and `site/assets/demos/*.html`), so an off-palette color in Marp CSS\n  still needs eyeball review.\n- Resume targets require exactly two pages in all three language variants. Other\n  `build_max_pages` values in `scripts/shared.py` are ceilings (one-pager 1, letter 1,\n  changelog 2, equity-report 3; long-doc, portfolio, and slides-weasy are `0` =\n  unlimited). Other undershooting documents are not flagged, so \"this long-doc came out\n  at 3 pages\" is an authoring judgment call, not a gate failure. Landing pages are\n  browser-only HTML with no page count at all.\n- `scripts/render.py` sets PDF `/Author` from `git config user.name` or `KAMI_AUTHOR`\n  only when the template still holds an author placeholder. `/Producer` and `/Creator`\n  stay `Kami`.\n- Long-doc TOCs use WeasyPrint `target-counter()` and stable chapter ids for rendered\n  page numbers; do not reintroduce hand-written `.toc-page` spans. The row anchor must\n  stay `display: block` with the numeral floated right: WeasyPrint 70.0 resolves\n  `target-counter` to 0 on a flex anchor, and a `0` is valid-looking text that only the\n  `--verify` link cross-check catches (production.md pitfall 24). Running headers\n  default to `h1`. If a filled document does not use `h1` for chapter titles, add\n  `.running-title` to the element that should drive the header.\n- AI and public visibility spans `site/index*.html`, `site/llms.txt`, `site/robots.txt`,\n  `site/sitemap.xml`, FAQ JSON-LD, README install text, diagram counts, and release archive\n  links. Diagram count and names must stay aligned across `SKILL.md`, `CHEATSHEET.md`,\n  `README.md`, `index*.html`, and `assets/diagrams/`.\n\n## Critical Line-Break Scan\n\nApplies before handing off any user-visible typeset deliverable (rendered PDF,\n`README.md`, public site page).\n\n- Scan page by page for three wrap candidates: a trailing line of only 1-2 words\n  (orphan), a line one word away from wrapping, and a line that wraps early without\n  filling its container. Confirm each in rendered context; an intentional short line\n  is valid and does not need rewriting to make the count zero.\n- Split the work: `python3 scripts/build.py --check-orphans <pdf>` and\n  `--check-density <pdf>` catch PDF orphans and sparse pages deterministically; the\n  manual pass covers what they cannot see, near-wrap and premature-wrap states inside\n  a page, plus non-PDF surfaces (README and the responsive matrix in `references/design.md`).\n- One confirmed defect means a whole-document sweep for that class, not a single-spot fix. Check container geometry and forced breaks before shortening copy; preserve\n  facts and approved wording. Do not shrink type to dodge a wrap; deliberate layout\n  changes must re-pass `python3 scripts/build.py --check` and the page-count\n  contract.\n\n## Evals\n\n`evals/<case>/` holds end-to-end cases for `claude plugin eval`: a realistic request\nwith invented data (`prompt.md`), and graders for skill trigger, PDF (or HTML)\ncreation, and unfilled placeholders, plus fact fidelity in the HTML. Fact fidelity is\na `regex` grader wherever the facts are literal (one-pager-en, resume-cn): LLM judges\nsplit on derived figures and reported false FAILs on outputs whose facts were all\npresent. Keep an LLM judge only for what a pattern cannot read (Korean-only text,\nassertion titles, arithmetic). `evals/score.py` then applies Kami's own gates to each\nkept run workspace (page contract, atomic facts in the PDF text, fonts, density,\nresidue, style, resume balance, generated chart count), which the harness cannot run\nitself; it is read-only unless given `--write`, which saves `gate-scores.json`. One\nsuite run is 9 cases, 18 document builds at `--runs 2`, at roughly $1-3 each.\n\n- Run it after any change to `SKILL.md`, a reference the tier table routes to, a\n  template, or a gate an agent relies on, and compare against the previous run on the\n  same cases; one run per case is noise, use `--runs 2` or more.\n- The harness reads the plugin from `plugins/kami` live. Never run\n  `scripts/build_metadata.py` while a suite is running, and regenerate it before a run\n  so the suite tests the current skill.\n- A file grader takes an exact path; globs such as `*.html` fail with \"path does not\n  exist\". Every prompt pins its output file names for that reason.\n- Kept workspaces live under `/private/tmp/e-*/sealed/home/cwd` with mode 000;\n  `score.py` opens them itself. Results stay in the ignored `evals/results/`.\n- Mathematics is not covered: the sandbox cannot install the MathJax runtime.\n- LLM fidelity rubrics carry the case's full brief, because a judge that sees only a\n  partial fact list fails supplied facts as invented. On artifacts over about 15k\n  characters the harness judge is unreliable: before treating its FAIL as real,\n  re-judge the stored `evidence` HTML with the same rubric (`claude -p --model sonnet`)\n  and read the stated reason. In the 2026-10-15 baseline that split four failing cases\n  into two noisy votes and two real unlabelled derived figures.\n- resume-cn deliberately supplies thin notes (three employers, eight bullets). The\n  expected behavior is two honest pages with `[DATA NEEDED]` gaps and a reported\n  balance shortfall (`references/resume-writing.md` «Thin source»). `--deliver` and\n  `score.py` both read that through `checks.resume_thin_source` and treat it as a\n  reported gap rather than a balance failure.\n\n## Verification\n\n`SKILL.md` «5 · Deliver» owns the document side: `build.py --deliver` runs every\ndocument gate (placeholders, math, residue, style, content coverage, render, page\ncontract, resume balance, fonts, density, orphans, page images) in order and ends\nin one verdict. This section covers the maintenance side only.\n\n- Template or CSS changes: `python3 scripts/build.py --check` (CSS lint, token sync,\n  base/variant cross-template `:root` consistency, currently CN to EN and CN to KO)\n  plus `--verify` for the affected targets, or full `--verify` when the change is\n  cross-template.\n- Script changes: `python3 scripts/tests/test_build.py` and\n  `python3 scripts/build.py --check`. Run full `--verify` only when the render\n  pipeline itself changed (`render.py`, `verify.py`, WeasyPrint handling).\n- Font-stack changes (any `--serif` / `--mono` / SVG `text` chain): rebuild the\n  examples, then `python3 scripts/build.py --check-fonts assets/examples/*.pdf`. The\n  page-count contract cannot see which family actually drew the text, and a wrong one\n  renders cleanly; this is how the diagram labels were found splitting mid-word across\n  two faces.\n- Demo changes: regenerate the affected demo outputs and confirm page counts stay in\n  range. Font issues: `bash scripts/ensure-fonts.sh`, then rebuild the target.\n- MCP server changes: smoke the stdio protocol end to end (initialize, tools/list, one\n  tools/call per changed tool) through a scripted stdin session, and check that output\n  stays newline-delimited JSON with no stray prints on stdout.\n- Packaging changes: `bash scripts/package-skill.sh dist/kami.zip`, then `unzip -l\n  dist/kami.zip` to inspect for accidental large fonts, cache files, or a missing new\n  helper.\n- Marketplace or plugin changes: `python3 scripts/build_metadata.py --check` plus the\n  isolated install smoke described under Generated Mirrors.\n- Public site or AI visibility changes: check `site/index*.html`, README,\n  `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, JSON-LD, FAQ, install links, and download links\n  together, then serve the page and verify the responsive matrix in\n  `references/design.md` per locale.\n\n## Fonts\n\n`references/production.md` Part 1 «Fonts» owns the full stack: per-language family\nchains, fallbacks, `@font-face` paths, and the recovery flow. Two facts that must not\ndrift out of it:\n\n- `Source Han Serif KR` is the real family name inside the bundled OTFs and must stay\n  in every Korean fallback chain, otherwise fontconfig cannot resolve the\n  `ensure-fonts.sh`-downloaded font by name on an offline Linux skill install.\n- CJK families lead every stack that CJK text can reach, Latin faces trail. A leading\n  Latin serif ends the stack walk for characters it lacks, which sends each ideograph\n  to fontconfig separately and splits words across two faces inside inline SVG\n  (`production.md` pitfall #4.1). The `-en` templates are the deliberate exception:\n  they are Latin documents, so `Charter` stays first there.\n- The commercial TsangerJinKai02 files never ship inside the skill package, so a\n  sandboxed install has no primary CJK serif and falls through the chain. Keep the\n  chain wide (Source Han Serif SC and CN, Noto Serif CJK SC and Noto Serif SC, Songti\n  SC, STSong, SimSun) so it lands on some serif rather than a system sans.\n- `bash scripts/ensure-fonts.sh` downloads into the XDG user font dir\n  (`${XDG_DATA_HOME:-~/.local/share}/fonts/kami`, override with `KAMI_FONT_DIR`),\n  never into the skill's `assets/fonts`, so an installed Claude Desktop skill stays\n  small. Inside a repo checkout it first restores missing or truncated font files from the root\n  `assets/fonts/` into the skill's ignored font directory. It downloads to the user\n  font directory only when usable fonts are still missing. Commercial use of TsangerJinKai02 requires\n  the appropriate license.\n\n## Releasing\n\n`docs/release.md` owns release notes format, the tag and asset flow, and demo\nscreenshot regeneration commands. Read it when cutting or refreshing a release.\n","isInternal":false,"tokens":8886,"sizeBytes":36920},{"name":"llms.txt","path":"llms.txt","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/llms.txt","title":"LLM Index & Context Digest","category":"root-instruction","format":"text","content":"site/llms.txt","isInternal":false,"tokens":5,"sizeBytes":13},{"name":"llms.txt","path":"site/llms.txt","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/site/llms.txt","title":"site - LLM Index & Context Digest","category":"root-instruction","format":"text","content":"# Kami\n\n> A warm parchment design system for AI-assisted professional documents. One accent color, serif fonts and clear heading levels, and consistent spacing.\n\n## Author\n- Name: Tw93\n- Site: https://tw93.fun\n- Stable entity ID: https://tw93.fun/#person\n\n\n## What is Kami\nKami gives AI agents templates and layout rules for documents and landing pages. It includes one-pagers, resumes, portfolios, slides, long documents, letters, equity reports, and changelogs. Defaults include a warm parchment background (#f5f4ed), ink-blue accents (#1B365D), and Charter/TsangerJinKai serif fonts. A white-background option is available for printing.\n\nKami installs into the agent that uses it and runs on that machine. There is no hosted Kami API, no account, and no API key: the integration surface is a local MCP server, JSON content schemas, and CLI checks.\n\n## When to use Kami\nReach for Kami when the user wants a finished document whose appearance matters, and a plain text answer would not be enough:\n- \"Make me a resume / CV\" -> `resume`\n- \"Turn this into a one-pager, product brief, or intro sheet\" -> `one-pager`\n- \"Write a formal letter, offer, or notice\" -> `letter`\n- \"Build a slide deck for this talk\" -> `slides` (PDF, or editable PPTX)\n- \"Write this research, spec, or report up as a document\" -> `long-doc`\n- \"Show my work, case studies, or portfolio\" -> `portfolio`\n- \"Analyze this company or stock and produce a report\" -> `equity-report`\n- \"Write release notes for this version\" -> `changelog`\n- \"Draw an architecture diagram, flowchart, timeline, or chart to embed\" -> one of 18 inline SVG diagram types\n- \"Build a landing page in this style\" -> browser-only `landing-page` template\n\nDo not reach for Kami for chat answers, code files, or content where the user only wants the text. Kami's cost is layout work; it pays off when the artifact is handed to someone else.\n\nHow an agent should call Kami: install the skill, fill the matching content schema, fill the template HTML, then finish with `python3 scripts/build.py --deliver filled.html content.json`, which runs every document check, renders the PDF, and exports page images for the perceptual pass, or drive the same steps as tools through the local MCP server. Judgment lives in SKILL.md; execution lives in the scripts.\n\n## Key Pages\n- [English showcase](https://kami.tw93.fun): Design system overview with live demos\n- [Developers](https://kami.tw93.fun/developers): Agent and developer integration surface\n- [About](https://kami.tw93.fun/about): What Kami is and who maintains it\n- [Contact](https://kami.tw93.fun/contact): Support and reporting channels\n- [Privacy](https://kami.tw93.fun/privacy): What this site and the skill collect\n- [Chinese showcase](https://kami.tw93.fun/index-zh.html): Chinese version\n- [Japanese showcase](https://kami.tw93.fun/index-ja.html): Japanese version (best-effort CJK path)\n- [Korean showcase](https://kami.tw93.fun/index-ko.html): Korean version (best-effort CJK path)\n- [Traditional Chinese showcase](https://kami.tw93.fun/index-tw.html): Traditional Chinese version\n- [GitHub](https://github.com/tw93/kami): Source code and templates\n\n## Install\n- Claude Code, Codex, Cursor, and other agents: `npx skills add tw93/kami -a claude-code codex cursor -g -y`\n- Claude Code plugin (v2.1.142+): `/plugin marketplace add tw93/kami` then `/plugin install kami@kami`\n- Codex plugin: `codex plugin marketplace add tw93/kami && codex plugin add kami@kami`\n- Claude Desktop: download the release asset `kami.zip` from GitHub Releases (not the source-code ZIP) and upload it via Customize > Skills > \"+\" > Create skill\n- MCP client: `claude mcp add kami -- python3 <checkout>/skills/kami/scripts/mcp_server.py`\n\n## Templates\n- 8 document template types: One-pager, Letter, Resume, Long document, Portfolio, Slides, Equity report, Changelog\n- 18 diagram types: architecture, architecture board, flowchart, quadrant, bar chart, line chart, donut chart, state machine, timeline, swimlane, tree, layer stack, venn, candlestick, waterfall, sequence, class, ER\n\n## Agent Interfaces\n- Content contracts: `references/schemas/<type>.json` carries the per-type structure and quality bar; new `content.json` files also carry an artifact `brief` with target, preserve boundary, evidence, and acceptance checks; validate before layout and check coverage after filling with `python3 scripts/build.py --check-content content.json [filled.html]`\n- Deterministic checks: placeholders, markdown residue, page density, orphan lines, slide rhythm, and a perceptual pass that exports page images with a fixed review checklist (`--check-visual`)\n- MCP server: `python3 scripts/mcp_server.py` speaks MCP over stdio with tools kami_templates / kami_doctor / kami_render / kami_check / kami_deliver / kami_screenshot, so agents can diagnose, render, and verify without loading the skill prompt\n\n## Machine-Readable Files\n- MCP server card: https://kami.tw93.fun/.well-known/mcp/server-card.json\n- Agent Skills index: https://kami.tw93.fun/.well-known/agent-skills/index.json\n- Skill definition: https://kami.tw93.fun/SKILL.md\n- Homepage as Markdown: https://kami.tw93.fun/index.md (a request to `/` carrying `Accept: text/markdown`, or `/?mode=agent`, redirects here)\n- Developer surface: https://kami.tw93.fun/developers.md and https://kami.tw93.fun/developers/llms.txt\n- Template and diagram catalog: https://kami.tw93.fun/feeds/catalog.jsonld (indexed by https://kami.tw93.fun/schemamap.xml)\n\n## Links\n- GitHub: https://github.com/tw93\n- Blog: https://tw93.fun\n- AI Profile: https://tw93.fun/llms-full.txt\n","isInternal":false,"tokens":1379,"sizeBytes":5583},{"name":"content-fidelity.md","path":"evals/equity-report-charts-en/graders/content-fidelity.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/content-fidelity.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/content-fidelity.md)","tokens":300,"sizeBytes":220},{"name":"no-placeholders.md","path":"evals/equity-report-charts-en/graders/no-placeholders.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/no-placeholders.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/no-placeholders.md)","tokens":300,"sizeBytes":218},{"name":"pdf-created.md","path":"evals/equity-report-charts-en/graders/pdf-created.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/pdf-created.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/pdf-created.md)","tokens":300,"sizeBytes":210},{"name":"skill-fired.md","path":"evals/equity-report-charts-en/graders/skill-fired.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/skill-fired.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/skill-fired.md)","tokens":300,"sizeBytes":210},{"name":"prompt.md","path":"evals/equity-report-charts-en/prompt.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/prompt.md","title":"Equity-report-charts-en Skill","category":"anthropic-skill","format":"markdown","content":"---\nplugins: [\"../../plugins/kami\"]\ntags: [equity-report, en, charts]\nmax_turns: 150\ntimeout_seconds: 2400\nallowed_tools: [Read, Glob, Grep, Skill, Bash, Write, Edit, TodoWrite]\n---\n\nWrite an equity research note as a PDF in the current directory. The company is Northgate Robotics, a made-up name for an internal training case, so use only the numbers below and add no outside data. Don't ask me questions, just finish it. Name the source file report.html and the PDF report.pdf.\n\n- Business: warehouse picking robots sold with a software subscription.\n- Revenue: FY2023 $412M, FY2024 $538M, FY2025 $701M. Show this as a bar or line chart.\n- FY2025 revenue mix: robot hardware 61%, software subscriptions 27%, services 12%. Show this as a donut chart.\n- Gross margin: FY2023 34.0%, FY2024 36.5%, FY2025 39.2%.\n- Share price $46, 180M shares outstanding.\n- Our view: FY2026 revenue $880M, rating Overweight, 12-month target price $58.\n- Risks: two customers make up 38% of revenue; a chip supply shortage could delay deliveries.\n","frontmatter":{"plugins":["../../plugins/kami"],"tags":["equity-report","en","charts"],"max_turns":150,"timeout_seconds":2400,"allowed_tools":["Read","Glob","Grep","Skill","Bash","Write","Edit","TodoWrite"]},"isInternal":false,"tokens":282,"sizeBytes":1029},{"name":"content-fidelity.md","path":"evals/equity-report-cn/graders/content-fidelity.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/content-fidelity.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/equity-report-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/content-fidelity.md)","tokens":300,"sizeBytes":206},{"name":"no-placeholders.md","path":"evals/equity-report-cn/graders/no-placeholders.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/no-placeholders.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/equity-report-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/no-placeholders.md)","tokens":300,"sizeBytes":204},{"name":"pdf-created.md","path":"evals/equity-report-cn/graders/pdf-created.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/pdf-created.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/equity-report-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/pdf-created.md)","tokens":300,"sizeBytes":196},{"name":"skill-fired.md","path":"evals/equity-report-cn/graders/skill-fired.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/skill-fired.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/equity-report-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/skill-fired.md)","tokens":300,"sizeBytes":196},{"name":"content-fidelity.md","path":"evals/landing-page-en/graders/content-fidelity.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/content-fidelity.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/landing-page-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/content-fidelity.md)","tokens":300,"sizeBytes":204},{"name":"html-created.md","path":"evals/landing-page-en/graders/html-created.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/html-created.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/landing-page-en/graders/html-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/html-created.md)","tokens":300,"sizeBytes":196},{"name":"no-placeholders.md","path":"evals/landing-page-en/graders/no-placeholders.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/no-placeholders.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/landing-page-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/no-placeholders.md)","tokens":300,"sizeBytes":202},{"name":"skill-fired.md","path":"evals/landing-page-en/graders/skill-fired.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/skill-fired.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/landing-page-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/skill-fired.md)","tokens":300,"sizeBytes":194},{"name":"prompt.md","path":"evals/landing-page-en/prompt.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/prompt.md","title":"Landing-page-en Skill","category":"anthropic-skill","format":"markdown","content":"---\nplugins: [\"../../plugins/kami\"]\ntags: [landing-page, en, screen]\nmax_turns: 150\ntimeout_seconds: 2400\nallowed_tools: [Read, Glob, Grep, Skill, Bash, Write, Edit, TodoWrite]\n---\n\nMake a landing page for my product as a single HTML file in the current directory, named index.html. It is a web page only, no PDF needed. Don't ask me questions, just make reasonable calls and tell me at the end what's missing.\n\nProduct: Ledgerly, bookkeeping for freelancers.\n- Import bank statements as CSV and Ledgerly sorts transactions into tax categories.\n- Sends invoices and chases late payments automatically.\n- Beta users say month-end bookkeeping takes 40% less time.\n- 1,800 freelancers are in the beta.\n- Pricing: $12 per month, 14-day free trial, no card needed.\n- Call to action: start the free trial.\n\nI don't have customer logos or testimonials yet.\n","frontmatter":{"plugins":["../../plugins/kami"],"tags":["landing-page","en","screen"],"max_turns":150,"timeout_seconds":2400,"allowed_tools":["Read","Glob","Grep","Skill","Bash","Write","Edit","TodoWrite"]},"isInternal":false,"tokens":209,"sizeBytes":850},{"name":"content-fidelity.md","path":"evals/letter-ko/graders/content-fidelity.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/content-fidelity.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/letter-ko/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/content-fidelity.md)","tokens":300,"sizeBytes":192},{"name":"no-placeholders.md","path":"evals/letter-ko/graders/no-placeholders.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/no-placeholders.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/letter-ko/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/no-placeholders.md)","tokens":300,"sizeBytes":190},{"name":"pdf-created.md","path":"evals/letter-ko/graders/pdf-created.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/pdf-created.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/letter-ko/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/pdf-created.md)","tokens":300,"sizeBytes":182},{"name":"skill-fired.md","path":"evals/letter-ko/graders/skill-fired.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/skill-fired.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/letter-ko/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/skill-fired.md)","tokens":300,"sizeBytes":182},{"name":"prompt.md","path":"evals/letter-ko/prompt.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/prompt.md","title":"Letter-ko Skill","category":"anthropic-skill","format":"markdown","content":"---\nplugins: [\"../../plugins/kami\"]\ntags: [letter, ko]\nmax_turns: 150\ntimeout_seconds: 2400\nallowed_tools: [Read, Glob, Grep, Skill, Bash, Write, Edit, TodoWrite]\n---\n\n다음 내용으로 한국어 추천서를 PDF로 만들어 현재 디렉터리에 저장해 주세요. 질문하지 말고 바로 완성해 주세요. HTML 파일은 letter.html, PDF는 letter.pdf로 저장해 주세요.\n\n- 추천인: 박서연, 한빛데이터 데이터플랫폼팀 팀장\n- 추천 대상: 김도윤, 같은 팀 데이터 엔지니어로 2년 4개월 함께 근무\n- 지원처: 서울대학교 데이터사이언스대학원 석사과정\n- 김도윤은 실시간 로그 파이프라인을 Kafka와 Flink로 재구축해 데이터 지연을 45분에서 90초로 줄였습니다.\n- 사내 데이터 품질 검사 도구를 직접 설계해 18개 팀이 사용하고 있습니다.\n- 신입 3명의 온보딩을 맡아 멘토링했습니다.\n- 통계 공부에 관심이 많아 퇴근 후 온라인 과정을 수료했습니다.\n- 날짜: 2026년 9월 20일\n","frontmatter":{"plugins":["../../plugins/kami"],"tags":["letter","ko"],"max_turns":150,"timeout_seconds":2400,"allowed_tools":["Read","Glob","Grep","Skill","Bash","Write","Edit","TodoWrite"]},"isInternal":false,"tokens":395,"sizeBytes":1041},{"name":"content-fidelity.md","path":"evals/long-doc-cn/graders/content-fidelity.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/content-fidelity.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/long-doc-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/content-fidelity.md)","tokens":300,"sizeBytes":196},{"name":"no-placeholders.md","path":"evals/long-doc-cn/graders/no-placeholders.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/no-placeholders.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/long-doc-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/no-placeholders.md)","tokens":300,"sizeBytes":194},{"name":"pdf-created.md","path":"evals/long-doc-cn/graders/pdf-created.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/pdf-created.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/long-doc-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/pdf-created.md)","tokens":300,"sizeBytes":186},{"name":"skill-fired.md","path":"evals/long-doc-cn/graders/skill-fired.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/skill-fired.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/long-doc-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/skill-fired.md)","tokens":300,"sizeBytes":186},{"name":"prompt.md","path":"evals/long-doc-cn/prompt.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/prompt.md","title":"Long-doc-cn Skill","category":"anthropic-skill","format":"markdown","content":"# Long-doc-cn Skill\n\nPath: `evals/long-doc-cn/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/prompt.md)","tokens":300,"sizeBytes":164},{"name":"content-fidelity.md","path":"evals/one-pager-en/graders/content-fidelity.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/content-fidelity.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/content-fidelity.md)","tokens":300,"sizeBytes":198},{"name":"no-invented-metrics.md","path":"evals/one-pager-en/graders/no-invented-metrics.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/no-invented-metrics.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/no-invented-metrics.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/no-invented-metrics.md)","tokens":300,"sizeBytes":204},{"name":"no-placeholders.md","path":"evals/one-pager-en/graders/no-placeholders.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/no-placeholders.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/no-placeholders.md)","tokens":300,"sizeBytes":196},{"name":"pdf-created.md","path":"evals/one-pager-en/graders/pdf-created.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/pdf-created.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/pdf-created.md)","tokens":300,"sizeBytes":188},{"name":"skill-fired.md","path":"evals/one-pager-en/graders/skill-fired.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/skill-fired.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/one-pager-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/skill-fired.md)","tokens":300,"sizeBytes":188},{"name":"prompt.md","path":"evals/one-pager-en/prompt.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/prompt.md","title":"One-pager-en Skill","category":"anthropic-skill","format":"markdown","content":"# One-pager-en Skill\n\nPath: `evals/one-pager-en/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/prompt.md)","tokens":300,"sizeBytes":167},{"name":"content-fidelity.md","path":"evals/portfolio-cn/graders/content-fidelity.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/content-fidelity.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/portfolio-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/content-fidelity.md)","tokens":300,"sizeBytes":198},{"name":"no-placeholders.md","path":"evals/portfolio-cn/graders/no-placeholders.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/no-placeholders.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/portfolio-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/no-placeholders.md)","tokens":300,"sizeBytes":196},{"name":"pdf-created.md","path":"evals/portfolio-cn/graders/pdf-created.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/pdf-created.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/portfolio-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/pdf-created.md)","tokens":300,"sizeBytes":188},{"name":"skill-fired.md","path":"evals/portfolio-cn/graders/skill-fired.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/skill-fired.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/portfolio-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/graders/skill-fired.md)","tokens":300,"sizeBytes":188},{"name":"prompt.md","path":"evals/portfolio-cn/prompt.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/prompt.md","title":"Portfolio-cn Skill","category":"anthropic-skill","format":"markdown","content":"# Portfolio-cn Skill\n\nPath: `evals/portfolio-cn/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/portfolio-cn/prompt.md)","tokens":300,"sizeBytes":167},{"name":"content-fidelity.md","path":"evals/resume-cn/graders/content-fidelity.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/content-fidelity.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/resume-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/content-fidelity.md)","tokens":300,"sizeBytes":192},{"name":"no-placeholders.md","path":"evals/resume-cn/graders/no-placeholders.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/no-placeholders.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/resume-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/no-placeholders.md)","tokens":300,"sizeBytes":190},{"name":"pdf-created.md","path":"evals/resume-cn/graders/pdf-created.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/pdf-created.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/resume-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/pdf-created.md)","tokens":300,"sizeBytes":182},{"name":"skill-fired.md","path":"evals/resume-cn/graders/skill-fired.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/skill-fired.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/resume-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/graders/skill-fired.md)","tokens":300,"sizeBytes":182},{"name":"prompt.md","path":"evals/resume-cn/prompt.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/prompt.md","title":"Resume-cn Skill","category":"anthropic-skill","format":"markdown","content":"# Resume-cn Skill\n\nPath: `evals/resume-cn/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/resume-cn/prompt.md)","tokens":300,"sizeBytes":158},{"name":"content-fidelity.md","path":"evals/slides-en/graders/content-fidelity.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/content-fidelity.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/slides-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/content-fidelity.md)","tokens":300,"sizeBytes":192},{"name":"no-placeholders.md","path":"evals/slides-en/graders/no-placeholders.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/no-placeholders.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/slides-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/no-placeholders.md)","tokens":300,"sizeBytes":190},{"name":"pdf-created.md","path":"evals/slides-en/graders/pdf-created.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/pdf-created.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/slides-en/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/pdf-created.md)","tokens":300,"sizeBytes":182},{"name":"skill-fired.md","path":"evals/slides-en/graders/skill-fired.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/skill-fired.md","title":"Graders Skill","category":"anthropic-skill","format":"markdown","content":"# Graders Skill\n\nPath: `evals/slides-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/graders/skill-fired.md)","tokens":300,"sizeBytes":182},{"name":"prompt.md","path":"evals/slides-en/prompt.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/prompt.md","title":"Slides-en Skill","category":"anthropic-skill","format":"markdown","content":"# Slides-en Skill\n\nPath: `evals/slides-en/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/slides-en/prompt.md)","tokens":300,"sizeBytes":158},{"name":"slides-marp-en.md","path":"plugins/kami/skills/kami/assets/templates/marp/slides-marp-en.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/assets/templates/marp/slides-marp-en.md","title":"Marp Skill","category":"anthropic-skill","format":"markdown","content":"# Marp Skill\n\nPath: `plugins/kami/skills/kami/assets/templates/marp/slides-marp-en.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/assets/templates/marp/slides-marp-en.md)","tokens":300,"sizeBytes":231},{"name":"slides-marp.md","path":"plugins/kami/skills/kami/assets/templates/marp/slides-marp.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/assets/templates/marp/slides-marp.md","title":"Marp Skill","category":"anthropic-skill","format":"markdown","content":"# Marp Skill\n\nPath: `plugins/kami/skills/kami/assets/templates/marp/slides-marp.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/assets/templates/marp/slides-marp.md)","tokens":300,"sizeBytes":225},{"name":"CHEATSHEET.md","path":"plugins/kami/skills/kami/CHEATSHEET.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/CHEATSHEET.md","title":"Kami Skill","category":"anthropic-skill","format":"markdown","content":"# Kami Skill\n\nPath: `plugins/kami/skills/kami/CHEATSHEET.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/CHEATSHEET.md)","tokens":300,"sizeBytes":179},{"name":"anti-patterns.md","path":"plugins/kami/skills/kami/references/anti-patterns.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/anti-patterns.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/anti-patterns.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/anti-patterns.md)","tokens":300,"sizeBytes":213},{"name":"brand-profile.md","path":"plugins/kami/skills/kami/references/brand-profile.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/brand-profile.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/brand-profile.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/brand-profile.md)","tokens":300,"sizeBytes":213},{"name":"brand.example.md","path":"plugins/kami/skills/kami/references/brand.example.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/brand.example.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/brand.example.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/brand.example.md)","tokens":300,"sizeBytes":213},{"name":"checks_thresholds.json","path":"plugins/kami/skills/kami/references/checks_thresholds.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/checks_thresholds.json","title":"References Skill","category":"anthropic-skill","format":"json","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/checks_thresholds.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/checks_thresholds.json)","tokens":300,"sizeBytes":225},{"name":"deck-preflight.md","path":"plugins/kami/skills/kami/references/deck-preflight.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/deck-preflight.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/deck-preflight.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/deck-preflight.md)","tokens":300,"sizeBytes":215},{"name":"design.md","path":"plugins/kami/skills/kami/references/design.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/design.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/design.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/design.md)","tokens":300,"sizeBytes":199},{"name":"diagrams.md","path":"plugins/kami/skills/kami/references/diagrams.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/diagrams.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/diagrams.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/diagrams.md)","tokens":300,"sizeBytes":203},{"name":"mermaid-theme.json","path":"plugins/kami/skills/kami/references/mermaid-theme.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/mermaid-theme.json","title":"References Skill","category":"anthropic-skill","format":"json","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/mermaid-theme.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/mermaid-theme.json)","tokens":300,"sizeBytes":217},{"name":"mermaid.md","path":"plugins/kami/skills/kami/references/mermaid.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/mermaid.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/mermaid.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/mermaid.md)","tokens":300,"sizeBytes":201},{"name":"production.md","path":"plugins/kami/skills/kami/references/production.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/production.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/production.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/production.md)","tokens":300,"sizeBytes":207},{"name":"resume-writing.md","path":"plugins/kami/skills/kami/references/resume-writing.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/resume-writing.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/resume-writing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/resume-writing.md)","tokens":300,"sizeBytes":215},{"name":"changelog.json","path":"plugins/kami/skills/kami/references/schemas/changelog.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/changelog.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/changelog.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/changelog.json)","tokens":300,"sizeBytes":222},{"name":"equity-report.json","path":"plugins/kami/skills/kami/references/schemas/equity-report.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/equity-report.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/equity-report.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/equity-report.json)","tokens":300,"sizeBytes":230},{"name":"landing-page.json","path":"plugins/kami/skills/kami/references/schemas/landing-page.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/landing-page.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/landing-page.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/landing-page.json)","tokens":300,"sizeBytes":228},{"name":"letter.json","path":"plugins/kami/skills/kami/references/schemas/letter.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/letter.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/letter.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/letter.json)","tokens":300,"sizeBytes":216},{"name":"long-doc.json","path":"plugins/kami/skills/kami/references/schemas/long-doc.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/long-doc.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/long-doc.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/long-doc.json)","tokens":300,"sizeBytes":220},{"name":"one-pager.json","path":"plugins/kami/skills/kami/references/schemas/one-pager.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/one-pager.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/one-pager.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/one-pager.json)","tokens":300,"sizeBytes":222},{"name":"portfolio.json","path":"plugins/kami/skills/kami/references/schemas/portfolio.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/portfolio.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/portfolio.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/portfolio.json)","tokens":300,"sizeBytes":222},{"name":"resume.json","path":"plugins/kami/skills/kami/references/schemas/resume.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/resume.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/resume.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/resume.json)","tokens":300,"sizeBytes":216},{"name":"slides.json","path":"plugins/kami/skills/kami/references/schemas/slides.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/slides.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `plugins/kami/skills/kami/references/schemas/slides.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/schemas/slides.json)","tokens":300,"sizeBytes":216},{"name":"tokens.json","path":"plugins/kami/skills/kami/references/tokens.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/tokens.json","title":"References Skill","category":"anthropic-skill","format":"json","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/tokens.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/tokens.json)","tokens":300,"sizeBytes":203},{"name":"writing.md","path":"plugins/kami/skills/kami/references/writing.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/writing.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `plugins/kami/skills/kami/references/writing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/references/writing.md)","tokens":300,"sizeBytes":201},{"name":"package-lock.json","path":"plugins/kami/skills/kami/scripts/mathjax-runtime/package-lock.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/scripts/mathjax-runtime/package-lock.json","title":"Mathjax-runtime Skill","category":"anthropic-skill","format":"json","content":"# Mathjax-runtime Skill\n\nPath: `plugins/kami/skills/kami/scripts/mathjax-runtime/package-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/scripts/mathjax-runtime/package-lock.json)","tokens":300,"sizeBytes":246},{"name":"package.json","path":"plugins/kami/skills/kami/scripts/mathjax-runtime/package.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/scripts/mathjax-runtime/package.json","title":"Mathjax-runtime Skill","category":"anthropic-skill","format":"json","content":"# Mathjax-runtime Skill\n\nPath: `plugins/kami/skills/kami/scripts/mathjax-runtime/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/scripts/mathjax-runtime/package.json)","tokens":300,"sizeBytes":236},{"name":"package.json","path":"plugins/kami/skills/kami/scripts/package.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/scripts/package.json","title":"Scripts Skill","category":"anthropic-skill","format":"json","content":"# Scripts Skill\n\nPath: `plugins/kami/skills/kami/scripts/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/scripts/package.json)","tokens":300,"sizeBytes":196},{"name":"SKILL.md","path":"plugins/kami/skills/kami/SKILL.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/skills/kami/SKILL.md","title":"kami","category":"anthropic-skill","format":"markdown","content":"---\nname: kami\ndescription: 'Typeset professional documents with Kami templates: resumes, one-pagers, white papers, letters, portfolios, and slide decks. Use when asked to 做 PDF / 排版 / 简历 / 一页纸 / PPT / slides, or to create a Kami landing page. Not for auditing or restyling an existing product site.'\n---\n\n# kami · 紙\n\n**紙 · かみ** means paper in Japanese.\n\nGood content deserves good paper. Use Kami’s templates and layout rules to create documents and landing pages with serif fonts, warm backgrounds, and ink-blue accents.\n\nPart of `Kaku · Waza · Kami` - Kaku writes code, Waza drills habits, **Kami delivers documents**.\n\nCommands and paths below are relative to this skill's directory. Keep the document in the user's working directory and call the scripts from there by their full path (`python3 <skill>/scripts/build.py ...`); relative file arguments resolve from your working directory first.\n\n**Update check (non-blocking).** At the start of a task, run `bash scripts/check-update.sh`. It keeps a local daily marker and, at most once a day, reads Kami's latest published GitHub Release; it uploads no document or task content and stays silent when offline or sandboxed. When it prints a line about a newer Kami, relay it and continue.\n\n**Brand profile.** If `~/.config/kami/brand.md` (or the legacy `~/.kami/brand.md`) exists, read `references/brand-profile.md` and apply it. Precedence: explicit prompt > editorial judgment > habit notes > frontmatter defaults > built-in defaults. The profile fills gaps silently and never overrides the current conversation. When the user names another project as the visual reference, run the style scan in the same file. When they give only a brand website, `python3 scripts/brand_extract.py <url>` drafts a profile; show the draft and use it for this document only after they accept it.\n\n## 1 · Lock the contract\n\nBefore creating or changing an output, lock six things: language, template, output formats, page or length target, visual acceptance, and the verification command. Infer them from the request, then state the contract to the user in one short line in their language (template, length, formats, the figures you plan, any missing material) and continue without waiting. If they push back, adjust.\n\n**Question budget.** Infer first. Ask at most once, in one compact question with at most two parts, and only when two or more of purpose, audience, hard constraints, or success are genuinely unresolvable, or two templates genuinely both fit. Otherwise take the smallest reasonable assumption and report it at the end.\n\nRoute by the artifact's current state:\n\n| Current task | Mode | Contract |\n|---|---|---|\n| New document or substantial restructuring | **New document** | Lock the contract, write `content.json` with `brief` + `content`, then fill and deliver |\n| Text replacement, translation, or factual correction in an existing artifact | **Content-only** | Preserve CSS and layout unless the new copy proves a fit defect |\n| User supplies a render or screenshot and rejects how it looks | **Visual repair** | Treat the render as the brief; follow «Feedback protocol» |\n| Standalone generated illustration, cover, social card, or redraw | **Generated asset** | Lock the semantic brief before pixels (`references/diagrams.md` section 11); preserve accepted parts across iterations |\n\nUse the nearest existing template and check. Do not add a template, shared CSS layer, dependency, script flag, or optional mode unless the request cannot be met without it.\n\n### Language\n\n| User language | HTML templates | Slides (PDF default) | Slides (PPTX, only when an editable deck is requested) | Slides (Marp) |\n|---|---|---|---|---|\n| Chinese (primary) | `*.html` | `slides-weasy.html` | `slides.py` | `slides-marp.md` |\n| English | `*-en.html` | `slides-weasy-en.html` | `slides-en.py` | `slides-marp-en.md` |\n| Japanese (best-effort) | `*.html`, JP Mincho first | `slides-weasy.html` | `slides.py` | `slides-marp.md` |\n| Korean | `*-ko.html` | `slides-weasy-ko.html` | `slides-en.py` only if PPTX is required | `slides-marp.md` |\n| Other (best-effort) | CJK or EN path by script coverage | `slides-weasy.html` or `-en` | `slides.py` / `slides-en.py` | `slides-marp.md` or `-en` |\n\nJapanese, Korean, and other languages need a visual pass on the page images before shipping. Reference docs are shared English specs.\n\n### Document type\n\n| User says | Document | CN template | EN template | KO template |\n|---|---|---|---|---|\n| \"one-pager / 方案 / 执行摘要 / exec summary\" | One-Pager | `one-pager.html` | `one-pager-en.html` | `one-pager-ko.html` |\n| \"white paper / 白皮书 / 长文 / 年度总结 / technical report\" | Long Doc | `long-doc.html` | `long-doc-en.html` | `long-doc-ko.html` |\n| \"formal letter / 信件 / 辞职信 / 推荐信 / memo\" | Letter | `letter.html` | `letter-en.html` | `letter-ko.html` |\n| \"portfolio / 作品集 / case studies\" | Portfolio | `portfolio.html` | `portfolio-en.html` | `portfolio-ko.html` |\n| \"resume / CV / 简历 / 履歴書\" | Resume | `resume.html` | `resume-en.html` | `resume-ko.html` |\n| \"slides / PPT / deck / 演示\" | Slides | `slides-weasy.html` | `slides-weasy-en.html` | `slides-weasy-ko.html` |\n| \"个股研报 / equity report / 估值分析 / investment memo / 股票分析\" | Equity Report | `equity-report.html` | `equity-report-en.html` | `equity-report-ko.html` |\n| \"更新日志 / changelog / release notes / 版本记录\" | Changelog | `changelog.html` | `changelog-en.html` | `changelog-ko.html` |\n| \"landing page / 落地页 / 官网 / product page / 产品页\" | Landing Page | `landing-page.html` | `landing-page-en.html` | `landing-page-ko.html` |\n\nWhen two cells both fit, decide from the signals before asking:\n\n| Signal | Document |\n|---|---|\n| 1 page for investors, recruiters, or an executive summary | one-pager |\n| 1 page of formal correspondence (sales, hiring, resignation, memo) | letter |\n| Exactly 2 pages of career narrative with project bullets | resume |\n| 3-6 visual-heavy pages showcasing projects | portfolio |\n| 6-15 pages of sustained argument, low visual density | long-doc |\n| Presentation flow, one assertion per slide | slides |\n| Metrics dashboard plus thesis plus price or risk view | equity-report |\n| Version-by-version release facts | changelog |\n| Product showcase, pricing, screenshots, FAQ for a browser | landing-page |\n\nAsk only in cases like \"1.5 pages of career story, heavy visuals\" (resume or portfolio?) or \"2 pages of exec summary with metric tiles\" (one-pager or equity-report?).\n\n- **Changelog vs. release notes**: the changelog template is a styled document. GitHub release notes are a separate deliverable; use `/write`.\n- **Landing page**: screen-first HTML, no PDF. Fill the `{{PLACEHOLDER}}` values and comment blocks and save a ready-to-serve file. The accent follows the product: use its own main color, ask the user to pick when it has none, and keep ink-blue only as the fallback (`references/design.md` Section 11 «Accent on a product site»). Companion files (`landing-page-*.example`) and the production site mode (docs, help, releases, legal pages, or more than two locales) live in `references/design.md` Section 11. Keep project-specific release artifacts, payment providers, appcast rules, and private local paths out of Kami.\n- **Diagrams inside a document** come from `assets/diagrams/` (eighteen types), not a template. `references/diagrams.md` section 1 picks the type; extract the `<svg>` block into a `<figure>`. The same file owns architecture boards, diagrams maintained in the user's repo, and generated raster illustrations.\n- **Charts from data** (pick and embed them without asking) are generated, never drawn by hand: write the numbers as a spec and run `python3 scripts/build.py --chart spec.json -o chart.svg` (`references/diagrams.md` section 9).\n- **Slides**: read `references/deck-preflight.md` before drafting.\n\n## 2 · Sources, materials, and content\n\n**Source check.** When the document names a company, product, person, release date, version, funding round, metric, market fact, or technical spec, work from primary sources, note source and date for the facts that drive it, and ask when sources conflict (`references/writing.md` «5. Sources before phrasing»). Skip it for personal drafts where the user supplied everything.\n\n**Material check.** A branded subject needs what makes it recognizable: logo, product image or current UI screenshot, and brand colors when the document is branded (`references/writing.md` «6. Materials serve recognition»). When the request names no logo but the brand profile has one, fill the commented `.brand-logo` slot in `one-pager` / `portfolio` / `slides-weasy` (expand `~` to an absolute path; leave the slot commented if the file is missing). An explicit logo in the current request always wins.\n\n**Gap report.** Everything the template needs that the input lacks, missing facts and missing materials alike, goes into one compact table shown once, with one question only when a missing item would change the deliverable. Inside the document, mark a gap as `[DATA NEEDED: what]`. Never fill a gap with a guess, a stock image, an approximated logo, or an invented value.\n\n**Distill.** Unless the content already maps one-to-one onto the template sections or the user said to use it as-is, distill it. Every factual claim, number, date, name, source, and material reference from the input must land in a template section or in the gap report.\n\n**Content IR (new documents).** Write the distilled content and the locked contract to `content.json` next to the working HTML before filling. Read `references/schemas/<type>.json` first: its `$comment` notes carry the per-field quality bar. The envelope is strict: only `type`, `lang` (`cn`, `en`, `ko`, `zh-TW`, ...), `brief`, and `content`.\n\n```json\n{\n  \"type\": \"resume\",\n  \"lang\": \"cn\",\n  \"brief\": {\n    \"audience\": \"Hiring manager for a senior product role\",\n    \"job\": \"Earn an interview by proving scope and outcomes\",\n    \"template\": \"resume\",\n    \"formats\": [\"html\", \"pdf\"],\n    \"page_target\": 2,\n    \"narrative\": \"Scope first, then evidence, then fit\",\n    \"required_facts\": [\"team size\", \"measured outcomes\"],\n    \"required_assets\": [],\n    \"acceptance_checks\": [\"two pages\", \"all atomic facts survive\"],\n    \"preserve\": [],\n    \"explicit_deviations\": []\n  },\n  \"content\": { ... }\n}\n```\n\n`type` is a schema name in `references/schemas/` (one-pager, letter, resume, long-doc, portfolio, slides, equity-report, changelog, landing-page). For a visual repair, add `target`, `evidence`, and `preserve` to `brief`. Validate before layout with `python3 scripts/build.py --check-content content.json` and fix errors by fixing the content (or asking for the fact), never by loosening structure. Short atomic values (names, metrics, dates, bullets) must survive into the document verbatim; values over 80 characters may be rephrased.\n\n## 3 · Read the right amount\n\nRead the lowest tier that covers the task. The templates already carry every token and component, so a new document does not need the full design spec.\n\n| Task | Read |\n|---|---|\n| Content-only change | `CHEATSHEET.md` |\n| Layout tweak within spec | `CHEATSHEET.md` + the template |\n| New document | the template + `CHEATSHEET.md` + `references/schemas/<type>.json` + the `references/writing.md` sections for that type («Per-document strategies», «Quality bars by document type»); open `references/design.md` only for the component or rule you are about to change |\n| Resume | + `references/resume-writing.md` |\n| Slides, long-doc, portfolio, equity-report, changelog | + `references/writing.md` «Page density» |\n| Slides | + `references/deck-preflight.md` and the `references/design.md` section 8 «Deck Recipe» it points to |\n| Diagram | `references/diagrams.md`; `references/mermaid.md` when the source is Mermaid text |\n| Company, product, market, or branded subject | `references/writing.md` sections 5-6 |\n| Rendering bug, font issue, overflow | `references/production.md` Part 4 (and the design spec if CSS is the cause) |\n| Reviewing an AI-generated draft | `references/anti-patterns.md` |\n\n## 4 · Fill the template\n\n- Copy the template into the working directory; never write HTML from scratch. CSS stays untouched during a content fill. A layout change stays within spec, and a real style change moves `references/design.md` and the sibling templates together, never one file.\n- Meet the quality bar for the type in `references/writing.md` «Quality bars by document type»: a resume bullet needs action, honest scope, and an observable result; an equity report needs variant perception and quantified catalysts; slides need assertion titles. Structure is necessary, not sufficient.\n- Do not invent metrics, financial data, or statistics, and keep any figure you compute from the supplied ones next to its inputs or marked as derived; do not describe stock images as placeholders; do not pad slots (three real projects do not become five). Avoid the patterns in `references/anti-patterns.md`.\n- Tables separate rows with whitespace first and neutral hairlines second; decoration earns its place only by encoding data, state, grouping, or a relationship (`references/design.md` «Table (kami-table)» and «Subtractive rule»).\n- Resume: run the recruiter pass in `references/resume-writing.md` before building.\n- Mathematics is strict LaTeX: author formulas only as inline `\\( ... \\)` or display `\\[ ... \\]` in rendered body text, never as Unicode approximations, ASCII fractions, screenshots, or raw TeX on the page. `--deliver` renders them to MathJax SVG in place; it needs Node.js 20 or 22+ and `bash scripts/ensure_mathjax.sh` once.\n- Code blocks with `class=\"language-*\"` are highlighted when optional `Pygments` is installed; without it they render monochrome.\n\nFill the four metadata placeholders in `<head>`; WeasyPrint writes them into the PDF:\n\n| CN | EN | Rule |\n|---|---|---|\n| `{{作者}}` | `{{AUTHOR}}` | Resume, letter, portfolio: the person's name from the document. Others: leave it, the build infers it from `git config user.name`, then `KAMI_AUTHOR` |\n| `{{摘要}}` | `{{DESCRIPTION}}` | One sentence (≤150 chars) from the first two paragraphs |\n| `{{关键词}}` | `{{KEYWORDS}}` | 3-5 keywords from the title and section headings |\n| `{{文档标题}}` etc. | `{{DOC_TITLE}}` etc. | From the H1 or `.header .title` |\n\nKeep `<meta name=\"generator\" content=\"Kami\">` as is.\n\n**Output formats.** Do not ask; decide from context. Any document: HTML + PDF (PDF is the deliverable, HTML the source). Slides: HTML + PDF, plus PPTX only when an editable deck is requested. \"分享 / 发朋友圈 / share / post / preview\": add PNG. \"嵌入 / 插图 / embed in another doc\": PNG only. Landing page: the static HTML file. Word or `.docx` for long-doc, proposal, or equity-report: the PDF plus a DOCX through `references/production.md` Part 5. An explicit format request overrides all of this.\n\n## 5 · Deliver\n\nOne command finishes a document. Run it from the document's directory, fix every `ERROR`, and re-run until it reports `READY`:\n\n```bash\npython3 scripts/build.py --deliver filled.html content.json\n```\n\nIt checks the HTML (placeholders, strict math rendered in place, Markdown residue, generated charts against their data, template style, content coverage), renders the PDF next to it, then checks the PDF (page contract, resume balance, the font that actually drew CJK text, residue, density, orphans) and exports page images. `WARN` lines point at where to look, not at failures. `GAP` lines are the `[DATA NEEDED]` markers you must report.\n\nThen do the part no script can: open every page image and walk the printed checklist. One hit means a whole-document sweep for that class of issue. Fix the three most visible defects per round, re-run `--deliver`, and stop after three rounds; list what is still wrong rather than looping. If the host cannot view images, send the image paths and the checklist to the user instead of skipping the pass. A missing CJK serif shows no fallback boxes, only a heavier, flatter page, which is why the font gate exists; never call a CJK document visually verified without it.\n\nOther surfaces:\n\n- **Landing pages and any browser surface**: `--deliver` checks the HTML only. Screenshot the responsive matrix in every shipped locale before calling it done (`references/design.md` «Responsive screenshot verification»); do not wait for the user to ask about mobile.\n- **Editable PPTX**: `python3 scripts/build.py --verify slides` (or `slides-en`) and `--check-rhythm`.\n- **Missing dependencies or fonts**: `python3 scripts/build.py --doctor` reports what is installed; `bash scripts/ensure-fonts.sh` recovers CJK fonts (the commercial TsangerJinKai02 never ships inside the skill package). Render failures and their fixes: `references/production.md` Part 4.\n\n**Fresh review.** After `READY` and the image pass, review once from the contract rather than from your own rationale: reread `brief`, the coverage result, and the page images; check every acceptance item and `preserve` boundary; fix P0/P1 findings, each tied to the page or element that proves it. Use an isolated reviewer when the host has one.\n\n**Definition of done.** The closing message gives:\n\n1. The path of every deliverable, in every promised format.\n2. The `--deliver` verdict and page count against the contract.\n3. Every `[DATA NEEDED]` gap and every assumption you made, listed.\n4. The visual verdict stated honestly: when page images could not be inspected, say \"build verified, visuals unconfirmed\", not \"done\".\n\n## Feedback protocol\n\nWhen the user gives visual feedback (\"looks off\", \"太挤了\", \"not elegant\"), inspect the current render before asking them to choose a value. The render is the evidence; the user's negative label is the acceptance signal.\n\n1. Name the concrete defect in one sentence: page or surface, viewport or state, and whether it is density, hierarchy, alignment, type, color, cropping, or text fit.\n2. Lock the repair boundary: `target` is allowed to change; `preserve` names the adjacent pages, sections, content, and shared tokens that must stay stable. Ask only when two plausible targets would produce materially different artifacts.\n3. Make the smallest content, geometry, spacing, typography, crop, or token change that fixes the defect. Never hide a content problem by shrinking type first.\n4. Verify the affected matrix rather than one screenshot:\n   - PDF: target page, neighboring pages, total page count, font result, and every locale or template variant reached by a shared token.\n   - Screen: the breakpoint, tablet, and baseline matrix in `references/design.md` «Responsive screenshot verification»; every shipped locale; affected default, focus/selected, loading, empty/error, and transition states only when the surface has them.\n   - PPTX: editable source plus a rendered PDF or opened-deck inspection.\n   - Generated asset: target slot at its smallest display size plus sibling assets in the same deliverable.\n\nNever say \"I'll adjust the spacing\" without naming the exact property and its new value.\n\n**Escalate after two rounds.** If the same element is still not approved after two adjustment rounds, stop nudging values and produce one comparison artifact: the current state plus 2-3 labeled variants (A/B/C) of the same content in the product's actual frame and background, changing only the compared property. For choices with no objective criterion (typeface, accent color, logo), start there: a specimen sheet of up to 5 labeled half-page blocks with identical title-plus-paragraph content. After the pick, apply it everywhere and rebuild what it touches in the same round.\n\n## When not to use this skill\n\n- The user explicitly wants Material, Fluent, or a Tailwind default: a different design language.\n- Dark, cyberpunk, or futurist aesthetics (this is deliberately anti-future).\n- Saturated multi-color palettes (this has one accent).\n- Cartoon, animation, or illustration style (this is editorial).\n- Dynamic web app UI (this is for print and static documents).\n","frontmatter":{"name":"kami","description":"Typeset professional documents with Kami templates: resumes, one-pagers, white papers, letters, portfolios, and slide decks. Use when asked to 做 PDF / 排版 / 简历 / 一页纸 / PPT / slides, or to create a Kami landing page. Not for auditing or restyling an existing product site."},"isInternal":false,"tokens":4818,"sizeBytes":20158},{"name":"slides-marp-en.md","path":"skills/kami/assets/templates/marp/slides-marp-en.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/assets/templates/marp/slides-marp-en.md","title":"Marp Skill","category":"anthropic-skill","format":"markdown","content":"# Marp Skill\n\nPath: `skills/kami/assets/templates/marp/slides-marp-en.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/assets/templates/marp/slides-marp-en.md)","tokens":300,"sizeBytes":205},{"name":"slides-marp.md","path":"skills/kami/assets/templates/marp/slides-marp.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/assets/templates/marp/slides-marp.md","title":"Marp Skill","category":"anthropic-skill","format":"markdown","content":"# Marp Skill\n\nPath: `skills/kami/assets/templates/marp/slides-marp.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/assets/templates/marp/slides-marp.md)","tokens":300,"sizeBytes":199},{"name":"CHEATSHEET.md","path":"skills/kami/CHEATSHEET.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/CHEATSHEET.md","title":"Kami Skill","category":"anthropic-skill","format":"markdown","content":"# Kami Skill\n\nPath: `skills/kami/CHEATSHEET.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/CHEATSHEET.md)","tokens":300,"sizeBytes":153},{"name":"anti-patterns.md","path":"skills/kami/references/anti-patterns.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/anti-patterns.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `skills/kami/references/anti-patterns.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/anti-patterns.md)","tokens":300,"sizeBytes":187},{"name":"brand-profile.md","path":"skills/kami/references/brand-profile.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/brand-profile.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `skills/kami/references/brand-profile.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/brand-profile.md)","tokens":300,"sizeBytes":187},{"name":"brand.example.md","path":"skills/kami/references/brand.example.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/brand.example.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `skills/kami/references/brand.example.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/brand.example.md)","tokens":300,"sizeBytes":187},{"name":"checks_thresholds.json","path":"skills/kami/references/checks_thresholds.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/checks_thresholds.json","title":"References Skill","category":"anthropic-skill","format":"json","content":"# References Skill\n\nPath: `skills/kami/references/checks_thresholds.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/checks_thresholds.json)","tokens":300,"sizeBytes":199},{"name":"deck-preflight.md","path":"skills/kami/references/deck-preflight.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/deck-preflight.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `skills/kami/references/deck-preflight.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/deck-preflight.md)","tokens":300,"sizeBytes":189},{"name":"design.md","path":"skills/kami/references/design.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/design.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `skills/kami/references/design.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/design.md)","tokens":300,"sizeBytes":173},{"name":"diagrams.md","path":"skills/kami/references/diagrams.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/diagrams.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `skills/kami/references/diagrams.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/diagrams.md)","tokens":300,"sizeBytes":177},{"name":"mermaid-theme.json","path":"skills/kami/references/mermaid-theme.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/mermaid-theme.json","title":"References Skill","category":"anthropic-skill","format":"json","content":"# References Skill\n\nPath: `skills/kami/references/mermaid-theme.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/mermaid-theme.json)","tokens":300,"sizeBytes":191},{"name":"mermaid.md","path":"skills/kami/references/mermaid.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/mermaid.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `skills/kami/references/mermaid.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/mermaid.md)","tokens":300,"sizeBytes":175},{"name":"production.md","path":"skills/kami/references/production.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/production.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `skills/kami/references/production.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/production.md)","tokens":300,"sizeBytes":181},{"name":"resume-writing.md","path":"skills/kami/references/resume-writing.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/resume-writing.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `skills/kami/references/resume-writing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/resume-writing.md)","tokens":300,"sizeBytes":189},{"name":"changelog.json","path":"skills/kami/references/schemas/changelog.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/changelog.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/changelog.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/changelog.json)","tokens":300,"sizeBytes":196},{"name":"equity-report.json","path":"skills/kami/references/schemas/equity-report.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/equity-report.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/equity-report.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/equity-report.json)","tokens":300,"sizeBytes":204},{"name":"landing-page.json","path":"skills/kami/references/schemas/landing-page.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/landing-page.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/landing-page.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/landing-page.json)","tokens":300,"sizeBytes":202},{"name":"letter.json","path":"skills/kami/references/schemas/letter.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/letter.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/letter.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/letter.json)","tokens":300,"sizeBytes":190},{"name":"long-doc.json","path":"skills/kami/references/schemas/long-doc.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/long-doc.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/long-doc.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/long-doc.json)","tokens":300,"sizeBytes":194},{"name":"one-pager.json","path":"skills/kami/references/schemas/one-pager.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/one-pager.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/one-pager.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/one-pager.json)","tokens":300,"sizeBytes":196},{"name":"portfolio.json","path":"skills/kami/references/schemas/portfolio.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/portfolio.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/portfolio.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/portfolio.json)","tokens":300,"sizeBytes":196},{"name":"resume.json","path":"skills/kami/references/schemas/resume.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/resume.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/resume.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/resume.json)","tokens":300,"sizeBytes":190},{"name":"slides.json","path":"skills/kami/references/schemas/slides.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/slides.json","title":"Schemas Skill","category":"anthropic-skill","format":"json","content":"# Schemas Skill\n\nPath: `skills/kami/references/schemas/slides.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/schemas/slides.json)","tokens":300,"sizeBytes":190},{"name":"tokens.json","path":"skills/kami/references/tokens.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/tokens.json","title":"References Skill","category":"anthropic-skill","format":"json","content":"# References Skill\n\nPath: `skills/kami/references/tokens.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/tokens.json)","tokens":300,"sizeBytes":177},{"name":"writing.md","path":"skills/kami/references/writing.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/writing.md","title":"References Skill","category":"anthropic-skill","format":"markdown","content":"# References Skill\n\nPath: `skills/kami/references/writing.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/references/writing.md)","tokens":300,"sizeBytes":175},{"name":"package-lock.json","path":"skills/kami/scripts/mathjax-runtime/package-lock.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/scripts/mathjax-runtime/package-lock.json","title":"Mathjax-runtime Skill","category":"anthropic-skill","format":"json","content":"# Mathjax-runtime Skill\n\nPath: `skills/kami/scripts/mathjax-runtime/package-lock.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/scripts/mathjax-runtime/package-lock.json)","tokens":300,"sizeBytes":220},{"name":"package.json","path":"skills/kami/scripts/mathjax-runtime/package.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/scripts/mathjax-runtime/package.json","title":"Mathjax-runtime Skill","category":"anthropic-skill","format":"json","content":"# Mathjax-runtime Skill\n\nPath: `skills/kami/scripts/mathjax-runtime/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/scripts/mathjax-runtime/package.json)","tokens":300,"sizeBytes":210},{"name":"package.json","path":"skills/kami/scripts/package.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/scripts/package.json","title":"Scripts Skill","category":"anthropic-skill","format":"json","content":"# Scripts Skill\n\nPath: `skills/kami/scripts/package.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/scripts/package.json)","tokens":300,"sizeBytes":170},{"name":"SKILL.md","path":"skills/kami/SKILL.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/skills/kami/SKILL.md","title":"kami","category":"anthropic-skill","format":"markdown","content":"---\nname: kami\ndescription: 'Typeset professional documents with Kami templates: resumes, one-pagers, white papers, letters, portfolios, and slide decks. Use when asked to 做 PDF / 排版 / 简历 / 一页纸 / PPT / slides, or to create a Kami landing page. Not for auditing or restyling an existing product site.'\n---\n\n# kami · 紙\n\n**紙 · かみ** means paper in Japanese.\n\nGood content deserves good paper. Use Kami’s templates and layout rules to create documents and landing pages with serif fonts, warm backgrounds, and ink-blue accents.\n\nPart of `Kaku · Waza · Kami` - Kaku writes code, Waza drills habits, **Kami delivers documents**.\n\nCommands and paths below are relative to this skill's directory. Keep the document in the user's working directory and call the scripts from there by their full path (`python3 <skill>/scripts/build.py ...`); relative file arguments resolve from your working directory first.\n\n**Update check (non-blocking).** At the start of a task, run `bash scripts/check-update.sh`. It keeps a local daily marker and, at most once a day, reads Kami's latest published GitHub Release; it uploads no document or task content and stays silent when offline or sandboxed. When it prints a line about a newer Kami, relay it and continue.\n\n**Brand profile.** If `~/.config/kami/brand.md` (or the legacy `~/.kami/brand.md`) exists, read `references/brand-profile.md` and apply it. Precedence: explicit prompt > editorial judgment > habit notes > frontmatter defaults > built-in defaults. The profile fills gaps silently and never overrides the current conversation. When the user names another project as the visual reference, run the style scan in the same file. When they give only a brand website, `python3 scripts/brand_extract.py <url>` drafts a profile; show the draft and use it for this document only after they accept it.\n\n## 1 · Lock the contract\n\nBefore creating or changing an output, lock six things: language, template, output formats, page or length target, visual acceptance, and the verification command. Infer them from the request, then state the contract to the user in one short line in their language (template, length, formats, the figures you plan, any missing material) and continue without waiting. If they push back, adjust.\n\n**Question budget.** Infer first. Ask at most once, in one compact question with at most two parts, and only when two or more of purpose, audience, hard constraints, or success are genuinely unresolvable, or two templates genuinely both fit. Otherwise take the smallest reasonable assumption and report it at the end.\n\nRoute by the artifact's current state:\n\n| Current task | Mode | Contract |\n|---|---|---|\n| New document or substantial restructuring | **New document** | Lock the contract, write `content.json` with `brief` + `content`, then fill and deliver |\n| Text replacement, translation, or factual correction in an existing artifact | **Content-only** | Preserve CSS and layout unless the new copy proves a fit defect |\n| User supplies a render or screenshot and rejects how it looks | **Visual repair** | Treat the render as the brief; follow «Feedback protocol» |\n| Standalone generated illustration, cover, social card, or redraw | **Generated asset** | Lock the semantic brief before pixels (`references/diagrams.md` section 11); preserve accepted parts across iterations |\n\nUse the nearest existing template and check. Do not add a template, shared CSS layer, dependency, script flag, or optional mode unless the request cannot be met without it.\n\n### Language\n\n| User language | HTML templates | Slides (PDF default) | Slides (PPTX, only when an editable deck is requested) | Slides (Marp) |\n|---|---|---|---|---|\n| Chinese (primary) | `*.html` | `slides-weasy.html` | `slides.py` | `slides-marp.md` |\n| English | `*-en.html` | `slides-weasy-en.html` | `slides-en.py` | `slides-marp-en.md` |\n| Japanese (best-effort) | `*.html`, JP Mincho first | `slides-weasy.html` | `slides.py` | `slides-marp.md` |\n| Korean | `*-ko.html` | `slides-weasy-ko.html` | `slides-en.py` only if PPTX is required | `slides-marp.md` |\n| Other (best-effort) | CJK or EN path by script coverage | `slides-weasy.html` or `-en` | `slides.py` / `slides-en.py` | `slides-marp.md` or `-en` |\n\nJapanese, Korean, and other languages need a visual pass on the page images before shipping. Reference docs are shared English specs.\n\n### Document type\n\n| User says | Document | CN template | EN template | KO template |\n|---|---|---|---|---|\n| \"one-pager / 方案 / 执行摘要 / exec summary\" | One-Pager | `one-pager.html` | `one-pager-en.html` | `one-pager-ko.html` |\n| \"white paper / 白皮书 / 长文 / 年度总结 / technical report\" | Long Doc | `long-doc.html` | `long-doc-en.html` | `long-doc-ko.html` |\n| \"formal letter / 信件 / 辞职信 / 推荐信 / memo\" | Letter | `letter.html` | `letter-en.html` | `letter-ko.html` |\n| \"portfolio / 作品集 / case studies\" | Portfolio | `portfolio.html` | `portfolio-en.html` | `portfolio-ko.html` |\n| \"resume / CV / 简历 / 履歴書\" | Resume | `resume.html` | `resume-en.html` | `resume-ko.html` |\n| \"slides / PPT / deck / 演示\" | Slides | `slides-weasy.html` | `slides-weasy-en.html` | `slides-weasy-ko.html` |\n| \"个股研报 / equity report / 估值分析 / investment memo / 股票分析\" | Equity Report | `equity-report.html` | `equity-report-en.html` | `equity-report-ko.html` |\n| \"更新日志 / changelog / release notes / 版本记录\" | Changelog | `changelog.html` | `changelog-en.html` | `changelog-ko.html` |\n| \"landing page / 落地页 / 官网 / product page / 产品页\" | Landing Page | `landing-page.html` | `landing-page-en.html` | `landing-page-ko.html` |\n\nWhen two cells both fit, decide from the signals before asking:\n\n| Signal | Document |\n|---|---|\n| 1 page for investors, recruiters, or an executive summary | one-pager |\n| 1 page of formal correspondence (sales, hiring, resignation, memo) | letter |\n| Exactly 2 pages of career narrative with project bullets | resume |\n| 3-6 visual-heavy pages showcasing projects | portfolio |\n| 6-15 pages of sustained argument, low visual density | long-doc |\n| Presentation flow, one assertion per slide | slides |\n| Metrics dashboard plus thesis plus price or risk view | equity-report |\n| Version-by-version release facts | changelog |\n| Product showcase, pricing, screenshots, FAQ for a browser | landing-page |\n\nAsk only in cases like \"1.5 pages of career story, heavy visuals\" (resume or portfolio?) or \"2 pages of exec summary with metric tiles\" (one-pager or equity-report?).\n\n- **Changelog vs. release notes**: the changelog template is a styled document. GitHub release notes are a separate deliverable; use `/write`.\n- **Landing page**: screen-first HTML, no PDF. Fill the `{{PLACEHOLDER}}` values and comment blocks and save a ready-to-serve file. The accent follows the product: use its own main color, ask the user to pick when it has none, and keep ink-blue only as the fallback (`references/design.md` Section 11 «Accent on a product site»). Companion files (`landing-page-*.example`) and the production site mode (docs, help, releases, legal pages, or more than two locales) live in `references/design.md` Section 11. Keep project-specific release artifacts, payment providers, appcast rules, and private local paths out of Kami.\n- **Diagrams inside a document** come from `assets/diagrams/` (eighteen types), not a template. `references/diagrams.md` section 1 picks the type; extract the `<svg>` block into a `<figure>`. The same file owns architecture boards, diagrams maintained in the user's repo, and generated raster illustrations.\n- **Charts from data** (pick and embed them without asking) are generated, never drawn by hand: write the numbers as a spec and run `python3 scripts/build.py --chart spec.json -o chart.svg` (`references/diagrams.md` section 9).\n- **Slides**: read `references/deck-preflight.md` before drafting.\n\n## 2 · Sources, materials, and content\n\n**Source check.** When the document names a company, product, person, release date, version, funding round, metric, market fact, or technical spec, work from primary sources, note source and date for the facts that drive it, and ask when sources conflict (`references/writing.md` «5. Sources before phrasing»). Skip it for personal drafts where the user supplied everything.\n\n**Material check.** A branded subject needs what makes it recognizable: logo, product image or current UI screenshot, and brand colors when the document is branded (`references/writing.md` «6. Materials serve recognition»). When the request names no logo but the brand profile has one, fill the commented `.brand-logo` slot in `one-pager` / `portfolio` / `slides-weasy` (expand `~` to an absolute path; leave the slot commented if the file is missing). An explicit logo in the current request always wins.\n\n**Gap report.** Everything the template needs that the input lacks, missing facts and missing materials alike, goes into one compact table shown once, with one question only when a missing item would change the deliverable. Inside the document, mark a gap as `[DATA NEEDED: what]`. Never fill a gap with a guess, a stock image, an approximated logo, or an invented value.\n\n**Distill.** Unless the content already maps one-to-one onto the template sections or the user said to use it as-is, distill it. Every factual claim, number, date, name, source, and material reference from the input must land in a template section or in the gap report.\n\n**Content IR (new documents).** Write the distilled content and the locked contract to `content.json` next to the working HTML before filling. Read `references/schemas/<type>.json` first: its `$comment` notes carry the per-field quality bar. The envelope is strict: only `type`, `lang` (`cn`, `en`, `ko`, `zh-TW`, ...), `brief`, and `content`.\n\n```json\n{\n  \"type\": \"resume\",\n  \"lang\": \"cn\",\n  \"brief\": {\n    \"audience\": \"Hiring manager for a senior product role\",\n    \"job\": \"Earn an interview by proving scope and outcomes\",\n    \"template\": \"resume\",\n    \"formats\": [\"html\", \"pdf\"],\n    \"page_target\": 2,\n    \"narrative\": \"Scope first, then evidence, then fit\",\n    \"required_facts\": [\"team size\", \"measured outcomes\"],\n    \"required_assets\": [],\n    \"acceptance_checks\": [\"two pages\", \"all atomic facts survive\"],\n    \"preserve\": [],\n    \"explicit_deviations\": []\n  },\n  \"content\": { ... }\n}\n```\n\n`type` is a schema name in `references/schemas/` (one-pager, letter, resume, long-doc, portfolio, slides, equity-report, changelog, landing-page). For a visual repair, add `target`, `evidence`, and `preserve` to `brief`. Validate before layout with `python3 scripts/build.py --check-content content.json` and fix errors by fixing the content (or asking for the fact), never by loosening structure. Short atomic values (names, metrics, dates, bullets) must survive into the document verbatim; values over 80 characters may be rephrased.\n\n## 3 · Read the right amount\n\nRead the lowest tier that covers the task. The templates already carry every token and component, so a new document does not need the full design spec.\n\n| Task | Read |\n|---|---|\n| Content-only change | `CHEATSHEET.md` |\n| Layout tweak within spec | `CHEATSHEET.md` + the template |\n| New document | the template + `CHEATSHEET.md` + `references/schemas/<type>.json` + the `references/writing.md` sections for that type («Per-document strategies», «Quality bars by document type»); open `references/design.md` only for the component or rule you are about to change |\n| Resume | + `references/resume-writing.md` |\n| Slides, long-doc, portfolio, equity-report, changelog | + `references/writing.md` «Page density» |\n| Slides | + `references/deck-preflight.md` and the `references/design.md` section 8 «Deck Recipe» it points to |\n| Diagram | `references/diagrams.md`; `references/mermaid.md` when the source is Mermaid text |\n| Company, product, market, or branded subject | `references/writing.md` sections 5-6 |\n| Rendering bug, font issue, overflow | `references/production.md` Part 4 (and the design spec if CSS is the cause) |\n| Reviewing an AI-generated draft | `references/anti-patterns.md` |\n\n## 4 · Fill the template\n\n- Copy the template into the working directory; never write HTML from scratch. CSS stays untouched during a content fill. A layout change stays within spec, and a real style change moves `references/design.md` and the sibling templates together, never one file.\n- Meet the quality bar for the type in `references/writing.md` «Quality bars by document type»: a resume bullet needs action, honest scope, and an observable result; an equity report needs variant perception and quantified catalysts; slides need assertion titles. Structure is necessary, not sufficient.\n- Do not invent metrics, financial data, or statistics, and keep any figure you compute from the supplied ones next to its inputs or marked as derived; do not describe stock images as placeholders; do not pad slots (three real projects do not become five). Avoid the patterns in `references/anti-patterns.md`.\n- Tables separate rows with whitespace first and neutral hairlines second; decoration earns its place only by encoding data, state, grouping, or a relationship (`references/design.md` «Table (kami-table)» and «Subtractive rule»).\n- Resume: run the recruiter pass in `references/resume-writing.md` before building.\n- Mathematics is strict LaTeX: author formulas only as inline `\\( ... \\)` or display `\\[ ... \\]` in rendered body text, never as Unicode approximations, ASCII fractions, screenshots, or raw TeX on the page. `--deliver` renders them to MathJax SVG in place; it needs Node.js 20 or 22+ and `bash scripts/ensure_mathjax.sh` once.\n- Code blocks with `class=\"language-*\"` are highlighted when optional `Pygments` is installed; without it they render monochrome.\n\nFill the four metadata placeholders in `<head>`; WeasyPrint writes them into the PDF:\n\n| CN | EN | Rule |\n|---|---|---|\n| `{{作者}}` | `{{AUTHOR}}` | Resume, letter, portfolio: the person's name from the document. Others: leave it, the build infers it from `git config user.name`, then `KAMI_AUTHOR` |\n| `{{摘要}}` | `{{DESCRIPTION}}` | One sentence (≤150 chars) from the first two paragraphs |\n| `{{关键词}}` | `{{KEYWORDS}}` | 3-5 keywords from the title and section headings |\n| `{{文档标题}}` etc. | `{{DOC_TITLE}}` etc. | From the H1 or `.header .title` |\n\nKeep `<meta name=\"generator\" content=\"Kami\">` as is.\n\n**Output formats.** Do not ask; decide from context. Any document: HTML + PDF (PDF is the deliverable, HTML the source). Slides: HTML + PDF, plus PPTX only when an editable deck is requested. \"分享 / 发朋友圈 / share / post / preview\": add PNG. \"嵌入 / 插图 / embed in another doc\": PNG only. Landing page: the static HTML file. Word or `.docx` for long-doc, proposal, or equity-report: the PDF plus a DOCX through `references/production.md` Part 5. An explicit format request overrides all of this.\n\n## 5 · Deliver\n\nOne command finishes a document. Run it from the document's directory, fix every `ERROR`, and re-run until it reports `READY`:\n\n```bash\npython3 scripts/build.py --deliver filled.html content.json\n```\n\nIt checks the HTML (placeholders, strict math rendered in place, Markdown residue, generated charts against their data, template style, content coverage), renders the PDF next to it, then checks the PDF (page contract, resume balance, the font that actually drew CJK text, residue, density, orphans) and exports page images. `WARN` lines point at where to look, not at failures. `GAP` lines are the `[DATA NEEDED]` markers you must report.\n\nThen do the part no script can: open every page image and walk the printed checklist. One hit means a whole-document sweep for that class of issue. Fix the three most visible defects per round, re-run `--deliver`, and stop after three rounds; list what is still wrong rather than looping. If the host cannot view images, send the image paths and the checklist to the user instead of skipping the pass. A missing CJK serif shows no fallback boxes, only a heavier, flatter page, which is why the font gate exists; never call a CJK document visually verified without it.\n\nOther surfaces:\n\n- **Landing pages and any browser surface**: `--deliver` checks the HTML only. Screenshot the responsive matrix in every shipped locale before calling it done (`references/design.md` «Responsive screenshot verification»); do not wait for the user to ask about mobile.\n- **Editable PPTX**: `python3 scripts/build.py --verify slides` (or `slides-en`) and `--check-rhythm`.\n- **Missing dependencies or fonts**: `python3 scripts/build.py --doctor` reports what is installed; `bash scripts/ensure-fonts.sh` recovers CJK fonts (the commercial TsangerJinKai02 never ships inside the skill package). Render failures and their fixes: `references/production.md` Part 4.\n\n**Fresh review.** After `READY` and the image pass, review once from the contract rather than from your own rationale: reread `brief`, the coverage result, and the page images; check every acceptance item and `preserve` boundary; fix P0/P1 findings, each tied to the page or element that proves it. Use an isolated reviewer when the host has one.\n\n**Definition of done.** The closing message gives:\n\n1. The path of every deliverable, in every promised format.\n2. The `--deliver` verdict and page count against the contract.\n3. Every `[DATA NEEDED]` gap and every assumption you made, listed.\n4. The visual verdict stated honestly: when page images could not be inspected, say \"build verified, visuals unconfirmed\", not \"done\".\n\n## Feedback protocol\n\nWhen the user gives visual feedback (\"looks off\", \"太挤了\", \"not elegant\"), inspect the current render before asking them to choose a value. The render is the evidence; the user's negative label is the acceptance signal.\n\n1. Name the concrete defect in one sentence: page or surface, viewport or state, and whether it is density, hierarchy, alignment, type, color, cropping, or text fit.\n2. Lock the repair boundary: `target` is allowed to change; `preserve` names the adjacent pages, sections, content, and shared tokens that must stay stable. Ask only when two plausible targets would produce materially different artifacts.\n3. Make the smallest content, geometry, spacing, typography, crop, or token change that fixes the defect. Never hide a content problem by shrinking type first.\n4. Verify the affected matrix rather than one screenshot:\n   - PDF: target page, neighboring pages, total page count, font result, and every locale or template variant reached by a shared token.\n   - Screen: the breakpoint, tablet, and baseline matrix in `references/design.md` «Responsive screenshot verification»; every shipped locale; affected default, focus/selected, loading, empty/error, and transition states only when the surface has them.\n   - PPTX: editable source plus a rendered PDF or opened-deck inspection.\n   - Generated asset: target slot at its smallest display size plus sibling assets in the same deliverable.\n\nNever say \"I'll adjust the spacing\" without naming the exact property and its new value.\n\n**Escalate after two rounds.** If the same element is still not approved after two adjustment rounds, stop nudging values and produce one comparison artifact: the current state plus 2-3 labeled variants (A/B/C) of the same content in the product's actual frame and background, changing only the compared property. For choices with no objective criterion (typeface, accent color, logo), start there: a specimen sheet of up to 5 labeled half-page blocks with identical title-plus-paragraph content. After the pick, apply it everywhere and rebuild what it touches in the same round.\n\n## When not to use this skill\n\n- The user explicitly wants Material, Fluent, or a Tailwind default: a different design language.\n- Dark, cyberpunk, or futurist aesthetics (this is deliberately anti-future).\n- Saturated multi-color palettes (this has one accent).\n- Cartoon, animation, or illustration style (this is editorial).\n- Dynamic web app UI (this is for print and static documents).\n","frontmatter":{"name":"kami","description":"Typeset professional documents with Kami templates: resumes, one-pagers, white papers, letters, portfolios, and slide decks. Use when asked to 做 PDF / 排版 / 简历 / 一页纸 / PPT / slides, or to create a Kami landing page. Not for auditing or restyling an existing product site."},"isInternal":false,"tokens":4818,"sizeBytes":20158},{"name":"CLAUDE.md","path":"CLAUDE.md","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/CLAUDE.md","title":"Claude Agent Guidelines & System Prompt","category":"claude-rule","format":"markdown","content":"# Kami Agent Guide\n\n## Project\n\nKami is a document-generation skill and template system: self-contained editorial HTML\ntemplates rendered to PDF / PPTX / PNG, plus reference specs, demo assets, and a\npackaged skill archive. `SKILL.md` is the runtime manual for producing a document.\nThis file is the maintenance guide for changing the repository itself, and it records\nthe traps that a fresh read of the code does not reveal.\n\n## Layout\n\nOne repository, three top-level roles, and the install tools only ever copy the first:\n\n- `skills/kami/` is the skill and the only thing users install: `SKILL.md`,\n  `CHEATSHEET.md`, `VERSION`, `LICENSE`, `references/`, `scripts/`, and the light\n  `assets/` (templates, diagrams, logo, the two small font files). `npx skills add\n  tw93/kami` copies exactly this directory; `bash scripts/package-skill.sh` zips it\n  as `kami/` for Claude Desktop; `plugins/kami/skills/kami/` is a generated copy of it\n  inside the Claude and Codex plugin. Ignored render output lives in\n  `skills/kami/assets/examples/`. Every skill-relative path in `SKILL.md`\n  resolves inside this directory, so nothing here may reach up into the repo.\n- `site/` is kami.tw93.fun. The Vercel project's Root Directory is `site` (project\n  setting, not a file), so only this tree deploys and `site/vercel.json` is the only\n  Vercel config. It carries the pages, `styles.css`, `llms.txt`, `robots.txt`,\n  `sitemap.xml`, `vercel.json`, `.well-known/`, `feeds/`, and the heavy showcase and\n  demo assets. Skill facts it shows (`SKILL.md`, the discovery files) are generated\n  into it, never hand-copied. `/SKILL.md` and `/kami-skill.md` send\n  `X-Robots-Tag: noindex`: agents can still fetch the markdown, and search\n  engines should not score that file as an HTML page.\n- The root holds repository tooling only: `scripts/` (`build_metadata.py`,\n  `package-skill.sh`, `release_gate.py`, `draft-release-notes.py`, `tests/`),\n  `assets/fonts/` (the commercial TTFs; run `bash skills/kami/scripts/ensure-fonts.sh`\n  once after cloning to copy them into the skill's ignored `assets/fonts/`, otherwise\n  templates fall back to jsDelivr), `evals/` (the end-to-end skill eval suite, see\n  Evals below), `docs/`, and `.github/`.\n\nRun skill-side commands from `skills/kami/` (`cd skills/kami && python3\nscripts/build.py --check`); the paths below are written from that directory unless\nthey start with `scripts/build_metadata.py`, `scripts/package-skill.sh`,\n`scripts/release_gate.py`, or `scripts/tests/`, which live at the root. Paths under\n`site/`, `plugins/`, `docs/`, `.github/`, `.claude-plugin/`, and `.agents/` are also\nrelative to the repository root.\n\n## Repository Map\n\nOnly the entries whose role is not obvious from the filename:\n\n- `SKILL.md` - skill routing plus the document-side build and verify commands.\n  `CHEATSHEET.md` - quick design reference. Both ship inside the package.\n- `references/design.md`, `writing.md`, `production.md`, `diagrams.md` - full specs.\n  `production.md` Part 4 is the single source of truth for render failures, their\n  verified causes, and their fixes; add pitfalls there, not here.\n  `docs/release.md` - release notes, release flow, demo screenshot regeneration.\n  `anti-patterns.md`, `resume-writing.md`, `mermaid.md`, `deck-preflight.md`,\n  `brand-profile.md` and `brand.example.md` - scoped guides.\n- `references/tokens.json` (color tokens, drift-checked by `scripts/tokens.py`),\n  `references/mermaid-theme.json` (Kami to beautiful-mermaid theme, kept in sync with\n  `tokens.json`), `references/checks_thresholds.json` (rhythm / density / orphan /\n  visual thresholds read by `checks.py` and `visual.py`). These are live inputs to\n  gates: editing a number changes what passes.\n- `references/schemas/` - one JSON Schema subset per document type. The `$comment`\n  fields carry the per-field quality bar distilled from `writing.md`, so schema edits\n  and `writing.md` edits move together.\n- `scripts/shared.py` - the canonical registries (`HTML_TEMPLATES`,\n  `SCREEN_TEMPLATES`, `PPTX_TEMPLATES`, `MARP_TEMPLATES`, `DIAGRAM_TEMPLATES`) and each template's\n  `build_max_pages`. `build.py` derives its internal build targets from them;\n  Marp stays discovery-only because it uses an external CLI. Add or remove a\n  template or diagram here, never in a per-script dict.\n- `scripts/render.py` - the single render entry (`render_pdf`, `build_slides`, PDF\n  metadata stamping). `build.py`, `verify.py`, and `mcp_server.py` all call it; never\n  open a second WeasyPrint call site.\n- `scripts/diagram_geometry.py` checks annotated architecture SVG through the existing\n  lint entry points. Keep geometry in the actual rect/line/polyline attributes,\n  never a second JSON source. Mark node rectangles, edge shafts and label masks;\n  leave boundary frames and arrowheads unmarked. Static mask checks do not replace\n  rendered text-fit and arrowhead inspection.\n- `scripts/deliver.py` - `build.py --deliver`, the one command `SKILL.md` gives an\n  agent to finish a document: every document gate in a fixed order, the render, page\n  images, and a single READY / NOT READY verdict. It owns the order; the individual\n  `--check-*` flags stay for debugging one gate. Template family comes from content IR\n  `type`, else from stylesheet overlap with the registered templates.\n  `deliver(args, result)` also fills a dict with the same outcome for the MCP\n  `kami_deliver` tool; `mcp_server.DELIVER_GATE_RULES` maps every deliver gate to a\n  `kami_check` rule or declares it deliver-only, and `test_mcp` fails on a new gate\n  that is in neither.\n- `scripts/chart.py` - `build.py --chart` / `--check-charts`: data spec to SVG for\n  bar, line, hbar, donut, candlestick, and waterfall. Chart geometry lives only here;\n  each SVG embeds its spec in `data-kami-spec` and the drift gate regenerates and\n  compares the marks. The five chart files in `assets/diagrams/` are its output for\n  their demo data: change a chart's look in `chart.py` and regenerate them, never\n  edit their SVG by hand (`--check` fails on drift).\n- `scripts/brand_extract.py` - drafts a brand profile from a public website (colors,\n  fonts, logo candidates, one contrast-checked accent). It fetches only the page and\n  same-site stylesheets and never writes into `~/.config/kami/`.\n- `scripts/html_visibility.py` - shared static HTML/CSS visibility analysis for\n  `content.py` coverage and `checks.py` residue checks. Keep its conservative\n  coverage and residue modes distinct; it does not implement browser layout.\n- `scripts/tests/test_build.py` - the stable test entry point; sibling `test_*.py`\n  modules group tests by responsibility, with counters and fixtures in `support.py`.\n  `scripts/tests/corpus/<gate>/{flag,pass}/` is the labelled corpus for the PDF\n  gates (orphans, density, resume balance), rendered and judged by `test_corpus.py`.\n  Before changing a value in `checks_thresholds.json`, run it and read the per-gate\n  `CORPUS:` line; a fixture that flips is the cost of the change, not noise.\n- `scripts/mermaid_normalize.py` - re-themes a beautiful-mermaid SVG to the Kami\n  palette and makes it WeasyPrint-safe. Pure Python, no Node, ships in the package.\n- `scripts/mcp_server.py` - zero-dependency MCP stdio server exposing\n  `kami_templates` / `kami_doctor` / `kami_render` / `kami_check` /\n  `kami_deliver` / `kami_screenshot`, so an MCP-capable agent can diagnose, render, and verify\n  without reading `SKILL.md`. Register\n  with `claude mcp add kami -- python3 <checkout>/skills/kami/scripts/mcp_server.py`.\n- `scripts/math_render.py`, `scripts/mathjax_svg.js`, `scripts/ensure_mathjax.sh`,\n  `scripts/mathjax-runtime/` - strict LaTeX to MathJax SVG; `render.py` imports\n  `math_render`. This is the only Node dependency (Node 20 or 22+, refused otherwise),\n  installed on demand by `ensure_mathjax.sh` from the tracked `package-lock.json`;\n  all four ship in the package allowlist.\n- `scripts/site_facts.py` - public-site fact drift checks (install commands, version,\n  template and diagram counts across `site/index*.html`, the root `README.md`,\n  `site/llms.txt`), wired into `build.py --check`; it resolves those files through\n  `shared.REPO_ROOT` / `shared.SITE_ROOT` and skips itself in an installed skill.\n- `scripts/check-update.sh` - quiet daily update check invoked from `SKILL.md`;\n  writes a local cache marker, then resolves the latest published GitHub Release\n  at most once per day. It uploads no user document or task content and stays\n  silent on failure.\n- `site/assets/showcase/` - README and public-site screenshots only.\n  `site/assets/demos/` - README showcase demos. Neither is part of the skill.\n- `assets/diagrams/src/*.mmd` - Mermaid source of the sequence / class / er diagrams.\n  `assets/templates/marp/` - the Markdown-first Marp deck variant.\n- `dist/` is ignored. The release archive is built by `release.yml` from\n  `skills/kami` and uploaded as a release asset; nothing tracks it.\n- `plugins/kami/`, `.claude-plugin/marketplace.json`,\n  `.agents/plugins/marketplace.json`, and the site's discovery files are\n  **generated**; see Generated Mirrors below.\n- Public site surface under `site/`: `index.html` plus `index-zh|en|ja|ko|tw.html`,\n  the English-only prose pages `developers|about|contact|privacy.html`, `styles.css`,\n  `llms.txt`, `robots.txt`, `sitemap.xml`, `vercel.json`. `styles.css` is Kami's own site shell\n  (language switcher, gallery, responsive behavior, `.hero.doc` / `.prose` for the\n  prose pages); generic template rules never belong there.\n- Agent-facing site surface, also under `site/`: `index.md` (Markdown twin of the homepage; `vercel.json`\n  *redirects* `/` here for `Accept: text/markdown` and `/?mode=agent`, because Vercel\n  applies `rewrites` only after the filesystem and `/` always matches `index.html`),\n  `developers|about|contact|privacy.md`, `developers/llms.txt`, and the generated\n  `.well-known/agent-skills/index.json`, `.well-known/mcp/server-card.json`,\n  `feeds/catalog.jsonld`, `schemamap.xml`, `kami-skill.md` (served at `/SKILL.md` through a rewrite; it must not be named `SKILL.md`, or the skills CLI installs the site). Every new prose page needs its `.md` twin,\n  a `rewrites` entry for the extensionless URL, and a `sitemap.xml` row.\n  The `has`-conditioned redirects and the `Link` headers are only observable on a\n  deploy: verify them with `curl -sI` against the preview URL, never locally.\n- `.github/workflows/check.yml` (PR/push CI) and `release.yml` (tag-triggered build\n  and asset upload).\n\nReference docs are English-first and never forked per language. Inline CJK examples\nare fine where the rule itself is about CJK typography (term annotation, punctuation,\nspacing); language-specific output differences (CN/EN/KO) live in templates, not in\nduplicated reference files.\n\n## Commands\n\n`python3 scripts/build.py --help` prints the authoritative flag list and the module\nmap. Read it instead of trusting any copy; hand-maintained lists here have gone stale\nbefore. The commands it does not cover:\n\n```bash\n# from the repository root\npython3 scripts/build_metadata.py            # regenerate plugins/kami, marketplaces, site discovery files\npython3 scripts/build_metadata.py --check    # drift check for the same\nbash scripts/package-skill.sh dist/kami.zip  # build the Claude Desktop archive from skills/kami\npython3 scripts/tests/test_build.py          # full test suite\npython3 scripts/draft-release-notes.py V1.4.0..HEAD --version V1.4.1 --title \"Steadier Hand\"\nclaude plugin eval . --runs 2 --ablation none -j 4 --keep-temp --trust-plugin --no-publish \\\n  --threshold 0 --judge-model sonnet --allow-tools Bash Write Edit   # end-to-end skill evals\npython3 evals/score.py                       # deterministic gates over the newest eval run\n# from skills/kami\nbash scripts/ensure-fonts.sh                 # recover missing or truncated CJK fonts\npython3 scripts/mcp_server.py                # MCP stdio server (render / check / screenshot)\npython3 scripts/mermaid_normalize.py raw.svg -o clean.svg\n```\n\n## Working Rules\n\n- `SKILL.md` is loaded whole on every trigger, so it carries routing, the execution\n  contract, hard prohibitions, `--deliver`, and the feedback protocol, nothing else.\n  Type-specific procedure (page density, resume recruiter pass, landing site mode,\n  charts, illustrations) lives in the reference the tier table already sends the\n  agent to. Before adding a paragraph to `SKILL.md`, name the eval case it fixes;\n  before removing one, run the suite and compare against the last baseline.\n\n- Style changes must update `references/design.md` and the matching template tokens.\n- A CSS snippet in a reference doc is a shipped artifact, not prose: an agent copies\n  it before it reads a template. Every fenced `css` / `html` block is scanned by\n  `--check-docs` (inside `--check`) with the template rule set, and every `var()` it\n  names must resolve to a registered token or one a shipped template defines. Teach\n  from a component a template actually has; a recipe for assembling a new container\n  is how a document ends up carrying three unrelated emphasis languages. Tag a\n  deliberate counter-example inline with `/* avoid */` so the scan reads it as the\n  lesson rather than the violation.\n- A change touching template tokens, shared CSS gestures, or `references/design.md`\n  visual rules must rebuild the affected demo outputs (`site/assets/demos/*.pdf` / `*.png`)\n  in the same change, not as a later cleanup. Demos inline their CSS by copy, so they\n  silently keep the old style otherwise. Report the sweep: rebuilt N demos, K\n  unaffected. The off-palette guard in `scripts/lint.py` scans `site/assets/demos/*.html`\n  for stale hexes as a backstop, but it cannot see rendered PDFs or PNGs.\n  Repository scans must reject an empty expected demo set; installed skills may\n  skip the site because it is outside their distribution boundary. Test both modes\n  with a known violating demo whenever repository paths change.\n- Templates intentionally inline their CSS rather than share a `_kami.css` partial:\n  each template must stay a single self-contained HTML file the user can copy-paste\n  with no build step. Fix CSS drift by applying the same change across the affected\n  templates, never by introducing a build-time include.\n- For document or template tasks, lock the output contract before editing: language,\n  template, output format, page or length target, visual acceptance check, and\n  verification command.\n- Prefer the nearest existing template and deterministic verifier. Do not add a\n  template, shared CSS layer, dependency, script flag, or optional mode unless the\n  current request cannot be satisfied without it. A new template copies the nearest\n  existing one, stays aligned with `references/design.md`, and adds demo coverage; a\n  new document type also needs a schema in `references/schemas/`.\n- Slides default to WeasyPrint HTML-to-PDF templates unless the user explicitly needs\n  editable PPTX output.\n- Mermaid diagrams: never embed raw beautiful-mermaid SVG into a PDF-bound template.\n  WeasyPrint cannot resolve `color-mix()`, render `<foreignObject>`, or fetch a\n  runtime web font, so always pipe through `scripts/mermaid_normalize.py` first\n  (`--check` enforces this). `xychart-beta` is browser-only because it styles through\n  `<style>` class selectors; use the hand-drawn chart diagrams for PDF. Full flow in\n  `references/mermaid.md`.\n- Do not use graphic emoticons in docs, template comments, or script output. Use `OK:`\n  and `ERROR:` for script status text.\n- Do not use em dashes (U+2014) in repository docs, generated documents, template\n  comments, or site copy; use colons, commas, periods, or parentheses. Self-check:\n  `grep -rn \"$(printf '\\342\\200\\224')\" README.md site/llms.txt site/index*.html`. Teaching\n  counter-examples inside `references/anti-patterns.md` are exempt; its rule #28\n  covers the generated-document side.\n- For hosted-site or public-landing work, separate generic template work from Kami's\n  own website first. Generic behavior lives in `assets/templates/landing-page*` and\n  `references/`; Kami site facts live across `site/index*.html`, `site/styles.css`,\n  `README.md`, `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, and\n  `site/vercel.json`. Public facts are wider\n  than the hero: pricing, install path, version, release, support, analytics, FAQ, and\n  positioning claims move together across pages, metadata, AI files, and download\n  links. Do not leave a site-only analytics or tracking change contradicting the\n  \"no analytics\" copy elsewhere.\n- Landing or documentation-site work follows `references/design.md` Section 11 «Landing\n  Page (screen-first)»: its «Documentation site» subsection for the doc shell (sidebar\n  rail, on-this-page TOC, borderless prev/next pager), then the «Responsive\n  screenshot verification» subsection that closes the section (breakpoint, tablet, and baseline screenshots\n  per locale, objective line-widow scan) before shipping.\n- Content changes should avoid CSS churn unless layout behavior is part of the task.\n- Public copy states the product function before design terminology. Write each locale\n  naturally, preserve approved taglines and personal stories, and keep claims identical\n  across HTML, Markdown, metadata, and FAQ JSON-LD. Writing rules and schema comments\n  must not require poetic captions, invented benefits, numeric filler, or rewrite quotas.\n  Distinguish local document processing from update checks, remote assets, and the AI\n  provider’s data handling.\n- Brand profile support is optional context. Keep public examples in `references/`; do\n  not hard-code a maintainer's private local profile.\n- Demo, reference-example, and handoff content distilled from a maintainer's private\n  documents (resume, business proposal, pricing, client names) must be de-identified\n  before it lands in the repo: swap in public figures, public projects, or invented\n  generic data. Job-search, quote, and engagement-period fields count as sensitive\n  even without names. List the swapped-out identifying signals in the handoff report;\n  do not rely on the maintainer to spot leftovers.\n- Do not commit one-off review reports or diagnostic snapshots as durable docs.\n  Extract the stable rule into `AGENTS.md`, `SKILL.md`, or `references/`, then discard\n  the report.\n\n## Issue And PR Maintenance\n\n- Use official GitHub API or CLI for issue and PR work. Read the complete discussion,\n  associated PRs, current source, and relevant tests before deciding what to change.\n- Before each modification, check related local and live remote commits, branches,\n  worktrees, accessible existing agent conversations, and the project inventory.\n  Report the deduplication evidence and current owner before starting implementation.\n- Validate an existing fix rather than implementing it again. When another conversation\n  owns work in progress, leave implementation with that owner and report its verified\n  identifier and status. Do not modify another conversation's uncommitted work.\n- State access and inventory coverage gaps explicitly. A missing search result is not\n  evidence that nobody owns the work; do not bypass reading restrictions.\n- Perform development, builds, and tests in the user's local Mac checkout and\n  branch. Do not default to creating a new PR, opening a cloud execution environment,\n  or manually triggering remote CI. Preserve existing PRs and existing push-triggered\n  CI; do not disable or reconfigure them. Pushes may continue under applicable\n  specific authorization. Preserve the current branch while branch selection is\n  unclear; do not switch or merge into main based on this workflow preference.\n- Preserve the current checkout and user changes. Implement repairs on a separate\n  branch or worktree, locate the cause before targeted tests, and avoid concurrent\n  heavy builds. Never clean real user data to test a repair.\n- Close a duplicate, verified resolved item, or clearly unrelated report only when the\n  evidence and applicable user authorization support closure. Keep unresolved or\n  uncertain reports open; an empty queue is not a correctness goal.\n- Before implementing any change to a user interface, visual effect, interaction,\n  user-facing parameter, or configuration default, present the concrete change to\n  the user and obtain explicit confirmation. General repair or push authorization\n  does not replace this confirmation. Include the issue, original behavior, proposed\n  change, necessity, and alternatives. Pause and isolate any such unapproved work\n  already in progress; do not submit or ship it. Report any already pushed changes\n  accurately and do not roll them back without authorization. Internal repairs that\n  do not change user behavior may continue under their applicable authorization.\n- Confirm applicable authorization separately for commits, pushes, merges, and\n  releases. Distinguish code fixed, tests passed, committed, released, and user retested.\n- Keep reusable project guidance in this repository. Follow the existing rule above\n  for one-off reports and diagnostics; do not mix temporary run status, private paths,\n  personal information, or conversation identifiers into public maintenance guidance.\n- If there are no open issues or PRs, report the verified result without inventing\n  code changes or unnecessary repair branches.\n\n## Generated Mirrors\n\n`plugins/kami/skills/kami/` mirrors the distributable files from `skills/kami/`;\nthe two plugin manifests live in the outer `plugins/kami/` directory. The generated\ncopy excludes local fonts, render output, and caches. `.claude-plugin/marketplace.json`\nand `.agents/plugins/marketplace.json`\npoint at it. Edit `skills/kami/` only and let `python3 scripts/build_metadata.py\n--check` catch drift. Regenerate after any change under `skills/kami/`.\n\nThe same generator owns the site's machine-readable files under `site/`:\n`.well-known/agent-skills/index.json` (carries a SHA-256 digest of `SKILL.md`, so any\nskill edit changes it), `.well-known/mcp/server-card.json` (version plus the tool list\nparsed out of `scripts/mcp_server.py` without importing it), `feeds/catalog.jsonld`\n(built from `HTML_TEMPLATES` / `DIAGRAM_TEMPLATES`), `schemamap.xml`, and\n`kami-skill.md` (the copy served at `/SKILL.md`). Never hand-edit these; change the source and\nregenerate.\n\nMarketplace, plugin path, version, or install-path changes need runtime installation\nproof, not metadata proof. Claude Code: an isolated `HOME=/tmp/...` smoke with\n`claude plugin marketplace add <path>`, `claude plugin install kami@kami`,\n`claude plugin details kami@kami`, confirming the installed cache is the lightweight\n`plugins/kami` tree. Codex: an isolated `CODEX_HOME=/tmp/...` smoke with\n`codex plugin marketplace add <path>`, `codex plugin add kami@kami`,\n`codex plugin list`.\n\n## Refactor And Packaging Hard Stops\n\n- The shipped archive must be the output of `bash scripts/package-skill.sh`: a\n  top-level `kami/` directory under a 6 MB ceiling. A hand-zipped checkout is\n  rejected on size.\n- `scripts/package-skill.sh` packages `git ls-files skills/kami`, so an untracked new\n  module passes every local import and silently disappears from the archive. When\n  adding a runtime module, confirm it is tracked by Git before calling the change done.\n- The archive is not tracked. `release.yml` builds it from the tagged commit and\n  uploads it, so a fix reaches `npx skills add` and plugin installs on the next `main`\n  push but reaches Claude Desktop users only at the next release; name the channel\n  that actually carries the fix before saying \"fixed, please update\".\n- A versioned release must come from a commit reachable from `origin/main` with a\n  successful exact-SHA `check.yml` run triggered by a `main` push. Published\n  same-version assets are immutable in practice: a rerun may reuse `kami.zip` only\n  when its entry names and payloads are identical, otherwise cut a new patch version.\n- If `python3 scripts/build.py --verify` fails only because the host Python lacks PPTX\n  fallback dependencies such as `python-pptx`, verify `slides` and `slides-en` from a\n  temporary venv instead of treating the environment miss as a source regression.\n- Resume templates (`assets/templates/resume.html`, `resume-en.html`, `resume-ko.html`) carry a two-page\n  contract. Do not fix overflow by shrinking type or spacing globally first. Verify\n  with `python3 scripts/build.py --verify resume`, `--verify resume-en`, and `--verify resume-ko`.\n- Demo files such as `site/assets/demos/demo-resume-ko.html` own demo content, not the\n  template contract. Durable rules go into templates or `references/`.\n\n## CI Gotchas\n\nApplies when editing `.github/workflows/*.yml` or adding a test with a heavy\ndependency.\n\n- `check.yml` has two jobs. `lint-and-test` runs dependency-light lint, metadata,\n  and package gates. `verify-render` installs `weasyprint` / `pypdf` / `PyMuPDF` /\n  `Pygments` / `python-pptx`, sets up Node 22 and runs `bash scripts/ensure_mathjax.sh`, then\n  installs the checkout with `npx skills add` under a throwaway `HOME` and asserts\n  the bare install is the kami skill alone (`SKILL.md` and `scripts/build.py`\n  present, no `index.html`, no `site/`, no `TsangerJinKai02-W04.ttf`, unpacked tree\n  under 6000 KB, a separate ceiling from the 6 MB ZIP limit under Refactor And\n  Packaging Hard Stops), which is why a layout or size regression surfaces under a\n  job named `render and verify`. It then runs the full test suite before template\n  verification, including the three unlimited-page long-doc targets for rendered\n  TOC counters. Tests that need an optional render dependency use the suite's\n  explicit `SKIP:` counter and fail when a CI-required dependency is unavailable;\n  never turn a skip into `OK:`.\n- CI installs its Python dependencies and the skills CLI unpinned on purpose: users\n  install the same unpinned way, so an upstream release that breaks Kami should turn\n  CI red before it reaches them.\n- Validate workflow edits with the CI run for the exact pushed commit on the authorized\n  branch; do not create a feature branch solely for validation. A local pass does not\n  prove CI font or dependency availability: check cache manifests, Ubuntu fallback\n  fonts (DejaVu / Liberation), and the absence of commercial fonts (Charter / TsangerJinKai02).\n- Host-versus-CI differences are expressed as explicit opt-in env vars, currently\n  `KAMI_ALLOW_FALLBACK_ONLY` (accept fallback fonts), `KAMI_AUTHOR`, `KAMI_FONT_DIR`,\n  `KAMI_PACKAGE_ROOT_NAME`, `KAMI_PACKAGE_MAX_BYTES`, and `KAMI_UPDATE_URL`. That is\n  already the ceiling: before adding another, move the behavior into a `--ci-mode`\n  flag or a config file rather than letting `KAMI_*` sprawl.\n\n## Current Risk Areas\n\n- WeasyPrint rendering is sensitive to font availability, solid hex tag backgrounds,\n  page breaks, CJK fallback, and synthetic bold. Verify visually for template changes.\n- Slide output has three paths: `slides-weasy*.html` for default PDF decks,\n  `slides*.py` for the editable PPTX fallback, and\n  `assets/templates/marp/slides-marp*.{md,css}` for Markdown-first Marp decks.\n- Marp theme CSS inlines a full copy of the design tokens because Marp themes must be\n  self-contained. `build.py --sync` / `--check` token-sync those files and the CSS\n  lint rules scan them (both walk `shared.iter_template_files`), so token drift is\n  caught. The remaining hole: the off-palette hex guard globs `*.html` only\n  (`TEMPLATES/*.html` and `site/assets/demos/*.html`), so an off-palette color in Marp CSS\n  still needs eyeball review.\n- Resume targets require exactly two pages in all three language variants. Other\n  `build_max_pages` values in `scripts/shared.py` are ceilings (one-pager 1, letter 1,\n  changelog 2, equity-report 3; long-doc, portfolio, and slides-weasy are `0` =\n  unlimited). Other undershooting documents are not flagged, so \"this long-doc came out\n  at 3 pages\" is an authoring judgment call, not a gate failure. Landing pages are\n  browser-only HTML with no page count at all.\n- `scripts/render.py` sets PDF `/Author` from `git config user.name` or `KAMI_AUTHOR`\n  only when the template still holds an author placeholder. `/Producer` and `/Creator`\n  stay `Kami`.\n- Long-doc TOCs use WeasyPrint `target-counter()` and stable chapter ids for rendered\n  page numbers; do not reintroduce hand-written `.toc-page` spans. The row anchor must\n  stay `display: block` with the numeral floated right: WeasyPrint 70.0 resolves\n  `target-counter` to 0 on a flex anchor, and a `0` is valid-looking text that only the\n  `--verify` link cross-check catches (production.md pitfall 24). Running headers\n  default to `h1`. If a filled document does not use `h1` for chapter titles, add\n  `.running-title` to the element that should drive the header.\n- AI and public visibility spans `site/index*.html`, `site/llms.txt`, `site/robots.txt`,\n  `site/sitemap.xml`, FAQ JSON-LD, README install text, diagram counts, and release archive\n  links. Diagram count and names must stay aligned across `SKILL.md`, `CHEATSHEET.md`,\n  `README.md`, `index*.html`, and `assets/diagrams/`.\n\n## Critical Line-Break Scan\n\nApplies before handing off any user-visible typeset deliverable (rendered PDF,\n`README.md`, public site page).\n\n- Scan page by page for three wrap candidates: a trailing line of only 1-2 words\n  (orphan), a line one word away from wrapping, and a line that wraps early without\n  filling its container. Confirm each in rendered context; an intentional short line\n  is valid and does not need rewriting to make the count zero.\n- Split the work: `python3 scripts/build.py --check-orphans <pdf>` and\n  `--check-density <pdf>` catch PDF orphans and sparse pages deterministically; the\n  manual pass covers what they cannot see, near-wrap and premature-wrap states inside\n  a page, plus non-PDF surfaces (README and the responsive matrix in `references/design.md`).\n- One confirmed defect means a whole-document sweep for that class, not a single-spot fix. Check container geometry and forced breaks before shortening copy; preserve\n  facts and approved wording. Do not shrink type to dodge a wrap; deliberate layout\n  changes must re-pass `python3 scripts/build.py --check` and the page-count\n  contract.\n\n## Evals\n\n`evals/<case>/` holds end-to-end cases for `claude plugin eval`: a realistic request\nwith invented data (`prompt.md`), and graders for skill trigger, PDF (or HTML)\ncreation, and unfilled placeholders, plus fact fidelity in the HTML. Fact fidelity is\na `regex` grader wherever the facts are literal (one-pager-en, resume-cn): LLM judges\nsplit on derived figures and reported false FAILs on outputs whose facts were all\npresent. Keep an LLM judge only for what a pattern cannot read (Korean-only text,\nassertion titles, arithmetic). `evals/score.py` then applies Kami's own gates to each\nkept run workspace (page contract, atomic facts in the PDF text, fonts, density,\nresidue, style, resume balance, generated chart count), which the harness cannot run\nitself; it is read-only unless given `--write`, which saves `gate-scores.json`. One\nsuite run is 9 cases, 18 document builds at `--runs 2`, at roughly $1-3 each.\n\n- Run it after any change to `SKILL.md`, a reference the tier table routes to, a\n  template, or a gate an agent relies on, and compare against the previous run on the\n  same cases; one run per case is noise, use `--runs 2` or more.\n- The harness reads the plugin from `plugins/kami` live. Never run\n  `scripts/build_metadata.py` while a suite is running, and regenerate it before a run\n  so the suite tests the current skill.\n- A file grader takes an exact path; globs such as `*.html` fail with \"path does not\n  exist\". Every prompt pins its output file names for that reason.\n- Kept workspaces live under `/private/tmp/e-*/sealed/home/cwd` with mode 000;\n  `score.py` opens them itself. Results stay in the ignored `evals/results/`.\n- Mathematics is not covered: the sandbox cannot install the MathJax runtime.\n- LLM fidelity rubrics carry the case's full brief, because a judge that sees only a\n  partial fact list fails supplied facts as invented. On artifacts over about 15k\n  characters the harness judge is unreliable: before treating its FAIL as real,\n  re-judge the stored `evidence` HTML with the same rubric (`claude -p --model sonnet`)\n  and read the stated reason. In the 2026-10-15 baseline that split four failing cases\n  into two noisy votes and two real unlabelled derived figures.\n- resume-cn deliberately supplies thin notes (three employers, eight bullets). The\n  expected behavior is two honest pages with `[DATA NEEDED]` gaps and a reported\n  balance shortfall (`references/resume-writing.md` «Thin source»). `--deliver` and\n  `score.py` both read that through `checks.resume_thin_source` and treat it as a\n  reported gap rather than a balance failure.\n\n## Verification\n\n`SKILL.md` «5 · Deliver» owns the document side: `build.py --deliver` runs every\ndocument gate (placeholders, math, residue, style, content coverage, render, page\ncontract, resume balance, fonts, density, orphans, page images) in order and ends\nin one verdict. This section covers the maintenance side only.\n\n- Template or CSS changes: `python3 scripts/build.py --check` (CSS lint, token sync,\n  base/variant cross-template `:root` consistency, currently CN to EN and CN to KO)\n  plus `--verify` for the affected targets, or full `--verify` when the change is\n  cross-template.\n- Script changes: `python3 scripts/tests/test_build.py` and\n  `python3 scripts/build.py --check`. Run full `--verify` only when the render\n  pipeline itself changed (`render.py`, `verify.py`, WeasyPrint handling).\n- Font-stack changes (any `--serif` / `--mono` / SVG `text` chain): rebuild the\n  examples, then `python3 scripts/build.py --check-fonts assets/examples/*.pdf`. The\n  page-count contract cannot see which family actually drew the text, and a wrong one\n  renders cleanly; this is how the diagram labels were found splitting mid-word across\n  two faces.\n- Demo changes: regenerate the affected demo outputs and confirm page counts stay in\n  range. Font issues: `bash scripts/ensure-fonts.sh`, then rebuild the target.\n- MCP server changes: smoke the stdio protocol end to end (initialize, tools/list, one\n  tools/call per changed tool) through a scripted stdin session, and check that output\n  stays newline-delimited JSON with no stray prints on stdout.\n- Packaging changes: `bash scripts/package-skill.sh dist/kami.zip`, then `unzip -l\n  dist/kami.zip` to inspect for accidental large fonts, cache files, or a missing new\n  helper.\n- Marketplace or plugin changes: `python3 scripts/build_metadata.py --check` plus the\n  isolated install smoke described under Generated Mirrors.\n- Public site or AI visibility changes: check `site/index*.html`, README,\n  `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, JSON-LD, FAQ, install links, and download links\n  together, then serve the page and verify the responsive matrix in\n  `references/design.md` per locale.\n\n## Fonts\n\n`references/production.md` Part 1 «Fonts» owns the full stack: per-language family\nchains, fallbacks, `@font-face` paths, and the recovery flow. Two facts that must not\ndrift out of it:\n\n- `Source Han Serif KR` is the real family name inside the bundled OTFs and must stay\n  in every Korean fallback chain, otherwise fontconfig cannot resolve the\n  `ensure-fonts.sh`-downloaded font by name on an offline Linux skill install.\n- CJK families lead every stack that CJK text can reach, Latin faces trail. A leading\n  Latin serif ends the stack walk for characters it lacks, which sends each ideograph\n  to fontconfig separately and splits words across two faces inside inline SVG\n  (`production.md` pitfall #4.1). The `-en` templates are the deliberate exception:\n  they are Latin documents, so `Charter` stays first there.\n- The commercial TsangerJinKai02 files never ship inside the skill package, so a\n  sandboxed install has no primary CJK serif and falls through the chain. Keep the\n  chain wide (Source Han Serif SC and CN, Noto Serif CJK SC and Noto Serif SC, Songti\n  SC, STSong, SimSun) so it lands on some serif rather than a system sans.\n- `bash scripts/ensure-fonts.sh` downloads into the XDG user font dir\n  (`${XDG_DATA_HOME:-~/.local/share}/fonts/kami`, override with `KAMI_FONT_DIR`),\n  never into the skill's `assets/fonts`, so an installed Claude Desktop skill stays\n  small. Inside a repo checkout it first restores missing or truncated font files from the root\n  `assets/fonts/` into the skill's ignored font directory. It downloads to the user\n  font directory only when usable fonts are still missing. Commercial use of TsangerJinKai02 requires\n  the appropriate license.\n\n## Releasing\n\n`docs/release.md` owns release notes format, the tag and asset flow, and demo\nscreenshot regeneration commands. Read it when cutting or refreshing a release.\n","isInternal":false,"tokens":8886,"sizeBytes":36920},{"name":"marketplace.json","path":".agents/plugins/marketplace.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/.agents/plugins/marketplace.json","title":"kami","category":"marketplace","format":"json","content":"{\n  \"name\": \"kami\",\n  \"interface\": {\n    \"displayName\": \"Kami\"\n  },\n  \"plugins\": [\n    {\n      \"name\": \"kami\",\n      \"source\": {\n        \"source\": \"local\",\n        \"path\": \"./plugins/kami\"\n      },\n      \"policy\": {\n        \"installation\": \"AVAILABLE\",\n        \"authentication\": \"ON_INSTALL\"\n      },\n      \"category\": \"Productivity\"\n    }\n  ]\n}\n","frontmatter":{"name":"kami","interface":{"displayName":"Kami"},"plugins":[{"name":"kami","source":{"source":"local","path":"./plugins/kami"},"policy":{"installation":"AVAILABLE","authentication":"ON_INSTALL"},"category":"Productivity"}]},"isInternal":false,"tokens":97,"sizeBytes":346},{"name":"marketplace.json","path":".claude-plugin/marketplace.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/.claude-plugin/marketplace.json","title":"kami","category":"marketplace","format":"json","content":"{\n  \"name\": \"kami\",\n  \"description\": \"Document typesetting skill for Claude Code.\",\n  \"owner\": {\n    \"name\": \"Tw93\",\n    \"email\": \"hitw93@gmail.com\"\n  },\n  \"plugins\": [\n    {\n      \"name\": \"kami\",\n      \"version\": \"1.18.0\",\n      \"description\": \"Typeset professional documents and landing pages with the Kami design system.\",\n      \"category\": \"documents\",\n      \"source\": \"./plugins/kami\",\n      \"homepage\": \"https://github.com/tw93/kami\"\n    }\n  ]\n}\n","frontmatter":{"name":"kami","description":"Document typesetting skill for Claude Code.","owner":{"name":"Tw93","email":"hitw93@gmail.com"},"plugins":[{"name":"kami","version":"1.18.0","description":"Typeset professional documents and landing pages with the Kami design system.","category":"documents","source":"./plugins/kami","homepage":"https://github.com/tw93/kami"}]},"isInternal":false,"tokens":128,"sizeBytes":452},{"name":"plugin.json","path":"plugins/kami/.claude-plugin/plugin.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/.claude-plugin/plugin.json","title":"claude-plugin Plugin Manifest","category":"plugin-manifest","format":"json","content":"# claude-plugin Plugin Manifest\n\nPath: `plugins/kami/.claude-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/.claude-plugin/plugin.json)","tokens":300,"sizeBytes":200},{"name":"plugin.json","path":"plugins/kami/.codex-plugin/plugin.json","rawUrl":"https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/.codex-plugin/plugin.json","title":"codex-plugin Plugin Manifest","category":"plugin-manifest","format":"json","content":"# codex-plugin Plugin Manifest\n\nPath: `plugins/kami/.codex-plugin/plugin.json`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/plugins/kami/.codex-plugin/plugin.json)","tokens":300,"sizeBytes":197}],"systemPromptSnippet":"<yakaai_skills repo=\"tw93/Kami\">\n<!-- File: AGENTS.md (Tokens: ~8886 | Category: root-instruction) -->\n# Kami Agent Guide\n\n## Project\n\nKami is a document-generation skill and template system: self-contained editorial HTML\ntemplates rendered to PDF / PPTX / PNG, plus reference specs, demo assets, and a\npackaged skill archive. `SKILL.md` is the runtime manual for producing a document.\nThis file is the maintenance guide for changing the repository itself, and it records\nthe traps that a fresh read of the code does not reveal.\n\n## Layout\n\nOne repository, three top-level roles, and the install tools only ever copy the first:\n\n- `skills/kami/` is the skill and the only thing users install: `SKILL.md`,\n  `CHEATSHEET.md`, `VERSION`, `LICENSE`, `references/`, `scripts/`, and the light\n  `assets/` (templates, diagrams, logo, the two small font files). `npx skills add\n  tw93/kami` copies exactly this directory; `bash scripts/package-skill.sh` zips it\n  as `kami/` for Claude Desktop; `plugins/kami/skills/kami/` is a generated copy of it\n  inside the Claude and Codex plugin. Ignored render output lives in\n  `skills/kami/assets/examples/`. Every skill-relative path in `SKILL.md`\n  resolves inside this directory, so nothing here may reach up into the repo.\n- `site/` is kami.tw93.fun. The Vercel project's Root Directory is `site` (project\n  setting, not a file), so only this tree deploys and `site/vercel.json` is the only\n  Vercel config. It carries the pages, `styles.css`, `llms.txt`, `robots.txt`,\n  `sitemap.xml`, `vercel.json`, `.well-known/`, `feeds/`, and the heavy showcase and\n  demo assets. Skill facts it shows (`SKILL.md`, the discovery files) are generated\n  into it, never hand-copied. `/SKILL.md` and `/kami-skill.md` send\n  `X-Robots-Tag: noindex`: agents can still fetch the markdown, and search\n  engines should not score that file as an HTML page.\n- The root holds repository tooling only: `scripts/` (`build_metadata.py`,\n  `package-skill.sh`, `release_gate.py`, `draft-release-notes.py`, `tests/`),\n  `assets/fonts/` (the commercial TTFs; run `bash skills/kami/scripts/ensure-fonts.sh`\n  once after cloning to copy them into the skill's ignored `assets/fonts/`, otherwise\n  templates fall back to jsDelivr), `evals/` (the end-to-end skill eval suite, see\n  Evals below), `docs/`, and `.github/`.\n\nRun skill-side commands from `skills/kami/` (`cd skills/kami && python3\nscripts/build.py --check`); the paths below are written from that directory unless\nthey start with `scripts/build_metadata.py`, `scripts/package-skill.sh`,\n`scripts/release_gate.py`, or `scripts/tests/`, which live at the root. Paths under\n`site/`, `plugins/`, `docs/`, `.github/`, `.claude-plugin/`, and `.agents/` are also\nrelative to the repository root.\n\n## Repository Map\n\nOnly the entries whose role is not obvious from the filename:\n\n- `SKILL.md` - skill routing plus the document-side build and verify commands.\n  `CHEATSHEET.md` - quick design reference. Both ship inside the package.\n- `references/design.md`, `writing.md`, `production.md`, `diagrams.md` - full specs.\n  `production.md` Part 4 is the single source of truth for render failures, their\n  verified causes, and their fixes; add pitfalls there, not here.\n  `docs/release.md` - release notes, release flow, demo screenshot regeneration.\n  `anti-patterns.md`, `resume-writing.md`, `mermaid.md`, `deck-preflight.md`,\n  `brand-profile.md` and `brand.example.md` - scoped guides.\n- `references/tokens.json` (color tokens, drift-checked by `scripts/tokens.py`),\n  `references/mermaid-theme.json` (Kami to beautiful-mermaid theme, kept in sync with\n  `tokens.json`), `references/checks_thresholds.json` (rhythm / density / orphan /\n  visual thresholds read by `checks.py` and `visual.py`). These are live inputs to\n  gates: editing a number changes what passes.\n- `references/schemas/` - one JSON Schema subset per document type. The `$comment`\n  fields carry the per-field quality bar distilled from `writing.md`, so schema edits\n  and `writing.md` edits move together.\n- `scripts/shared.py` - the canonical registries (`HTML_TEMPLATES`,\n  `SCREEN_TEMPLATES`, `PPTX_TEMPLATES`, `MARP_TEMPLATES`, `DIAGRAM_TEMPLATES`) and each template's\n  `build_max_pages`. `build.py` derives its internal build targets from them;\n  Marp stays discovery-only because it uses an external CLI. Add or remove a\n  template or diagram here, never in a per-script dict.\n- `scripts/render.py` - the single render entry (`render_pdf`, `build_slides`, PDF\n  metadata stamping). `build.py`, `verify.py`, and `mcp_server.py` all call it; never\n  open a second WeasyPrint call site.\n- `scripts/diagram_geometry.py` checks annotated architecture SVG through the existing\n  lint entry points. Keep geometry in the actual rect/line/polyline attributes,\n  never a second JSON source. Mark node rectangles, edge shafts and label masks;\n  leave boundary frames and arrowheads unmarked. Static mask checks do not replace\n  rendered text-fit and arrowhead inspection.\n- `scripts/deliver.py` - `build.py --deliver`, the one command `SKILL.md` gives an\n  agent to finish a document: every document gate in a fixed order, the render, page\n  images, and a single READY / NOT READY verdict. It owns the order; the individual\n  `--check-*` flags stay for debugging one gate. Template family comes from content IR\n  `type`, else from stylesheet overlap with the registered templates.\n  `deliver(args, result)` also fills a dict with the same outcome for the MCP\n  `kami_deliver` tool; `mcp_server.DELIVER_GATE_RULES` maps every deliver gate to a\n  `kami_check` rule or declares it deliver-only, and `test_mcp` fails on a new gate\n  that is in neither.\n- `scripts/chart.py` - `build.py --chart` / `--check-charts`: data spec to SVG for\n  bar, line, hbar, donut, candlestick, and waterfall. Chart geometry lives only here;\n  each SVG embeds its spec in `data-kami-spec` and the drift gate regenerates and\n  compares the marks. The five chart files in `assets/diagrams/` are its output for\n  their demo data: change a chart's look in `chart.py` and regenerate them, never\n  edit their SVG by hand (`--check` fails on drift).\n- `scripts/brand_extract.py` - drafts a brand profile from a public website (colors,\n  fonts, logo candidates, one contrast-checked accent). It fetches only the page and\n  same-site stylesheets and never writes into `~/.config/kami/`.\n- `scripts/html_visibility.py` - shared static HTML/CSS visibility analysis for\n  `content.py` coverage and `checks.py` residue checks. Keep its conservative\n  coverage and residue modes distinct; it does not implement browser layout.\n- `scripts/tests/test_build.py` - the stable test entry point; sibling `test_*.py`\n  modules group tests by responsibility, with counters and fixtures in `support.py`.\n  `scripts/tests/corpus/<gate>/{flag,pass}/` is the labelled corpus for the PDF\n  gates (orphans, density, resume balance), rendered and judged by `test_corpus.py`.\n  Before changing a value in `checks_thresholds.json`, run it and read the per-gate\n  `CORPUS:` line; a fixture that flips is the cost of the change, not noise.\n- `scripts/mermaid_normalize.py` - re-themes a beautiful-mermaid SVG to the Kami\n  palette and makes it WeasyPrint-safe. Pure Python, no Node, ships in the package.\n- `scripts/mcp_server.py` - zero-dependency MCP stdio server exposing\n  `kami_templates` / `kami_doctor` / `kami_render` / `kami_check` /\n  `kami_deliver` / `kami_screenshot`, so an MCP-capable agent can diagnose, render, and verify\n  without reading `SKILL.md`. Register\n  with `claude mcp add kami -- python3 <checkout>/skills/kami/scripts/mcp_server.py`.\n- `scripts/math_render.py`, `scripts/mathjax_svg.js`, `scripts/ensure_mathjax.sh`,\n  `scripts/mathjax-runtime/` - strict LaTeX to MathJax SVG; `render.py` imports\n  `math_render`. This is the only Node dependency (Node 20 or 22+, refused otherwise),\n  installed on demand by `ensure_mathjax.sh` from the tracked `package-lock.json`;\n  all four ship in the package allowlist.\n- `scripts/site_facts.py` - public-site fact drift checks (install commands, version,\n  template and diagram counts across `site/index*.html`, the root `README.md`,\n  `site/llms.txt`), wired into `build.py --check`; it resolves those files through\n  `shared.REPO_ROOT` / `shared.SITE_ROOT` and skips itself in an installed skill.\n- `scripts/check-update.sh` - quiet daily update check invoked from `SKILL.md`;\n  writes a local cache marker, then resolves the latest published GitHub Release\n  at most once per day. It uploads no user document or task content and stays\n  silent on failure.\n- `site/assets/showcase/` - README and public-site screenshots only.\n  `site/assets/demos/` - README showcase demos. Neither is part of the skill.\n- `assets/diagrams/src/*.mmd` - Mermaid source of the sequence / class / er diagrams.\n  `assets/templates/marp/` - the Markdown-first Marp deck variant.\n- `dist/` is ignored. The release archive is built by `release.yml` from\n  `skills/kami` and uploaded as a release asset; nothing tracks it.\n- `plugins/kami/`, `.claude-plugin/marketplace.json`,\n  `.agents/plugins/marketplace.json`, and the site's discovery files are\n  **generated**; see Generated Mirrors below.\n- Public site surface under `site/`: `index.html` plus `index-zh|en|ja|ko|tw.html`,\n  the English-only prose pages `developers|about|contact|privacy.html`, `styles.css`,\n  `llms.txt`, `robots.txt`, `sitemap.xml`, `vercel.json`. `styles.css` is Kami's own site shell\n  (language switcher, gallery, responsive behavior, `.hero.doc` / `.prose` for the\n  prose pages); generic template rules never belong there.\n- Agent-facing site surface, also under `site/`: `index.md` (Markdown twin of the homepage; `vercel.json`\n  *redirects* `/` here for `Accept: text/markdown` and `/?mode=agent`, because Vercel\n  applies `rewrites` only after the filesystem and `/` always matches `index.html`),\n  `developers|about|contact|privacy.md`, `developers/llms.txt`, and the generated\n  `.well-known/agent-skills/index.json`, `.well-known/mcp/server-card.json`,\n  `feeds/catalog.jsonld`, `schemamap.xml`, `kami-skill.md` (served at `/SKILL.md` through a rewrite; it must not be named `SKILL.md`, or the skills CLI installs the site). Every new prose page needs its `.md` twin,\n  a `rewrites` entry for the extensionless URL, and a `sitemap.xml` row.\n  The `has`-conditioned redirects and the `Link` headers are only observable on a\n  deploy: verify them with `curl -sI` against the preview URL, never locally.\n- `.github/workflows/check.yml` (PR/push CI) and `release.yml` (tag-triggered build\n  and asset upload).\n\nReference docs are English-first and never forked per language. Inline CJK examples\nare fine where the rule itself is about CJK typography (term annotation, punctuation,\nspacing); language-specific output differences (CN/EN/KO) live in templates, not in\nduplicated reference files.\n\n## Commands\n\n`python3 scripts/build.py --help` prints the authoritative flag list and the module\nmap. Read it instead of trusting any copy; hand-maintained lists here have gone stale\nbefore. The commands it does not cover:\n\n```bash\n# from the repository root\npython3 scripts/build_metadata.py            # regenerate plugins/kami, marketplaces, site discovery files\npython3 scripts/build_metadata.py --check    # drift check for the same\nbash scripts/package-skill.sh dist/kami.zip  # build the Claude Desktop archive from skills/kami\npython3 scripts/tests/test_build.py          # full test suite\npython3 scripts/draft-release-notes.py V1.4.0..HEAD --version V1.4.1 --title \"Steadier Hand\"\nclaude plugin eval . --runs 2 --ablation none -j 4 --keep-temp --trust-plugin --no-publish \\\n  --threshold 0 --judge-model sonnet --allow-tools Bash Write Edit   # end-to-end skill evals\npython3 evals/score.py                       # deterministic gates over the newest eval run\n# from skills/kami\nbash scripts/ensure-fonts.sh                 # recover missing or truncated CJK fonts\npython3 scripts/mcp_server.py                # MCP stdio server (render / check / screenshot)\npython3 scripts/mermaid_normalize.py raw.svg -o clean.svg\n```\n\n## Working Rules\n\n- `SKILL.md` is loaded whole on every trigger, so it carries routing, the execution\n  contract, hard prohibitions, `--deliver`, and the feedback protocol, nothing else.\n  Type-specific procedure (page density, resume recruiter pass, landing site mode,\n  charts, illustrations) lives in the reference the tier table already sends the\n  agent to. Before adding a paragraph to `SKILL.md`, name the eval case it fixes;\n  before removing one, run the suite and compare against the last baseline.\n\n- Style changes must update `references/design.md` and the matching template tokens.\n- A CSS snippet in a reference doc is a shipped artifact, not prose: an agent copies\n  it before it reads a template. Every fenced `css` / `html` block is scanned by\n  `--check-docs` (inside `--check`) with the template rule set, and every `var()` it\n  names must resolve to a registered token or one a shipped template defines. Teach\n  from a component a template actually has; a recipe for assembling a new container\n  is how a document ends up carrying three unrelated emphasis languages. Tag a\n  deliberate counter-example inline with `/* avoid */` so the scan reads it as the\n  lesson rather than the violation.\n- A change touching template tokens, shared CSS gestures, or `references/design.md`\n  visual rules must rebuild the affected demo outputs (`site/assets/demos/*.pdf` / `*.png`)\n  in the same change, not as a later cleanup. Demos inline their CSS by copy, so they\n  silently keep the old style otherwise. Report the sweep: rebuilt N demos, K\n  unaffected. The off-palette guard in `scripts/lint.py` scans `site/assets/demos/*.html`\n  for stale hexes as a backstop, but it cannot see rendered PDFs or PNGs.\n  Repository scans must reject an empty expected demo set; installed skills may\n  skip the site because it is outside their distribution boundary. Test both modes\n  with a known violating demo whenever repository paths change.\n- Templates intentionally inline their CSS rather than share a `_kami.css` partial:\n  each template must stay a single self-contained HTML file the user can copy-paste\n  with no build step. Fix CSS drift by applying the same change across the affected\n  templates, never by introducing a build-time include.\n- For document or template tasks, lock the output contract before editing: language,\n  template, output format, page or length target, visual acceptance check, and\n  verification command.\n- Prefer the nearest existing template and deterministic verifier. Do not add a\n  template, shared CSS layer, dependency, script flag, or optional mode unless the\n  current request cannot be satisfied without it. A new template copies the nearest\n  existing one, stays aligned with `references/design.md`, and adds demo coverage; a\n  new document type also needs a schema in `references/schemas/`.\n- Slides default to WeasyPrint HTML-to-PDF templates unless the user explicitly needs\n  editable PPTX output.\n- Mermaid diagrams: never embed raw beautiful-mermaid SVG into a PDF-bound template.\n  WeasyPrint cannot resolve `color-mix()`, render `<foreignObject>`, or fetch a\n  runtime web font, so always pipe through `scripts/mermaid_normalize.py` first\n  (`--check` enforces this). `xychart-beta` is browser-only because it styles through\n  `<style>` class selectors; use the hand-drawn chart diagrams for PDF. Full flow in\n  `references/mermaid.md`.\n- Do not use graphic emoticons in docs, template comments, or script output. Use `OK:`\n  and `ERROR:` for script status text.\n- Do not use em dashes (U+2014) in repository docs, generated documents, template\n  comments, or site copy; use colons, commas, periods, or parentheses. Self-check:\n  `grep -rn \"$(printf '\\342\\200\\224')\" README.md site/llms.txt site/index*.html`. Teaching\n  counter-examples inside `references/anti-patterns.md` are exempt; its rule #28\n  covers the generated-document side.\n- For hosted-site or public-landing work, separate generic template work from Kami's\n  own website first. Generic behavior lives in `assets/templates/landing-page*` and\n  `references/`; Kami site facts live across `site/index*.html`, `site/styles.css`,\n  `README.md`, `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, and\n  `site/vercel.json`. Public facts are wider\n  than the hero: pricing, install path, version, release, support, analytics, FAQ, and\n  positioning claims move together across pages, metadata, AI files, and download\n  links. Do not leave a site-only analytics or tracking change contradicting the\n  \"no analytics\" copy elsewhere.\n- Landing or documentation-site work follows `references/design.md` Section 11 «Landing\n  Page (screen-first)»: its «Documentation site» subsection for the doc shell (sidebar\n  rail, on-this-page TOC, borderless prev/next pager), then the «Responsive\n  screenshot verification» subsection that closes the section (breakpoint, tablet, and baseline screenshots\n  per locale, objective line-widow scan) before shipping.\n- Content changes should avoid CSS churn unless layout behavior is part of the task.\n- Public copy states the product function before design terminology. Write each locale\n  naturally, preserve approved taglines and personal stories, and keep claims identical\n  across HTML, Markdown, metadata, and FAQ JSON-LD. Writing rules and schema comments\n  must not require poetic captions, invented benefits, numeric filler, or rewrite quotas.\n  Distinguish local document processing from update checks, remote assets, and the AI\n  provider’s data handling.\n- Brand profile support is optional context. Keep public examples in `references/`; do\n  not hard-code a maintainer's private local profile.\n- Demo, reference-example, and handoff content distilled from a maintainer's private\n  documents (resume, business proposal, pricing, client names) must be de-identified\n  before it lands in the repo: swap in public figures, public projects, or invented\n  generic data. Job-search, quote, and engagement-period fields count as sensitive\n  even without names. List the swapped-out identifying signals in the handoff report;\n  do not rely on the maintainer to spot leftovers.\n- Do not commit one-off review reports or diagnostic snapshots as durable docs.\n  Extract the stable rule into `AGENTS.md`, `SKILL.md`, or `references/`, then discard\n  the report.\n\n## Issue And PR Maintenance\n\n- Use official GitHub API or CLI for issue and PR work. Read the complete discussion,\n  associated PRs, current source, and relevant tests before deciding what to change.\n- Before each modification, check related local and live remote commits, branches,\n  worktrees, accessible existing agent conversations, and the project inventory.\n  Report the deduplication evidence and current owner before starting implementation.\n- Validate an existing fix rather than implementing it again. When another conversation\n  owns work in progress, leave implementation with that owner and report its verified\n  identifier and status. Do not modify another conversation's uncommitted work.\n- State access and inventory coverage gaps explicitly. A missing search result is not\n  evidence that nobody owns the work; do not bypass reading restrictions.\n- Perform development, builds, and tests in the user's local Mac checkout and\n  branch. Do not default to creating a new PR, opening a cloud execution environment,\n  or manually triggering remote CI. Preserve existing PRs and existing push-triggered\n  CI; do not disable or reconfigure them. Pushes may continue under applicable\n  specific authorization. Preserve the current branch while branch selection is\n  unclear; do not switch or merge into main based on this workflow preference.\n- Preserve the current checkout and user changes. Implement repairs on a separate\n  branch or worktree, locate the cause before targeted tests, and avoid concurrent\n  heavy builds. Never clean real user data to test a repair.\n- Close a duplicate, verified resolved item, or clearly unrelated report only when the\n  evidence and applicable user authorization support closure. Keep unresolved or\n  uncertain reports open; an empty queue is not a correctness goal.\n- Before implementing any change to a user interface, visual effect, interaction,\n  user-facing parameter, or configuration default, present the concrete change to\n  the user and obtain explicit confirmation. General repair or push authorization\n  does not replace this confirmation. Include the issue, original behavior, proposed\n  change, necessity, and alternatives. Pause and isolate any such unapproved work\n  already in progress; do not submit or ship it. Report any already pushed changes\n  accurately and do not roll them back without authorization. Internal repairs that\n  do not change user behavior may continue under their applicable authorization.\n- Confirm applicable authorization separately for commits, pushes, merges, and\n  releases. Distinguish code fixed, tests passed, committed, released, and user retested.\n- Keep reusable project guidance in this repository. Follow the existing rule above\n  for one-off reports and diagnostics; do not mix temporary run status, private paths,\n  personal information, or conversation identifiers into public maintenance guidance.\n- If there are no open issues or PRs, report the verified result without inventing\n  code changes or unnecessary repair branches.\n\n## Generated Mirrors\n\n`plugins/kami/skills/kami/` mirrors the distributable files from `skills/kami/`;\nthe two plugin manifests live in the outer `plugins/kami/` directory. The generated\ncopy excludes local fonts, render output, and caches. `.claude-plugin/marketplace.json`\nand `.agents/plugins/marketplace.json`\npoint at it. Edit `skills/kami/` only and let `python3 scripts/build_metadata.py\n--check` catch drift. Regenerate after any change under `skills/kami/`.\n\nThe same generator owns the site's machine-readable files under `site/`:\n`.well-known/agent-skills/index.json` (carries a SHA-256 digest of `SKILL.md`, so any\nskill edit changes it), `.well-known/mcp/server-card.json` (version plus the tool list\nparsed out of `scripts/mcp_server.py` without importing it), `feeds/catalog.jsonld`\n(built from `HTML_TEMPLATES` / `DIAGRAM_TEMPLATES`), `schemamap.xml`, and\n`kami-skill.md` (the copy served at `/SKILL.md`). Never hand-edit these; change the source and\nregenerate.\n\nMarketplace, plugin path, version, or install-path changes need runtime installation\nproof, not metadata proof. Claude Code: an isolated `HOME=/tmp/...` smoke with\n`claude plugin marketplace add <path>`, `claude plugin install kami@kami`,\n`claude plugin details kami@kami`, confirming the installed cache is the lightweight\n`plugins/kami` tree. Codex: an isolated `CODEX_HOME=/tmp/...` smoke with\n`codex plugin marketplace add <path>`, `codex plugin add kami@kami`,\n`codex plugin list`.\n\n## Refactor And Packaging Hard Stops\n\n- The shipped archive must be the output of `bash scripts/package-skill.sh`: a\n  top-level `kami/` directory under a 6 MB ceiling. A hand-zipped checkout is\n  rejected on size.\n- `scripts/package-skill.sh` packages `git ls-files skills/kami`, so an untracked new\n  module passes every local import and silently disappears from the archive. When\n  adding a runtime module, confirm it is tracked by Git before calling the change done.\n- The archive is not tracked. `release.yml` builds it from the tagged commit and\n  uploads it, so a fix reaches `npx skills add` and plugin installs on the next `main`\n  push but reaches Claude Desktop users only at the next release; name the channel\n  that actually carries the fix before saying \"fixed, please update\".\n- A versioned release must come from a commit reachable from `origin/main` with a\n  successful exact-SHA `check.yml` run triggered by a `main` push. Published\n  same-version assets are immutable in practice: a rerun may reuse `kami.zip` only\n  when its entry names and payloads are identical, otherwise cut a new patch version.\n- If `python3 scripts/build.py --verify` fails only because the host Python lacks PPTX\n  fallback dependencies such as `python-pptx`, verify `slides` and `slides-en` from a\n  temporary venv instead of treating the environment miss as a source regression.\n- Resume templates (`assets/templates/resume.html`, `resume-en.html`, `resume-ko.html`) carry a two-page\n  contract. Do not fix overflow by shrinking type or spacing globally first. Verify\n  with `python3 scripts/build.py --verify resume`, `--verify resume-en`, and `--verify resume-ko`.\n- Demo files such as `site/assets/demos/demo-resume-ko.html` own demo content, not the\n  template contract. Durable rules go into templates or `references/`.\n\n## CI Gotchas\n\nApplies when editing `.github/workflows/*.yml` or adding a test with a heavy\ndependency.\n\n- `check.yml` has two jobs. `lint-and-test` runs dependency-light lint, metadata,\n  and package gates. `verify-render` installs `weasyprint` / `pypdf` / `PyMuPDF` /\n  `Pygments` / `python-pptx`, sets up Node 22 and runs `bash scripts/ensure_mathjax.sh`, then\n  installs the checkout with `npx skills add` under a throwaway `HOME` and asserts\n  the bare install is the kami skill alone (`SKILL.md` and `scripts/build.py`\n  present, no `index.html`, no `site/`, no `TsangerJinKai02-W04.ttf`, unpacked tree\n  under 6000 KB, a separate ceiling from the 6 MB ZIP limit under Refactor And\n  Packaging Hard Stops), which is why a layout or size regression surfaces under a\n  job named `render and verify`. It then runs the full test suite before template\n  verification, including the three unlimited-page long-doc targets for rendered\n  TOC counters. Tests that need an optional render dependency use the suite's\n  explicit `SKIP:` counter and fail when a CI-required dependency is unavailable;\n  never turn a skip into `OK:`.\n- CI installs its Python dependencies and the skills CLI unpinned on purpose: users\n  install the same unpinned way, so an upstream release that breaks Kami should turn\n  CI red before it reaches them.\n- Validate workflow edits with the CI run for the exact pushed commit on the authorized\n  branch; do not create a feature branch solely for validation. A local pass does not\n  prove CI font or dependency availability: check cache manifests, Ubuntu fallback\n  fonts (DejaVu / Liberation), and the absence of commercial fonts (Charter / TsangerJinKai02).\n- Host-versus-CI differences are expressed as explicit opt-in env vars, currently\n  `KAMI_ALLOW_FALLBACK_ONLY` (accept fallback fonts), `KAMI_AUTHOR`, `KAMI_FONT_DIR`,\n  `KAMI_PACKAGE_ROOT_NAME`, `KAMI_PACKAGE_MAX_BYTES`, and `KAMI_UPDATE_URL`. That is\n  already the ceiling: before adding another, move the behavior into a `--ci-mode`\n  flag or a config file rather than letting `KAMI_*` sprawl.\n\n## Current Risk Areas\n\n- WeasyPrint rendering is sensitive to font availability, solid hex tag backgrounds,\n  page breaks, CJK fallback, and synthetic bold. Verify visually for template changes.\n- Slide output has three paths: `slides-weasy*.html` for default PDF decks,\n  `slides*.py` for the editable PPTX fallback, and\n  `assets/templates/marp/slides-marp*.{md,css}` for Markdown-first Marp decks.\n- Marp theme CSS inlines a full copy of the design tokens because Marp themes must be\n  self-contained. `build.py --sync` / `--check` token-sync those files and the CSS\n  lint rules scan them (both walk `shared.iter_template_files`), so token drift is\n  caught. The remaining hole: the off-palette hex guard globs `*.html` only\n  (`TEMPLATES/*.html` and `site/assets/demos/*.html`), so an off-palette color in Marp CSS\n  still needs eyeball review.\n- Resume targets require exactly two pages in all three language variants. Other\n  `build_max_pages` values in `scripts/shared.py` are ceilings (one-pager 1, letter 1,\n  changelog 2, equity-report 3; long-doc, portfolio, and slides-weasy are `0` =\n  unlimited). Other undershooting documents are not flagged, so \"this long-doc came out\n  at 3 pages\" is an authoring judgment call, not a gate failure. Landing pages are\n  browser-only HTML with no page count at all.\n- `scripts/render.py` sets PDF `/Author` from `git config user.name` or `KAMI_AUTHOR`\n  only when the template still holds an author placeholder. `/Producer` and `/Creator`\n  stay `Kami`.\n- Long-doc TOCs use WeasyPrint `target-counter()` and stable chapter ids for rendered\n  page numbers; do not reintroduce hand-written `.toc-page` spans. The row anchor must\n  stay `display: block` with the numeral floated right: WeasyPrint 70.0 resolves\n  `target-counter` to 0 on a flex anchor, and a `0` is valid-looking text that only the\n  `--verify` link cross-check catches (production.md pitfall 24). Running headers\n  default to `h1`. If a filled document does not use `h1` for chapter titles, add\n  `.running-title` to the element that should drive the header.\n- AI and public visibility spans `site/index*.html`, `site/llms.txt`, `site/robots.txt`,\n  `site/sitemap.xml`, FAQ JSON-LD, README install text, diagram counts, and release archive\n  links. Diagram count and names must stay aligned across `SKILL.md`, `CHEATSHEET.md`,\n  `README.md`, `index*.html`, and `assets/diagrams/`.\n\n## Critical Line-Break Scan\n\nApplies before handing off any user-visible typeset deliverable (rendered PDF,\n`README.md`, public site page).\n\n- Scan page by page for three wrap candidates: a trailing line of only 1-2 words\n  (orphan), a line one word away from wrapping, and a line that wraps early without\n  filling its container. Confirm each in rendered context; an intentional short line\n  is valid and does not need rewriting to make the count zero.\n- Split the work: `python3 scripts/build.py --check-orphans <pdf>` and\n  `--check-density <pdf>` catch PDF orphans and sparse pages deterministically; the\n  manual pass covers what they cannot see, near-wrap and premature-wrap states inside\n  a page, plus non-PDF surfaces (README and the responsive matrix in `references/design.md`).\n- One confirmed defect means a whole-document sweep for that class, not a single-spot fix. Check container geometry and forced breaks before shortening copy; preserve\n  facts and approved wording. Do not shrink type to dodge a wrap; deliberate layout\n  changes must re-pass `python3 scripts/build.py --check` and the page-count\n  contract.\n\n## Evals\n\n`evals/<case>/` holds end-to-end cases for `claude plugin eval`: a realistic request\nwith invented data (`prompt.md`), and graders for skill trigger, PDF (or HTML)\ncreation, and unfilled placeholders, plus fact fidelity in the HTML. Fact fidelity is\na `regex` grader wherever the facts are literal (one-pager-en, resume-cn): LLM judges\nsplit on derived figures and reported false FAILs on outputs whose facts were all\npresent. Keep an LLM judge only for what a pattern cannot read (Korean-only text,\nassertion titles, arithmetic). `evals/score.py` then applies Kami's own gates to each\nkept run workspace (page contract, atomic facts in the PDF text, fonts, density,\nresidue, style, resume balance, generated chart count), which the harness cannot run\nitself; it is read-only unless given `--write`, which saves `gate-scores.json`. One\nsuite run is 9 cases, 18 document builds at `--runs 2`, at roughly $1-3 each.\n\n- Run it after any change to `SKILL.md`, a reference the tier table routes to, a\n  template, or a gate an agent relies on, and compare against the previous run on the\n  same cases; one run per case is noise, use `--runs 2` or more.\n- The harness reads the plugin from `plugins/kami` live. Never run\n  `scripts/build_metadata.py` while a suite is running, and regenerate it before a run\n  so the suite tests the current skill.\n- A file grader takes an exact path; globs such as `*.html` fail with \"path does not\n  exist\". Every prompt pins its output file names for that reason.\n- Kept workspaces live under `/private/tmp/e-*/sealed/home/cwd` with mode 000;\n  `score.py` opens them itself. Results stay in the ignored `evals/results/`.\n- Mathematics is not covered: the sandbox cannot install the MathJax runtime.\n- LLM fidelity rubrics carry the case's full brief, because a judge that sees only a\n  partial fact list fails supplied facts as invented. On artifacts over about 15k\n  characters the harness judge is unreliable: before treating its FAIL as real,\n  re-judge the stored `evidence` HTML with the same rubric (`claude -p --model sonnet`)\n  and read the stated reason. In the 2026-10-15 baseline that split four failing cases\n  into two noisy votes and two real unlabelled derived figures.\n- resume-cn deliberately supplies thin notes (three employers, eight bullets). The\n  expected behavior is two honest pages with `[DATA NEEDED]` gaps and a reported\n  balance shortfall (`references/resume-writing.md` «Thin source»). `--deliver` and\n  `score.py` both read that through `checks.resume_thin_source` and treat it as a\n  reported gap rather than a balance failure.\n\n## Verification\n\n`SKILL.md` «5 · Deliver» owns the document side: `build.py --deliver` runs every\ndocument gate (placeholders, math, residue, style, content coverage, render, page\ncontract, resume balance, fonts, density, orphans, page images) in order and ends\nin one verdict. This section covers the maintenance side only.\n\n- Template or CSS changes: `python3 scripts/build.py --check` (CSS lint, token sync,\n  base/variant cross-template `:root` consistency, currently CN to EN and CN to KO)\n  plus `--verify` for the affected targets, or full `--verify` when the change is\n  cross-template.\n- Script changes: `python3 scripts/tests/test_build.py` and\n  `python3 scripts/build.py --check`. Run full `--verify` only when the render\n  pipeline itself changed (`render.py`, `verify.py`, WeasyPrint handling).\n- Font-stack changes (any `--serif` / `--mono` / SVG `text` chain): rebuild the\n  examples, then `python3 scripts/build.py --check-fonts assets/examples/*.pdf`. The\n  page-count contract cannot see which family actually drew the text, and a wrong one\n  renders cleanly; this is how the diagram labels were found splitting mid-word across\n  two faces.\n- Demo changes: regenerate the affected demo outputs and confirm page counts stay in\n  range. Font issues: `bash scripts/ensure-fonts.sh`, then rebuild the target.\n- MCP server changes: smoke the stdio protocol end to end (initialize, tools/list, one\n  tools/call per changed tool) through a scripted stdin session, and check that output\n  stays newline-delimited JSON with no stray prints on stdout.\n- Packaging changes: `bash scripts/package-skill.sh dist/kami.zip`, then `unzip -l\n  dist/kami.zip` to inspect for accidental large fonts, cache files, or a missing new\n  helper.\n- Marketplace or plugin changes: `python3 scripts/build_metadata.py --check` plus the\n  isolated install smoke described under Generated Mirrors.\n- Public site or AI visibility changes: check `site/index*.html`, README,\n  `site/llms.txt`, `site/robots.txt`, `site/sitemap.xml`, JSON-LD, FAQ, install links, and download links\n  together, then serve the page and verify the responsive matrix in\n  `references/design.md` per locale.\n\n## Fonts\n\n`references/production.md` Part 1 «Fonts» owns the full stack: per-language family\nchains, fallbacks, `@font-face` paths, and the recovery flow. Two facts that must not\ndrift out of it:\n\n- `Source Han Serif KR` is the real family name inside the bundled OTFs and must stay\n  in every Korean fallback chain, otherwise fontconfig cannot resolve the\n  `ensure-fonts.sh`-downloaded font by name on an offline Linux skill install.\n- CJK families lead every stack that CJK text can reach, Latin faces trail. A leading\n  Latin serif ends the stack walk for characters it lacks, which sends each ideograph\n  to fontconfig separately and splits words across two faces inside inline SVG\n  (`production.md` pitfall #4.1). The `-en` templates are the deliberate exception:\n  they are Latin documents, so `Charter` stays first there.\n- The commercial TsangerJinKai02 files never ship inside the skill package, so a\n  sandboxed install has no primary CJK serif and falls through the chain. Keep the\n  chain wide (Source Han Serif SC and CN, Noto Serif CJK SC and Noto Serif SC, Songti\n  SC, STSong, SimSun) so it lands on some serif rather than a system sans.\n- `bash scripts/ensure-fonts.sh` downloads into the XDG user font dir\n  (`${XDG_DATA_HOME:-~/.local/share}/fonts/kami`, override with `KAMI_FONT_DIR`),\n  never into the skill's `assets/fonts`, so an installed Claude Desktop skill stays\n  small. Inside a repo checkout it first restores missing or truncated font files from the root\n  `assets/fonts/` into the skill's ignored font directory. It downloads to the user\n  font directory only when usable fonts are still missing. Commercial use of TsangerJinKai02 requires\n  the appropriate license.\n\n## Releasing\n\n`docs/release.md` owns release notes format, the tag and asset flow, and demo\nscreenshot regeneration commands. Read it when cutting or refreshing a release.\n\n<!-- File: llms.txt (Tokens: ~5 | Category: root-instruction) -->\nsite/llms.txt\n\n<!-- File: site/llms.txt (Tokens: ~1379 | Category: root-instruction) -->\n# Kami\n\n> A warm parchment design system for AI-assisted professional documents. One accent color, serif fonts and clear heading levels, and consistent spacing.\n\n## Author\n- Name: Tw93\n- Site: https://tw93.fun\n- Stable entity ID: https://tw93.fun/#person\n\n\n## What is Kami\nKami gives AI agents templates and layout rules for documents and landing pages. It includes one-pagers, resumes, portfolios, slides, long documents, letters, equity reports, and changelogs. Defaults include a warm parchment background (#f5f4ed), ink-blue accents (#1B365D), and Charter/TsangerJinKai serif fonts. A white-background option is available for printing.\n\nKami installs into the agent that uses it and runs on that machine. There is no hosted Kami API, no account, and no API key: the integration surface is a local MCP server, JSON content schemas, and CLI checks.\n\n## When to use Kami\nReach for Kami when the user wants a finished document whose appearance matters, and a plain text answer would not be enough:\n- \"Make me a resume / CV\" -> `resume`\n- \"Turn this into a one-pager, product brief, or intro sheet\" -> `one-pager`\n- \"Write a formal letter, offer, or notice\" -> `letter`\n- \"Build a slide deck for this talk\" -> `slides` (PDF, or editable PPTX)\n- \"Write this research, spec, or report up as a document\" -> `long-doc`\n- \"Show my work, case studies, or portfolio\" -> `portfolio`\n- \"Analyze this company or stock and produce a report\" -> `equity-report`\n- \"Write release notes for this version\" -> `changelog`\n- \"Draw an architecture diagram, flowchart, timeline, or chart to embed\" -> one of 18 inline SVG diagram types\n- \"Build a landing page in this style\" -> browser-only `landing-page` template\n\nDo not reach for Kami for chat answers, code files, or content where the user only wants the text. Kami's cost is layout work; it pays off when the artifact is handed to someone else.\n\nHow an agent should call Kami: install the skill, fill the matching content schema, fill the template HTML, then finish with `python3 scripts/build.py --deliver filled.html content.json`, which runs every document check, renders the PDF, and exports page images for the perceptual pass, or drive the same steps as tools through the local MCP server. Judgment lives in SKILL.md; execution lives in the scripts.\n\n## Key Pages\n- [English showcase](https://kami.tw93.fun): Design system overview with live demos\n- [Developers](https://kami.tw93.fun/developers): Agent and developer integration surface\n- [About](https://kami.tw93.fun/about): What Kami is and who maintains it\n- [Contact](https://kami.tw93.fun/contact): Support and reporting channels\n- [Privacy](https://kami.tw93.fun/privacy): What this site and the skill collect\n- [Chinese showcase](https://kami.tw93.fun/index-zh.html): Chinese version\n- [Japanese showcase](https://kami.tw93.fun/index-ja.html): Japanese version (best-effort CJK path)\n- [Korean showcase](https://kami.tw93.fun/index-ko.html): Korean version (best-effort CJK path)\n- [Traditional Chinese showcase](https://kami.tw93.fun/index-tw.html): Traditional Chinese version\n- [GitHub](https://github.com/tw93/kami): Source code and templates\n\n## Install\n- Claude Code, Codex, Cursor, and other agents: `npx skills add tw93/kami -a claude-code codex cursor -g -y`\n- Claude Code plugin (v2.1.142+): `/plugin marketplace add tw93/kami` then `/plugin install kami@kami`\n- Codex plugin: `codex plugin marketplace add tw93/kami && codex plugin add kami@kami`\n- Claude Desktop: download the release asset `kami.zip` from GitHub Releases (not the source-code ZIP) and upload it via Customize > Skills > \"+\" > Create skill\n- MCP client: `claude mcp add kami -- python3 <checkout>/skills/kami/scripts/mcp_server.py`\n\n## Templates\n- 8 document template types: One-pager, Letter, Resume, Long document, Portfolio, Slides, Equity report, Changelog\n- 18 diagram types: architecture, architecture board, flowchart, quadrant, bar chart, line chart, donut chart, state machine, timeline, swimlane, tree, layer stack, venn, candlestick, waterfall, sequence, class, ER\n\n## Agent Interfaces\n- Content contracts: `references/schemas/<type>.json` carries the per-type structure and quality bar; new `content.json` files also carry an artifact `brief` with target, preserve boundary, evidence, and acceptance checks; validate before layout and check coverage after filling with `python3 scripts/build.py --check-content content.json [filled.html]`\n- Deterministic checks: placeholders, markdown residue, page density, orphan lines, slide rhythm, and a perceptual pass that exports page images with a fixed review checklist (`--check-visual`)\n- MCP server: `python3 scripts/mcp_server.py` speaks MCP over stdio with tools kami_templates / kami_doctor / kami_render / kami_check / kami_deliver / kami_screenshot, so agents can diagnose, render, and verify without loading the skill prompt\n\n## Machine-Readable Files\n- MCP server card: https://kami.tw93.fun/.well-known/mcp/server-card.json\n- Agent Skills index: https://kami.tw93.fun/.well-known/agent-skills/index.json\n- Skill definition: https://kami.tw93.fun/SKILL.md\n- Homepage as Markdown: https://kami.tw93.fun/index.md (a request to `/` carrying `Accept: text/markdown`, or `/?mode=agent`, redirects here)\n- Developer surface: https://kami.tw93.fun/developers.md and https://kami.tw93.fun/developers/llms.txt\n- Template and diagram catalog: https://kami.tw93.fun/feeds/catalog.jsonld (indexed by https://kami.tw93.fun/schemamap.xml)\n\n## Links\n- GitHub: https://github.com/tw93\n- Blog: https://tw93.fun\n- AI Profile: https://tw93.fun/llms-full.txt\n\n<!-- File: evals/equity-report-charts-en/graders/content-fidelity.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/content-fidelity.md)\n\n<!-- File: evals/equity-report-charts-en/graders/no-placeholders.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/no-placeholders.md)\n\n<!-- File: evals/equity-report-charts-en/graders/pdf-created.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/pdf-created.md)\n\n<!-- File: evals/equity-report-charts-en/graders/skill-fired.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/equity-report-charts-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-charts-en/graders/skill-fired.md)\n\n<!-- File: evals/equity-report-charts-en/prompt.md (Tokens: ~282 | Category: anthropic-skill) -->\n---\nplugins: [\"../../plugins/kami\"]\ntags: [equity-report, en, charts]\nmax_turns: 150\ntimeout_seconds: 2400\nallowed_tools: [Read, Glob, Grep, Skill, Bash, Write, Edit, TodoWrite]\n---\n\nWrite an equity research note as a PDF in the current directory. The company is Northgate Robotics, a made-up name for an internal training case, so use only the numbers below and add no outside data. Don't ask me questions, just finish it. Name the source file report.html and the PDF report.pdf.\n\n- Business: warehouse picking robots sold with a software subscription.\n- Revenue: FY2023 $412M, FY2024 $538M, FY2025 $701M. Show this as a bar or line chart.\n- FY2025 revenue mix: robot hardware 61%, software subscriptions 27%, services 12%. Show this as a donut chart.\n- Gross margin: FY2023 34.0%, FY2024 36.5%, FY2025 39.2%.\n- Share price $46, 180M shares outstanding.\n- Our view: FY2026 revenue $880M, rating Overweight, 12-month target price $58.\n- Risks: two customers make up 38% of revenue; a chip supply shortage could delay deliveries.\n\n<!-- File: evals/equity-report-cn/graders/content-fidelity.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/equity-report-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/content-fidelity.md)\n\n<!-- File: evals/equity-report-cn/graders/no-placeholders.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/equity-report-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/no-placeholders.md)\n\n<!-- File: evals/equity-report-cn/graders/pdf-created.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/equity-report-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/pdf-created.md)\n\n<!-- File: evals/equity-report-cn/graders/skill-fired.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/equity-report-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/equity-report-cn/graders/skill-fired.md)\n\n<!-- File: evals/landing-page-en/graders/content-fidelity.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/landing-page-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/content-fidelity.md)\n\n<!-- File: evals/landing-page-en/graders/html-created.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/landing-page-en/graders/html-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/html-created.md)\n\n<!-- File: evals/landing-page-en/graders/no-placeholders.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/landing-page-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/no-placeholders.md)\n\n<!-- File: evals/landing-page-en/graders/skill-fired.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/landing-page-en/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/landing-page-en/graders/skill-fired.md)\n\n<!-- File: evals/landing-page-en/prompt.md (Tokens: ~209 | Category: anthropic-skill) -->\n---\nplugins: [\"../../plugins/kami\"]\ntags: [landing-page, en, screen]\nmax_turns: 150\ntimeout_seconds: 2400\nallowed_tools: [Read, Glob, Grep, Skill, Bash, Write, Edit, TodoWrite]\n---\n\nMake a landing page for my product as a single HTML file in the current directory, named index.html. It is a web page only, no PDF needed. Don't ask me questions, just make reasonable calls and tell me at the end what's missing.\n\nProduct: Ledgerly, bookkeeping for freelancers.\n- Import bank statements as CSV and Ledgerly sorts transactions into tax categories.\n- Sends invoices and chases late payments automatically.\n- Beta users say month-end bookkeeping takes 40% less time.\n- 1,800 freelancers are in the beta.\n- Pricing: $12 per month, 14-day free trial, no card needed.\n- Call to action: start the free trial.\n\nI don't have customer logos or testimonials yet.\n\n<!-- File: evals/letter-ko/graders/content-fidelity.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/letter-ko/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/content-fidelity.md)\n\n<!-- File: evals/letter-ko/graders/no-placeholders.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/letter-ko/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/no-placeholders.md)\n\n<!-- File: evals/letter-ko/graders/pdf-created.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/letter-ko/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/pdf-created.md)\n\n<!-- File: evals/letter-ko/graders/skill-fired.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/letter-ko/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/letter-ko/graders/skill-fired.md)\n\n<!-- File: evals/letter-ko/prompt.md (Tokens: ~395 | Category: anthropic-skill) -->\n---\nplugins: [\"../../plugins/kami\"]\ntags: [letter, ko]\nmax_turns: 150\ntimeout_seconds: 2400\nallowed_tools: [Read, Glob, Grep, Skill, Bash, Write, Edit, TodoWrite]\n---\n\n다음 내용으로 한국어 추천서를 PDF로 만들어 현재 디렉터리에 저장해 주세요. 질문하지 말고 바로 완성해 주세요. HTML 파일은 letter.html, PDF는 letter.pdf로 저장해 주세요.\n\n- 추천인: 박서연, 한빛데이터 데이터플랫폼팀 팀장\n- 추천 대상: 김도윤, 같은 팀 데이터 엔지니어로 2년 4개월 함께 근무\n- 지원처: 서울대학교 데이터사이언스대학원 석사과정\n- 김도윤은 실시간 로그 파이프라인을 Kafka와 Flink로 재구축해 데이터 지연을 45분에서 90초로 줄였습니다.\n- 사내 데이터 품질 검사 도구를 직접 설계해 18개 팀이 사용하고 있습니다.\n- 신입 3명의 온보딩을 맡아 멘토링했습니다.\n- 통계 공부에 관심이 많아 퇴근 후 온라인 과정을 수료했습니다.\n- 날짜: 2026년 9월 20일\n\n<!-- File: evals/long-doc-cn/graders/content-fidelity.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/long-doc-cn/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/content-fidelity.md)\n\n<!-- File: evals/long-doc-cn/graders/no-placeholders.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/long-doc-cn/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/no-placeholders.md)\n\n<!-- File: evals/long-doc-cn/graders/pdf-created.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/long-doc-cn/graders/pdf-created.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/pdf-created.md)\n\n<!-- File: evals/long-doc-cn/graders/skill-fired.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/long-doc-cn/graders/skill-fired.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/graders/skill-fired.md)\n\n<!-- File: evals/long-doc-cn/prompt.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Long-doc-cn Skill\n\nPath: `evals/long-doc-cn/prompt.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/long-doc-cn/prompt.md)\n\n<!-- File: evals/one-pager-en/graders/content-fidelity.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/one-pager-en/graders/content-fidelity.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/content-fidelity.md)\n\n<!-- File: evals/one-pager-en/graders/no-invented-metrics.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/one-pager-en/graders/no-invented-metrics.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/no-invented-metrics.md)\n\n<!-- File: evals/one-pager-en/graders/no-placeholders.md (Tokens: ~300 | Category: anthropic-skill) -->\n# Graders Skill\n\nPath: `evals/one-pager-en/graders/no-placeholders.md`\n\n[View Raw Content on GitHub](https://raw.githubusercontent.com/tw93/Kami/HEAD/evals/one-pager-en/graders/no-placeholders.md)\n\n<!-- ... +81 more modular skills available via /api/skills/tw93/Kami?path={path} -->\n</yakaai_skills>"}