๐ชต Logs โ Project Instructions
Purpose: The ground-truth, mechanically-recorded layer of the vault โ everything that happened, newest first. Three distinct systems live here; don't conflate them. See hermes-harness-spec ยง3 for the full design this file operationalizes.
The Three Systems
Logs/YYYY.md โ raw event log. Newest-first, unbounded, never pruned.
This is ground truth: "what exactly happened to file X on date Y."
Logs/memory/*.md โ compacted, three-tier memory hierarchy. Derived FROM the
raw log + daily pipeline runs, not a replacement for it.
Bounded, self-pruning, built for "what mattered" / "what recurred."
Logs/heartbeat.md โ one line per scheduled run (dispatcher, lint-agent,
synthesis-agent). Newest-first, self-pruned to the last
90 days. Answers "did last night's cron actually fire
and pass" at a glance โ not vault content, purely a
health check. Written by dispatcher.py and validator.py.
Logs/memory/ โ the daily tier is live as of 2026-07-02 (AgentStack/Hermes/dispatcher.py creates Logs/memory/YYYY-MM-DD.md on first run each day). The monthly and yearly tiers are still not implemented โ don't scaffold those empty tier files in advance.
Logs/YYYY.md โ Raw Event Log
Trigger
Run structural lint
Runs automatically every night at 2:25am via cron โ AgentStack/Hermes/dispatcher.py (frontmatter checks, empty-file checks, missing-Related checks, broken-wikilink checks โ the mechanical LINT-AGENT role, deterministic Python, no LLM). Can also be run manually: python3 AgentStack/Hermes/dispatcher.py from the vault root.
Format (established, already in use โ follow exactly)
## [YYYY-MM-DD] <Event Type>
### <category>
- [TAG] type: path/or/detail
- [TAG] type: path/or/detail
- <Event Type> complete: YYYY-MM-DD
Currently active tag: [LINT]. New tags ([SYNTH], [SKILL], etc.) get added as the other hermes-harness-spec agent roles come online โ don't invent new tags speculatively; add one only when its producing agent actually exists.
Logs/heartbeat.md โ Run Confirmation Log
Not vault content and not part of the memory hierarchy โ a flat operational health check, one line per scheduled job, so "did cron actually run last night" is answerable without reading Logs/2026.md or a memory file. AgentStack/Hermes/dispatcher.py writes a dispatcher line every run; AgentStack/Hermes/validator.py writes a lint-agent or synthesis-agent line (ok or fail + reason) after each LLM step it validates. Newest-first, self-pruned to the last 90 days on every write โ no separate cleanup job needed.
Format
- [YYYY-MM-DD HH:MM UTC] <job>: ok|fail โ <detail>
<job> is one of dispatcher, lint-agent, synthesis-agent. A missing entry for a given night is itself the signal โ if a job didn't finish, it never reached the line that records success.
Logs/memory/ โ Three-Tier Memory Hierarchy
Daily tier is live. Monthly and yearly tiers are not implemented yet. Full design in hermes-harness-spec ยง3.1 โ don't redesign it here, go edit the spec if it needs to change:
Logs/memory/YYYY-MM-DD.md daily / episodic โ keep last 15 โ LIVE
โ bi-weekly rollup
Logs/memory/YYYY-MM.md monthly / short-term โ keep last 3 months โ not implemented
โ on-eviction rollup
Logs/memory/YYYY.md yearly / long-term โ kept forever โ not implemented
Daily file โ real format, as produced by AgentStack/Hermes/dispatcher.py + lint.md/synthesis.md
---
date: 'YYYY-MM-DD'
tier: local
status: in-progress | complete | failed
---
# Memory โ YYYY-MM-DD
## Task Queue
<from Logs/hermes-task-queue.md if present, else a default line>
## LINT-AGENT
- [type: lint] missing-frontmatter: path/to/file.md
- [type: lint] broken-wikilink: path/to/file.md -> [[target]]
## SYNTHESIS-AGENT
- [type: synthesis] ...
- [type: contradiction] ...
## WEEKLY-SYNTHESIS-AGENT
<only present on Sundays, appended by synthesis.md after the nightly run>
## Procedural Signals
- [type: procedural-signal] ...
Each type: tag matches the taxonomy in the spec (lint | skill-candidate | synthesis | contradiction | procedural-signal). AgentStack/Hermes/validator.py checks this file after each LLM step โ frontmatter parses, at least one section is non-empty, no leftover TODO/PLACEHOLDER text, and something actually changed in git โ and sets status: complete or status: failed accordingly. The dispatcher's own ## LINT-AGENT section is idempotent (safe to re-run same-day without duplicating); Logs/YYYY.md is not โ every run prepends a fresh event to the top, by design.
- Monthly file โ storage hygiene only, no graduation authority. Summary + lint trend + carried-forward items + pointer to source daily logs.
- Yearly file โ one condensed paragraph per month + major milestones + archive log.
Compression rubric (what's signal vs. noise at each tier) is still an open question in the spec (ยง8) โ do not resolve it unilaterally from this file.
What Counts as a "Procedural Insight"
A repeated behavior, workflow friction point, or recurring pattern noticed across sessions โ not a one-off event. One-off events belong in Logs/YYYY.md as plain entries; anything that has recurred belongs in a daily memory file's ## Procedural Signals section once that pipeline exists, and from there is wiki/'s to graduate (see wiki/system_prompt).