v0.8.0
Fixed
-
Typed entries:
parse_entries()now returnsErrorEntrydataclasses (dict-compatible via__getitem__), full type hints on all functions, and a small exception vocabulary (AgentLogError/ValidationError/LockTimeoutError) — same behavior, same exit codes. -
stdin reconfigured to UTF-8 on Windows: piped unicode no longer double-encodes into the log (stdout-only reconfigure bug).
-
L10:
load()no longer crashes on a locked/unreadable log file (gracefulOSErrorfallback; regression tests added). -
Concurrent
--addappends no longer lose entries: the append is
now serialized by a cross-process lock file (<log>.lock, stdlib-only,
atomicO_CREAT|O_EXCLcreate with 5s wait and stale-lock recovery)
and the log is re-read inside the lock before writing (lost-update fix). -
_extract_area()marker semantics documented and pinned by tests:
the CI gate and the shell hooks agree on the marker (first matching
line, lastAREA:/LOG:on it — the hooks'grep -m1+ greedysed). -
status_token()strips the en-dash as well as the em-dash (OPEN–->
OPEN). -
start.pyactive_errors()delegates tocheck_errors.parse_entries()
(the canonical parser) instead of re-implementing entry splitting, so
the boot briefing can never drift from the tool's format. -
load()reads withutf-8-sigso a BOM-prefixed log is parsed, not
silently ignored.
Added
- Robustness tests: 100-entry fuzz, BOM / invalid UTF-8, en-dash
statuses, an empty section-5-only log, and multi-marker precedence in
--check-commit(last marker on the first matching line).
Docs
- Add a permanent visitor badge to the README (GitHub traffic stats
only keep 14 days). - README: document the lessons-clustering chain limitation, the parser's
worst-case O(n²) on pathological logs, andLOGNAMErepo-root-relative
paths.