Commit Graph
16 Commits
Author SHA1 Message Date
Hermes 8ffba8f7ee daemon: never mirror Obsidian's transient 'Untitled' placeholder; strip stub inbox/needs-review noise
Two fixes:

1. Untitled folder junk + phantom-rename bug (Ryan reported 2026-09-22):
   Obsidian's 'New folder' action does mkdir Untitled immediately, then
   creates the real-named folder afterward -- either as a genuine OS
   rename() or as a second separate mkdir + move-in, depending on
   Obsidian's internal path (confirmed both happen). Previously we
   mirrored 'Untitled' to /data like any other folder, so:
     - the two-separate-creates case left a permanent 'Untitled' orphan
       in /data (its delete event was silently dropped -- handle_vault_deleted
       only tracks ID-shaped names) and fired two separate 'new folder'
       ntfy pings instead of the one rename ping the user expected.
     - the real-rename case (once Untitled stopped being mirrored) then
       had no data_src to rename, so the folder never reached /data at all.

   Fix: UNTITLED_RE skips mirroring 'Untitled'/'Untitled N' outright in
   handle_vault_created. handle_vault_moved falls back to a create-mirror
   at the destination when there's no data_src to rename, covering the
   genuine-rename-from-Untitled case cleanly.

2. Stub /vault notes for /data-first folders (Ryan: 'I don't want needs
   review and a fix-me message, it just needs to create the empty folder
   note and give it the automatic alias'): handle_data_created now writes
   just , matching the
   existing convention across the vault (e.g. R.32.22 Alcohol.md). Dropped
   the needs-review banner and the #fix-me inbox flagging entirely, along
   with the now-dead _find_nearest_inbox_note/INBOX_ID_RE.

Verified both Untitled scenarios live: real OS rename from Untitled now
mirrors as a single create at the destination name; two-separate-creates
(Untitled then real name, Untitled later deleted) leaves no orphan in
/data and produces exactly one ntfy for the real folder.
2026-09-22 10:53:25 -04:00
Hermes 49c46042b5 daemon: decouple watchdog event capture from processing via a queue
Fixes silent rename-event loss on large folder trees. Previously
on_created/on_moved/on_deleted handlers ran synchronously inside
watchdog's own callback thread (git commits, network calls, sleeps),
starving the inotify reader under bursty activity. When the reader
falls behind, watchdog can't pair moved_from+moved_to within its
matching window and drops the rename entirely instead of firing a
degraded delete+create -- so large renames vanished with no log line
and no ntfy at all.

Fix: watchdog handlers now just enqueue (kind, path) tuples onto a
queue.Queue and return immediately; a single dedicated worker thread
drains the queue and does all the slow work. Reader thread never
blocks regardless of downstream latency.

Also adds file-level journal frontmatter automation: new dated entries
under R.16.11 (YYYY-MM-DD.md) get  auto-injected
if missing (matches existing corpus format exactly -- full month name,
no zero-padded day). Idempotent: files that already have a title are
left untouched; files with other frontmatter get title prepended.

Verified: reran the exact 300-subfolder rename repro that silently
failed before the fix -- now completes as a single clean MIRRORED
rename with no orphaned /data state.
2026-09-22 00:36:09 -04:00
Hermes 90fbc240af vault_sync_daemon: mirror full /vault structure forward, not just JD-shaped folders
Forward (/vault->/data) mirroring was gated to only AREA/CATEGORY/ID-shaped
names, so arbitrary sub-structure Ryan creates inside an ID (e.g. dated trip
folders under F.21.21) never propagated to /data. Removed the name-shape
gate; the existing parent-must-exist check is sufficient safety, plus an
explicit '0 System area' exclusion since that tree has no /data root at all.
2026-09-19 13:40:56 -04:00
Hermes d89aeb7d26 vault_sync_daemon: drop unreliable finally-block stop ntfy, add ExecStopPost notify script 2026-09-19 13:34:37 -04:00
Hermes 9f3a99a42e vault-cli: extract to standalone repo, add flake.nix, move one-off scripts to scripts/one-off/ 2026-09-16 13:12:01 -04:00
Hermes 8e8ad466a8 vault-cli: commit one-off migration scripts before extraction to standalone repo 2026-09-16 13:06:57 -04:00
Hermes 57776d46fa vault-cli: update paths for 0 System area restructure (flat 00/01/05/09 layout) 2026-09-16 12:09:58 -04:00
Hermes 069552d1b4 vault move: support area/category/ID codes on either side, incl. cross-level promotion
- vault move now accepts any JD code kind (area/cat/ID) on both old and
  new, not just ID->ID. Enables e.g. 'vault move F.50.09 F.59' to promote
  an ID to a standalone category.
- Refuses if the source has nested JD-coded children (would orphan their
  codes -- that's a bulk renumber, a different and riskier operation).
- Also commits vault_sync_daemon.py (inotify bidirectional /vault<->/data
  sync service, with ntfy notifications on rename/archive/stub/error).
2026-09-15 21:56:27 -04:00
Hermes Agent abf9569a9a vault-librarian: drop .00 category-note check per Ryan's 2026-07-22 ruling 2026-07-22 14:56:52 -04:00
Hermes Agent a347c55479 vault-librarian-prompt: add Step 4 git push
Local commits (auto-fix per-op + Inbox flag commit) are invisible to Ryan and
Obsidian sync until pushed. Add explicit final-step 'git push origin master',
with instruction to report push failure rather than claim changes landed.
2026-07-22 14:01:19 -04:00
Hermes Agent 87bb628ad3 vault-librarian-prompt: rewrite for autonomous tool-enabled cron
Was written for the hermes -z report-only path (no tools). Now that the nightly
is a full agent session with tool access:
- fix stale paths (vault CLI is on $PATH via Nix, not /var/lib/hermes; use
  'vault report --pretty' not the raw python script)
- REMOVE the 'git add -A && commit' step — every vault --execute auto-commits
  per-op, and git add -A would sweep up Ryan's uncommitted journal/Obsidian edits
- flag delivery is now TWO places: append a dated section to the 00.01 Inbox note
  (committed as a single targeted file, safe on a dirty tree), and the agent's
  final response auto-delivers to the Matrix room
2026-07-22 13:57:54 -04:00
Hermes Agent d81d156b79 vault-cli: flip analyze default to Opus, --haiku/--sonnet step down
Opus draws the auto-fix/flag line correctly (Haiku over-fixed on judgment
calls, verified apples-to-apples against the same vault baseline). At ~$0.14/run
it's cheap enough to run nightly. --sonnet/--haiku now step DOWN; --opus kept as
an explicit identity flag; raw -m/--provider still override entirely.

Hermes host defaults (config.yaml default preset, delegation/compression models)
are unchanged — this only affects which model the vault CLI's own hermes -z spawn uses.
2026-07-22 13:44:37 -04:00
Hermes Agent b665413630 vault-cli: tiered analyze — Haiku default, --sonnet/--opus step up
vault analyze now defaults to Haiku/Bedrock (cheap+fast, the nightly tier)
instead of the profile default. --sonnet and --opus step intelligence/cost up
for harder judgment calls; raw -m/--provider still override entirely. Provider
is forced to bedrock only for the haiku (us.anthropic.*) tier; the
global.anthropic.* sonnet/opus IDs use the profile default provider. Adds an
alive banner to stderr (headless -z buffers, so a pass is silent 1-3 min).
2026-07-22 12:34:32 -04:00
Hermes Agent e535ee3608 vault-cli: -m/--provider flags on analyze, git-commit on sync-data, gitignore pyc
- vault analyze now accepts -m MODEL and --provider PROVIDER, passed through to
  hermes -z, so intelligence/spend can be dialed inline per cadence (nightly cheap
  on Haiku/bedrock, ad-hoc on the default smart model).
- sync-data --execute now git-commits like the other write ops (was the only
  mutating op that skipped the commit).
- gitignore + untrack __pycache__/*.pyc build artifacts.
2026-07-22 12:11:43 -04:00
Hermes Agent 4de2d92bbc vault-cli: TUI-style colored --pretty report 2026-07-22 11:36:51 -04:00
Hermes Agent 48681b00c5 vault-cli: Librarian tooling for the R/J/F/I vault
Adds packages/vault-cli (the `vault` CLI: search/show/tree, clobber-safe
create/move/rename across both /vault and /data + manifest regen, sync-data,
report, analyze) and wires it onto $PATH via modules/hosts/core/vault.nix for
server + vault-client hosts. Scripts self-locate siblings via realpath so they
run from the Nix store. Includes the deterministic $0 report generator, the
topology-manifest generator, and the shared Librarian prompt.
2026-07-22 11:11:03 -04:00