george larson

← home

Open source

Contributions

29 merged12 projects25 in review4 fixed upstream

OpenHands Active Contributor

OpenHands named me an Active Contributor in August 2026. It comes with priority review, triage access, and contributor benefits. The title matters more to me because of who grants it: the people building a coding-agent harness, after reviewing my work and collaborating with me across their projects.

It's an honor. Twenty-one merged contributions across the OpenHands app, software-agent SDK, docs, typescript client, and Agent Canvas are public below and in the official OpenHands contributor directory.

Merged

  • OpenHands / typescript-client #364 merged Aug 2026

    The release ready gate had never once started: every run ended as startup_failure with no jobs and no logs, because the caller granted contents: read to a reusable workflow whose jobs need contents: write, and GitHub validates called-workflow permissions statically, before anything runs. One grant, and the gate runs. First fork PR merged in this repo.

  • OpenHands #16439 merged Aug 2026

    Re-derives the active model stamp from event history so a dropped socket stops leaving the readout disagreeing with the model the agent is using.

  • OpenHands #16441 merged Aug 2026

    Exposes the SDK's existing LLM-switching toggle in Agent settings, so users can stop an agent from moving itself to another model under a confirmation policy that never asks.

  • OpenHands #16279 merged Aug 2026

    Handles SIGHUP in the minimal development launcher so closing a terminal or multiplexer cleans up its detached services instead of leaving ports and lease files behind.

  • OpenHands #16280 merged Aug 2026

    Handles SIGHUP in the extra-backend development launcher so the agent-server cannot survive its parent and keep stale conversation leases alive.

  • OpenHands / docs #750 merged Aug 2026

    Documents issue triage and the ready-for-dev gate contributors otherwise had to learn by failing CI: labeling, acceptance criteria, evidence placement, linked issues, and bot abstention.

  • OpenHands #16758 merged Aug 2026

    Searching xai in the Cloud LLM provider list returned only a fuzzy name match while the real xAI entry sat past the default page cut: the providers hook read the first page and dropped next_page_id. It now walks the cursor to exhaustion, cycle-guarded, so all 135 providers surface. This is the follow-up the #16415 close comment predicted after #16453 fixed the local path.

  • OpenHands #16656 merged Aug 2026

    The desktop app shipped macOS and Windows installers but nothing for Linux, and the deb target could not build at all: fpm refuses a package with no author email. Adds a Linux CI lane mirroring the other two and the four-line maintainer field, so AppImage and deb both build. Smoke-tested on Fedora.

  • OpenHands #16145 merged Aug 2026

    The ACP auth banner detected a signed-in user by shelling the provider's CLI, which only tells the truth on a native local install. On Docker and cloud that probe came back empty, so a correctly supplied credential showed no acknowledgement at all. Adds a neutral 'credentials configured' banner state driven by the secret store, which works on all three. Re-landed here after agent-canvas moved into this repo.

  • OpenHands / software-agent-sdk #4536 merged Aug 2026

    send_message owns skill activation for every user message: matching the text against the agent's skills, attaching the recalled knowledge to the event, and recording the activation so a skill fires once per conversation. The block shipped carrying its own # TODO for test cases. These pin the wiring.

  • OpenHands / software-agent-sdk #4526 merged Aug 2026

    events_to_messages is the projection that turns the persisted event log into the messages the model actually sees, and it had carried a # TODO: We should add extensive tests for this since it was written. Writing the boundary tests exposed a live defect underneath: reasoning items dropped out of re-batched parallel tool calls. Both land here.

  • OpenHands / software-agent-sdk #4482 merged Aug 2026

    Adds POST /file/create_directory to the file router, so a client can create a workspace folder instead of only listing the ones that already exist. Verified over real HTTP against a running agent-server through a locally built typescript-client: nested paths, repeat calls, and immediate visibility to the folder picker's own listing endpoint.

  • OpenHands #16534 merged Aug 2026

    The context meter drew its ring track from a border token, which left the track washed out against the surface behind it. Draws it from the foreground colour instead. Checked by building the full stack from main and from the branch with nothing else changed, then reading the rendered colours out of the running app rather than trusting the token names.

  • OpenHands #16311 merged Aug 2026

    A context-window usage meter, a usage drawer, and manual compaction, replacing the old metrics modal. Carries three fixes found along the way: a divide-by-zero on models that report no context window, websocket usage metrics dropped for non-agent usage ids, and a crash on the home route.

  • OpenHands #16272 merged Aug 2026

    The repo ignored three named subdirectories of .tmp/ while the test harnesses wrote to several more, so runtime state kept turning up in commits. Ignoring the root instead means the list can't fall behind the code again.

  • OpenHands #16239 merged Aug 2026

    The dev launcher handled SIGINT and SIGTERM but not SIGHUP, so closing a terminal or multiplexer killed the launcher and left its detached services running. Reproduced against the real spawn path before and after the fix.

  • OpenHands / software-agent-sdk #4150 merged Jul 2026

    Verifies the kimi-for-coding model id against Moonshot's Kimi Code membership endpoint, so it appears in the agent-canvas model picker with a Verified badge instead of free-typed entry. Companion to agent-canvas #1844.

  • OpenHands #16152 merged Jul 2026

    The mock-LLM end-to-end stack now shuts down gracefully, so a test run stops leaving six orphaned processes and four bound ports behind after Playwright exits.

  • OpenHands / agent-canvas #1844 merged Jul 2026

    Adds Moonshot's Kimi Code membership as a first-class provider option, so a Console API key against api.kimi.com/coding/v1 works without free-typing the base URL. Companion to software-agent-sdk #4150, which earns the model its Verified badge.

  • stupidedi #289 merged Jul 2026

    Re-enabled the 4010 AR943 and RE944 transaction sets (warehouse stock-transfer shipment and receipt advice), whose autoload had been off on the same outgrown segment-element lists as PO850.

  • stupidedi #288 merged Jul 2026

    Re-enabled the 4010 PO850 transaction set, whose autoload had been off because the segment definitions had outgrown its element lists.

  • OpenHands / agent-canvas #1368 merged Jul 2026

    Groups workspace folders by parent in the dropdown, so deeply nested paths stay organized instead of flattening into one list.

  • ferriskey #1133 merged Jul 2026

    Adds the TokenExchange grant type and its domain value objects, opening RFC 8693 token exchange in the Rust auth server.

  • neurolink #1134 merged Jul 2026

    Moves system messages to the AI SDK generateText system option instead of the messages array. Shipped in v9.82.0 on npm.

  • OpenHands / agent-canvas #1434 merged Jun 2026

    The acp-docker example inherits its agent-server image from config/defaults.json instead of pinning a version below the Canvas compatibility floor.

  • last30days-skill #564 merged Jun 2026

    A pass(1) credential source: the Linux analog of the macOS Keychain support, so secrets come from pass instead of a .env file.

  • models.dev #475 merged Dec 2025

    Added the Claude Opus 4.5 entry to the model catalog.

  • opencode #4748 merged Nov 2025

    Documented the Venice.ai provider.

  • largo #164 merged Mar 2014

    Updated the LESS syntax in mixins.less for the WordPress theme. The long end of the track record.

In review

  • OpenHands / software-agent-sdk #4799

    The conversation and bash event clients only checked window.WebSocket, then fell back to require('ws') — which does not exist in the package's ESM build, so Node 22+ reported no WebSocket implementation despite shipping a global. Reads globalThis.WebSocket directly and drops the ws dependency.

  • OpenHands / software-agent-sdk #4796

    The endpoint-audit CI check failed on every fork PR: posting the report comment 403s on a fork's read-only token, so the job went red before anyone read the audit. The report now always lands in the job summary, and the comment posts only on same-repo PRs.

  • OpenHands / docs #771

    Documents the two MCPToolObservation fields from software-agent-sdk #4775: structured_content and result_meta keep an MCP result's structuredContent and _meta in the serialized observation, so protocol-aware clients receive what the tool actually returned.

  • OpenHands / software-agent-sdk #4775

    MCP tool results can carry structuredContent and result _meta alongside their content blocks, and the conversion into MCPToolObservation silently discarded both, after which no downstream consumer (event persistence, websocket delivery, protocol-aware clients) could recover them. The observation gains the two fields. Closes #4776.

  • OpenHands / docs #761

    Documents the per-call llm_profile option from software-agent-sdk #4510: model-selection precedence, unknown-profile errors, resume behavior, and the custom profile-store discovery limitation.

  • OpenHands / software-agent-sdk #4510

    An optional llm_profile field on the task tool, so a parent agent keeps its own model while delegating one task to a cheaper, faster, or specialized saved profile.

  • OpenHands #16994

    The same release ready startup_failure as typescript-client #364, in the monorepo: 100 runs back to 2026-08-07 all died before any job started, invisible in the Actions UI. One contents: write grant in the caller.

  • OpenHands #17009

    The package declared engines.node >= 22.12 while every CI pin builds on 24, so npm handed the published package to a runtime nothing tests, with no EBADENGINE to warn. engines becomes >=24, matching what CI builds.

  • OpenHands / docs #757

    Documents the offline prompt-composition report from software-agent-sdk #4623: what each component bucket measures, and how to run scripts/prompt_composition_report.py against log_completions output.

  • OpenHands / software-agent-sdk #4565, #4623

    A skill or path rule fires once per conversation, on an event condensation is allowed to forget, while the 'already activated' marker persists and is never cleared. After condensation the guidance can be gone from everything the model sees while state still reports it active. Two end-to-end cases run the whole scenario so the intended lifecycle gets settled against observed behavior rather than a reading of the code. #4623: an offline prompt-composition report, scripts/prompt_composition_report.py, that ingests log_completions output and shows what each LLM call's prompt is made of (system prompt, tool schemas, history, latest message), as a per-call breakdown plus a text chart.

  • opencode #43685

    The Task tool awaited its subagent prompt with no timeout, so a stalled subagent (provider hang, SSE keepalives with no content) hung the parent session with it. Adds an optional timeout parameter with a 10-minute default, an env-var override, and timeout: 0 to wait indefinitely. When it fires the subagent is cancelled and the tool returns a <task_error> block carrying the task id for a retry.

  • opencode #43684

    OpenAI's tool-use API rejects function names over 64 characters, so a long MCP server and tool name made the provider return 400 and opencode silently stopped processing. Truncates over-long names to a readable prefix plus a stable hash suffix, so two tools that would otherwise collide stay distinct, and warns instead of dropping one silently.

  • OpenHands #16426

    Adds a provider's whole model catalog as LLM profiles in one pass, instead of one entry at a time.

  • OpenHands / software-agent-sdk #4557

    A per-conversation deny-list for sub-agents, enforced at the spawn site rather than by hiding the option, so an agent that already knows a disabled agent's name still cannot delegate to it. Issue #4556.

  • OpenHands #16600

    Conversation tags a user applies by hand, a filter bar across the panel, and per-card collapse, so a long conversation list stays navigable instead of scrolling forever.

  • livekit / agents #6280

    A fix so a duplicate same-target handoff tool call in one turn no longer reads as ambiguous and aborts the agent switch.

  • open-instruct #1751

    A --launcher flag so non-Ai2 users can run the training launcher locally without a Beaker cluster account.

  • stryker-net #3694

    Extends the array-creation mutator to implicit array creation, a syntax shape it previously had no arm for.

  • stupidedi #292, #293

    Re-enables the 4010 SM204 (Motor Carrier Load Tender) and SH856 (Ship Notice/Manifest, the 856 ASN), third and fourth in the series after PO850 and AR943/RE944, on the same outgrown-segment fix pattern.

  • mitmproxy #8199, #8200

    A Flow.kill() resume-event fix so teardown closes the client connection, plus a KillInjected event so killing a flow disconnects in-transit connections.

  • charmbracelet / crush #2749, #2750

    LSP score-based client selection and single-file-server handling, so single-file language servers start without root markers.

Fixed upstream

  • n8n #29516 shipped in #35456

    A per-runner consecutive-timeout counter that detects and recovers stuck task-runner channels, cutting detection from hours to about six seconds. The PR predated a rework of the same acceptOffer path, so a maintainer re-implemented the idea on current master and credited the diagnosis by name. Shipped to the 2.33 and 2.34 release lines. The full hunt →

  • OpenHands #16415 fixed upstream in #16453

    The Basic LLM provider list stopped at 100 entries because the server's pagination cursor was discarded, putting together_ai, vertex_ai, and xai out of reach in every provider dropdown. Reproduced against unmodified upstream main. #16453 fixed the same bug from the other direction, dropping the limit rather than following the cursor.

  • OpenHands #16443 fixed upstream in #16504

    A ProgressEvent test fallback that could never install itself: it was guarded on the symbol being absent, and jsdom always defines it, which left the request interceptor free to throw during teardown and redden an otherwise passing run. #16504 landed the same root cause. It ships no test, so the 1000-iteration repro lives in that PR's description rather than in the suite.

  • charmbracelet / catwalk #112 fixed upstream in #137

    Added the missing Venice.ai models to the provider catalog by hand. The maintainers took the general fix instead, generating the whole provider config and refreshing it daily, so the catalog stops going stale between contributions.