用 WorkBuddy 做调研:把链接清单变成有证据的决策简报
调研应回答一个具体决定。通过原创报名工具选型案例,练习证据卡、硬约束、长文提炼、评分复核和持续跟踪,让结论的依据与边界都能回查。
- 先明确决定、范围和停止条件,再检索
- 每条关键判断保留日期、适用范围和原文位置
- 未知项先补证,评分与持续跟踪都保留条件
1. 先写出这份调研将改变什么决定
调研交付最常见的尴尬,是每一页都很充实,最后仍要重新开会讨论“所以选谁”。把产品介绍、行业数据和评论汇总起来,只完成了材料整理。真正有用的报告需要服务一个具体决定,并告诉读者:证据支持什么,哪些地方还不能下结论。
本文用一个虚构案例贯穿流程:一个成人社区活动团队,要为下月活动选择报名工具。每月约300条报名,峰值600条,年预算上限1200元,不需要收款功能,必须能导出指定字段。甲、乙、丙均为教学假设产品,下文的材料和评分都不代表真实厂商或实测。
在 WorkBuddy 中创建任务,把已有资料加入对话,并先要一份问题清单。如果要联网搜集,明确时间范围、来源偏好和最终报告形态。官方数据搜集与报告示例支持这种任务组织方式;实际执行时仍需确认所用搜索能力可用。
本页有两种练习。前面的虚构报名工具案例提供固定资料和评分条件,适合反复练习筛选与改权重;末尾「真实网页示范」改用 Google 文件编辑问题,展示如何把真实来源写成证据卡与有限结论。两套对象和证据不能混用。真实网页材料采集于 2026 年 10 月 7 日,保留的是当日文档观察,未做产品操作测试;实际采用前需重新核对当前条件。
2. 每条结论都留一张证据卡
检索结果的摘要只能帮你定位页面。决定套餐是否够用,应打开具体定价页、帮助文档或书面报价,确认适用地区、套餐、计费周期和限制。页面发布于今天,也可能在转述去年的数字,所以证据卡要分别记录发布日期、事实发生日期和采集日期。
证据强弱取决于要证明什么。厂商文档适合确认其公开承诺;规范试用可以验证特定场景是否完成;用户评论适合发现问题线索,不能用几条差评估算故障率。多篇文章若都转述同一份报告,仍然只有一个原始证据源。
| 字段 | 怎么填写 |
|---|---|
| 判断 | 甲的标准版支持导出指定三字段 |
| 证据位置 | S01的CSV导出说明;真实任务填直达链接或页码 |
| 适用范围 | 标准版、2名管理员、每月600条 |
| 状态 | 文档已写明;实际导出仍待试用验证 |
| 限制 | 不外推到其他套餐、地区或数据规模 |
检索时为每条关键判断建立证据卡: 证据编号、判断、来源类型、标题、 直达链接/文件位置、发布日期、事实日期、 采集日期、适用范围、限制条件、证据状态。 打开原始页面核对,搜索摘要只作线索。追溯转载到共同源头。 无法访问、只有口头说法、缺套餐范围或日期的,分别标注; 不把“未找到”填成“不支持”。
3. 先筛硬约束,缺证据的单独保留
对这个示例,甲的材料写明900元年费、每月600条额度和指定CSV字段。乙年费600元,但给定基础版只有200条额度,当前方案不满足峰值要求;这不意味着乙的所有套餐都不适用。丙报价1100元、每月600条,但“批量管理”和“应该可以导出”无法证明指定字段可导出,应停在待确认区。
从三份资料得到的阶段判断可以很短:“先让甲进入试用;乙的当前套餐不通过容量要求;丙先补导出能力证据,再决定是否进入试用。”此时再写十页背景综述,并不会明显改进决定。
下面是完整演示输入。可复制另存为 research-pack.txt,再交给 WorkBuddy;无需搜索这三个虚构产品。
展开完整调研资料包
演示资料包:以下产品、页面、沟通与评分均为虚构教学材料, 无真实品牌,无产品实测。 研究问题:成人社区活动团队选择报名工具,下月开始试用; 预计每月约300条报名,峰值600条;不需要收款功能。 硬约束:年费总额不超过1200元;每月至少600条报名额度; 能导出含报名ID、创建时间和状态的CSV。 S01|甲厂商套餐说明(演示),材料日期2026-10-01: 标准版900元/年,含2名管理员,每月600条报名,支持CSV导出, 字段含报名ID、创建时间、状态;本例无其他必须费用。 S02|乙厂商套餐说明(演示),材料日期2026-10-01: 基础版600元/年,每月200条报名,支持CSV导出; 材料未提供其他套餐。 S03|丙厂商报价(演示),材料日期2026-10-02:1100元/年, 含2名管理员,每月600条报名,支持“批量管理”; 未说明CSV导出与导出字段;本例未显示其他必须费用。 S04|丙销售沟通摘录(演示),材料日期2026-10-03: “应该可以导出你们需要的数据,我再确认。”未给具体格式或字段。 S05|教学评分表:只有硬约束通过才使用。成本: 总额<=900元给8分,900元<总额<=1100元给6分, 1100元<总额<=1200元给4分;超过预算淘汰。 配置便利性和日常操作均按10分制,练习给定甲7/8、丙9/9; 这些分数是练习输入,不是实测。 权重成本40%、配置便利性35%、日常操作25%。 S06|未来验证任务: 用20条虚构报名记录检查创建、修改、删除与导出; 逐项比对字段、行数和权限。此任务尚未执行。
4. 长材料用摘要卡导航,保留例外和范围
资料从三页增加到几十页后,可以先提炼短卡:材料的结论、支持依据、适用范围、风险例外,以及与当前决定的关系。每一项带上页码或章节位置。扫描件如果识别不完整,应标出未读到的页数,别根据目录推测正文。
例如某份说明写“支持导出,但免费套餐不含历史归档数据”,摘要如果只剩“支持导出”,会直接误导选型。图表中的单位、基期和脚注也应一并记录。报告作者的预测、厂商的计划和已经发生的事实,要用不同措辞。
只基于我提供的材料制作阅读卡,每份不超过500字。 包含: 核心结论、最多3条依据、适用范围、风险与例外、对本次选择的影响、建议精读位置。 每条依据标页码/章节;事实、作者观点、预测分别标识。 保留否定词、条件句、表格单位和脚注。 列出读取失败或识别不清的页面。不要补外部常识, 不给缺失内容编页码。
5. 行业扫描把政策、需求和技术串到同一问题
若任务从“选择工具”升级为“要不要进入这个市场”,可以沿政策、付费需求、技术条件展开。政策侧查正式文件与适用对象,需求侧查谁付钱、付多少、是否续用,技术侧查可实现的能力、成本和依赖。这几条线共同影响商业判断,却不能互相替代。
“发布了鼓励文件”不能直接证明订单增长,“融资活跃”不能证明客户愿意付费,“功能已演示”也不能证明能在生产环境稳定运行。市场规模数字冲突时,先比较地域、年份、客户类型和统计定义,口径不同的数字不宜取平均,更不宜随手画成一条趋势线。
为【具体业务决定】做行业扫描。范围限定【地区、客群、时间窗】。 分别回答:规则发生了什么变化;谁在为需求付费; 技术成本与成熟度有什么可靠变化。 优先一手文件、原始统计和企业披露。说明样本和口径; 无法找到可靠规模数据就保留缺口。 最后列3个会影响本次决定的信号,以及每个信号尚缺哪一项验证。 涉及专业合规或投资决定时,不把资料摘要当作最终专业意见。
6. 加权评分放在证据之后,并检查权重敏感性
给产品打分前,先把评分标准定下来。这个练习约定成本40%、配置便利性35%、日常操作25%。甲的三个分数为8、7、8,加权总分7.65。丙的假设分数为6、9、9,总分7.80,但只有导出硬约束补证通过后,这个分数才有资格进入选择。
把成本权重提高到60%,另外两项各20%,甲变成7.80,丙变成7.20,顺序翻转。这里的分数是教学输入,计算已离线复核;它说明选择依赖偏好,不能证明某个产品客观更好。真实评分需写清评价量表、观察记录和未知项,缺证据时保留空白,避免制造精确的假象。
当领先幅度很小,优先检查证据质量、缺口及切换成本。总分只是对既定偏好的计算,适合辅助讨论,不能替团队确定预算和风险承受程度。
7. 要一份能推翻当前倾向的检查清单
倾向甲以后,可以让 WorkBuddy 找出反证方向。例如600条是每个自然月总量,还是同时保留的有效记录数?删除记录会不会恢复额度?CSV中的时间采用什么时区?这些问题可能改变是否适用,但在没有资料前,只能列为待验证,不能写成甲已经存在的缺陷。
用20条虚构报名记录试一轮创建、修改、删除、导出与权限切换,通常比继续收集无关排名更接近决定。测试前固定步骤和通过标准,测试后保留实际结果。若未亲手操作或没有可信记录,就别把“看起来应该能用”写成试用体验。
我们暂倾向甲。请基于证据卡列出最可能改变这个决定的3项风险。 每项分成“材料已显示的问题”或“尚未验证的假设”,引用依据。 不要为了反对而捏造缺点。 给每项写最小验证动作、通过标准和失败后处理方式。 把需要向厂商询问的问题整理成草稿,不自行联系或提交任何数据。
8. 持续跟踪只报告会改变判断的新信息
给每个候选产品留一份档案:为什么关注、当时的适用条件、已确认事实、未决问题和下次检查点。新资料来了,比较新增、变化、撤回和仍未确认的内容,旧报价与旧判断按日期保留。页面没有变化时,不必重复生成一篇报告。
如果使用 WorkBuddy 的自动化做定期跟踪,先手动跑通检索、去重、原文核对和输出,再确定频率、接收位置以及失败提示。是否能按时运行和触达,受任务环境与配置影响,需要查看执行记录。保存过一条监控指令,也不等于后续一直运行成功。
9. 可直接复用的完整调研任务单
演示时把 research-pack.txt 与下面任务单一起提供,并明确只读给定材料。真实项目再把范围换成具体产品和授权资料,允许联网并要求原文链接。这样可以先检验报告结构,再扩大检索范围。官方Web Search 说明也强调时间范围与来源链接,具体能力应以当前已配置的工具为准。
任务:为【团队】决定【何时开始试用哪个候选】准备可审核简报。 本次模式:仅处理 research-pack.txt 演示材料,不搜索虚构厂商。 真实任务时另行指定允许检索的对象、时间窗和来源。 先列决策问题、范围、硬约束与需要确认的假设。 我确认方向后再展开。 建立证据表,保留来源位置、日期、适用套餐、条件与缺口; 区分事实、观点和推断。 逐候选检查硬约束,输出通过、不通过、待确认。 未知项不得自动判通过或填0分。 仅对通过候选按已确定量表评分,列出计算式,测试一组替代权重。 假设情景与现实状态分开。 输出: 一页结论简报、对比表、证据表、信息缺口清单、下一步验证方案。 正文每个重要判断可回到证据编号。 另存方法模板与当日档案;不覆盖历史, 不自行联系厂商、不注册账户、不下单。 停止条件:足以支持试用选择, 或剩余决定性缺口必须由试用/厂商答复解决。说明达到哪一种。
10. 交付前,从结论倒着走回原文
最终验收先看结论,再挑出会改变决定的数字和能力描述,逐条回到原文。检查链接是否真的支持这句话、是否同一套餐、是否遗漏条件、是否把未来计划写成已上线。关键证据逐条核查,其余可按重要性抽查。打不开的链接要说明并补合法可访问的原始材料。
再检查比较是否公平:费用是否覆盖同一周期与人数,容量是否使用相同定义,评分权重是否加总为100%,表格中的“未知”有没有在摘要里变成确定答案。冲突无法消除时,两种说法和适用范围都留下,报告相应收窄结论。
最后把建议写成有条件的行动:“甲先做20条模拟记录的导出验证;丙补证后再比较;乙只在更合适套餐出现时回到候选。”读者看完知道可以先做什么,也知道什么证据会让计划改变。这份简报才算完成了从资料到判断的工作。
11. 真实网页示范:为一次 Google 文件编辑试验建立证据链
前面的甲、乙、丙便于练习计算。下面换成一次真实公开网页核对:以 Claude 与 Google Workspace 的官方材料为输入,练习把新闻标题压缩成可审核的决定。资料读取于 2026-10-07(UTC),只核对文档,没有登录、安装、连接账户或实测。它也没有在 WorkBuddy 中执行并生成产品测试记录。
本次的问题是:一个尚未提交账户配置的团队,能否依据这则公告安排内部试验?先判断公开材料是否足以制定验证方案,并列出启动前必须补齐的条件。成本比较、产品排名和全面安全评估不在范围内。这个问题不需要虚构团队人数或假定管理员已经同意。
可复制的输入任务
研究问题:依据下列 R01—R04 官方页面,准备一次 Google 文件编辑试验的立项简报。 截止日期:2026-10-07;重新执行时另填采集日期,不沿用旧日期。 只读公开网页,允许跟随相关官方帮助链接;不要登录或操作账户。 分别记录文件内侧栏与 Claude 内编辑连接器的适用条件。 硬约束:路径清楚、套餐有对应证据、组织许可已确认、测试文件有编辑权限、审批方式符合团队要求。 没有团队配置时,相关约束填“待确认”,不代填通过。 逐项提供证据编号、主源链接、原文位置、日期、适用范围和未知项。 输出一页简报、缺口清单、验证方案;区分文档说明、分析判断与未实测项目。 停止条件:公开材料足以制定试验;剩余决定性缺口必须由账户配置或授权试验解决。 不联系厂商,不注册、安装、付费或改变组织设置。
本次实际建立的证据卡
四张卡均来自厂商一手页面,证明范围限于文档表述。这些页面来自同一发布方,不能算四次独立实测。下面保留原文标题与章节定位,方便读者自己打开页面核查。各卡采集日期均为 2026-10-07(UTC);帮助页的规则生效日期未单独给出,不能从相对更新时间反推出精确日期。
R01 · Claude now works with Google Docs, Sheets, and Slides
原文位置:开头与“Edit Google files from Claude”段。公告日期:2026-10-06;宣布开放时间:同日。
文档说明:公告同时介绍文件内侧栏与 Claude 内的 Docs、Sheets、Slides 编辑连接器,两者均为测试版。前者面向付费计划;后者的文档另行核对。
证据边界:可证明官方宣布了什么,不能证明某个账户已经开通。
R02 · Use Claude in Google Docs, Sheets, and Slides
原文位置:开头、安装条件、审批模式。页面显示“Updated today”;未显示精确发布时间。
文档说明:侧栏列出 Pro、Max、Team、Enterprise,Google 账户须获准安装 Marketplace 应用;组织设置由 Workspace 管理员控制。默认逐次批准编辑。“Accept all edits”仍会对链接、外部图片及移除访问权等动作请求批准。
证据边界:这些是侧栏条件;付费资格不能代替安装许可。
R03 · Use Google Workspace connectors
原文位置:Docs/Sheets/Slides、实时编辑步骤及当前限制。页面显示“Updated this week”;未显示精确发布时间。
文档说明:三个编辑连接器与 Drive 分开;实时窗格要求网页版 Chrome,或开启内置浏览器的 Claude Desktop;Enterprise 默认关闭该浏览器。既有 Google 文件权限仍适用。
证据边界:该页“所有用户”的句子点名 Gmail、Calendar、Drive,不能独自证明新编辑连接器的各套餐覆盖。
R04 · Use connectors to extend Claude's capabilities
原文位置:Team/Enterprise 配置、连接服务的动作限制。页面显示“Updated this week”;未显示精确发布时间。
文档说明:Team、Enterprise 的 Owner 或 Primary Owner 先在组织层启用连接器。组织还可限制写入等动作,成员无法覆盖这些限制;启用也不增加源系统权限。
证据边界:这是组织层通则。用户实际认证方式和动作许可仍应在对应配置中核对。
如何收住结论
读完 R01,继续查 R02 与 R03,是因为决定试验方式所需的条件还不完整。R04 再把组织层许可补进来。这样查找有明确的终点:当缺口转为“这个团队的设置是什么”,继续增加新闻链接已经不能补证,应把问题交回配置核对。
把“支持编辑”写进结论前,先给它附上路径和卡号。一个仅写“管理员已允许”的复选框也不够,记录中至少应写明核对的是哪一侧的设置、哪类动作、哪个适用群体。核查者拿到这些字段,才知道需要找谁确认,也能避免拿另一条路径的说明补齐自己的空格。
12. 从四张证据卡写出一份有边界的小简报
决策简报,2026-10-07:本轮公开资料足以准备一个小范围验证方案;团队能否启动仍待确认。R01—R04 已建立两条使用路径的材料索引,尚未收到与具体团队对应的配置记录。本轮没有可据以评分的试用结果,不设置成功率、节省时间或稳定性分数。
由材料作出的判断:下一步应先选定试验路径,再核对它所对应的准入条件。若任务只是验证一份文件中的一次修改,先将目标缩成一个可检查的动作;跨文件需求另列,避免首轮试验承担过多问题。这是本例的研究建议,未由厂商文档直接给出。
| 硬约束 | 本轮状态 | 继续所需的证据 |
|---|---|---|
| 使用路径与任务相符 | 材料可区分;团队尚未选择 | 写明入口、目标文件类型与一个预期动作 |
| 套餐覆盖该路径 | 待确认 | 把实际套餐与相应说明逐项对应;空白不以其他产品的套餐补齐 |
| 组织允许安装或连接及目标动作 | 待确认 | 配置负责人确认适用成员、动作范围与审批要求 |
| 测试环境与文件权限满足要求 | 待确认 | 记录实际客户端、相关开关和测试文件的权限 |
| 结果正确且可复核 | 未实测 | 授权后执行预定步骤,保留修改前后内容与观察记录 |
验证方案可以先写在本地:使用一份不含真实业务数据的测试文件,指定把某段文字缩短至固定长度,同时保留两个事实;预先保存原文和检查标准。获得所需许可后,由有权限的人运行这一步,记录是否出现预期审批、是否只修改指定内容、撤销后是否恢复。若任一条件不符,留下实际错误信息与当时配置,暂缓扩大试验。这里列的是尚未执行的方案。
未来复核时,先看本轮未决条件是否有了新证据,再看官方页面的适用范围是否变化。把变更对应到卡号,说明哪条判断需要重开;原来的采集日期和结论保留。若只有介绍性措辞改变,而决定试验的条件没有变化,一条简短记录就足够。
本轮达到的停止条件是“可制定验证方案,启动资格仍待账户证据”。读者可以沿卡号回到原文,也能看到本例在哪里停下。公开公告和帮助文档中的操作步骤不构成安装、授权或修改账户的许可。
13. 补充练习:六篇支持文章为什么仍不能解除一条反证
回到前面的虚构报名工具案例,只检查丙的一个硬约束:标准版是否能导出含报名ID、创建时间、状态的CSV。原资料S03只写“批量管理”,因此起点仍是待确认。下面新增的S07—S09、转载及高级版说明全部是人为构造的练习输入,与上面的真实Google文件调研无关,也不是新搜到的厂商消息。
这次练习解决一个具体漏洞:证据表有了来源编号之后,报告仍可能把同一材料的五篇转载当成五次验证,再用多数票压过一条相反说明。另一个常见错误是拿高级版的导出能力填标准版的空格。我们先给出人工可以复核的预期,再用一个可选的Python小程序检验整理规则。
待判断范围:丙 / 标准版 / CSV含报名ID、创建时间、状态。 S03(原材料,根R3):仅写“批量管理”;未说明上述CSV字段。值:未知。 S07(新增假设说明,根R7):标准版支持上述CSV及全部三个字段。值:支持。 reprint-0至reprint-4:五篇假设转载,明确全部引自S07;各自有卡号,共用根R7。 S08(新增假设说明,根R8):标准版导出的CSV不包含状态字段。值:否定。 premium(另一套餐,根RP):高级版支持上述三个字段。不能回答标准版问题。 S09(随后提供的假设勘误,人工复核材料): “本次标准版说明S08中‘不包含状态字段’为误写。请撤回该句; S07列出的标准版三个导出字段保持有效。” S09在本例中已经由人工核对发布方、原文位置及适用范围; 这只是注入的教学前提,不是程序验证了勘误真伪。
读者应先写下三个答案:只有S03时待确认;S07加五篇转载仍只有一个支持材料家族;S08加入后必须保留冲突。高级版说明不改变这三个答案。随后收到S09,才有了撤回R8在本次判断中效力的明确理由。若没有S09,即使S07日期较新、转载更多,也不能在这个练习里自动删除反证。
为了完整复现,下面给出带位置和材料日期的补充资料包。日期也是虚构输入;不会改变前文真实网页示范的采集日期。先把S09及复核记录留到后两轮,观察报告能否在收到勘误但尚未复核时继续保留冲突。
evidence-pack.txt 完整输入
虚构补充资料包;仅用于练习,不是真实厂商资料或实测记录。 范围:丙 / 标准版 / CSV含报名ID、创建时间、状态。 所有材料日期、root与scope标注均为题设输入。root表示共同原材料,不证明机构独立性。 S03|演示报价,2026-10-02,第1段,根R3:支持“批量管理”,未说明CSV与字段。未知。 S07|演示导出说明,2026-10-04,第2段,根R7:标准版CSV含报名ID、创建时间、状态。支持。 reprint-0至reprint-4|演示转载,2026-10-04,各第1段:均逐字引用S07第2段,共用根R7。 S08|演示导出说明,2026-10-05,第3段,根R8:标准版CSV不含状态字段。否定。 premium|演示套餐说明,2026-10-05,第1段,根RP:高级版CSV含上述三个字段。范围不符。 S09|演示勘误,2026-10-06,第1段: “本次标准版说明S08中‘不包含状态字段’为误写。请撤回该句;S07列出的标准版三个导出字段保持有效。” 分阶段发放:第一轮不提供S09;第二轮提供S09,但尚未提供复核记录;第三轮再提供下面的教学前提。 教学复核记录:假设核查者已核对S09的发布方、原文位置与适用范围,同意本例撤回R8。 此记录是注入输入,不是程序或WorkBuddy核验了真伪。现实核查人、核查时间均未提供。 R8在本资料包只有一个受撤回断言,因此可整根撤回;真实一份文档含多个断言时必须拆卡,不能由一句勘误撤回整份文档。
14. 把判断规则固定下来,再运行离线验收
本例的四个状态为PENDING(未获明确证据)、DOCUMENTED(现有合范围材料明确支持)、FAIL(现有合范围材料明确否定)、CONFLICT(同时存在支持与否定)。DOCUMENTED只表示这一条能力的材料状态;不是丙全部硬约束通过,更不是导出实测成功。未知材料可以与明确材料并存,但不能计为支持。上述状态与处理次序是本教程为练习制定的规则,不是WorkBuddy内置能力或行业统一标准。
返回值的第二项是当前范围内、未撤回的材料家族数,包含未明确说明的家族;它不是支持票数,也不是独立机构数。root由核查者阅读原文后填写,程序不会自动发现转载关系、识别假网站或证明来源可信。不同根也可能来自同一个厂商。现实任务还应把地区、版本、生效时段等必要条件加入scope;这里为了只复现一个错误,固定为三个字段。
把下面完整内容另存为evidence_gate.py,使用Python 3.12运行 python evidence_gate.py。只用标准库,不访问网络、不调用模型或WorkBuddy、不读业务文件。不会创建产品账户或执行报名操作。
展开完整离线程序与固定预期
"""Synthetic research exercise. No web, model, credentials, or product calls."""
from dataclasses import dataclass, replace
import unittest
SCOPE = ('丙', '标准版', 'CSV含报名ID/创建时间/状态')
@dataclass(frozen=True)
class Card:
id: str
root: str # 人工核对后的共同原始材料编号,不等于独立机构
scope: tuple
value: object # True / False / None;None 表示材料没有明确证明
def gate(cards, withdrawn=()):
"""Return (status, active_root_count, ignored_card_ids)."""
ids = [c.id for c in cards]
if len(ids) != len(set(ids)):
raise ValueError('duplicate card id')
withdrawn = set(withdrawn)
known_roots = {c.root for c in cards if c.root}
if not withdrawn <= known_roots:
raise ValueError('unknown withdrawn root')
roots, ignored = {}, []
for c in cards:
if not c.root or not (c.value is None or type(c.value) is bool):
raise ValueError('invalid evidence card')
if c.scope != SCOPE or c.root in withdrawn:
ignored.append(c.id)
continue
roots.setdefault(c.root, set()).add(c.value)
values = {v for group in roots.values() for v in group if v is not None}
if values == {True, False}:
status = 'CONFLICT'
elif values == {False}:
status = 'FAIL'
elif values == {True}:
status = 'DOCUMENTED'
else:
status = 'PENDING'
return status, len(roots), tuple(sorted(ignored))
# 以下全部是假材料;T、F、U分别代表明确支持、明确否定、未明确说明。
T = Card('S07', 'R7', SCOPE, True)
F = Card('S08', 'R8', SCOPE, False)
U = Card('S03', 'R3', SCOPE, None)
COPIES = [replace(T, id=f'reprint-{i}') for i in range(5)]
WRONG = replace(T, id='premium', root='RP',
scope=('丙', '高级版', SCOPE[2]))
def unsafe_majority(cards):
# 故意错误:把转载篇数当票数,忽略范围和冲突。
return sum(c.value is True for c in cards) > sum(c.value is False for c in cards)
class GateTests(unittest.TestCase):
def test_fixed_oracles(self):
# 预期元组人工写死,不调用gate产生答案,也不只检查“两次输出一致”。
cases = [
('empty', [], (), ('PENDING', 0, ())),
('unknown', [U], (), ('PENDING', 1, ())),
('document', [T], (), ('DOCUMENTED', 1, ())),
('negative', [F], (), ('FAIL', 1, ())),
('copies', [T] + COPIES, (), ('DOCUMENTED', 1, ())),
('wrong-plan', [U, WRONG], (), ('PENDING', 1, ('premium',))),
('conflict', [T, F], (), ('CONFLICT', 2, ())),
('copy-flood', [T, F] + COPIES, (), ('CONFLICT', 2, ())),
('same-root-conflict', [T, replace(F, root='R7')], (),
('CONFLICT', 1, ())),
('withdraw-entire-family', [T, F] + COPIES, ('R7',),
('FAIL', 1, ('S07', 'reprint-0', 'reprint-1', 'reprint-2',
'reprint-3', 'reprint-4'))),
('confirmed-correction', [T, F] + COPIES, ('R8',),
('DOCUMENTED', 1, ('S08',))),
]
for name, cards, withdrawn, expected in cases:
with self.subTest(name=name):
self.assertEqual(gate(cards, withdrawn), expected)
def test_reject_bad_input(self):
for cards, withdrawn in [([T, T], ()), ([T], ('TYPO',)),
([replace(T, root='')], ()),
([replace(T, value='yes')], ())]:
with self.subTest(cards=cards, withdrawn=withdrawn):
with self.assertRaises(ValueError):
gate(cards, withdrawn)
def test_deliberately_wrong_algorithm_is_caught(self):
self.assertTrue(unsafe_majority([T, F] + COPIES))
self.assertEqual(gate([T, F] + COPIES), ('CONFLICT', 2, ()))
self.assertTrue(unsafe_majority([WRONG]))
self.assertEqual(gate([WRONG]), ('PENDING', 0, ('premium',)))
if __name__ == '__main__':
unittest.main(verbosity=2)
本次在Python 3.12.14实际运行,三个测试方法均通过。其中固定预期包含11个场景,另有4个无效输入子场景,以及两个故意错误的多数票对照。unittest的汇总为“Ran 3 tests … OK”,不能把它说成17次产品测试。所有预期元组直接写在测试中,没有调用被测函数生成正确答案。
两个错误对照分别把“六条支持、一条否定”和“只有高级版支持”判为True;正确规则应分别返回CONFLICT与PENDING。测试因此不仅证明正常输入能通过,也确认了这两种坏做法会被固定答案区分。同根出现相反摘录也返回CONFLICT,此时应先检查摘录错误,而不是给这个根投一票。
函数接口只面向本页的有限Card列表或元组:卡号与root为非空字符串,scope为三个字符串的元组,value仅为True、False或None。它不是任意JSON的验证器,也不接受一次性生成器。四项错误输入测试只覆盖文中列出的拒绝条件,不能当成完整输入校验、安全审计或生产部署保证。
15. 从冲突到恢复:保留旧材料,解释为何撤回
勘误不是一张可以悄悄盖过反证的新支持票。先保留S08原文,再把S09、被撤回断言和本轮适用范围连起来。收到S09但未完成复核时,本例仍为CONFLICT;只有采用“已人工复核”的教学前提,才将R8退出当前计算。R8在本包仅有这一条断言,因此整根撤回与撤回该句等价。现实文档若含多条独立断言,应先拆卡,不可用局部勘误撤回整份材料。
下面的D09是决议示例。reviewed为true是题目提供的条件,程序不会登录发布方网站、鉴别签名或验证核查人的身份;真实核查人和时间仍为空。实际使用时,这两项以及原文位置应由核查者补全,不能把演示值直接当作批准记录。
correction.json 完整内容
{
"decision_id": "D09",
"source": "S09",
"source_location": "evidence-pack.txt / S09 / 第1段",
"withdrawn_root": "R8",
"withdrawn_claim": "S08:标准版CSV不含状态字段",
"scope": [
"丙",
"标准版",
"CSV含报名ID/创建时间/状态"
],
"reviewed": true,
"review_basis": "教学输入:假设发布方、原文位置和适用范围均已由人工核对",
"reviewer": null,
"reviewed_at": null,
"boundary": "reviewed不是程序核验结果;真实使用前须由人工提供完整复核记录"
}
scenario.py 完整内容
"""Synthetic correction trace; reviewed is a supplied premise, not authentication."""
import json
from pathlib import Path
from evidence_gate import U, T, F, COPIES, gate, unsafe_majority
def withdrawal(decision):
# Only accepts this exercise's supplied decision. Does not verify a source.
if decision.get('reviewed') is not True:
return ()
if (decision.get('decision_id'), decision.get('source'),
decision.get('withdrawn_root'), decision.get('scope')) != (
'D09', 'S09', 'R8', list(T.scope)):
raise ValueError('correction does not match exercise scope')
return ('R8',)
def main():
decision = json.loads(Path(__file__).with_name('correction.json').read_text())
cards = [U, T, F] + COPIES
print('initial', gate([U]))
print('new-document', gate([U, T]))
print('conflicting-note-and-five-copies', gate(cards))
print('correction-not-reviewed', gate(cards, withdrawal(dict(decision, reviewed=False))))
print('S09-reviewed-premise-withdraw-R8', gate(cards, withdrawal(decision)))
print('negative-control-withdraw-R7', gate(cards, ('R7',)))
print('unsafe-majority', unsafe_majority([T, F] + COPIES))
if __name__ == '__main__':
main()
expected-output.txt 完整内容
initial ('PENDING', 1, ())
new-document ('DOCUMENTED', 2, ())
conflicting-note-and-five-copies ('CONFLICT', 3, ())
correction-not-reviewed ('CONFLICT', 3, ())
S09-reviewed-premise-withdraw-R8 ('DOCUMENTED', 2, ('S08',))
negative-control-withdraw-R7 ('FAIL', 2, ('S07', 'reprint-0', 'reprint-1', 'reprint-2', 'reprint-3', 'reprint-4'))
unsafe-majority True
将三个文件与evidence_gate.py放在同一目录,运行python scenario.py。七行固定答案中的家族数包括未知R3,所以第二步为2、冲突阶段为3。五篇转载没有增加这个计数。排除R8只使本条能力恢复到“材料明确支持”,不代表导出已成功;反向撤回R7时,五篇转载也一并退出,不能靠转载保住旧结论。
可交付的更新简报是:“丙标准版指定CSV字段的材料状态由冲突恢复为明确支持。依据为S07及本练习假设已复核的S09,D09撤回S08相关断言;S08原文仍保留。五篇转载共用R7,不构成五次独立验证。年费和容量仍沿用原题条件,真实产品测试尚未执行,下一步是原S06的20条虚构记录导出验证。”如果发布方、套餐或勘误范围无法确认,删去恢复结论并保留冲突,列明缺的具体材料。
16. 交给WorkBuddy时,要求它提交可回查的判断过程
仅使用本页虚构S03、S07、S08、S09、premium与五篇转载,不联网搜索虚构厂商。 先不看S09,整理丙标准版CSV字段的证据卡: 保留卡号、共同原始材料编号、具体套餐、原文断言和未知项。 输出三个阶段的状态:只有S03;加入S07与转载;再加入S08。 禁止以文章数量投票,禁止用高级版说明补标准版证据。 然后读取S09但先不采用复核前提,继续保留冲突; 最后采用题目明确给出的已复核前提,写一条撤回决议草稿:撤回对象、理由、材料位置、仍待验证事项。 核查人和核查时间若未提供就留空,不伪造确认。 给出更新后的短简报;区分材料支持与实际导出成功。 若可以在获准的本地目录执行程序,运行本页离线测试并原样保留输出; 不能执行就写“未运行”,不要把阅读代码当作测试通过。 不联系厂商,不操作真实报名数据,不修改历史原文。
这里实际验证的是Python规则函数与合成输入。没有在WorkBuddy中运行这份任务单,没有测量模型对原文的理解率,没有验证产品搜索、自动化或真实CSV导出能力。尤其是root、scope和撤回决议的正确性仍依赖人工核查;错误标注可以让程序得出错误结论,测试通过不能替代原文审阅。
方法参考:W3C的PROV-O引用关系与修订关系为描述材料出处和修订提供了概念;本例的root字段只是教学简化,没有实现PROV-O,也不从该规范推导投票或撤回政策。测试接口依据Python官方unittest文档。本轮核对的是这些官方文档与本地程序结果,不扩展上文真实网页示范的历史验证范围。
给任务的输入应有三部分:原research-pack.txt、补充evidence-pack.txt,以及本次允许读取的范围。约定输出为证据卡清单、分阶段结论、D09决议草稿和一段更新简报。证据卡保留原句与位置;root或scope来自人工提供的标注时,直接写“给定标注”,不要改称工具已经追溯或验证。任务可以先只做文字整理,可选程序由你在获准的本地环境运行;两部分各自验收。
交付时逐项倒查:S03仍是未知,premium仍被排除,转载仍指向R7,S08加入后出现冲突,未复核的S09不改变状态,采用复核前提后才出现D09。若原文缺失或读取失败,保留卡号和失败位置并请求补件;若卡片互相矛盾,先核对摘录和范围;若程序报错,原样保存命令和错误并标“未通过”,不改预期答案迎合输出。最后检查没有虚构核查人、时间或执行记录。只有这些信息足够回查,文字任务才算完成。
17. 用固定答案检验规则和交付文件
测试程序采用作者事先写定的答案,而不是重新调用gate生成“正确结果”。verify_bundle.py还会临时换入两种坏算法:多数票压过冲突,以及把高级版改标成标准版。它们必须在同一套固定答案上出现断言失败;只有进程报错或两个错误程序碰巧通过,都不能算有效对照。随后程序检查未复核与范围错误的勘误输入,并逐字比对七行状态轨迹。
运行python verify_bundle.py和python -O verify_bundle.py。校验使用unittest断言方法和显式异常,不依赖会被-O去掉的assert语句。以下是完整校验入口;配套ZIP仅包含完整文章、公开练习文件与说明,不含工作记录或发布凭据。
verify_bundle.py 完整内容
"""Run fixed oracles and ensure two intentionally broken gates fail them."""
import io
import json
from pathlib import Path
import subprocess
import sys
import unittest
from dataclasses import replace
import evidence_gate as eg
from scenario import withdrawal
def run_suite():
stream = io.StringIO()
result = unittest.TextTestRunner(stream=stream, verbosity=2).run(
unittest.defaultTestLoader.loadTestsFromTestCase(eg.GateTests))
return result, stream.getvalue()
def main():
result, log = run_suite()
print(log, end='')
if not result.wasSuccessful():
raise SystemExit('source tests failed')
original = eg.gate
def majority(cards, withdrawn=()):
status, roots, ignored = original(cards, withdrawn)
active = [c for c in cards if c.id not in ignored]
if any(c.value is not None for c in active):
status = 'DOCUMENTED' if eg.unsafe_majority(active) else 'FAIL'
return status, roots, ignored
def ignore_plan(cards, withdrawn=()):
return original([replace(c, scope=eg.SCOPE) for c in cards], withdrawn)
for name, broken in [('majority', majority), ('ignore-plan', ignore_plan)]:
eg.gate = broken
try:
result, log = run_suite()
finally:
eg.gate = original
if result.wasSuccessful() or result.errors or not result.failures:
raise SystemExit(name + ': mutation was not caught by assertion failures')
print('REJECTED', name, 'assertion failures:', len(result.failures))
decision = json.loads(Path('correction.json').read_text())
if withdrawal(dict(decision, reviewed=False)) != ():
raise SystemExit('unreviewed correction wrongly applied')
if withdrawal(decision) != ('R8',):
raise SystemExit('reviewed premise not applied')
for field, value in [('source', 'S10'), ('withdrawn_root', 'R7'), ('scope', ['丙', '高级版'])]:
try:
withdrawal(dict(decision, **{field: value}))
except ValueError:
pass
else:
raise SystemExit('mismatched correction accepted: ' + field)
command = [sys.executable] + (['-O'] if sys.flags.optimize else []) + ['scenario.py']
actual = subprocess.check_output(command, text=True)
if actual != Path('expected-output.txt').read_text():
raise SystemExit('scenario differs from fixed oracle')
print('PASS correction guards and seven-line scenario oracle')
if __name__ == '__main__':
main()
本次在Python 3.12.14分别对源文件、从文章提取的内联代码及解压后的文件运行普通模式和-O模式,共六组离线验收。每组通过三个unittest方法(其中包含11个固定场景、4个无效输入场景及两个错误多数票对照),并拒绝两个替换算法;另通过勘误保护条件与七行输出比对。这些结果只验证给定标注下的本地计算和交付一致性,不证明来源真实、机构独立、模型理解正确或报名工具可用。
来源越多,结论就越可信吗?
要看来源独立性和对应关系。多篇转载可能共用一个证据,重要条件仍需回到原始文件核对。
没有找到某项能力,能否写产品不支持?
不能。应写未找到可靠证据或待确认,并给出下一步验证动作。