## TL;DR
`Configurable` was never importable directly from the `traitlets.config` package namespace in traitlets 5.x; the correct path is `from traitlets.config.configurable import Configurable`. Change the import in the offending file. If the file belongs to an old library, upgrade the library or traitlets together, since mixing traitlets 4-era code with traitlets 5 is what triggers this.

```text
ImportError: cannot import name 'Configurable' from 'traitlets.config'
```

## Use this when
- Importing a notebook utility or old jupyter-era package raises this exact ImportError.
- `pip show traitlets` reports 5.x while the failing code was written for traitlets 4.
- The traceback lands in a file that does `from traitlets.config import Configurable`.

## Not for this skill when
- The failure is `ModuleNotFoundError: No module named 'traitlets'`. That means traitlets is not installed at all.
- The kernel dies instead of raising. That is a binary problem, not an import path.

## Steps
1. Confirm the installed version: `python -c "import traitlets; print(traitlets.__version__)"`. Verify: you see 5.x.
2. Locate the bad import: `grep -rn "from traitlets.config import" --include=*.py .`. Verify: you have every offending line.
3. Change each to `from traitlets.config.configurable import Configurable`. Verify: the module imports cleanly in a fresh python.
4. If the code is inside a third-party package, check for a newer release of that package first. Verify: the released version imports on traitlets 5.
5. Restart the kernel and run the notebook. Verify: the original ImportError is gone and config objects construct normally.

## Variant phrasings
### cannot import Configurable from traitlets
Short form of the same error. Same module-path fix.

### traitlets Configurable import error
General search. Points at the same traitlets 4 to 5 migration gap.

### traitlets.config Configurable missing
Describes the symptom. The class moved one module deeper.

Compatibility: traitlets 5.x with IPython 8/9 and JupyterLab 3/4. The deep import path works on traitlets 4 as well.

## Why it happens
In traitlets 4, a lot of code imported `Configurable` from `traitlets.config` and it happened to work because of how the package re-exported names. Traitlets 5 cleaned up those re-exports, and `traitlets.config.configurable` became the one true home.

## Edge cases / pitfalls
- Downgrading traitlets to 4.x to satisfy one old library will break JupyterLab 4 and notebook 7, which need traitlets 5. Fix the import instead.
- Some forks copied the pattern into `traitlets.config.application`; that one has its own correct deep path, `traitlets.config.application.Application`.
- Editing files inside site-packages is temporary. Get the fix upstream or vendor the module.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_I0-_WGCUpak3X2UXSvKqIA
