21 KiB
Executable File
Scene: Resume / CV
Goal
Generate a complete, authentic, well-structured, position-targeted resume with stable Word formatting. Must simultaneously meet:
- Authentic and credible content, clear position targeting
- ATS-friendly, stable Word layout
- Clean structure, professional visual design, easy to scan
Execution priority (when conflicting): Position relevance > Information readability > ATS compatibility > Visual decoration
Forbidden: Producing advice-only / fragments / half-finished drafts; outputting chat-style explanations.
→ Font profile: B (Visual) — see references/common-rules.md
→ Placeholder convention & universal prohibitions — see references/common-rules.md
Scope
Default: generate a position-oriented general resume. Switch to English resume, academic CV, international format, or design portfolio style only when explicitly requested by the user.
Resume Type Routing
Auto-select module order based on user background and target:
General Resume (default)
Name & Contact → Target Position → Profile Summary (optional) → Core Skills → Work Experience → Projects → Education → Certifications / Awards
New Graduate Resume
Name & Contact → Target Position → Education → Internship Experience → Projects → Campus Activities / Competitions / Awards → Skills & Certifications
Technical Role Resume
Name & Contact → Target Direction → Profile Summary (optional) → Tech Stack / Core Skills → Work Experience → Projects → Education → Open Source / Papers / Patents / Competitions
Academic CV
Name & Contact → Research Direction / Target → Education → Research Experience → Papers / Patents / Projects / Grants → Teaching / Academic Service → Awards / Skills / Languages
Input Processing Rules
- If user provides a target position or JD → must reorganize and rewrite content around position requirements
- If user provides a raw draft → prioritize restructuring, phrasing refinement, and priority reordering; do not rewrite into an unfamiliar career
- Never fabricate companies, positions, degrees, projects, certifications, awards, papers, patents, data results, or achievements
- If critical data is missing → use conservative expressions or placeholder
【Please fill in: ______】; never fabricate precise numbers - A single resume should generally serve only one primary career direction
Content Quality Constraints
Core Principles
- Resume must revolve around the target position — do not spread all experiences equally
- Most relevant experiences, projects, and skills must be placed first and detailed
- Terminology, company names, position titles, date formats, and skill names must be consistent
- Must demonstrate: personal positioning → capability tags → relevant experience → provable results
- No piling of vague self-praise; no inspirational writing or chronological dumps
Experience Writing Standards
Each experience bullet should demonstrate: Action + Object/Context + Method + Result/Impact
Recommended verbs: Led, built, drove, optimized, refactored, designed, delivered, coordinated, improved, reduced, achieved
Rules:
- "Responsible for" / "participated in" are not absolutely forbidden, but must include scope and results
- Each bullet is concise — one core contribution per bullet
- Quantify when possible, but do not force-bold all numbers
- Recent experience gets detail; low-relevance/low-value experience gets compressed or removed
- Reverse chronological order — most recent and relevant first
- Expand the most recent 2 experiences; compress earlier ones
Profile Summary / Self-Assessment
- Not mandatory
- If included, frame as "Profile Summary" — 3–4 lines max
- Focus on: years of experience, career direction, core capabilities, representative achievements, position fit
- Forbidden as main content: "hardworking", "strong sense of responsibility", "team player", "quick learner", "outgoing personality"
Truthfulness & Risk Control
- Never fabricate experiences, achievements, education, awards, or certifications
- Never upgrade "participated in" to "led" unless user information supports it
- Never attribute team results entirely to the individual
- Never fabricate revenue, conversion rates, headcount, budgets, or technical metrics
- If no data available, use restrained expressions: "improved delivery efficiency", "shortened processing cycle", "supported core business launch"
Length Control
| Candidate Type | Target Pages |
|---|---|
| New graduate / <3 years experience | 1 page |
| 3–10 years experience | 1–2 pages |
| Senior manager / researcher / academic CV | May exceed 2 pages, but must maintain information density |
Compression rules:
- Experiences >5 years old with low relevance should be compressed
- Experiences >10 years old and irrelevant may be omitted
- Never pad low-value experiences just to "look comprehensive"
ATS & Structure Constraints
- Core information must be plain text — never rely on images, icons, text boxes, or headers/footers for key content
- No embedded charts, objects, SmartArt, or WordArt
- Experience descriptions use consistent bullet symbols — no complex auto-numbering
- Bullets within the same position should be compact — no excess blank lines
Table layout vs. ATS balance: The 3 visual templates (A/B/C) use Table-based layouts for Word visual quality. In strict ATS scenarios (user explicitly says "ATS priority"), prefer Template B (single-column) with reduced table dependency. Default: visual quality first.
Module Naming
Use only standard, universal, recruiter-familiar names:
- Personal Info, Target Position, Profile Summary, Core Skills, Work Experience, Projects, Education, Certifications, Awards, Languages
Forbidden fancy names: "My Growth Journey", "Self-Appreciation", "Shining Moments", "Life Motto"
Template Disease Prevention
- Do not include irrelevant identity tags (political affiliation, hometown, etc.) unless user explicitly requests
- Do not place low-priority modules (hobbies, languages, personality traits) before work experience
- Do not combine cover letter and resume in one document (unless user explicitly requests)
- Do not let template feel overpower actual personal information
- Do not let "self-assessment" occupy the golden area of the page (should come after core skills/experience)
Template Selection
Three templates are provided, auto-selected based on user needs:
| Template | Layout | Best For | Color Style |
|---|---|---|---|
| A | Left sidebar + right body | General purpose, tech roles | Dark grey sidebar + blue bar headings |
| B | Dark header banner + single column | Content-heavy / senior candidates | Dark blue header + underline headings |
| C | Left sidebar + vertical-line headings | International / bilingual / foreign companies | Blue sidebar + left-border headings |
Selection logic:
- Default: Template A
- Lots of content (expected > 1 page) → Template B (no sidebar, better space utilization)
- User explicitly requests bilingual / English → Template C
Industry Color Suggestions
| Career Direction | Sidebar BG | Accent Color | Recommended Template |
|---|---|---|---|
| Tech / Internet | #1A1F36 (deep blue-purple) |
#667eea (amethyst) |
A or C |
| Finance / Consulting | #0F2027 (deep sea blue) |
#D4AF37 (gold) |
A or B |
| Design / Creative | #2D1B30 (deep purple) |
#f5576c (coral pink) |
A or C |
| Education / Training | #1A3A3A (dark green) |
#3CB4A0 (mint green) |
A |
| Medical / Health | #0E2030 (dark cyan) |
#3888A8 (medical blue) |
B |
| General / Default | #303030 (warm dark neutral) |
#B89870 (warm accent) |
A |
When industry is unspecified, use default warm neutral palette. This aligns with the Visual Profile warm-neutral guidance in design-system.md.
Key Rules
- NO cover page / NO TOC
- Target: 1 page (2 pages max for senior roles)
- Compact spacing:
line: 276(1.15x) - All templates use bilingual section headings (e.g., "Work Experience 工作经历")
Template A: Left Sidebar + Color Bar Headings
Color Palette
const S = {
bg: "3B4F5C", // sidebar background (dark grey-blue)
text: "D8E2E8", // sidebar text
label: "8BA0AD", // sidebar secondary text
accent: "2F97B8", // accent color (blue-cyan)
title: "1A2D38", // body heading
body: "2C3E4A", // body content
sec: "6B8592", // secondary info (dates etc.)
};
Layout Structure
┌──────────┬──────────────────────┐
│ [Photo] │ ██ Profile ██ │ ← Blue bar heading
│ │ Summary text... │
│ Name │ │
│ Title │ ██ Work Experience ██│
│ │ Company Role Date │
│ ──────── │ ▸ Achievement... │
│ Basic │ ▸ Achievement... │
│ Info │ │
│ │ ██ Projects ██ │
│ ──────── │ ... │
│ Contact │ │
│ │ ██ Education ██ │
│ ──────── │ ... │
│ Skills │ │
│ Java ●●●●○│ │
│ Go ●●●○○│ │
│ │ │
│ ──────── │ │
│ Certs │ │
└──────────┴──────────────────────┘
30% 70%
Implementation Notes
Page setup:
page: { margin: { top: 0, bottom: 0, left: 0, right: 0 } }
// Use Table to simulate columns: columnWidths: [3400, 8506]
// ⚠️ Row height must use "exact" with safety margin to prevent overflow blank pages
// Row height: height: { value: 16038, rule: "exact" }
// 16038 = 16838(A4 height) - 1200(safety margin for cross-engine compatibility)
Sidebar element order:
- Photo placeholder (rectangle + border, width 2400 DXA, height 1800)
- Name (32pt bold white SimHei) + Title (18pt accent)
- Basic info (DOB / degree / school)
- Contact info (phone / email / address)
- Skill ratings (name + ●○ dot rating, 5 levels each)
- Certificates list
Right-side section headings (color bar style):
// Full-width bar background + white Chinese text + lighter English text
new Table({ columnWidths:[7600], rows:[new TableRow({ children:[
new TableCell({
shading: { fill: S.accent, type: ShadingType.CLEAR },
margins: { top:40, bottom:40, left:200, right:100 },
children: [new Paragraph({ children: [
new TextRun({ text: "Work Experience ", size:22, bold:true, color:"FFFFFF", font:"SimHei" }),
new TextRun({ text: "Experience", size:18, color:"C8E8F0", font:"Times New Roman", italics:true }),
] })],
})
] })] });
Experience entry format:
// Line 1: Company(bold) + Title(accent) + Date(right-aligned)
new Paragraph({
tabStops: [{ type: TabStopType.RIGHT, position: 7200 }],
children: [
new TextRun({ text: "Company Name", size:22, bold:true, color:S.title }),
new TextRun({ text: " Role Title", size:20, color:S.accent }),
new TextRun({ text: "\t2023.06 — Present", size:17, color:S.sec }),
]
});
// Line 2+: ▸ bullet points
Template B: Dark Header Banner + Single Column
Color Palette
const C = {
dark: "1A3352", // header background (dark blue)
accent: "2980B9", // accent color
title: "1A2636", // heading
body: "2C3E50", // body text
sec: "6B8599", // secondary info
light: "E8EFF5", // light background
};
Layout Structure
┌────────────────────────────────┐
│ ██████████████████████████████ │ ← Dark blue background banner
│ █ Name Title █ │ Contains name / title /
│ █ Phone | Email | Location █ │ contact / basic info
│ █ DOB | Degree | School █ │
│ ██████████████████████████████ │
│ │
│ Profile │ ← Underline heading
│ ───────────────────────────── │
│ Summary text... │
│ │
│ Work Experience │
│ ───────────────────────────── │
│ Company | Role Date │
│ • Achievement... │
│ ... │
│ │
│ Skills │
│ ───────────────────────────── │
│ Programming ●●●●○ Java/Go/...│ ← Rating + details
└────────────────────────────────┘
Implementation Notes
Header banner:
// Table single row single column, dark background, height 2400 DXA
new Table({ columnWidths:[11906], rows:[new TableRow({
height: { value:2400, rule:"exact" },
children:[new TableCell({
shading: { fill: C.dark },
margins: { top:300, bottom:200, left:800, right:800 },
verticalAlign: VerticalAlign.TOP, // Never use CENTER in exact-height rows (WPS incompatible)
children: [
// Line 1: Name(48pt white) + Title
// Line 2: Phone | Email | Location
// Line 3: DOB | Degree | School
]
})]
})] });
Section headings (underline style):
new Paragraph({
borders: { bottom: { style: BorderStyle.SINGLE, size: 2, color: C.accent } },
children: [
new TextRun({ text: "Work Experience", size:24, bold:true, color:C.accent, font:"SimHei" }),
new TextRun({ text: " Experience", size:18, color:C.sec, italics:true }),
]
});
Skills display (rating + details):
// Name(bold) + ●○ rating + specific tools list
new Paragraph({ children: [
new TextRun({ text: "Programming ", size:19, bold:true, color:C.title }),
new TextRun({ text: "●●●●○ ", size:13, color:C.accent }),
new TextRun({ text: "Java / Go / Python / TypeScript", size:18, color:C.sec }),
] });
Template C: Blue Sidebar + Vertical-Line Headings
Color Palette
const C = {
side: "4A7C8F", // sidebar background (teal-blue)
text: "FFFFFF", // sidebar text
label: "A0C4D0", // sidebar secondary text
accent: "357A8F", // accent color
dot: "2F8FAD", // skill dot fill color
dotDim: "B8D4DE", // skill dot empty color
title: "1A3040", // body heading
body: "2C4050", // body content
sec: "6B8A98", // secondary info
};
Sidebar-Specific Elements
Circular photo placeholder:
new Paragraph({ alignment: AlignmentType.CENTER,
children: [new TextRun({ text: "◯", size:80, color:C.label })]
});
Language proficiency matrix:
"English ● ● ● ● ○"
"Japanese ● ● ○ ○ ○"
Right-side section headings (left-border style):
new Paragraph({
borders: { left: { style: BorderStyle.SINGLE, size:8, color:C.accent, space:8 } },
indent: { left: 120 },
children: [
new TextRun({ text: "Work Experience", size:24, bold:true, color:C.title, font:"SimHei" }),
new TextRun({ text: " Experience", size:18, color:C.sec, italics:true }),
]
});
Experience entry format (differs from A):
// Line 1: Company name (bold)
// Line 2: Role (accent color) + Date
// Line 3+: ▸ bullet points
Universal Rules
Font Specifications
| Element | Font | Size | Style |
|---|---|---|---|
| Name (sidebar) | SimHei | 32pt (size:64) | Bold, white |
| Name (header) | SimHei | 24pt (size:48) | Bold, white |
| Section heading | SimHei | 11pt (size:22) | Bold |
| Company / School | Microsoft YaHei | 11pt (size:22) | Bold |
| Role title | Microsoft YaHei | 10pt (size:20) | accent color |
| Date range | Microsoft YaHei | 8.5pt (size:17) | sec color |
| Bullet description | Microsoft YaHei | 9.5pt (size:19) | body color |
| Skill dots | Default | 6.5pt (size:13) | accent / dimColor |
Bullet Symbols
- Template A / C:
▸(small triangle) - Template B:
•(round dot)
Skill Rating Rules
- 1–5 levels using filled ● and empty ○ dots
- One skill per line, name on the left, dots on the right
- Filled dot color: accent; empty dot color: dimColor
JD Matching Logic
When user provides a job description:
- Extract key requirements (skills, experience, education)
- Prioritize matching experience items to the top
- Naturally incorporate JD keywords into descriptions
- Highlight relevant skills
Multi-Page Handling
- 1 page content: Sidebar templates (A/C) or single-column template (B)
- Over 1 page: Prefer Template B; if using A/C, switch page 2 to full-width layout with a name bar at the top (Name | Title)
⚠️ Multi-page resumes must use multi-section structure:
Page 1 and Page 2 must be different sections for independent margin and layout control:
sections: [
{
// Page 1 section — margin 0 (sidebar layout needs full-page)
properties: { page: { margin: { top: 0, bottom: 0, left: 0, right: 0 } } },
children: [page1Table],
},
{
// Page 2 section — normal margins with header bar
properties: { page: { margin: { top: 800, bottom: 600, left: 800, right: 800 } } },
children: [pageHeader(name, title), ...page2Content],
},
]
⚠️ Template B multi-page handling:
Template B header banner uses Table simulation:
- Banner
columnWidthsmust equal page content area width (pageWidth - marginLeft - marginRight), not full page width - If banner needs full page width → set page 1 section margin to 0, banner columnWidths to 11906
- Page 2+ must be independent sections, margin.top ≥ 800
⚠️ Page 2+ top spacing rules (mandatory):
- Page margin.top must be ≥ 800 twips (~1.4 cm), never 0
- Page 2+ needs a header info bar: concise
Name | Titlebar, height ~400–600 twips, separated from body with light background or bottom line - 200–300 twips spacing between header bar and body content
- Forbidden: content touching the very top of page 2
// Concise header bar for page 2+
function pageHeader(name, title) {
return new Table({
width: { size: 100, type: WidthType.PERCENTAGE },
borders: { top: NB, left: NB, right: NB, insideHorizontal: NB, insideVertical: NB,
bottom: { style: BorderStyle.SINGLE, size: 1, color: "D0D0D0" } },
rows: [new TableRow({
cantSplit: true,
height: { value: 500, rule: "atLeast" },
children: [new TableCell({
margins: { top: 60, bottom: 60, left: 200, right: 200 },
borders: { top: NB, left: NB, right: NB, bottom: NB },
children: [new Paragraph({
children: [
new TextRun({ text: name, size: 20, bold: true, color: S.title || C.title }),
new TextRun({ text: ` | ${title}`, size: 18, color: S.sec || C.sec }),
]
})],
})],
})],
});
}
Scene-Specific Quality Checks
In addition to universal checks (see references/common-rules.md):
Format
- Fits within 1 page (senior ≤ 2 pages)
- Single-page fill rate ≥ 85% (bottom whitespace ≤ 15%, ~2500 twips)
- Section headings are bilingual
- Skill rating dots correct (●○)
- Experience in reverse chronological order
- No cover page, no TOC
- Line spacing 1.15x (line: 276)
- No extra blank pages
- Table row height uses
rule: "exact"with value ≤ 16038 (prevent overflow blank pages) - Multi-page: page 2+ has header info bar + proper top spacing
Content
- Clearly organized around target position
- No vague self-assessments ("hardworking", "responsible", "team player")
- No fabricated data or exaggerated results
- Most relevant experience placed first and detailed
- Each bullet demonstrates action + object + method + result
- No long narrative blocks / excessive long sentences / information density imbalance
- Module names are standardized
- Contact info is plain text, clearly positioned
- Header area forms visual center
- Work experience and projects are the visual main body
- Page count matches candidate seniority
Single-Page Fill Rules
Single-page resumes must fully utilize page space — large bottom whitespace is forbidden:
- If content is insufficient → proactively expand:
- Add project details, skill keywords, achievement data
- Add supplementary modules: profile summary, interests, awards
- Use section spacing (
spacing.before/after) to distribute content evenly - Sidebar templates (A/C): sidebar height should approach full page
- If sidebar content is sparse, increase element spacing
- Or add supplementary modules: "Languages", "Interests"
- Assessment: after generation, check last content element position; if >2500 twips from page bottom, adjust