update-S4-acceptance.py 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. """Write acceptance and current progress locally. No business API calls."""
  2. import json
  3. from pathlib import Path
  4. from datetime import datetime, timezone
  5. root = Path('F:/kangshifu-board')
  6. docs = Path('F:/文档/工作坊当前资料')
  7. readback = json.loads((root / 'work/live-S4-readback-20261103.json').read_text(encoding='utf-8'))
  8. browser = json.loads((root / 'work/live-S4-browser-verified-20261103.json').read_text(encoding='utf-8'))
  9. display = json.loads((root / 'work/live-S4-display-inspection-20261103.json').read_text(encoding='utf-8'))
  10. assert readback['ok'] and browser['ok'] and display['ok']
  11. assert readback['artifactId'] == browser['artifactId'] == 'U3_W7WDliP'
  12. assert all(c['passed'] for c in browser['checks'])
  13. assert display['display']['metricLabels'][0] == '—人独立提到'
  14. out = root / 'work/live-S4-independent-acceptance-20261103.json'
  15. report_file = docs / '50-S4课堂桌面评估独立验收结果.md'
  16. assert not out.exists() and not report_file.exists()
  17. backup = root / 'work/S4-progress-before-acceptance-20261103'
  18. backup.mkdir()
  19. for name in ['01-工作进展汇报.txt', '02-后续待补资料.md', 'README.md']:
  20. with (backup / name).open('xb') as f:
  21. f.write((docs / name).read_bytes())
  22. issues = [
  23. {'severity': 'display-polish', 'area': 'retail listing evidence drawer',
  24. 'observed': 'Unknown owner count displays as —人独立提到, not a numeric count. Generic person label is inappropriate for a retail listing.',
  25. 'recommended': 'Hide the person metric when unknown, or use a source-based metric with the correct denominator.'},
  26. {'severity': 'display-polish', 'area': '390px provenance text',
  27. 'observed': 'Drawer body clientWidth=389, scrollWidth=410. Full provenance is reachable with 21px horizontal scrolling; page width remains 390px.',
  28. 'recommended': 'Wrap long provenance URLs within the drawer.'},
  29. ]
  30. receipt = {
  31. 'ok': True, 'at': datetime.now(timezone.utc).isoformat(),
  32. 'operation': 'S4-independent-acceptance', 'readOnly': True, 'businessWrites': 0,
  33. 'sessionId': readback['sessionId'], 'projectId': readback['projectId'],
  34. 'artifactId': readback['artifactId'], 'sourceId': readback['outputSourceId'],
  35. 'reportUrl': readback['reportUrl'], 'stageCode': 'S4', 'progressState': 'in_progress',
  36. 'dataChecksPassed': readback['checksPassed'], 'browserChecksPassed': len(browser['checks']),
  37. 'focusedDisplayChecksPassed': len(display['checks']),
  38. 'browserVerified': True, 'productionBrowserVerifiedFieldWritten': False,
  39. 'formalReportPublished': False, 'employeeConfirmed': False, 'enterpriseApproval': False,
  40. 'physicalStudyPerformed': False, 'marketValidationPerformed': False, 'productionValidationPerformed': False,
  41. 'projectArtifactIds': readback['projectArtifactIds'], 'projectEvents': readback['projectEvents'],
  42. 'knownDisplayIssues': issues,
  43. 'visualReview': [s for s in browser['screenshots'] if any(k in s for k in [
  44. 'table-1-desktop', 'table-1-mobile', 'table-2-mobile', 'evidence-public-p1-mobile'])],
  45. 'evidenceFiles': ['work/live-S4-readback-20261103.json', 'work/live-S4-browser-verified-20261103.json',
  46. 'work/live-S4-display-inspection-20261103.json'],
  47. 'remoteLogsAndPermissionsBasis': 'Operator report only; not independently read by Codex',
  48. }
  49. with out.open('x', encoding='utf-8', newline='\n') as f:
  50. json.dump(receipt, f, ensure_ascii=False, indent=2)
  51. f.write('\n')
  52. report = f'''# S4课堂桌面评估独立验收结果
  53. 2026年11月3日。Codex已完成生产数据只读核对与匿名生产浏览器验收。S4课堂桌面评估保存、展示及项目关联通过;保留两项显示改进,不据此认定实物、市场或量产验证完成。
  54. | 项目 | 独立核实结果 |
  55. |---|---|
  56. | 选定方向 | 燃魂份量与用餐目的适配(沿用用户既有选择) |
  57. | 会话 | btrFqkz0yw |
  58. | 机会卡 | QE9hjtCj8E,claimKind=hypothesis;建课堂项目后status=approved,不代表需求已证实或企业立项 |
  59. | 项目 | S_CikxZeBs,S4 / in_progress,dataMode=live,status=workshop |
  60. | S4成果 | U3_W7WDliP,version=1,正文来源y-KcU9Ijc0 |
  61. | 类型 | artifactType=assessment_report;reportType=workshop_auxiliary;artifactSubtype=classroom_task |
  62. | 系列 | KSF-真实资料-20261102-01:S4,由明确输入taskKey写入reportSeriesKey |
  63. | 数据核对 | {readback['checksPassed']}项通过;正文1862码点、4来源/4主引文、8待补、4章节与固定05模板相同 |
  64. | 生产浏览器 | 1440px电脑及390px手机,{len(browser['checks'])}项功能检查通过;另4项定点显示检查通过 |
  65. | 项目成果 | 恰2份:XF4h-Z7l5o(项目S3基线)、U3_W7WDliP(S4桌面评估) |
  66. | 写入审计 | 此课堂链5条成功写入,各原业务键恰1条;没有第二套机会卡、项目或S4版本 |
  67. | 仍未发生 | S5方案保存、实物试验、市场验证、量产验证、员工确认、正式发布、企业批准 |
  68. 报告:[燃魂份量适配|公开资料桌面评估 第1版](https://kangshifu.fmode.cn/report/U3_W7WDliP)。
  69. 项目事件实测顺序如下,编号保留下划线:
  70. | 序号 | eventId | eventType | 关联成果 |
  71. |---|---|---|---|
  72. | 1 | GGDTcg5YTy | project_created | — |
  73. | 2 | RkkTTE_xeb | task_submitted | XF4h-Z7l5o |
  74. | 3 | hOFghbcMsY | stage_changed | — |
  75. | 4 | VlGFu_jv4b | task_submitted | U3_W7WDliP |
  76. S4 sourceIds精确为m1OQx9aynA / QdeMcyTTjX / PjORcvaRHn / 5S_Y4IgT5q。对应证据_9mUml0wmh / 2bFGP7axMo / xHGV_mRWcG / CeAEIwymTa逐条回读,quote逐字存在来源rawText,sourceRef指回同源,productRef=null。实际枚举保留下划线。P1是公开图片页观察,P2是历史个人自述;未拼成同SKU、未认定当前在售或普遍需求。
  77. 模板的report.chapters/evidence/method/sources/subtitle逐项相同;executive仅前加课堂声明,report.title/generatedAt属预期新增。tags含拌面及课堂过程成果。S4与基线projectRef均指向本项目,会话与Agent归属一致。旧S1第2版、S2第1版及S3两版的正文与结构仍符合各原模板;同workshop现有8份成果,没有S5成果。
  78. 页面核实了三张表:主引文3列×4行、桌面评估4列×5行、待补问题2列×8行。两种屏宽逐表对照全部列和行,检查逐行滚动、各列可达、四个引文抽屉的真实鼠标展开与Escape关闭、逐字原话及来源关联。引文保留原换行,仅忽略显示层插入的U+2009细空格。项目成员页显示S4、2份成果、进行中、方案待整理;两份新S3报告及旧报告仍可打开。浏览器没有运行或网络错误,仅匿名调用公开看板读取,无服务凭据和业务写入。截图已目视复核。
  79. 两处显示改进单列,未在本轮改前端或发布:
  80. 1. 商品页证据抽屉沿用“—人独立提到”标签。横线是人数未知,实际没有“1人”的计数;Codex最初目视误认已通过定点DOM检查更正。建议人数未知时隐藏该指标,或按实际来源口径展示,不能把商品页换算为消费者人数。
  81. 2. 手机抽屉长出处需要横向滚动:body可用宽389px、内容宽410px,可横移21px,出处完整且页面本身宽390px。建议长URL自动换行。表格没有页面级横向溢出;较窄列的阅读仍需纵向滚动。
  82. 第08旧USAGE失败与成功恢复分别留存,不说首次调用即全成功。旧日志、55文件权限、CLI退出码、stderr及两层调用编号依据王刚001回报,Codex没有独立读取远端文件系统。独立数据证实原转阶段业务键现有且仅有1条成功审计及1条对应事件;这不抹去先前本地失败,也不扩大证明历史无任何HTTP尝试。
  83. boardVisible=true、formalReportPublished=false、employeeConfirmed=false已从保存成功审计核实;dashboardState=workshop与dashboardPublishedAt=null分别表示课堂状态及未正式发布。browserVerified=true记录在本地Codex验收证据,未回写生产字段。enterpriseApproval=false,机会卡approved不代表企业批准。
  84. 下一步可整理S5桌面方案草稿并审阅,再准备对应系统执行材料;本轮没有推进S5。当前SKU、实物、需求强度、配方、成本与量产依据继续保留未知。继续软件课堂流程测试不要求用户先补实物;实际试吃或工艺研究再明确所需样品和条件。不要重导资料、重建卡/项目、重存S3或S4,也不覆盖第08旧失败回执。
  85. 本地证据(不含凭据与浏览器档案):
  86. - F:/kangshifu-board/work/live-S4-independent-acceptance-20261103.json
  87. - F:/kangshifu-board/work/live-S4-readback-20261103.json
  88. - F:/kangshifu-board/work/live-S4-browser-verified-20261103.json(18张截图索引)
  89. - F:/kangshifu-board/work/live-S4-display-inspection-20261103.json(定点DOM及滚动尺寸)
  90. 01、02及README更新前的完整快照保留在F:/kangshifu-board/work/S4-progress-before-acceptance-20261103/;既有交接单、包、报告、原件及业务回执未改动。
  91. '''
  92. with report_file.open('x', encoding='utf-8', newline='\n') as f:
  93. f.write(report)
  94. progress = '''工作坊进展(截至2026年11月3日,最新独立验收见50号)
  95. 真实资料课堂流程已推进到S4 / in_progress,选定方向为“燃魂份量与用餐目的适配”。S4公开资料桌面评估已保存,Codex独立核对生产数据与电脑/手机页面通过。尚未保存S5方案,未做实物、市场或量产验证。
  96. 当前会话btrFqkz0yw;独立课堂机会卡QE9hjtCj8E;项目S_CikxZeBs。项目恰2份成果:S3基线XF4h-Z7l5o、S4评估U3_W7WDliP;4条有序事件。此链5条成功写入审计,各业务键恰1条,没有重复卡、项目或S4版本。
  97. Codex本轮15项数据检查、177项生产浏览器功能检查通过;4来源/4引文、8待补问题、4章节和3张表与固定模板一致。两项显示改进已单列:商品页抽屉仍用人数未知标签,手机长出处需抽屉内横滚。原文与来源完整、流程可操作,本轮未改前端或发布。
  98. S1资料小结第2版、S2用户需求小结第1版、S3三项改进假设第2版的保存与独立验收均已完成,旧记录保留。历史帖子只证明个别作者这样说,公开商品页只证明当时页面/图示展示;不证明当前在售、普遍需求或已取得实物。S4报告是公开资料一致性与证据缺口评估。
  99. 第08曾用无效命令project-transition本地USAGE失败,后按合法project-progress、原输入和原业务键恢复成功,09—12完成。失败回执仍保留,不记为首次即成功;远端日志数量、权限和CLI退出情况依据王刚001回报,独立成功状态以50号数据核查为准。
  100. 课堂可见不等于正式发布、员工确认或企业批准。browserVerified=true仅为本地Codex验收记录,没有回写生产。实物、当前SKU、需求强度、支付意愿、配方、成本及量产依据仍未知。
  101. 下一步整理并审阅S5桌面方案草稿,再准备系统执行材料;无需重做S1—S4、重新选方向或重复找实物。软件课堂测试不要求用户先提供照片;实际试吃/工艺研究所需样品另行安排。新数字人接入、员工实名绑定及旧机器人密钥轮换仍是待办。
  102. 看板:https://kangshifu.fmode.cn/
  103. 最新S4桌面评估:https://kangshifu.fmode.cn/report/U3_W7WDliP
  104. S3假设第2版:https://kangshifu.fmode.cn/report/ZW1FB5zeHr
  105. S2小结第1版:https://kangshifu.fmode.cn/report/b7NOby5ys0
  106. S1小结第2版:https://kangshifu.fmode.cn/report/G8IrkkDG7X
  107. 详细验收:50-S4课堂桌面评估独立验收结果.md。
  108. 更新前汇报快照:F:/kangshifu-board/work/S4-progress-before-acceptance-20261103/。
  109. '''
  110. (docs / '01-工作进展汇报.txt').write_text(progress, encoding='utf-8', newline='\n')
  111. pending = '''# 后续待补资料
  112. 2026年11月3日更新。课堂系统当前S4 / in_progress;S4报告U3_W7WDliP的数据与电脑/手机功能已独立验收,详见50号。下一步可写S5桌面方案草稿;下面研究缺口不作为全部软件流程测试的统一前置,不要求用户现在提供原件,也不重查已知登录墙。
  113. | 研究事项 | 已有依据 | 仍缺什么及何时需要 |
  114. |---|---|---|
  115. | 明确研究对象 | 苏宁公开图片页展示燃魂浓浓炸酱面117g×5、参数585克,关联图标含料117克、面饼90克、煮6—7分钟 | 当前具体实物版本、批次、渠道/日期、可取得性;实际实物研究前明确。图示不当称量值或在售认定 |
  116. | SKU对应 | cq-03/cq-04旧帖、P1商品图片页与P2历史包装照片分别归档 | 精确对应未核;不能拼成同SKU、同批次,productRef均未绑定 |
  117. | 份量与用途 | 两篇2023年份量自述,保留正负上下文;未进行本轮试吃 | 用餐目的、习惯、提前或吃后补主食的原因及实际行为;开展人员研究时再定对象与方法 |
  118. | 人群与市场 | 同一平台4篇历史体验及另1篇2023年历史帖子 | 当前人群/场景、需求强度、支付意愿与普遍程度;不根据帖子算比例或KANO档位 |
  119. | 规格版本与价格 | 单页面算术核对;历史/海外资料各有局限 | 燃魂常规/加量具体版本、当前可取得情况,以及日期/地区/渠道/组合/优惠一致的可比价格 |
  120. | 研究设计与执行 | S4保留研究条件及继续/调整逻辑 | 目标、负责人、资源、对象、样本、记录/比较方法及预先判断规则;真正执行时明确,本轮不虚填数值 |
  121. | 研发与落地 | 未取得企业资料 | 配方、原料/供应商、工艺、产线、成本及相应合规依据;用于实际评定时再补,不宣称低成本或可量产 |
  122. | 其他两假设 | 旧购前未注意需煮和香辣留水经验,分别保留 | 购买路径理解需对应页面/人员观察;香辣留水另锁具体商品与量化操作,不复用燃魂条件 |
  123. 公开资料入库已完成,无需重导:P1来源PjORcvaRHn/证据xHGV_mRWcG;P2来源5S_Y4IgT5q/证据CeAEIwymTa。四旧消费者来源和证据沿用原编号。来源原件及哈希、库内核对见42、45、50号。
  124. S4这次没有产生试吃、称量、问卷、A/B或市场结果。实物原件、称量和获取凭证只在实际实物研究需要时补;41号为可选补充,40号状态C只限定当时可访问本机材料范围,不代表公司没有商品。
  125. 软件流程下一步:审阅S5桌面方案草稿,将规格、配方、成本等未知明确列空或待核,随后按合同准备方案和报告的执行材料。尚未创建concept、尚未转S5,不因进度标签声称研究完成或正式立项。
  126. 前端两项独立待改:商品页证据抽屉的人数标签、390px长出处自动换行。功能验收通过,本轮未改前端。
  127. 员工实名绑定、新数字人创建/接入及旧机器人密钥轮换仍待处理。更新前资料清单完整快照位于F:/kangshifu-board/work/S4-progress-before-acceptance-20261103/。
  128. '''
  129. (docs / '02-后续待补资料.md').write_text(pending, encoding='utf-8', newline='\n')
  130. readme_path = docs / 'README.md'
  131. index = (backup / 'README.md').read_text(encoding='utf-8')
  132. # Preserve historical commentary in the snapshot; remove obsolete appended current-state blocks.
  133. index = index[:index.index('当前状态:')]
  134. replacements = {
  135. '- 47-': '- 47-发给王刚001-S4课堂项目与桌面评估.txt:已完成01—07及经49号恢复的08—12。S4已保存并独立验收,见50号;保留原单,不重跑。',
  136. '- 48-': '- 48-S4课堂流程预检裁定与执行补充.txt:三处合同差异及隔离模拟的历史裁定;实际生产已执行并验收,见50号。',
  137. '- 49-': '- 49-发给王刚001-S4第08步续跑.txt:已按project-progress原业务键恢复成功并完成09—12,旧失败保留;不再次执行。',
  138. }
  139. lines = []
  140. for line in index.splitlines():
  141. replacement = next((value for key, value in replacements.items() if line.startswith(key)), line)
  142. lines.append(replacement)
  143. index = '\n'.join(lines) + '\n'
  144. index = index.replace('- ksf-S4-classroom-next-20261103.zip:', '- 50-S4课堂桌面评估独立验收结果.md:当前结论;15项数据、177项生产浏览器功能及4项定点检查通过,保留两项显示改进;系统S4/in_progress,未实物/市场/量产验证。\n- ksf-S4-classroom-next-20261103.zip:', 1)
  145. index = index.replace('当前入口:', '当前入口:\n\n- 最新S4桌面评估:https://kangshifu.fmode.cn/report/U3_W7WDliP\n- 项目S3基线:https://kangshifu.fmode.cn/report/XF4h-Z7l5o')
  146. current = '''当前状态(2026年11月3日,覆盖旧交接单内的当时状态):S4 / in_progress。S4报告U3_W7WDliP、项目S_CikxZeBs已独立验收;项目2份成果、4条事件,未创建S5方案。详细结论见50号;下一步审阅S5桌面方案草稿,不重跑已成功步骤,也不要求用户先交实物。两项显示改进已留档,未正式发布或员工确认。
  147. 以下编号材料保留交接历史,不代表仍待执行。当前进展看01号,后续研究资料看02号;旧01/02/README完整快照在F:/kangshifu-board/work/S4-progress-before-acceptance-20261103/。
  148. '''
  149. index = index.replace('整理日期:2026年11月3日。', current + '整理日期:2026年11月3日。', 1)
  150. readme_path.write_text(index, encoding='utf-8', newline='\n')
  151. print(json.dumps({'ok': True, 'report': str(report_file), 'receipt': str(out), 'currentStage': 'S4',
  152. 'progressState': 'in_progress', 'dataChecks': readback['checksPassed'],
  153. 'browserChecks': len(browser['checks']), 'knownDisplayIssues': len(issues),
  154. 'backup': str(backup), 'businessWrites': 0}, ensure_ascii=False))