Skip to content

Releases: awrshift/claude-memory-kit

v5.1.0 — Full-tree audit: real memory privacy, the orchestration layer, v4-rudiment sweep

Choose a tag to compare

@awrshift awrshift released this 17 Jul 12:10

A file-by-file audit (four independent review passes) plus the maintainers' multi-agent orchestration practice, generalized into an opt-in layer.

Added

  • Orchestration layer (.kit/advanced/orchestration-layer/, opt-in): executor / recon / idea-validator agents, /session-review + /second-opinion skills, and four rules (orchestrator fact-check · parallel development + worktree isolation · doc governance · decisions log). One cp set enables it.
  • MEMORY-TEMPLATE.md + hook self-heal: session-start.py creates MEMORY.md from the template on first run.

Changed

  • MEMORY.md is now actually gitignored — the README's privacy claim is finally true; your hot memory can't leak with a push.
  • v4-rudiment sweep: the default rule scaffold and the opt-in /close-day skill no longer reference the retired NSP / daily/-as-default.
  • Hook fixes: periodic-save counts real human turns only; pre-compact checks all three caps; protect-tests parses JSON properly and never blocks notes.
  • lint.py wikilinks resolve against knowledge/concepts/; aggregate_usage.py handles dotted project paths; stale-refs.py cleaned of author-specific paths; settings.json no longer pre-approves rm/mv/chmod.
  • ~16 MB of unreferenced social graphics removed from the tree.

Removed

  • BREAKING: /memory-query — asking the agent in conversation covers it.
  • Orphaned knowledge/log.md and dead config constants.

Migration notes: .kit/CHANGELOG.md § 5.1.0.

v5.0.0 — Lean core: handoffs replace the daily chronicle; three memory caps; stale-refs detector

Choose a tag to compare

@awrshift awrshift released this 09 Jul 12:24

The default is rebuilt around what survived long-running production use. The chronicle-shaped defaults — daily logs + the rolling next-session-prompt — were the parts that silently rotted (unclosed days; an NSP that froze while still looking authoritative; a MEMORY.md that packed 51.5 KB into 152 lines without tripping the old line check). v5 keeps the kit's soul — date-tagged memory, audit-driven promotion, "user only talks" — and swaps the fragile layer for one that fails loudly.

Breaking

  • /close-session replaces /close-day as the default close ritual: capture dated patterns → audit for 3+-date repetition → promote on your "yes" → REPLACE the MEMORY.md header → write the handoff.
  • context/next-session-prompt.md retired. "Where we left off" is now one immutable note per closed session in context/handoffs/; the start hook injects the newest one.
  • daily/ journal + /close-day moved to opt-in .kit/advanced/close-day-layer/ — one cp re-enables it, and it composes with the v5 core.

Added

  • Three independent MEMORY.md caps, hook-enforced (defaults 180 lines / 32 KB / 3000 chars per line; tunable via CMK_MEMORY_* env). Line count alone lies — content densifies into ever-longer lines while wc -l stays flat.
  • Stale-refs detector — every session start, file paths mentioned in memory are checked against disk; anything moved or deleted is flagged. The #1 memory failure is a stale belief that looks current.
  • MEMORY.md header discipline — the header is "current state in 2-3 sentences", replaced at every close, never a chronicle.
  • context/handoffs/HANDOFF-TEMPLATE.md — the five-section session-close note.

Changed

  • session-start.py rewritten: newest handoff + memory stats + projects/experiments overview + knowledge index; injection budget 50K → 20K chars.
  • pre-compact.sh now requires MEMORY.md to be fresh AND under its line cap before allowing compaction.
  • README rewritten beginner-first (incl. the new "Why it doesn't rot" section); all docs + 4 README diagrams synced to v5.

Migration from v4.x

See .kit/CHANGELOG.md § [5.0.0] — or simplest: clone v5 fresh and tell Claude "I have a v4 kit at , help me migrate". Memory entries, knowledge articles, rules and projects carry over as-is.

v4.1.2 — tighten CLAUDE.md operational instructions

Choose a tag to compare

@awrshift awrshift released this 27 Apr 12:39

Close 3 operational gaps in the auto-loaded agent brain so Claude Code doesn't need to read .kit/ docs or guess for common operations. CLAUDE.md size unchanged (156 lines — replaced items with tighter versions).

  • Experiment creation: mandate copying experiments/EXPERIMENT-TEMPLATE.md as starting structure (no invented schemas)
  • Rule creation: explicit created: + last-reviewed: frontmatter requirement (pointer to _example.md.disabled skeleton)
  • Concept creation: explicit reference to knowledge/index.md frontmatter spec
  • Experiment closing: distill ritual essentials inlined (lessons → concepts/, code → projects/, then rm -rf folder)

Why: user feedback "the user won't read files — Claude Code must understand everything from auto-loaded context". Audit found 3 common operations had details only in non-auto-loaded files (.kit/, experiments/README, skill bodies, _example.md.disabled). v4.1.2 inlines the essentials in CLAUDE.md while keeping it under 200 lines per Anthropic project-memory guidance.

v4.1.1 — restore experiments/ + canonicalize date-tagging

Choose a tag to compare

@awrshift awrshift released this 27 Apr 12:39

Two corrections to v4.1.0 minimization.

  1. experiments/ wrongly removed — restored as documented sandbox layer

    • experiments/README.md: convention, lifecycle, agent triggers
    • experiments/EXPERIMENT-TEMPLATE.md: hypothesis/method/result/lessons skeleton
    • Naming: -YYYYMMDD (date-tagged)
    • Distill-on-close: lessons → knowledge/concepts/, code → projects/, then delete folder
    • /close-day flags experiments older than 30 days
  2. Date-tagging promoted from implicit mechanic to documented load-bearing system invariant

    • CLAUDE.md: now has TWO core invariants — "user only talks" + "every memory entry carries a date tag"
    • .kit/ARCHITECTURE.md: new section "Date-tagging convention (load-bearing)" explaining where dates live and why
    • .claude/rules/_example.md.disabled: frontmatter adds created + last-reviewed, plus "Review history" section
    • knowledge/index.md: frontmatter adds created; section-append convention ## [YYYY-MM-DD] <title>
    • context/next-session-prompt.md: every Pick-up/Open-decisions/Recent-deliverables item must be [YYYY-MM-DD]-prefixed; Active experiments section added
    • daily/TEMPLATE.md: clarifies date-in-filename + optional [HH:MM] inline + audit candidates cite triggering dates
    • .claude/memory/MEMORY.md: "Why dates matter" section; entries without date declared a bug
    • .claude/skills/close-day/SKILL.md: Phase 2 audit explicit date-arithmetic queries; Signal E for experiment hygiene; example proposals quote specific triggering dates as evidence

Other:

  • README.md: "What's inside" tree adds experiments/ line; projects-vs-experiments paragraph below
  • CLAUDE.md: projects/ vs experiments/ comparison table; agent-trigger guidance
  • .kit/CHANGELOG.md: full v4.1.1 entry with migration notes
  • .kit/VERSION: 4.1.0 → 4.1.1

No code changes — date-tagging machinery in lint.py/compile.py already worked. This release makes the convention explicit and restores experiments/.

Verified: lint.py 0 issues, zero Cyrillic in tracked files.

v4.1.0 — English rewrite + new README cheat-sheet graphics

Choose a tag to compare

@awrshift awrshift released this 27 Apr 12:39

Documentation rewrite:

  • README.md: full English rewrite (was Russian post-9e2c68e); replaced "Memory accumulates" growth-curve section with two new sections "Memory layers" + "Promotion pipeline"; updated "What's inside" tree to reflect .kit/ subfolder; added "Hooks and operators" section
  • CLAUDE.md: dropped role-guidance section, simplified hooks list (5 hooks accurate), all Russian dialogue examples replaced with English
  • SKILL.md (root): description updated, English-only
  • daily/README.md + new daily/TEMPLATE.md: explicit format for /close-day output, dropped role-guidance refs
  • .claude/skills/close-day/SKILL.md: audit Phase 2 retargeted to knowledge/concepts/ + .claude/rules/ (was role-guidance), all examples in English
  • .claude/skills/tour/SKILL.md: rewritten — drop role-guidance Stop, drop hooks deep-dive, English-only
  • .claude/memory/MEMORY.md: clean template, no role-guidance refs, English examples
  • context/next-session-prompt.md: pointer cleanup
  • projects/my-first-project/BACKLOG.md: 5-task onboarding guide translated to English

New README cheat-sheet graphics (.github/assets/, Gemini Pro Image 16:9 2K):

  • og-banner.png: refreshed — 4 isometric slabs with real file path labels (CLAUDE.md, MEMORY.md, rules/, concepts/), subtitle "Memory + Rules + Wiki + Hooks"
  • 03-memory-layers.png: NEW — three-panel infographic showing HOT CACHE / WIKI / RULES with file paths and "WRITES: agent (...)" tags
  • 04-promotion-pipeline.png: NEW — Liquid → Amber → Crystal (rules OR concepts) flow with real file paths
  • 05-multi-project.png: NEW — folder tree with active scope highlight + "always loaded (shared)" cards
  • 06-hooks-and-operators.png: NEW — two-column cheat-sheet (5 hooks + 5 slash operators)
  • removed 03-knowledge-growth.png — abstract curve replaced with concrete pipeline diagram

Social media assets (untracked → tracked):

  • .github/assets/social/{linkedin-.png, x-post-.png} — 7 marketing images for v4 launch posts

.gitignore: allow daily/TEMPLATE.md through alongside .gitkeep + README.md.

Verified: zero Cyrillic in tracked files, lint.py 0 issues.

v4.0.0 — promote from alpha, replace v3.2.2 architecture

Choose a tag to compare

@awrshift awrshift released this 27 Apr 12:39

Migrates main branch from v3.2.2 to v4.0.0 stable. Two weeks of dogfooding on
avoid-content-site (798 sessions) showed v4 architecture holds up in production.
v3.2.2 stays accessible via the v3.2.2 git tag.

Architecture changes

  • Promotion ritual is agent-driven, not script-driven. /close-day audits today's
    patterns against MEMORY.md and reference skills, surfaces 0-4 promotion
    candidates verbally, writes patches on user «да». Replaces background
    promote-patterns.py detection (was unreliable; violated «user only talks»
    invariant).
  • playbooks/ → .claude/skills/-guidance/SKILL.md with user-invocable: false.
    Anthropic-native primitive: Claude auto-loads when conversation matches
    description. No custom trigger tables.
  • Multi-project isolation via projects//. Switch with «работаем над X».
  • New /memory-audit operator. Two-phase: free size check on reference skills
    (>500 lines threshold) + agent-in-session semantic clustering for splits.

Removed (over-engineering)

  • experiences/ staging layer
  • promote-patterns.py background detector
  • flush.py auto-flush
  • separate playbooks/ directory

What changed in 32 files

  • 7 top-level docs rewritten (README/CLAUDE/ARCHITECTURE/CHANGELOG/SKILL/
    VERSION/knowledge/index). README is hybrid: v3 marketing structure +
    v4 architecture body. Reuses 4 PNG from .github/assets/ (og-banner,
    before-after, daily-workflow, knowledge-growth) — concept-stable across v3→v4.
  • 2 settings/hooks: settings.json registers all 5 hooks with
    $CLAUDE_PROJECT_DIR-anchored paths + per-hook timeouts (15-30s).
    session-end.sh simplified (no auto-flush).
  • 5 memory scripts: config.py drops dangling ARCHIVE_DIR; lint.py +
    compile.py skip README/TEMPLATE/INDEX stems in daily/; flush.py deleted;
    lint.py adds check_oversized_reference_skills() (7th check).
  • 2 commands: new /memory-audit; /memory-lint updated for 7 checks.
  • 10 skills: 7 new role reference skills (design/dev/editorial/marketing/
    seo-geo/product/founder-profile) + memory-audit task skill; close-day +
    tour rewritten under v4 ritual.
  • 2 rules scaffolding: _example.md.disabled rewritten under v4 promotion
    pipeline (6+ months stable + audit confirmation); old .gitkeep removed.
  • 1 aggregator symlink: skills/memory-audit/SKILL.md.
  • daily/README.md re-pointed to .claude/skills/-guidance/SKILL.md.

Verified working

16-test suite passed cleanly: settings.json valid + all hook paths exist;
bash hooks pass syntax check; Python scripts compile + import; skills
aggregator symlinks resolve; runtime tests on every hook with synthetic
stdin; lint.py + compile.py --dry-run clean; cross-references resolve for
all six slash commands (/close-day, /memory-audit, /memory-compile,
/memory-lint, /memory-query, /tour); config.py paths exist for all 8
layer constants.

Net change

39 files changed, 1342 insertions(+), 1635 deletions(-). v4 is more compact
than v3.2 despite adding 7 reference skills + memory-audit operator —
reference skills consolidate what v3 spread across CLAUDE.md/playbooks/
trigger-tables.

Net change

39 files changed, 1342 insertions(+), 1635 deletions(-). v4 is more compact
than v3.2 despite adding 7 reference skills + memory-audit operator.

Migration notes

Anyone on v3.2.x: don't merge in-place. Clone v4 fresh as a sibling
project; agent walks you through importing experiences/ → reference-skill
candidates, MEMORY → re-tagged, daily/concepts/rules copied verbatim.

v3.2.2 — docs cleanup + skills symlinks restore

Choose a tag to compare

@awrshift awrshift released this 27 Apr 12:39

Docs cleanup surfaced by drift report: another agent reading CLAUDE.md
assumed the old flush.py / 18:00 auto-compile flow was still active,
when in reality /close-day has been the default end-of-day flow since
v3.2.0 and flush.py is opt-in legacy. No runtime behavior changes.

  1. CLAUDE.md: deleted the "End-of-day Auto-Compile (v3)" section and
    all 18:00 / CMK_COMPILE_AFTER_HOUR / maybe_trigger_compilation
    references. Replaced the "Auto session-end flush" + "Manual compile"
    paragraphs with a single Manual compile paragraph + one Legacy note
    pointing readers at /close-day and CHANGELOG v3.2.0. Updated the
    L5 Daily row and scripts/ tree annotation to match.

  2. .claude/commands/memory-compile.md: dropped the legacy auto-trigger
    paragraph. The command doc now says only what the command does.

  3. Skills symlink regression. skills/close-day/SKILL.md and
    skills/tour/SKILL.md had been flipped from symlinks to regular
    files (macOS dereferenced during a copy), and the original symlinks
    lingered as "SKILL 2.md" duplicates. Content was identical, but the
    structure contradicted v3.2.1's invariant that root skills/ mirrors
    .claude/skills/ via symlinks. Restored symlinks, removed SKILL 2.md
    artefacts. (No git diff: HEAD already has the correct symlink mode.)

flush.py and the commented-out auto-flush section in session-end.sh
are preserved unchanged as opt-in legacy for users upgrading from
v3.0 / v3.1.

VERSION bumped to 3.2.2.

v3.1.0 — knowledge/ moved to project root

Choose a tag to compare

@awrshift awrshift released this 13 Apr 10:40

Breaking Change

knowledge/ wiki directory moved from .claude/memory/knowledge/ to project root knowledge/.

Why: Claude Code hardcodes .claude/** as sensitive file protection — compile.py (via claude -p) could not write wiki articles even with --permission-mode acceptEdits.

Migration from v3.0.x

mv .claude/memory/knowledge knowledge
# Copy updated scripts from kit:
# - .claude/memory/scripts/config.py
# - .claude/hooks/session-start.py
git add knowledge/ && git commit -m "feat(v3.1): move knowledge/ to project root"

Also in this release

  • session-start.py shows "Recent updates: article-name (today)" for transparency
  • compile.py Rule 6: preserve manually-written content (don't overwrite hand-authored articles)
  • /knowledge-update slash command for manual wiki updates
  • README badges: version + last commit date
  • All CLAUDE.md path references updated

Full changelog: CHANGELOG.md

v3.0.1 — compile.py silent failure fix

Choose a tag to compare

@awrshift awrshift released this 09 Apr 18:57

[3.0.1] — 2026-04-09

Patch release: critical fix for compile.py silent failure mode discovered during rnd-hub live test of v3.0.0.

Fixed

  • compile.py silent failure — v3.0.0 compile.py considered any claude -p exit 0 as a successful compile, updating the state hash for the daily log even when sub-Claude returned a text description instead of actually calling Write/Edit tools. Result: daily log was marked as "compiled" but zero wiki articles were created or modified, and the log was permanently skipped on subsequent runs (hash matched, so compile.py --all was the only recovery path). Detected during rnd-hub live test Test 10: compile.py reported "1/1 succeeded" but concepts/, connections/, knowledge/index.md, and knowledge/log.md were all unchanged.

    Three-layer fix:

    1. Mtime snapshot verificationcompile_daily_log() now captures wiki state via snapshot_wiki_state() before running claude -p, then compares against post-run state. If zero files were created and zero files were modified, compile_daily_log() returns False, dumps sub-Claude stdout to .claude/state/compile-{daily-stem}-stdout.txt for debugging, and does NOT update the state hash — so the daily log stays in the queue for the next compile run.
    2. Strengthened promptbuild_compile_prompt() now opens with an explicit "CRITICAL — this is an automated pipeline, not a chat" preamble warning sub-Claude that the caller verifies success by checking wiki file mtimes. Rules 1-6 now explicitly say "use the Write tool to CREATE" / "use Edit to UPDATE" instead of just "CREATE" / "UPDATE". New Rule 11: "Every action MUST be a tool call (Write/Edit/Read/Glob/Grep). Text-only responses count as a compile failure." Added a "Final step" instructing sub-Claude to return a one-line summary only after all Write/Edit calls succeed.
    3. Added --permission-mode acceptEdits to the claude -p invocation in both compile.py and query.py. Cole's original SDK code uses permission_mode="acceptEdits" explicitly; this was lost during the SDK → CLI subprocess port in v2. Not always strictly required (control tests show claude -p sometimes accepts Write by default in headless mode), but it's correct by convention and defensive against default-mode drift in future Claude Code versions.

Changed

  • compile.py output now includes Wiki touched: +{N} new files, {M} updated line on success, so you can see the pipeline working instead of just "Done. Output: X chars".

Why this matters

The v3.0.0 silent failure was invisible from compile.py output alone — it reported success, lint.py stayed green (because it only checks existing files, not whether compile produced output), and the state hash was updated. The only way to detect it was to manually ls knowledge/ before and after. Without the mtime snapshot guard, users would have assumed their pipeline was working while knowledge accumulated only in daily/ and never compiled.

Credit to rnd-hub's Test 10 protocol for catching this end-to-end — a straight happy-path sanity check would have passed without revealing the bug.

Notes for upgraders from v3.0.0

  • If you already have daily logs that v3.0.0 marked as "compiled" but produced no wiki articles: delete their entries from .claude/state/compile-state.json → re-run compile.py. The new mtime guard will correctly fail (instead of silent-success) if sub-Claude still doesn't write, giving you an actionable debug dump at .claude/state/compile-{stem}-stdout.txt.
  • No breaking changes to file formats, hook protocol, or CLI interface. Pure bug fix.

v3.0.0 — SessionStart injection + end-of-day auto-compile

Choose a tag to compare

@awrshift awrshift released this 09 Apr 18:00

[3.0.0] — 2026-04-09

Major upgrade: ports 3 zero-cost features from Cole Medin's claude-memory-compiler (the Karpathy-inspired original that Memory Kit v2 was derived from) that were lost in the v1 → v2 stdlib port. Also renames JOURNAL.mdBACKLOG.md (cleaner semantic separation with daily/), collapses knowledge/ from 6 → 3 subdirs, and promotes the CLAUDE_INVOKED_BY recursion guard from hidden quirk to documented feature.

All changes remain on Python stdlib + claude -p subscription. No new dependencies. Zero incremental API cost.

Added

  • .claude/hooks/session-start.py — new Python hook replacing session-start.sh. Outputs JSON {"hookSpecificOutput": {"hookEventName": "SessionStart", "additionalContext": "..."}} so Claude Code injects knowledge/index.md + recent daily/YYYY-MM-DD.md logs + top 3 recently-modified concepts into every session's initial context. Adapted from coleam00/claude-memory-compiler. Budget: 50K chars default (CMK_INJECT_BUDGET env var to tune).
  • flush.pymaybe_trigger_compilation() — after 18:00 local time (CMK_COMPILE_AFTER_HOUR env), checks if today's daily/YYYY-MM-DD.md has changed since last compile via SHA-256 hash comparison. If yes, spawns compile.py as a detached background process. End-of-day auto-compile without cron. Logs to .claude/state/compile.log.
  • .claude/commands/memory-compile.md — slash command wrapper around compile.py. Manual override alongside auto-trigger.
  • .claude/commands/memory-lint.md — slash command wrapper around lint.py. Pass --fix for auto-backlinks.
  • .claude/commands/memory-query.md — slash command wrapper around query.py. Natural-language queries with index-guided retrieval.
  • CLAUDE.md sections:
    • SessionStart Injection — describes additionalContext pattern, budget, priority order
    • End-of-day Auto-Compile — describes 18:00 trigger, hash skip logic, /memory-compile manual override
    • CLAUDE_INVOKED_BY — recursion guard (critical) — documents the recursion path that prompted the guard (was hidden quirk in v2)

Changed

  • JOURNAL.mdBACKLOG.md throughout the template. Renamed 3 example projects (example-webapp, example-saas, my-first-project). Updated all references in CLAUDE.md, README.md, .claude/hooks/periodic-save.sh, .claude/hooks/pre-compact.sh, .claude/skills/tour/SKILL.md, experiments/README.md, experiments/001-*/EXPERIMENT.md, context/next-session-prompt.md. Rationale: BACKLOG = task queue (future-forward), daily/ = chronological log (past-forward). Two distinct files with clear semantics. JOURNAL was ambiguous — it conflated both.
  • .claude/memory/knowledge/ collapsed from 6 → 3 subdirectories. Kept: concepts/, connections/, meetings/. Removed: qa/ (empty in practice — compounding loop rarely fired manually), projects/ (duplicated root-level projects/X/BACKLOG.md), experiments/ (duplicated root-level experiments/NNN/EXPERIMENT.md). Updated config.py, compile.py, lint.py, query.py, knowledge/index.md, CLAUDE.md.
  • lint.py checks: 7 → 6. Removed check_stale_experiments because it required knowledge/experiments/ which no longer exists. Remaining: broken links, orphan pages, orphan sources, missing backlinks, sparse articles, missing frontmatter.
  • query.py: removed --file-back flag. It filed answers to knowledge/qa/ which no longer exists. Query remains read-only, index-guided. If you miss it, the answer is in git history.
  • .claude/settings.json — SessionStart hook command updated from bash ".../session-start.sh" to python3 ".../session-start.py".

Removed

  • .claude/hooks/session-start.sh — replaced by session-start.py.
  • .claude/memory/knowledge/qa/ directory (and .gitkeep).
  • .claude/memory/knowledge/projects/ directory (and .gitkeep).
  • .claude/memory/knowledge/experiments/ directory (and .gitkeep).
  • check_stale_experiments() function from lint.py.
  • parse_frontmatter() helper from lint.py (became unused after stale_experiments removal).
  • QA_DIR, EXPERIMENTS_WIKI_DIR, PROJECTS_WIKI_DIR constants from config.py.
  • EXPERIMENTS_RAW_DIR constant from config.py (was only used by check_stale_experiments).

Migration notes for v2 → v3

Existing users with a v2 clone must:

  1. Rename project files: find projects -name JOURNAL.md -exec sh -c 'mv "$0" "${0%JOURNAL.md}BACKLOG.md"' {} \; (or do it manually per project).
  2. Update internal references in context/next-session-prompt.md, CLAUDE.md, and any custom rules that mention JOURNAL.md.
  3. If you had content in knowledge/qa/, knowledge/projects/, or knowledge/experiments/: move articles to knowledge/concepts/ (they lose their subdir categorization but content is preserved). The v3 wiki has only 3 subdirs.
  4. Update hook command in .claude/settings.json: change SessionStart command from bash .../session-start.sh to python3 .../session-start.py. Or re-copy settings.json from the updated template.
  5. Replace session-start.sh with session-start.py from v3.
  6. Pull updated flush.py to get maybe_trigger_compilation().
  7. Optional but recommended: enable end-of-day auto-compile by leaving default CMK_COMPILE_AFTER_HOUR=18, or disable with a high value like 99.
  8. query.py --file-back users: the flag is gone. Answers are no longer filed automatically. If you want this back, copy the pre-v3 version from git history.

Breaking changes summary:

  • File rename: JOURNAL.mdBACKLOG.md
  • Wiki structure: 6 → 3 subdirs
  • Query flag: --file-back removed
  • Hook command: bash → python3

Not breaking:

  • MEMORY.md format unchanged
  • next-session-prompt.md format unchanged (<!-- PROJECT:name --> tags still work)
  • daily/ format unchanged
  • compile.py CLI args unchanged
  • All of v2's other hooks (session-end.sh, pre-compact.sh, periodic-save.sh, protect-tests.sh) unchanged

Fixed

  • compile.py used to have an outdated prompt template that instructed the LLM to write to knowledge/{qa,projects,experiments}/ subdirs. Now strictly references concepts/ and connections/ (and implicitly meetings/ when applicable).
  • pre-compact.sh counted project files by looking for JOURNAL.md. Now looks for BACKLOG.md.
  • periodic-save.sh block message mentioned projects/*/JOURNAL.md. Now says projects/*/BACKLOG.md.