From 88b01ec16ec0c1ce17d5532f7cb53ad1c41b7d8d Mon Sep 17 00:00:00 2001 From: "Aaron K. Clark (CryptoJones)" Date: Mon, 6 Jul 2026 17:43:02 -0500 Subject: [PATCH] guard: freshness-block message now gives the exact remediation syntax (3.8.6) GIT_FRESHNESS_MESSAGE was a riddle; agents flailed for many turns. It now spells out the working form: a literal-path fetch chained in the SAME command as the write (git -C "/abs" fetch --all --prune && git -C "/abs" commit ...), plus the silent-fail gotchas ($VAR path not resolved; pipe/redirect in the fetch; exit-nonzero fetch when --all hits a keyless mirror -> use fetch origin --prune). Message text only, no behavior change. +CHANGELOG [3.8.6], version bump. 756 tests pass. Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 5 +++++ pyproject.toml | 2 +- src/omind/__init__.py | 2 +- src/omind/guard.py | 11 ++++++++--- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b668e5..700363f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [3.8.6] - 2026-07-06 + +### Changed +- **Guard: the freshness-block message now hands over the exact remediation instead of a riddle.** `GIT_FRESHNESS_MESSAGE` used to say *"run `git fetch --all --prune` … then inspect branch status"*, which left agents guessing — they would use a `$VAR` path (not resolved by the static parser) or a fetch that errored on an unreachable mirror, and burn many turns flailing. The message now spells out the working form verbatim: a **literal-path** fetch chained in the **same command** as the write (`git -C "/abs" fetch --all --prune && git -C "/abs" commit …`), and names the silent-failure gotchas (`$VAR` path not resolved; pipe/redirect in the fetch part; a fetch that exits non-zero because `--all` hit a keyless mirror — use `fetch origin --prune`). No behavior change; message text only. + ## [3.8.5] - 2026-07-05 ### Fixed diff --git a/pyproject.toml b/pyproject.toml index 772b494..effad3c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "omind" -version = "3.8.5" +version = "3.8.6" description = "Reproduce the OMI/Obsidian memory integration for AI agents, plus a local web app to view, edit, and add memory entries." readme = "README.md" requires-python = ">=3.10" diff --git a/src/omind/__init__.py b/src/omind/__init__.py index 6bf3a1f..66f633c 100644 --- a/src/omind/__init__.py +++ b/src/omind/__init__.py @@ -2,4 +2,4 @@ # Copyright 2026 Aaron K. Clark """omind — OMI/Obsidian memory tooling for AI agents.""" -__version__ = "3.8.5" +__version__ = "3.8.6" diff --git a/src/omind/guard.py b/src/omind/guard.py index 051f558..777e61c 100644 --- a/src/omind/guard.py +++ b/src/omind/guard.py @@ -63,9 +63,14 @@ "this turn; a generic project-memory consult is not enough." ) GIT_FRESHNESS_MESSAGE = ( - "repo work requires a same-turn freshness check before review/edit/test/commit/push: " - "run `git fetch --all --prune` or `git pull --ff-only`, then inspect branch status. " - "For a repo outside the cwd, `git -C fetch --all --prune` freshens that repo." + "repo work requires a same-turn freshness check before review/edit/test/commit/push. " + "Put a LITERAL-path fetch in the SAME command as the write, chained with && — e.g.:\n" + ' git -C "/abs/path/to/repo" fetch --all --prune && git -C "/abs/path/to/repo" commit -am "..."\n' + "(same shape for push / a git write; for `gh pr create`, prefix it with the literal-path fetch too). " + "Gotchas that make it silently fail: (1) the path must be a LITERAL absolute path — a $VAR is not " + "resolved by the static parser; (2) no pipe/redirect in the fetch part; (3) the fetch must succeed " + "(exit 0) — if `--all` hits an unreachable mirror (e.g. a Codeberg remote with no key loaded), use " + "`fetch origin --prune` so it doesn't error out and fail to register." ) GLOBAL_MUTATION_MESSAGE = ( "global config/hook/bootstrap mutation requires explicit user authorization in the "