535 lines
21 KiB
Markdown
Executable File
535 lines
21 KiB
Markdown
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
|
||
|
||
1. If user provides a target position or JD → **must reorganize and rewrite content around position requirements**
|
||
2. If user provides a raw draft → prioritize restructuring, phrasing refinement, and priority reordering; do not rewrite into an unfamiliar career
|
||
3. **Never fabricate** companies, positions, degrees, projects, certifications, awards, papers, patents, data results, or achievements
|
||
4. If critical data is missing → use conservative expressions or placeholder `【Please fill in: ______】`; never fabricate precise numbers
|
||
5. A single resume should generally serve only one primary career direction
|
||
|
||
---
|
||
|
||
## Content Quality Constraints
|
||
|
||
### Core Principles
|
||
1. Resume must revolve around the target position — do not spread all experiences equally
|
||
2. Most relevant experiences, projects, and skills must be **placed first and detailed**
|
||
3. Terminology, company names, position titles, date formats, and skill names must be consistent
|
||
4. Must demonstrate: **personal positioning → capability tags → relevant experience → provable results**
|
||
5. 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
|
||
1. Not mandatory
|
||
2. If included, frame as "Profile Summary" — **3–4 lines max**
|
||
3. Focus on: years of experience, career direction, core capabilities, representative achievements, position fit
|
||
4. **Forbidden** as main content: "hardworking", "strong sense of responsibility", "team player", "quick learner", "outgoing personality"
|
||
|
||
### Truthfulness & Risk Control
|
||
1. Never fabricate experiences, achievements, education, awards, or certifications
|
||
2. Never upgrade "participated in" to "led" unless user information supports it
|
||
3. Never attribute team results entirely to the individual
|
||
4. Never fabricate revenue, conversion rates, headcount, budgets, or technical metrics
|
||
5. 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
|
||
|
||
1. Core information must be plain text — never rely on images, icons, text boxes, or headers/footers for key content
|
||
2. No embedded charts, objects, SmartArt, or WordArt
|
||
3. Experience descriptions use consistent bullet symbols — no complex auto-numbering
|
||
4. 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
|
||
|
||
1. Do not include irrelevant identity tags (political affiliation, hometown, etc.) unless user explicitly requests
|
||
2. Do not place low-priority modules (hobbies, languages, personality traits) before work experience
|
||
3. Do not combine cover letter and resume in one document (unless user explicitly requests)
|
||
4. Do not let template feel overpower actual personal information
|
||
5. 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
|
||
```js
|
||
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:**
|
||
```js
|
||
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:**
|
||
1. Photo placeholder (rectangle + border, width 2400 DXA, height 1800)
|
||
2. Name (32pt bold white SimHei) + Title (18pt accent)
|
||
3. Basic info (DOB / degree / school)
|
||
4. Contact info (phone / email / address)
|
||
5. Skill ratings (name + ●○ dot rating, 5 levels each)
|
||
6. Certificates list
|
||
|
||
**Right-side section headings (color bar style):**
|
||
```js
|
||
// 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:**
|
||
```js
|
||
// 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
|
||
```js
|
||
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:**
|
||
```js
|
||
// 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):**
|
||
```js
|
||
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):**
|
||
```js
|
||
// 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
|
||
```js
|
||
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:**
|
||
```js
|
||
new Paragraph({ alignment: AlignmentType.CENTER,
|
||
children: [new TextRun({ text: "◯", size:80, color:C.label })]
|
||
});
|
||
```
|
||
|
||
**Language proficiency matrix:**
|
||
```js
|
||
"English ● ● ● ● ○"
|
||
"Japanese ● ● ○ ○ ○"
|
||
```
|
||
|
||
**Right-side section headings (left-border style):**
|
||
```js
|
||
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):**
|
||
```js
|
||
// 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:
|
||
1. Extract key requirements (skills, experience, education)
|
||
2. Prioritize matching experience items to the top
|
||
3. Naturally incorporate JD keywords into descriptions
|
||
4. 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:
|
||
|
||
```js
|
||
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:
|
||
1. Banner `columnWidths` must equal **page content area width** (pageWidth - marginLeft - marginRight), not full page width
|
||
2. If banner needs full page width → set page 1 section margin to 0, banner columnWidths to 11906
|
||
3. Page 2+ must be independent sections, margin.top ≥ 800
|
||
|
||
⚠️ **Page 2+ top spacing rules (mandatory):**
|
||
|
||
1. **Page margin.top must be ≥ 800 twips** (~1.4 cm), never 0
|
||
2. **Page 2+ needs a header info bar:** concise `Name | Title` bar, height ~400–600 twips, separated from body with light background or bottom line
|
||
3. **200–300 twips spacing between header bar and body content**
|
||
4. **Forbidden: content touching the very top of page 2**
|
||
|
||
```js
|
||
// 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:**
|
||
|
||
1. If content is insufficient → **proactively expand:**
|
||
- Add project details, skill keywords, achievement data
|
||
- Add supplementary modules: profile summary, interests, awards
|
||
2. Use section spacing (`spacing.before/after`) to **distribute content evenly**
|
||
3. Sidebar templates (A/C): sidebar height should approach full page
|
||
- If sidebar content is sparse, increase element spacing
|
||
- Or add supplementary modules: "Languages", "Interests"
|
||
4. Assessment: after generation, check last content element position; if >2500 twips from page bottom, adjust
|