Troubleshooting#
本页按报错入口定位 Perago 问题。优先用 perago check 复现 task module 和本机配置问题;perago check 通过后,再排查 perago extract、TaskDef 注册和 perago start 的运行时问题。
Triage Flow#
从仓库根目录按这个顺序缩小问题范围。下面使用仓库内测试 fixture;真实部署时把 app.workers.features_build 换成自己的 task module target。
PYTHONPATH=tests/fixtures uv run perago check app.workers.features_build
PYTHONPATH=tests/fixtures uv run perago extract app.workers.features_build --output generated/features.build.json
PYTHONPATH=tests/fixtures uv run perago start app.workers.features_build -j 1
停在哪一步 |
主要问题范围 |
下一步 |
|---|---|---|
|
task module、Pydantic contract、WorkspaceSpec、TaskControls 或本机 runtime config |
先看 stderr 的 |
|
|
确认输出路径指向 JSON 文件。 |
|
Conductor 连接变量、workspace task 的 LakeFS 连接变量、Conductor TaskDef 注册、worker supervisor 启动前检查 |
先确认 |
attempt 运行中失败 |
Conductor input、LakeFS workspace、Workspace Check、task body、publish fence 或 cleanup |
结合 Conductor result status、 |
Task Module Cannot Load#
错误文本 |
常见原因 |
修复 |
|---|---|---|
|
CLI target 写成 |
使用 Python module import path,例如 |
|
module 导入成功,但没有执行任何 |
确认文件中 exactly one function 被 |
|
一个 Python module 中注册了多个 Perago task。 |
拆成多个 single-task module;不要用 |
Perago 的 worker 单元是 exactly one task per Python module。一个 worker process 只服务这个 task name。
Task Definition Errors#
错误文本 |
常见原因 |
修复 |
|---|---|---|
|
|
配置非空 task name。 |
|
task name 含 |
task name 用 Conductor task 名称,不要用路径。 |
|
|
填写负责人的邮箱或内部 owner 标识。 |
|
|
只使用 |
|
|
使用 |
|
|
使用 |
|
workspace-free task 配置了 publish budget。 |
只在 workspace task 上配置 |
|
read-only workspace task 配置了 publish budget。 |
这是启动/校验阶段 warning;删除 |
这类错误在 module import 或 build_taskdef(...) 阶段暴露;perago check 会先加载 runtime config,再导入 task module。
Task Function Shape#
错误文本 |
常见原因 |
修复 |
|---|---|---|
|
task body 定义为 |
改成普通 |
|
签名使用 variadic 或 keyword-only 参数。 |
使用精确签名 |
|
|
删除默认值;required/optional 字段只在 Pydantic model 内表达。 |
|
workspace task 的两个参数名不匹配。 |
顺序和名称都写成 |
|
|
使用 |
|
函数签名像 workspace task,但 decorator 没声明 workspace。 |
在 |
|
workspace-free task 的唯一参数不叫 |
把唯一参数命名为 |
|
函数只有 |
删除 |
|
|
定义 |
|
返回值缺少类型注解,或类型未继承 Pydantic |
定义 output model 并标注 |
不要把业务字段展开成多个函数参数。函数签名只声明 Perago contract;业务 required/optional 字段属于 Pydantic Params 和 Output model。
WorkspaceSpec And Workspace Checks#
错误文本 |
常见原因 |
修复 |
|---|---|---|
|
prefix 使用了 Windows 反斜杠。 |
使用 POSIX 风格 |
|
prefix 含 |
使用 |
read-only task 写了本机 workspace 但没有发布 |
|
这是预期行为;写入会随 attempt-local cleanup 丢弃。 |
|
|
填写 workspace-prefix 内的相对路径。 |
|
guardrail path 以 |
删除开头 |
|
使用了绝对 |
使用 workspace-relative path。 |
|
使用 Windows drive path。 |
使用不含 drive/root 的相对路径。 |
|
字符串路径使用 |
使用 |
|
|
调整 count bounds。 |
运行中 Workspace Check 失败会进入 reasonForIncompletion:
错误文本 |
状态 |
含义 |
|---|---|---|
|
|
输入 workspace 缺少 task 声明的必需文件。 |
|
|
输入 workspace glob 数量不足。 |
|
|
task body 产出的 workspace 文件未通过 post check。 |
pre check 和任务显式抛出的 TaskTerminalError 会映射为 FAILED_WITH_TERMINAL_ERROR。post check、TaskFailed、未知业务异常和 publish 失败都会映射为普通 FAILED。
Runtime Configuration#
错误文本 |
常见原因 |
修复 |
|---|---|---|
|
|
在 |
|
启动 workspace task worker 时三个 LakeFS 变量都没配置。 |
workspace task 需要配置 |
|
只配置了部分 LakeFS 变量。 |
三个 LakeFS 变量同时配置;如果当前命令和 task 类型不需要 LakeFS,就三个变量全部省略。 |
|
连接变量仍是 |
用真实部署值替换占位值。 |
|
workspace/log root 不可创建或不可写。 |
修正 |
|
日志大小格式错误。 |
使用 |
|
日志保留期格式错误。 |
使用 |
|
worker id prefix 含连字符、下划线、点号或非 ASCII 字符。 |
使用只含字母数字的前缀,例如 |
|
workspace GC TTL 格式错误。 |
使用 |
|
workspace GC interval 格式错误。 |
使用 |
|
shutdown force-kill deadline 格式错误。 |
使用 |
perago check 和 perago extract 不要求 Conductor/LakeFS 连接变量完整,但会拒绝半套 LakeFS 配置和不可写本机目录。perago start 始终要求 Conductor endpoint;只有 workspace task start 要求完整 LakeFS 配置。
TaskDef Registration#
错误文本 |
常见原因 |
修复 |
|---|---|---|
|
|
指向具体 JSON 文件,例如 |
|
|
运行 |
|
启动前连接 Conductor 或查询 TaskDef 失败。 |
检查 |
perago extract 只生成 TaskDef JSON,不会自动写入 Conductor。perago start 在启动 supervisor 前会真实检查 TaskDef 是否已注册。
Attempt Input And Result Validation#
错误文本 |
常见原因 |
修复 |
|---|---|---|
|
workspace task input 顶层字段缺失或多了其他字段。 |
input 顶层只保留 |
|
workspace-free task input 顶层包含 |
input 顶层只保留 |
|
|
填写非空 LakeFS repository、target branch 和 input commit ref。 |
|
Pydantic input/result model 收到未声明字段,或 control object 有未知字段。 |
删除额外字段;扩展 contract 必须先改 Pydantic model。 |
|
Pydantic 字段类型不匹配。 |
按 generated TaskDef schema 和 Pydantic model 修正字段类型。 |
Workspace task 的 workspace 是平铺的 repository、branch、ref_type、ref 四元组;LakeFS endpoint、credentials、WorkspaceSpec.prefix 和 WorkspaceSpec.read_only 不属于 workflow input。
Workspace Sync And Publication#
错误文本或现象 |
常见原因 |
修复 |
|---|---|---|
|
attempt-local workspace 中包含 symlink。 |
输出真实文件;不要把 symlink 发布到 LakeFS。 |
|
diff 非空 publication 前,target branch HEAD 既不是 input ref,也不是 input ref 的直接子提交。 |
不要手动重试同一 attempt;从当前 target branch head 发起新的 workflow。 |
|
可写 no-op completion 前,target branch HEAD 不符合 |
不要把当前 no-op attempt 包装成成功;从当前 target branch head 重新发起 workflow。 |
可写 task 没有产生新 commit |
|
这是 no-op completion;Perago 不会创建 empty commit,output ref 保持 input ref。 |
LakeFS download/stage/merge SDK 异常 |
repository/ref 不存在、凭证错误、网络失败或 LakeFS 服务异常。 |
检查 LakeFS 连接变量、repository、input commit 和 worker JSONL。 |
staging branch create 失败且 branch 已存在 |
同一个 execution id 的 staging branch 已存在,或远端残留与当前 execution id 冲突。 |
当前 attempt 会 fail closed。正常情况下每次 execution 都有唯一 branch;排查 worker 日志中的 |
|
staging branch 删除失败。 |
原始 task result 不会被覆盖;事后检查并清理 |
|
本机 attempt workspace 删除失败。 |
原始 task result 不会被覆盖;检查 |
publish fence 和 LakeFS merge 失败会让 attempt FAILED,不会生成 workspace output。cleanup 失败只写日志,不回滚已经完成的 target branch merge。publish 成功但 Conductor completion 未上报时,Perago 不补发旧 completion;由 Conductor timeout/fail/retry 处理。
Where To Look Next#
需要核对 |
页面 |
|---|---|
Conductor input/output JSON shape |
|
generated TaskDef 字段、默认值和 |
|
环境变量、 |
|
result status 和 failure mapping |
|
worker JSONL 日志路径和排查入口 |
|
LakeFS download/stage/publish/cleanup 生命周期 |