# 📦 WP-119 — `refine(cli): drop the root configs symlink`

> Engineering log · [Phase 11 — Rolling, toward v0.5.0](https://borda.github.io/lucid-YOLO/engineering/phase-11-rolling/)
>
> 🔗 Depends on [WP-038](https://borda.github.io/lucid-YOLO/work_packages/wp-038/) · Needed by none
>
> ⬅️ [WP-118](https://borda.github.io/lucid-YOLO/work_packages/wp-118/) · [Roadmap](https://borda.github.io/lucid-YOLO/ROADMAP/) · [WP-127](https://borda.github.io/lucid-YOLO/work_packages/wp-127/) ➡️


## WP-119 — a symlink kept for a command nothing still runs literally

<a id="wp-119"></a>

[WP-038](https://borda.github.io/lucid-YOLO/work_packages/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](https://borda.github.io/lucid-YOLO/work_packages/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](https://borda.github.io/lucid-YOLO/work_packages/wp-099b/) entry, completed roadmap rows for [WP-038](https://borda.github.io/lucid-YOLO/work_packages/wp-038/) and [WP-099c](https://borda.github.io/lucid-YOLO/work_packages/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.

