2026-08-25-FDE当前实践PDF与部署实施计划
# FDE 当前实践、PDF 与部署实施计划
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: 将 FDE 页面改为以临床标本库兼职全栈实践为核心,更新测试岗位的 AI Coding 实践,生成两份两页中文 PDF 并按用户选择的 Wiki 发布路径上线。
Architecture: fdeResumeData.json 作为 FDE 公开内容的结构化单一来源,网页配置和 PDF 生成器共同读取;qaResumePdfData.json 保存适合国内招聘版式的测试岗位 PDF 内容,并用事实 ID 与在线页面互相校验。共享页面骨架只增加可选“当前实践”区块并让历史经历可隐藏。PDF 使用同一个 ReportLab 生成器写入 VuePress 公开资源目录,发布前进行文本、页数、逐页渲染和站点构建检查。
Tech Stack: Vue 2 / VuePress 1、JSON、Node.js 20、Python / ReportLab、pdfplumber、Poppler、Git、仓库既有部署脚本。
# 文件结构
- Create:
docs/.vuepress/components/resume/fdeResumeData.json— FDE 网页和 PDF 共用的公开内容。 - Create:
docs/.vuepress/components/resume/qaResumePdfData.json— 测试岗位国内版 PDF 的结构化内容。 - Modify:
docs/.vuepress/components/resume/fdeProfile.js— 只保留页面配置并引用共用数据。 - Modify:
docs/.vuepress/components/resume/qaProfile.js— 更新 AI Coding 实践状态与测试 PDF 下载地址。 - Modify:
docs/.vuepress/components/ResumeProfileShell.vue— 增加可选当前实践区块、隐藏空历史经历区块。 - Create:
scripts/generate_resume_pdfs.py— 从两份 JSON 生成两份两页 A4 中文 PDF。 - Create:
docs/.vuepress/public/file/王杨_FDE_中文简历_2026.pdf— FDE 页面下载文件。 - Create:
docs/.vuepress/public/file/王杨_AI-Native_QA_中文简历_2026.pdf— 测试岗位国内版下载文件。 - Modify:
scripts/test_resume_role_pages.js— 页面结构、数据来源和 PDF 接线回归。 - Create:
scripts/test_fde_resume_pdf.js— PDF 页数、文本和生成器来源契约。 - Modify:
LLM_WIKI/70_个人履历资料库/项目案例/临床标本库自动化端到端交付.md— 记录用户修正的兼职与持续时间。 - Modify:
LLM_WIKI/80_简历组装/岗位方向.md— 记录 FDE 当前实践和 PDF 组装口径。 - Modify:
LLM_WIKI/20_内容体系/简历与个人能力.md— 记录页面与 PDF 的维护入口。 - Modify:
LLM_WIKI/60_现状与待办/当前状态.md— 记录本轮页面、PDF、构建和发布状态。
# Task 1: 用失败测试锁定新页面契约
Files:
Modify:
scripts/test_resume_role_pages.jsCreate:
scripts/test_fde_resume_pdf.js[ ] Step 1: 写页面失败断言
在 test_resume_role_pages.js 中要求:
const fdeData = JSON.parse(read('docs/.vuepress/components/resume/fdeResumeData.json'))
assert.strictEqual(fdeData.zh.currentPractice.period, '2026年7月 - 至今')
assert.strictEqual(fdeData.zh.currentPractice.mode, '兼职')
assert.doesNotMatch(fdeProfileSource, /experience\s*:/)
assert.match(fdeProfileSource, /王杨_FDE_中文简历_2026\.pdf/)
assert.match(qaProfileSource, /王杨_AI-Native_QA_中文简历_2026\.pdf/)
assert.match(shell, /v-if="copy\.currentPractice"/)
assert.match(shell, /v-if="copy\.experience && copy\.experience\.jobs\.length"/)
2
3
4
5
6
7
8
- [ ] Step 2: 写 PDF 失败断言
test_fde_resume_pdf.js 检查生成器读取 fdeResumeData.json 与 qaResumePdfData.json;两份 PDF 均存在、均为 A4 两页。FDE 包含“临床标本库自动化全栈开发”“兼职”“2026年7月 - 至今”;测试 PDF 包含“AI测试工程师”“AI Coding”“85%”及已确认工作时间线。
- [ ] Step 3: 运行测试并确认因功能缺失而失败
Run: zsh -lc 'source /Users/ywang/.nvm/nvm.sh; nvm use 20 >/dev/null; node scripts/test_resume_role_pages.js'
Expected: FAIL,缺少 fdeResumeData.json 或新当前实践契约。
Run: zsh -lc 'source /Users/ywang/.nvm/nvm.sh; nvm use 20 >/dev/null; node scripts/test_fde_resume_pdf.js'
Expected: FAIL,缺少 PDF 生成器或 PDF。
# Task 2: 实现 FDE 当前实践与隐藏历史经历
Files:
Create:
docs/.vuepress/components/resume/fdeResumeData.jsonModify:
docs/.vuepress/components/resume/fdeProfile.jsModify:
docs/.vuepress/components/ResumeProfileShell.vue[ ] Step 1: 抽取 FDE 共用数据
将现有 content 移入 JSON,并用以下结构替换历史经历:
"currentPractice": {
"title": "当前实践",
"badge": "兼职 · 2026年7月至今",
"name": "临床标本库自动化全栈开发",
"period": "2026年7月 - 至今",
"mode": "兼职",
"role": "全栈开发与端到端交付实践",
"factIds": ["project-specimen-automation-ai-coding"],
"bullets": []
}
2
3
4
5
6
7
8
9
10
bullets 只包含已验证的业务建模、Vue/FastAPI/SQLite 全栈、设备与上下游适配、自动验证和内网交付边界。
- [ ] Step 2: 让共享骨架支持可选区块
在 Hero 后先渲染 copy.currentPractice;历史经历区块增加:
<section v-if="copy.experience && copy.experience.jobs.length" id="experience" class="section fade-up">
QA 没有 currentPractice 时保持原页面;FDE 没有 experience 时不渲染历史时间线。
- [ ] Step 3: 接入 FDE PDF 下载地址
fdeProfile.js 导入 JSON,并设置:
resumeUrl: '/file/%E7%8E%8B%E6%9D%A8_FDE_%E4%B8%AD%E6%96%87%E7%AE%80%E5%8E%86_2026.pdf'
- [ ] Step 4: 运行页面测试
Run: node scripts/test_resume_role_pages.js
Expected: 页面契约通过;PDF 测试仍因文件缺失失败。
- [ ] Step 5: 提交页面改动
Commit message: feat: feature current FDE practice
# Task 3: 更新测试岗位 AI Coding 实践与 PDF 数据
Files:
Create:
docs/.vuepress/components/resume/qaResumePdfData.jsonModify:
docs/.vuepress/components/resume/qaProfile.js[ ] Step 1: 更新在线测试岗位口径
将临床标本库案例状态改为各语言对应的“兼职 · 2026年7月至今”,保持 2026-08-24 仅在证据行作为快照日期。测试岗位 PDF URL 改为新文件名,旧 PDF 不删除。
- [ ] Step 2: 建立国内版测试 PDF 数据
两页内容顺序固定为:
第 1 页:姓名与求职方向 → 职业摘要 → AI Coding 兼职实践 → 商汤 / 九坤 / 小米
第 2 页:天眼查 / 讲师 / 马上消费 → AI 测试资产 / ASR 项目 → 技能栈
2
使用一栏式 A4、明确年月和职位,不写工作年数,不增加教育信息,不使用无证据成果。
- [ ] Step 3: 运行页面测试并提交
Run: node scripts/test_resume_role_pages.js
Commit message: feat: update QA AI coding resume content
# Task 4: 生成并验证两份两页 PDF
Files:
Create:
scripts/generate_resume_pdfs.pyCreate:
docs/.vuepress/public/file/王杨_FDE_中文简历_2026.pdfCreate:
docs/.vuepress/public/file/王杨_AI-Native_QA_中文简历_2026.pdfTemporary:
tmp/pdfs/fde-resume-page-*.png、tmp/pdfs/qa-resume-page-*.png[ ] Step 1: 标记 PDF 创建操作
在 PDF skill 目录运行且只运行一次:
Run: node container_tools/mark_artifact_operation_started.mjs --operation-kind create --expected-output-count 2 --output-format pdf
- [ ] Step 2: 实现生成器
生成器读取 fdeResumeData.json 和 qaResumePdfData.json,使用 /System/Library/Fonts/Supplemental/Arial Unicode.ttf,每份固定 A4 两页:
FDE_DATA_PATH = ROOT / 'docs/.vuepress/components/resume/fdeResumeData.json'
QA_DATA_PATH = ROOT / 'docs/.vuepress/components/resume/qaResumePdfData.json'
FDE_OUTPUT_PATH = ROOT / 'docs/.vuepress/public/file/王杨_FDE_中文简历_2026.pdf'
QA_OUTPUT_PATH = ROOT / 'docs/.vuepress/public/file/王杨_AI-Native_QA_中文简历_2026.pdf'
2
3
4
FDE 第 1 页为定位与当前兼职实践,第 2 页为临床案例、其他代表项目、技能和事实边界;测试版采用国内招聘一栏式时间线。不得写正式 FDE 任职、生产验收完成或固定人效倍数。
- [ ] Step 3: 生成 PDF
Run: uv run --with reportlab --with pdfplumber --with pypdf python scripts/generate_resume_pdfs.py
Expected: 输出两份 PDF,生成器自行断言每份页数为 2。
- [ ] Step 4: 执行机器检查
Run: node scripts/test_fde_resume_pdf.js
Run: pdfinfo 'docs/.vuepress/public/file/王杨_FDE_中文简历_2026.pdf' && pdfinfo 'docs/.vuepress/public/file/王杨_AI-Native_QA_中文简历_2026.pdf'
Expected: 两份都为 Pages: 2 且 A4。
- [ ] Step 5: 渲染并逐页检查
Run: mkdir -p tmp/pdfs && pdftoppm -png 'docs/.vuepress/public/file/王杨_FDE_中文简历_2026.pdf' tmp/pdfs/fde-resume-page && pdftoppm -png 'docs/.vuepress/public/file/王杨_AI-Native_QA_中文简历_2026.pdf' tmp/pdfs/qa-resume-page
检查四页 PNG 的裁切、重叠、黑块、字体、留白、页脚和分页;发现问题时修改生成器、重新生成并重新渲染。
- [ ] Step 6: 提交 PDF 与生成器
Commit message: feat: add two-page role resume PDFs
# Task 5: 同步 Wiki 与维护规则
Files:
Modify:
LLM_WIKI/70_个人履历资料库/项目案例/临床标本库自动化端到端交付.mdModify:
LLM_WIKI/80_简历组装/岗位方向.mdModify:
LLM_WIKI/20_内容体系/简历与个人能力.mdModify:
LLM_WIKI/60_现状与待办/当前状态.mdModify:
scripts/test_llm_wiki.js[ ] Step 1: 先添加 Wiki 失败断言
要求 Wiki 同时包含 2026年7月 - 至今、兼职、两份 PDF 文件名和生成器路径。
- [ ] Step 2: 运行并确认 Wiki 测试失败
Run: node scripts/test_llm_wiki.js
Expected: FAIL,缺少新口径或 PDF 维护入口。
- [ ] Step 3: 更新事实和维护入口
将项目持续时间改为用户确认的 2026-07 / 至今,参与方式标记为兼职个人实践;说明快照日期仍是快照,不等于持续验收。记录两份 PDF 的数据入口和生成器,不手工覆盖事实。
- [ ] Step 4: 运行 Wiki 测试并提交
Run: node scripts/test_llm_wiki.js
Expected: PASS。
Commit message: docs: document FDE resume generation
# Task 6: 完整验证与构建
Files:
Verify only: 目标变更文件与构建产物
[ ] Step 1: 运行全部定向检查
Run under Node 20:
node scripts/test_resume_role_pages.js
node scripts/test_fde_resume_pdf.js
node scripts/test_resume_profile_consistency.js
node scripts/test_navigation_i18n_theme.js
node scripts/test_llm_wiki.js
node scripts/test_deploy_smoke_wiring.js
2
3
4
5
6
- [ ] Step 2: 隐私和范围检查
检查 PDF、FDE 数据、案例和 Wiki 不含患者信息、凭据、内网地址或来源原件;确认 independent project/ 未进入分支。
- [ ] Step 3: Node 20 完整构建
Run: npm run build
Expected: Client、Server 和 postbuild 成功;记录既有警告。
- [ ] Step 4: 清理构建自动生成源文件并复验
只删除本次构建产生的未跟踪英日 fallback;不处理 utils/config.yml 的既有换行差异。重新运行定向测试和 git diff --check。
- [ ] Step 5: 本地页面验收
核对 /resume-fde/ 不再显示历史“相关经历”,首个核心区块显示兼职和持续时间,PDF 下载成功且为两页;核对 /resume-v2/ 的 AI Coding 状态、三语内容和新测试 PDF 下载均正确。
# Task 7: 按 Wiki 发布并做线上冒烟
Files:
Execute: 用户明确选择的唯一部署脚本
Verify: 线上
/resume-fde/、PDF、案例页和 Wiki 规定的冒烟入口[ ] Step 1: 确认发布提交和唯一目标
检查工作树仅有不纳管的 utils/config.yml 换行差异;记录 git rev-parse HEAD。只接受用户明确回复的“生产服务器”或“GitHub Pages”。
- [ ] Step 2: 执行所选路径
生产服务器:npm run deploy:aliyun
GitHub Pages:npm run deploy
不得同时执行两条路径。
- [ ] Step 3: 线上 FDE 专项冒烟
检查所选目标对应域名的 /resume-fde/、/resume-v2/、/pages/case-d-specimen-automation/ 和两份新 PDF 返回 200;下载两份 PDF 后确认各为两页,页面包含“兼职”和“2026年7月”。
- [ ] Step 4: 记录发布结果
报告发布提交、目标、脚本结果、专项冒烟、仍未验证业务能力和临时文件状态。失败时停在原始失败点,不自动切换发布路径、不连续重启、不猜测回滚。