Skip to content

omlx-claude forwards auto-accept unchanged, and a local-model session under it hangs or crashes #11

Description

@kiki830621

Problem

Original text:
「我發現如果用qwen 3.8街上claude code的話,必須要把auto mode關掉,否則會出問題」
— Source: pasted text, session of 2026-08-18

(Quoted verbatim. "街上" is a typo for "接上" — "connect qwen 3.8 to Claude Code";
"qwen 3.8" is a local model served by oMLX.)

Running Claude Code on an oMLX-served local model through omlx-claude only works if
auto-accept mode is turned off by hand. Nothing in this command says so, and nothing
stops it.

This is a usage-1 finding. It says nothing about usage 2 (OmlxConnectorMCP), where
Claude is still the agent and the permission model is unchanged — the whole point of the
distinction in CLAUDE.md is that capability measured under one does not transfer.

Type

bug

Priority: P0.

Expected

omlx-claude knows one thing plain claude does not: the model about to drive this
session is a local one whose planning and tool-call formatting are weaker than the hosted
models the permission defaults were designed around. The command already re-asserts
settings a user cannot be trusted to have right (LaunchSettings.overrides) and already
declines to launch in one case where a warning was judged insufficient
(managedBaseURLVerdict). An auto-accepting permission mode belongs somewhere on that
same scale — at minimum named at launch, plausibly refused behind an explicit opt-in the
way OMLX_ALLOW_REMOTE=1 works for the loopback gate.

Actual

Every permission flag is forwarded verbatim, unexamined:

// Sources/OmlxClaude/main.swift
let forwarded = Array(CommandLine.arguments.dropFirst())
// ...
let argv = ["omlx", "launch", "claude", "--settings", settings] + forwarded
execvp("omlx", &cargs)

and the shipped help text states the pass-through as a feature:

Sources/OmlxClaude/Help.swift:26
    --continue, --permission-mode and the rest behave as they always do.

grep -rniE 'permission-mode|permissionMode|acceptEdits|bypassPermissions|dangerously' Sources/
returns that one line and nothing else. There is no gate, no warning, no default, and no
test — ProbeTarget scans argv in an argparse-compatible way for --host/--port, so
the machinery to see a flag exists and is simply not pointed at this one.

Observed with auto mode left on:

  • the session hangs or loops — the tool loop repeats the same action, and with
    auto-accept there is no human breakpoint at which it stops;
  • malformed tool calls crash the session — the local model emits a tool call that
    does not conform, and it is executed rather than reviewed.

The two are one failure with a common cause: with the confirmation step removed, nothing
sits between a badly formed tool call and its execution.

Impact

The command's stated audience is someone who types omlx-claude and gets a working local
session. Today that person gets a working session only if they already know to disable a
mode the help text tells them behaves normally. The failure is not quiet — it hangs or
crashes — but it is unattributed: nothing in the output connects it to the permission
mode, so the natural conclusion is that the local model, or omlx-claude itself, is
broken.

Not yet captured

No transcript was recorded at the time, so the two symptoms above are reported, not
reproduced here. Reproducing one before designing a gate is part of diagnose — per this
repo's own rule, a fix wants a test that could have failed on the defect, and neither
symptom has a fixture yet.

Open question for diagnose

Whether the right shape is warn, refuse-with-opt-in, or force the mode off. Forcing
it is the only one that cannot be ignored and the only one that overrides a deliberate
choice; the loopback gate reached for refuse-with-opt-in for a reason worth re-reading
here.

Sister concern

#12 — same source message, same command, different defect. They compound: auto-accept
plus a configuration shared with the operator's ordinary sessions is what turns "a local
model made a mistake" into "a local model edited my setup".

Clarity Surface(idd-clarify run 2026-08-18T06:18:43Z)

Type Source Question for you Status
terminology 「必須要把auto mode關掉」 「auto mode」是指 Claude Code 裡的哪一個?shift+tab 切的 auto-accept edits、--permission-mode acceptEdits、還是 bypassPermissions?(三者要擋的範圍不同,決定 gate 攔在哪一層) resolved @ 2026-08-18T06:24:54Z (reason: 使用者確認:指 shift+tab 切的互動式 auto-accept edits(session 內切換,非啟動 flag))
terminology 「用qwen 3.8」 oMLX 上這個模型的實際 model id 是什麼?(決定這條 gate 是對所有 oMLX 模型一律套用,還是只在特定模型上觸發) resolved @ 2026-08-18T06:24:54Z (reason: 改判為套用範圍決策;使用者確認:一律套用於所有 omlx-claude session,另提供環境變數 opt-out(比照 OMLX_ALLOW_REMOTE))

Current Status

Phase: needs-fix
Last updated: 2026-08-19 by idd-verify

Key Decisions

  • Verify FAIL — 1 blocking, 4 in-scope fixes, 4 follow-ups, 5 withdrawn. Report: #issuecomment-5332342767. No idd-11-verified tag (tag is PASS-only).
  • BLOCK-1: the disableAutoMode assertion is very likely inert for this launcher's own sessions, by two independently documented paths — CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC (asserted three lines above it) disables feature-flag fetching, which already forces Manual; and auto mode requires a model Claude Code recognizes, which an oMLX-served id never is. The mechanism is fine; README, the AUTO MODE help section and the main.swift notice all misattribute auto mode being off to it. Same treatment as CLAUDE_CODE_DISABLE_1M_CONTEXT is a no-op for oMLX-served models, so the #2716 workaround does not bound the session (sister concern from #2) #6: keep the key, stop calling it the reason.
  • Unresolved tension, must not be settled by assertion: the reporter's experience says auto mode was on; the documentation says it should not have been available. No live session was observed — the same condition under which #2716's misattribution shipped. Run a real omlx-claude --permission-mode auto session and record the mode indicator before rewriting the prose.
  • Three in-scope fixes (IS-1, IS-2, IS-4) are the same defect the change itself was fixing: a notice sentence true only for the key population imagined when it was written. Third instance in this change alone.
  • Five claims withdrawn as mechanically impossible, including a HIGH built on misreading autoMode (a classifier-rules object, not a switch). Acting on them would have broken correct code.

Scope Changes

Blocking

  • BLOCK-1 attribution rewrite, gated on a live-session observation.
  • IS-1 the address sentence still fires for credential-only managed conflicts (2/3 of the trigger set), and the new tests cannot go red on it.
  • IS-2 managedConflicts fires on presence not value, so a managed policy that agrees with us is reported as defeating us.
  • IS-3 with OMLX_ALLOW_AUTO_MODE=1 the notice claims we asserted a key we deliberately did not.
  • IS-4 the doc comment and CLAUDE.md give a false reason for the notice change — false before omlx-claude forwards auto-accept unchanged, and a local-model session under it hangs or crashes #11 too, for eight pre-existing keys.

Verify engine (degraded — recorded, not hidden)

  • Cross-model Codex leg disabled (unavailable at operator's request) → no blind check outside the Claude family.
  • Devil's Advocate errored on the first attempt; re-run via workflow resume and completed. Findings are post-DA. The pre-DA table contained a HIGH that would have sent the author to change working code.

Commits

  • 27cdd03, 07c2b8d, 924b5bc, 3f152d1, 9d12a56, 6543db0 — all verified against FROZEN 6543db0 (freshness gate passed)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions