Kaka Ruto

Kaka Ruto

@kaka-ruto

Applied AI Software Engineer

Applied AI software engineer building practical products from idea to production.

Kaka's Build Desk

Small daily shipping notes.

14 contributions

The nine-day quiet streak ended with a provider explosion — ask-llm-providers swelled from a dozen hardcoded subclasses to 26+ data-driven providers overnight. Replaced OpenAI-compatible provider subclasses with a registry pattern and ProviderConfig transformation contract, added CostCalculator with models.dev pricing, wired in OpenRouter with tiered/audio cost-per-million, and shipped token/cost instrumentation into ask-agent. ask-llm-providers grew to cover 26+ providers with proper pricing, shared testing contracts, and consolidated docs tracking all 33 entries in the registry. A long quiet stretch can feel like stalled momentum, but sometimes it is the incubation period before a structural leap — the cost layer, the registry, and the tests all needed to land together.

Ten consecutive quiet days — the streak has entered double digits, and the count itself has become the headline. Ran the fetch pipeline one more time; zero events, healthy API, valid token — the same mechanical confirmation as the nine days before. Another clean zero on the board, extending the longest inactivity streak since tracking began. When silence stretches past ten days, the daily act of checking and documenting becomes the only artifact worth keeping — the build is the habit, not the output.

Nine days silent — the streak that started as a footnote now defines the chapter. Pulled the rolling window one more time; the fetch pipeline returned nothing, and manual spot-checks of the token and API limits confirmed the tooling is healthy. Another zero day on the board, extending the record to nine consecutive quiet days. When a quiet streak outlasts every past active streak, the log's real value shifts from recording output to documenting the patience to keep looking.

Eight days and counting — the longest quiet streak the builder log has ever recorded. Confirmed the fetch returned zero events again; verified timestamps and token validity, same as the previous seven days. No activity to report, but the eight-day streak itself is a meaningful data point. Two full cycles of quiet days teaches that absence of activity is itself a signal worth counting, not a gap worth filling.

Five consecutive quiet days — longest inactivity streak since builder-log tracking began. Confirmed the fetch returned zero events again; verified timestamps and token validity. No activity to report, but the streak itself is the record. Sustaining a daily logging habit through zero-activity days is what makes the data trustworthy when activity returns.

Four consecutive quiet days — the longest inactivity streak since the account became actively tracked. Verified the fetch returned zero events again; confirmed the token and window were correct by checking timestamps. No new builder-log-worthy activity; the streak of zeros is itself the signal worth logging. Consistent zero-data records are cheaper to keep than to second-guess later — a daily check removes ambiguity.

Another 24-hour window with no GitHub events — three consecutive quiet days across the account. Ruled out fetch errors: the script ran cleanly, returned zero events, and the API token is valid. The event timeline stays accurate; no activity to misrepresent or inflate. Even streaks of zero activity are worth recording; they define the baseline that makes active days meaningful.

The GitHub event window returned zero events across all repos — a second consecutive quiet day. Confirmed the API is healthy; the zero count represents genuine inactivity, not a fetch failure. The builder log reflects an unfiltered quiet day without padding or fabrication. Consistency matters more than volume: logging quiet days preserves the signal accuracy of the whole timeline.

The GitHub event window showed no activity across private or public repos. Verified the fetch window is healthy — zero events is the real signal, not a connection failure. The builder log stays accurate with a truthful quiet-day entry. Silence is also data: skipping a day or padding the entry would undo the habit this log is meant to build.

40 contributions

The ask-rb MCP stack had diverged into two implementations — a standalone proxy-mcp gem managing tool process lifecycle and a separate embedding in llm-proxy — with neither built on a shared runtime. Extracted a general-purpose Server Runtime into ask-mcp with stdio transport, tool timeout, graceful shutdown, and dedup, consumed it in llm-proxy while archiving the ask-proxy-mcp gem, added CONTRIBUTING.md and RELEASE.md to all twenty-two gems, and launched ask-web-search with dynamic searxng URL support backed by VCR-recorded tests. The entire ask-rb MCP stack now runs on a single shared runtime eliminating the duplicate proxy-mcp gem, every gem carries self-contained contributor documentation, and web search has proper integration test coverage. Before consolidating two systems that do the same thing at different abstraction levels, extract the shared kernel first — merging without that extraction risks migrating one flawed implementation to another and calling it consolidation.

24 contributions

After weeks of feature work across the ask-rb gem ecosystem, individual gems had drifted to different minor versions with no coordinated release baseline. Cut release tags across all twenty-two ask-rb gems — core, agent, tools, schema, llm-providers, instrumentation, mcp, eval, auth, rails, slack, notion, linear, github, sentry, honeybadger, solid_errors, monitoring, opentelemetry, skills, sandbox-providers, and tools-shell — then updated llm-proxy's Gemfile to pull the new versions. The entire ask-rb ecosystem now sits on a coherent set of published versions, with tools-shell jumping two patches to fix apply_patch streaming and silence failures. A coordinated release wave across twenty interdependent gems is less about individual gem quality and more about sequencing, dependency graph ordering, and knowing which bump is safe to batch and which needs a standalone changelog.

8 contributions

The ask-docs gem index was a sparse table of names with no context, and llm-proxy carried an unused gem dependency that had drifted from the tool chain. Added prose descriptions and GitHub source links to every entry in ask-docs' Gem Index, documented ask-web-search as a new catalog entry, then removed low-value version and dependency columns. On the proxy side, dropped the unused ask-tools-shell dependency and refactored tool dispatch so custom-type tools pass through the pipeline correctly. The docs site now presents a browsable tool catalog, and the proxy's dependency tree is leaner with more accurate routing for tools like apply_patch. Removing an unused dependency from the consumer is only half the work — the provider must still satisfy the contract expected by the runtime, or the gap surfaces as a silent mismatch downstream.

4 contributions

The ask-rb docs site needed a working deploy pipeline — the initial setup pushed static content but Cloudflare Pages wasn't building from the right branch. Wired up a GitHub Actions workflow to trigger Cloudflare Pages deploys on master pushes to ask-docs, then iterated through two deploy cycles — the first established the branch mapping, the second resolved a Pages build skipping issue by ensuring the workflow correctly triggered a fresh deploy. ask-docs now deploys automatically from master via GitHub Actions, closing the gap between documentation commits and published content. CI-to-Pages handoffs are deceptively simple — the first deploy often fails not from bad content but from implicit branch-to-environment mappings that are invisible until the pipeline runs end-to-end.

3 contributions

A streaming reliability session across llm-proxy uncovered a cascade of thread-scoping and timeout bugs that needed coordinated fixes at both the proxy and provider layers. Fixed request ID propagation into streaming threads in llm-proxy and resolved Puma socket and write timeouts that dropped connections under concurrent load. Added a bin/dev entrypoint for ergonomic local iteration, cleaned up accumulated scratch files and stray .gitignore entries, and upgraded the streaming provider dependency to close gaps in buffered response assembly. llm-proxy's streaming path now correctly scopes per-connection request state and recovers cleanly from timeouts, while the provider layer assembles streamed chunks without partial delivery. Streaming reliability faults cascade across layers — a timeout bug at the transport layer surfaces as a missing-request-ID symptom at the application layer, and fixing either in isolation misses the real failure pattern.