Repository navigation
Description
Client or integration
Codex App
Area
Tools / MCP / web search
Summary
#2448 closed #2443, but the allowlist it added to src/lib/tool-argument-integers.ts names the wrong field.
Live Codex Desktop wait calls from xAI Grok 4.6 still look like this:
{"cell_id":"358","yield_time_ms":20000.0,"max_tokens":5000.0}and Codex still rejects them before the tool runs:
failed to parse function arguments: invalid type: floating point `20000.0`, expected u64 at line 1 column 40
failed to parse function arguments: invalid type: floating point `5000.0`, expected usize at line 1 column 36
#2448 scoped repair to the bare wait tool, which is the right boundary, but it allowlisted yield-time_ms (hyphen). The advertised schema and the live arguments both use yield_time_ms (underscore). max_tokens is already in the wait-scoped set and is not the miss.
Expected: an integral float in bare wait.yield_time_ms / wait.max_tokens is rewritten to an integer, wait continues the exec cell, and a genuine fraction such as 1.5 still fails. Cursor's namespaced yield_time_ms and any other tool's max_tokens stay byte-identical.
This is a follow-up to #2443 / #2448, not a reopen of #2316 (wait_agent.timeout_ms) or #1611.
Reproduction
-
Route Codex App / Codex Desktop through OpenCodex to
xai/grok-4.6. -
Start a long-running host command through code-mode
execso it yields with a cell id. -
Grok calls the host
waittool with integer intent:{"cell_id":"358","yield_time_ms":20000,"max_tokens":5000}The provider serializes those fields as
20000.0/5000.0. -
Observe the parse rejections above.
waitdoes not run. The model retries the same float and the turn stalls oncontinue.
Live schema advertised in the same session:
{
"name": "wait",
"parameters": {
"type": "object",
"required": ["cell_id"],
"properties": {
"cell_id": { "type": "string" },
"yield_time_ms": { "type": "number" },
"max_tokens": { "type": "number" },
"terminate": { "type": "boolean" }
}
}
}Current origin/dev after #2448:
const U64_NUMBER_FIELDS_BY_TOOL = new Map<string, ReadonlySet<string>>([
["wait", new Set(["yield-time_ms", "max_tokens"])],
]);tests/tool-argument-integers.test.ts currently locks the hyphenated name and even asserts that yield_time_ms with tool identity "wait" must stay 60000.0. That test encodes the miss.
Version
Live reject captured on Codex Desktop through local OpenCodex @bitkyc08/[email protected] (loopback 127.0.0.1:10100). The same field name is what #2443 already documented, and origin/dev 81bf4b9a (merge of #2448) still would not rewrite it.
Operating system
macOS (Darwin, Asia/Seoul)
Provider and model
xai / grok-4.6 (OpenCodex-routed Codex App / Codex Desktop host tool surface)
Logs or error output
From Codex session 01a02eb5-7bba-7233-a146-4e0e2219fb80 after the model switched to xai/grok-4.6:
wait {"cell_id":"358","yield_time_ms":20000.0,"max_tokens":5000.0}
failed to parse function arguments: invalid type: floating point `20000.0`, expected u64 at line 1 column 40
wait {"cell_id":"358","yield_time_ms":20000.0,"max_tokens":5000.0}
failed to parse function arguments: invalid type: floating point `20000.0`, expected u64 at line 1 column 40
wait {"cell_id":"358","max_tokens":5000.0}
failed to parse function arguments: invalid type: floating point `5000.0`, expected usize at line 1 column 36
The same session also had earlier integer wait calls (yield_time_ms: 30000) that succeeded. The failure starts when Grok emits the .0 form.
Checks
- I searched existing issues and documentation.
- I removed secrets, tokens, account details, request credentials, and personal data.
Activity
jeongjin0 commentedon Aug 23, 2026
Follow-up PR: #2453
Live capture is from Codex Desktop session
01a02eb5-7bba-7233-a146-4e0e2219fb80after the turn switched toxai/grok-4.6. Integerwaitcalls succeeded earlier in the same session; the hard loop started when Grok emitted.0foryield_time_ms/max_tokens.Local runtime that still reproduces today is
@bitkyc08/[email protected]on127.0.0.1:10100.origin/dev81bf4b9a(#2448) would not have rewritten this payload either, because the allowlist name is hyphenated.lidge-jun commentedon Aug 23, 2026
리뷰 · 우선순위 61 / 80
설명: 이 이슈는 2448 이 착지한 뒤에, 코덱스 데스크톱 호스트 도구 wait 의
yield_time_ms가 아직도 소수로 거절된다고 한다. 2448 이 wait 도구에만 묶은 경계는 맞다. 그런데 허용 이름에 하이픈yield-time_ms를 넣었다. 살아 있는 호출과 광고 스키마는 밑줄yield_time_ms다. 지금 CURRENTdevHEAD 는9cebfc64e이다. 이번 시간에 origin/dev 는ed719b568에서 여기로 왔다. 새 머지는 2448 도구 정수, 2449 콤보 빈 에스에스, 2450 인증 오류 모음 세 개다. package.json 은 2.27.0 이다. src/config.ts 는 3238줄이다. src/runtime 폴더는 지금 HEAD 에 없다. 작성자는 살아 있는 코덱스 데스크톱 세션과 2448 머지81bf4b9a4에서 재현했다. 내가 HEAD 를 열어 보니 허용 목록은 아직 하이픈 이름이다.살아 있는 재현은 이렇다. 코덱스 앱을 엑스에이아이 그록 4.6 으로 보낸다. 긴 호스트 명령을 실행해서 칸 아이디가 나온다. 모델은 wait 에 정수 뜻을 담는다. 그록이
yield_time_ms20000.0 과max_tokens5000.0 으로 직렬화한다. 코덱스는 유64 와 유사이즈로 읽다가 거절한다. wait 는 실행되지 않는다. 같은 세션에서 정수 20000 은 통과했다. 점 영이 오면 막힌다. 기대는 밑줄 이름을 정수로 고쳐서 wait 가 이어지고, 진짜 소수 1.5 는 그대로 실패하는 것이다. 다른 도구와 이름 공간 커서 wait 의 같은 칸은 바이트가 그대로여야 한다.지금 HEAD 의 src/lib/tool-argument-integers.ts 80줄 주석은 2443 의 하이픈 이름과
max_tokens를 말한다. 84줄 도구별 허용 목록은 wait 에 하이픈 이름과max_tokens를 넣는다. 밑줄 이름은 없다. 전역 목록 78줄은 여전히timeout_ms하나다. tests/tool-argument-integers.test.ts 328줄 시험은 wait 정체여도 밑줄yield_time_ms60000.0 을 그대로 둔다고 잠근다. 그 시험이 빗나감을 고정한다. 367줄 스키마와 387줄 사건도 하이픈 이름이다. 그래서 2448 시험은 틀린 이름을 잠근 것이다. src/bridge.ts 627줄이 이 고침을 도구 인자 문자열에 붙인다. 고치는 풀 리퀘스트 2453 이 초안으로 올라왔다. 착지 전에는 이 이슈를 닫지 않는다.max_tokens는 이미 wait 에만 묶여 있다. 그 칸은 빗나가지 않았다. 빗나간 것은 이름 한 글자다. 전역 목록에 밑줄을 넣지 말 것. 커서 형제도 같은 밑줄 이름을 쓰지만, 이번 거절은 코덱스 네이티브 wait 다. 커서 쪽은 따로 증거가 오기 전에는 묶지 않는 편이 맞다. 하이픈 이름을 남겨 둘지는 메인테이너가 정한다. 살아 있는 스키마는 밑줄만 보여 주었다. 둘 다 넣으면 틀린 이름을 시험이 계속 잠근다. 2316 의 wait_agenttimeout_ms와 다른 도구다. 2443 은 2448 로 이미 닫혔다. 이 이슈는 그 닫힘 위의 이름 빗나감이다. 2443 을 다시 열지 말 것.사용자 길이로는 2448 이 착지했는데도 긴 호스트 일을 기다리다가 wait 가 인자 파싱에서 죽는 구멍이라서 61. 카탈로그 팁은 Ox Alpha x-preview-f-free + deepseek-v4-flash-vision-exp. Cursor 정적 카탈로그는 opus-4-8-fast / opus-5-fast. 2334 CursorCredentialRouter 는 여전히 src/providers/cursor-pool.ts 모듈+테스트만 있고 어댑터에 연결되지 않았다. 2332 H2 는 discovery 전용. 2320 overflow + 2342 는 이미 dev. 2188 사이드카는 이미 dev. 2361
__omit__는 이미 HEAD 다. 2292 는 오너가 이번 시간에 2382 로 닫았다. 내가 닫은 것이 아니다. 지금 HEAD 의 남은 구멍은 바뀌었다. src/lib/bounded-body.ts 128줄은 이미 죽은 시그널에서 취소 없이 던진다. 222줄 본문 읽기는 취소한다. 2426 코덱스 웹소켓 나가는 크기 가드는 없다. 2431 빈 에스에스와 410 구멍은 이번 시간 2449 로 착지했다. combo-stream-preflight.ts 는 지금 HEAD 에 있다.src/lib/tool-argument-integers.ts 라인 84 - wait 허용 목록은 하이픈 yield-time_ms 다. 살아 있는 칸은 밑줄이다
src/lib/tool-argument-integers.ts 라인 80 - 주석도 하이픈 이름을 2443 의 칸으로 적는다
src/lib/tool-argument-integers.ts 라인 78 - 전역 목록은 timeout_ms 하나다. 밑줄을 여기에 넣지 말 것
tests/tool-argument-integers.test.ts 라인 328 - wait 정체여도 밑줄 칸을 고치지 않는다고 잠근다. 빗나감을 고정한다
tests/tool-argument-integers.test.ts 라인 367 - 데스크톱 wait 스키마가 하이픈 이름이다
src/bridge.ts 라인 627 - 이 고침이 도구 인자 문자열에 붙는 다리다
PR 2453 - 밑줄로 바꾸는 초안이다. 착지 전에는 이 이슈를 닫지 않는다
메인테이너의 판단이 필요한 지점
너의 추천
이슈는 열어 둔다. 2453 이 초록이 되고 초안에서 나온 뒤에 그 PR 로 닫는다. 허용 이름은 밑줄로 바꾼다. 하이픈은 지우되, 살아 있는 하이픈 거절이 따로 오기 전에는 둘 다 넣지 말 것. max_tokens 는 wait 에만 묶인 채 둔다. 1.5 는 그대로 실패하게 둔다. 커서 형제와 2316 은 닫지 않는다. 호출 길을 넓히지 말 것. 라벨은 그대로 둔다. 프리뷰 배포가 아니다.
이 댓글은 grok-bot이 작성했습니다
lidge-jun commentedon Aug 24, 2026
Landed via #2453 at c44e43f