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.
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.
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.
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.
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.
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.
A massive cleanup session for llm-proxy shed its entire mitmproxy and ASAR patching subsystem while coordinated releases across the ask-rb gems fixed tool call serialization and DeepSeek integration. Stripped the ASAR patching pipeline from llm-proxy end-to-end — removed mitmproxy, backup/restore commands, handle_codex, ASAR constants, and all associated tests — then fixed the proxy launcher to use exec instead of open so HTTPS_PROXY inherits. Across ask-rb, published ask-core (tool call serialization fixes + integration tests), ask-llm-providers 0.1.15 (DeepSeek reasoning_content, format_messages cleanup, VCR tests), ask-agent 0.1.12, and ask-tools 0.1.3 (class-level params_schema). llm-proxy dropped hundreds of lines of dead code and two external dependencies, making the proxy launcher reliable under the Codex Framework for the first time. The ask-rb gems all reached stable, tested releases with proper tool call handling across DeepSeek and OpenAI providers. Accumulated scaffolding from early prototypes — especially around patching and proxying — compounds into a heavy maintenance tax; clearing it in one focused pass resets the cost basis and reveals the real architecture underneath.
DNS resolution is back — a multi-strategy fetch pipeline replaces the broken single-threaded call. Six private PushEvents landed across a single private repo; the work spanned a small version bump sequence (v0.3.0 through v0.3.3) with one structural shift — inlining front-matter into .md.erb views so token_count is always computed. A bugfix ensured front-matter with token_count reliably appears on every markdown response, and several tag-only bumps followed to publish those changes. Zero public contributions, but the meaningful output is the fix itself: the fetch script now falls back through three strategies — native fetch, pre-resolved HTTPS via explicit IP+SNI, and curl subprocess — so a DNS glitch no longer blocks the entire pipeline. Relying on a single DNS path for an unattended cron is fragile. The pipeline should always degrade gracefully through alternative resolution paths rather than logging the same error for a fifth consecutive run.
29 contributions
Build agents that coexist cleanly, not ones that trample the host namespace. Rebuilt solid_agents on Conductor with Rails-introspection tools, error pipeline, SolidQueue scheduling, and WriteFile tool, then fixed a Zeitwerk namespace leak by moving tools out of app/ into lib/. On llm-proxy, added graceful network-error handling, picked the default model from config instead of the first catalog entry, and fixed ASAR integrity hash syncing. On the private side, tore out the Runtime (Tier 1) system from Anywaye—API Provider, Learned models, RunSession—and hardened CI against Playwright version drift and Zeitwerk conflicts. SolidAgents can now be bundled into a Rails host app without namespace collisions—the Zeitwerk fix unblocked Anywaye's integration. Ll-proxy stays up when the internet drops and always activates the right default model. Anywaye's codebase is lighter by one whole runtime tier, and CI doesn't flake on Playwright mismatches. When a gem's tool namespace collides with the host app, Zeitwerk auto-loading is the enemy—move the tools to lib/ and require them explicitly.
Make the proxy as maintainable as the code it proxies. Pushed two commits to llm-proxy — one to fix ASAR integrity hash sync in restore_asar so backups reload without signature errors, and one to auto-rotate old daily logs in server.rb. On the private side, landed a massive 180-commit push on Anywaye adding behavior coverage for action backends, credentials, 2FA, and NL orchestration, plus a docs push fixing ask-docs baseurl for subpath deployment and a WatchEvent signal I started following the ask-docs repo. Ll-proxy now properly validates restored app.asar files and doesn't accumulate stale server logs. Anywaye's test surface expanded across five coverage fronts, and ask-docs now deploys cleanly under a subpath. When you touch packaging and server infrastructure in the same session, verify both integrity and cleanup — they break in different ways.
I wanted to keep momentum without losing the thread of what actually moved forward. I tightened up a public-facing portfolio update, then spent the rest of the session iterating on search quality work in a private codebase. I ended the day with a cleaner surface area to point people at and a clearer next step for improving how content is found. A small, public proof artifact pairs well with private iteration as long as the outcome is described in plain, reusable terms.
I refreshed the portfolio brand surface with my own identity assets. I replaced avatar and icon assets so profile visuals, favicon behavior, and app icon variants all align with the same personal image. The portfolio now feels visually consistent across browser tabs, devices, and in-page identity elements. Brand consistency is a small implementation detail with a large trust impact.
I added a dependency safety guard to the delivery pipeline. I enforced a minimum npm release-age policy in CI to reduce exposure to newly published package risk. The build process now has a practical supply-chain protection layer by default. Simple guardrails in CI can prevent expensive security surprises later.
I polished quality and clarity after the main launch push. I filtered low-signal activity noise, improved release detail presentation, and refined contact-page messaging for clearer communication. The site became easier to read and more trustworthy in both activity context and contact intent. Post-launch polish is where product confidence often gets won.
I shipped the core timeline portfolio experience end-to-end. I built the three-pane Astro layout, wired Cloudflare deployment flow, upgraded the contact experience, and significantly improved GitHub activity signal quality in the right pane. The product moved from setup to a usable, deployable portfolio with dynamic activity and stronger information architecture. High-output days work best when infrastructure, UX, and content model evolve together.
I shipped a targeted release fix for binary naming. I removed a hardcoded release assumption and switched to deriving the binary name from repository context. Release outputs became correct by default across projects that don’t match a single hardcoded name. Small hardcoded assumptions are a common source of cross-repo breakage.
I fixed a release bug that affected non-Cleo Go repositories. I corrected build-target inference so release behavior adapts properly instead of relying on assumptions from one repo shape. Release automation became more reliable for broader project layouts. Release tooling must be repo-agnostic to scale safely.
I focused on making the product story sharper and easier to trust. I tightened README positioning, expanded practical examples, and improved release notes so capabilities are easier to understand in real workflows. Documentation now communicates value faster and sets clearer expectations for what users can actually do. Strong docs are product work, not cleanup work.
I shipped a meaningful platform update across my tooling stack. I introduced remote registry management in Cleo and cleaned up package naming and project metadata across related tooling repos. The release became clearer to adopt, with better consistency between docs, package identities, and distribution references. When product capability and packaging clarity ship together, adoption friction drops fast.