type: hypothesis

summary: Gateway was intentionally stopped/restarted — hypothesis confirmed

next_check: Resolved — gateway healthy, session recovered

evidence: User manually triggered controlled reload at 11:54Z; earlier hypothesis that gateway was intentionally stopped is consistent with recovery sequence (hardened reloads at 02:05Z/02:07Z then controlled reload at 11:54Z)


status: untested

summary: Candidates pipeline gap may be caused by packet restructuring — script needs new candidate generation trigger

next_check: Inspect persistent-chat-memory script for candidate generation logic; verify if the unified packet structure changed the input format

evidence: memory-candidates.jsonl last updated May 16; no new candidates since packet restructuring at 11:54Z May 17


summary: Stale candidates pool (21 entries, oldest May 11) may be acceptable — user prefers restore packs over structured memory

next_check: If user explicitly rejects curated memory in favor of restore packs again, archive candidates pool

evidence: User criticized persistency mechanism at 18:32Z May 16; prefers restore-pack workflow docs


summary: Active_metric scale includes embeddings/cached tokens/tool outputs — understanding formula could improve reload predictability

next_check: Review ACPX config or source code for metric calculation

evidence: active_metric=315423 triggered reload at max=200K on May 16 18:46Z; metric_kind='estimated_full_context_tokens'


summary: ACPX set model override is session-level only and does not persist to opencode.json config file

next_check: Verify whether model switch survives session reload or if opencode.json needs manual update

evidence: Context usage report shows configured_model_context from opencode.json still deepseek-v4-flash:thinking while system prompt shows kimi-for-coding/k2p6; no reload since model set at 12:58Z


summary: Curator journal model identity resolution was premature — confusion persists between configured and actual model

next_check: Next curator run should verify model identity independently rather than trusting prior resolution

evidence: Curator journal 13:00Z tail claimed 'session model identity confusion now resolved (big-pickle, not Kimi)' but system prompt at 13:02Z shows kimi-for-coding/k2p6


summary: Model heartbeat acpx_rc=5 failure may be caused by stale model config in heartbeat script invocation

next_check: Inspect persistent-chat-model-heartbeat script for hardcoded model or config mismatch between opencode.json and actual serving model

evidence: acpx_rc=5 is an ACPX session error, not bash denial. opencode.json still shows DeepSeek V4 Flash. Actual model is GPT-5.4. Session-level config mismatch may break ACPX session creation for heartbeat.


summary: Synthesis cascading failures may be caused by report-validation race or strict expectation check

next_check: Review synthesis report-validation logic in daemon or script for timeout/strictness causing rejection of valid reports

evidence: 4 failures in 3 minutes (16:49-16:52) with 'Internal error' and 'expected report was not written'. Report file may be written but validation check runs before filesystem sync.


summary: Semantic memory garbage may be caused by curator fallback-no-change dumping raw prompt context into explicit_memories

next_check: Inspect persistent-chat-memory script or heartbeat logic for how explicit_memories keys are generated when curation fails

evidence: Many semantic-memory.json keys contain raw 'Turn metadata' or assistant trace text. These look like prompt packet fragments written as memory keys when the curator cannot produce real facts.


summary: Heartbeat acpx_rc=5 cascade was caused by transient ACPX session congestion or a stuck backend that cleared at 18:33Z

next_check: Confirmed — 15+ consecutive successes from 18:33Z May 26 through 09:36Z May 27 with no config changes. Minor acpx_rc=1 sentinel issue remains.

evidence: Recovery sustained without intervention. Fast heartbeat remained healthy throughout. No root cause deeper than transient ACPX issue identified.


summary: Direct ACP truncation bug is in daemon text extraction/stream capture, not OpenCode generation

next_check: Inspect daemon.py direct ACP client for buffer limits, stream flush timing, or regex extraction issues that clip assistant final text.

evidence: OpenCode runtime log contains full 293-token reply. turns.jsonl and Matrix events contain truncated version. Daemon assistant_text capture is the common truncated source.


summary: Truncation bug fix failed because direct-ACP pipeline is fragile for complex multi-tool turns involving daemon code inspection

next_check: On next user turn, retry with simpler approach: grep exact function name in daemon.py, then single Edit tool call. Avoid long explore+read+edit sequences in one turn.

evidence: Turn at 22:22Z with tool sequence read→grep→edit was interrupted. Similar pattern to May 28 13:06Z/13:45Z failures during bulk semantic candidate processing.


summary: Heartbeat sentinel blind spot is caused by curator emitting sentinel inside markdown code block or thinking trace, preventing wrapper regex match

next_check: Inspect wrapper validation regex and compare with actual curator output tail from curator-log.jsonl entries 163-164.

evidence: Every successful run since May 28 reports 'UPDATED sentinel was missing' or 'durable heartbeat activity detected without sentinel'. Curator consistently does real work.