diff --git a/README.md b/README.md index 332e019..a3a7df1 100644 --- a/README.md +++ b/README.md @@ -675,7 +675,7 @@ Auto-discovery is based on the presence of `AI_CONTEXT.md`. No hardcoded list to Copy `tools/ai_docs/config.sh.example` to `config.sh` and fill in: - `GRAPHIFY_BIN` — path to the graphify binary - `OBSIDIAN_VAULT` — root of your Obsidian vault -- `OBSIDIAN_PROJECT_DIR` — subfolder for this project +- `OBSIDIAN_PROJECT_SLUG` — canonical kebab-case slug for this project (for example, `ai-native-dev-stack`) - `CLAUDE_MEMORY_KEY` — subfolder name in `~/.claude/projects/` ### 3. `AI_CONTEXT.md` diff --git a/hooks/tests/test_hooks_v4.py b/hooks/tests/test_hooks_v4.py index 89abe31..3eb1d5d 100644 --- a/hooks/tests/test_hooks_v4.py +++ b/hooks/tests/test_hooks_v4.py @@ -157,9 +157,14 @@ def test_two_concurrent_ends_produce_independent_outcomes(self) -> None: for label, result in (("a", a), ("b", b)): with self.subTest(session=label): self.assertEqual(result.returncode, 0, msg=result.stderr) - # The error is a transport error (HTTP 401), not a - # log-truncation / silent-loss artifact. - self.assertIn("HTTP", result.stdout) + payload = json.loads(result.stdout.strip().splitlines()[0]) + metadata = payload["metadata"] + # With no Obsidian server in CI this is a transport failure; + # the invariant is independent persistence reporting, not a + # particular HTTP status. + self.assertIn("sessionSaveError", metadata) + self.assertEqual(metadata.get("needsTriage"), True) + self.assertIn(label[-1] * 4, metadata.get("notePath", "")) if __name__ == "__main__":