🌴 Tico Self-Health-Check

Comms Β· Memory Β· Media Β· Transcription β€” window: 2026-08-25 β†’ 2026-08-27 03:14 UTC Β· audited by Opus 5 + GPT-5.6-sol subagents (read-only)
65/100
Blended Health Score

⚠️ HIGH β€” Silence-guard & agentic-guardrails are fully inert (wiring bug, empirically proven)

Both safety plugins read context.text and return modifiedText, but the runtime passes event.content and only honors result.content. Every message scores as a no-hit β€” the plugins have never actually intercepted anything since being enabled 08-24, including confirmed leak incidents in that window. Current clean behavior is unenforced model compliance, not active guardrail enforcement. This needs a real fix, not another shadow/enforce flag flip.
Overview
Comms & Silence
Memory & Media
All Issues (13)

Comms / Leak / Silence track

63/100
80
Silence behavior
55
Config integrity
100
DM compliance
55
Stability
85
Tone
10
Enforcement

Memory / Media / Transcription track

68/100
100
Transcription
70
Media anchor
45
Graphiti writes
90
Disk/resource
60
Cron health
65
Bootstrap files

DM-ban compliance

PASS β€” 0 violations

551 Matrix room sessions, 108 Slack channel sessions, 1 Telegram DM β€” all to Ondrej only.

Hard leak incidents (last 2d)

0 found

No "not tagged"/"staying silent" narration. Softer over-narration pattern still occurs (see Comms tab).

Transcription success rate

100% (33/33)

0 ProviderHttpError on Tico's own audio in window. Fallback chain configured but local-Whisper leg not recently exercised.

Media anchoring coverage

98.9% (88/89)

1 image missed anchor. Bigger issue: 69/88 anchored files appear duplicated across up to 5 rooms β€” cross-room contamination.

Graphiti paired-write compliance

~11/21 one-sided

Hard rule requires writing both graphiti + graphiti-thg per significant session. No fallback queue file exists either.

Gateway restarts (2d)

23 starts, 0 crashes

All deliberate (config/plugin iteration), not crash-loop. Idle RSS 111% of watchdog threshold β€” alarm is noise now.

Silence-guard config β€” live vs documented

KeyLive valueStatus
messages.suppressToolErrorstrueas expected
messages.groupChat.unmentionedInboundroom_eventcontradicts lessons-learned.md (Matrix should differ)
messages.groupChat.visibleRepliesmessage_tooldocs say this fails-open silent on Matrix β€” reverted then re-added 08-24
hooks.internal.entries.compaction-notifier.enabledfalseas expected
plugins.entries.silence-guard.shadowModefalse (enforcing)inert regardless β€” see HIGH issue banner

Tone / voice sample vs SOUL.md

"The deploy succeeded but... I can't fully verify the refresh works from here." β€” βœ… exemplary, refuses false confidence
"Compacted th-nexus session β€” 172k β†’ 44k tokens. No other host flagged." β€” βœ… zero padding
"The earlier '118 tests' was inflated β€” corrected." β€” βœ… flat self-correction
"Big, important request β€” let me store the voice note, confirm that stray cron got removed, then do the actual work…" β€” 🟑 preamble narration; DO-THEN-SAY would just do it
"Confirmed from the reply context…" Γ—3 in 17 seconds β€” πŸ”΄ retry-loop reasoning narrated into the room

Verdict: 5/7 sampled strong, 2/7 verbose. No corporate-speak or flattery detected anywhere.

Restart pattern (2 days)

MetricValue
Gateway starts, 2d23 (16 on 08-26 alone, config/plugin iteration burst)
Gateway starts, 7d37
Crashes / SIGKILL / OOM0
Idle RSS vs threshold1.67 GiB / 1.5 GiB (111%) β€” alarm now permanently on, low signal value

Bootstrap file size hygiene (16,000 char hard limit)

FileBytesStatus
MEMORY.md14,591 (14,422 py-chars)90% of limit β€” above 14k alert threshold
AGENTS.md12,173OK
SOUL.md8,512OK
TOOLS.md16,734OVER limit β€” actively truncated on injection

Cron / scheduler health

JobResult
fleet-dashboard-nightly-refreshPASS β€” 8/8 probes, 02:03 UTC
infra-scan (system cron)PASS β€” 15 hosts, 39s
Memory Dreaming Promotion34 consecutive errors
infra-smoke-test5,452 skips logged
config-edit-alert6,619 skips logged
Scheduler totals222 jobs, 96 enabled β†’ 72 OK / 6 error / 14 skipped / 4 never run

Media anchoring & transcription detail

MetricValue
Unique inbound media, 2d89 (56 img / 23 ogg / 10 m4a)
Anchored correctly88 / 89 (98.9%)
Missed anchor1 image, 2026-08-26 07:26:21
Cross-room duplication69/88 files appear in 2–5 rooms β€” 1,014 anchor records from 88 files
Audio transcribed33/33 (100%), 0 ProviderHttpError
Graphiti add_memory calls, 2d21 across 9 sessions (15 graphiti / 6 graphiti-thg)
Paired-write compliance~5 episodes paired, ~11 one-sided
graphiti-queue.jsonlabsent β€” no fallback durability
G-1 β€” silence-guard plugin is a complete no-opHIGH
Reads context.text, returns modifiedText. Runtime passes event.content, only honors result.content. Empirically verified by invoking the hook both ways — real shape produces no detection at all, ever. 0 shadow-mode log hits since 08-24 deploy, across a period with confirmed leaks. The 08-26 shadow→enforce flip changed nothing.
G-2 β€” agentic-guardrails plugin has the identical defectHIGH
Same wrong data-shape assumption (context.text / modifiedText) as G-1. Both plugins need a real interface fix against the actual runtime hook signature, not another config toggle.
Cross-room media anchor contaminationHIGH
69 of 88 anchored media files in the last 2 days appear duplicated across 2–5 different room anchor logs, producing 1,014 anchor records from 88 source files. Looks like replay-driven duplication rather than one anchor per source event β€” risk of cross-room content bleed, which is a hard-banned behavior.
TOOLS.md over the 16,000-char bootstrap limitMEDIUM
16,734 chars β€” actively truncated on every session injection per the observed bootstrap warning. Needs condensing or splitting per the documented tiering rule (warn 13k / alert 14k / emergency 15k).
Graphiti paired-write rule not consistently followedMEDIUM
~11 of 21 recent add_memory calls were one-sided (only graphiti OR graphiti-thg, not both), against the 07-20 hard rule requiring both after every significant session.
graphiti-queue.jsonl fallback file is absentMEDIUM
The documented fallback queue for interrupted/missed Graphiti writes doesn't exist on disk. Any write lost to a restart mid-session currently has no recovery path.
Memory Dreaming Promotion cron β€” 34 consecutive errorsMEDIUM
Scheduler shows 34 back-to-back failures on this job. Needs root-cause before it silently stays broken indefinitely.
Silence-guard config contradicts own documentationMEDIUM
messages.groupChat.unmentionedInbound / visibleReplies are set on this Matrix-primary host, but memory/lessons-learned.md:1851 states these keys fail-open silent on Matrix and were reverted on Matrix hosts specifically. Two internal records disagree β€” needs an explicit owner decision, not a silent re-edit.
Retry-loop narration leak (soft class)MEDIUM
08-27 03:06 β€” three near-identical "Confirmed from the reply context…" messages posted 17 seconds apart while Tico worked through a retry. Should have collapsed to one message after resolution. The regex pattern that should catch this exists in the guard's pattern list but the guard itself is non-functional (see G-1).
1 inbound image missed anchoringLOW
2026-08-26 07:26:21 β€” one staged PNG has no corresponding entry in any per-room anchor log.
MEMORY.md approaching hard limitLOW
14,422 python-chars β€” above the 14k alert threshold, 90% of the 16k hard cap. Needs a condense pass before it forces mid-policy truncation.
Local Whisper fallback leg not recently exercisedLOW
Direct OpenAI whisper-1 path handled 100% of traffic in window; no log/access-time evidence the local Whisper fallback actually ran. Not urgent since primary path is healthy, but the fallback is unverified in practice.
Idle RSS chronically above watchdog thresholdLOW
1.67 GiB idle vs 1.5 GiB memory-pressure-watchdog threshold (111%) β€” 361 warnings in 2 days. Not causing crashes, but the alarm is now permanently tripped and has lost its usefulness as a signal.
Several cron jobs persistently show skipped/disabled despite being "enabled"LOW
infra-smoke-test: 5,452 skips. config-edit-alert: 6,619 skips. Worth a pass to confirm these are intentionally gated vs silently dead.