Skip to content

Gaps

What the code doesn't do yet, grouped by area, with the open issue for each gap.

What the code doesn’t do yet, or does badly, grouped by area. The issue numbers come from gh issue list --repo basaltbytes/usine --state open --limit 200 on 2026-10-16; 63 issues were open, and each gap below links to one of them.

  • #41: there is no create-usine scaffolder, no GitHub App manifest flow, and no Workers page with preflight on demand; without credentials usine up only shows a notice (up.ts:122).
  • #154: the CLI has up, backup, and export-run only, with no status, stop, restart, or upgrade (cli.ts:23).
  • #233: npm installs of usine packages pull @effect/platform-node-shared 4.0.4, which needs effect ^4.0.4.
  • #280: usine reads the instance once at startup and doesn’t watch it for changes, so every configuration edit needs a restart (up.ts:114).
  • #40: the UI has no configuration form or raw editor, and the surgical YAML writer has no production caller (writer.ts).
  • #281: AgentFrontmatter declares parent_model and parent_effort as snake_case fields and copies them into camelCase by hand, instead of renaming them with Schema.encodeKeys (parser.ts:44, parser.ts:203).
  • #37: usine parses webhooks.mode but never reads it, there is no POST /webhooks/github, and Board moves are the only Hint source (operator.ts:556).
  • #158: every poll fetches every known open pull request again, instead of only after the base branch changes (polling.ts:222).
  • #267: a canceled Run keeps its Event, so changing an Item’s labels back to the same content opens no Run (store.ts:117).
  • #152: the Run drawer can’t rerun a completed Run whose outcome left the Item unresolved.
  • #36: usine posts no Ask on GitHub; approvals, failures, and cycle-budget Asks are visible in the UI only, and there is no question tool that pauses an Attempt.
  • #35: Attempt rows have no usage summary and the UI has no Usage page; token counts and rate windows exist only as transcript envelopes (schema.ts:169).
  • #248: usage of Claude Code children paid by the Gateway’s API key is reported under the Claude plan pool.
  • #159: an operator message to a Pi parent that is waiting on a child waits for the child, then ends the Attempt as Succeeded.
  • #177: a reattached Attempt keeps its own Worker while the scheduler reserved a slot on another one (store.ts:284).
  • #178: the runaway guard loses an Attempt’s elapsed time and its finished sessions’ tokens across a reattach.
  • #180: the checkout of an Attempt closed between a restart and its reattach isn’t reconciled until the next startup.
  • #211: startup recovery calls Executor.recover four times for the same open Attempt.
  • #268: salvage reconciliation fails at every start for Attempts retained on a Worker that usine.yaml no longer lists.
  • #282: a retried Attempt resumes from the previous Attempt’s salvage branch and never fetches the default branch again, so it keeps the base of the first Attempt (provision.ts:485).
  • #179: usine detects a poisoned pi-durable session by wrapping storage and matching an error message.
  • #181: a Pi child’s grep and find tools inherit the orchestrator’s environment.
  • #182: the durable Pi parent runs without Pi’s HTTP dispatcher settings.
  • #185: the durable Pi parent’s system prompt is only the usine section.
  • #187: a crash between an append and the progress commit can lose one envelope that isn’t derived from a parent entry.
  • #195: a task that finishes at the moment its relay fails stays live after stopTask cancels it.
  • #217: DurableHarness must handle pi-durable’s SessionFailed before upgrading past 1.1.0.
  • #227: pull request harvest logs a warning whenever an Attempt’s final commit was never pushed.
  • #256: Claude preflight on a logged-out Worker doesn’t tell you to run claude auth login.
  • #258: the Codex app-server requests github.com and api.github.com on a Worker behind the Gateway.
  • #266: a Codex child that can’t connect to its provider reconnects silently for as long as the Attempt runs.
  • #277: StepResult allows a Comment fact, but harvestFacts never records one (harvest.ts:135).

See Workers and the Gateway for how each Worker kind works.

  • #223: the umbrella issue for replacing exe.dev with EU Workers that usine controls, in three stages.
  • #228: usine up refuses exe.dev Workers and mixed Worker kinds (worker-engine.ts:13, scheduler.ts:76).
  • #196: exe.dev Workers can’t run Pi children.
  • #199: canceling an unlaunched live Attempt on exe.dev leaves its remote children running.
  • #200: exe.dev recovery no longer stops a run host left by an earlier usine version.
  • #201: the exe.dev Worker with SSH children hasn’t run on a real VM.
  • #230: the tests haven’t run an SSH Worker with real Claude Code and Codex children.
  • #231: Attempts on one SSH Worker without a Gateway can read each other’s GitHub token.
  • #229: the harness versions pinned in infra/hetzner/cloud-init.yaml must be updated by hand to match the versions usine supports.
  • #257: the live SSH preflight test cases don’t show each harness’s outcome.
  • #270: two Attempts at once thrash a 4 GB Worker until sshd stops responding.
  • #278: local and direct SSH preflight don’t check the GitHub credential; only the exe.dev preflight raises the credentials capability (exe-dev/preflight.ts:123).
  • #234: the Gateway’s use of a Claude subscription token hasn’t been tested against Anthropic.
  • #235: the Gateway can’t store a Codex ChatGPT login with token refresh.
  • #236: reloading the egress allowlist or the secrets drops the in-memory attachments.
  • #237: the Gateway doesn’t serve GitHub release download URLs or follow repository rename redirects.
  • #240: a tunnel opened to an allowed name can be reused for other names on the same certificate (HTTP/2 coalescing, domain fronting).
  • #243: Attempts on one machine behind the Gateway can read each other’s caller tokens.
  • #249: the executor doesn’t open or maintain the SSH forward to a Gateway’s admin API; the operator must do it.
  • #251: a refused admin request logs its endpoint as HttpApiEndpoint.
  • #254: Workers behind the Gateway have no time source.
  • #255: a tunnel that the client closes before its ClientHello is logged as a not-tls refusal.
  • #261: harness turns behind the Gateway request hosts outside the egress allowlist.
  • #262: usine-gateway exits with status 130 when systemd stops it.
  • #264: infrastructure changes are applied to a running Gateway only by hand, and never to a running Worker.

See The dogfood instance’s Loops for the Loop files.

  • #226: the reviewer Agent pushed a fix commit to a pull request branch although review-pr forbids branch edits.
  • #241: act-on-findings repeats an Attempt that ended with an operator question until the cycle budget is used up.
  • #242: a finish-pr commit on the local Worker has the operator as its author instead of the factory’s App.
  • #279: apps/server installs no tracer, so the Effect.fn spans aren’t exported anywhere, and only console logs are available.
  • #115: v2 task-source port, with local Markdown files as the first source besides GitHub.
  • #56: a seed issue used by tests; it is not a gap.