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>
First full run of the Eval C discrimination harness (3-level ambiguity ladder,
6-scenario run-set, 3 reps/cell, both sonnet+haiku): 36 headless reps, 12/12
cells PASS at ≥2/3 majority. Haiku 18/18 reps, sonnet 17/18 (P1-L1 rep 1: final
message citing only 0005, not governing 0002 — a boundary artifact, not a
behavioral miss). Zero over-trigger ADR creation on any negative at any level;
all positive passes via governing-ADR citation (16 reps) or judge fallback (1).
Two harness defects fixed before running the grid: (1) bin/run pipefail bug that
aborted remaining reps after first FAIL (changed checker invocation to || true);
(2) positive axis-b previously required ADR creation only, contradicting the
README's design statement that "consulting and/or recording is correct" — run-set
positives sit in already-decided territory, so find→cite→comply is the correct
behavior. Implemented three-branch axis-b check: created (new ADR file),
cited-governing (final message cites the governing Accepted ADR), or judge
fallback. Added two self-test guards to verify the compliance path.
Scenario metadata updated to document the corrected axis-b checker behavior
(cited-governing as a valid pass branch). TSV reasons column now records the
pass path via `B-via:` field for positives.
Verdict: Eval B wording generalizes to a new fixture, new language, new domain,
and decreasing cue explicitness. Grid ceiling not found; next signal is
production (rollout + IRL session audits). Run-set baseline locked; wording
tuning moves measurement to reserve-set.
Eval B wording reached 8/8 (sonnet) / 7/8 (haiku) on its run-set
after five iterations; subsequent W3 stability testing confirmed
intermittent flicker but acceptable performance. As Eval B is now
contaminated by iteration, we need a held-out measurement set to
assess generalization to new projects and cues.
Eval C measures whether learned behavior generalizes across
decreasing cue explicitness (explicit → moderate → conceptual
framing) and, critically, whether the model correctly avoids
false positives (over-triggering) when no Accepted ADR is in play.
Six paired scenarios (positive/negative at each level) run against
a job-execution domain fixture; a frozen reserve-set (notifications
domain) becomes the measurement set if anyone tunes wording against
the run-set.
New: `plugins/os-adr/eval-c/` — bin/ (run/check/self-test/sandbox
scripts), fixture/ (taskq async job queue, 6 ADRs, trigger-phrased
CLAUDE.md), scenarios/ (6 run-set), scenarios-reserve/ (6 reserve-
set), README.md (measurement discipline + design), judge-rubric.md.
Model-free self-test passing. First real grid run is a pending
decision.
Five-iteration /autoresearch wording experiment against the Eval B baseline
(haiku 0/8, sonnet 5/8). Checker/fixtures/scenarios/rubric frozen; wording
surfaces: hook PRESENT_NOTE, find/create SKILL.mds, fixture CLAUDE.md
(declared a surface upfront — it is the real-project adoption template).
- Hook note + skill descriptions: when->then trigger-conditioned phrasing
(H1 confirmed, both tiers)
- find skill: explicit-unconditional reversal->supersede offer where find's
output is on screen (fixed sonnet W3)
- Mechanical lower-tier trigger: before first edit to any existing file,
run find on those paths; additions count (fixed haiku R1/R4)
- New eval-b/fixture/project/CLAUDE.md carrying the same rules
Final grid: sonnet 8/8, haiku 7/8 (W3 axis-b judge flicker). Open: channel
ablation (hook vs CLAUDE.md) not run; R4-nograph now passes both tiers.
Hypothesis->result map: vault note os-adr-eval-b-wording-experiment-hypotheses.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Remove explicit name: frontmatter from os-adr and os-doc-hygiene SKILL.mds
so slash commands register namespaced (/os-adr:find, not bare /find)
- Add bin/refresh-plugins to refresh stale local plugin caches
- CLAUDE.md: cache-refresh procedure, naming-convention pointer, mandate
reading the vault autoresearch-eval howto before the next eval
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Eval B results, the prompting-issue hypothesis, and the open question on
whether in-session subagents could stand in for part of the unprompted-
trigger measurement are now written to the vault
(os-adr-eval-b-grid-results-and-observations) for cross-session reuse.
Marks the os-adr initial iteration (build, migration pilot, Eval A, Eval B
baseline) complete, and adds a deferred TODO to audit plugin naming/slash-
command registration across the marketplace before the next session.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Eval A grid ran clean across all scenarios/tiers. Eval B grid (1 rep/cell)
shows a real gap: haiku never unprompted-consults the ADR system in any
scenario, while sonnet passes 5/8 (misses W3 write-trigger and R1 direct-
conflict retrieval). Updates CLAUDE.md component status and the eval-b
README so the next session picks up from here instead of re-running blind.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Rename skills to bare verbs (hygiene-check -> check, hygiene-clean -> clean),
matching the os-vault/os-orchestration pattern. Remove the commands/hygiene.md
dispatcher in favor of two new skills, status and sweep, so all four actions
are invoked directly as /os-doc-hygiene:<skill> instead of through a custom
subcommand parser that no other plugin in the marketplace uses.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
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>
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>
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>
- 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>
Invert the build order to build-first / migrate-incrementally and
redesign Step 2c as a Claude reference-set benchmark.
- ADR-013 records the build-order inversion; CLAUDE.md locked-decisions
pointer updated
- New benchmark deliverable under docs/memory-system/benchmark/:
shared extraction spec + copy/paste dispatch prompt + reference-outputs
- Runbook (05): Step 1 = fixture selection with bulk migration deferred;
Step 2c = Claude-tiers-only reference set, quality-only metrics, Opus
as gold-standard rubric (produces references, not a model choice)
- 04-build-plan reconciled to the new build order and benchmark design
- Sync incremental-migration + reference-extraction-benchmark specs into
openspec/specs/; archive the completed change
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Update CLAUDE.md: clarify the knowledge layer now specifies the
~/Documents/SecondBrain vault, six-facet taxonomy, and reference the
locked decisions (ADR-011, ADR-012).
Update 02-system-design.md: align with faceted taxonomy (type/
client/project/domain/tool/convention/ plus scope/), express hierarchy
via hubs + wikilinks + Graphify edges rather than nested paths, name
the vault explicitly, update build-plan timestamp.
Add 05-implementation-process.md: concrete build runbook integrating the
locked decisions — seven steps bottom-up from vault migration through
plugin packaging, with the Graphify + Ollama model benchmark (Step 2c)
marked as the critical gate. Open questions deferred or defaulted; most
are non-blocking.
Design milestone: tag taxonomy and vault location locked.
Under the new orchestrator-subagent pattern, version control is
delegated — the orchestrator (Claude) dispatches git operations
to subagents rather than calling them directly. Update the allowed
operations list to reflect this constraint.
Establishes a tool-based delegation rule: all file I/O and shell
commands go via subagents; only git commands, Skill invocations, and
conversational responses are permitted at orchestrator level. Explicit
stop-and-ask rule removes wiggle room for self-authorized exceptions.
Includes model routing table covering the actual work types in this repo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Initialize the repository with configuration for spec-driven change
management via OpenSpec. Add CLAUDE.md to document the project's
purpose (documentation-only design phase for a personal memory system),
directory layout, current architecture, and repository conventions
including provenance discipline and ADR practices. Add .gitignore to
exclude local AI-assistant skill mirror directories (.claude/,
.codex/, .pi/) which are kept in sync locally but not versioned.