规划、反思与工作流的停止证据:练习答案
参考实现
保留正文 schedule,追加:
python
def schedule(deps):
done, order = set(), []
while len(done) < len(deps):
ready = sorted(k for k, parents in deps.items() if k not in done and set(parents) <= done)
if not ready:
raise ValueError("cycle or missing dependency")
for task in ready:
done.add(task)
order.append(task)
return order
def checked_schedule(deps):
missing = {p for parents in deps.values() for p in parents} - set(deps)
if missing:
raise ValueError("missing:" + ",".join(sorted(missing)))
try:
return schedule(deps)
except ValueError:
raise ValueError("cycle") from None
for data, expected in [({"write": ["read"]}, "missing:read"),
({"a": ["b"], "b": ["a"]}, "cycle")]:
try: checked_schedule(data)
except ValueError as e: assert str(e) == expected
else: raise AssertionError("accepted invalid graph")
print("dependency errors distinguished")缺失依赖可以补任务,循环需要修改依赖;合并成一个模糊错误会掩盖不同修复方向。
深化页面练习解答
计划表示
计划加载时应先检查所有依赖存在;任务验收需要 schema、风险和版本。固定 pipeline 适合步骤稳定且可预测的任务,动态计划适合信息不完整但必须设置预算,人工审批适合高风险副作用。
反思证据
反思记录至少包含失败证据、修正动作、预期变化、验证方式和版本。权限拒绝和预算耗尽直接停止或升级;重复同一 schema 错误而没有新观察时不能继续生成新计划。
工作流停止
handoff 最小交接包包含目标、已验证事实、来源、未解决问题、权限、预算和取消状态。子任务缺失、权限拒绝或预算耗尽都不能汇总为成功;固定 pipeline 在步骤确定、验收稳定的场景更可靠。