| name | adapter-tool-flow-debugging |
| description | Use when the user reports odd behavior in adapter-path ClaudeEval (i.e. $UseClaudeRuntime = True). Typical symptoms include the tool_call text being written into a Column[{...}] cell verbatim, the LLM complaining "éå»ã®æ€çŽ¢çµæãèŠããªã" and re-searching repeatedly, the final LLM response not appearing in the notebook, web_search looping 4+ times, or LLM hallucinating an answer while ignoring rich tool results. This skill covers ClaudeTurnTrace, ConversationState inspection, and how to tell from an event trace where in the turn pipeline things went wrong. |
Adapter tool-flow Debugging Skill
$UseClaudeRuntime = True ã®ãšãã«èµ°ã adapter çµè·¯
(iClaudeEvalViaRuntimeBridge â ClaudeRuntime proposal loop â iToolExec*)
ã§èµ·ããçç¶ã蚺æããæé ãPhase 30 ç³»åã®ãããã°ããæœåºããã
çç¶ã«ã¿ãã°
| çç¶ | çãå Žæ |
|---|
tool_call ã®çããã¹ãã Column[{"<tool_call name=...>"}] ã«è©°ãããã | MaxContinuations = 1 çãç¶ç¶ turn äžè¶³ |
| LLM ããéå»ã®æ€çŽ¢çµæãèŠããªãããšèšã£ãŠåäžã¯ãšãªãç¹°ãè¿ã | iToolResultsToPromptText ã®åªå
é ã Summary å
é |
| tool çµæã¯è±å¯ãªã®ã« LLM ã hallucination å¿çãã | tool çµæ prefix ã«åŠå®ç [NOTE: do NOT ...] |
| Notebook ã«æçµããã¹ãå¿çãåºãªã (tool summary ã®ã¿) | isAfterDaemon éå°é©çšã§ text æžã蟌㿠skip |
LLM ãæžãã Column[{Style[...], Hyperlink[...]}] ã Column[{"ãŸãšããŸã", "[DONE]"}] ã«åãã | lastTurnIsTextOnly && hasPriorCodeInMsgs ã§ blocks={} ããã |
| 䜿ã£ãŠããªãã®ã«ãRate limit activeã衚瀺 | rate_limit_event ã® status="allowed" 誀èšé² |
| "ClaudeRuntime: èµ·å倱æ" ã§å³ $Failed | Kernel ãªã»ããæšå¥šãClaudeBuildRuntimeAdapter ã® Option äžæŽå |
| ã¹ããŒã¿ã¹ããŒããClaudeRuntime: åŠçäž... Nsãã®ãŸãŸæ¢ãŸã(Phase D2 衚瀺ãåºãªã) | AsyncToolExec ã® polling tick ãç»é²ã§ããŠããªãããŸã㯠$claudeProgress[pollKey] ã®è¿œå æ
å ±ã ClaudeRegisterPollingTick ããå
ã«æžãããŠå
šçœ®æã§æ¶ããã(rule 100 R8 / skill async-tool-execution) |
CurrentPhase = "QueryProvider" ã§ 10 åä»¥äž stuckãtrace 5 ä»¶ã®ã¿ | Phase D ã®è²¬ä»»ç¯å²å€ãLLM å¿çååŸæ®µéã§æ¢ãŸã£ãŠããã$ClaudeRuntimeAsyncExecution = False ãšéå» runtime / polling tick æ®éªžã®å¹²æžãå
žå(rule 100 R10) |
| DAG ãå®äºããã®ã« notebook ã«äœãåºåãããªã | iAsyncToolExecFinalize ã® continuation turn èµ·åã倱æãiOnTurnComplete ã® AsyncToolExecScheduled æ©æ return ãæã㊠callback ãæŽçºããå¯èœæ§ããŸã㯠Metadata["Notebook"] ãèœã¡ãŠããå¯èœæ§ |
Active = False ã ã ClaudeStatus[] ã«å€ã ClaudeRuntimeAsyncExec_* polling tick ãæ®ã | Phase 32 ã® AsyncExecution polling tick ã®æ®éªžãClaudeUnregisterPollingTick ã§åå¥ã«è§£é€ããããMathematica åèµ·å |
tool 1 ã€ã¯æåããã 1 ã€ã Anthropic overloaded_error ã§å€±æ | Anthropic API åŽã®äžæçéè² è·ãPhase D ã®åé¡ã§ã¯ãªããå詊ã§è§£æ¶ããã ãç stdout ã text ã»ã«ã«é·å€§ã«æŒããå Žåãããããã㯠Phase 30 ç³»åã®å»¶é· |
蚺æã®åºæ¬ã»ãã
1. ããŒãžã§ã³ç¢ºèª
ãŠãŒã¶ãææ°ã® claudecode.wl ãå®éã«ããŒãããŠããããæåã«ç¢ºèªããã
Load æ Print ã¯æå£°ãããŠããã®ã§ã$claudecodeVersion ãåºãããã
$claudecodeVersion
$ClaudeOrchestratorVersion
2. rate limit ç¶æ
ClaudeRateLimitStatus[]
(* æåŸ
: Noneããã Association ãªã Source/Status ãã£ãŒã«ããèŠãã
Source="rate_limit_event" ã〠Status="allowed" ãªã鲿éç¥ã®èª€èšé² â ClaudeRateLimitClear[] *)
3. ã€ãã³ããã¬ãŒã¹
ClaudeTurnTrace[$ClaudeLastRuntimeId] ã§ Type ã®ç³»åãèŠã:
ClaudeTurnTrace[$ClaudeLastRuntimeId] // Dataset
æ£åžžãª 1-tool å®è¡ã¯æŠã:
Created â StatusChange â TurnStarted â ContextBuilt â ProviderLaunched
â ProviderQueried â ProposalParsed â ToolUseDetected â ToolsExecuted
â ToolContinuationScheduled â StatusChange â StatusChange
â TurnStarted â ContextBuilt â ProviderLaunched â ProviderQueried
â ProposalParsed â TextOnlyResponse â StatusChange
ç°åžžã®ãã¿ãŒã³:
ToolsExecuted ã 4 å以äžé£ç¶ â tool chainingãRule 99 R3 åç
§
- æåŸã
BudgetExhausted â ToolLoopBudgetExhausted â LLM ã tool ãåŒã³ç¶ããŠ
MaxToolIterations=6 ãè¶
éãã
TextOnlyResponse ã®åŸã« StatusChange ã§ Done ã ã notebook ã«äœãåºãªã
â iRuntimeDisplayResult ã® text skip ãã° (Rule 99 R6)
AsyncToolExec çµè·¯ ($ClaudeRuntimeToolAsyncDefault = True) ã®æ£åžžãã¿ãŒã³:
Created â StatusChange â TurnStarted â ContextBuilt â ProviderLaunched
â ProviderQueried â ProposalParsed â ToolUseDetected
â ToolClassified (TotalCalls=N, SyncCount=K, AsyncCount=N-K)
â AsyncToolExecStarted (TotalAsync, InitialRunning, MaxConcurrent=4)
â TurnAwaitingAsync (Outcome="AsyncToolExecScheduled") â ãã® turn ã¯ããã§çµãã
â AsyncToolExecTick à N
â AsyncToolExecCompleted (ToolCount, Elapsed)
â ToolsExecuted â ToolContinuationScheduled
â (continuation turn)
â ... TurnComplete
AsyncToolExec çµè·¯ã®ç°åžžãã¿ãŒã³:
TurnAwaitingAsync ã®åŸã« AsyncToolExecTick ãæ¥ãªã â polling tick ãç»é²ã§ããŠããªããClaudePollingTickKeys[] ã§ ClaudeRuntimeToolExec_* ãç»é²ãããŠããã確èª
AsyncToolExecTick ã¯æ¥ãã AsyncToolExecCompleted ã«å°éããªã â SubmitToolAsync ã®æ»ãå€ã® Process ã ProcessStatus["Finished"] ã«ãªããªããAnthropic API éè² è·ã®å Žå㯠timeout çµç±ã§ Failed ãšããŠå®äºãã
AsyncToolExecCompleted åŸã« ToolsExecuted ãç¡ãæ²é» â iAsyncToolExecFinalize å
ã® continuation turn èµ·åã倱æãMetadata["Notebook"] ãèœã¡ãŠããããŸã㯠iOnTurnComplete ã®æ©æ return æŒãã§ callback ãæŽçº(rule 100 R2)
TurnAwaitingAsync åŸã«äœæ
ãå¥ã® TurnStarted ãæ¥ã â AsyncToolExecScheduled ã®æ©æ return ãæã㊠callback ãæ°ãã turn ãèµ·åãã
4. ConversationState.Messages ãçŽæ¥èŠã
éå» turn ã LLM ã«æž¡ã£ãŠããããtool çµæãèšé²ãããŠãããã確èªã
Module[{rt, msgs},
rt = ClaudeRuntime`Private`$iClaudeRuntimes[$ClaudeLastRuntimeId];
msgs = Lookup[Lookup[rt, "ConversationState", <||>], "Messages", {}];
Dataset @ Map[
Function[m,
<|"Turn" -> Lookup[m, "Turn"],
"Compacted" -> TrueQ[Lookup[m, "Compacted", False]],
"Type" -> Lookup[m, "Type", "?"],
"HasToolCalls" -> (ListQ[Lookup[m, "ToolCalls", None]] &&
Length[Lookup[m, "ToolCalls", {}]] > 0),
"HasToolResults" -> (ListQ[Lookup[m, "ToolResults", None]] &&
Length[Lookup[m, "ToolResults", {}]] > 0),
"TextRespLen" -> StringLength[ToString[Lookup[m, "TextResponse", ""]]]|>],
msgs]]
確èªãã€ã³ã:
Compacted=True ã® turn ã¯æ¬æã倱ãããŠããã$MaxConversationMessages ãè¶
ããŠããªãã
HasToolCalls=True ã§ã HasToolResults=True ã§ãªããªã tool å®è¡å€±æãçã
- æçµ turn ã®
TextRespLen ãéãŒããªã®ã« notebook ã«åºãŠãªããªã iRuntimeDisplayResult
5. tool çµæã®äžèº«ãèŠã
LLM ãã©ã㪠tool çµæãåãåã£ãŠããããçŽæ¥ãã¬ãã¥ãŒ:
Module[{rt, msgs, toolMsgs},
rt = ClaudeRuntime`Private`$iClaudeRuntimes[$ClaudeLastRuntimeId];
msgs = Lookup[Lookup[rt, "ConversationState", <||>], "Messages", {}];
toolMsgs = Select[msgs, ListQ[Lookup[#, "ToolResults", None]] &];
Dataset @ Map[
Function[m,
<|"Turn" -> Lookup[m, "Turn"],
"Tool" -> StringRiffle[
Map[Lookup[#, "Name"] &, Lookup[m, "ToolCalls", {}]], ", "],
"Query" -> StringTake[ToString[
Lookup[First[Lookup[m, "ToolCalls", {<||>}], <||>],
"Input", <||>]], UpTo[150]],
"ResultLen" -> StringLength[Lookup[
First[Lookup[m, "ToolResults", {<||>}], <||>], "Result", ""]],
"ResultHead" -> StringTake[Lookup[
First[Lookup[m, "ToolResults", {<||>}], <||>], "Result", ""],
UpTo[400]]|>],
toolMsgs]]
å€å®åºæº:
ResultLen < 100 â tool çµç±ã§æ¬æãåããŠããªããiToolExec* ã®åé¡
ResultLen > 1000 ãã€å
å®¹ãæ£ãã â tool 㯠OKãåé¡ã¯ prompt æ§ç¯ãæçµåºååŠç
Result ã« [NOTE:] ã [TOOL-HINT:] prefix ãããã° Phase 30.4-30.6 ã®åœ±é¿å
6. LLM æçµå¿ç (LastProposal) ã®å
šæãèŠã
Module[{rt, lp},
rt = ClaudeRuntime`Private`$iClaudeRuntimes[$ClaudeLastRuntimeId];
lp = Lookup[rt, "LastProposal", <||>];
<|"HasProposal" -> Lookup[lp, "HasProposal"],
"HasToolUse" -> Lookup[lp, "HasToolUse"],
"TextResponse" -> StringTake[
ToString[Lookup[lp, "TextResponse", ""]], UpTo[3000]]|>]
TextResponse ã« mathematica ... ã³ãŒããããã¯ãããã®ã« notebook ã«
æžãããªã â Rule 99 R5 (code block skip ã¬ãŒã)
TextResponse ãããŸãšããŸãããæ€çŽ¢ã§æ
å ±ãåŸãããªãã£ããçã§çã â
tool çµæã LLM ã«å±ããŠããªããR2 ãçã
7. AsyncToolExec ã®ç¶æ
ãèŠã (Phase D çµè·¯ã®ãšã)
$ClaudeRuntimeToolAsyncDefault = True ã§ hybrid çµè·¯ãåããŠãããšãã®èšºæ:
(* runtime ã®é²è¡æ®µé *)
rid = $ClaudeLastRuntimeId;
rt = ClaudeRuntime`Private`$iClaudeRuntimes[rid];
{rt["Status"], rt["CurrentPhase"], rt["TurnCount"]}
(* æ£åžžå®äºåŸ: {"Idle", "TurnComplete", N}
AsyncToolExec åŸ
ã¡ã®æäž: {"Running", "AwaitingAsyncTool", N}
LLM æšè«æ®µé stuck: {"Running", "QueryProvider", N} â Phase D ã®è²¬ä»»å€ *)
(* AsyncToolExec ã®çŸç¶ *)
ClaudeRuntimeToolExecDiagnose[rid]
(* <|"Active" -> True|False,
"Finalized" -> True|False,
"QueueSize", "RunningSize", "CollectedSize",
"Elapsed", "TotalAsync", "MaxConcurrent"|> *)
(* polling tick ãç»é²ãããŠããã *)
Select[ClaudePollingTickKeys[],
StringStartsQ[#, "ClaudeRuntimeToolExec_"] &]
(* tick 衚瀺ã®çŸç¶ *)
Lookup[ClaudeCode`Private`$claudeProgress,
Select[Keys[ClaudeCode`Private`$claudeProgress],
StringStartsQ[#, "ClaudeRuntimeToolExec_"] &]]
(* "disp" ããŒã« Phase D2 ã®è¡šç€ºæååãèŠããã¯ã:
"ClaudeRuntime: Webæ€çŽ¢äžŠåå®è¡äž... 6s | Run:1 Done:1/2" ç *)
(* å®äºæžã¿ã®çŽè¿ AsyncToolExec ã® summary *)
rt["LastAsyncToolExecResult"]
(* <|"Outcome" -> "AsyncToolExecCompleted", "Elapsed", "ToolCount",
"AsyncCount", "ToolResults" -> {...}|> *)
å€å®åºæº:
Active -> False, Finalized -> True ã ã Status = "Running"ãCurrentPhase ã AwaitingAsyncTool ã®ãŸãŸåããªã â Finalize ã® continuation èµ·åã倱æãcallback æ©æ return æŒãã®å¯èœæ§(rule 100 R2)
Active -> True ã§ Elapsed ãæ¥µç«¯ã«å€§ãã(120s è¶
) â åå¥ tool ã timeout ããŠããªããAnthropic API åŽã®åé¡ããtick ã® ProcessStatus ãã§ãã¯ãå¹ããŠããªã
polling tick äžèŠ§ã« ClaudeRuntimeToolExec_* ããªã â tick ç»é²ã倱æããŸã㯠finalize åŸã«è§£é€æžã¿(æ£åžž)
polling tick äžèЧã«è€æ°ã® ClaudeRuntimeToolExec_* ããã â éå» runtime ã®æ®éªžãCancel æŒãã§å¹²æžããå¯èœæ§
$claudeProgress ã® disp ããŒã« "Webæ€çŽ¢äžŠåå®è¡äž" ããªãããclaudecode ã® iLLMGraphDAGTick 衚瀺ãClaudeRuntime: åŠçäž... NsããåºãŠãã â Phase D çµè·¯ã«å
¥ã£ãŠããªãããŸã㯠Phase D2 ã®è¡šç€ºæŽæ°ã³ãŒãã«äžå(rule 100 R8 / R9)
系統çãªåãåããããŒ
ãClaudeEval ãæåŸ
éãåããªãã
â
$claudecodeVersion ãææ°ïŒ (No â ãã¡ã€ã«æŽæ° + ã«ãŒãã«ãªã»ãã)
â Yes
ClaudeRateLimitStatus[] = NoneïŒ (No â ClaudeRateLimitClear[])
â Yes
ClaudeTurnTrace ã§ ToolsExecuted ã®åæ°ã¯ïŒ
â 4 åä»¥äž â tool chainingãRule 99 R3 (tool hint) ã確èª
â 0 å â LLM ã tool ãåŒãã§ããªããadapter["AvailableTools"] ã prompt ã確èª
â 1-3 å â ConversationState.Messages ã§ tool çµæãèšé²ãããŠãã
â
tool çµææ¬æ (ResultLen) ã¯ååïŒ
â No â iToolExec* ã®å®è£
(Phase 30.1 ã®ãã㪠signature äžæŽå)
â Yes â LLM æçµå¿ç (LastProposal.TextResponse) ã«ææãªå
容ã¯ïŒ
â No â tool çµæã LLM ã«å±ããŠããªããR2 (åªå
é )
â Yes â notebook æžã蟌ã¿åŽã®åé¡ãR5 (blocks skip) / R6 (isAfterDaemon)
å
·äœäºäŸ: Phase 30 ç³»åã®æèš
-
Phase 30.1: iToolExecWebSearch ã®ã·ã°ããã£ã ClaudeWebSearch ã®å®è£
ãš
äžæŽå (MaxItems ãªãã·ã§ã³ vs 1 åŒæ°)ãtool åŒã³åºã â "Web search failed"
-
Phase 30.2: iClaudeEvalViaRuntimeBridge ã ã MaxContinuations=1 ã§
ä»ã® adapter äœæç®æã¯ãã¹ãŠ 3 ã ã£ããtool å®è¡åŸ 1 turn ããåããç Žç¶»
-
Phase 30.3: rate_limit_event ã® status="allowed" ã誀èšé²ã䜿çšé鲿ã®
宿éç¥ããrate-limit ãããããšè§£éã㊠Retry UI 衚瀺
-
Phase 30.4 â 30.6: tool çµæã« [NOTE: do NOT chain] ãšåŠå®ç prefix ã
ä»ãããš LLM ãçµæãäžä¿¡ã¢ãŒãã§èªã¿ããã«ã·ããŒã·ã§ã³ã[TOOL-HINT: treat as authoritative] ãšæ«å°Ÿã«è¯å®ç衚çŸã§çœ®ãçŽãã
-
Phase 30.5: isAfterDaemon ãã©ã°ã tool åŸã® LLM ãŸãšãå¿çãŸã§
ããã㌠[DONE] å¿çããšèª€èªã㊠text æžã蟌ã¿ã skip
-
Phase 30.7: lastTurnIsTextOnly && hasPriorCodeInMsgs ã§ blocks={} ã«ãã
æé©åããLLM ã®æçµ turn ã«æžãã Column[{Style[...], Hyperlink[...]}] ã
æšãŠãŠãããå¿çã« code block å®åšå€å®ã远å
-
Phase 30.8: iToolResultsToPromptText ã®åªå
é ã Summary å
é ã§ã
éå» turn ã® tool çµææ¬æã prompt ã«æ³šå
¥ããããLLM ããéå»ã®æ€çŽ¢çµæã
èŠããªãããšå°æããŠåãã¯ãšãªãäœåºŠãæããŠãã
åç
§
- Rule:
99-adapter-tool-flow.md â èŠç¯ã«ãŒã« (R1ãR7ãtool çµæ / é åº / hint / Options æŽå)
- Rule:
100-async-tool-execution.md â AsyncToolExec ã®å¿
é ã«ãŒã« (R1ãR11ãPhase D ã®èšèšåå)
- Skill:
async-tool-execution â Phase AãD2 ã® hybrid çµè·¯ã®èšèšãšãããŒ
claudecode.wl å®è£
: iAdapterBuildPrompt (L21687), iToolResultsToPromptText
(L22164), iRuntimeDisplayResult (L23602), iToolExecWebSearch / iToolExecWebFetch
claudecode.wl ã® DAG tick 衚瀺: iLLMGraphDAGTick (L21391-) â L21866 ã® "ClaudeRuntime: åŠçäž... Ns" ã¯ãå
šããŒãå®äº/倱æã§ onComplete æªåŒåºãç¶æ
ãæå³ãã
ClaudeRuntime.wl å®è£
: iToolUseAndContinue (L1429-, Phase D ã§ hybrid å), iScheduleAsyncToolExecPoll (L2484-), iAsyncToolExecTickFn (L2716-), iAsyncToolExecFinalize (L2944-), iOnTurnComplete (L1940-, L2141 ã§ AsyncToolExecScheduled æ©æ return), ClaudeRuntimeToolExecDiagnose, ClaudeRuntimeCancelAsyncToolExec