Summary
docs/STACK-MAP.md still describes filekit as it was at 0.3.0. filekit is now at 0.4.3, and the map's L1 section lists four symbols that no longer exist while omitting two capability areas that do. Since the map is the contract the other five libraries read, a stale entry is worse here than in a README.
Surfaced while building filekit's documentation site: drawing its dependency diagram against this map exposed the divergence in both directions.
Owning epic: #3.
1. Four symbols listed that 0.3.0 removed
Measured against the installed package (hasattr(dazzle_filekit, ...)):
| Symbol in the map |
Exists? |
Replacement |
normalize_path |
No |
normalize_cross_platform_path(p, resolve=True) |
normalize_path_no_resolve |
No |
normalize_cross_platform_path(p) (default resolve=False) |
get_path_type |
No |
classify_fs_object(p) |
get_drive_mappings |
No |
unctools.converter.get_mappings() (the D3 / V9 fold) |
All four are in the L1 fns (paths) / fns (utils.compat) rows. The map already records the D3 deprecation in a Notes column, but the symbols remain listed as if callable.
This is the part with real downstream cost: a library designing against the contract could reasonably plan on normalize_path existing.
2. Version header is two minors behind
### L1 `dazzle-filekit` (0.2.4 -> 0.3.0, PyPI ✓, ...)
Now 0.4.3, published to PyPI. Releases since the freeze:
- 0.4.0 —
longpath: Windows MAX_PATH shims via on-demand junctions
- 0.4.1 — platform/interpreter guard fixes
- 0.4.2 —
is_device_path device/sink predicate; bare-string guards on all five collection-taking entry points (filekit#16)
- 0.4.3 — documentation, Read the Docs site
3. Two capability areas absent from the capability map
grep -c 'longpath\|is_device_path' docs/STACK-MAP.md → 0.
longpath (0.4.0) is arguably a new L1 capability rather than a detail: it is the remedy for a condition utils.validation.is_valid_path only ever detected. shim_path makes a file over MAX_PATH openable by any application by siting a junction at a short root. Worth a row under "Capability ownership (one home each)" — it is the sort of thing another library would otherwise reimplement.
is_device_path (0.4.2) answers "is this string a PLACE?", distinct from is_valid_path's "is this string LEGAL?". /dev/null is a legal path where nothing is ever stored. It came out of Claude-Session-Backup#56, where 2>/dev/null scraped from shell commands was being indexed as a session's top working directory at 119 hits. Any stack consumer harvesting paths from logs or commands wants it.
4. The filekit -> unctools edge reads as weaker than it is
The dependency chain draws it dashed, annotated "peer/extra only (no runtime import)".
Both halves of that are defensible, but together they now understate the relationship. Measured:
pyproject.toml declares unctools>=0.2.2. pip install dazzle-filekit always brings it. The optional [unctools] extra was removed in 0.3.0.
- Nothing imports it at module load:
paths.py and validation.py import inside functions, and _fallback.py — the only top-level importer — is itself imported lazily. import dazzle_filekit succeeds with unctools blocked entirely (verified with a meta-path blocker).
So: always installed, never eagerly loaded. "No runtime import" is accurate about the import graph and misleading about the dependency. Suggest keeping the dashed line but re-annotating it "declared dependency, lazily imported", which distinguishes it from a genuinely optional edge such as preservelib -.-> dzlinklib.
5. profile/README.md — a house-pattern question, not just a link
filekit's entry points "Full documentation" at tree/main/docs. Its docs are now rendered at https://dazzle-filekit.readthedocs.io/ — searchable, cross-linked, with [source] links to the implementation.
No sibling links to a docs site, so this is a convention decision rather than a one-line edit:
- Point filekit's entry at the rendered site and leave the other four pointing at
tree/main/docs — accurate, but makes the others look neglected.
- Adopt Read the Docs across the stack. filekit's setup is deliberately portable: only
project, html_title and the repo URLs are filekit-specific. Roughly an hour per repo.
- Leave all five as-is and treat the rendered site as an unadvertised extra.
Proposed change: an addendum, not an edit
STACK-MAP is marked v1.0, FROZEN 2026-06-11, and its own convention for changes is an # ADDENDUM block opening with a "Ratified by user:" quote — see ADDENDUM D9a. So this should not be a rewrite of the frozen body.
Draft ADDENDUM D10a:
- Tombstone the four removed symbols in the L1 rows, pointing at their replacements (matching how A5/A6 handle the unctools and treelib tombstones).
- Update filekit's row header to 0.4.3 with the release list above.
- Add
longpath and the device/sink predicate to L1's capability rows and to "Capability ownership".
- Re-annotate the
filekit -> unctools edge as declared dependency, lazily imported.
The ratification line needs the maintainer's own words; everything else is drafted and ready.
Acceptance
- No symbol listed in STACK-MAP's L1 section fails
hasattr(dazzle_filekit, name). Worth automating — a small script over the map's symbol tables would catch this class permanently, for every layer rather than just L1.
- filekit's version header matches the current release.
longpath and is_device_path appear in the capability map.
- The unctools edge annotation distinguishes "declared but lazy" from "optional".
- A decision recorded on the docs-site question, whichever way it goes.
Summary
docs/STACK-MAP.mdstill describes filekit as it was at 0.3.0. filekit is now at 0.4.3, and the map's L1 section lists four symbols that no longer exist while omitting two capability areas that do. Since the map is the contract the other five libraries read, a stale entry is worse here than in a README.Surfaced while building filekit's documentation site: drawing its dependency diagram against this map exposed the divergence in both directions.
Owning epic: #3.
1. Four symbols listed that 0.3.0 removed
Measured against the installed package (
hasattr(dazzle_filekit, ...)):normalize_pathnormalize_cross_platform_path(p, resolve=True)normalize_path_no_resolvenormalize_cross_platform_path(p)(defaultresolve=False)get_path_typeclassify_fs_object(p)get_drive_mappingsunctools.converter.get_mappings()(the D3 / V9 fold)All four are in the L1
fns (paths)/fns (utils.compat)rows. The map already records the D3 deprecation in a Notes column, but the symbols remain listed as if callable.This is the part with real downstream cost: a library designing against the contract could reasonably plan on
normalize_pathexisting.2. Version header is two minors behind
Now 0.4.3, published to PyPI. Releases since the freeze:
longpath: WindowsMAX_PATHshims via on-demand junctionsis_device_pathdevice/sink predicate; bare-string guards on all five collection-taking entry points (filekit#16)3. Two capability areas absent from the capability map
grep -c 'longpath\|is_device_path' docs/STACK-MAP.md→ 0.longpath(0.4.0) is arguably a new L1 capability rather than a detail: it is the remedy for a conditionutils.validation.is_valid_pathonly ever detected.shim_pathmakes a file overMAX_PATHopenable by any application by siting a junction at a short root. Worth a row under "Capability ownership (one home each)" — it is the sort of thing another library would otherwise reimplement.is_device_path(0.4.2) answers "is this string a PLACE?", distinct fromis_valid_path's "is this string LEGAL?"./dev/nullis a legal path where nothing is ever stored. It came out of Claude-Session-Backup#56, where2>/dev/nullscraped from shell commands was being indexed as a session's top working directory at 119 hits. Any stack consumer harvesting paths from logs or commands wants it.4. The
filekit -> unctoolsedge reads as weaker than it isThe dependency chain draws it dashed, annotated "peer/extra only (no runtime import)".
Both halves of that are defensible, but together they now understate the relationship. Measured:
pyproject.tomldeclaresunctools>=0.2.2.pip install dazzle-filekitalways brings it. The optional[unctools]extra was removed in 0.3.0.paths.pyandvalidation.pyimport inside functions, and_fallback.py— the only top-level importer — is itself imported lazily.import dazzle_filekitsucceeds with unctools blocked entirely (verified with a meta-path blocker).So: always installed, never eagerly loaded. "No runtime import" is accurate about the import graph and misleading about the dependency. Suggest keeping the dashed line but re-annotating it "declared dependency, lazily imported", which distinguishes it from a genuinely optional edge such as
preservelib -.-> dzlinklib.5.
profile/README.md— a house-pattern question, not just a linkfilekit's entry points "Full documentation" at
tree/main/docs. Its docs are now rendered at https://dazzle-filekit.readthedocs.io/ — searchable, cross-linked, with[source]links to the implementation.No sibling links to a docs site, so this is a convention decision rather than a one-line edit:
tree/main/docs— accurate, but makes the others look neglected.project,html_titleand the repo URLs are filekit-specific. Roughly an hour per repo.Proposed change: an addendum, not an edit
STACK-MAP is marked v1.0, FROZEN 2026-06-11, and its own convention for changes is an
# ADDENDUMblock opening with a "Ratified by user:" quote — see ADDENDUM D9a. So this should not be a rewrite of the frozen body.Draft
ADDENDUM D10a:longpathand the device/sink predicate to L1's capability rows and to "Capability ownership".filekit -> unctoolsedge as declared dependency, lazily imported.The ratification line needs the maintainer's own words; everything else is drafted and ready.
Acceptance
hasattr(dazzle_filekit, name). Worth automating — a small script over the map's symbol tables would catch this class permanently, for every layer rather than just L1.longpathandis_device_pathappear in the capability map.