Added
- Professional packaging:
pyproject.toml(version derived from the git tag via
setuptools-scm - no drift), a globaldecision-logconsole script, zero
runtime dependencies. - Installed-mode defaults guard (
_default_base): pip-installed runs resolve
default paths against the current directory; in-place copies keep resolving
against the file's folder. - CI
packagingjob: builds the wheel, installs it into a fresh venv, and
smoke-tests the console script + module import. publish.yml: trusted publishing to PyPI, gated behind thePUBLISH_TO_PYPI
repository variable (skipped until enabled).
Fixed
- Typed entries:
parse_entries()now returnsDecisionEntrydataclasses (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 decisions.txt (stdout-only reconfigure bug).
- L10:
load()no longer crashes on a locked/unreadable log file (gracefulOSErrorfallback; regression tests added).
Docs
Fixed
-
Concurrent
--decide/--revise/--resolveappends no longer lose
entries: the append is 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). -
Document the PR-based push workflow in the README (branch -> PR ->
squash merge with the(AREA: <logged decision>)marker) now that
branch protection blocks direct pushes tomaster.