os-status (#21): fix skill orchestrates remediation of failing checks via a
new hooks/checks.py --json runner; remediation pointers on every Check; new
project-graph-present and config-version-current checks; version= stamping
in .cc-os/config; banner names /os-status:fix as the single entry point.
Suite 64 tests (was 36).
os-backlog (#14): route skill (inspect + config-write subcommands,
lib/backlog/tracker.rb + inspector.rb); destination choice and live-history
migration are named human gates; Config.merge preserves other keys. Suite
54 runs / 110 assertions (was 35). Rollout (onboard cc-os, then one more
project) still pending, so #14 stays open.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EUyiRB4vHaRkhYKUdoMW2P
Cards#snapshot again emits all 19 Types::Card fields (camelCase) plus
labels — 8df0cb7 had narrowed it to 8 keys, dropping listChangedAt and
silently breaking board-audit's stale-Doing check. A regression test
now pins the complete key set (35 runs green). implementation-status
records the 0.2.0 typed-returns migration and the live end-to-end
verification against the real Planka board (run on ovh-vps 2026-07-10).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BS59Nkb7fvJMFB9dZiwZ7H
Deterministic layer: audit/bin/audit-stats (Ruby) composes the existing
extract fact-sheets across all production transcripts since the last
run, writes per-run stats/flags/sheets to
~/.local/state/os-orchestration/audit/, and appends the metrics.tsv
trend ledger (seeded with the 2026-07-10 run: 23 sessions).
Judgment layer: new /os-orchestration:audit-sessions skill — sonnet
auditor fan-out over precomputed flagged regions only, tiered
synthesis with run-over-run trend verdicts, stops before any wording
edit. Nudge: os-status check orchestration-audit-due warns when the
ledger is >=14 days stale (missing ledger = machine not opted in).
Planka recurrence entry deferred: gem offsets are +1y/+6m/+3m/+1m by
design; +2w blocked on parked gem versioning decisions.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XknQRvihHDpYE47RTmUR4N
Sync was push-only via SessionEnd (vault_sync.py/memsearch_sync.py); a second
machine's copies could go stale. session_start.py now runs a fast-forward-only,
10s-timeout git pull for both repos before the staleness check — silent on
success, quiet one-line stderr note on failure, never blocking session start.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018Mb3V8NNzAuns7vgX9A2jU
ADR-023: backlog process management ships as a new os-backlog plugin (not an
os-vault extension) and cc-os's ecosystem role is made explicit — the always-on
personal operating layer of mutually aware os-* plugins, vs cc-plugins' optional
shelf. CLAUDE.md opening updated to match.
ADR-024: Apprise supersedes Pushover as the notification transport (server on
OVH + minimal client this iteration; expansion seeded as P2/P3 board cards).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018Mb3V8NNzAuns7vgX9A2jU
- B1: CLAUDE.md reduced to orientation only; status timeline, component detail,
and plugin procedures moved to docs/implementation-status.md (loaded on demand).
Fresh-session check: ~32k context vs 41.8k baseline (~9.7k/session saved),
orientation probes pass.
- B3: memsearch SessionStart injection measured (61 sessions, median ~11.7KB);
size is hardcoded in the hook, no config knob — report in docs/plans/.
- C3: --setting-sources must include "user" or all plugins silently drop;
~/.claude/profiles/*.json overlays are disjoint from bin/refresh-plugins.
- Plan docs: Gate G0 cleared (WS2/WS4 complete); scope slimmed — A1/A2 deferred
behind an interactive /context check, D dropped (pointer kept), C minimized.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Uc1HZDxnpzTJ8EYLqruEnY
New global plugin with one SessionStart hook running all checks in-process
(hooks/checks.py, check(ctx) -> CheckResult, single registry). Three states:
ok (silent), note (near-zero-token line, never suppressed), warn (one
aggregated banner, once-per-day snooze + permanent suppress in gitignored
per-project .cc-os/). Initial checks: subagent-model-env-override (catches
the WS1 Cluster 1 incident deterministically), adr-system-present (verbatim
port of os-adr's hook, legacy .os-adr/suppress honored), vault-hub-note-present.
os-adr's own SessionStart hook moved here atomically (its hooks.json now
empty; session_start.py stays as wording source of record). Built via
OpenSpec change add-os-status-plugin; 36 model-free tests; smoke-tested
2026-07-06 incl. env-override canary.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Harness: 6 run-set + 6 frozen-reserve paired scenarios from the WS1 verified
misses, Node relaystation fixture (deterministic sandbox-time logs), headless
runner with CLAUDE_CODE_SUBAGENT_MODEL stub for E1P, deterministic-first
checker driving audit/bin/extract (extended with per-segment read targets),
narrow frozen haiku-judge fallback for E1 language axes, model-free self-test
21/21 incl. shipped-instruction-compliant conformance transcripts.
Wording v2: the E1 canary (counted) proved resolvedModel is not model-visible
in the launch result, so the launch-stub-comparison rule was unactionable;
replaced with subagent model self-report on sonnet/opus spawns (subagents know
their exact model ID - verified live). Scenarios/checker/rubric untouched.
Deterministic env-override detection routed to WS3 (plan updated).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Add session-audit findings (10 stratified sessions, verified synthesis)
and E1-E4 eval-scenario backlog: docs/orchestration-audit/
- Add Phase 1 fact-sheet extractor: plugins/os-orchestration/audit/bin/extract
- Post-audit correction: Cluster 1 (all 23 spawns downgraded to haiku) was
NOT a Fable-5 harness bug — root cause was CLAUDE_CODE_SUBAGENT_MODEL=haiku
in ~/.claude/settings.json env block, set by an earlier session as a cost
measure. Removed 2026-07-06. Policy gap (no verify-resolvedModel rule)
stands regardless; E1 remains valid.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Three workstreams with shared methodology: os-orchestration session
audit (WS1), os-vault write-behavior eval (WS2), and status-check
convention + glue plugin (WS3). Each specifies phases, discipline
gates, and deliverables, following the audit-first and eval-B/C
playbook established in the first batch. To be triggered in separate
future sessions.
Moves the doc-hygiene plugin from the standalone cc-plugins repo into
cc-os as plugins/os-doc-hygiene/, following the same pattern as
os-vault and os-orchestration. Also commits the previously-unstaged
ADR-019 (global os-orchestration plugin supersedes per-project
orchestration text), which documents the prior migration but never
made it into a commit.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The plugin directory, symlink, and settings.json were already renamed to
os-vault, but the local-plugins marketplace manifest still declared the old
memory/./memory entry, so skills/slash-commands silently stopped registering
while hooks (wired by absolute path) kept working. Re-registered the plugin
under its new name via the marketplace manifest + claude plugin install/
uninstall, and documented the fix and standing rename procedure (ADR-018,
CLAUDE.md) so this doesn't recur.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Add docs/issue-workflow.md covering token setup, listing, implementing, and
closing issues via tea on the self-hosted Forgejo tracker, plus a pointer
from CLAUDE.md. Captures the tea token-scope and --user gotchas discovered
while implementing SB Content Plan Phase 1.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Closes #1–#6 (Forgejo jared/cc-os).
- Reconcile vault-conventions.md to a single authoritative frontmatter schema (#1)
- Add memory-template plugin skill: template-design + new-type-creation (#2)
- Add howto/convention/reference note templates, each dogfooded (#3–#5)
- Patch 4 proof-of-concept notes to the settled schema (#6)
Note: vault note files (templates, patched notes, vault-conventions.md) live in the separate ~/Documents/SecondBrain repo and are committed by its own SessionEnd hook; this commit covers only the cc-os-tracked files (skill + docs).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Plan A's Step 2 now splits into two distinct phases: 2a writes the
`memory-template` skill (which documents the repeatable 4-step
template-design process and new-type-creation workflow), and 2b writes
the three template files. Step 4 (new-type creation) is absorbed into
the 2a skill's new-type-creation flow.
Added "Injection economics govern template design" as the governing
principle — every vault section must pass the test "a named consumer
acts differently because this is here." Frontmatter schema clarified:
`date:` field restored as immutable creation timestamp, `source:` now
records project provenance (not file paths). Step 1 removal list
corrected to preserve `date:`.
Known Issues table: added fix for non-enum `subtype: cookbook` in the
cookbook note. Migration pools now reference Plan B Phase 3 agent
instead of the planned `/memory-audit` skill.
Key changes:
- Plan B Phase 3: replace on-demand-only framing with queue-and-defer
pattern (SessionEnd writes candidate queue fast in Python; next
SessionStart processes it with already-running LLM — no API call,
no terminal block, one-session lag is acceptable)
- Plan B Phase 3: cut Part B (discrepancy detection) until vault has
25+ active howto notes
- Plan B Phase 2: fix injection hook name (session_context.py, not
session_start.py — the latter has no output channel)
- Plan B Phase 1: add generated_at timestamp to vault-index.json
structure so /memory-find can surface staleness
- Plan B: add silent hook failure risk row to Risks table
- Plan B: update Open Questions to reflect queue-and-defer decisions
- Plan A Layer 1: clarify opt-out framing for inline classification
- Plan A Layer 2: add cross-ref to Plan B Phase 3 invocation decision
- CLAUDE.md: clarify Graphify vault graph vs vault-index.json roles
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Refactors 08-sb-active-use-plan.md into two focused plans following a
design session that diagnosed separate content and findability problems.
Plan A (09): note types (convention/reference/howto), templates, value
gate, two-layer write mechanism, and vault population build order.
Plan B (10): vault-index.json, /memory-find skill, SessionStart
injection, and SessionEnd agent for self-evolving knowledge capture.
08 is retained with a superseded notice linking to the new plans.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Assessment now reasons about ignorable content by category (fetched
deps, build output, caches, tooling/AI-assistant dirs, lockfiles, bulk
data, binaries) so it generalizes across stacks. Onboarding switches to
the config.yaml model qwen25-coder-7b-16k: inference is GPU-bound at
~65 tok/s, so the speed lever is fewer chunks per doc via a larger
context window (GRAPHIFY_OLLAMA_NUM_CTX does not propagate through the
OpenAI-compatible path; context must come from the modelfile). Extends
ADR-017.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Onboarding ran a bare `graphify extract`, but graphify does not honor
.gitignore — it needs its own .graphifyignore. Without one, onboarding
viking-warrior-training-log walked node_modules/ (5,858 files) and
routed its non-code files through the Ollama doc pass; the run was
killed after ~1 hour with no graph.json.
Onboarding is now assessment-first: survey the repo, generate a
per-project .graphifyignore (the ignore set varies by stack), confirm
with the user, then extract. Records the gotcha and decision in ADR-017.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Step 5b (Obsidian vault -> VPS git sync) is now fully done: the vault is a
private Forgejo repo (SecondBrain) and vault_sync.py auto-commits+pushes it on
SessionEnd, mirroring memsearch_sync.py. Step 2e pilot done (llf-schema project
graph onboarded). Step 2d closed (live vault graph is the baseline). Docs and
implementation status updated.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Move memory plugin source from ~/.claude/plugins/memory (untracked) into cc-os/plugins/memory under git
- Port four bash hooks to Python deep-module architecture (config.py, hook_io.py, session_state.py + thin entry points)
- Split memsearch auto-commit+push into dedicated memsearch_sync.py SessionEnd hook (relocation of ADR-015, behavior preserved)
- Cutover via symlink + settings.json rewrite; fresh-session test verified all hooks fire
- Add ADR-016; update CLAUDE.md, build plan, and fix stale bash-hook/source-path references
- Sync three new-capability delta specs into openspec/specs; archive change as 2026-06-12-memory-plugin-source-and-port
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
memsearch episodic memory (Step 4) is now live and synced via git. Record
the final sync design: dedicated private Forgejo repo at
forgejo.swansoncloud.com/jared/memsearch, auto-commit+push via cc-os
session-end hook, and the resolved decision to use a single global
cross-client store (not per-client repos). Commingling is an explicit
design choice, not a tolerated risk. Update build plan to split Step 5 into
5a (episodic sync, done) and 5b (vault sync, remaining). Update CLAUDE.md
implementation status, USER-GUIDE to reflect memsearch now operational, and
add full ADR-015 decision record with rationale and alternatives.
- Sync memsearch-episodic delta spec to openspec/specs/memsearch-episodic/spec.md
- Update README.md: memsearch now active alongside Graphify
- Move change to openspec/changes/archive/2026-06-09-memsearch-episodic-layer/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Step 1 (vault conventions initialization) is now complete: vault-
conventions.md exists at ~/Documents/SecondBrain/ (canonical naming
resolved), all 6 fixture notes are seeded for Graphify extraction
testing, and 14 handbook + design notes have been migrated to the
vault as first-class migration scaffolding per the empirical finding
locked 2026-06-05. Update CLAUDE.md and build-plan.md to reflect
completion and implementation status.
Complete the memory-project skill implementation. Rename memory-query to
memory-vault, split project graph queries into memory-project skill, mark
memory-project DONE in build plan, and clarify session-context.sh scope
(now project graph path only — vault injection removed). Update user guide
with examples of both vault and project graph query workflows.
- Mark Steps 2a, 2b, 3, 6 complete; add implementation status notes
- Add "Implemented Components" section with progressive disclosure to CLAUDE.md
- Document installed plugin, Graphify, and vault setup as working baseline
- Update last-updated date to 2026-06-08
- Add standing instruction to keep CLAUDE.md current as implementation progresses
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Introduces README.md as the main entry point and docs/USER-GUIDE.md to guide users through the memory system design and build plan.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Memory plugin installed globally at ~/.claude/plugins/memory/ with three hooks:
session-start.sh (background graphify rebuild), session-context.sh (UserPromptSubmit
vault injection), and post-tool-use-write.sh (session log + dirty-file tracking)
- Root cause fixed: SessionStart has last-write-wins semantics (undocumented); moved
vault context injection to UserPromptSubmit which concatenates multiple hooks
- Verified working: vault graph map (366 nodes, 346 edges) injected into every session
- ADR-014: Graphify is a structure extractor, not a topic clusterer — hub notes +
wikilinks must be author-provided; migration scaffolding is now a first-class deliverable
- Graph connectivity findings documented in 07-graph-connectivity-findings.md
- Archive 2026-06-05-add-memory-plugin change; sync memory-plugin-hooks and
memory-plugin-skills to stable specs
- Add graphify-out/ to .gitignore (build artifact)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Executes all 16 tasks: local extraction-model benchmark with qwen2.5-coder:7b
selected as the default (7B parameter count, multi-modal, outperforms Mistral on
structured output), disposable vault graph build workflow, and supporting docs.
Adds extraction model options handbook, updates implementation process with
reconciliation strategy, and archives the scoring results.
Add new doc docs/memory-system/benchmark/local-llm-findings-2026-06-04.md
consolidating the local-LLM doc-extraction gut-check run. Key findings:
gemma4:e4b is the best installed model and adequate for the extraction
role (below frontier haiku but acceptable, catching ~45–60% of Opus's
high-value entities); GPU went unused due to NVIDIA driver version
mismatch (fix = reboot, pending); and Graphify owns the ollama call
(HTTP API, prompt/chunking/context/parsing internal) so raw-ollama
tuning is not production config. Add progressive-disclosure pointers
from 04-build-plan.md and 05-implementation-process.md.
Completed the benchmark run that gates Ollama model selection. Generated 18
reference fragments (6 cross-domain fixtures × 3 Claude tiers) and tightened
extraction spec rules based on first-run learnings. Updated implementation
status to reflect that reference set is complete and Ollama scoring is
unblocked. Populated fixture list in dispatch-prompt with final selection.
Replace the stale ~/brain placeholder with the locked vault location
~/Documents/SecondBrain so the build plan agrees with ADR-012 and the
runbook. Pre-existing inconsistency, surfaced during change verification.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>