Voice-call Twilio callbacks hardened, plugin config schema helper lands

Signal
Three voice-call Twilio fixes in a row: streaming on notify callbacks avoided, status callbacks fixed, signature ordering corrected Plugin config schema helper added: plugins can now declare their config shape instead of hand-rolling validation 259 commits total, +58,404 / -31,751
Context
The voice-call Twilio provider was split out of the parent module on January 13 as part of the 2026.1.14 release prep. That was five days ago. The commit pattern today (three tight fixes in one subsystem) is what happens when a provider split ships, runs in production for a few days, and starts catching the real-world edge cases the pre-release tests missed. The plugin config schema helper is on the same commit day because the same author noticed twice in one week that plugins were hand-rolling the same validation, and pulled it into a helper while the memory was fresh. Tomorrow (January 19) is the stabilization day (doctor config cleanup, Windows argv parsing), which is the expected shape after a production-bug cluster lands.
Evidence
openclaw voice-call triplet: avoid streaming on notify callbacks, fix Twilio status callbacks, fix Twilio signature ordering Each fix is scoped tight: one failure mode per commit, easy to revert Plugin config schema helper: infra work that unblocks downstream plugin authors Docs commit clarifies node_modules guidance (probably a support ticket driving it)
So What
This is the signature of a real production bug being chased down. Three commits to one subsystem, each a narrower fix than the last. The first one probably shipped with “this should handle it,” the second one said “OK not that, but this,” and the third one was “alright, the actual bug is here.” That ladder is the public record of how a provider split reveals the integration seams that the pre-split monolith was hiding. Twilio signature ordering is a classic. The lib hashes params in one order, the verifier hashes in another, and the error is always 403. Half the Twilio integrations in the world have this bug at some point in their lifetime; the other half just haven’t hit the signature check yet. Catching it now is cheaper than catching it during an incoming call in production. The plugin config schema helper is the quiet win of the day. A provider split plus a plugin system plus hand-rolled config validation is a combinatorial support burden waiting to happen. Declarative config schemas per plugin means the error messages get consistent for free, and the typing story stops depending on each plugin author’s individual discipline.
What’s Next
Next pickup: does the plugin config schema helper get adopted by any external plugin within the week? If not, the helper is speculative infra and it will quietly rot. If even one external plugin migrates, that adoption curve is what tells you whether the helper’s API shape was right or wrong. The failure mode to watch for is “adopted by core plugins, ignored by community plugins,” which usually means the helper’s validation is stricter than what community authors actually want.
The node_modules docs clarification is a small commit with a specific shape. A docs clarification about node_modules is almost always reactive: someone hit a confusing state and filed a ticket, the maintainer wrote a section that covers the case, and the docs shipped with that gap closed. That’s fine, it’s how documentation actually evolves. But it’s also worth noting that a project shipping 259 commits in a day with a docs clarification in the middle of it is a project where docs are treated as part of the working surface, not an afterthought. The “avoid streaming on notify callbacks” fix deserves a specific callout. Streaming and notification callbacks are two different conversational modes, and conflating them is the kind of subtle bug that only shows up under load. If the notify callback streams data that the notification handler wasn’t expecting, the downstream behavior is a race: sometimes the callback completes before the stream finishes, sometimes not. The commit probably chose one side of that race by making notify callbacks strictly non-streaming. The production-incident interpretation of today’s commit pattern is worth stating plainly. Voice calls run through Twilio, Twilio signs its webhooks, and signature verification failures manifest as 403s that break the entire call flow. If an incident happened, it was almost certainly “calls are failing,” and the three-commit cluster is the debug ladder. That is an uncomfortable kind of day but a productive one; the fixes landed same-day rather than getting triaged into a backlog.
Log
- Sessions: 0 across 0 projects, 0m total
- Top projects: none recorded
- Commits: 259 across 1 repo (+58,404 / -31,751)
- Models: not recorded
- Cost: $0