# SymForge 8.10.7 — beta-test findings (AAP workstation, 2026-07-07)

Live-use log from real work in `E:/project/Agent_Army_Professionals` (Claude Code MCP client,
Windows host). Append-only during the beta; each finding carries impact + repro where known.
Convention borrowed from terminal-commander's dogfood docs.

## Findings

### F1 — daemon degraded to local fallback right after the update (HIGH)
First `health_compact` after the 8.10.7 update reports:
`mode=daemon_degraded_local_fallback | Sidecar: dead pid=14780 port=55420 | Watcher: local-fallback (no watcher attached) | session_id=local-process-14780`.
Impact: no file watcher means edits made outside this process (other agents, git pulls) will NOT
be picked up live — stale-index risk in exactly the multi-agent scenario AAP runs; frecency has
no history; co-change reports `stale/head-mismatch`. The engine still answers (index fresh-loaded,
2504 files, 3.3 s), so it's a silent degradation: nothing failed loudly, the mode string is the
only tell. Two asks: (a) sidecar/daemon should self-heal or the MCP reconnect should restart it;
(b) a degraded mode this consequential deserves a louder signal than a substring in the runtime
line (e.g. a `degraded: true` top-level field + one-line WHY).
Context: previous session (8.10.3) the same client showed `mode=daemon_reused_session` with an
active watcher, so this is a regression or an update-transition artifact (old sidecar pid killed
by the update, never respawned).

### F2 — UserPromptSubmit hook: heuristic single-token matches are noise (MEDIUM)
The prompt-submit hook fires "Prompt-context signal: heuristic" on generic English words in
conversational prompts — observed matching the tokens `output`, `pull`, `idle`, `limit`,
`progress`, `close`, `program`, `intel`, `updated` — each injecting a context block (sometimes
with anchors to unrelated files, e.g. `pull` → nothing, `close` → plasmate/transport.rs) and
claiming savings like "~51508 tokens vs whole-file read" for a prompt that never asked about
code. The claimed-savings baseline is fiction when the prompt is conversational ("pull latest
from git" is a git request, not a symbol lookup). Suggest: require ≥2 corroborating signals
(path-like token, camel/snake case, backticks) before injecting on heuristic matches, and cap
the claimed-savings line to exact/high-confidence matches.

### F3 — PostToolUse hook re-anchors on files mid-merge-conflict (LOW, arguably correct)
While a file contained git conflict markers (`<<<<<<<`), the Read/Edit hook reported
`Parse status: partial — tree-sitter: syntax error near '}'` with a byte span. This is honest
(the file WAS broken), and after the conflict was resolved the next hook fire showed the symbols
back. Logging as a positive-with-a-nit: the diagnostic names the tree-sitter error but not the
obvious probable cause; a one-word hint ("conflict markers present?") when `<<<<<<<` is in the
file would turn a scary-looking diagnostic into an obviously benign one.

### F4 — index survived the frontend→studio cutover cleanly (POSITIVE)
After a 45-commit fast-forward that deleted an entire tracked frontend tree and added `studio/`,
the fresh load re-indexed without failures (2504 files, 0 failed, 4 quarantined partials — all
pre-existing/expected classes). Project generation bumped (p2-g2) as expected. No stale-path
ghosts observed in searches so far.

### F5 — graphify-out/cache dominates the index (MEDIUM)
`get_repo_map` shows `graphify-out/cache: 963 files, 280,253 symbols` — that's ~86% of ALL indexed
symbols (326,941 total) coming from a knowledge-graph tool's JSON cache dump that happens to sit
untracked in the repo root. Admission tiers let 1000 JSON files in as full-index. Impact: load
time, memory, and ranking noise (any symbol search now competes with a quarter-million cache
entries). The vendor/generated heuristics catch `expected_generated_partial` for parse purposes
but not for ADMISSION. Suggest: default-exclude untracked+gitignored directories (or at least
`*-out/cache/` patterns / directories >N files of pure JSON) from full indexing, with an explicit
opt-in.

### F6 — edit facade writes to the INDEX ROOT, not the caller's worktree (HIGH)
A subagent working in an isolated git worktree (`.claude/worktrees/agent-…`) used the SymForge
edit facade to apply a change; the edit landed in the SHARED main checkout (the daemon's indexed
`project_root`) instead of the agent's worktree copy. The agent caught it, reverted the shared
tree, and re-applied by hand — but in a parallel multi-agent campaign this is silent
cross-contamination: worktree isolation is defeated by any symforge edit, and a sibling agent's
`git add -A` could sweep in a foreign change. Root cause is presumably that edit ops resolve
paths against the daemon's project root rather than the MCP client's CWD. Asks: (a) edit ops
should take/honor an absolute target path and refuse to silently retarget onto the index root;
(b) when the requested file's realpath is outside the index root, either edit it in place or
error loudly — never remap. (Related: `worktree=explicit-call enabled` exists in capabilities —
maybe the facade should require it in worktree contexts.)

## Environment
- SymForge 8.10.7, MCP client Claude Code, Windows 11, project root `E:/project/Agent_Army_Professionals`.
- Prior baseline: 8.10.3 same session lineage (healthy daemon mode) — see F1.

## Protocol
Ongoing: every SymForge friction/regression/win observed during normal AAP work gets appended
here with a Fx number. Nothing in this file is speculative — observed behavior only.
