mixdog 0.9.17 → 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 (129) hide show
  1. package/package.json +3 -2
  2. package/scripts/build-runtime-windows.ps1 +242 -242
  3. package/scripts/output-style-smoke.mjs +2 -2
  4. package/scripts/recall-bench-cases.json +11 -0
  5. package/scripts/recall-bench.mjs +91 -2
  6. package/scripts/recall-usecase-cases.json +1 -1
  7. package/scripts/smoke-runtime-negative.ps1 +106 -106
  8. package/scripts/tool-efficiency-diag.mjs +5 -2
  9. package/scripts/tool-smoke.mjs +101 -27
  10. package/src/agents/debugger/AGENT.md +3 -3
  11. package/src/agents/heavy-worker/AGENT.md +7 -10
  12. package/src/agents/maintainer/AGENT.md +1 -2
  13. package/src/agents/reviewer/AGENT.md +1 -2
  14. package/src/agents/worker/AGENT.md +5 -8
  15. package/src/defaults/agents.json +3 -0
  16. package/src/mixdog-session-runtime.mjs +23 -6
  17. package/src/rules/agent/00-core.md +4 -3
  18. package/src/rules/agent/30-explorer.md +53 -22
  19. package/src/rules/lead/02-channels.md +3 -3
  20. package/src/rules/lead/lead-tool.md +3 -2
  21. package/src/rules/shared/01-tool.md +24 -29
  22. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +1 -1
  23. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +1 -1
  24. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +24 -3
  25. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +3 -3
  26. package/src/runtime/agent/orchestrator/session/context-utils.mjs +2 -2
  27. package/src/runtime/agent/orchestrator/session/loop/steering-ladder.mjs +250 -35
  28. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +6 -4
  29. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +198 -6
  30. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +10 -2
  31. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +13 -15
  32. package/src/runtime/agent/orchestrator/tools/builtin/read-batch.mjs +6 -1
  33. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +45 -3
  34. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +5 -2
  35. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +195 -3
  36. package/src/runtime/agent/orchestrator/tools/builtin.mjs +17 -1
  37. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +38 -0
  38. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +4 -4
  39. package/src/runtime/agent/orchestrator/tools/shell-state.mjs +1 -1
  40. package/src/runtime/channels/backends/discord-attachments.mjs +2 -2
  41. package/src/runtime/channels/backends/discord-gateway.mjs +26 -3
  42. package/src/runtime/channels/backends/discord.mjs +139 -7
  43. package/src/runtime/channels/index.mjs +290 -76
  44. package/src/runtime/channels/lib/crash-log.mjs +21 -3
  45. package/src/runtime/channels/lib/inbound-routing.mjs +19 -12
  46. package/src/runtime/channels/lib/memory-client.mjs +32 -14
  47. package/src/runtime/channels/lib/output-forwarder.mjs +156 -14
  48. package/src/runtime/channels/lib/owner-heartbeat.mjs +13 -4
  49. package/src/runtime/channels/lib/runtime-paths.mjs +48 -1
  50. package/src/runtime/channels/lib/tool-dispatch.mjs +17 -7
  51. package/src/runtime/channels/lib/voice-transcription.mjs +4 -2
  52. package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +8 -2
  53. package/src/runtime/memory/lib/memory-recall-store.mjs +182 -9
  54. package/src/runtime/memory/lib/query-handlers.mjs +36 -4
  55. package/src/runtime/memory/lib/recall-format.mjs +106 -6
  56. package/src/runtime/memory/lib/session-ingest.mjs +1 -1
  57. package/src/runtime/shared/atomic-file.mjs +10 -4
  58. package/src/runtime/shared/background-tasks.mjs +4 -2
  59. package/src/runtime/shared/tool-execution-contract.mjs +1 -1
  60. package/src/runtime/shared/tool-result-summary.mjs +1 -1
  61. package/src/runtime/shared/tool-surface.mjs +30 -1
  62. package/src/session-runtime/config-lifecycle.mjs +1 -1
  63. package/src/session-runtime/cwd-plugins.mjs +46 -3
  64. package/src/session-runtime/mcp-glue.mjs +24 -3
  65. package/src/session-runtime/output-styles.mjs +44 -10
  66. package/src/session-runtime/workflow.mjs +16 -1
  67. package/src/standalone/channel-worker.mjs +88 -7
  68. package/src/standalone/explore-tool.mjs +1 -1
  69. package/src/tui/App.jsx +57 -77
  70. package/src/tui/app/channel-pickers.mjs +45 -0
  71. package/src/tui/app/slash-commands.mjs +0 -1
  72. package/src/tui/app/slash-dispatch.mjs +0 -16
  73. package/src/tui/app/transcript-window.mjs +66 -1
  74. package/src/tui/app/use-mouse-input.mjs +9 -2
  75. package/src/tui/app/use-prompt-handlers.mjs +7 -94
  76. package/src/tui/app/use-transcript-scroll.mjs +5 -1
  77. package/src/tui/app/use-transcript-window.mjs +74 -8
  78. package/src/tui/components/PromptInput.jsx +33 -64
  79. package/src/tui/components/ToolExecution.jsx +2 -2
  80. package/src/tui/dist/index.mjs +4744 -4806
  81. package/src/tui/engine.mjs +109 -20
  82. package/src/tui/lib/voice-setup.mjs +166 -0
  83. package/src/tui/paste-attachments.mjs +12 -5
  84. package/src/tui/prompt-history-store.mjs +125 -12
  85. package/scripts/bench/cache-probe-tasks.json +0 -8
  86. package/scripts/bench/lead-review-tasks-r3.json +0 -20
  87. package/scripts/bench/lead-review-tasks.json +0 -20
  88. package/scripts/bench/r4-mixed-tasks.json +0 -20
  89. package/scripts/bench/r5-orchestrated-task.json +0 -7
  90. package/scripts/bench/review-tasks.json +0 -20
  91. package/scripts/bench/round-codex.json +0 -114
  92. package/scripts/bench/round-mixdog-lead-r3.json +0 -269
  93. package/scripts/bench/round-mixdog-lead.json +0 -269
  94. package/scripts/bench/round-mixdog.json +0 -126
  95. package/scripts/bench/round-r10-bigsample.json +0 -679
  96. package/scripts/bench/round-r11-codexalign.json +0 -257
  97. package/scripts/bench/round-r13-clientmeta.json +0 -464
  98. package/scripts/bench/round-r14-betafeatures.json +0 -466
  99. package/scripts/bench/round-r15-fulldefault.json +0 -462
  100. package/scripts/bench/round-r16-sessionid.json +0 -466
  101. package/scripts/bench/round-r17-wirebytes.json +0 -456
  102. package/scripts/bench/round-r18-prewarm.json +0 -468
  103. package/scripts/bench/round-r19-clean.json +0 -472
  104. package/scripts/bench/round-r20-prewarm-clean.json +0 -475
  105. package/scripts/bench/round-r21-delta-retry.json +0 -473
  106. package/scripts/bench/round-r22-full-probe.json +0 -693
  107. package/scripts/bench/round-r23-itemprobe.json +0 -701
  108. package/scripts/bench/round-r24-shapefix.json +0 -677
  109. package/scripts/bench/round-r25-serial.json +0 -464
  110. package/scripts/bench/round-r26-parallel3.json +0 -671
  111. package/scripts/bench/round-r27-parallel10.json +0 -894
  112. package/scripts/bench/round-r28-parallel10-stagger.json +0 -882
  113. package/scripts/bench/round-r29-parallel10-stagger166.json +0 -886
  114. package/scripts/bench/round-r30-instid.json +0 -253
  115. package/scripts/bench/round-r31-upgradeprobe.json +0 -256
  116. package/scripts/bench/round-r32-vs-codex-lead.json +0 -254
  117. package/scripts/bench/round-r33-vs-codex-codex.json +0 -115
  118. package/scripts/bench/round-r34-orchestrated.json +0 -120
  119. package/scripts/bench/round-r35-orchestrated-codex.json +0 -61
  120. package/scripts/bench/round-r36-orchestrated-capped.json +0 -128
  121. package/scripts/bench/round-r4-codex.json +0 -114
  122. package/scripts/bench/round-r4-mixed.json +0 -225
  123. package/scripts/bench/round-r5-gpt-lead.json +0 -259
  124. package/scripts/bench/round-r6-codex.json +0 -114
  125. package/scripts/bench/round-r6-solo.json +0 -257
  126. package/scripts/bench/round-r7-full.json +0 -254
  127. package/scripts/bench/round-r8-fulldefault.json +0 -255
  128. package/src/tui/components/prompt-input/voice-indicator.mjs +0 -39
  129. package/src/tui/lib/voice-recorder.mjs +0 -469
@@ -1,466 +0,0 @@
1
- {
2
- "round": "16",
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": 6,
14
- "completed": 6,
15
- "completion_rate": 100,
16
- "sessions": [
17
- "sess_58408_1783058979193_1783058979442_d47c240b8d093c927461b55a0dc2516c",
18
- "sess_18552_1783058979205_1783058979453_87070f4cdd6037cd39aa2a84fc8356ac",
19
- "sess_33120_1783058979218_1783058979467_17893d4613374d6fecfb2f6704eff5b2",
20
- "sess_47252_1783059063096_1783059063358_bd9cf12a670c04ca4c9e3d75b7938009",
21
- "sess_51160_1783059076138_1783059076364_ce7ebef63b9773c3457e0a8dbeed9dd7",
22
- "sess_58804_1783059088033_1783059088258_fecef461f40816f3c4db38876a81fd3b"
23
- ],
24
- "results": [
25
- {
26
- "id": "r4-debug-forwarding-gap#1",
27
- "agent": "reviewer",
28
- "ok": true,
29
- "ms": 83904,
30
- "sessionId": "sess_58408_1783058979193_1783058979442_d47c240b8d093c927461b55a0dc2516c",
31
- "output": "sessionId: sess_58408_1783058979193_1783058979442_d47c240b8d093c927461b55a0dc2516c\n조사 완료: `bridge-state.json`은 실제 전송 준비보다 먼저 쓰이며, 이 구간 출력은 대부분 “지연 후 catch-up”되지만 일부 조건에서는 조용히 누락될 수 있습니다.\n\n- **가장 큰 누락 위험 — 채널 바인딩 없음:** 활성화 시 저장된 `channelId`도 `mainChannel`도 없으면 바인딩이 중단되고, 이후 첫 inbound가 기존 transcript를 `catchUp` 없이 EOF로 바인딩해 이전 출력이 스킵될 수 있습니다. `src/runtime/channels/index.mjs:610`, `src/runtime/channels/index.mjs:624`, `src/runtime/channels/index.mjs:1597`, `src/runtime/channels/lib/output-forwarder.mjs:125` — backlog catch-up **복구 안 됨**.\n\n- **not-yet-created transcript:** `fs.watch`는 없는 파일에 실패하지만 pending path를 저장하고 re-arm poll이 파일 생성 시 watch 설치 후 `forwardNewText()`를 호출합니다. `src/runtime/channels/index.mjs:469`, `src/runtime/channels/index.mjs:486`, `src/runtime/channels/index.mjs:497`, `src/runtime/channels/index.mjs:376`, `src/runtime/channels/index.mjs:379` — 60초 안 생성되면 **복구됨**, timeout 이후는 자동 복구가 보장되지 않습니다.\n\n- **bridge-state 선행 노출:** `start()`가 `channelBridgeActive=true`와 `bridge-state.json`을 먼저 쓰고, 그 뒤 ownership/connect/binding을 기다립니다. `src/runtime/channels/index.mjs:1734`, `src/runtime/channels/index.mjs:1736`, `src/runtime/channels/index.mjs:1744`, `src/runtime/channels/index.mjs:769`, `src/runtime/channels/index.mjs:776` — transcript cursor가 전진하지 않아 post-connect `forwardNewText()`로 **지연 복구됨**.\n\n- **ownership probe 대기:** `_isOwner()`는 `bridgeRuntimeConnected && currentOwnerState().owned`가 될 때까지 false라 watch flush가 와도 읽지 않습니다. `src/runtime/channels/index.mjs:316`, `src/runtime/channels/lib/output-forwarder.mjs:351`, `src/runtime/channels/lib/output-forwarder.mjs:354` — 읽기 전 return이므로 backlog는 이후 flush/re-arm/post-connect forward로 **복구됨**.\n\n- **pre-connect re-arm 조기 종료:** pre-connect에서 pending re-arm이 먼저 돌면 `!bridgeRuntimeConnected`로 종료됩니다. 이후 connect 완료 시 missing transcript를 다시 re-arm합니다. `src/runtime/channels/index.mjs:372`, `src/runtime/channels/index.mjs:803`, `src/runtime/channels/index.mjs:807` — **지연 복구됨**.\n\n- **정상 첫 전송 경로:** 바인딩 후 watch가 설치되면 생성/변경 이벤트가 `scheduleWatchFlush()` → `forwardNewText()` → queue → `backend.sendMessage()`로 흐릅니다. `src/runtime/channels/lib/output-forwarder.mjs:647`, `src/runtime/channels/lib/output-forwarder.mjs:657`, `src/runtime/channels/lib/output-forwarder.mjs:724`, `src/runtime/channels/lib/output-forwarder.mjs:402`, `src/runtime/channels/lib/output-forwarder.mjs:446`, `src/runtime/channels/lib/output-forwarder.mjs:316`.\n\nVerdict: 현재 설계는 일반 활성화 레이스는 catch-up으로 회복하지만, “채널 미바인딩 상태에서 기존 transcript를 첫 inbound가 EOF 바인딩”하는 경우와 pending transcript 60초 timeout 이후는 조용한 누락 가능성이 남아 있습니다.",
32
- "card": {
33
- "session": "sess_58408_1783058979193_1783058979442_d47c240b8d093c927461b55a0dc2516c",
34
- "provider": "openai-oauth",
35
- "model": "gpt-5.5",
36
- "wall_ms": 73382,
37
- "turns": 5,
38
- "tool_calls": 5,
39
- "tools_per_turn": 1,
40
- "total_tool_ms": 408,
41
- "llm_stream_ms": 72483,
42
- "cache_ratio": 0.7143255762040293,
43
- "cached_tokens": 89600,
44
- "prompt_tokens": 125433,
45
- "uncached_tokens": 35833,
46
- "output_tokens": 6270,
47
- "cache_weighted_input_10": 44793,
48
- "cache_weighted_input_25": 58233,
49
- "prompt_growth": 31998,
50
- "antipatterns": 1,
51
- "issues": 9,
52
- "issue_types": [
53
- "cache",
54
- "cache_break",
55
- "broad_tool_result",
56
- "service_tier",
57
- "tool_churn_cluster"
58
- ],
59
- "read_fragmentation_paths": [],
60
- "grep_sweep_count": 0
61
- }
62
- },
63
- {
64
- "id": "r4-impl-usage-summary#1",
65
- "agent": "worker",
66
- "ok": true,
67
- "ms": 108833,
68
- "sessionId": "sess_18552_1783058979205_1783058979453_87070f4cdd6037cd39aa2a84fc8356ac",
69
- "output": "sessionId: sess_18552_1783058979205_1783058979453_87070f4cdd6037cd39aa2a84fc8356ac\n요청 범위가 명확해서 바로 구현하고 검증까지 진행하겠습니다.기존 미완성 파일이 있어 누락된 데이터 경로 해석만 보완하고 검증하겠습니다.검증은 통과했고, 이제 변경 범위만 확인하겠습니다.완료했습니다, 재영님. `usage:today` 스크립트와 `scripts/usage-today.mjs` 집계 기능이 준비됐습니다.\n\n- **Diff 요약**: `package.json`에 `usage:today` 추가, `scripts/usage-today.mjs` 신규로 오늘 자정 이후 usage를 모델별/총합 집계합니다.\n\n- **출력 항목**: 모델별 `calls`, `input`, `cached`, `output`, `costUsd`와 `GRAND TOTAL`을 출력하며 `--trace`, `--json`도 지원합니다.\n\n- **검증**: `node --check scripts/usage-today.mjs` 통과, `npm run usage:today` 실행 완료. 현재 실행 결과 총합은 `1413 calls`, `52.44M input`, `50.77M cached`, `1.65M output`, `$91.2403`입니다.\n\n참고로 작업 전부터 있던 `src/runtime/channels/lib/event-queue.mjs`, `src/runtime/channels/lib/output-forwarder.mjs` 변경은 건드리지 않았습니다.",
70
- "card": {
71
- "session": "sess_18552_1783058979205_1783058979453_87070f4cdd6037cd39aa2a84fc8356ac",
72
- "provider": "openai-oauth",
73
- "model": "gpt-5.5",
74
- "wall_ms": 98329,
75
- "turns": 18,
76
- "tool_calls": 24,
77
- "tools_per_turn": 1.3,
78
- "total_tool_ms": 3531,
79
- "llm_stream_ms": 94684,
80
- "cache_ratio": 0.8973703724131169,
81
- "cached_tokens": 292864,
82
- "prompt_tokens": 326358,
83
- "uncached_tokens": 33494,
84
- "output_tokens": 6700,
85
- "cache_weighted_input_10": 62780.4,
86
- "cache_weighted_input_25": 106710,
87
- "prompt_growth": 23545,
88
- "antipatterns": 3,
89
- "issues": 16,
90
- "issue_types": [
91
- "cache",
92
- "cache_break",
93
- "tool_error",
94
- "service_tier",
95
- "duplicate_tool",
96
- "missed_parallelism",
97
- "tool_churn_cluster"
98
- ],
99
- "read_fragmentation_paths": [],
100
- "grep_sweep_count": 0
101
- }
102
- },
103
- {
104
- "id": "r4-explain-compact-engine#1",
105
- "agent": "explore",
106
- "ok": true,
107
- "ms": 96923,
108
- "sessionId": "sess_33120_1783058979218_1783058979467_17893d4613374d6fecfb2f6704eff5b2",
109
- "output": "ap, anchored to `file:line`.\n\n- **Exports:** `engine.mjs` exposes `semanticCompactMessages()` and `recallFastTrackCompactMessages()` as the two compaction engines. `src/runtime/agent/orchestrator/session/compact/engine.mjs:278`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:445`\n\n- **Runtime callers:** auto pre-send compaction enters from `agentLoop()`, choosing recall-fasttrack first or semantic second. `src/runtime/agent/orchestrator/session/loop.mjs:414`, `src/runtime/agent/orchestrator/session/loop.mjs:439`\n\n- **Manual/clear callers:** manual `compact()` and pre-clear compaction route through `runSessionCompaction()`. `src/runtime/agent/orchestrator/session/manager.mjs:1849`, `src/runtime/agent/orchestrator/session/manager.mjs:1950`, `src/mixdog-session-runtime.mjs:2443`, `src/mixdog-session-runtime.mjs:2462`\n\n- **Policy gate:** auto compaction only exists when `resolveWorkerCompactPolicy()` returns `auto:true` with boundary, trigger, type, tail, keep, and reserve settings. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:89`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:124`\n\n- **Fire decision:** pre-send drains pending steering first, estimates message tokens, then fires if reactive overflow is pending or `messageTokens + reserveTokens >= triggerTokens`. `src/runtime/agent/orchestrator/session/loop.mjs:324`, `src/runtime/agent/orchestrator/session/loop.mjs:351`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170`\n\n- **Budget:** compaction targets a reduced budget derived from boundary, target ratio/min/max, and reserve; loop uses that only when `shouldCompact` is true. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:66`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:163`, `src/runtime/agent/orchestrator/session/loop.mjs:362`\n\n- **Manual threshold:** manual mode is forced, while non-forced session compaction returns `below threshold` when pressure is under trigger. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:143`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:176`\n\n- **Semantic no-op:** if sanitized messages already fit and `force !== true`, semantic returns unchanged and explicitly skips preserved-tail redaction. `src/runtime/agent/orchestrator/session/compact/engine.mjs:284`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:286`\n\n- **Semantic split:** semantic separates protected system prefix, live non-summary history, and prior summary before selecting a compacted head plus preserved tail. `src/runtime/agent/orchestrator/session/compact/engine.mjs:100`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:110`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:235`\n\n- **Semantic tail:** with user turns, it keeps up to `tailTurns` recent turns within recent budget, splitting newest suffix if needed. `src/runtime/agent/orchestrator/session/compact/engine.mjs:46`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:134`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:141`\n\n- **No-user tail:** without user anchors, it cuts only at non-`tool` messages so tool results never lead an orphaned tail. `src/runtime/agent/orchestrator/session/compact/engine.mjs:114`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:121`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:193`\n\n- **Tail repair:** after semantic cut, the preserved tail is repaired with `sanitizeToolPairs`, `dedupToolResultBodies`, and `reconcileDedupStubs`. `src/runtime/agent/orchestrator/session/compact/engine.mjs:246`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:250`\n\n- **Recall tail:** recall-fasttrack preserves newest structured turns verbatim, defaulting to two user-anchored turns under an 8k cap. `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`\n\n- **Recall truncation:** if recall tail exceeds cap, it drops oldest kept turns, then truncates the last surviving turn/message while preserving at least newest content. `src/runtime/agent/orchestrator/session/compact/engine.mjs:601`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:609`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:525`\n\n- **Redaction hook:** once compaction proceeds, both semantic and recall redact tool-call secret arguments before window/tail selection, so emitted preserved context is already redacted. `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:644`\n\n- **Redaction behavior:** redaction touches only assistant `toolCalls` argument values, preserving role/content/tool ids/order/pairing. `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:291`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:319`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:323`\n\n- **Semantic failure points:** semantic throws on missing provider, no compactable prior history, prompt fit failure, empty provider summary, summary fit failure, or final budget overflow. `src/runtime/agent/orchestrator/session/compact/engine.mjs:279`, `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:371`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:384`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:394`\n\n- **Recall failure points:** recall throws on no prior/recall material, empty recall text when not allowed, summary fit failure, or final budget overflow. `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:697`\n\n- **Loop fallback:** semantic failure can recover via non-LLM unanchored tool-output prune; recall-fasttrack failure is explicitly excluded from that prune path. `src/runtime/agent/orchestrator/session/loop.mjs:501`, `src/runtime/agent/orchestrator/session/loop.mjs:511`, `src/runtime/agent/orchestrator/session/loop.mjs:517`\n\n- **Loop hard fail:** if no compacted result exists after fallback, loop records telemetry/events and throws `agentContextOverflowError`. `src/runtime/agent/orchestrator/session/loop.mjs:552`, `src/runtime/agent/orchestrator/session/loop.mjs:597`, `src/runtime/agent/orchestrator/session/loop.mjs:618`\n\n- **Session fallback:** manual/clear recall-fasttrack failure tries semantic fallback once before recording failure. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:237`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:242`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:245`\n\n- **Session prune/fail:** non-recall manual/clear failures can recover with unanchored prune; otherwise compaction state records `manual_failed`/`post_turn_failed` and returns `changed:false`. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:322`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:348`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:375`\n\n- **State mutation:** successful compaction replaces session messages, clears provider state, records compact metadata, and increments compact count only when changed. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:410`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:411`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:412`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:444`",
110
- "card": {
111
- "session": "sess_33120_1783058979218_1783058979467_17893d4613374d6fecfb2f6704eff5b2",
112
- "provider": "openai-oauth",
113
- "model": "gpt-5.5",
114
- "wall_ms": 86414,
115
- "turns": 7,
116
- "tool_calls": 11,
117
- "tools_per_turn": 1.6,
118
- "total_tool_ms": 1285,
119
- "llm_stream_ms": 85250,
120
- "cache_ratio": 0.4026380830282444,
121
- "cached_tokens": 60928,
122
- "prompt_tokens": 151322,
123
- "uncached_tokens": 90394,
124
- "output_tokens": 5597,
125
- "cache_weighted_input_10": 96486.8,
126
- "cache_weighted_input_25": 105626,
127
- "prompt_growth": 36507,
128
- "antipatterns": 0,
129
- "issues": 10,
130
- "issue_types": [
131
- "cache",
132
- "cache_break",
133
- "cache_miss",
134
- "service_tier"
135
- ],
136
- "read_fragmentation_paths": [],
137
- "grep_sweep_count": 0
138
- }
139
- },
140
- {
141
- "id": "r4-debug-forwarding-gap#2",
142
- "agent": "reviewer",
143
- "ok": true,
144
- "ms": 104643,
145
- "sessionId": "sess_47252_1783059063096_1783059063358_bd9cf12a670c04ca4c9e3d75b7938009",
146
- "output": "sessionId: sess_47252_1783059063096_1783059063358_bd9cf12a670c04ca4c9e3d75b7938009\n관련 경로를 직접 추적해 활성화부터 첫 전달까지의 손실/지연 지점을 확인하겠습니다.Findings ordered by impact:\n\n1. **Silent drop: first bind to an already-existing transcript can seek to EOF.** `setContext()` defaults `readFileSize/lastFileSize` to current file size unless `replayFromStart` or matching `catchUpFromPersisted` is used (`src/runtime/channels/lib/output-forwarder.mjs:112-129`). On first inbound, `applyTranscriptBinding()` is called without catch-up for an existing transcript (`src/runtime/channels/index.mjs:1597-1603`), so assistant bytes written after `bridge-state.json` but before binding are skipped. **Backlog catch-up: no**, unless a matching persisted cursor already exists or the path goes through the pending-transcript branch.\n\n2. **Delayed, mostly recovered: transcript path known before the `.jsonl` exists.** `startWatch()` cannot watch a missing file and closes silently on `watch.start.catch` (`src/runtime/channels/lib/output-forwarder.mjs:647-670`); `schedulePendingTranscriptRearm()` polls, installs the watcher, then calls `forwardNewText()` when the file appears (`src/runtime/channels/index.mjs:357-390`). **Backlog catch-up: yes within the 60s re-arm window**, because pending binds use start/persisted cursor logic and immediately forward on creation (`src/runtime/channels/index.mjs:469-498`); after timeout, recovery needs another rebind/event.\n\n3. **Delayed: bridge is advertised active before backend ownership is fully connected.** `start()` writes `bridge-state.json` before `refreshBridgeOwnership()`/`backend.connect()` complete (`src/runtime/channels/index.mjs:1734-1747`), while `_isOwner()` rejects forwarding until `bridgeRuntimeConnected && currentOwnerState().owned` (`src/runtime/channels/index.mjs:316`, `src/runtime/channels/lib/output-forwarder.mjs:351-353`). **Backlog catch-up: yes in the normal start path**, because post-connect either re-arms a missing transcript or calls `forwardNewText()` (`src/runtime/channels/index.mjs:801-812`).\n\n4. **Delayed/trigger-dependent: transient ownership-probe false during a watch flush.** `forwardNewText()` returns before reading or advancing the cursor when `_isOwner()` is false (`src/runtime/channels/lib/output-forwarder.mjs:36-42`, `src/runtime/channels/lib/output-forwarder.mjs:351-354`), so bytes are not lost, but the fs.watch edge may be consumed. **Backlog catch-up: partial**, recovered by post-connect catch-up, a later watch event, turn-end/final flush, or rebind; there is no dedicated catch-up when ownership becomes true again while already connected.\n\n5. **Delayed: bind task can run pre-connect and arm a rewatch too early.** Initial binding starts before `backend.connect()` (`src/runtime/channels/index.mjs:758-769`); if the pending re-arm ticks while `bridgeRuntimeConnected` is still false, it exits without rescheduling (`src/runtime/channels/index.mjs:369-375`). **Backlog catch-up: yes in normal startup**, because after connect the code explicitly re-arms the pending path (`src/runtime/channels/index.mjs:803-807`).\n\nVerdict: the main real loss risk is EOF binding of an already-existing transcript without a persisted cursor; the missing-file and pre-connect windows are mostly recovered by re-arm/post-connect catch-up, while ownership false probes can delay until another trigger.",
147
- "card": {
148
- "session": "sess_47252_1783059063096_1783059063358_bd9cf12a670c04ca4c9e3d75b7938009",
149
- "provider": "openai-oauth",
150
- "model": "gpt-5.5",
151
- "wall_ms": 94112,
152
- "turns": 5,
153
- "tool_calls": 5,
154
- "tools_per_turn": 1,
155
- "total_tool_ms": 515,
156
- "llm_stream_ms": 93270,
157
- "cache_ratio": 0.7144130665653755,
158
- "cached_tokens": 92160,
159
- "prompt_tokens": 129001,
160
- "uncached_tokens": 36841,
161
- "output_tokens": 5873,
162
- "cache_weighted_input_10": 46057,
163
- "cache_weighted_input_25": 59881,
164
- "prompt_growth": 35735,
165
- "antipatterns": 1,
166
- "issues": 9,
167
- "issue_types": [
168
- "cache",
169
- "cache_break",
170
- "broad_tool_result",
171
- "service_tier",
172
- "tool_churn_cluster"
173
- ],
174
- "read_fragmentation_paths": [],
175
- "grep_sweep_count": 0
176
- }
177
- },
178
- {
179
- "id": "r4-impl-usage-summary#2",
180
- "agent": "worker",
181
- "ok": true,
182
- "ms": 67913,
183
- "sessionId": "sess_51160_1783059076138_1783059076364_ce7ebef63b9773c3457e0a8dbeed9dd7",
184
- "output": "sessionId: sess_51160_1783059076138_1783059076364_ce7ebef63b9773c3457e0a8dbeed9dd7\n작업 기준 파일과 기존 스크립트 스타일을 먼저 확인하겠습니다.확인한 기준에 맞춰 `package.json`과 새 스크립트를 수정하겠습니다.`package.json`에는 이미 `usage:today` 항목이 있어 새 파일 구현과 검증 중심으로 진행하겠습니다.추가 확인 없이 현재 구조에 맞춰 새 스크립트를 작성하겠습니다.이미 파일이 존재해 내용 확인 후 필요한 차이만 반영하겠습니다.요구사항 대부분이 이미 반영된 상태라, 문법과 실행 검증 후 필요한 보정만 하겠습니다.구현은 이미 있었고, 이제 요구한 검증을 실행하겠습니다.검증은 통과했습니다. 실제 diff를 확인해 요약하겠습니다.재영님, 완료했습니다: `usage:today` 스크립트와 `scripts/usage-today.mjs`가 작업 트리에 반영되어 있습니다.\n\n- **Diff 요약**: `package.json`에 `\"usage:today\": \"node scripts/usage-today.mjs\"` 추가, `scripts/usage-today.mjs` 신규 추가.\n\n- **기능**: `MIXDOG_DATA_DIR`를 우선 사용해 `history/agent-trace.jsonl`을 읽고, 로컬 자정 이후 `usage_raw`/`usage`를 모델별로 집계합니다.\n\n- **출력**: 모델별 `calls`, `input`, `cached`, `output`, `costUsd`와 `GRAND TOTAL` 라인을 출력하며 `--trace`, `--json`도 지원합니다.\n\n- **검증**: `node --check scripts/usage-today.mjs` 통과, `npm run usage:today` 실행 완료. 실행 결과 총합은 `1435 calls`, `53.24M input`, `51.32M cached`, `1.66M output`, `$92.2980`였습니다.",
185
- "card": {
186
- "session": "sess_51160_1783059076138_1783059076364_ce7ebef63b9773c3457e0a8dbeed9dd7",
187
- "provider": "openai-oauth",
188
- "model": "gpt-5.5",
189
- "wall_ms": 57431,
190
- "turns": 10,
191
- "tool_calls": 13,
192
- "tools_per_turn": 1.3,
193
- "total_tool_ms": 2552,
194
- "llm_stream_ms": 54609,
195
- "cache_ratio": 0.8266361778054949,
196
- "cached_tokens": 119296,
197
- "prompt_tokens": 144315,
198
- "uncached_tokens": 25019,
199
- "output_tokens": 3182,
200
- "cache_weighted_input_10": 36948.6,
201
- "cache_weighted_input_25": 54843,
202
- "prompt_growth": 17865,
203
- "antipatterns": 1,
204
- "issues": 14,
205
- "issue_types": [
206
- "cache",
207
- "cache_break",
208
- "service_tier",
209
- "missed_parallelism",
210
- "tool_churn_cluster"
211
- ],
212
- "read_fragmentation_paths": [],
213
- "grep_sweep_count": 0
214
- }
215
- },
216
- {
217
- "id": "r4-explain-compact-engine#2",
218
- "agent": "explore",
219
- "ok": true,
220
- "ms": 137375,
221
- "sessionId": "sess_58804_1783059088033_1783059088258_fecef461f40816f3c4db38876a81fd3b",
222
- "output": " disabled by `compaction.auto=false`, requires a boundary, computes trigger as explicit sub-boundary limit or `boundary-buffer`, and adds request/tool reserve. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:89`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:107`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:117`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:121`\n\n- **When it fires:** pre-send compaction runs after queued steering is drained, then fires if forced-reactive or `messageTokens + reserve >= trigger`; null estimates force compaction. `src/runtime/agent/orchestrator/session/loop.mjs:323`, `src/runtime/agent/orchestrator/session/loop.mjs:329`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170`\n\n- **Budget target:** loop uses `compactTargetBudget()` for compacting, otherwise boundary; target is bounded by boundary and includes reserve. `src/runtime/agent/orchestrator/session/loop.mjs:362`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:163`\n\n- **Reactive path:** provider context-overflow marks one reactive retry, loops back through the normal pre-send compact path, then surfaces overflow if retry was already used. `src/runtime/agent/orchestrator/session/loop.mjs:982`, `src/runtime/agent/orchestrator/session/loop.mjs:995`, `src/runtime/agent/orchestrator/session/loop.mjs:1010`, `src/runtime/agent/orchestrator/session/loop.mjs:1018`\n\n- **Semantic window:** engine sanitizes tool pairs, separates protected/system prefix, finds prior summary, and removes summaries from live history. `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:103`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:110`\n\n- **Semantic tail choice:** with user turns, it preserves up to `tailTurns` recent turns within `preserveRecentBudget`; without user turns, it chooses a non-tool cut point so tool results do not start the tail. `src/runtime/agent/orchestrator/session/compact/engine.mjs:134`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:151`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:193`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:240`\n\n- **Semantic output shape:** selected `head` is summarized, `system + summary + tail` is emitted, and mandatory `system+tail` cost can raise the budget rather than fail early. `src/runtime/agent/orchestrator/session/compact/engine.mjs:244`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:319`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:328`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:392`\n\n- **Recall tail choice:** recall-fasttrack keeps the newest two user-anchored turns by default, drops oldest kept turns until under cap, or truncates the surviving turn; no-user tails are valid. `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:613`\n\n- **Recall pipeline:** loop recall-fasttrack ingests session memory, dumps roots, drains raw rows if needed, caps recall injection to 5% context/floor, then calls `recallFastTrackCompactMessages()`. `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:61`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:84`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:109`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:157`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:161`\n\n- **Redaction hook:** if transcript already fits and not forced, semantic/recall return sanitized messages unchanged; otherwise both redact tool-call secrets before window/tail selection. `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:627`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:644`\n\n- **Redaction semantics:** preserved-tail redaction touches assistant `toolCalls` argument values only, preserves shape/order/pairing, and also redacts raw `key: value` secret strings. `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:219`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:230`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:291`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:319`\n\n- **Prompt-side safety:** summarized head lines use `toolCallSummary()`, whose argument normalization redacts sensitive keys/raw secret strings before truncation. `src/runtime/agent/orchestrator/session/compact/summary.mjs:85`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:121`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:151`\n\n- **Engine failures:** semantic throws for missing provider, empty live/no compactable head, prompt not fitting, empty provider summary, summary not fitting, or final result over budget. `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:385`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:395`\n\n- **Recall failures:** recall-fasttrack throws when there is no compactable head and no recall/prior allowance, recall text is empty, summary cannot fit, or final result exceeds budget. `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- **Loop fallback:** non-recall compact errors get one unanchored prune salvage; if that fails, telemetry emits `overflow_failed` and the loop throws `AgentContextOverflowError`. `src/runtime/agent/orchestrator/session/loop.mjs:500`, `src/runtime/agent/orchestrator/session/loop.mjs:517`, `src/runtime/agent/orchestrator/session/loop.mjs:527`, `src/runtime/agent/orchestrator/session/loop.mjs:552`, `src/runtime/agent/orchestrator/session/loop.mjs:618`\n\n- **Manager fallback:** manual/auto-clear runner falls back from recall-fasttrack to semantic, then non-recall unanchored prune, then records `manual_failed`/`post_turn_failed` without replacing messages. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:231`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:242`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:327`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:348`\n\n- **Success effects:** successful loop compaction replaces the in-memory message array, clears provider state, resets loop iteration count, records telemetry, and fires post-compact hook best-effort. `src/runtime/agent/orchestrator/session/loop.mjs:630`, `src/runtime/agent/orchestrator/session/loop.mjs:632`, `src/runtime/agent/orchestrator/session/loop.mjs:639`, `src/runtime/agent/orchestrator/session/loop.mjs:644`, `src/runtime/agent/orchestrator/session/loop.mjs:651`, `src/runtime/agent/orchestrator/session/loop.mjs:718`\n\n- **Crash recovery:** stale persisted `compacting` stage is normalized to `interrupted` on fresh ask/resume so UI/runtime do not treat it as still running. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:36`, `src/runtime/agent/orchestrator/session/manager.mjs:1233`, `src/runtime/agent/orchestrator/session/manager.mjs:1773`",
223
- "card": {
224
- "session": "sess_58804_1783059088033_1783059088258_fecef461f40816f3c4db38876a81fd3b",
225
- "provider": "openai-oauth",
226
- "model": "gpt-5.5",
227
- "wall_ms": 126887,
228
- "turns": 11,
229
- "tool_calls": 17,
230
- "tools_per_turn": 1.5,
231
- "total_tool_ms": 1470,
232
- "llm_stream_ms": 125260,
233
- "cache_ratio": 0.7053957936861514,
234
- "cached_tokens": 273920,
235
- "prompt_tokens": 388321,
236
- "uncached_tokens": 114401,
237
- "output_tokens": 10728,
238
- "cache_weighted_input_10": 141793,
239
- "cache_weighted_input_25": 182881,
240
- "prompt_growth": 74500,
241
- "antipatterns": 1,
242
- "issues": 17,
243
- "issue_types": [
244
- "cache",
245
- "cache_break",
246
- "cache_miss",
247
- "readonly_stall",
248
- "broad_tool_result",
249
- "service_tier",
250
- "tool_churn_cluster"
251
- ],
252
- "read_fragmentation_paths": [],
253
- "grep_sweep_count": 0
254
- }
255
- }
256
- ],
257
- "task_complete": true,
258
- "task_errors": [],
259
- "score_complete": true,
260
- "score_errors": [],
261
- "group": {
262
- "n": 6,
263
- "wall_ms": 89425.8,
264
- "turns": 9.3,
265
- "tool_calls": 12.5,
266
- "tools_per_turn": 1.3,
267
- "total_tool_ms": 1626.8,
268
- "llm_stream_ms": 87592.7,
269
- "cache_ratio": 0.7,
270
- "cached_tokens": 154794.7,
271
- "prompt_tokens": 210791.7,
272
- "uncached_tokens": 55997,
273
- "output_tokens": 6391.7,
274
- "cache_weighted_input_10": 71476.5,
275
- "cache_weighted_input_25": 94695.7,
276
- "prompt_growth": 36691.7,
277
- "antipatterns": 1.2,
278
- "issues": 12.5,
279
- "grep_sweep_count": 0
280
- },
281
- "cards": [
282
- {
283
- "session": "sess_58408_1783058979193_1783058979442_d47c240b8d093c927461b55a0dc2516c",
284
- "provider": "openai-oauth",
285
- "model": "gpt-5.5",
286
- "wall_ms": 73382,
287
- "turns": 5,
288
- "tool_calls": 5,
289
- "tools_per_turn": 1,
290
- "total_tool_ms": 408,
291
- "llm_stream_ms": 72483,
292
- "cache_ratio": 0.7143255762040293,
293
- "cached_tokens": 89600,
294
- "prompt_tokens": 125433,
295
- "uncached_tokens": 35833,
296
- "output_tokens": 6270,
297
- "cache_weighted_input_10": 44793,
298
- "cache_weighted_input_25": 58233,
299
- "prompt_growth": 31998,
300
- "antipatterns": 1,
301
- "issues": 9,
302
- "issue_types": [
303
- "cache",
304
- "cache_break",
305
- "broad_tool_result",
306
- "service_tier",
307
- "tool_churn_cluster"
308
- ],
309
- "read_fragmentation_paths": [],
310
- "grep_sweep_count": 0
311
- },
312
- {
313
- "session": "sess_18552_1783058979205_1783058979453_87070f4cdd6037cd39aa2a84fc8356ac",
314
- "provider": "openai-oauth",
315
- "model": "gpt-5.5",
316
- "wall_ms": 98329,
317
- "turns": 18,
318
- "tool_calls": 24,
319
- "tools_per_turn": 1.3,
320
- "total_tool_ms": 3531,
321
- "llm_stream_ms": 94684,
322
- "cache_ratio": 0.8973703724131169,
323
- "cached_tokens": 292864,
324
- "prompt_tokens": 326358,
325
- "uncached_tokens": 33494,
326
- "output_tokens": 6700,
327
- "cache_weighted_input_10": 62780.4,
328
- "cache_weighted_input_25": 106710,
329
- "prompt_growth": 23545,
330
- "antipatterns": 3,
331
- "issues": 16,
332
- "issue_types": [
333
- "cache",
334
- "cache_break",
335
- "tool_error",
336
- "service_tier",
337
- "duplicate_tool",
338
- "missed_parallelism",
339
- "tool_churn_cluster"
340
- ],
341
- "read_fragmentation_paths": [],
342
- "grep_sweep_count": 0
343
- },
344
- {
345
- "session": "sess_33120_1783058979218_1783058979467_17893d4613374d6fecfb2f6704eff5b2",
346
- "provider": "openai-oauth",
347
- "model": "gpt-5.5",
348
- "wall_ms": 86414,
349
- "turns": 7,
350
- "tool_calls": 11,
351
- "tools_per_turn": 1.6,
352
- "total_tool_ms": 1285,
353
- "llm_stream_ms": 85250,
354
- "cache_ratio": 0.4026380830282444,
355
- "cached_tokens": 60928,
356
- "prompt_tokens": 151322,
357
- "uncached_tokens": 90394,
358
- "output_tokens": 5597,
359
- "cache_weighted_input_10": 96486.8,
360
- "cache_weighted_input_25": 105626,
361
- "prompt_growth": 36507,
362
- "antipatterns": 0,
363
- "issues": 10,
364
- "issue_types": [
365
- "cache",
366
- "cache_break",
367
- "cache_miss",
368
- "service_tier"
369
- ],
370
- "read_fragmentation_paths": [],
371
- "grep_sweep_count": 0
372
- },
373
- {
374
- "session": "sess_47252_1783059063096_1783059063358_bd9cf12a670c04ca4c9e3d75b7938009",
375
- "provider": "openai-oauth",
376
- "model": "gpt-5.5",
377
- "wall_ms": 94112,
378
- "turns": 5,
379
- "tool_calls": 5,
380
- "tools_per_turn": 1,
381
- "total_tool_ms": 515,
382
- "llm_stream_ms": 93270,
383
- "cache_ratio": 0.7144130665653755,
384
- "cached_tokens": 92160,
385
- "prompt_tokens": 129001,
386
- "uncached_tokens": 36841,
387
- "output_tokens": 5873,
388
- "cache_weighted_input_10": 46057,
389
- "cache_weighted_input_25": 59881,
390
- "prompt_growth": 35735,
391
- "antipatterns": 1,
392
- "issues": 9,
393
- "issue_types": [
394
- "cache",
395
- "cache_break",
396
- "broad_tool_result",
397
- "service_tier",
398
- "tool_churn_cluster"
399
- ],
400
- "read_fragmentation_paths": [],
401
- "grep_sweep_count": 0
402
- },
403
- {
404
- "session": "sess_51160_1783059076138_1783059076364_ce7ebef63b9773c3457e0a8dbeed9dd7",
405
- "provider": "openai-oauth",
406
- "model": "gpt-5.5",
407
- "wall_ms": 57431,
408
- "turns": 10,
409
- "tool_calls": 13,
410
- "tools_per_turn": 1.3,
411
- "total_tool_ms": 2552,
412
- "llm_stream_ms": 54609,
413
- "cache_ratio": 0.8266361778054949,
414
- "cached_tokens": 119296,
415
- "prompt_tokens": 144315,
416
- "uncached_tokens": 25019,
417
- "output_tokens": 3182,
418
- "cache_weighted_input_10": 36948.6,
419
- "cache_weighted_input_25": 54843,
420
- "prompt_growth": 17865,
421
- "antipatterns": 1,
422
- "issues": 14,
423
- "issue_types": [
424
- "cache",
425
- "cache_break",
426
- "service_tier",
427
- "missed_parallelism",
428
- "tool_churn_cluster"
429
- ],
430
- "read_fragmentation_paths": [],
431
- "grep_sweep_count": 0
432
- },
433
- {
434
- "session": "sess_58804_1783059088033_1783059088258_fecef461f40816f3c4db38876a81fd3b",
435
- "provider": "openai-oauth",
436
- "model": "gpt-5.5",
437
- "wall_ms": 126887,
438
- "turns": 11,
439
- "tool_calls": 17,
440
- "tools_per_turn": 1.5,
441
- "total_tool_ms": 1470,
442
- "llm_stream_ms": 125260,
443
- "cache_ratio": 0.7053957936861514,
444
- "cached_tokens": 273920,
445
- "prompt_tokens": 388321,
446
- "uncached_tokens": 114401,
447
- "output_tokens": 10728,
448
- "cache_weighted_input_10": 141793,
449
- "cache_weighted_input_25": 182881,
450
- "prompt_growth": 74500,
451
- "antipatterns": 1,
452
- "issues": 17,
453
- "issue_types": [
454
- "cache",
455
- "cache_break",
456
- "cache_miss",
457
- "readonly_stall",
458
- "broad_tool_result",
459
- "service_tier",
460
- "tool_churn_cluster"
461
- ],
462
- "read_fragmentation_paths": [],
463
- "grep_sweep_count": 0
464
- }
465
- ]
466
- }