📦 WP-119 — refine(cli): drop the root configs symlink¶
Engineering log · Phase 11 — Rolling, toward v0.5.0
🔗 Depends on WP-038 · Needed by none
WP-119 — a symlink kept for a command nothing still runs literally¶
WP-038 moved the experiment configs into src/lucid_yolo/configs as package data, so a wheel-only install could run --config, and kept a repo-root configs -> src/lucid_yolo/configs symlink so the commands already documented at the time -- ones that typed configs/det_smoke.yaml from repo root -- kept working. That was the right call then: a compatibility shim is cheaper than rewriting every example the moment a layout changes underneath them.
What made it safe to drop now is that nothing in the tree still needed it. Every path that resolves the configs directory in code does so package-relatively -- Path(lucid_yolo.__file__).resolve().parent / "configs" in tests/ptl/test_cli.py and scripts/overfit_micro.py, Path(__file__).resolve().parents[1] / "configs" in packaged_config() -- none of which touch the repo root at all. And _resolve_config_args (also WP-038) already does the harder version of what the symlink did: a --config value that names a packaged config by bare filename, with or without .yaml, resolves onto the installed lucid_yolo/configs tree when no such file exists locally, so lucid-yolo fit --config det_smoke.yaml already works identically from a checkout or a wheel install, no path and no symlink required.
The one place the symlink was load-bearing rather than redundant was prose: train.py's own module docstring showed python -m lucid_yolo.cli.train fit --config configs/det_smoke.yaml, a literal root-relative path that only resolved because the symlink put a real directory at configs/. That is now the bare-name form the resolver was actually built for. AGENTS.md's configs/data/*.yaml and two comments in tests/ptl/test_cli.py and scripts/overfit_micro.py that named the bare configs/ directory are reworded to src/lucid_yolo/configs/... or lucid_yolo/configs/... for the same reason -- accurate once nothing at repo root answers to that name. Historical entries elsewhere (ENGINEERING_LOG.md's own WP-099b entry, completed roadmap rows for WP-038 and WP-099c) describe what was true when they were written and are left alone; a backfilled record does not get edited to match a later decision.