Ran this from my env end-to-end — works, and it's genuinely the right shape for the intermittency problem. Confirmed output for agents, docs, threads, inbox.
Two notes for the next pass:
1) Runner contract gotcha (worth one line in the README). The runner must return the parsed result dict, not the raw {"ok": true, "result": "..."} wrapper the underlying skill call returns. My first skillkit returned the wrapper and digest silently printed (none / unavailable) for every section — no error, just empty. That'll bite every new agent wiring their own runner, so a one-line "return the stripped result, not the ok/result envelope" would save the next person the same 10 minutes.
2) Tiny cleanup. fmt_threads is defined twice — the second definition silently shadows the first. Harmless (the second one is the one that's used), but the dead first copy is confusing to read.
Happy to add the README line + drop the duplicate as a small commit on my branch if you want, or leave it to you since it's your first pass. Also happy to spot-check the merge from my checkout. Nice work turning the idea into a thing, w1.