@@ -7,8 +7,50 @@ implementation record for older releases.
77
88## [ Unreleased]
99
10+ ### Fixed
11+
12+ - Native Windows no longer crashes with ` AttributeError: os.O_DIRECTORY ` on
13+ every vault command. Read-only inspection and dry-runs (`transaction
14+ inspect` , ` migrate` / ` init` / ` adopt` / ` capture` previews) now work natively
15+ with real equivalent safety checks: path-based casefold-alias auditing,
16+ lstat-based vault identity, and symlink/junction rejection.
17+ - File reads in the transaction core now force binary mode (` O_BINARY ` ), so
18+ CRLF content is hashed byte-exactly on Windows instead of producing false
19+ ` CONTENT_HASH_MISMATCH ` /` EXPECTED_HASH_MISMATCH ` failures.
20+ - CLI output is always UTF-8, fixing ` UnicodeEncodeError ` crashes when
21+ redirecting output containing non-ASCII titles on Windows (cp1252 consoles).
22+ - Retrieval no longer returns zero results for vaults with CRLF line endings:
23+ the chunker, index, and retriever now hash page bodies byte-identically
24+ (previously ` read_text ` newline normalization made every chunk look stale).
25+ - Under a held mutation lock, a vault whose on-disk name differs only by case
26+ from the spelling used on the command line is no longer misreported as its
27+ own portable alias on case-insensitive filesystems (APFS; the lock layer
28+ never runs on native Windows); the descriptor-pinned vault object is
29+ recognized as itself. Inspect-time auditing keeps the stricter shipped
30+ behavior, since an absent init root on a case-insensitive volume cannot
31+ distinguish itself from an alien sibling.
32+
1033### Changed
1134
35+ - Vault mutation on hosts without directory-descriptor confinement (native
36+ Windows) is refused before any side effect with a new
37+ ` UNSUPPORTED_PLATFORM ` validation error (exit 2, previously a generic
38+ ` LOCK_FAILED ` exit 1 or a traceback), and ` init --apply ` no longer creates
39+ an abandoned empty vault directory on refused platforms.
40+ - New transaction write destinations are validated against
41+ portable-filesystem rules on every platform: Windows-reserved device names
42+ (` CON ` , ` NUL ` , ...), ` :<>|?*" ` characters, and trailing dots/spaces are
43+ rejected with ` UNPORTABLE_WRITE_PATH ` so an approved plan means the same
44+ thing everywhere. Reads, retrieval indexing, and journal recovery of
45+ pre-existing files with such names are intentionally unaffected.
46+ - Degraded-mode path walks now reject Windows directory junctions and mount
47+ points in addition to symlinks.
48+ - File permission bits feeding plan hashes are normalized to ` 0o644 ` on
49+ Windows, keeping inspect output deterministic.
50+ - Added a ` .gitattributes ` that disables line-ending translation so checkouts
51+ hash identically on every platform.
52+ - CI gained a ` windows-smoke ` job exercising the portable Python surface and
53+ the new Windows compatibility suite on ` windows-latest ` .
1254- Replaced the animated README hero with the selected static PNG cover while
1355 preserving the warm orbital style.
1456
0 commit comments