Observed
Second maiden-voyage boot after the _startup_pull fix (#918) merged. Supervisor reaches preflight, then the container exits:
17:45:53 INFO [supervisor] fido image cache hit fido:local
17:45:53 INFO [supervisor] starting container image=fido:local
17:45:56 INFO [-] preflight: all required tools found: git, gh, claude, copilot
preflight: skill-files directory not found: /workspace/src/sub
17:45:56 ERROR [supervisor] container exited code=1 action=fail
Supervisor treats the preflight failure as action=fail and stops (no auto-retry).
Root cause
src/fido/config.py:114 computes the default sub_dir:
sub_dir=Path(__file__).resolve().parent.parent / "sub",
__file__ = /workspace/src/fido/config.py (in-container)
.parent = /workspace/src/fido
.parent again = /workspace/src
/ "sub" = /workspace/src/sub
But the actual sub/ directory is at the repo root: /workspace/sub. So the default path is off by one.
This formula was correct when Fido's Python package lived directly at the repo root (kennel/). The package moved to src/fido/ — one level deeper — so the relative walk back to sub/ now needs to go up one more level. Pure leftover of the rename.
Proposed fix
Change the default to parents[2] / "sub":
sub_dir=Path(__file__).resolve().parents[2] / "sub",
That yields /workspace/sub — which exists and contains persona.md, setup.md, task.md, ci.md, resume.md.
Test plan
- Add a unit test that
Config.from_args with default sub_dir points at a directory containing the five canonical sub-skill files.
- Manual:
./fido up clears preflight and reaches starting container-to-worker-up without sub_dir errors.
Why this didn't blow up in CI
CI runs ./fido ci which builds buildx targets but does not exercise run()'s preflight. A dedicated Config default-path test would have caught this.
Observed
Second maiden-voyage boot after the
_startup_pullfix (#918) merged. Supervisor reaches preflight, then the container exits:Supervisor treats the preflight failure as
action=failand stops (no auto-retry).Root cause
src/fido/config.py:114computes the defaultsub_dir:__file__=/workspace/src/fido/config.py(in-container).parent=/workspace/src/fido.parentagain =/workspace/src/ "sub"=/workspace/src/subBut the actual
sub/directory is at the repo root:/workspace/sub. So the default path is off by one.This formula was correct when Fido's Python package lived directly at the repo root (
kennel/). The package moved tosrc/fido/— one level deeper — so the relative walk back tosub/now needs to go up one more level. Pure leftover of the rename.Proposed fix
Change the default to
parents[2] / "sub":That yields
/workspace/sub— which exists and containspersona.md,setup.md,task.md,ci.md,resume.md.Test plan
Config.from_argswith defaultsub_dirpoints at a directory containing the five canonical sub-skill files../fido upclears preflight and reachesstarting container-to-worker-up without sub_dir errors.Why this didn't blow up in CI
CI runs
./fido ciwhich builds buildx targets but does not exerciserun()'s preflight. A dedicatedConfigdefault-path test would have caught this.