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 的 |
|
|
确认输出路径是文件路径,不是目录。 |
|
Conductor/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 上配置 |
这类错误在 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 model。 |
定义 output model 并标注 |
不要把业务字段展开成多个函数参数。函数签名只声明 Perago contract;业务 required/optional 字段属于 Pydantic Params 和 Output model。
WorkspaceSpec And Workspace Checks#
错误文本 |
常见原因 |
修复 |
|---|---|---|
|
prefix 使用了 Windows 反斜杠。 |
使用 POSIX 风格 |
|
prefix 含 |
使用 |
|
|
填写 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 被映射为 FAILED_WITH_TERMINAL_ERROR。post check、业务异常和 publish 失败都会映射为普通 FAILED。
Runtime Configuration#
错误文本 |
常见原因 |
修复 |
|---|---|---|
|
|
在 |
|
三个 LakeFS 变量都没配置。 |
配置 |
|
只配置了部分 LakeFS 变量。 |
三个 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 配置和不可写本机目录。
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 不属于 workflow input。
Workspace Sync And Publication#
错误文本或现象 |
常见原因 |
修复 |
|---|---|---|
|
attempt-local workspace 中包含 symlink。 |
输出真实文件;不要把 symlink 发布到 LakeFS。 |
|
publish fence 发现 target branch 被无关提交推进。 |
不要手动重试同一 attempt;从当前 protected branch head 发起新的 workflow。 |
|
target branch 从 current head 回溯到 input ref 的 first-parent range 超过上限。 |
从当前 protected branch head 发起新的 workflow,或人工确认历史后处理。 |
|
target branch first-parent history 中找不到本次 input ref,通常表示 branch 被重写或 input ref 不再属于当前线性历史。 |
不要继续当前 attempt;从当前 branch head 重新发起 workflow。 |
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 生命周期 |