mixdog 0.9.18 → 0.9.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/package.json +3 -2
  2. package/scripts/output-style-smoke.mjs +2 -2
  3. package/scripts/recall-bench-cases.json +11 -0
  4. package/scripts/recall-bench.mjs +91 -2
  5. package/scripts/tool-efficiency-diag.mjs +4 -1
  6. package/scripts/tool-smoke.mjs +101 -27
  7. package/src/agents/debugger/AGENT.md +3 -3
  8. package/src/agents/heavy-worker/AGENT.md +7 -10
  9. package/src/agents/maintainer/AGENT.md +1 -2
  10. package/src/agents/reviewer/AGENT.md +1 -2
  11. package/src/agents/worker/AGENT.md +5 -8
  12. package/src/defaults/agents.json +3 -0
  13. package/src/mixdog-session-runtime.mjs +23 -6
  14. package/src/rules/agent/00-core.md +4 -3
  15. package/src/rules/agent/30-explorer.md +53 -22
  16. package/src/rules/lead/lead-tool.md +3 -2
  17. package/src/rules/shared/01-tool.md +24 -29
  18. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +1 -1
  19. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +1 -1
  20. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +24 -3
  21. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +3 -3
  22. package/src/runtime/agent/orchestrator/session/context-utils.mjs +2 -2
  23. package/src/runtime/agent/orchestrator/session/loop/steering-ladder.mjs +250 -35
  24. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +6 -4
  25. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +198 -6
  26. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +10 -2
  27. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +13 -15
  28. package/src/runtime/agent/orchestrator/tools/builtin/read-batch.mjs +6 -1
  29. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +45 -3
  30. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +5 -2
  31. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +195 -3
  32. package/src/runtime/agent/orchestrator/tools/builtin.mjs +17 -1
  33. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +38 -0
  34. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +4 -4
  35. package/src/runtime/agent/orchestrator/tools/shell-state.mjs +1 -1
  36. package/src/runtime/channels/backends/discord-gateway.mjs +14 -1
  37. package/src/runtime/channels/backends/discord.mjs +43 -1
  38. package/src/runtime/channels/index.mjs +145 -58
  39. package/src/runtime/channels/lib/inbound-routing.mjs +19 -12
  40. package/src/runtime/channels/lib/memory-client.mjs +32 -14
  41. package/src/runtime/channels/lib/output-forwarder.mjs +38 -7
  42. package/src/runtime/channels/lib/owner-heartbeat.mjs +13 -4
  43. package/src/runtime/channels/lib/runtime-paths.mjs +35 -1
  44. package/src/runtime/channels/lib/tool-dispatch.mjs +17 -7
  45. package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +8 -2
  46. package/src/runtime/memory/lib/memory-recall-store.mjs +182 -9
  47. package/src/runtime/memory/lib/query-handlers.mjs +36 -4
  48. package/src/runtime/memory/lib/recall-format.mjs +106 -6
  49. package/src/runtime/memory/lib/session-ingest.mjs +1 -1
  50. package/src/runtime/shared/atomic-file.mjs +10 -4
  51. package/src/runtime/shared/background-tasks.mjs +4 -2
  52. package/src/runtime/shared/tool-execution-contract.mjs +1 -1
  53. package/src/runtime/shared/tool-result-summary.mjs +1 -1
  54. package/src/runtime/shared/tool-surface.mjs +30 -1
  55. package/src/session-runtime/config-lifecycle.mjs +1 -1
  56. package/src/session-runtime/cwd-plugins.mjs +46 -3
  57. package/src/session-runtime/mcp-glue.mjs +24 -3
  58. package/src/session-runtime/output-styles.mjs +44 -10
  59. package/src/session-runtime/workflow.mjs +16 -1
  60. package/src/standalone/channel-worker.mjs +74 -5
  61. package/src/standalone/explore-tool.mjs +1 -1
  62. package/src/tui/App.jsx +57 -77
  63. package/src/tui/app/channel-pickers.mjs +45 -0
  64. package/src/tui/app/slash-commands.mjs +0 -1
  65. package/src/tui/app/slash-dispatch.mjs +0 -16
  66. package/src/tui/app/transcript-window.mjs +44 -1
  67. package/src/tui/app/use-mouse-input.mjs +9 -2
  68. package/src/tui/app/use-prompt-handlers.mjs +7 -94
  69. package/src/tui/app/use-transcript-scroll.mjs +5 -1
  70. package/src/tui/app/use-transcript-window.mjs +65 -5
  71. package/src/tui/components/PromptInput.jsx +33 -64
  72. package/src/tui/components/ToolExecution.jsx +2 -2
  73. package/src/tui/dist/index.mjs +5330 -5443
  74. package/src/tui/engine.mjs +49 -10
  75. package/src/tui/lib/voice-setup.mjs +166 -0
  76. package/src/tui/paste-attachments.mjs +12 -5
  77. package/src/tui/prompt-history-store.mjs +125 -12
  78. package/scripts/bench/cache-probe-tasks.json +0 -8
  79. package/scripts/bench/lead-review-tasks-r3.json +0 -20
  80. package/scripts/bench/lead-review-tasks.json +0 -20
  81. package/scripts/bench/r4-mixed-tasks.json +0 -20
  82. package/scripts/bench/r5-orchestrated-task.json +0 -7
  83. package/scripts/bench/review-tasks.json +0 -20
  84. package/scripts/bench/round-codex.json +0 -114
  85. package/scripts/bench/round-mixdog-lead-r3.json +0 -269
  86. package/scripts/bench/round-mixdog-lead.json +0 -269
  87. package/scripts/bench/round-mixdog.json +0 -126
  88. package/scripts/bench/round-r10-bigsample.json +0 -679
  89. package/scripts/bench/round-r11-codexalign.json +0 -257
  90. package/scripts/bench/round-r13-clientmeta.json +0 -464
  91. package/scripts/bench/round-r14-betafeatures.json +0 -466
  92. package/scripts/bench/round-r15-fulldefault.json +0 -462
  93. package/scripts/bench/round-r16-sessionid.json +0 -466
  94. package/scripts/bench/round-r17-wirebytes.json +0 -456
  95. package/scripts/bench/round-r18-prewarm.json +0 -468
  96. package/scripts/bench/round-r19-clean.json +0 -472
  97. package/scripts/bench/round-r20-prewarm-clean.json +0 -475
  98. package/scripts/bench/round-r21-delta-retry.json +0 -473
  99. package/scripts/bench/round-r22-full-probe.json +0 -693
  100. package/scripts/bench/round-r23-itemprobe.json +0 -701
  101. package/scripts/bench/round-r24-shapefix.json +0 -677
  102. package/scripts/bench/round-r25-serial.json +0 -464
  103. package/scripts/bench/round-r26-parallel3.json +0 -671
  104. package/scripts/bench/round-r27-parallel10.json +0 -894
  105. package/scripts/bench/round-r28-parallel10-stagger.json +0 -882
  106. package/scripts/bench/round-r29-parallel10-stagger166.json +0 -886
  107. package/scripts/bench/round-r30-instid.json +0 -253
  108. package/scripts/bench/round-r31-upgradeprobe.json +0 -256
  109. package/scripts/bench/round-r32-vs-codex-lead.json +0 -254
  110. package/scripts/bench/round-r33-vs-codex-codex.json +0 -115
  111. package/scripts/bench/round-r34-orchestrated.json +0 -120
  112. package/scripts/bench/round-r35-orchestrated-codex.json +0 -61
  113. package/scripts/bench/round-r36-orchestrated-capped.json +0 -128
  114. package/scripts/bench/round-r4-codex.json +0 -114
  115. package/scripts/bench/round-r4-mixed.json +0 -225
  116. package/scripts/bench/round-r5-gpt-lead.json +0 -259
  117. package/scripts/bench/round-r6-codex.json +0 -114
  118. package/scripts/bench/round-r6-solo.json +0 -257
  119. package/scripts/bench/round-r7-full.json +0 -254
  120. package/scripts/bench/round-r8-fulldefault.json +0 -255
  121. package/src/tui/components/prompt-input/voice-indicator.mjs +0 -39
  122. package/src/tui/lib/voice-recorder.mjs +0 -469
@@ -1,253 +0,0 @@
1
- {
2
- "round": "30",
3
- "runner": "lead",
4
- "opts": {
5
- "provider": "openai-oauth",
6
- "model": "gpt-5.5",
7
- "effort": null,
8
- "fast": false,
9
- "env": {
10
- "MIXDOG_DATA_DIR": "C:\\Users\\tempe\\.mixdog\\bench-data"
11
- }
12
- },
13
- "tasks": 3,
14
- "completed": 3,
15
- "completion_rate": 100,
16
- "sessions": [
17
- "sess_39904_1783072746044_1783072746281_d751f4927ab572f96a76f2c3725c9175",
18
- "sess_56416_1783072746060_1783072746296_9bf2c56469f84b2a5d165a2f1c3eab04",
19
- "sess_41236_1783072746078_1783072746320_47377ecce96763c55a8135020a0a1576"
20
- ],
21
- "results": [
22
- {
23
- "id": "r4-debug-forwarding-gap",
24
- "agent": "reviewer",
25
- "ok": true,
26
- "ms": 134978,
27
- "sessionId": "sess_39904_1783072746044_1783072746281_d751f4927ab572f96a76f2c3725c9175",
28
- "output": "sessionId: sess_39904_1783072746044_1783072746281_d751f4927ab572f96a76f2c3725c9175\n관련 경로를 직접 따라가며 누락/지연 구간과 catch-up 여부를 확인하겠습니다.재영님, 확인 결과 활성화 직후 대부분의 창은 지연 후 회복되지만, “기존 transcript를 EOF로 바인딩”하는 경우는 실제 영구 누락 가능성이 있습니다.\n\n**경로** \n`writeBridgeState(true)` 후 ownership claim/refresh가 돌고, `bindPersistedTranscriptIfAny()` → `rebindTranscriptContext()` → `applyTranscriptBinding()` → `OutputForwarder.startWatch()` → `forwardNewText()` → `backend.sendMessage()`로 첫 전달됩니다. 주요 앵커는 `src/runtime/channels/index.mjs:218`, `src/runtime/channels/index.mjs:577`, `src/runtime/channels/index.mjs:710`, `src/runtime/channels/lib/output-forwarder.mjs:647`, `src/runtime/channels/lib/output-forwarder.mjs:351`, `src/runtime/channels/index.mjs:284`입니다.\n\n**영구 누락 가능성 — 기존 transcript를 현재 EOF로 바인딩** \n`setContext()`가 `catchUpFromPersisted`라도 같은 persisted transcript/cursor가 없으면 `currentSize`를 cursor로 잡습니다. 따라서 `bridge-state.json` 기록 후 첫 bind 전 이미 파일에 들어간 출력은 읽히지 않습니다. Catch-up 회복: **아니오**, 이후 `forwardNewText()`는 새 byte만 봅니다. 앵커: `src/runtime/channels/lib/output-forwarder.mjs:117`, `src/runtime/channels/lib/output-forwarder.mjs:122`, `src/runtime/channels/lib/output-forwarder.mjs:126`.\n\n**조건부 지연 — transcript 파일이 아직 없음** \n`fs.watch()`는 없는 파일에 실패하고 닫히지만, pending re-arm이 250ms 간격/최대 60초로 파일 생성 후 `startWatch()`와 `forwardNewText()`를 호출합니다. Catch-up 회복: **예, 60초 안에 생성되면 회복**; timeout 뒤에는 다음 rebind/forward trigger 전까지 지연됩니다. 앵커: `src/runtime/channels/lib/output-forwarder.mjs:656`, `src/runtime/channels/lib/output-forwarder.mjs:667`, `src/runtime/channels/index.mjs:357`, `src/runtime/channels/index.mjs:376`, `src/runtime/channels/index.mjs:384`.\n\n**지연 — ownership/backend 연결 전 flush** \nwatch flush가 먼저 와도 `_isOwner()`가 `bridgeRuntimeConnected && currentOwnerState().owned`를 요구하므로 읽기 자체를 하지 않고 반환합니다. Catch-up 회복: **예**, cursor가 전진하지 않으며 post-connect `forwardNewText()` 또는 re-arm이 backlog를 읽습니다. 앵커: `src/runtime/channels/index.mjs:316`, `src/runtime/channels/lib/output-forwarder.mjs:36`, `src/runtime/channels/lib/output-forwarder.mjs:351`, `src/runtime/channels/index.mjs:776`, `src/runtime/channels/index.mjs:801`.\n\n**짧은 지연 — stat 후 watch 설치 사이의 write** \n`startWatch()`가 설치 직후 `scheduleWatchFlush()`를 호출해 stat 이후 들어온 byte를 다시 읽습니다. Catch-up 회복: **예**, 보통 100ms debounce 뒤 전달됩니다. 앵커: `src/runtime/channels/lib/output-forwarder.mjs:665`, `src/runtime/channels/lib/output-forwarder.mjs:703`, `src/runtime/channels/lib/output-forwarder.mjs:724`.\n\n**Verdict:** 브리지는 pending-file/ownership 창은 대체로 회복하지만, persisted cursor 없는 기존 transcript를 EOF로 바인딩하는 활성화 창은 assistant output을 영구적으로 조용히 누락할 수 있습니다.",
29
- "card": {
30
- "session": "sess_39904_1783072746044_1783072746281_d751f4927ab572f96a76f2c3725c9175",
31
- "provider": "openai-oauth",
32
- "model": "gpt-5.5",
33
- "wall_ms": 124465,
34
- "turns": 7,
35
- "tool_calls": 11,
36
- "tools_per_turn": 1.6,
37
- "total_tool_ms": 1020,
38
- "llm_stream_ms": 123912,
39
- "cache_ratio": 0.7107327841885438,
40
- "cached_tokens": 116224,
41
- "prompt_tokens": 163527,
42
- "uncached_tokens": 47303,
43
- "output_tokens": 13202,
44
- "cache_weighted_input_10": 58925.4,
45
- "cache_weighted_input_25": 76359,
46
- "prompt_growth": 35605,
47
- "antipatterns": 0,
48
- "issues": 10,
49
- "issue_types": [
50
- "cache",
51
- "cache_break",
52
- "broad_tool_result",
53
- "service_tier"
54
- ],
55
- "read_fragmentation_paths": [],
56
- "grep_sweep_count": 0
57
- }
58
- },
59
- {
60
- "id": "r4-impl-usage-summary",
61
- "agent": "worker",
62
- "ok": true,
63
- "ms": 67949,
64
- "sessionId": "sess_56416_1783072746060_1783072746296_9bf2c56469f84b2a5d165a2f1c3eab04",
65
- "output": "sessionId: sess_56416_1783072746060_1783072746296_9bf2c56469f84b2a5d165a2f1c3eab04\n요청 범위가 명확해서 바로 구현하고 검증까지 진행하겠습니다.현재 파일이 이미 일부 구현된 상태라, 실제 trace 형식에 맞는지 확인한 뒤 필요한 보정만 하겠습니다.구현 항목은 이미 작업 트리에 반영된 형태라, 차이를 확인하고 검증을 실행하겠습니다.`package.json` 변경만 diff에 잡혀서 새 스크립트 파일의 추적 상태를 확인하겠습니다.검증을 실행하겠습니다.완료했습니다, 재영님.\n\n- **Diff 요약** `package.json:58`에 `usage:today` script 추가, `scripts/usage-today.mjs` 신규 추가.\n- **동작** `MIXDOG_DATA_DIR`를 존중해 `agent-trace.jsonl`을 읽고, 로컬 자정 이후 usage를 모델별/전체 합계로 집계합니다.\n- **검증** `node --check scripts/usage-today.mjs` 통과, `npm run usage:today` 실행 성공.\n- **참고** 기존의 unrelated 변경 `src/runtime/channels/lib/*`는 건드리지 않았습니다.",
66
- "card": {
67
- "session": "sess_56416_1783072746060_1783072746296_9bf2c56469f84b2a5d165a2f1c3eab04",
68
- "provider": "openai-oauth",
69
- "model": "gpt-5.5",
70
- "wall_ms": 57437,
71
- "turns": 10,
72
- "tool_calls": 10,
73
- "tools_per_turn": 1,
74
- "total_tool_ms": 2443,
75
- "llm_stream_ms": 54001,
76
- "cache_ratio": 0.7752327566766535,
77
- "cached_tokens": 120320,
78
- "prompt_tokens": 155205,
79
- "uncached_tokens": 34885,
80
- "output_tokens": 4352,
81
- "cache_weighted_input_10": 46917,
82
- "cache_weighted_input_25": 64965,
83
- "prompt_growth": 11206,
84
- "antipatterns": 1,
85
- "issues": 15,
86
- "issue_types": [
87
- "cache",
88
- "cache_break",
89
- "cache_miss",
90
- "service_tier",
91
- "missed_parallelism",
92
- "tool_churn_cluster"
93
- ],
94
- "read_fragmentation_paths": [],
95
- "grep_sweep_count": 0
96
- }
97
- },
98
- {
99
- "id": "r4-explain-compact-engine",
100
- "agent": "explore",
101
- "ok": true,
102
- "ms": 70617,
103
- "sessionId": "sess_41236_1783072746078_1783072746320_47377ecce96763c55a8135020a0a1576",
104
- "output": "sessionId: sess_41236_1783072746078_1783072746320_47377ecce96763c55a8135020a0a1576\n구조와 호출 경로를 먼저 잡고, 필요한 파일만 좁혀서 라인 앵커를 확인하겠습니다.- Entry points: `semanticCompactMessages()` and `recallFastTrackCompactMessages()` are exported by `engine.mjs` and re-exported by the facade for existing importers. `src/runtime/agent/orchestrator/session/compact/engine.mjs:278`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:445`, `src/runtime/agent/orchestrator/session/compact.mjs:52`\n\n- Callers: the live loop invokes semantic compaction pre-send, recall-fasttrack via its pipeline, and session manager uses both for manual/auto-clear compaction. `src/runtime/agent/orchestrator/session/loop.mjs:441`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:161`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:210`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:288`\n\n- Fire decision: auto policy resolves boundary, buffer, trigger, compact type, reserve, and tail settings; compaction fires when pressure `messageTokens + reserve` reaches trigger, or immediately on reactive overflow / unknown token estimate. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:89`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:117`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:151`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170`\n\n- Runtime flow: loop drains pending steering before the pre-send check, computes policy/pressure, then runs recall-fasttrack or semantic based on policy; provider overflow sets a one-shot reactive retry that loops back through this same compaction path. `src/runtime/agent/orchestrator/session/loop.mjs:324`, `src/runtime/agent/orchestrator/session/loop.mjs:329`, `src/runtime/agent/orchestrator/session/loop.mjs:353`, `src/runtime/agent/orchestrator/session/loop.mjs:414`, `src/runtime/agent/orchestrator/session/loop.mjs:439`, `src/runtime/agent/orchestrator/session/loop.mjs:982`\n\n- Semantic windowing: messages are sanitized, protected prefix is split out, prior summary is found, summaries are excluded from live history, then head/tail are selected. `src/runtime/agent/orchestrator/session/compact/engine.mjs:100`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:102`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:104`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:110`\n\n- Semantic tail: if live has user turns, it keeps up to `tailTurns` recent turns within `preserveRecentBudget`; if not, it chooses the newest valid non-tool cut that fits, never starting a preserved tail on a tool result. `src/runtime/agent/orchestrator/session/compact/engine.mjs:134`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:141`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:151`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:121`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:193`\n\n- Recall tail: recall-fasttrack preserves newest structured turns, defaults to two user turns and an 8k cap, drops oldest kept turns first, then truncates surviving content while preserving newest content and repairing tool pairs. `src/runtime/agent/orchestrator/session/compact/engine.mjs:449`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:467`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:593`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:601`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:607`\n\n- Redaction hook: no-op compaction returns sanitized messages unchanged, but real semantic/recall compaction redacts tool-call secret values before window selection so preserved system/tail are measured and emitted redacted. `src/runtime/agent/orchestrator/session/compact/engine.mjs:286`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:306`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:312`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:389`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:644`\n\n- Redaction behavior: sensitive argument keys and raw `key:value` / `key=value` secrets are replaced with `[redacted]`, preserving tool-call shape/order for verbatim tail messages. `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:12`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:46`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:219`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:261`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:319`\n\n- Semantic failures: invalid provider, empty live window, no compactable prior history, prompt/summary fit failures, empty summary, or final budget overflow throw explicit errors. `src/runtime/agent/orchestrator/session/compact/engine.mjs:279`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:254`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:315`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:335`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:372`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:395`\n\n- Fallbacks: loop semantic failures can recover with anchor-independent tool-output prune, but recall-fasttrack failures skip prune and escalate; manager recall-fasttrack first tries semantic degraded fallback, then non-recall failures try the same prune safety net. `src/runtime/agent/orchestrator/session/loop.mjs:500`, `src/runtime/agent/orchestrator/session/loop.mjs:517`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:237`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:245`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:322`",
105
- "card": {
106
- "session": "sess_41236_1783072746078_1783072746320_47377ecce96763c55a8135020a0a1576",
107
- "provider": "openai-oauth",
108
- "model": "gpt-5.5",
109
- "wall_ms": 60095,
110
- "turns": 9,
111
- "tool_calls": 14,
112
- "tools_per_turn": 1.6,
113
- "total_tool_ms": 796,
114
- "llm_stream_ms": 59602,
115
- "cache_ratio": 0.6015634765032123,
116
- "cached_tokens": 168448,
117
- "prompt_tokens": 280017,
118
- "uncached_tokens": 111569,
119
- "output_tokens": 4520,
120
- "cache_weighted_input_10": 128413.8,
121
- "cache_weighted_input_25": 153681,
122
- "prompt_growth": 52749,
123
- "antipatterns": 1,
124
- "issues": 14,
125
- "issue_types": [
126
- "cache",
127
- "cache_break",
128
- "cache_miss",
129
- "service_tier",
130
- "tool_churn_cluster"
131
- ],
132
- "read_fragmentation_paths": [],
133
- "grep_sweep_count": 0
134
- }
135
- }
136
- ],
137
- "task_complete": true,
138
- "task_errors": [],
139
- "score_complete": true,
140
- "score_errors": [],
141
- "group": {
142
- "n": 3,
143
- "wall_ms": 80665.7,
144
- "turns": 8.7,
145
- "tool_calls": 11.7,
146
- "tools_per_turn": 1.4,
147
- "total_tool_ms": 1419.7,
148
- "llm_stream_ms": 79171.7,
149
- "cache_ratio": 0.7,
150
- "cached_tokens": 134997.3,
151
- "prompt_tokens": 199583,
152
- "uncached_tokens": 64585.7,
153
- "output_tokens": 7358,
154
- "cache_weighted_input_10": 78085.4,
155
- "cache_weighted_input_25": 98335,
156
- "prompt_growth": 33186.7,
157
- "antipatterns": 0.7,
158
- "issues": 13,
159
- "grep_sweep_count": 0
160
- },
161
- "cards": [
162
- {
163
- "session": "sess_39904_1783072746044_1783072746281_d751f4927ab572f96a76f2c3725c9175",
164
- "provider": "openai-oauth",
165
- "model": "gpt-5.5",
166
- "wall_ms": 124465,
167
- "turns": 7,
168
- "tool_calls": 11,
169
- "tools_per_turn": 1.6,
170
- "total_tool_ms": 1020,
171
- "llm_stream_ms": 123912,
172
- "cache_ratio": 0.7107327841885438,
173
- "cached_tokens": 116224,
174
- "prompt_tokens": 163527,
175
- "uncached_tokens": 47303,
176
- "output_tokens": 13202,
177
- "cache_weighted_input_10": 58925.4,
178
- "cache_weighted_input_25": 76359,
179
- "prompt_growth": 35605,
180
- "antipatterns": 0,
181
- "issues": 10,
182
- "issue_types": [
183
- "cache",
184
- "cache_break",
185
- "broad_tool_result",
186
- "service_tier"
187
- ],
188
- "read_fragmentation_paths": [],
189
- "grep_sweep_count": 0
190
- },
191
- {
192
- "session": "sess_56416_1783072746060_1783072746296_9bf2c56469f84b2a5d165a2f1c3eab04",
193
- "provider": "openai-oauth",
194
- "model": "gpt-5.5",
195
- "wall_ms": 57437,
196
- "turns": 10,
197
- "tool_calls": 10,
198
- "tools_per_turn": 1,
199
- "total_tool_ms": 2443,
200
- "llm_stream_ms": 54001,
201
- "cache_ratio": 0.7752327566766535,
202
- "cached_tokens": 120320,
203
- "prompt_tokens": 155205,
204
- "uncached_tokens": 34885,
205
- "output_tokens": 4352,
206
- "cache_weighted_input_10": 46917,
207
- "cache_weighted_input_25": 64965,
208
- "prompt_growth": 11206,
209
- "antipatterns": 1,
210
- "issues": 15,
211
- "issue_types": [
212
- "cache",
213
- "cache_break",
214
- "cache_miss",
215
- "service_tier",
216
- "missed_parallelism",
217
- "tool_churn_cluster"
218
- ],
219
- "read_fragmentation_paths": [],
220
- "grep_sweep_count": 0
221
- },
222
- {
223
- "session": "sess_41236_1783072746078_1783072746320_47377ecce96763c55a8135020a0a1576",
224
- "provider": "openai-oauth",
225
- "model": "gpt-5.5",
226
- "wall_ms": 60095,
227
- "turns": 9,
228
- "tool_calls": 14,
229
- "tools_per_turn": 1.6,
230
- "total_tool_ms": 796,
231
- "llm_stream_ms": 59602,
232
- "cache_ratio": 0.6015634765032123,
233
- "cached_tokens": 168448,
234
- "prompt_tokens": 280017,
235
- "uncached_tokens": 111569,
236
- "output_tokens": 4520,
237
- "cache_weighted_input_10": 128413.8,
238
- "cache_weighted_input_25": 153681,
239
- "prompt_growth": 52749,
240
- "antipatterns": 1,
241
- "issues": 14,
242
- "issue_types": [
243
- "cache",
244
- "cache_break",
245
- "cache_miss",
246
- "service_tier",
247
- "tool_churn_cluster"
248
- ],
249
- "read_fragmentation_paths": [],
250
- "grep_sweep_count": 0
251
- }
252
- ]
253
- }
@@ -1,256 +0,0 @@
1
- {
2
- "round": "31",
3
- "runner": "lead",
4
- "opts": {
5
- "provider": "openai-oauth",
6
- "model": "gpt-5.5",
7
- "effort": null,
8
- "fast": false,
9
- "env": {
10
- "MIXDOG_DATA_DIR": "C:\\Users\\tempe\\.mixdog\\bench-data",
11
- "MIXDOG_WS_UPGRADE_HEADER_PROBE": "C:\\Project\\mixdog\\ws-upgrade-probe.log"
12
- }
13
- },
14
- "tasks": 3,
15
- "completed": 3,
16
- "completion_rate": 100,
17
- "sessions": [
18
- "sess_60648_1783073609442_1783073609762_34035af1e4baee85ce101c9ce53cdd12",
19
- "sess_38868_1783073609468_1783073609786_e1e184b05889a1d81d5dd8806fb7fed7",
20
- "sess_55016_1783073609486_1783073609798_f447f3883c21e26f2060e41d62b22cca"
21
- ],
22
- "results": [
23
- {
24
- "id": "r4-debug-forwarding-gap",
25
- "agent": "reviewer",
26
- "ok": true,
27
- "ms": 124620,
28
- "sessionId": "sess_60648_1783073609442_1783073609762_34035af1e4baee85ce101c9ce53cdd12",
29
- "output": "sessionId: sess_60648_1783073609442_1783073609762_34035af1e4baee85ce101c9ce53cdd12\n재영님, 정적 추적 기준으로 실제 취약 창은 “무조건 드롭”이 아니라 “상태에 따라 EOF 스킵 또는 지연 후 catch-up”입니다.\n\n**전체 경로**: `start()`가 `channelBridgeActive=true`와 `bridge-state.json`을 먼저 씁니다(`src/runtime/channels/index.mjs:1734-1736`) → ownership claim/`refreshBridgeOwnership()` → `startOwnedRuntime()` → persisted transcript bind와 `backend.connect()`가 병렬 진행됩니다(`src/runtime/channels/index.mjs:758-776`) → `applyTranscriptBinding()`/`startWatch()` → watcher flush → `forwardNewText()` → queue drain/send(`src/runtime/channels/index.mjs:317-321`, `src/runtime/channels/lib/output-forwarder.mjs:647-667`, `703-724`, `351-409`).\n\n**1. 기존 transcript를 처음 bind할 때 EOF 기준으로 잡는 창**: persisted cursor가 같은 transcript가 아니면 `setContext()`가 `currentSize`를 cursor로 삼아 이미 쓰인 assistant 출력은 스킵됩니다(`src/runtime/channels/lib/output-forwarder.mjs:117-127`); activation bind는 `catchUpFromPersisted`로 들어옵니다(`src/runtime/channels/index.mjs:625-629`). Backlog catch-up: 같은 transcript의 `lastFileSize`가 있으면 회복, 없으면 회복 안 됨.\n\n**2. transcript 파일이 아직 없어서 `fs.watch` 설치가 실패하는 창**: `startWatch()`는 missing file에서 catch 후 닫히며(`src/runtime/channels/lib/output-forwarder.mjs:647-670`), 별도 re-arm poll이 250ms 간격/60초 한도로 watch 재설치와 `forwardNewText()`를 수행합니다(`src/runtime/channels/index.mjs:340-345`, `357-379`). Backlog catch-up: 60초 안에 생성되면 회복, timeout 이후는 다음 rebind 전까지 지연/미전송입니다.\n\n**3. bridge-state는 active지만 backend/ownership이 아직 ready가 아닌 창**: owner probe는 `bridgeRuntimeConnected && currentOwnerState().owned`라서 pre-connect watcher flush는 `forwardNewText()`에서 즉시 no-op 됩니다(`src/runtime/channels/index.mjs:316`, `src/runtime/channels/lib/output-forwarder.mjs:351-353`). Backlog catch-up: cursor를 전진하지 않으므로 connect 후 `forwardNewText()` 또는 re-arm에서 회복됩니다(`src/runtime/channels/index.mjs:801-812`).\n\n**4. channel binding이 없거나 main fallback도 없을 때**: `bindPersistedTranscriptIfAny()`는 channelId가 없으면 return하고 forwarding context가 생기지 않습니다(`src/runtime/channels/index.mjs:610-625`); `forwardNewText()`도 channel 없으면 no-op입니다(`src/runtime/channels/lib/output-forwarder.mjs:351-354`). Backlog catch-up: 이후 inbound rebind가 생기면 가능하지만, 기존 transcript를 EOF로 bind하면 1번 조건에 따라 이미 쓰인 출력은 복구되지 않을 수 있습니다.\n\n판정: 가장 큰 실제 손실 위험은 “기존 transcript + persisted cursor 없음”에서 activation-window 출력이 EOF 스킵되는 경우이고, missing-file/ownership 창은 대부분 지연 후 catch-up됩니다.",
30
- "card": {
31
- "session": "sess_60648_1783073609442_1783073609762_34035af1e4baee85ce101c9ce53cdd12",
32
- "provider": "openai-oauth",
33
- "model": "gpt-5.5",
34
- "wall_ms": 113997,
35
- "turns": 6,
36
- "tool_calls": 7,
37
- "tools_per_turn": 1.2,
38
- "total_tool_ms": 1046,
39
- "llm_stream_ms": 112569,
40
- "cache_ratio": 0.6558328317669028,
41
- "cached_tokens": 84992,
42
- "prompt_tokens": 129594,
43
- "uncached_tokens": 44602,
44
- "output_tokens": 12095,
45
- "cache_weighted_input_10": 53101.2,
46
- "cache_weighted_input_25": 65850,
47
- "prompt_growth": 29502,
48
- "antipatterns": 1,
49
- "issues": 10,
50
- "issue_types": [
51
- "cache",
52
- "cache_break",
53
- "broad_tool_result",
54
- "service_tier",
55
- "tool_churn_cluster"
56
- ],
57
- "read_fragmentation_paths": [],
58
- "grep_sweep_count": 0
59
- }
60
- },
61
- {
62
- "id": "r4-impl-usage-summary",
63
- "agent": "worker",
64
- "ok": true,
65
- "ms": 50087,
66
- "sessionId": "sess_38868_1783073609468_1783073609786_e1e184b05889a1d81d5dd8806fb7fed7",
67
- "output": "sessionId: sess_38868_1783073609468_1783073609786_e1e184b05889a1d81d5dd8806fb7fed7\n요청 범위가 명확해 바로 구현하고 검증까지 진행하겠습니다.재영님, 완료했습니다.\n\n- **Diff 요약**: `package.json`에 `usage:today` 추가, `scripts/usage-today.mjs` 신규 추가.\n- **기능**: `MIXDOG_DATA_DIR`를 존중해 `agent-trace.jsonl`을 읽고, 로컬 자정 이후 usage를 모델별/총합으로 집계합니다.\n- **검증**: `node --check scripts/usage-today.mjs` 통과, `npm run usage:today` 실행 완료.\n- **참고**: 기존 변경으로 보이는 `src/runtime/channels/lib/event-queue.mjs`, `output-forwarder.mjs`는 건드리지 않았습니다.",
68
- "card": {
69
- "session": "sess_38868_1783073609468_1783073609786_e1e184b05889a1d81d5dd8806fb7fed7",
70
- "provider": "openai-oauth",
71
- "model": "gpt-5.5",
72
- "wall_ms": 39453,
73
- "turns": 6,
74
- "tool_calls": 5,
75
- "tools_per_turn": 0.8,
76
- "total_tool_ms": 1405,
77
- "llm_stream_ms": 37746,
78
- "cache_ratio": 0.7212978616128363,
79
- "cached_tokens": 48640,
80
- "prompt_tokens": 67434,
81
- "uncached_tokens": 18794,
82
- "output_tokens": 3655,
83
- "cache_weighted_input_10": 23658,
84
- "cache_weighted_input_25": 30954,
85
- "prompt_growth": 5599,
86
- "antipatterns": 1,
87
- "issues": 10,
88
- "issue_types": [
89
- "cache",
90
- "cache_break",
91
- "service_tier",
92
- "missed_parallelism",
93
- "tool_churn_cluster"
94
- ],
95
- "read_fragmentation_paths": [],
96
- "grep_sweep_count": 0
97
- }
98
- },
99
- {
100
- "id": "r4-explain-compact-engine",
101
- "agent": "explore",
102
- "ok": true,
103
- "ms": 75820,
104
- "sessionId": "sess_55016_1783073609486_1783073609798_f447f3883c21e26f2060e41d62b22cca",
105
- "output": "sessionId: sess_55016_1783073609486_1783073609798_f447f3883c21e26f2060e41d62b22cca\nArchitecture brief:\n\n- Entry points: `semanticCompactMessages()` and `recallFastTrackCompactMessages()` live in `engine.mjs` and are re-exported by `compact.mjs` for existing callers. `src/runtime/agent/orchestrator/session/compact/engine.mjs:278`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:445`, `src/runtime/agent/orchestrator/session/compact.mjs:52`\n\n- Main callers: loop pre-send calls recall-fasttrack or semantic compaction; manager runner calls the same paths for manual/auto-clear/session compaction. `src/runtime/agent/orchestrator/session/loop.mjs:414`, `src/runtime/agent/orchestrator/session/loop.mjs:441`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:210`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:288`\n\n- Fire decision: worker policy enables auto unless disabled, derives boundary/trigger/buffer/reserve/type, then compacts when reactive is forced, token estimate is unknown, or `messages + reserve >= trigger`. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:89`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:117`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170`\n\n- Pre-send flow: loop drains queued input first, resolves policy, computes `shouldCompact`, then chooses target budget before provider send. `src/runtime/agent/orchestrator/session/loop.mjs:324`, `src/runtime/agent/orchestrator/session/loop.mjs:329`, `src/runtime/agent/orchestrator/session/loop.mjs:351`, `src/runtime/agent/orchestrator/session/loop.mjs:362`\n\n- Manager flow: `runSessionCompaction()` skips closed/disabled/tiny sessions, requires a boundary, returns “below threshold” unless forced or pressure reaches trigger, then computes compact budget. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:144`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:150`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:176`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:196`\n\n- Semantic windowing: messages are sanitized, protected system/reminder prefix is split from conversation, prior summary is found, and summaries are excluded from live history. `src/runtime/agent/orchestrator/session/compact/engine.mjs:100`, `src/runtime/agent/orchestrator/session/compact/messages.mjs:56`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:103`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:110`\n\n- Semantic tail: if live history has user turns, keep up to configured recent turns within `preserveRecentBudget`; otherwise choose a non-tool cut point so assistant/tool-only sessions can compact. `src/runtime/agent/orchestrator/session/compact/engine.mjs:134`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:193`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:240`\n\n- Semantic output: head becomes the summary source, tail is sanitized/reconciled and preserved verbatim, mandatory `system + tail` cost can raise the working budget instead of aborting. `src/runtime/agent/orchestrator/session/compact/engine.mjs:244`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:250`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:319`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:328`\n\n- Recall tail: recall-fasttrack keeps newest structured turns, drops oldest kept turns if over cap, truncates the surviving oversized turn/message, then splits head before that tail. `src/runtime/agent/orchestrator/session/compact/engine.mjs:449`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:601`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:610`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:617`\n\n- Redaction: compaction no-op returns sanitized messages unchanged, but active semantic/recall compaction redacts tool-call secret values before window selection so preserved tail/system are emitted redacted. `src/runtime/agent/orchestrator/session/compact/engine.mjs:286`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:312`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:644`\n\n- Redaction scope: verbatim redaction only walks assistant `toolCalls` arguments, preserving shape/order/pairing; prompt-side summaries and preserved-fact extraction also redact raw secret strings. `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:319`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:323`, `src/runtime/agent/orchestrator/session/compact/budget.mjs:152`\n\n- Semantic failure paths: provider/send missing, empty live window, no compactable prior head, unfit prompt/summary, empty provider summary, or final over-budget all throw. `src/runtime/agent/orchestrator/session/compact/engine.mjs:279`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:254`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:315`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:335`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:372`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:395`\n\n- Recall failure paths: no prior/recall basis, empty recall text, unfit recall summary, or final over-budget throw. `src/runtime/agent/orchestrator/session/compact/engine.mjs:653`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:666`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:691`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:698`\n\n- Fallbacks: loop semantic failure may recover via unanchored tool-output prune, but recall-fasttrack failures skip that prune and escalate to `AgentContextOverflowError`; manager recall-fasttrack can first degrade to semantic, then non-recall failures may prune. `src/runtime/agent/orchestrator/session/loop.mjs:501`, `src/runtime/agent/orchestrator/session/loop.mjs:517`, `src/runtime/agent/orchestrator/session/loop.mjs:618`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:237`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:327`",
106
- "card": {
107
- "session": "sess_55016_1783073609486_1783073609798_f447f3883c21e26f2060e41d62b22cca",
108
- "provider": "openai-oauth",
109
- "model": "gpt-5.5",
110
- "wall_ms": 65187,
111
- "turns": 11,
112
- "tool_calls": 13,
113
- "tools_per_turn": 1.2,
114
- "total_tool_ms": 551,
115
- "llm_stream_ms": 64440,
116
- "cache_ratio": 0.8100907280371764,
117
- "cached_tokens": 292864,
118
- "prompt_tokens": 361520,
119
- "uncached_tokens": 68656,
120
- "output_tokens": 4721,
121
- "cache_weighted_input_10": 97942.4,
122
- "cache_weighted_input_25": 141872,
123
- "prompt_growth": 55550,
124
- "antipatterns": 1,
125
- "issues": 15,
126
- "issue_types": [
127
- "cache",
128
- "cache_break",
129
- "readonly_stall",
130
- "service_tier",
131
- "missed_parallelism",
132
- "tool_churn_cluster"
133
- ],
134
- "read_fragmentation_paths": [],
135
- "grep_sweep_count": 0
136
- }
137
- }
138
- ],
139
- "task_complete": true,
140
- "task_errors": [],
141
- "score_complete": true,
142
- "score_errors": [],
143
- "group": {
144
- "n": 3,
145
- "wall_ms": 72879,
146
- "turns": 7.7,
147
- "tool_calls": 8.3,
148
- "tools_per_turn": 1.1,
149
- "total_tool_ms": 1000.7,
150
- "llm_stream_ms": 71585,
151
- "cache_ratio": 0.7,
152
- "cached_tokens": 142165.3,
153
- "prompt_tokens": 186182.7,
154
- "uncached_tokens": 44017.3,
155
- "output_tokens": 6823.7,
156
- "cache_weighted_input_10": 58233.9,
157
- "cache_weighted_input_25": 79558.7,
158
- "prompt_growth": 30217,
159
- "antipatterns": 1,
160
- "issues": 11.7,
161
- "grep_sweep_count": 0
162
- },
163
- "cards": [
164
- {
165
- "session": "sess_60648_1783073609442_1783073609762_34035af1e4baee85ce101c9ce53cdd12",
166
- "provider": "openai-oauth",
167
- "model": "gpt-5.5",
168
- "wall_ms": 113997,
169
- "turns": 6,
170
- "tool_calls": 7,
171
- "tools_per_turn": 1.2,
172
- "total_tool_ms": 1046,
173
- "llm_stream_ms": 112569,
174
- "cache_ratio": 0.6558328317669028,
175
- "cached_tokens": 84992,
176
- "prompt_tokens": 129594,
177
- "uncached_tokens": 44602,
178
- "output_tokens": 12095,
179
- "cache_weighted_input_10": 53101.2,
180
- "cache_weighted_input_25": 65850,
181
- "prompt_growth": 29502,
182
- "antipatterns": 1,
183
- "issues": 10,
184
- "issue_types": [
185
- "cache",
186
- "cache_break",
187
- "broad_tool_result",
188
- "service_tier",
189
- "tool_churn_cluster"
190
- ],
191
- "read_fragmentation_paths": [],
192
- "grep_sweep_count": 0
193
- },
194
- {
195
- "session": "sess_38868_1783073609468_1783073609786_e1e184b05889a1d81d5dd8806fb7fed7",
196
- "provider": "openai-oauth",
197
- "model": "gpt-5.5",
198
- "wall_ms": 39453,
199
- "turns": 6,
200
- "tool_calls": 5,
201
- "tools_per_turn": 0.8,
202
- "total_tool_ms": 1405,
203
- "llm_stream_ms": 37746,
204
- "cache_ratio": 0.7212978616128363,
205
- "cached_tokens": 48640,
206
- "prompt_tokens": 67434,
207
- "uncached_tokens": 18794,
208
- "output_tokens": 3655,
209
- "cache_weighted_input_10": 23658,
210
- "cache_weighted_input_25": 30954,
211
- "prompt_growth": 5599,
212
- "antipatterns": 1,
213
- "issues": 10,
214
- "issue_types": [
215
- "cache",
216
- "cache_break",
217
- "service_tier",
218
- "missed_parallelism",
219
- "tool_churn_cluster"
220
- ],
221
- "read_fragmentation_paths": [],
222
- "grep_sweep_count": 0
223
- },
224
- {
225
- "session": "sess_55016_1783073609486_1783073609798_f447f3883c21e26f2060e41d62b22cca",
226
- "provider": "openai-oauth",
227
- "model": "gpt-5.5",
228
- "wall_ms": 65187,
229
- "turns": 11,
230
- "tool_calls": 13,
231
- "tools_per_turn": 1.2,
232
- "total_tool_ms": 551,
233
- "llm_stream_ms": 64440,
234
- "cache_ratio": 0.8100907280371764,
235
- "cached_tokens": 292864,
236
- "prompt_tokens": 361520,
237
- "uncached_tokens": 68656,
238
- "output_tokens": 4721,
239
- "cache_weighted_input_10": 97942.4,
240
- "cache_weighted_input_25": 141872,
241
- "prompt_growth": 55550,
242
- "antipatterns": 1,
243
- "issues": 15,
244
- "issue_types": [
245
- "cache",
246
- "cache_break",
247
- "readonly_stall",
248
- "service_tier",
249
- "missed_parallelism",
250
- "tool_churn_cluster"
251
- ],
252
- "read_fragmentation_paths": [],
253
- "grep_sweep_count": 0
254
- }
255
- ]
256
- }