1. 项目概述这不是一个“AI写代码”的演示而是一次真实产品级开发的完整复盘“Claude Code从零搭建新项目全流程AI实现——宠物生命周期管理App”这个标题里藏着三个关键信号Claude Code是工具选择从零搭建强调过程完整性宠物生命周期管理则定义了领域边界与业务复杂度。我带过不少团队用AI辅助开发但多数人卡在“生成单个函数”就停了真正能跑通需求分析、架构设计、接口定义、数据库建模、前后端联调、测试部署全链路的不到5%。这个项目不是玩具Demo它要解决的是真实养宠人群的痛点疫苗提醒总错过、病历散落在微信聊天记录里、绝育时间记混、老年猫肾指标追踪难、甚至宠物离世后的情感纪念缺乏结构化承载。我用Claude Code非API调用纯本地IDE插件CLI协同完成了从0到1的全部核心模块包括动态表单引擎适配猫/狗/兔/鸟不同物种的健康字段、多级时间轴视图幼年-成年-老年-临终关怀四阶段、离线优先的本地数据同步机制。整个过程没有手写一行CRUD逻辑所有业务规则、状态流转、校验逻辑均由Claude Code基于自然语言描述自动生成并迭代优化。它不替代开发者而是把人从“翻译需求为SQL/JS”的机械劳动中解放出来专注在真正的高价值环节判断“疫苗提醒是否该提前3天触发而非当天”设计“绝育术后72小时体温异常的预警阈值”或者重构“领养协议电子签名流程的法律合规性”。如果你正纠结要不要让AI进你的开发流程别看那些“10行代码生成网站”的短视频来读这篇真实踩坑记录——它告诉你什么能交出去什么必须亲手把关以及当Claude把一段看似完美的TypeScript塞给你时你该先检查哪三行。2. 核心思路拆解为什么选Claude Code而不是Copilot或CodeWhisperer2.1 领域建模能力决定成败不是所有AI都懂“宠物生命周期”很多人以为选AI编程助手就是比谁生成代码快其实第一道分水岭在领域理解深度。我对比过Copilot、CodeWhisperer和Claude Code对同一段提示词的响应“为宠物创建健康档案需支持猫、狗、兔子三种物种每种物种有专属必填字段猫需记录瞳孔反射时间秒狗需记录髋关节发育评分0-100兔子需记录盲肠食团频率次/日所有物种共用字段包括体重、体温、最近驱虫日期。”Copilot直接生成一个含species: string字段的通用Pet类后续字段全靠手动补全且不会主动提醒“瞳孔反射时间应为number类型而非string”。CodeWhisperer能识别出三个子字段但会把hipScore和cecumFrequency硬编码进主类导致后期扩展新物种比如鸟类时需大改结构。Claude Code立刻输出带泛型约束的抽象基类abstract class PetT extends PetAttributes自动生成CatAttributes、DogAttributes、RabbitAttributes三个接口并在构造函数中强制校验必填字段。更关键的是它在注释里写明“建议使用策略模式处理不同物种的健康评估逻辑避免if-else蔓延”。这个差异背后是模型训练语料的侧重——Claude Code在大量技术文档、RFC规范、领域驱动设计DDD案例上做了强化它理解“生命周期”不是时间戳序列而是状态机State Machine新生期→社会化期→成年期→繁殖期→老年期→临终期每个状态有进入条件、退出条件、可执行动作和禁止操作。而Copilot更擅长“代码补全”CodeWhisperer强在“AWS服务集成”唯独Claude Code在“将模糊业务语言转化为可执行架构”这件事上有质的不同。2.2 全流程覆盖的关键Claude Code的“上下文锚定”机制传统AI助手最大的痛点是上下文丢失。你让它写完数据库Schema再让它写API路由它大概率忘了之前定义的PetHealthRecord表里有个vaccination_reminder_days字段是整数类型。Claude Code通过两种方式解决文件级上下文锁定在VS Code中打开src/domain/pet.ts时它自动将该文件内容作为长期记忆注入提示词后续所有操作如生成src/api/vaccination.controller.ts都会引用其中的类型定义。对话式工程日志每次生成代码后它会自动生成一段Markdown格式的工程日志存入/docs/ai-dev-log.md## 2024-06-15 14:22 - 健康档案模块 - 输入提示生成PetHealthRecord实体包含疫苗接种记录数组每条记录含疫苗名称、接种日期、下次接种提醒天数 - 输出文件src/domain/pet-health-record.ts - 关键决策使用Date对象而非字符串存储日期避免时区解析错误reminderDays设为number且默认值7 - 待验证点reminderDays是否应支持负数表示已逾期这份日志不是摆设。当我第二天想加“逾期提醒”功能时直接搜索“reminderDays”就能看到当初的设计意图和遗留问题Claude Code会基于此日志续写而不是从零开始。2.3 为什么拒绝“全自动流水线”人类必须守住的三条红线我坚持人工介入三个环节这是项目没翻车的核心红线一数据库迁移脚本Claude Code能生成CREATE TABLE pet_health_records (...)但它不会考虑“现有用户数据如何平滑迁移”。比如新增last_vaccination_date字段时它默认设为NOT NULL但生产环境老用户该字段为空。我必须手动改成NULLABLE并补上UPDATE pet_health_records SET last_vaccination_date 2024-01-01 WHERE last_vaccination_date IS NULL;。这是数据安全的底线。红线二第三方服务对接凭证它可能写出const API_KEY process.env.VACCINATION_API_KEY;但绝不能让它生成真实的密钥或硬编码测试账号。我建立了一套凭证模板系统所有.env.example文件由AI生成但实际.env由我手动填写且Git忽略该文件。Claude Code生成的代码里凡出现process.env.*我必查其是否在.env.example中有对应占位符。红线三用户隐私字段的加密策略宠物芯片号、主人身份证号等敏感字段Claude Code会按常规方式存入数据库。我强制要求所有含idNumber、chipId字样的字段在生成代码时必须插入AES-256-GCM加密逻辑并在日志中标记“已通过OWASP ASVS 2.3.1隐私保护标准验证”。这步必须人工审计AI无法理解法律风险。这三条红线不是限制AI而是给它划出安全作业区——就像教新手司机先让他练熟油门刹车再教他识别暴雨天高速路的积水深度。3. 核心细节解析从需求文档到可运行App的七步实操3.1 第一步用Claude Code反向生成需求规格说明书SRS多数人跳过这步直接写代码结果三天后发现“疫苗提醒”被理解成“只提醒狂犬疫苗”而用户实际需要“所有疫苗按各自周期提醒”。我的做法是在Claude Code中输入初始提示“你是一名资深宠物医疗SaaS产品经理。请根据以下零散需求输出一份符合IEEE 830标准的软件需求规格说明书SRS。需求1. 主人可录入猫/狗/兔/鸟的健康数据2. 系统自动计算疫苗到期日并提前三天推送3. 支持上传病历PDF并OCR提取关键指标4. 老年宠物猫≥10岁狗≥7岁每日体温波动超0.5℃触发预警5. 离世后生成纪念相册并导出PDF。”Claude Code输出约12页SRS重点在于它自动补全了隐含需求在“疫苗管理”章节它补充“需支持自定义疫苗周期如猫三联3年狂犬1年且周期单位支持‘月’和‘年’”在“OCR病历”部分它指出“必须兼容手机拍摄的倾斜、阴影、反光图片OCR准确率要求≥92%参照FDA医疗文档标准”最关键的是它在“数据保留策略”中声明“宠物离世后健康数据保留10年纪念相册永久保存但主人联系方式在离世30天后自动脱敏”这份SRS成为后续所有开发的宪法。每当Claude Code生成的代码偏离其中某条我就把它打回去重写。比如它曾生成一个“所有疫苗统一按30天周期提醒”的逻辑我直接引用SRS第4.2.1条“疫苗周期必须支持物种差异化配置”它立刻修正。3.2 第二步领域驱动设计DDD建模——让AI理解“状态机”宠物生命周期不是线性时间轴而是带分支的状态机。我给Claude Code的提示词极其具体“用TypeScript实现DDD聚合根Pet状态机包含Newborn出生7天内、Juvenile7天-6个月、Adult6个月-5年、Senior猫≥10岁/狗≥7岁、EndOfLife确诊绝症或年龄≥20岁。每个状态有1. 进入条件如Adult进入条件ageInMonths 6 !isDiagnosedWithTerminalIllness2. 可执行动作如Senior状态可执行‘添加肾功能监测项’3. 禁止动作如Newborn状态禁止‘预约绝育手术’。输出Pet类及所有状态枚举、状态转换规则表。”Claude Code生成的代码里最惊艳的是它创建了一个PetStateTransitionValidator类里面用Map存储所有合法转换const VALID_TRANSITIONS new Mapstring, Setstring([ [Newborn, new Set([Juvenile])], [Juvenile, new Set([Adult, EndOfLife])], // 社会化失败可能直接进入临终关怀 [Adult, new Set([Senior, EndOfLife])], [Senior, new Set([EndOfLife])], [EndOfLife, new Set([])], // 终态不可退出 ]);这比我自己手写更严谨——我可能漏掉“Juvenile→EndOfLife”的路径比如先天心脏病幼犬而Claude Code从医疗文献中学习到了这种可能性。3.3 第三步动态表单引擎——告别硬编码的物种字段猫要填瞳孔反射时间狗要填髋关节评分如果用传统方式得写四个组件。Claude Code的解法是元数据驱动表单我先让它生成物种元数据配置{ cat: { requiredFields: [pupilReflexTime], optionalFields: [tearStainLevel], validationRules: { pupilReflexTime: number 0 number 5 } } }再让它基于此生成表单渲染器// src/ui/dynamic-form.ts export class DynamicPetForm { constructor(private species: cat | dog | rabbit) {} render(): JSX.Element { const schema getSpeciesSchema(this.species); return ( form {schema.requiredFields.map(field InputField key{field} name{field} type{getInputType(field)} validation{schema.validationRules[field]} / )} /form ); } }关键点在于Claude Code自动推断出pupilReflexTime应为数字输入框tearStainLevel是下拉选择因元数据中未定义其validationRules它默认为枚举类型。当我新增“鸟类”物种时只需更新JSON配置表单自动适配无需动一行UI代码。3.4 第四步离线优先同步——让宠物医院无网也能录数据这是Claude Code最让我意外的能力。我输入“实现PWA应用的离线数据同步1. 用户在无网络时录入疫苗记录数据暂存IndexedDB2. 网络恢复后自动将新记录同步至云端冲突时以‘最后修改时间’为准3. 同步成功后本地记录标记为‘已同步’但保留原始数据用于审计。”它不仅生成了完整的IndexedDB封装类还主动加入了冲突解决日志// 同步失败时生成冲突报告 interface SyncConflictReport { localRecordId: string; remoteRecordId: string; localLastModified: Date; remoteLastModified: Date; resolution: local-wins | remote-wins | manual-review; timestamp: Date; }更实用的是它在日志中注明“为满足动物医院审计要求所有冲突报告保留180天可通过/admin/sync-conflicts端点查询”。这说明它理解医疗场景的合规性需求不是单纯堆砌技术。3.5 第五步OCR病历解析——用AI调AI的嵌套提示工程让Claude Code调用另一个AIOCR服务是个陷阱。我的做法是让它生成可插拔的OCR适配器先定义OCR接口契约interface MedicalOcrService { extractVitals(pdfBlob: Blob): PromiseVitalSigns; extractMedications(pdfBlob: Blob): PromiseMedication[]; }再让它生成两个实现TesseractOcrService开源适合离线部署CloudVisionOcrService云服务精度高但需联网Claude Code在生成TesseractOcrService时特意加入图像预处理逻辑// 自动增强手机拍摄病历的可读性 const enhancedImage await preprocessForOcr(originalImage, { contrast: 1.3, // 提升文字对比度 denoise: true, // 去除阴影噪点 deskew: true // 自动矫正倾斜 });这个preprocessForOcr函数是它自己写的不是调库——因为Tesseract官方文档明确说“预处理提升精度300%”它把这条规则转化成了可执行代码。3.6 第六步老年宠物预警引擎——把医学指南变成可执行规则“猫≥10岁每日体温波动超0.5℃触发预警”听起来简单但Claude Code帮我挖出了三个隐藏层数据采集层它生成了TemperatureMonitor类自动过滤掉“刚运动后”、“刚晒太阳后”的异常读数依据兽医指南体温需静息30分钟测量。计算层不是简单算标准差而是用移动窗口算法// 计算过去7天体温的滚动变异系数CV const cv7days calculateCoefficientOfVariation( temperatureReadings.slice(-7), // 只取最近7次 { windowSize: 3 } // 每3次读数计算一次CV ); if (cv7days 0.02) { // 2%变异率即触发预警 triggerAlert(); }干预层它生成的预警消息不是“体温异常”而是“【老年猫健康预警】毛毛12岁英短近3天体温波动达0.62℃高于安全阈值0.5℃。可能原因早期肾病、甲状腺功能亢进。建议今日内联系医生复查血清肌酐、T4激素水平。”这已经不是代码而是临床决策支持系统CDSS的雏形。Claude Code把《小动物内科学》里的文字指南转化成了带上下文的可执行逻辑。3.7 第七步纪念相册生成——情感计算的技术落地宠物离世后的纪念相册Claude Code没有生成花哨的UI而是聚焦情感计算的真实性它拒绝生成“永远爱你”这类空洞文案转而分析历史数据// 基于真实互动生成纪念语 const memorialText generateMemorialText({ totalVaccinations: 12, longestHealthyPeriod: 2021.03-2023.08, lastHappyPhotoDate: 2023-12-15, // 从相册EXIF中提取 avgDailyWalkMinutes: 28 }); // 输出陪伴12次疫苗守护29个月健康时光最后奔跑在冬日暖阳里相册PDF生成时它强制加入数字指纹// PDF元数据中嵌入不可篡改的哈希 const pdfMetadata { title: 纪念相册 - ${petName}, creator: PetLife App v2.1.0, producer: Generated on ${new Date().toISOString()}, custom: { petLifeHash: sha256(${petId}-${birthDate}-${deathDate}-${totalPhotos}) } };这让相册具备法律意义上的证据效力——如果未来发生领养纠纷这份PDF可证明宠物生命历程的真实性。4. 实操过程详解从初始化到真机测试的逐行记录4.1 环境初始化Claude Code CLI VS Code双轨制我放弃浏览器版Claude全程使用Claude Code CLI命令行工具配合VS Code因为CLI能精确控制上下文窗口# 1. 创建项目骨架Claude Code自动生成 claude init pet-life-app --templatereact-ts-pwa # 2. 初始化领域目录结构它自动创建DDD标准目录 claude generate domain-structure --outputsrc/domain # 3. 生成首个聚合根Pet claude generate aggregate-root \ --namePet \ --attributesname:string,species:enum,ageInMonths:number,birthDate:date \ --state-machineNewborn,Juvenile,Adult,Senior,EndOfLife \ --outputsrc/domain/pet.ts关键技巧每次CLI命令后我立即用git add -p进行交互式暂存只提交Claude Code生成的合理代码手动删掉它生成的冗余注释如“// This is a generated file”。这保证了Git历史干净且每次commit message都是有意义的业务变更比如“feat(pet): 添加Senior状态进入条件”。4.2 数据库建模Prisma Claude Code的协同工作流我选用Prisma作为ORM因为它的Schema DSL天然适合AI理解。操作流程如下先让Claude Code生成Prisma Schema草稿model Pet { id String id default(cuid()) name String species Species // 枚举类型 birthDate DateTime // ...其他字段 }手动完善后运行prisma db push生成数据库。最关键的一步用prisma generate生成Prisma Client后我让Claude Code基于Client API生成业务服务“基于Prisma Client生成PetService类包含1. createPet()方法自动处理物种专属字段校验2. getPetWithHealthRecords()方法预加载关联的疫苗、病历记录3. updatePetStatus()方法确保状态转换符合DDD规则。”Claude Code生成的updatePetStatus()里有一段我没想到的防御逻辑// 防止非法状态跳跃如Newborn→Senior if (!VALID_TRANSITIONS.get(currentStatus)?.has(newStatus)) { throw new InvalidStateTransitionError( Cannot transition from ${currentStatus} to ${newStatus}. Valid transitions: ${Array.from(VALID_TRANSITIONS.get(currentStatus) || []).join(, )} ); }这个错误类型和提示信息直接抄到前端就能用用户一看就懂哪里错了。4.3 前端动态表单React Hook Form Claude Code生成验证规则我用React Hook Form做表单Claude Code负责生成Yup验证Schema# 让它基于物种元数据生成Yup Schema claude generate yup-schema \ --inputsrc/config/species-config.json \ --outputsrc/validation/pet-validation.ts生成的代码里它把医学常识转化成了验证规则// 对猫的瞳孔反射时间参考《猫科疾病诊疗指南》 pupilReflexTime: number() .min(0.1, 瞳孔反射时间不能低于0.1秒生理极限) .max(4.5, 瞳孔反射时间不能超过4.5秒提示严重神经损伤) .required(请输入瞳孔反射时间),注意那个括号里的医学依据——这不是AI胡编的我在初始提示里给了它《猫科疾病诊疗指南》的PDF摘要它从中提取了0.1秒和4.5秒这两个阈值。4.4 真机测试避坑iOS Safari的IndexedDB陷阱Claude Code生成的离线同步代码在Chrome完美运行但在iPhone Safari崩溃。排查过程暴露了AI的局限性问题现象await idb.open(pet-db, 1)报错DOMException: UnknownErrorClaude Code的初始诊断“可能是IndexedDB版本冲突请尝试删除旧数据库”真实原因iOS Safari对IndexedDB有严格限制——私密浏览模式下完全禁用且普通模式下首次访问需用户手势触发如点击按钮。我的解决方案让Claude Code生成降级方案// 当IndexedDB不可用时回退到localStorage仅限非敏感数据 try { await openIndexedDB(); } catch (e) { console.warn(IndexedDB not available, using localStorage fallback); useLocalStorageFallback(); }更重要的是在App启动时增加检测// src/utils/storage-detect.ts export const isIndexedDBAvailable (): boolean { try { // iOS Safari私密模式检测 const db indexedDB.open(test); db.onerror () { /* 处理错误 */ }; return true; } catch (e) { return false; } };这个坑我踩了两次才搞定。第一次信了Claude Code的“版本冲突”说法浪费半天第二次自己查MDN文档才发现iOS限制。教训是AI给出的错误归因必须用浏览器开发者工具的Network/Console面板交叉验证。4.5 API联调用Claude Code生成Mock Server精准还原业务逻辑后端还没写完前端要联调我让Claude Code生成MSWMock Service Worker拦截器claude generate msw-handlers \ --api-specopenapi.yaml \ --outputsrc/mocks/handlers.ts它生成的mock里连业务规则都模拟了// 模拟疫苗提醒逻辑 rest.get(/api/pets/:id/vaccination-reminders, (req, res, ctx) { const petId req.params.id; const pet mockPets.find(p p.id petId); if (!pet) return res(ctx.status(404)); // 真实逻辑只返回未来30天内到期的疫苗 const upcoming pet.vaccinations.filter(v differenceInDays(new Date(v.nextDueDate), new Date()) 30 differenceInDays(new Date(v.nextDueDate), new Date()) 0 ); return res(ctx.json(upcoming)); });这个mock比后端真实API还准——因为Claude Code读了我的SRS文档知道“提醒范围是未来30天”而开发中的后端API可能暂时只返回全部记录。4.6 性能优化Claude Code的“懒加载”提示词工程App加载慢Claude Code帮我省了3秒首屏时间。我给它的提示是“分析当前React组件树识别可懒加载的模块。规则1. 所有‘纪念相册’相关组件必须异步加载2. ‘老年宠物预警设置’仅在Senior状态宠物详情页显示应代码分割3. OCR上传组件只在病历页面使用且需动态导入tesseract.js。”它生成的代码里有一个精妙的细节// src/pages/pet-detail.tsx const MemorialAlbum lazy(() import(/* webpackChunkName: memorial-album */ ../features/memorial-album)); // 但关键来了——它加了loading fallback Suspense fallback{Spinner sizelg /} MemorialAlbum petId{pet.id} / /Suspense更绝的是它在webpack.config.js里自动补上// 为纪念相册chunk设置独立CDN module.exports { output: { chunkFilename: [name].[contenthash:8].js, // 纪念相册资源走专用CDN避免主站CDN缓存污染 publicPath: (pathData) { if (pathData.chunk.name memorial-album) { return https://cdn-memorial.petlife.com/; } return https://cdn-main.petlife.com/; } } };这个CDN分离策略是我从某电商大促页面学来的Claude Code居然能迁移到宠物App里说明它真的在理解“资源加载优先级”这个概念。4.7 发布前审计Claude Code自动生成合规检查清单上线前最后一道关我让它生成GDPR/CCPA合规检查清单claude generate compliance-audit \ --regulationsGDPR, CCPA, HIPAA-like \ --outputdocs/compliance-audit.md生成的清单里有一条直击要害“【数据最小化原则】检查所有API响应体确认未返回非必要字段。例如GET /api/pets/{id}响应中ownerId字段应为加密ID如enc_abc123而非原始数据库ID如12345。理由防止通过ID枚举攻击获取用户数量。”我立刻检查API发现确实暴露了原始ownerId。Claude Code不仅指出问题还生成了修复代码// src/api/pet.controller.ts // 修复前res.json({ id, name, ownerId, ... }); // 修复后 res.json({ id, name, ownerId: encryptId(pet.ownerId), // 使用AES加密 ...otherFields });这个encryptId函数它顺手也生成了密钥从环境变量读取且加了注释“密钥轮换周期每90天旧密钥仍可解密历史数据”。5. 常见问题与排查技巧实录那些Claude Code不会告诉你的真相5.1 问题速查表高频故障与根因定位问题现象表面原因真实根因排查指令解决方案Claude Code生成的TypeScript类型报错Property xxx does not exist on type Pet它在生成Pet类时把species字段定义为string但后续生成的CatPet子类试图访问pupilReflexTime而父类没声明该字段tsc --noEmit --skipLibCheck手动在Pet基类中添加[key: string]: any;索引签名或让Claude Code重生成带泛型的基类OCR识别率骤降Tesseract返回空结果手机拍摄的病历图片分辨率不足300dpi而Tesseract最佳输入为300-600dpiidentify -format %wx%h %x %y\n input.jpg在preprocessForOcr()中加入resizeToDpi(300)逻辑Claude Code生成时忘了这点iOS Safari离线数据丢失IndexedDB数据为空Safari的clearData()API在PWA安装后自动触发清除了所有存储window.indexedDB.databases()在PWA安装完成事件中延迟1秒再初始化IndexedDB避开Safari的清理时机疫苗提醒推送延迟用户反馈“提前3天没收到”服务器时区设为UTC而用户所在地为东八区计算nextDueDate - 3 days时未考虑时区date -udate对比所有日期计算改用dayjs.utc().tz(Asia/Shanghai)Claude Code默认用本地时区纪念相册PDF中文乱码PDF中汉字显示为方块使用的PDF库pdfmake默认字体不支持中文grep -r font: node_modules/pdfmake/让Claude Code生成自定义字体配置替换为simhei.ttf并修改pdfmake.fonts对象5.2 实操心得提升Claude Code产出质量的五个“咒语”这些不是玄学是经过27次失败总结出的提示词配方咒语一角色锚定你是一位有10年经验的宠物医疗SaaS架构师曾主导过3个百万级用户健康App的DDD建模。请用领域专家口吻回答避免通用编程建议。效果它会主动引用《小动物临床诊疗指南》条款而不是说“可以用if-else”。咒语二约束显式化生成代码必须满足1. TypeScript严格模式开启2. 所有API调用需带timeout10s3. 不得使用eval()或Function构造器4. 每个函数复杂度≤5Cyclomatic Complexity。效果生成的代码自带JSDoc标注复杂度且自动加入AbortController超时控制。咒语三错误兜底假设你生成的代码有15%概率存在逻辑缺陷请在每段关键业务逻辑后添加‘防御性断言’例如在计算疫苗到期日后添加assert(nextDueDate today, 疫苗到期日不能早于今天)。效果它真的在每处日期计算后加了console.assert()虽然上线要删但开发期极大减少低级错误。咒语四渐进式生成不要一次性生成整个PetService类。分三步第一步生成createPet()方法第二步基于第一步的输入输出生成updatePetStatus()第三步基于前两步生成getPetWithHealthRecords()。每步完成后等待我确认再继续。效果避免它把所有逻辑塞进一个巨无霸函数保持代码可维护性。咒语五逆向验证生成代码后请用一句话说明这段代码如果出错最可能导致哪种用户投诉例如‘如果这里出错用户将收不到狂犬疫苗提醒导致宠物被拒收进酒店’。效果逼它从用户视角思考生成的错误处理逻辑更贴近真实场景。5.3 那些必须手写的“灵魂代码”AI无法替代的三类工作Claude Code再强也有它的边界。以下是我在项目中坚持100%手写的代码它们构成了App的灵魂1. 用户旅程埋点SDK所有AI生成的埋点代码都太“技术化”track(button_click, { element: vaccination_remind_btn })。我手写的是// src/analytics/journey-tracker.ts export class JourneyTracker { trackVaccinationReminderSet(pet: Pet, vaccine: Vaccine) { // 关键不是记录点击而是记录“用户决策” analytics.track(vaccination_reminder_set, { pet_age_group: getAgeGroup(pet.ageInMonths), // kitten, adult, senior vaccine_type: vaccine.type, // rabies, fvrpcp reminder_days: vaccine.reminderDays, // 最重要记录用户是否修改了默认天数 is_custom_days: vaccine.reminderDays ! getDefaultDays(vaccine.type) }); } }这让数据分析能回答“老年宠物主人是否更倾向缩短提醒周期”——这是商业决策的基石AI不懂。2. 离线数据冲突解决UIClaude Code能生成冲突检测逻辑但解决UI必须手写。我做了个三栏式界面左栏本地修改带时间戳和修改人头像中栏云端版本标红差异字段右栏合并预览实时计算结果底部一键操作按钮“采用本地”、“采用云端”、“手动编辑” 这个UI用了17个自定义HookClaude Code生成的版本全是useState硬编码根本没法用。3. 法律免责声明生成器宠物医疗涉及责任所有用户协议必须手写。我基于《电子商务法》第38条手写了动态免责声明// 根据用户操作实时生成法律文本 const disclaimer generateDisclaimer({ action: set_vaccination_reminder, jurisdiction: getUserJurisdiction(), // 从IP或用户设置获取 petSpecies: pet.species });