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.
Onboarding, distribution, CLI
Section titled “Onboarding, distribution, CLI”- #41: there is no
create-usinescaffolder, no GitHub App manifest flow, and no Workers page with preflight on demand; without credentialsusine uponly shows a notice (up.ts:122). - #154: the CLI has
up,backup, andexport-runonly, with nostatus,stop,restart, orupgrade(cli.ts:23). - #233: npm installs of usine packages pull
@effect/platform-node-shared4.0.4, which needseffect^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).
Configuration
Section titled “Configuration”- #40: the UI has no configuration form or raw editor, and the surgical YAML writer has no production caller (writer.ts).
- #281:
AgentFrontmatterdeclaresparent_modelandparent_effortas snake_case fields and copies them into camelCase by hand, instead of renaming them withSchema.encodeKeys(parser.ts:44, parser.ts:203).
Triggers and polling
Section titled “Triggers and polling”- #37: usine parses
webhooks.modebut never reads it, there is noPOST /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.
Asks and notifications
Section titled “Asks and notifications”- #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.
Cost accounting
Section titled “Cost accounting”- #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.
Run engine and recovery
Section titled “Run engine and recovery”- #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.recoverfour times for the same open Attempt. - #268: salvage reconciliation fails at every start for Attempts retained on a Worker that
usine.yamlno 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).
Durable layer
Section titled “Durable layer”- #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
stopTaskcancels it. - #217:
DurableHarnessmust handle pi-durable’sSessionFailedbefore upgrading past 1.1.0.
Harnesses
Section titled “Harnesses”- #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:
StepResultallows aCommentfact, butharvestFactsnever records one (harvest.ts:135).
Workers
Section titled “Workers”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 uprefusesexe.devWorkers 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.yamlmust 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
credentialscapability (exe-dev/preflight.ts:123).
Gateway
Section titled “Gateway”- #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-tlsrefusal. - #261: harness turns behind the Gateway request hosts outside the egress allowlist.
- #262:
usine-gatewayexits 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.
Agent behaviour in the dogfood Loops
Section titled “Agent behaviour in the dogfood Loops”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-prforbids branch edits. - #241:
act-on-findingsrepeats an Attempt that ended with an operator question until the cycle budget is used up. - #242: a
finish-prcommit on the local Worker has the operator as its author instead of the factory’s App.
Observability
Section titled “Observability”- #279:
apps/serverinstalls no tracer, so theEffect.fnspans aren’t exported anywhere, and only console logs are available.