"""Render an offline, accessible review artifact; no service or remote dependencies."""
from pathlib import Path
import json
import html
ROOT = Path(__file__).resolve().parents[1]
WORK = ROOT / 'docs/workshop-skill-local-acceptance-20261109'
def render():
samples = json.loads((WORK / 'sample-outputs.json').read_text(encoding='utf-8'))
acceptance = json.loads((WORK / 'local-acceptance.json').read_text(encoding='utf-8'))
payload = json.dumps({'samples': samples, 'acceptance': acceptance}, ensure_ascii=False).replace('<', '\\u003c')
template = r'''
工作坊成果与回复样张 · 本地验收
真实归档材料本地改写 · 未修改线上报告
把“有什么资料”转成“接下来值得比较什么”
使用已返回的原始记录收窄结论;下面是本地改写示例,不是新增一轮数字人回复或实际用户决策。
原反馈的局限
“商品侧够用、消费者侧很薄、市场侧几乎没有。”
团队知道了数据缺口,却仍不知道该比较什么产品问题。后续把标题词、单位价格和少数原话推成企业战略,又引入了超出证据的建议。
更有用的反馈
目前能研究的是供给表达和具体使用任务,尚不能决定应该补哪种工艺。
先把包装/制作步骤、面条与酱料体验、口味组合分开比较。商品标题帮助选代表对象,原话帮助提出问题;工艺是否改善口感,需要另一类证据。
当前可用认识及产品含义
| 可用认识 | 关键依据与范围 | 对产品研究的含义 |
| 工艺宣称存在不同表达路径 | 五品牌已读378条链接;康师傅139条中三工艺词未命中,四竞品任一词并集36。仅标题观察。 | 可选同任务或同风味代表产品比较实现方式;不能据此决定改产线或判市场空白。 |
| 口感、挂酱和准备便利值得分开研究 | 评价有相关自述,但49条记录只覆盖3品牌4个链接,去重文本46。部分商品语境待核。 | 比较收益与准备代价,保留原话的产品归属;不要把挂酱归因某工艺,也不要把不用洗碗推广到整类。 |
| 换味/公司储备可作为候选任务 | 完整JD评价包含放公司、泡面口感单一和改善口味;单条明示不等于普遍需求。 | 先比较现有口味/组合怎样回应,再判断是否需要新单品。既有产品改良也有研究价值。 |
合理的下一步从共同任务或风味中选可比代表,做“实现方式—体验依据—准备代价—待验证问题”的对照。当前没有足够证据选定非油炸、挂酱或火鸡为唯一创新主线。
必要的口径与纠正
五品牌总匹配139+90+102+31+18=380,已读378;不是全库总量。白象仅纳入100/102。
“不用洗碗”和“汤头浓郁”是同一商品的不同评价,分别核适用性;不是同一条原话矛盾。“放公司/换口味”对应JD完整记录,不是误标的天猫来源。
原线上报告、原件与历史回复保持原样。本地示例不代表尚未完成的图谱/配置卡已同步。
本地验收不是线上全流程验收
分别检查内容、接口和阅读效果
通过项证明什么
| 检查 | 实际做法 | 可证明范围 |
|---|
| 课表与内容 | 原两张课表逐节映射;人工检查13份实际产出样张 | 顺序、核心内容、产品含义与交接在本地设计中明确 |
| 保存与回读 | 真实当前处理函数接入内存库,核完整章节、正文、卡片、版本和公开投影 | 本地输入与当前代码兼容;未调用生产业务接口 |
| 错误与边界 | 错误字段/类型、伪造引文、重复请求、阶段推进等故障演练 | 已测条件被发现或拒绝,不把它推成任意故障均可处理 |
| 可读性 | 桌面与390px打开样张和当前报告组件,检查表格、字号、导航及正文 | 以浏览器检查记录为准;不据此声称所有未来内容均美观 |
仍未验证
新候选Skill尚未安装到数字人;没有独立模型的自主行为评测、真实双模型复核、工厂/消费者测试或生产全链验收。原案例按要求停止,不为补齐记录续派任务。
参考方法
查看本地检查项目
'''
template=template.replace('.sidebar h2{', '.mobile-select{display:none}.sidebar h2{',1)
template=template.replace('@media(max-width:520px){', '@media(max-width:520px){.sidebar .steps{display:none}.mobile-select{display:block;width:100%;border:1px solid var(--line);border-radius:8px;background:white;font:inherit;padding:10px;color:var(--ink)}',1)
template=template.replace('