from pathlib import Path
import csv,json,html,hashlib,collections
import xlsxwriter
ROOT=Path('/Users/jack/code/010-cpt/008-zhct/zhctprompt')
OUT=Path(__file__).resolve().parent
SRC=Path('/Users/jack/Library/Containers/com.tencent.WeWorkMac/Data/Documents/Profiles/A74DF84611CC2ED79C4C206E40B5D80E/Caches/Files/2026-09/214a50bfacd6049e570664ca85573869/weekly-report-2026-08-31-to-09-13.html')
source_defs=[
('S1','用户提供的产研周报 HTML',str(SRC),'2026-09-04','96/68/28/56、三组工作与下周原计划；仅复核汇总算术，未回读原始三 Sheet'),
('S2','多项目交付与运维周会','work/2026-09-04-multi-project-delivery-ops-weekly-meeting/meeting-minutes.md','2026-09-04（会议日期暂记）','项目现场自报、月目标、责任及相对节点；不等同客户验收或财务确认'),
('S3','3 SPU 能力与本周动态','work/2026-09-04-smart-canteen-3-spu-capability-system/README.md','2026-09-04','105功能/30关系/32设备集成/24标准建设/13动态，均为资料条目，不是本周上线功能数'),
('S4','产品每周归类','work/2026-09-04-smart-canteen-3-spu-capability-system/weekly-classification.csv','2026-09-04','三全支付用户确认上线；其他多项为代码/方案阶段，真机验收未补'),
('S5','央美差异与估时','modules/presales-bidding/customer-projects/cafa-other-logistics-equipment-20260831/deliverables/cafa-unfinished-work-and-estimate.md','2026-09-04','11条差异归并10包，49/76/123人日为假设估算，非正式承诺'),
('S6','央美当前流程边界','modules/presales-bidding/customer-projects/cafa-other-logistics-equipment-20260831/deliverables/cafa-meal-flow-alternative-exception-inventory.md','2026-09-04','最新用户确认当前无卡码脸能力；入口、离线规则待冻结，DoR BLOCKED'),
('S7','保盘硬件周报','work/weekly-reports/2026-W36/baopan-hardware-weekly-report/source-summary.md','2026-09-04','会议+代码变更资料；对应企微表未回读，不能据此宣称硬件全验收'),
('S8','上周周报及等保承诺','work/weekly-reports/2026-W35/jack-weekly-report-20260824-20260830/source-summary.md','2026-08-28/29','9/6备案证、9/25测评报告是争取目标，未见取得证据'),
('S9','满客宝官方产品体系','https://www.mankebao.com/product/','检索于2026-09-05','官方产品定位：结算、营养、食安、进销存、多终端；不采用宣传效益数字'),
('S10','满客宝官方实施支持','https://www.mankebao.com/html/help/','检索于2026-09-05','项目/产品/研发协同实施的公开描述；不代表其内部周报或KPI制度')]
conclusions=[
('交付：下周优先拿到验收证据，保住 9 月关键节点。','9 月会议目标为交付20个项目、600万元；当前没有可汇总的已验收项目数和对应金额，达成率暂不可计算。央美、滨州要从现场收尾进入确认，哈尔滨要守住9/15联调、9/22交付。'),
('产研：本周增量集中在前厅，后续资源转向跨端验证和标准版本。','原稿96项中明确完成68项（70.8%），仍有28项未闭环。3 SPU体系已形成105条功能定义，但这不是105项已发布能力；食安、进销存部分端缺少本周新增证据。'),
('协同：用一份范围、一组版本、一个验收口径连接产研与交付。','三全支付宝付款码已获用户确认上线，退款对账仍待补；央美运营自报与合同差异并存；硬件有代码修复但缺真机回归。新增需求先判定标配、配置、定制，再决定排期与成本。')]
# name, month, this, gap, next, owner, deadline, gate, source
projects=[
('哈尔滨膳质舍','9/15完成系统上线/联调；9/15—22跟餐；9/22整体交付（会议目标）','完成主从机和小程序部署、体检机阶段测试；体检指标接口及炒菜机器人方案继续推进。','到货与安装路径紧；手机/PC展示、机器人与部署安全验收仍未贯通。设备单点测试不能证明完整健康服务闭环。','锁定人货场网与每日倒排；完成一条“体测→健康档案→营养分析→手机/PC展示”联调记录；冻结机器人报文与异常恢复范围。','海宇/赵野统筹；李潇、兰海军、郭东伟配合','建议9/7锁路径；9/13前完成上线预检','关键设备齐套、阻断项有关闭凭证；未通过项明确责任人与补救日，9/15节点重新评估。','S1/S2/S4'),
('中央美院','运营与合同验收分开管理；9月合同收口节点待重新确认','会议记录20台410、2台绑盘机、13块大屏及8路摄像头等联调，消费主流程被报告通过；差异表11条归并10包。','最新用户确认当前无卡/码/脸能力；实际识别入口、离线扣费等规则未冻结。具备运营条件的自报不能覆盖合同全范围。','先用2个工作日对10包逐项演示，拆清“缺功能/缺验证/缺证明”；锁定现有入口；完成培训与跟场；重新签认开发和验收节点。','玉龙/赵野；产品与研发联合核验','建议9/7—8核差距；9/11前签排期','10包每包有版本、现场事实、剩余量和责任人；当前入口确认后才能判端到端通过。','S2/S5/S6'),
('四方达','下周试运行、下下周正式切换（会议目标）','补贴核算明细、一键补贴及自动审核等已完成；项目测试完成，待客户试运行配合。','功能上线与客户正式切换不同步；试运行记录、账单核对与问题关闭尚未齐备。','按会议“下周三”组织两部门试运行，跟场2天；补贴发放、消费、结余逐项对账，形成切换与回退清单。','赵野；研发配合','暂排9/9起（按9/4会议推算，待确认）','试运行记录、问题关闭与客户切换确认齐备，再安排正式切换。','S1/S2'),
('滨州健康科技职业学院','9月完成开学保障收尾并转稳定运维','完成跟餐、学生指导、账号处理与410培训；换卡MQ/失败补偿、补单/菜谱复制等有完成记录。','扫码器不稳定、人脸支付偶发错误仍靠重启规避；营养历史数据和锁卡离线矩阵缺关闭证据。','补受影响设备与订单范围；复现并验证同步/锁卡/补传/不重扣；完成营养数据抽检及撤场交接。','世伟/金洋；兰海军、郭东伟配合','建议9/11形成复测；9/13前交接','永久措施有复测，未关闭项有留守及升级安排；重启不作为关闭标准。','S1/S2/S4/S7'),
('重庆环卫','主要交付1周、整体1—2周（相对节点待确认）','已达到进场标准，多端隐藏调整已完成；450/410推荐量与取用量仍有计划项。','需求反复变更，周期和费用可能继续增加；设备字段接入不等于各型号现场验收。','冻结本轮交付范围与超范围计费；对450/410推荐量、累计取用量、隐藏项逐设备复测，完成主要交付。','玉龙/赵野；郭东伟、赖清涛配合','建议9/7锁范围；9/13前验主要项','按冻结清单签收；追加需求有工期/费用确认，设备测试有型号与版本。','S1/S2/S4'),
('三全','9月先锁定阶段交付基线，再按模块验收','蓝图V1.4及进销存/结算蓝皮书形成；9/4任务中用户确认支付宝付款码本周上线，两仓发布分支已含功能。','客户内部范围仍在讨论；支付上线缺现场交易、退款对账证据；钉钉/魔点/商米/食安依赖未全闭环。','确认蓝图范围与阶段签字；支付补小额交易、退款、对账和版本证据；列出其他接口联调结果与剩余阻断。','赵野/李潇；赖清涛、尹旭亮','建议9/9冻结范围；9/13前补支付验收','已上线支付和待联调模块分开签认；接口清单逐项有结论，不笼统报整体完成。','S1/S2/S4'),
('安徽体职院','9/8为30台动感单车目标节点；节点含义待确认','30台硬件安装任务已明确；当前材料未证明全部到货安装。','人员、现场联系人、差旅与安装费用未落定；9/8是到货/安装/验收尚有歧义。','9/7确认人员、费用和节点定义；按30台编号完成安装、通电/功能测试和客户签收，不能到位则当天升级。','海宇/赵野；商务财务支持','9/8原目标；9/7为建议前置截止','30台清单与测试逐台对应，差旅/安装预算和客户确认可回读。','S2'),
('富士康','34个摄像头＋留样秤，6天交付；起止日未冻结','34点位与留样秤交付范围进入排程，并开展综合布线方案测算。','6天没有明确起点，点位、线材和现场条件未形成可验倒排；不能承诺9/13一定交完。','确认进场、点位/布线/设备到货及预算；形成6天倒排表并执行首个里程碑；现场未就绪先关闭前置条件。','海宇；现场负责人待指定','进场前；建议9/7锁定起止日','34点位和留样秤分别有安装、网络、联调、客户验收标准。','S2'),
('江西体科医','9/24或9/28上线，正式口径待统一','医务侧提供服务器的责任已明确，项目进入部署前置准备。','两处日期矛盾，服务器交付日未锁；会影响研发发布和现场资源安排。','书面确认试运行与正式上线日期；核验服务器交付日及配置，形成部署/联调/培训倒排。','劲玮；客户医务侧','建议9/7确认；9/11前准备清单齐备','上线节点唯一、服务器责任和日期明确；本周不记为上线完成。','S2'),
('金斯瑞','到货后约3天完成安装；9月具体日待物流确认','取餐柜后续安装任务明确，正在安排南京/安徽行程。','物流单号和到货日缺失，人员可能空跑，周期无法可靠起算。','取得物流与到货确认后排人；到货后按3天安装测试计划执行，未到货则明确新节点与影响。','金洋/赵野','出发前；建议9/7完成物流核实','物流、人员到场、安装测试和签收四项关联，未签收不计交付。','S2'),
('城市副中心','9月关闭遗留功能及设备风险，稳定转运维','PAD培训和物理交付已有记录，功能上线范围待核；原稿排菜终端仍处计划状态。','PAD功能未上线；伟邦设备黑屏、口水罩划手未精确定位；“硬件交付”掩盖功能与安全欠项。','定位问题设备并记录照片/型号；按原因修复复测，明确PAD功能上线与客户确认节点。','赵野；尹旭亮配合','建议9/11复测；9/13关闭或升级','问题到设备、措施、结果和客户确认；功能未上线不得把PAD项整体关闭。','S1/S2'),
('北体大','9月形成稳定识别方案；培训安排在9/15以后','少数人脸误识别被归因于相似度与采集规范，阈值调整方案尚未获客户同意。','提高阈值可能增加识别耗时；当前无误识别率和耗时对照，根因判断仍需数据验证。','组织规范采集与阈值对照测试，同时记录误识别、拒识和耗时；与客户确认方案及培训安排。','令颖/赵野','下周方案会；建议9/11前','同场样本与配置可比、数据完整、客户书面确认；不给未经测试的准确率承诺。','S2'),
('张家港','9月排定接口与交付里程碑','原稿列入接口方案/开发联调；交付周会仍记录未安排现场交付。','研发计划与交付资源未形成同一时间表，开始/完成日与前置条件缺失。','产品、接口方与交付联合确认范围、联调窗口、资源、进场条件及验收人。','李潇/赵野','建议9/11前','一份联合排期有开始/完成日、唯一负责人和验收条件。','S1/S2')]
# SPU, end, this, gap, next, month, project, owner, source
products=[
('前厅营养结算与健康管理','PC端','完成补单、补贴核算/一键补贴/自动审核、订单接口修复及图片尺寸规范；新增能力清单统一归类。','营养历史数据与消费限制未收口；跨项目版本及退款/结余对账证据不全。','完成历史数据范围定位、样本抽检及消费限制规则确认；冻结前厅标准版功能与项目差异清单。','9月建议：形成带版本号、回归结果、发布说明的前厅标准基线，项目特配可识别。','四方达/滨州/三全','产品组＋两个开发组','S1/S3/S4'),
('前厅营养结算与健康管理','移动端','哈尔滨小程序部署完成；体检指标接口和健康档案集成继续推进。','企业微信小程序首次支付错误未闭环；手机端体测展示、央美手机管理端仍有缺项。','复现并修复首次支付错误；完成哈尔滨体测→健康档案→手机展示联调；央美手机端先冻结真实范围与排期。','9月建议：健康档案移动链路可演示、可回读；央美手机端按核验后排期承诺。','哈尔滨/央美','李潇/兰海军/郭东伟','S1/S4/S5'),
('前厅营养结算与健康管理','大屏端','营养大屏改版评审与5个竞品分析完成；央美13块大屏有部署联调自报。','设计评审与屏幕安装并不证明营养数据正确；滨州前厅大屏仍待确认。','确认营养、消费、体测指标口径与页面；选取滨州/哈尔滨真实样例比对后台与大屏。','9月建议：形成一套可配置营养看板，字段、口径及样例验收齐备。','滨州/哈尔滨/央美','李潇/孙海琴；研发配合','S1/S2'),
('前厅营养结算与健康管理','设备端','三全支付宝付款码用户确认上线；绑盘同步增加分页与三段耗时日志；人脸、离线启动、AI识别分类/相机、累计取用量有代码改动。','支付退款对账、锁卡离线、补传不重扣、不同型号回归仍缺；AI识别现有修复与新增识别项目排期要区分。','补支付与同步/断网回归；450/460逃单迁移、离线手动同步先明确排期；体检机/机器人分别做真机验证。','9月建议：固化消费机/绑盘/称重兼容矩阵和异常恢复基线；新增AI识别未排期项单列。','三全/滨州/哈尔滨/重庆','赖清涛/尹旭亮；硬件团队','S1/S4/S7'),
('智慧食安监管','PC端','完成食安敏感数据清理、央美食安问题修复，明确三版本能力边界。','版本边界已整理，但初始样式优化、项目复测及部署验证尚未全部关闭。','完成初始样式与版本菜单核对；将央美/三全食安问题映射到标准版回归清单。','9月建议：冻结可部署食安版本，预警→处理→复核证据完整。','央美/三全','孙倩倩/赖清涛；产品配合','S1/S3'),
('智慧食安监管','移动端','已纳入3 SPU四端能力体系；未找到本周独立业务增量的验收证据。','不能把跨端部署控制台的移动适配当成食安业务移动端上线。','建议选定巡检/整改回传最小流程，明确已有能力、项目验证人与缺口；未排期功能不作上线承诺。','9月建议：确认移动端首个可交付闭环与版本排期。','首个验证项目待产品确认','产品组/孙倩倩（建议）','S3/S4'),
('智慧食安监管','大屏端','能力体系已归类监管大屏；本周无独立业务上线证据。','设备安装和页面方案不能替代实时监管数据验收。','建议冻结告警、处置、设备在线状态的指标口径与数据源，选一项目完成屏端/后台一致性核对。','9月建议：形成监管大屏最小版本与样例证据。','验证项目待定','产品组/孙倩倩（建议）','S3'),
('智慧食安监管','设备端','央美AI盒子、8路摄像头部署联调有会议自报；完成3家硬件厂商调研。','部署自报不能证明识别效果；富士康34摄像头和留样秤仍在交付准备。','按设备型号核对摄像头/AI盒子/留样秤接入，逐项留下事件上报、后台可见、断线恢复证据。','9月建议：固化食安设备接入与验收模板，先以有条件项目验证。','央美/富士康/三全','海宇/玉龙；食安研发配合','S1/S2/S3'),
('智慧进销存与后厨运营','PC端','标准版完成周复制/批量排菜；三全业务蓝图V1.4与进销存结算范围梳理形成，机器人范围/业务表映射更新。','三全范围未冻结；机器人还在方案阶段，菜单到采购库存的完整链路缺验证。','冻结三全范围；完成菜单→食材需求→采购/库存最小样例与差异清单；机器人报文、错误码、幂等规则单独确认。','9月建议：形成后厨标准流程基线；机器人按独立集成版本验证。','三全/哈尔滨','李潇/兰海军；接口团队','S1/S2/S4'),
('智慧进销存与后厨运营','移动端','旧宫中学完成进销存及手持机培训、网络/打印修复；本周无新移动版本发布证据。','培训是存量使用交付；移动收货、出入库的标准操作和同版本测试待补。','建议把手持收货/出入库/打印流程录为检查单；区分已实现与需开发项。','9月建议：移动收货/库存操作形成可复用培训与验收包。','旧宫中学；验证场景待确认','交付负责人待定；产品配合','S2/S3'),
('智慧进销存与后厨运营','大屏端','已纳入后厨运营大屏能力目录；本周未找到独立新增事实。','经营指标和实时数据接入状态未证实，不能写已具备完整成本分析。','建议确认库存、采购、成本指标定义及数据源，优先输出范围和排期，不默认下周完成开发。','9月建议：确定经营看板V1范围、数据来源和验收样例。','三全（建议验证场景）','产品组（建议）；研发待排期','S3'),
('智慧进销存与后厨运营','设备端','TC-40EA炒菜机器人接口范围与表映射更新；哈尔滨相关设备已列入统一集成目录。','厂商协议、任务下发/回执、异常恢复与真机联调尚未闭环。','锁定机器人接口与联调窗口；验证菜谱工艺→任务下发→执行回执一条链路，失败与重复执行单独记录。','9月建议：形成可复用适配候选与真机报告；项目验证通过后再升级标品。','哈尔滨','兰海军/厂商；李潇确认范围','S1/S4')]
standards=[
('版本与质量','3 SPU形成105条功能、30条项目关系、32类设备集成与24项标准建设条目；不是全部成熟上线。','建议9/11前冻结三SPU本期版本/项目差异矩阵，28项遗留逐项标明关闭、延期或暂停原因。','9月建议：每个发布包都有范围、版本、测试、回滚与验收证据。','产品组＋研发组长','S1/S3'),
('私有化与一键部署','一键部署包V1.0.0有完成记录；食安可视化部署中心16项测试通过，海光/openEuler实机待验。','建议9/13前在获准测试环境做一次部署和回滚，记录耗时与失败点；关闭哈尔滨发布前阻断。','9月建议：选定一个标准环境完成可重复部署与回滚，不承诺尚未验证的兼容性。','赖清涛/尹旭亮/孙倩倩','S1/S4'),
('等保与软著','本周材料未证明新增证书或新增软著申请；8月遗留9/6电子备案证、9/25测评报告争取目标。','9/7核实9/6节点实际结果，整改/材料/用章/测評责任逐项落实；更新9/25依赖与软著原件台账。','9/25测评报告沿用争取目标；外部签发无证据不写取得。','王朔/赖清涛；机构与甲方配合','S1/S4/S8'),
('产品资料与交付资产','原稿记录534道菜、5276条食材、534张图片及公文安全编辑Skill；资料产出不等同准确率或省时效果。','建议9/13前按三SPU统一PPT/参数/功能清单/部署说明/培训资料入口；抽样核对营养数据质量。','9月建议：形成有版本的销售与交付包；补复用次数、交付工时和质量基线。','产品组；交付团队配合','S1/S3')]
monthly=[
('交付规模','20个项目/月（9/4会议目标）','已验收项目数未提供；无法计算达成率','下周按唯一项目编号回收签收/验收凭证；确定9月剩余验收清单与主责。','会议目标；完成统计待补'),
('交付金额','600万元/月；四个月2200万元，口径冲突','600×4为2400万元，差200万元；金额定义与实际累计未确认','建议9/7由管理/商务财务确认月目标和合同/验收/回款口径；不以交付设备数折算收入。','目标待校准'),
('关键交付节点','哈尔滨9/15联调、9/22交付；安徽9/8；江西9/24或9/28','哈尔滨端到端未齐；安徽资源未锁；江西日期不一','下周先关闭人货场网、接口、版本和验收前置项，明确节点可达性。','项目目标见来源及待确认项'),
('产研标准化','未找到已批准的9月三SPU量化目标','本周已建立能力目录；多个项目仍处验证阶段','建议9/11前确认三SPU×四端月末目标矩阵；9月底以可发布/可复用证据验收。','本报告建议，待负责人确认'),
('合规保障','9/6电子备案证、9/25测评报告（原争取目标）','未见签发证据；等保与软著仍有待闭环事项','下周核实9/6结果，明确整改材料/复测/签发关键路径。','沿用历史承诺，非已取得')]
metrics=[('产品组',44,34,21),('开发一组',17,13,16),('开发二组',35,21,19)]
for file,header,rows in [('project-deviations.csv',['项目','9月目标','本周事实','偏差影响','下周目标','负责人','时点','验收标准','来源'],projects),('product-four-end-weekly.csv',['SPU','端','本周事实','偏差','下周目标','9月建议目标','项目','负责人','来源'],products),('source-index.csv',['ID','名称','位置','日期','证据边界'],source_defs),('month-alignment.csv',['维度','9月目标','本周实际','下周目标','口径'],monthly)]:
 with (OUT/file).open('w',encoding='utf-8-sig',newline='') as f: w=csv.writer(f);w.writerow(header);w.writerows(rows)
# Reconciled against the user's live project master and linked implementation detail tables.
live=json.loads((OUT/'delivery-source-summary.json').read_text())
source_defs.extend([
 ('S11','交付实施部项目总表与9月组合',live['source_url'],'2026-09-05实时回读','53行/52条有名称；18交付阶段/16未标完成；9月无验收日期记录，不等于实际0验收；7条月度组合6待确认1暂停'),
 ('S12','10个重点项目关联明细','delivery-source-summary.json','2026-09-05实时回读','9份实施计划/总览＋哈尔滨12条跟踪；计划结果列不能当完成；另补央美实施进度'),
 ('S13','赵野与侯世伟当周个人周报',live['source_url'],'8/31—9/4','按周期筛选合计13条工作记录；其他人员当前周期未取得可用行，不用旧行填补')
])
conclusions[0]=('交付：16条在途交付记录需要收口，9月目标达成暂缺验收数据。','总表52条有名称记录中，18条处交付阶段，其中16条未标完成；已填金额的9条合计346.482万元，仅是部分在途项目金额。9月会议目标20个项目、600万元；本月验收日期记录为空，不能写达成率。哈尔滨9/15、9/22与总表9/23先统一。')
conclusions[2]=('协同：总表、实施计划、周会的范围与节点必须先对齐。','哈尔滨上线/交付日期冲突，央美总表仍为筹备但现场自报已联调，城市副中心已有PAD培训记录却仍存在功能欠项。三全总部基线未收口前，不把后续5基地复制计入完成；下一步每项都用版本和客户确认关闭。')
monthly[0]=('交付规模','20个项目/月（9/4会议目标）','总表18条交付阶段，16条未标完成；9月验收日期记录为空，实际累计仍待核实','下周逐项目回收签收/验收凭证，补录实际验收日；保留历史已完成项目，避免计入本月。','台账存量与月度成果分开')
monthly[1]=('交付金额','600万元/月；四个月2200万元，口径冲突','16条在途交付记录仅9条有项目金额，共346.482万元；该值非9月验收额/收入/回款','建议9/7统一目标口径，补其余金额和对应合同范围；按验收与回款日期分别统计。','金额缺失不记0；部分存量不可直接对比600万元')
monthly[2]=('关键交付节点','哈尔滨周会9/15联调、9/22交付；总表预期9/23上线','哈尔滨合同30天起算条件待确认；安徽体职院9/8节点和江西9/24或28仍需明确','建议9/7统一哈尔滨D0及两个表的节点定义；冻结本月可兑现的交付排期。','三来源冲突必须责任人签认')
monthly[3]=('产研与项目组合','9月三轴组合已有7项：6待确认、1暂停','哈尔滨/安徽武警/四方达/滨州/C08/食安整改已有月度方向；三SPU量化目标仍无批准基线','下周先确认6项的版本、范围和里程碑；暂停的案例PPT只保留范围校核，未通过不批量制作。','已有月方向不等同已批准计划；四端目标为建议')
# Refine existing project facts using live master and actual dated weekly rows.
for k,r in enumerate(projects):
 r=list(r)
 if r[0]=='哈尔滨膳质舍':
  r[1]='周会9/15联调、9/22交付；总表9/23上线；合同30天起算条件待确认'
  r[3]='总表预期9/23上线，与9/4周会9/15联调、9/22交付冲突；明细仍有到货/接口待确认项。需先锁合同D0、付款、现场与版本，再判节点能否兑现。'
  r[4]='9/7先统一合同起算日、上线与交付定义；更新总表和明细；锁人货场网倒排，完成体测→档案→手机/PC展示联调，机器人另列接口与到货门槛。'
 if r[0]=='中央美院':
  r[3]='总表仍标筹备中、预计8/20上线；实施计划的卡/脸步骤状态为空，最新用户确认当前无卡/码/脸。明细的安装状态仍停留在待安装/待部署；周会13块屏与设备明细2块数据大屏的统计范围不同，须核对是否包含餐线屏。现场可运营自报不覆盖合同差异，需同版本逐项核验。'
 if r[0]=='四方达':
  r[2]+=' 本周个人周报确认终端入网、消费触发补贴测试及上线推进会。'
  r[3]='总表预期8/14、实施计划仍有域名/端口未完成项，与本周测试记录及下周试运行计划未同步。需查明哪些旧阻断已解决，补试运行与账单证据。'
 if r[0]=='滨州健康科技职业学院':
  r[2]+=' 当周个人周报补充消费机升级处理APP闪退。'
  r[3]+=' 明细按实际预付款T0+30天，T0单元格注明示例，不能照抄为真实合同截止日。'
 if r[0]=='三全':
  r[3]='总部基地为当前实施范围，其余5基地未启动；明细仍有无线网、食安点位、返厂设备和接口待确认项，支付宝“对接中”旧描述未随9/4上线确认更新。'
  r[4]='冻结总部基地标准范围和首轮验收；更新支付宝状态并补退款对账；明确无线网/食安点位/设备返厂节点。6基地17平台外采对接先独立评估，不并入标配承诺。'
 if r[0]=='金斯瑞':r[3]+=' 明细仍保留3—4月计划，总表预期7/22；下周重排真实到货与安装基线。'
 if r[0]=='城市副中心':
  r[2]='当周个人周报记录PAD培训、新版大屏检查与回访；同时处理屏幕失灵和口水罩划手。总表仍是交付阶段进行中。'
  r[3]='周会称PAD功能未上线，但个人周报已有PAD培训；应逐功能核对，不能笼统全未上线。明细保留升级/称重问题，状态空白，需查清已修与未修。'
 if r[0]=='安徽体职院':r[3]+=' 总表同院校旧项目已在7月终验，本次30台安装需单独确认合同/批次，不能覆写旧验收状态。'
 r[8]+='/S11/S12/S13';projects[k]=tuple(r)
projects.extend([
 ('安徽武警部队','9月组合：关闭12项前置决策后按6任务依赖实施；144工时为表内计划量','明细有8/18—19需求调研记录；9月组合仍待确认、里程碑红色，本周原稿列为未闭环。','生日授权、加餐、带量公式、身份、排班、硬件/内网等边界未冻结；不得与安徽体职院30台单车合并。','逐项关闭12项前置决策，确认哪些可进入开发；形成依赖排序和验收人，重排已过9/2的台账里程碑。','李潇/赖清涛；侯世伟/赵野','建议9/9前决策评审，9/11前锁基线','12项决策均有明确结果；剩余待定项不得计入已确认开发承诺。','S1/S11/S12'),
 ('国信智慧食堂','9月目标：核验存量上线结果，明确验收剩余范围（建议）','总表为交付阶段进行中，预期上线日仍为7/1；实施计划存在结算/食安/进销存与小程序等范围。','实施计划多行状态为空，“交付结果”是计划产物；没有本周新增完成证据，不能用旧日期直接计算实际延期。','产品与交付逐项核定当前版本、范围和客户待办；保留免费/付费/不支持分类，补真实上线、验收日期及下一节点。','柴玉龙/赵野；李潇配合','建议9/11前形成剩余范围清单','每项已有能力附验证证据，未完成项有责任与截止，客户认可验收范围。','S11/S12')
])
meeting_rows=[
 ('共同经营目标','会议提出每人每月4项目、团队20项目/600万元、四个月80项目/2200万元；本周已形成目标，尚非实际结果。','600×4=2400与2200冲突；20÷4隐含5个计入岗位，本次名单8人，考核适用范围不清。','建议9/7前统一金额口径、计入岗位和唯一主责；每个项目以验收日期与凭证计数，协同贡献另列。','数科业务中心＋交付实施部；商务财务支持','月目标、适用人员、项目计数和金额定义一页签认。'),
 ('需求交接与定制范围','三全蓝皮书已提交客户；海宇会上承诺输出大庆油田开发估时及定制化比例，本次未取得已发出的回执。','客户范围、标配/配置/定制未一一对应；超范围追加会改变周期和成本。','下周确认大庆估时是否已发并回读依据；三全/重庆按版本冻结范围，新增需求同步确认工期和费用。','海宇/李潇负责范围；研发估时；赵野/商务确认交付与费用','每项定制有差异依据、估算假设、客户确认及开发/交付边界。'),
 ('关键项目资源支持','周会明确哈尔滨9/15联调、安徽体职院9/8、富士康6天、金斯瑞到货后3天等目标。','人货场网、到货、差旅与安装费尚未全部落实；哈尔滨与江西日期口径仍有冲突。','建议9/7优先统一哈尔滨与江西日期；锁安徽安装资源；金斯瑞拿到物流再出发；富士康进场前完成6天倒排。','海宇/劲玮/金洋/赵野；采购、商务、财务及客户配合','排期有人、设备、场地、预算和验收五项前置；不可达节点当天升级。'),
 ('运营、验收与售后交接','央美达到可运营条件的自报、滨州跟餐收尾、C08运维问题均已识别；会议要求讲目标、结果、偏差、方案和完成日。','试运行、设备安装、培训和终验混在一起；临时重启规避故障缺永久解决证据。','下周按范围完成、主流程、培训、问题关闭、客户签收分层验收；现场撤场时移交剩余风险、责任人和远程支持安排。','柴玉龙/侯世伟/王金洋/赵野；产研提供复测与版本证据','运营可用和合同终验分别有结论；重启或临时绕行不计故障关闭。'),
 ('产品版本与标准交付资产','会议要求明确运动员版、教学版、团餐版的边界，并补商户号注册、证书及配置培训。','场景版本与三SPU的关系、标准功能及不可承诺项不清；现场配置仍依赖个人经验。','下周先形成场景版本到3 SPU四端的映射及交付检查单；安排一次商户配置演示，形成文档和问答。','劲玮/产品团队；赵野协调交付培训','三类场景版本不改写三SPU分类；边界矩阵和培训材料可复用。'),
 ('售前与维修单独管理','会议安排令颖在9/14—18支持固安宣武医院团餐售前，北体大9/15后培训；仙龙潭维修目标为下周。','售前、培训、维修不能重复计为新交付项目；上海崇明费用合同和维修配件仍有依赖。','下周备齐医院售前方案/演示及问题清单；确认北体大培训对象；追踪维修配件并完成复测；上海设备先明确费用承担。','令颖/赵野；王金洋、商务及厂商配合','售前有客户问题和下一步，维修有复测确认，培训有签到材料，分别计量。')
]

# Existing product cells remain 3×4; add current client evidence rather than expanding product lines.
products[1]=tuple(list(products[1][:2])+[products[1][2]+' C08当周有PAD培训记录，具体功能上线范围待核。']+list(products[1][3:]))
products[8]=tuple(list(products[8][:3])+['三全总部先行、其余5基地未启动；6基地17外采平台/RPA等是待确认定制需求，不计入标准进销存完成。']+list(products[8][4:]))
# Rewrite normalized tables after reconciliation.
for file,header,data in [('project-deviations.csv',['项目','9月目标','本周事实','偏差影响','下周目标','负责人','时点','验收标准','来源'],projects),('product-four-end-weekly.csv',['SPU','端','本周事实','偏差','下周目标','9月建议目标','项目','负责人','来源'],products),('source-index.csv',['ID','名称','位置','日期','证据边界'],source_defs),('month-alignment.csv',['维度','9月目标','本周实际','下周目标','口径'],monthly)]:
 with (OUT/file).open('w',encoding='utf-8-sig',newline='') as f:
  w=csv.writer(f);w.writerow(header);w.writerows(data)

# Evidence counts are audited, not inferred from directory names.
counts={}
base=ROOT/'work/2026-09-04-smart-canteen-3-spu-capability-system'
for f,expected in [('capability-master.csv',105),('project-application-map.csv',30),('device-integration.csv',32),('standard-product-build.csv',24),('weekly-classification.csv',13)]:
 rows=list(csv.DictReader((base/f).open(encoding='utf-8-sig')));counts[f]=len(rows);assert len(rows)==expected,(f,len(rows))
assert len(products)==12 and len(set((x[0],x[1]) for x in products))==12
assert sum(x[1] for x in metrics)==96 and sum(x[2] for x in metrics)==68 and sum(x[3] for x in metrics)==56
# Editable spreadsheet. Template's project/product information groups retained; empty historical content not carried forward.
wb=xlsxwriter.Workbook(OUT/'产研与交付周报_20260831-0906.xlsx')
wb.set_properties({'title':'产研与交付周报 2026-W36','author':'数字技术中心','comments':'本周蓝色；下周橙色；截至2026-09-05的已读材料。'})
colors={'ink':'243347','muted':'596779','blue':'1557A0','bluebg':'EAF3FF','orange':'A9460B','orangebg':'FFF0DF','line':'DFE5EC','navy':'172E47'}
def fmt(**kw):return wb.add_format({'font_name':'微软雅黑','font_size':12,'font_color':colors['ink'],'text_wrap':True,'valign':'top',**kw})
body=fmt(border=1,border_color=colors['line']);blue=fmt(border=1,border_color=colors['line'],bg_color=colors['bluebg'],font_color=colors['blue']);orange=fmt(border=1,border_color=colors['line'],bg_color=colors['orangebg'],font_color=colors['orange']);head=fmt(bold=True,bg_color=colors['navy'],font_color='FFFFFF',border=1,border_color=colors['navy']);title=fmt(bold=True,bg_color='FFFFFF');note=fmt(font_color=colors['muted']);pct=fmt(border=1,border_color=colors['line'],num_format='0.0%');num=fmt(border=1,border_color=colors['line'],num_format='0');
def sheet(name,title_text,headers,rows,bluecols=(),orangecols=(),widths=None):
 ws=wb.add_worksheet(name);n=len(headers);ws.hide_gridlines(2);ws.set_tab_color(colors['blue'] if name=='产品' else colors['orange'] if name=='项目' else colors['navy']);ws.merge_range(0,0,0,n-1,title_text,title);ws.set_row(0,32);ws.merge_range(1,0,1,n-1,'本周 08/31—09/06｜下周 09/07—09/13｜截至09/05已读材料；蓝色＝本周事实，橙色＝下周目标；建议目标未经排期签认。',note);ws.set_row(1,42)
 for j,h in enumerate(headers):ws.write(3,j,h,blue if j in bluecols else orange if j in orangecols else head);ws.set_column(j,j,(widths or [24]*n)[j])
 ws.set_row(3,32)
 for i,row in enumerate(rows,4):
  for j,v in enumerate(row):
   ws.write(i,j,v,blue if j in bluecols else orange if j in orangecols else body)
   if isinstance(v,str) and ('S1' in str(row[-1]) or name in ['产品','项目']):ws.write_comment(i,j,'来源编号见来源索引。计划、建议与现状已分列；未回验事项保留证据边界。')
  height=max(48,min(330,max((len(str(v))/max((widths or [24]*n)[j]*0.60,8)+1)*19 for j,v in enumerate(row))))
  ws.set_row(i,height)
 ws.freeze_panes(4,1);ws.autofilter(3,0,3+len(rows),n-1);ws.repeat_rows(0,3);ws.set_landscape();ws.set_paper(8);ws.fit_to_pages(1,0);ws.set_margins(.25,.25,.4,.4);ws.set_footer('&L产研与交付周报 · 内部汇报&R第 &P 页');ws.print_area(0,0,3+len(rows),n-1)
 if name=='项目':ws.set_h_pagebreaks([9,14])
 if name=='产品':ws.set_h_pagebreaks([8,12])
 return ws
summaryrows=[(a,b) for a,b in conclusions]+[('下周执行顺序','先锁月目标与项目范围 → 保安徽/哈尔滨等关键节点 → 收央美/滨州等尾项 → 验三全支付/健康链路 → 发布标准版本。'),('必须补齐的数据','9月已验收项目数、对应合同额/验收额/回款额、准时验收率、缺陷重开数、交付人天与预算偏差；当前均不具备完整可计算底表。'),('同行参考与使用边界','满客宝公开产品与实施资料支持平台化、多终端、场景化及项目/产品/研发协同的视角；本文指标与组织建议由本任务提出，不宣称是其内部KPI。')]
sheet('管理摘要','数字技术中心｜产研与交付周报', ['结论','依据与行动'],summaryrows,widths=[40,112])
sheet('9月目标','9月目标对齐｜已知承诺与建议分开', ['维度','9月目标','本周实际','下周目标','口径'],monthly,bluecols=[2],orangecols=[3],widths=[20,40,48,60,28])
sheet('周会协同','数科业务中心 × 交付实施部｜会议共识与下周行动', ['协同主线','本周会议结论/事实','当前偏差','下周共同目标','责任与支持','关闭标准'],meeting_rows,bluecols=[1],orangecols=[3],widths=[22,48,42,56,36,44])
sheet('项目','交付中心｜关键项目的偏差、纠偏与验收', ['项目','9月目标/阶段','本周结果','偏差及影响','下周目标/纠偏','责任人','完成时点','验收门槛','来源'],projects,bluecols=[2],orangecols=[4,6],widths=[20,27,38,44,48,20,25,38,14])
sheet('产品','产研中心｜3 SPU × 4端', ['SPU','端','本周增量','当前差距','下周目标','9月建议目标','项目验证','责任人','来源'],products,bluecols=[2],orangecols=[4],widths=[23,10,45,36,48,36,22,23,14])
sheet('标准产品建设','跨SPU底座｜版本、部署、合规与交付资产', ['建设域','本周成果','下周目标','9月目标/建议','负责人','来源'],standards,bluecols=[1],orangecols=[2],widths=[26,65,72,60,30,16])
ws=sheet('数据口径','产研任务数据｜来源为附件汇总，未回读三组原始行', ['组别','登记事项','明确完成','未闭环','完成率','下周原计划'],[],widths=[25,20,20,20,20,24])
for i,(g,t,d,n) in enumerate(metrics,4):
 ws.write(i,0,g,body);ws.write_number(i,1,t,num);ws.write_number(i,2,d,num);ws.write_formula(i,3,f'=B{i+1}-C{i+1}',num,t-d);ws.write_formula(i,4,f'=C{i+1}/B{i+1}',pct,d/t);ws.write_number(i,5,n,num);ws.set_row(i,30)
for j in [1,2,3,5]:ws.write_formula(7,j,f'=SUM({chr(65+j)}5:{chr(65+j)}7)',num,{1:96,2:68,3:28,5:56}[j])
ws.write(7,0,'合计',head);ws.write_formula(7,4,'=C8/B8',pct,68/96);ws.set_row(7,32)
notes=['统计对象是事项行，不是项目数、独立功能数或人日产能；跨组事项可能重叠。','28项未闭环：进行中15、计划/未开始11、暂停2。56项为原始下周计划，不表示56项全为新增。','未闭环与下周计划缺逐条映射，不能直接相加为84项；本版不宣称已重新逐行统计。','开发二组遗留14项，占全部遗留的一半；仅说明收口需要协调，不能据此评价个人效率或质量。','能力体系：105条功能、30条项目关系、32类设备集成、24项标准建设、13条周动态；本次CSV行数已回读。','未来跟踪：按期验收率=按承诺日验收项目/当期应验收项目；成本偏差=实际人天或费用−预算；两者暂无完整底表。']
for i,v in enumerate(notes,10):ws.merge_range(i,0,i,5,v,note);ws.set_row(i,46)
ws.autofilter(3,0,7,5);ws.print_area(0,0,15,5)
portfolio_rows=[[r['项目名称'],r['项目阶段'] or '未填',r['总表状态'] or '未填',r['总表预期上线日'] or '未填',r['总表验收日'] or '未填',r['总表验收状态'] or '未填',r['总表交付负责人'] or '待指定',r['明细链接'] or '无有效明细链接'] for r in live['portfolio']]
sheet('项目总览','总表52条有名称记录｜存量快照，非本周业绩', ['项目','阶段','状态','预期上线日','验收日','验收状态','交付负责人','明细链接'],portfolio_rows,widths=[42,20,18,24,24,24,30,64])
sheet('来源索引','来源与状态冲突处理', ['ID','来源','位置','日期','边界'],source_defs,widths=[10,35,92,26,68])
wb.close()
# Webpage route based on pakco template; styles inlined for portable delivery.
esc=html.escape
basecss=(Path('/Users/jack/code/099-github/pakco-html/assets/base.css')).read_text()
themecss=(Path('/Users/jack/code/099-github/pakco-html/assets/themes/minimal-white.css')).read_text()
# Avoid font/network dependencies in the standalone report.
import re
basecss=re.sub(r'@import\s+[^;]+;','',basecss)
css='''
:root{--bg:#F5F7FA;--text-1:#243347;--text-2:#566477;--text-3:#566477;--border:#DDE4ED;--accent:#1557A0;--blue:#1557A0;--blue-bg:#EAF3FF;--orange:#A9460B;--orange-bg:#FFF0DF;--surface:#FFFFFF;--radius:16px;--font-body:"PingFang SC","Microsoft YaHei",sans-serif;--font-display:var(--font-body)}
*{box-sizing:border-box}html{scroll-behavior:smooth}body.webpage{background:var(--bg);color:var(--text-1);font:16px/1.75 var(--font-body)}body.webpage .page{width:min(1344px,100%);max-width:1344px;margin:auto;padding:40px 38px 70px}section{margin-bottom:48px;scroll-margin-top:20px}.hero{padding:28px 0 10px}.kicker{font-size:12px;letter-spacing:.12em;color:var(--text-2);font-weight:700}.hero h1{font-size:clamp(30px,4vw,54px);line-height:1.18;margin:14px 0 20px;letter-spacing:-.03em}.lede{max-width:960px;font-size:19px;line-height:1.8;color:var(--text-2)}h2{font-size:28px;line-height:1.35;margin:10px 0 14px}h3{font-size:21px;line-height:1.5;margin:0 0 8px}h4{font-size:17px;margin:0 0 8px}p{margin:0 0 12px}.small{font-size:13px;color:var(--text-2)}.legend,.nav{display:flex;flex-wrap:wrap;gap:10px;margin:16px 0}.tag{padding:6px 12px;border-radius:8px;font-size:13px;font-weight:650}.this,.tag.this{background:var(--blue-bg);color:var(--blue)}.next,.tag.next{background:var(--orange-bg);color:var(--orange)}.nav a{color:var(--text-1);background:var(--surface);border:1px solid var(--border);border-radius:8px;padding:6px 14px;font-size:14px;text-decoration:none}.nav a:hover{border-color:var(--blue)}.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin:26px 0}.kpi{padding:20px;background:var(--surface);border-radius:var(--radius);border:1px solid var(--border)}.kpi strong{display:block;font-size:38px;font-weight:650;line-height:1.35}.kpi span{font-size:14px;color:var(--text-2)}.conclusion{padding:22px 26px;margin:12px 0;background:var(--surface);border:1px solid var(--border);border-left:4px solid var(--blue);border-radius:0 var(--radius) var(--radius) 0}.conclusion p{margin:0;color:var(--text-2)}.table-wrap{overflow-x:auto;border:1px solid var(--border);border-radius:12px;background:var(--surface)}table{border-collapse:collapse;width:100%;font-size:14px;line-height:1.7}th,td{text-align:left;vertical-align:top;padding:14px 16px;border-bottom:1px solid var(--border)}th{font-size:13px;background:var(--surface);color:var(--text-2)}td:first-child{font-weight:650}tr:last-child td{border-bottom:0}.month-table{min-width:850px}.project-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}.project-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:22px}.project-card .month{font-size:14px;color:var(--text-2);border-bottom:1px solid var(--border);padding-bottom:12px}.block{padding:14px 16px;border-radius:10px;margin:10px 0}.block p{margin:0;font-size:14px}.block b{display:block;font-size:13px;margin-bottom:5px}.gap{font-size:14px;margin:12px 0;color:var(--text-1)}.meta{font-size:12px;color:var(--text-2)}.spu{margin:24px 0 34px}.spu-head{display:flex;gap:14px;align-items:baseline;margin-bottom:14px}.spu-head span{font-size:12px;color:var(--text-2)}.end-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}.end-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:20px}.month-target{border-top:1px solid var(--border);padding-top:12px;font-size:13px;color:var(--text-2)}.standard-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px}details{background:var(--surface);border:1px solid var(--border);border-radius:12px;padding:18px;margin-top:16px}summary{cursor:pointer;font-weight:650}.src-list{font-size:13px;padding-left:22px}.src-list li{margin:12px 0;overflow-wrap:anywhere}.src-list a{color:var(--blue)}.page-footer{border-top:1px solid var(--border);padding-top:20px;font-size:12px;color:var(--text-2)}.method{font-size:14px;color:var(--text-2);max-width:1040px}.method a{color:var(--blue)}
@media(max-width:760px){body.webpage .page{padding:22px 18px 44px}.kpis{grid-template-columns:1fr 1fr;gap:10px}.kpi{padding:15px}.kpi strong{font-size:29px}.project-grid,.end-grid,.standard-grid{grid-template-columns:1fr}.hero{padding-top:10px}.lede{font-size:16px}.conclusion{padding:18px}h2{font-size:25px}.project-card,.end-card{padding:18px}.spu-head{display:block}.spu-head h3{margin-bottom:2px}}
@media print{body.webpage{background:white;font-size:10pt}body.webpage .page{max-width:none;width:100%;padding:0}.nav{display:none}.project-card,.end-card,.conclusion,.kpi{break-inside:avoid}.project-grid,.end-grid,.standard-grid{display:block}.project-card,.end-card{margin-bottom:14px}details{display:block}.table-wrap{overflow:visible}table{font-size:9pt}.month-table{min-width:0}section{margin-bottom:24px}*{-webkit-print-color-adjust:exact;print-color-adjust:exact}}
'''
def block(label,text,kind):return f'<div class="block {kind}"><b>{label}</b><p>{esc(text)}</p></div>'
parts=['<section class="hero"><p class="kicker">康比特数字技术中心 · WEEK 36</p><h1>把产品增量，变成<br>可验收的交付结果。</h1><p class="lede">本周完成了一批前厅功能和现场部署。下周的关键是收口跨端验证、合同差异与交付前置条件，保障 9 月项目节点，并形成可复用的标准版本。</p><p class="small">本周 2026.08.31—09.06 ｜ 下周 2026.09.07—09.13 ｜ 事实截至 09.05 已读取材料</p><div class="legend"><span class="tag this">蓝色 · 本周事实 / 已发生</span><span class="tag next">橙色 · 下周目标 / 待执行</span><span class="tag">产品月末目标标“建议”，不代替批准排期</span></div><nav class="nav" aria-label="周报导航"><a href="#summary">管理结论</a><a href="#month">9月对齐</a><a href="#meeting">周会协同</a><a href="#delivery">交付偏差</a><a href="#rnd">3 SPU四端</a><a href="#standard">标准产品建设</a><a href="#evidence">口径与来源</a></nav></section>']
parts.append('<section id="summary"><p class="kicker">01 / 管理结论</p><h2>先守交付节点，再把项目能力做成标品</h2><div class="kpis">'+''.join(f'<div class="kpi"><strong>{n}</strong><span>{t}</span></div>' for n,t in [('68 / 96','原稿明确完成事项 · 70.8%'),('28','原稿未闭环事项 · 需逐项收口'),('16条','交付阶段未标完成 · 存量'),('3 × 4','SPU与四端 · 按能力汇报')])+'</div>'+''.join(f'<article class="conclusion"><h3>{esc(a)}</h3><p>{esc(b)}</p></article>' for a,b in conclusions)+'<p class="small">完成率是原表事项状态口径，不是项目验收率、产品成熟度或个人效率排名。600万元目标仍有口径冲突，见下表。总表52条有名称记录＝18交付＋30售后＋3售前＋1筹备；18条交付中有2条已标完成。</p></section>')
parts.append('<section id="month"><p class="kicker">02 / 9月目标对齐</p><h2>月目标能否达成，先看证据与关键路径</h2><div class="table-wrap"><table class="month-table"><thead><tr>'+''.join(f'<th>{x}</th>' for x in ['维度','9月目标','本周实际','下周目标'])+'</tr></thead><tbody>'+''.join('<tr>'+''.join(f'<td class="{("this" if j==2 else "next" if j==3 else "")}">{esc(v)}</td>' for j,v in enumerate(row[:4]))+'</tr>' for row in monthly)+'</tbody></table></div><p class="small">项目数20/月、80/四个月一致；600万元/月与2200万元/四个月不一致。月度金额的确认与实际验收/回款数据均需商务财务补齐。不要将本周68项任务完成折算为9月交付完成。</p></section>')
parts.append('<section id="meeting"><p class="kicker">03 / 数科业务中心 × 交付实施部</p><h2>把周会共识，落实为下周共同结果</h2><p class="method">已合并指定任务《整理周会纪要与手绘脑图》的9月4日会议与偏差支持版成果。蓝色保留本周形成的决议及事实，橙色写下周行动；会上提出不等于已执行。项目节点随后逐项展开。</p><div class="standard-grid">')
for name,this,gap,nxt,owner,gate in meeting_rows:
 parts.append(f'<article class="end-card"><h3>{esc(name)}</h3>'+block('本周会议结论',this,'this')+f'<p class="gap"><b>偏差：</b>{esc(gap)}</p>'+block('下周共同目标',nxt,'next')+f'<p class="small"><b>关闭标准：</b>{esc(gate)}</p><p class="meta">{esc(owner)} ｜ 来源 S2 / 指定周会任务</p></article>')
parts.append('</div></section>')
parts.append('<section id="delivery"><p class="kicker">04 / 交付中心</p><h2>15个重点项目，逐项锁偏差与下一验收门槛</h2><p class="method">交付负责：范围、资源、节点、成本、稳定运行和签收验收。此处为重点项目清单，含交付与运维，既不是本周新增项目数，也不是9月已完成数。</p><div class="project-grid">')
for i,(name,month,this,gap,nxt,owner,deadline,gate,source) in enumerate(projects,1):
 parts.append(f'<article class="project-card"><p class="kicker">{i:02d} / {esc(owner)}</p><h3>{esc(name)}</h3><p class="month">{esc(month)}</p>'+block('本周结果',this,'this')+f'<p class="gap"><b>偏差与影响：</b>{esc(gap)}</p>'+block('下周目标 · '+deadline,nxt,'next')+f'<p class="small"><b>验收门槛：</b>{esc(gate)}</p><p class="meta">来源 {source}</p></article>')
parts.append('</div><details><summary>其他服务与范围说明</summary><p class="small">彩育3校完成平台恢复/培训/打印机修复，旧宫中学完成进销存与手持机培训，国康完成传感器等维修，荣海小学完成交接培训；仍需客户关闭凭据。江苏国庆继续区分免费、付费及不支持需求；上海崇明需确认费用合同；仙龙潭维修受配件到货影响。均不直接累计为本周新交付项目。安徽部队（原产研稿）与安徽体职院30台单车（交付会）按不同项目保留，不混算。</p><p class="small">央美10包的常规76人日为粗估；只有核验真实缺项后才能正式排期。并行工期、外部评测等待与研发人日不可相加为同一口径。</p></details></section>')
parts.append('<section id="rnd"><p class="kicker">05 / 产研中心</p><h2>按3 SPU × 4端，看产品增量与发布差距</h2><p class="method">产研负责：产品边界、标准版本、共性能力、设备适配和质量。105条功能定义、30条项目关系、32类设备集成已经归档；这些是能力资产数量，不是本周上线数量。以下12格逐一列出本周事实、差距和下周目标，没有新增证据的格子明确保留。</p>')
for spu in dict.fromkeys(x[0] for x in products):
 parts.append(f'<article class="spu"><div class="spu-head"><h3>{esc(spu)}</h3><span>PC · 移动 · 大屏 · 设备</span></div><div class="end-grid">')
 for _,end,this,gap,nxt,month,project,owner,src in [p for p in products if p[0]==spu]:
  parts.append(f'<div class="end-card"><h4>{end}</h4>'+block('本周增量',this,'this')+f'<p class="gap"><b>发布差距：</b>{esc(gap)}</p>'+block('下周目标 · 9/7—9/13',nxt,'next')+f'<p class="month-target">{esc(month)}</p><p class="meta">验证场景：{esc(project)}<br>责任：{esc(owner)} ｜ 来源 {src}</p></div>')
 parts.append('</div></article>')
parts.append('</section><section id="standard"><p class="kicker">06 / 跨SPU标准产品建设</p><h2>让研发产出可部署、可验证、可复用</h2><p class="method">等保、软著、私有化、一键部署、文档与版本管理是三个SPU共用的交付基础，不混入PC/移动/大屏/设备业务功能统计。</p><div class="standard-grid">')
for area,this,nxt,month,owner,src in standards:parts.append(f'<article class="end-card"><h3>{esc(area)}</h3>'+block('本周事实',this,'this')+block('下周目标',nxt,'next')+f'<p class="month-target">{esc(month)}</p><p class="meta">{esc(owner)} ｜ {src}</p></article>')
parts.append('</div></section><section id="evidence"><p class="kicker">07 / 管理口径与来源</p><h2>用同一套定义，连接产研与交付</h2><div class="conclusion"><h3>下周建议统一：范围、版本、负责人、验收凭据</h3><p>项目经理负责现场与客户节点，产品经理负责标准/配置/定制边界，研发负责人负责版本与质量。共性缺陷回到产品版本，项目变更同步核算工期和费用。岗位协同和指标是本报告建议，需团队确认后执行。</p></div><p class="method">同行参考：满客宝公开产品页将结算、营养、食安、进销存与多终端组合为一体化方案；帮助页描述项目、产品与研发协同实施。这支持本报告的“双视角”组织方式，不代表取得其内部管理制度或绩效数据。<a href="https://www.mankebao.com/product/">官方产品体系</a> · <a href="https://www.mankebao.com/html/help/">官方实施支持</a>（2026-09-05读取）</p><details><summary>查看统计口径、来源与本月承诺连续性</summary><div class="table-wrap"><table><thead><tr><th>组别</th><th>登记事项</th><th>明确完成</th><th>未闭环</th><th>完成率</th><th>下周原计划</th></tr></thead><tbody>')
for g,t,d,n in metrics:parts.append(f'<tr><td>{g}</td><td>{t}</td><td>{d}</td><td>{t-d}</td><td>{d/t:.1%}</td><td>{n}</td></tr>')
parts.append('</tbody></table></div><p class="small">28项未闭环＝进行中15＋计划/未开始11＋暂停2。28项与下周56项缺逐条映射，不可直接相加为84项。开发二组14项遗留说明收口压力，不作为人员绩效结论。</p><p class="small">连续性：8/28—29周报提出滨州收尾、三全/央美联调、等保9/6和9/25目标；9/4交付会明确20项目/月、哈尔滨与各项目节点；9/4产品/硬件/央美专题补充上线、差异和验证边界。本次发现的9月综合交付周会为9/4一场，另纳入9/4硬件专题；其他月份内会议未发现可用记录。9月三轴组合实时读到7项（6待确认、1暂停），并非已批准计划；9月产研四端量化基线仍未找到，因此各产品月末目标均标建议。</p><ol class="src-list">')
for id,name,path,date,boundary in source_defs:
 link=f'<a href="{esc(path,quote=True)}">{esc(name)}</a>' if path.startswith('https://') else esc(name)
 parts.append(f'<li><b>{id} · {link}</b>（{esc(date)}）<br>{esc(boundary)}</li>')
parts.append('</ol></details></section><div class="page-footer">康比特数字技术中心 · 产研与交付周报 · 内部资料<br>蓝色仅表示本周事实，不代表该项全部完成；橙色仅表示计划。无额外公开发布，无第三方字体或脚本请求。</div>')
template=Path('/Users/jack/code/099-github/pakco-html/templates/webpage.html').read_text()
template=re.sub(r'<title>.*?</title>','<title>产研与交付周报｜2026.08.31—09.06</title>',template)
template=re.sub(r'<link[^>]+>','',template)
template=template.replace('</head>','<link rel="icon" href="data:,"></head>')
template=template.replace('</head>',f'<style>{basecss}\n{themecss}\n{css}</style></head>')
template=template[:template.index('<div class="page">')]+'<div class="page">'+''.join(parts)+'</div></body></html>'
(OUT/'product-rnd-delivery-weekly-report.html').write_text(template)
md='# 产研与交付周报｜2026-W36\n\n本周 08/31—09/06；下周09/07—09/13；截至09/05已读材料。\n\n'
for a,b in conclusions:md+=f'## {a}\n\n{b}\n\n'
md+='## 9月目标\n\n'+'\n\n'.join('；'.join(r) for r in monthly)+'\n\n## 交付项目\n\n'
for name,month,this,gap,nxt,owner,deadline,gate,src in projects:md+=f'### {name}\n\n9月：{month}\n\n本周：{this}\n\n偏差：{gap}\n\n下周：{nxt}\n\n责任/日期：{owner}；{deadline}\n\n验收：{gate}（{src}）\n\n'
md+='## 产品3 SPU四端\n\n'
for spu,end,this,gap,nxt,month,project,owner,src in products:md+=f'### {spu} / {end}\n\n本周：{this}\n\n差距：{gap}\n\n下周：{nxt}\n\n{month}\n\n场景/责任：{project}；{owner}（{src}）\n\n'
md+='## 数科业务中心与交付实施部周会协同\n\n'+'\n\n'.join('；'.join(r) for r in meeting_rows)+'\n\n'
md+='## 标准产品建设\n\n'+'\n\n'.join('；'.join(r) for r in standards)
(OUT/'report.md').write_text(md)
(OUT/'source-audit.json').write_text(json.dumps({'cutoff':'2026-09-05','input_sha256':hashlib.sha256(SRC.read_bytes()).hexdigest(),'capability_counts':counts,'key_projects':len(projects),'product_cells':len(products),'input_total':96,'input_completed':68,'input_open':28,'next_original_plan':56,'primary_row_status_recalculated':False,'monthly_actual_acceptance_count':None,'monthly_actual_amount':None,'product_month_targets':'proposed; not an approved baseline'},ensure_ascii=False,indent=2))
print(json.dumps({'output':str(OUT),'projects':len(projects),'product_cells':len(products),'sheets':9,'counts':counts},ensure_ascii=False))
