mixdog 0.9.4 → 0.9.6

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 (121) hide show
  1. package/README.md +112 -38
  2. package/package.json +4 -1
  3. package/scripts/bench/r5-orchestrated-task.json +7 -0
  4. package/scripts/bench/round-r13-clientmeta.json +464 -0
  5. package/scripts/bench/round-r14-betafeatures.json +466 -0
  6. package/scripts/bench/round-r15-fulldefault.json +462 -0
  7. package/scripts/bench/round-r16-sessionid.json +466 -0
  8. package/scripts/bench/round-r17-wirebytes.json +456 -0
  9. package/scripts/bench/round-r18-prewarm.json +468 -0
  10. package/scripts/bench/round-r19-clean.json +472 -0
  11. package/scripts/bench/round-r20-prewarm-clean.json +475 -0
  12. package/scripts/bench/round-r21-delta-retry.json +473 -0
  13. package/scripts/bench/round-r22-full-probe.json +693 -0
  14. package/scripts/bench/round-r23-itemprobe.json +701 -0
  15. package/scripts/bench/round-r24-shapefix.json +677 -0
  16. package/scripts/bench/round-r25-serial.json +464 -0
  17. package/scripts/bench/round-r26-parallel3.json +671 -0
  18. package/scripts/bench/round-r27-parallel10.json +894 -0
  19. package/scripts/bench/round-r28-parallel10-stagger.json +882 -0
  20. package/scripts/bench/round-r29-parallel10-stagger166.json +886 -0
  21. package/scripts/bench/round-r30-instid.json +253 -0
  22. package/scripts/bench/round-r31-upgradeprobe.json +256 -0
  23. package/scripts/bench/round-r32-vs-codex-lead.json +254 -0
  24. package/scripts/bench/round-r33-vs-codex-codex.json +115 -0
  25. package/scripts/bench/round-r34-orchestrated.json +120 -0
  26. package/scripts/bench/round-r35-orchestrated-codex.json +61 -0
  27. package/scripts/bench/round-r36-orchestrated-capped.json +128 -0
  28. package/scripts/bench-run.mjs +40 -7
  29. package/scripts/internal-comms-bench.mjs +2 -4
  30. package/scripts/model-catalog-audit.mjs +209 -0
  31. package/scripts/model-list-sanitize-test.mjs +37 -0
  32. package/scripts/recall-bench.mjs +76 -13
  33. package/scripts/recall-quality-cases.json +12 -0
  34. package/scripts/tool-smoke.mjs +2 -2
  35. package/src/agents/heavy-worker/AGENT.md +7 -7
  36. package/src/agents/scheduler-task/AGENT.md +2 -3
  37. package/src/agents/webhook-handler/AGENT.md +2 -3
  38. package/src/agents/worker/AGENT.md +9 -10
  39. package/src/app.mjs +12 -1
  40. package/src/headless-role.mjs +7 -1
  41. package/src/mixdog-session-runtime.mjs +15 -14
  42. package/src/output-styles/default.md +14 -18
  43. package/src/output-styles/minimal.md +4 -5
  44. package/src/output-styles/simple.md +7 -8
  45. package/src/rules/agent/00-common.md +6 -5
  46. package/src/rules/agent/30-explorer.md +16 -5
  47. package/src/rules/lead/01-general.md +5 -5
  48. package/src/rules/lead/lead-brief.md +6 -3
  49. package/src/rules/lead/lead-tool.md +6 -4
  50. package/src/rules/shared/01-tool.md +17 -21
  51. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +8 -3
  52. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +19 -0
  53. package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +11 -3
  54. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +9 -1
  55. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +53 -9
  56. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +23 -10
  57. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +11 -9
  58. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +33 -4
  59. package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +80 -0
  60. package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +93 -0
  61. package/src/runtime/agent/orchestrator/session/loop.mjs +27 -5
  62. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +1 -1
  63. package/src/runtime/agent/orchestrator/stall-policy.mjs +20 -1
  64. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +7 -7
  65. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
  66. package/src/runtime/channels/backends/discord-gateway.mjs +2 -2
  67. package/src/runtime/channels/backends/discord.mjs +15 -26
  68. package/src/runtime/channels/backends/telegram.mjs +8 -12
  69. package/src/runtime/channels/index.mjs +23 -43
  70. package/src/runtime/channels/lib/backend-dispatch.mjs +5 -3
  71. package/src/runtime/channels/lib/config.mjs +37 -149
  72. package/src/runtime/channels/lib/event-pipeline.mjs +4 -4
  73. package/src/runtime/channels/lib/event-queue.mjs +15 -9
  74. package/src/runtime/channels/lib/inbound-routing.mjs +2 -39
  75. package/src/runtime/channels/lib/interaction-workflows.mjs +5 -113
  76. package/src/runtime/channels/lib/scheduler.mjs +27 -113
  77. package/src/runtime/channels/lib/webhook/deliveries.mjs +3 -2
  78. package/src/runtime/channels/lib/webhook.mjs +8 -47
  79. package/src/runtime/memory/index.mjs +9 -0
  80. package/src/runtime/memory/lib/core-memory-store.mjs +5 -1
  81. package/src/runtime/memory/lib/ko-morph.mjs +195 -0
  82. package/src/runtime/memory/lib/memory-recall-store.mjs +47 -10
  83. package/src/runtime/memory/lib/memory-text-utils.mjs +46 -0
  84. package/src/runtime/memory/lib/query-handlers.mjs +27 -5
  85. package/src/runtime/memory/tool-defs.mjs +2 -2
  86. package/src/runtime/shared/config.mjs +14 -4
  87. package/src/runtime/shared/markdown-frontmatter.mjs +19 -0
  88. package/src/runtime/shared/schedules-store.mjs +13 -3
  89. package/src/runtime/shared/tool-execution-contract.mjs +2 -2
  90. package/src/session-runtime/config-helpers.mjs +45 -10
  91. package/src/session-runtime/quick-model-rows.mjs +46 -11
  92. package/src/session-runtime/quick-search-models.mjs +28 -27
  93. package/src/session-runtime/settings-api.mjs +34 -1
  94. package/src/session-runtime/tool-defs.mjs +1 -1
  95. package/src/session-runtime/workflow.mjs +1 -1
  96. package/src/standalone/agent-tool/tool-def.mjs +1 -1
  97. package/src/standalone/agent-tool.mjs +30 -0
  98. package/src/standalone/channel-admin.mjs +102 -90
  99. package/src/standalone/explore-tool.mjs +39 -10
  100. package/src/tui/App.jsx +131 -28
  101. package/src/tui/app/app-format.mjs +11 -4
  102. package/src/tui/app/channel-pickers.mjs +2 -4
  103. package/src/tui/app/maintenance-pickers.mjs +60 -28
  104. package/src/tui/app/model-options.mjs +5 -1
  105. package/src/tui/app/settings-picker.mjs +0 -1
  106. package/src/tui/app/transcript-window.mjs +8 -2
  107. package/src/tui/app/use-transcript-scroll.mjs +3 -1
  108. package/src/tui/app/use-transcript-window.mjs +19 -1
  109. package/src/tui/components/ConfirmBar.jsx +10 -7
  110. package/src/tui/components/Picker.jsx +32 -11
  111. package/src/tui/components/PromptInput.jsx +10 -1
  112. package/src/tui/components/StatusLine.jsx +6 -3
  113. package/src/tui/dist/index.mjs +441 -293
  114. package/src/tui/engine.mjs +48 -12
  115. package/src/tui/index.jsx +11 -52
  116. package/src/ui/statusline.mjs +10 -0
  117. package/src/workflows/default/WORKFLOW.md +15 -17
  118. package/src/workflows/sequential/WORKFLOW.md +15 -17
  119. package/vendor/ink/build/ink.js +9 -1
  120. package/scripts/recall-usecase-probe.json +0 -6
  121. package/src/runtime/channels/lib/holidays.mjs +0 -138
@@ -0,0 +1,464 @@
1
+ {
2
+ "round": "25",
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_53408_1783063642444_1783063642668_3cfee1069f85e2bb12e8d28e8818547c",
18
+ "sess_6356_1783063737425_1783063737661_1619e4bb11b96b6c6f8a2015039eca61",
19
+ "sess_54836_1783063801897_1783063802131_358c27f874c909a61e1055fa674cc778",
20
+ "sess_37028_1783063871406_1783063871636_34284b6e9fe43e25a279de7888dc1dc1",
21
+ "sess_35624_1783063944146_1783063944381_cbf25d084f0f52db125bb2a739ccdc6d",
22
+ "sess_47024_1783064101403_1783064101639_70166643f319fb0dc14080ac610d3d19"
23
+ ],
24
+ "results": [
25
+ {
26
+ "id": "r4-debug-forwarding-gap#1",
27
+ "agent": "reviewer",
28
+ "ok": true,
29
+ "ms": 94983,
30
+ "sessionId": "sess_53408_1783063642444_1783063642668_3cfee1069f85e2bb12e8d28e8818547c",
31
+ "output": "sessionId: sess_53408_1783063642444_1783063642668_3cfee1069f85e2bb12e8d28e8818547c\n조사 완료했습니다, 재영님. 활성화 후 첫 전달 경로는 `writeBridgeState(true)` → ownership claim/refresh → `bindPersistedTranscriptIfAny()` → `applyTranscriptBinding()` → `OutputForwarder.startWatch()` → `forwardNewText()` → queue drain/send 입니다.\n\n- **높음: 이미 생성된 transcript를 처음 바인딩하면 기존 출력이 EOF 처리됩니다.** `catchUpFromPersisted`가 같은 persisted path를 못 찾으면 `currentSize`에서 시작하므로, 바인딩 전에 기록된 assistant 출력은 backlog catch-up으로 복구되지 않습니다. `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가 아직 없으면 `fs.watch` 설치가 실패하지만 re-arm poll이 복구합니다.** missing file bind는 `startWatch()`가 catch/close되고, `schedulePendingTranscriptRearm()`이 생성 감지 후 `startWatch()`와 `forwardNewText()`를 호출해 backlog를 보냅니다. 단 60초 timeout 이후에는 다음 rebind 없이는 복구되지 않습니다. `src/runtime/channels/index.mjs:339`, `src/runtime/channels/index.mjs:376`, `src/runtime/channels/index.mjs:378`, `src/runtime/channels/index.mjs:384`\n\n- **중간: ownership/connect 전에는 forward가 fail-closed로 지연됩니다.** `_isOwner()`가 false면 `forwardNewText()`는 읽기 전 반환하므로 cursor는 안 밀리고, connect 후 `forwardNewText()` 또는 re-arm 재등록으로 transcript backlog는 복구됩니다. `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:803`\n\n- **낮음: watch 설치 직전/직후 기록은 지연만 됩니다.** `startWatch()`가 설치 직후 `scheduleWatchFlush()`를 호출하고, flush가 `forwardNewText()`로 읽어 보내므로 newline이 완성된 backlog는 복구됩니다. `src/runtime/channels/lib/output-forwarder.mjs:657`, `src/runtime/channels/lib/output-forwarder.mjs:665`, `src/runtime/channels/lib/output-forwarder.mjs:724`\n\n판정: 가장 큰 실제 손실 위험은 “처음 바인딩 시 이미 존재하는 transcript를 EOF로 잡는 경우”이며, missing-file/watch/ownership 창은 대부분 지연 후 catch-up됩니다.",
32
+ "card": {
33
+ "session": "sess_53408_1783063642444_1783063642668_3cfee1069f85e2bb12e8d28e8818547c",
34
+ "provider": "openai-oauth",
35
+ "model": "gpt-5.5",
36
+ "wall_ms": 84498,
37
+ "turns": 8,
38
+ "tool_calls": 9,
39
+ "tools_per_turn": 1.1,
40
+ "total_tool_ms": 780,
41
+ "llm_stream_ms": 83431,
42
+ "cache_ratio": 0.8006575913711181,
43
+ "cached_tokens": 199680,
44
+ "prompt_tokens": 249395,
45
+ "uncached_tokens": 49715,
46
+ "output_tokens": 7234,
47
+ "cache_weighted_input_10": 69683,
48
+ "cache_weighted_input_25": 99635,
49
+ "prompt_growth": 38233,
50
+ "antipatterns": 1,
51
+ "issues": 13,
52
+ "issue_types": [
53
+ "cache",
54
+ "cache_break",
55
+ "broad_tool_result",
56
+ "service_tier",
57
+ "missed_parallelism",
58
+ "tool_churn_cluster"
59
+ ],
60
+ "read_fragmentation_paths": [],
61
+ "grep_sweep_count": 0
62
+ }
63
+ },
64
+ {
65
+ "id": "r4-impl-usage-summary#1",
66
+ "agent": "worker",
67
+ "ok": true,
68
+ "ms": 64470,
69
+ "sessionId": "sess_6356_1783063737425_1783063737661_1619e4bb11b96b6c6f8a2015039eca61",
70
+ "output": "sessionId: sess_6356_1783063737425_1783063737661_1619e4bb11b96b6c6f8a2015039eca61\n요청 범위가 작고 실행 승인까지 포함된 것으로 보고 바로 반영하겠습니다.이미 관련 파일이 있어 요구사항과 맞는지 확인한 뒤 필요한 부분만 정리하겠습니다.구현 상태가 이미 작업 트리에 반영되어 있어 검증만 진행합니다.재영님, `usage:today` 기능이 작업 트리에 반영되어 있고 검증까지 완료했습니다.\n\n- **Diff 요약**: `package.json`에 `usage:today` npm script 추가, `scripts/usage-today.mjs` 신규 추가.\n- **동작**: `MIXDOG_DATA_DIR`를 존중해 `history/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`는 건드리지 않았습니다.",
71
+ "card": {
72
+ "session": "sess_6356_1783063737425_1783063737661_1619e4bb11b96b6c6f8a2015039eca61",
73
+ "provider": "openai-oauth",
74
+ "model": "gpt-5.5",
75
+ "wall_ms": 53970,
76
+ "turns": 7,
77
+ "tool_calls": 12,
78
+ "tools_per_turn": 1.7,
79
+ "total_tool_ms": 2323,
80
+ "llm_stream_ms": 51748,
81
+ "cache_ratio": 0.7647431722461031,
82
+ "cached_tokens": 88064,
83
+ "prompt_tokens": 115155,
84
+ "uncached_tokens": 27091,
85
+ "output_tokens": 4646,
86
+ "cache_weighted_input_10": 35897.4,
87
+ "cache_weighted_input_25": 49107,
88
+ "prompt_growth": 12328,
89
+ "antipatterns": 0,
90
+ "issues": 9,
91
+ "issue_types": [
92
+ "cache",
93
+ "cache_break",
94
+ "service_tier"
95
+ ],
96
+ "read_fragmentation_paths": [],
97
+ "grep_sweep_count": 0
98
+ }
99
+ },
100
+ {
101
+ "id": "r4-explain-compact-engine#1",
102
+ "agent": "explore",
103
+ "ok": true,
104
+ "ms": 69508,
105
+ "sessionId": "sess_54836_1783063801897_1783063802131_358c27f874c909a61e1055fa674cc778",
106
+ "output": "sessionId: sess_54836_1783063801897_1783063802131_358c27f874c909a61e1055fa674cc778\n완료했습니다. `src/runtime/agent/orchestrator/session/compact/engine.mjs` 기준 compaction 구조 요약입니다.\n\n- **Public entry**: `compact.mjs` re-export가 기존 import surface를 유지하며 `semanticCompactMessages`/`recallFastTrackCompactMessages`를 노출한다 (`src/runtime/agent/orchestrator/session/compact.mjs:2`, `src/runtime/agent/orchestrator/session/compact.mjs:52`).\n- **Main callers**: pre-send auto loop가 recall-fasttrack 또는 semantic을 호출한다 (`src/runtime/agent/orchestrator/session/loop.mjs:414`, `src/runtime/agent/orchestrator/session/loop.mjs:441`).\n- **Manual/session callers**: `runSessionCompaction`이 manual/clear/auto-clear 경로에서 type별 engine을 호출한다 (`src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:143`, `src/runtime/agent/orchestrator/session/manager.mjs:1849`, `src/runtime/agent/orchestrator/session/manager.mjs:1950`).\n- **Trigger policy**: auto policy는 boundary/context/autoLimit에서 boundary를 정하고 buffer를 뺀 `triggerTokens`를 만든다 (`src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:94`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:117`).\n- **When it fires**: pre-send에서 `messageTokens + reserveTokens >= triggerTokens`이거나 reactive overflow retry면 compaction이 실행된다 (`src/runtime/agent/orchestrator/session/loop.mjs:351`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170`).\n- **Type choice**: agent-owned sessions are forced semantic; otherwise env/config selects semantic vs recall-fasttrack (`src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:39`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:45`).\n- **No-op path**: both semantic and recall-fasttrack return sanitized original messages when already within effective budget and not forced (`src/runtime/agent/orchestrator/session/compact/engine.mjs:283`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:627`).\n- **Pre-window cleanup**: engine first sanitizes tool pairs, dedups tool results, reconciles stubs, and splits protected prefix from live conversation (`src/runtime/agent/orchestrator/session/compact/engine.mjs:100`, `src/runtime/agent/orchestrator/session/compact/messages.mjs:56`).\n- **Redaction hook**: if compaction proceeds, tool-call argument secrets are redacted before window selection, so preserved system/tail are measured and emitted redacted (`src/runtime/agent/orchestrator/session/compact/engine.mjs:306`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:312`).\n- **Redaction behavior**: redaction only touches assistant `toolCalls` argument values, preserving shape/order/pairing; sensitive keys and raw `key:value` secrets become `[redacted]` (`src/runtime/agent/orchestrator/session/compact/text-utils.mjs:217`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:323`).\n- **Semantic tail choice**: with user turns, keep newest `tailTurns` turns within `preserveRecentBudget`, splitting newest turn suffix if needed (`src/runtime/agent/orchestrator/session/compact/engine.mjs:134`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:151`).\n- **No-user semantic tail**: without user turns, choose newest valid non-tool cut that fits; never start tail on a `tool` message (`src/runtime/agent/orchestrator/session/compact/engine.mjs:121`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:193`).\n- **Semantic window**: `selectCompactionWindow` returns protected system, compactable head, preserved tail, previous summary, and preserved facts (`src/runtime/agent/orchestrator/session/compact/engine.mjs:235`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:258`).\n- **Semantic execution**: head + previous summary are fit into a compaction prompt, provider is called with compact send options, response schema is repaired, then summary replaces head (`src/runtime/agent/orchestrator/session/compact/engine.mjs:333`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:367`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:376`).\n- **Mandatory budget fallback**: if system+tail plus minimum summary room exceeds target, working budget is raised instead of refusing compaction (`src/runtime/agent/orchestrator/session/compact/engine.mjs:319`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:328`).\n- **Recall pipeline caller**: recall-fasttrack hydrates/dumps memory roots, drains raw pending cycle1 rows, caps recall injection to 5% context floor, then calls engine (`src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:148`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:157`, `src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs:161`).\n- **Recall tail choice**: preserve newest two user-anchored turns by default, drop oldest turns to fit cap, then truncate oldest surviving content if still oversized (`src/runtime/agent/orchestrator/session/compact/engine.mjs:467`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:601`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:609`).\n- **Recall no-user tail**: no-user recent assistant/tool structure is valid and preserved; `sanitizeToolPairs` repairs tool-call/tool-result structure after trimming (`src/runtime/agent/orchestrator/session/compact/engine.mjs:613`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:617`).\n- **Recall summary**: recall text plus prior summary are fit into one synthetic summary message, then emitted as system + summary + preserved tail (`src/runtime/agent/orchestrator/session/compact/engine.mjs:652`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:684`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:695`).\n- **Hard engine failures**: semantic throws on missing provider, empty live window, no compactable head without prior summary, prompt/summary fit failure, empty provider summary, or final over-budget result (`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:395`).\n- **Recall hard failures**: recall-fasttrack throws on no compactable prior context without recall/prior, empty recall when not allowed, summary fit failure, or final over-budget result (`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:698`).\n- **Loop fallback**: semantic auto failure can recover via `pruneToolOutputsUnanchored`; recall-fasttrack failures deliberately skip this prune fallback (`src/runtime/agent/orchestrator/session/loop.mjs:501`, `src/runtime/agent/orchestrator/session/loop.mjs:517`).\n- **Session fallback**: manual/session recall-fasttrack failure tries semantic once if enabled/provider exists; semantic/manual failure then may use unanchored prune (`src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:237`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:327`).\n- **Failure persistence**: unrecovered failures record `lastStage`/errors and return unchanged messages; ask failure can persist sanitized compacted outgoing best-effort (`src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:348`, `src/runtime/agent/orchestrator/session/manager.mjs:1098`, `src/runtime/agent/orchestrator/session/manager.mjs:1134`).",
107
+ "card": {
108
+ "session": "sess_54836_1783063801897_1783063802131_358c27f874c909a61e1055fa674cc778",
109
+ "provider": "openai-oauth",
110
+ "model": "gpt-5.5",
111
+ "wall_ms": 59002,
112
+ "turns": 7,
113
+ "tool_calls": 7,
114
+ "tools_per_turn": 1,
115
+ "total_tool_ms": 931,
116
+ "llm_stream_ms": 57686,
117
+ "cache_ratio": 0.6654929577464789,
118
+ "cached_tokens": 96768,
119
+ "prompt_tokens": 145408,
120
+ "uncached_tokens": 48640,
121
+ "output_tokens": 4198,
122
+ "cache_weighted_input_10": 58316.8,
123
+ "cache_weighted_input_25": 72832,
124
+ "prompt_growth": 36676,
125
+ "antipatterns": 1,
126
+ "issues": 13,
127
+ "issue_types": [
128
+ "cache",
129
+ "cache_break",
130
+ "broad_tool_result",
131
+ "service_tier",
132
+ "missed_parallelism",
133
+ "tool_churn_cluster"
134
+ ],
135
+ "read_fragmentation_paths": [],
136
+ "grep_sweep_count": 0
137
+ }
138
+ },
139
+ {
140
+ "id": "r4-debug-forwarding-gap#2",
141
+ "agent": "reviewer",
142
+ "ok": true,
143
+ "ms": 72748,
144
+ "sessionId": "sess_37028_1783063871406_1783063871636_34284b6e9fe43e25a279de7888dc1dc1",
145
+ "output": "sessionId: sess_37028_1783063871406_1783063871636_34284b6e9fe43e25a279de7888dc1dc1\n재영님, 조사 완료했습니다. activation→첫 전송 경로에는 복구되는 지연 구간과 복구 안 되는 skip 구간이 섞여 있습니다.\n\n- **최대 영향: 기존 transcript를 EOF로 바인딩** — `setContext()`는 `catchUpFromPersisted`라도 persisted path가 다르면 현재 크기부터 읽어 이미 쓴 assistant 출력은 영구 skip됩니다; backlog catch-up **불가**. `src/runtime/channels/lib/output-forwarder.mjs:117`\n\n- **pre-connect ownership gate** — `bridge-state.json`은 먼저 쓰지만 `bridgeRuntimeConnected` 전에는 `_isOwner()`가 false라 watch flush/forward가 no-op입니다; post-connect `forwardNewText()` 또는 re-arm으로 backlog catch-up **가능**. `src/runtime/channels/index.mjs:1735`, `src/runtime/channels/index.mjs:776`, `src/runtime/channels/lib/output-forwarder.mjs:351`\n\n- **없는 transcript에 대한 fs.watch 실패** — `startWatch()`는 없는 파일에서 catch 후 닫히며, `schedulePendingTranscriptRearm()`이 250ms poll로 파일 생성 후 `forwardNewText()`를 호출합니다; 60초 안이면 backlog catch-up **가능**, timeout 뒤에는 다음 rebind 없이는 **불가**. `src/runtime/channels/index.mjs:357`, `src/runtime/channels/lib/output-forwarder.mjs:656`\n\n- **pre-connect re-arm 조기 종료** — re-arm tick이 `!bridgeRuntimeConnected`면 중단되지만 start path가 연결 후 다시 arm합니다; backlog catch-up **가능하지만 연결 완료까지 지연**됩니다. `src/runtime/channels/index.mjs:372`, `src/runtime/channels/index.mjs:803`\n\n- **첫 inbound의 stale binding 방어** — parent-chain transcript 발견이 늦으면 500ms steal poll 뒤 pending rebind/re-arm으로 전환합니다; 성공 시 backlog catch-up **가능**, poll 실패 후 기존 transcript를 EOF 바인딩하면 해당 window 출력은 **불가**입니다. `src/runtime/channels/index.mjs:1526`, `src/runtime/channels/index.mjs:1571`\n\nVerdict: 가장 위험한 실제 손실은 “현재 transcript를 기존 파일로 늦게 발견했지만 persisted path가 달라 EOF에서 시작하는” 경로이고, not-yet-created/watch/ownership window 자체는 대부분 catch-up으로 지연 복구됩니다.",
146
+ "card": {
147
+ "session": "sess_37028_1783063871406_1783063871636_34284b6e9fe43e25a279de7888dc1dc1",
148
+ "provider": "openai-oauth",
149
+ "model": "gpt-5.5",
150
+ "wall_ms": 62249,
151
+ "turns": 6,
152
+ "tool_calls": 7,
153
+ "tools_per_turn": 1.2,
154
+ "total_tool_ms": 686,
155
+ "llm_stream_ms": 61369,
156
+ "cache_ratio": 0.704984040222811,
157
+ "cached_tokens": 101376,
158
+ "prompt_tokens": 143799,
159
+ "uncached_tokens": 42423,
160
+ "output_tokens": 5270,
161
+ "cache_weighted_input_10": 52560.6,
162
+ "cache_weighted_input_25": 67767,
163
+ "prompt_growth": 29079,
164
+ "antipatterns": 1,
165
+ "issues": 9,
166
+ "issue_types": [
167
+ "cache",
168
+ "cache_break",
169
+ "service_tier",
170
+ "tool_churn_cluster"
171
+ ],
172
+ "read_fragmentation_paths": [],
173
+ "grep_sweep_count": 0
174
+ }
175
+ },
176
+ {
177
+ "id": "r4-impl-usage-summary#2",
178
+ "agent": "worker",
179
+ "ok": true,
180
+ "ms": 157204,
181
+ "sessionId": "sess_35624_1783063944146_1783063944381_cbf25d084f0f52db125bb2a739ccdc6d",
182
+ "output": "sessionId: sess_35624_1783063944146_1783063944381_cbf25d084f0f52db125bb2a739ccdc6d\n요청 범위가 명확해 바로 구현하고 검증까지 진행하겠습니다.구현은 반영했고, 문법 검사와 실제 실행으로 확인하겠습니다.검증은 통과했고, 변경 요약을 위해 diff를 확인하겠습니다.재영님, 완료했습니다.\n\n- **Diff 요약**: `package.json`에 `usage:today` 추가, `scripts/usage-today.mjs` 신규 작성.\n- **동작**: `MIXDOG_DATA_DIR`를 반영해 `history/agent-trace.jsonl`을 읽고, 오늘 0시 이후 `usage` 행을 모델별/총합으로 출력합니다.\n- **검증**: `node --check scripts/usage-today.mjs` 통과, `npm run usage:today` 실행 완료.\n- **참고**: 기존 변경 파일 `src/runtime/channels/lib/*`는 건드리지 않았습니다.",
183
+ "card": {
184
+ "session": "sess_35624_1783063944146_1783063944381_cbf25d084f0f52db125bb2a739ccdc6d",
185
+ "provider": "openai-oauth",
186
+ "model": "gpt-5.5",
187
+ "wall_ms": 146718,
188
+ "turns": 22,
189
+ "tool_calls": 25,
190
+ "tools_per_turn": 1.1,
191
+ "total_tool_ms": 4794,
192
+ "llm_stream_ms": 141892,
193
+ "cache_ratio": 0.919211593309697,
194
+ "cached_tokens": 548864,
195
+ "prompt_tokens": 597103,
196
+ "uncached_tokens": 48239,
197
+ "output_tokens": 13661,
198
+ "cache_weighted_input_10": 103125.4,
199
+ "cache_weighted_input_25": 185455,
200
+ "prompt_growth": 30611,
201
+ "antipatterns": 5,
202
+ "issues": 18,
203
+ "issue_types": [
204
+ "cache",
205
+ "cache_break",
206
+ "readonly_stall",
207
+ "tool_error",
208
+ "service_tier",
209
+ "duplicate_tool",
210
+ "missed_parallelism",
211
+ "tool_churn_cluster"
212
+ ],
213
+ "read_fragmentation_paths": [],
214
+ "grep_sweep_count": 0
215
+ }
216
+ },
217
+ {
218
+ "id": "r4-explain-compact-engine#2",
219
+ "agent": "explore",
220
+ "ok": true,
221
+ "ms": 90079,
222
+ "sessionId": "sess_47024_1783064101403_1783064101639_70166643f319fb0dc14080ac610d3d19",
223
+ "output": "sessionId: sess_47024_1783064101403_1783064101639_70166643f319fb0dc14080ac610d3d19\nArchitecture brief completed.\n\n- **Entry points**: `semanticCompactMessages` and `recallFastTrackCompactMessages` are exported from `engine.mjs`, then re-exported by `compact.mjs` as the public surface. `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- **Runtime callers**: the loop calls recall-fasttrack via `runRecallFastTrackCompact` or semantic directly; the manager calls recall-fasttrack, falls back to semantic, or runs semantic directly. `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:245`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:288`\n\n- **Fire decision**: auto policy resolves boundary, trigger, buffer, reserve, type, tail and keep budgets; compaction fires when reactive retry is pending, token estimate is unavailable, or transcript+reserve pressure reaches 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:123`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170`\n\n- **Loop path**: pre-send estimates message tokens, computes `shouldCompact`, selects target budget, optionally prunes tool outputs, then runs recall-fasttrack if configured, else semantic. `src/runtime/agent/orchestrator/session/loop.mjs:351`, `src/runtime/agent/orchestrator/session/loop.mjs:353`, `src/runtime/agent/orchestrator/session/loop.mjs:362`, `src/runtime/agent/orchestrator/session/loop.mjs:407`, `src/runtime/agent/orchestrator/session/loop.mjs:414`, `src/runtime/agent/orchestrator/session/loop.mjs:439`\n\n- **Manual/manager path**: manual is forced, auto skips below threshold, missing boundary blocks forced compaction, and budget is computed before dispatch. `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:143`, `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**: engine sanitizes/dedups, separates protected prefix from live conversation, extracts previous summary, then chooses head/tail before prompting. `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:235`\n\n- **Semantic tail choice**: with user turns, it keeps up to configured recent turns within `preserveRecentBudget`; without user turns, it cuts only at non-tool boundaries so tool results do not start the preserved tail. `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:193`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:240`\n\n- **Recall tail choice**: recall-fasttrack keeps the newest structured turns, drops oldest kept turns until under cap, truncates the surviving turn if needed, and allows no-user assistant/tool tails. `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:602`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:610`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:613`\n\n- **Redaction hook**: no-op compaction returns sanitized messages unchanged, but real semantic and recall compaction redact tool-call secret argument 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:644`\n\n- **Redaction scope**: redaction only touches assistant `toolCalls` argument values, preserving role/content/ids/order/pairing and leaving non-tool-bearing messages as the same reference. `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:291`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:294`, `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:319`\n\n- **Semantic failure guards**: it throws for missing provider, empty live window, no compactable history without prior summary, 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: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 failure guards**: it throws when there is no compactable prior history and no recall/prior/empty allowance, when recall text is empty, when the recall summary cannot fit, or when final output 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- **Fallback paths**: manager recall-fasttrack failure can degrade to semantic; non-recall failures in loop/manager can recover with unanchored tool-output prune; unrecovered loop failure records telemetry and throws context overflow. `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/loop.mjs:501`, `src/runtime/agent/orchestrator/session/loop.mjs:527`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:322`, `src/runtime/agent/orchestrator/session/loop.mjs:552`, `src/runtime/agent/orchestrator/session/loop.mjs:618`",
224
+ "card": {
225
+ "session": "sess_47024_1783064101403_1783064101639_70166643f319fb0dc14080ac610d3d19",
226
+ "provider": "openai-oauth",
227
+ "model": "gpt-5.5",
228
+ "wall_ms": 79532,
229
+ "turns": 7,
230
+ "tool_calls": 8,
231
+ "tools_per_turn": 1.1,
232
+ "total_tool_ms": 532,
233
+ "llm_stream_ms": 78523,
234
+ "cache_ratio": 0.685222081345972,
235
+ "cached_tokens": 136192,
236
+ "prompt_tokens": 198756,
237
+ "uncached_tokens": 62564,
238
+ "output_tokens": 4446,
239
+ "cache_weighted_input_10": 76183.2,
240
+ "cache_weighted_input_25": 96612,
241
+ "prompt_growth": 48415,
242
+ "antipatterns": 1,
243
+ "issues": 11,
244
+ "issue_types": [
245
+ "cache",
246
+ "cache_break",
247
+ "broad_tool_result",
248
+ "service_tier",
249
+ "tool_churn_cluster"
250
+ ],
251
+ "read_fragmentation_paths": [],
252
+ "grep_sweep_count": 0
253
+ }
254
+ }
255
+ ],
256
+ "task_complete": true,
257
+ "task_errors": [],
258
+ "score_complete": true,
259
+ "score_errors": [],
260
+ "group": {
261
+ "n": 6,
262
+ "wall_ms": 80994.8,
263
+ "turns": 9.5,
264
+ "tool_calls": 11.3,
265
+ "tools_per_turn": 1.2,
266
+ "total_tool_ms": 1674.3,
267
+ "llm_stream_ms": 79108.2,
268
+ "cache_ratio": 0.8,
269
+ "cached_tokens": 195157.3,
270
+ "prompt_tokens": 241602.7,
271
+ "uncached_tokens": 46445.3,
272
+ "output_tokens": 6575.8,
273
+ "cache_weighted_input_10": 65961.1,
274
+ "cache_weighted_input_25": 95234.7,
275
+ "prompt_growth": 32557,
276
+ "antipatterns": 1.5,
277
+ "issues": 12.2,
278
+ "grep_sweep_count": 0
279
+ },
280
+ "cards": [
281
+ {
282
+ "session": "sess_53408_1783063642444_1783063642668_3cfee1069f85e2bb12e8d28e8818547c",
283
+ "provider": "openai-oauth",
284
+ "model": "gpt-5.5",
285
+ "wall_ms": 84498,
286
+ "turns": 8,
287
+ "tool_calls": 9,
288
+ "tools_per_turn": 1.1,
289
+ "total_tool_ms": 780,
290
+ "llm_stream_ms": 83431,
291
+ "cache_ratio": 0.8006575913711181,
292
+ "cached_tokens": 199680,
293
+ "prompt_tokens": 249395,
294
+ "uncached_tokens": 49715,
295
+ "output_tokens": 7234,
296
+ "cache_weighted_input_10": 69683,
297
+ "cache_weighted_input_25": 99635,
298
+ "prompt_growth": 38233,
299
+ "antipatterns": 1,
300
+ "issues": 13,
301
+ "issue_types": [
302
+ "cache",
303
+ "cache_break",
304
+ "broad_tool_result",
305
+ "service_tier",
306
+ "missed_parallelism",
307
+ "tool_churn_cluster"
308
+ ],
309
+ "read_fragmentation_paths": [],
310
+ "grep_sweep_count": 0
311
+ },
312
+ {
313
+ "session": "sess_6356_1783063737425_1783063737661_1619e4bb11b96b6c6f8a2015039eca61",
314
+ "provider": "openai-oauth",
315
+ "model": "gpt-5.5",
316
+ "wall_ms": 53970,
317
+ "turns": 7,
318
+ "tool_calls": 12,
319
+ "tools_per_turn": 1.7,
320
+ "total_tool_ms": 2323,
321
+ "llm_stream_ms": 51748,
322
+ "cache_ratio": 0.7647431722461031,
323
+ "cached_tokens": 88064,
324
+ "prompt_tokens": 115155,
325
+ "uncached_tokens": 27091,
326
+ "output_tokens": 4646,
327
+ "cache_weighted_input_10": 35897.4,
328
+ "cache_weighted_input_25": 49107,
329
+ "prompt_growth": 12328,
330
+ "antipatterns": 0,
331
+ "issues": 9,
332
+ "issue_types": [
333
+ "cache",
334
+ "cache_break",
335
+ "service_tier"
336
+ ],
337
+ "read_fragmentation_paths": [],
338
+ "grep_sweep_count": 0
339
+ },
340
+ {
341
+ "session": "sess_54836_1783063801897_1783063802131_358c27f874c909a61e1055fa674cc778",
342
+ "provider": "openai-oauth",
343
+ "model": "gpt-5.5",
344
+ "wall_ms": 59002,
345
+ "turns": 7,
346
+ "tool_calls": 7,
347
+ "tools_per_turn": 1,
348
+ "total_tool_ms": 931,
349
+ "llm_stream_ms": 57686,
350
+ "cache_ratio": 0.6654929577464789,
351
+ "cached_tokens": 96768,
352
+ "prompt_tokens": 145408,
353
+ "uncached_tokens": 48640,
354
+ "output_tokens": 4198,
355
+ "cache_weighted_input_10": 58316.8,
356
+ "cache_weighted_input_25": 72832,
357
+ "prompt_growth": 36676,
358
+ "antipatterns": 1,
359
+ "issues": 13,
360
+ "issue_types": [
361
+ "cache",
362
+ "cache_break",
363
+ "broad_tool_result",
364
+ "service_tier",
365
+ "missed_parallelism",
366
+ "tool_churn_cluster"
367
+ ],
368
+ "read_fragmentation_paths": [],
369
+ "grep_sweep_count": 0
370
+ },
371
+ {
372
+ "session": "sess_37028_1783063871406_1783063871636_34284b6e9fe43e25a279de7888dc1dc1",
373
+ "provider": "openai-oauth",
374
+ "model": "gpt-5.5",
375
+ "wall_ms": 62249,
376
+ "turns": 6,
377
+ "tool_calls": 7,
378
+ "tools_per_turn": 1.2,
379
+ "total_tool_ms": 686,
380
+ "llm_stream_ms": 61369,
381
+ "cache_ratio": 0.704984040222811,
382
+ "cached_tokens": 101376,
383
+ "prompt_tokens": 143799,
384
+ "uncached_tokens": 42423,
385
+ "output_tokens": 5270,
386
+ "cache_weighted_input_10": 52560.6,
387
+ "cache_weighted_input_25": 67767,
388
+ "prompt_growth": 29079,
389
+ "antipatterns": 1,
390
+ "issues": 9,
391
+ "issue_types": [
392
+ "cache",
393
+ "cache_break",
394
+ "service_tier",
395
+ "tool_churn_cluster"
396
+ ],
397
+ "read_fragmentation_paths": [],
398
+ "grep_sweep_count": 0
399
+ },
400
+ {
401
+ "session": "sess_35624_1783063944146_1783063944381_cbf25d084f0f52db125bb2a739ccdc6d",
402
+ "provider": "openai-oauth",
403
+ "model": "gpt-5.5",
404
+ "wall_ms": 146718,
405
+ "turns": 22,
406
+ "tool_calls": 25,
407
+ "tools_per_turn": 1.1,
408
+ "total_tool_ms": 4794,
409
+ "llm_stream_ms": 141892,
410
+ "cache_ratio": 0.919211593309697,
411
+ "cached_tokens": 548864,
412
+ "prompt_tokens": 597103,
413
+ "uncached_tokens": 48239,
414
+ "output_tokens": 13661,
415
+ "cache_weighted_input_10": 103125.4,
416
+ "cache_weighted_input_25": 185455,
417
+ "prompt_growth": 30611,
418
+ "antipatterns": 5,
419
+ "issues": 18,
420
+ "issue_types": [
421
+ "cache",
422
+ "cache_break",
423
+ "readonly_stall",
424
+ "tool_error",
425
+ "service_tier",
426
+ "duplicate_tool",
427
+ "missed_parallelism",
428
+ "tool_churn_cluster"
429
+ ],
430
+ "read_fragmentation_paths": [],
431
+ "grep_sweep_count": 0
432
+ },
433
+ {
434
+ "session": "sess_47024_1783064101403_1783064101639_70166643f319fb0dc14080ac610d3d19",
435
+ "provider": "openai-oauth",
436
+ "model": "gpt-5.5",
437
+ "wall_ms": 79532,
438
+ "turns": 7,
439
+ "tool_calls": 8,
440
+ "tools_per_turn": 1.1,
441
+ "total_tool_ms": 532,
442
+ "llm_stream_ms": 78523,
443
+ "cache_ratio": 0.685222081345972,
444
+ "cached_tokens": 136192,
445
+ "prompt_tokens": 198756,
446
+ "uncached_tokens": 62564,
447
+ "output_tokens": 4446,
448
+ "cache_weighted_input_10": 76183.2,
449
+ "cache_weighted_input_25": 96612,
450
+ "prompt_growth": 48415,
451
+ "antipatterns": 1,
452
+ "issues": 11,
453
+ "issue_types": [
454
+ "cache",
455
+ "cache_break",
456
+ "broad_tool_result",
457
+ "service_tier",
458
+ "tool_churn_cluster"
459
+ ],
460
+ "read_fragmentation_paths": [],
461
+ "grep_sweep_count": 0
462
+ }
463
+ ]
464
+ }