mixdog 0.9.18 → 0.9.20
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.
- package/LICENSE +21 -0
- package/README.md +93 -29
- package/package.json +5 -3
- package/scripts/build-runtime-windows.ps1 +242 -242
- package/scripts/build-tui.mjs +6 -0
- package/scripts/hook-bus-test.mjs +8 -0
- package/scripts/log-writer-guard-smoke.mjs +131 -0
- package/scripts/output-style-smoke.mjs +2 -2
- package/scripts/reactive-compact-persist-smoke.mjs +22 -6
- package/scripts/recall-bench-cases.json +10 -0
- package/scripts/recall-bench.mjs +91 -2
- package/scripts/recall-quality-cases.json +1 -2
- package/scripts/recall-usecase-cases.json +1 -1
- package/scripts/session-ingest-compaction-smoke.mjs +241 -0
- package/scripts/smoke-runtime-negative.ps1 +106 -106
- package/scripts/tool-efficiency-diag.mjs +5 -2
- package/scripts/tool-smoke.mjs +251 -72
- package/src/agents/debugger/AGENT.md +3 -3
- package/src/agents/heavy-worker/AGENT.md +7 -10
- package/src/agents/maintainer/AGENT.md +1 -2
- package/src/agents/reviewer/AGENT.md +1 -2
- package/src/agents/worker/AGENT.md +5 -8
- package/src/defaults/agents.json +3 -0
- package/src/help.mjs +2 -5
- package/src/lib/mixdog-debug.cjs +13 -0
- package/src/mixdog-session-runtime.mjs +7 -3311
- package/src/rules/agent/00-core.md +4 -3
- package/src/rules/agent/30-explorer.md +53 -22
- package/src/rules/lead/02-channels.md +3 -3
- package/src/rules/lead/lead-tool.md +3 -2
- package/src/rules/shared/01-tool.md +24 -29
- package/src/runtime/agent/orchestrator/context/collect.mjs +33 -9
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +24 -3
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +663 -0
- package/src/runtime/agent/orchestrator/session/compact/engine.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +153 -0
- package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +49 -0
- package/src/runtime/agent/orchestrator/session/loop/steering-ladder.mjs +250 -35
- package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/loop.mjs +8 -1860
- package/src/runtime/agent/orchestrator/session/manager/agent-runtime-singleton.mjs +29 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +686 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +60 -12
- package/src/runtime/agent/orchestrator/session/manager/env-utils.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +159 -0
- package/src/runtime/agent/orchestrator/session/manager/message-sanitize.mjs +143 -0
- package/src/runtime/agent/orchestrator/session/manager/prefetch-bridge.mjs +268 -0
- package/src/runtime/agent/orchestrator/session/manager/provider-cache-key.mjs +22 -0
- package/src/runtime/agent/orchestrator/session/manager/runtime-loaders.mjs +26 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +124 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +258 -0
- package/src/runtime/agent/orchestrator/session/manager/session-errors.mjs +20 -0
- package/src/runtime/agent/orchestrator/session/manager/session-id.mjs +9 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +475 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +6 -4
- package/src/runtime/agent/orchestrator/session/manager.mjs +88 -2285
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +440 -0
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +153 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/tool-batch.mjs +642 -0
- package/src/runtime/agent/orchestrator/tools/bash-session.mjs +23 -3
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +198 -6
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +10 -2
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +13 -15
- package/src/runtime/agent/orchestrator/tools/builtin/read-batch.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +45 -3
- package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +5 -2
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +195 -3
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +108 -2
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +15 -3
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +7 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +24 -2
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +17 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +38 -0
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +72 -8
- package/src/runtime/agent/orchestrator/tools/shell-policy-danger-target.mjs +5 -1
- package/src/runtime/agent/orchestrator/tools/shell-state.mjs +1 -1
- package/src/runtime/channels/backends/discord-gateway.mjs +14 -1
- package/src/runtime/channels/backends/discord.mjs +43 -1
- package/src/runtime/channels/index.mjs +6 -2096
- package/src/runtime/channels/lib/inbound-handler.mjs +328 -0
- package/src/runtime/channels/lib/inbound-routing.mjs +19 -12
- package/src/runtime/channels/lib/interaction-handlers.mjs +260 -0
- package/src/runtime/channels/lib/memory-client.mjs +32 -14
- package/src/runtime/channels/lib/network-retry.mjs +23 -0
- package/src/runtime/channels/lib/output-forwarder.mjs +38 -7
- package/src/runtime/channels/lib/owned-runtime.mjs +547 -0
- package/src/runtime/channels/lib/owner-heartbeat.mjs +13 -4
- package/src/runtime/channels/lib/runtime-paths.mjs +35 -1
- package/src/runtime/channels/lib/tool-dispatch.mjs +17 -7
- package/src/runtime/channels/lib/transcript-binding.mjs +336 -0
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +39 -2
- package/src/runtime/channels/lib/worker-bootstrap.mjs +97 -0
- package/src/runtime/channels/lib/worker-ipc.mjs +201 -0
- package/src/runtime/channels/lib/worker-main.mjs +771 -0
- package/src/runtime/memory/index.mjs +73 -1725
- package/src/runtime/memory/lib/embedding-provider.mjs +4 -2
- package/src/runtime/memory/lib/embedding-worker.mjs +47 -6
- package/src/runtime/memory/lib/http-router.mjs +772 -0
- package/src/runtime/memory/lib/memory-action-handlers.mjs +901 -0
- package/src/runtime/memory/lib/memory-embed.mjs +28 -7
- package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +8 -2
- package/src/runtime/memory/lib/memory-recall-store.mjs +182 -9
- package/src/runtime/memory/lib/query-handlers.mjs +38 -6
- package/src/runtime/memory/lib/recall-format.mjs +106 -6
- package/src/runtime/memory/lib/session-ingest-runtime.mjs +401 -0
- package/src/runtime/memory/lib/session-ingest.mjs +1 -1
- package/src/runtime/shared/atomic-file.mjs +10 -4
- package/src/runtime/shared/background-tasks.mjs +4 -2
- package/src/runtime/shared/tool-execution-contract.mjs +1 -1
- package/src/runtime/shared/tool-result-summary.mjs +1 -1
- package/src/runtime/shared/tool-surface.mjs +30 -1
- package/src/session-runtime/boot-profile.mjs +36 -0
- package/src/session-runtime/channel-config-api.mjs +70 -0
- package/src/session-runtime/config-lifecycle.mjs +1 -1
- package/src/session-runtime/context-status.mjs +181 -0
- package/src/session-runtime/cwd-plugins.mjs +46 -3
- package/src/session-runtime/env.mjs +17 -0
- package/src/session-runtime/lifecycle-api.mjs +242 -0
- package/src/session-runtime/mcp-glue.mjs +24 -3
- package/src/session-runtime/model-route-api.mjs +198 -0
- package/src/session-runtime/output-styles.mjs +44 -10
- package/src/session-runtime/provider-auth-api.mjs +135 -0
- package/src/session-runtime/resource-api.mjs +282 -0
- package/src/session-runtime/runtime-core.mjs +2046 -0
- package/src/session-runtime/session-turn-api.mjs +274 -0
- package/src/session-runtime/tool-catalog.mjs +18 -264
- package/src/session-runtime/tool-defs.mjs +2 -2
- package/src/session-runtime/workflow-agents-api.mjs +238 -0
- package/src/session-runtime/workflow.mjs +16 -1
- package/src/standalone/agent-tool.mjs +2 -2
- package/src/standalone/channel-worker.mjs +78 -5
- package/src/standalone/explore-tool.mjs +1 -1
- package/src/standalone/memory-runtime-proxy.mjs +56 -6
- package/src/tui/App.jsx +88 -97
- package/src/tui/app/channel-pickers.mjs +45 -0
- package/src/tui/app/core-memory-picker.mjs +1 -1
- package/src/tui/app/slash-commands.mjs +0 -1
- package/src/tui/app/slash-dispatch.mjs +0 -16
- package/src/tui/app/transcript-window.mjs +44 -1
- package/src/tui/app/use-mouse-input.mjs +15 -2
- package/src/tui/app/use-prompt-handlers.mjs +7 -94
- package/src/tui/app/use-transcript-scroll.mjs +82 -4
- package/src/tui/app/use-transcript-window.mjs +65 -5
- package/src/tui/components/PromptInput.jsx +33 -64
- package/src/tui/components/ToolExecution.jsx +2 -2
- package/src/tui/dist/index.mjs +7908 -7558
- package/src/tui/engine/context-state.mjs +145 -0
- package/src/tui/engine/prompt-history.mjs +27 -0
- package/src/tui/engine/session-api-ext.mjs +478 -0
- package/src/tui/engine/session-api.mjs +545 -0
- package/src/tui/engine/session-flow.mjs +485 -0
- package/src/tui/engine/turn.mjs +1078 -0
- package/src/tui/engine.mjs +69 -2582
- package/src/tui/index.jsx +7 -0
- package/src/tui/lib/voice-setup.mjs +166 -0
- package/src/tui/paste-attachments.mjs +12 -5
- package/src/tui/prompt-history-store.mjs +125 -12
- package/vendor/ink/build/ink.js +16 -1
- package/vendor/ink/build/output.js +30 -4
- package/vendor/ink/build/render.js +5 -0
- package/scripts/bench/cache-probe-tasks.json +0 -8
- package/scripts/bench/lead-review-tasks-r3.json +0 -20
- package/scripts/bench/lead-review-tasks.json +0 -20
- package/scripts/bench/r4-mixed-tasks.json +0 -20
- package/scripts/bench/r5-orchestrated-task.json +0 -7
- package/scripts/bench/review-tasks.json +0 -20
- package/scripts/bench/round-codex.json +0 -114
- package/scripts/bench/round-mixdog-lead-r3.json +0 -269
- package/scripts/bench/round-mixdog-lead.json +0 -269
- package/scripts/bench/round-mixdog.json +0 -126
- package/scripts/bench/round-r10-bigsample.json +0 -679
- package/scripts/bench/round-r11-codexalign.json +0 -257
- package/scripts/bench/round-r13-clientmeta.json +0 -464
- package/scripts/bench/round-r14-betafeatures.json +0 -466
- package/scripts/bench/round-r15-fulldefault.json +0 -462
- package/scripts/bench/round-r16-sessionid.json +0 -466
- package/scripts/bench/round-r17-wirebytes.json +0 -456
- package/scripts/bench/round-r18-prewarm.json +0 -468
- package/scripts/bench/round-r19-clean.json +0 -472
- package/scripts/bench/round-r20-prewarm-clean.json +0 -475
- package/scripts/bench/round-r21-delta-retry.json +0 -473
- package/scripts/bench/round-r22-full-probe.json +0 -693
- package/scripts/bench/round-r23-itemprobe.json +0 -701
- package/scripts/bench/round-r24-shapefix.json +0 -677
- package/scripts/bench/round-r25-serial.json +0 -464
- package/scripts/bench/round-r26-parallel3.json +0 -671
- package/scripts/bench/round-r27-parallel10.json +0 -894
- package/scripts/bench/round-r28-parallel10-stagger.json +0 -882
- package/scripts/bench/round-r29-parallel10-stagger166.json +0 -886
- package/scripts/bench/round-r30-instid.json +0 -253
- package/scripts/bench/round-r31-upgradeprobe.json +0 -256
- package/scripts/bench/round-r32-vs-codex-lead.json +0 -254
- package/scripts/bench/round-r33-vs-codex-codex.json +0 -115
- package/scripts/bench/round-r34-orchestrated.json +0 -120
- package/scripts/bench/round-r35-orchestrated-codex.json +0 -61
- package/scripts/bench/round-r36-orchestrated-capped.json +0 -128
- package/scripts/bench/round-r4-codex.json +0 -114
- package/scripts/bench/round-r4-mixed.json +0 -225
- package/scripts/bench/round-r5-gpt-lead.json +0 -259
- package/scripts/bench/round-r6-codex.json +0 -114
- package/scripts/bench/round-r6-solo.json +0 -257
- package/scripts/bench/round-r7-full.json +0 -254
- package/scripts/bench/round-r8-fulldefault.json +0 -255
- package/src/tui/components/prompt-input/voice-indicator.mjs +0 -39
- package/src/tui/lib/voice-recorder.mjs +0 -469
- package/src/workflows/sequential/WORKFLOW.md +0 -51
|
@@ -1,671 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"round": "26",
|
|
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": 9,
|
|
14
|
-
"completed": 9,
|
|
15
|
-
"completion_rate": 100,
|
|
16
|
-
"sessions": [
|
|
17
|
-
"sess_36552_1783069830153_1783069830396_d13a12bb2156913c8a60e9442598d0c8",
|
|
18
|
-
"sess_57952_1783069830168_1783069830408_4ec1cd0f3324c0260f3de8ee49f265d7",
|
|
19
|
-
"sess_48676_1783069830186_1783069830428_0a5bfd5ec7bb592c4472884b507d14db",
|
|
20
|
-
"sess_36256_1783069847899_1783069848122_f54e2a821584c50ac4e979c50a601646",
|
|
21
|
-
"sess_18484_1783069914981_1783069915210_7f0733a8893fa79343fc8708019b0acd",
|
|
22
|
-
"sess_51948_1783069931009_1783069931236_da461bb4146fd67343d59e15f87c3b45",
|
|
23
|
-
"sess_46144_1783069938017_1783069938263_a5dae16078bdeb9673d932cc9b9574a5",
|
|
24
|
-
"sess_47516_1783070000924_1783070001163_6b4f4d171e302f017c024a040f0956a6",
|
|
25
|
-
"sess_39060_1783070024383_1783070024607_f04e5c1bfb6beb27bc3ac82d8dbc7a46"
|
|
26
|
-
],
|
|
27
|
-
"results": [
|
|
28
|
-
{
|
|
29
|
-
"id": "r4-debug-forwarding-gap#1",
|
|
30
|
-
"agent": "reviewer",
|
|
31
|
-
"ok": true,
|
|
32
|
-
"ms": 100861,
|
|
33
|
-
"sessionId": "sess_36552_1783069830153_1783069830396_d13a12bb2156913c8a60e9442598d0c8",
|
|
34
|
-
"output": "sessionId: sess_36552_1783069830153_1783069830396_d13a12bb2156913c8a60e9442598d0c8\n관련 경로를 직접 추적해 첫 전달 전까지의 손실/지연 지점을 확인하겠습니다.조사 완료: 활성화 직후 첫 전달까지의 주된 위험은 “이미 존재하는 transcript를 EOF로 바인딩하는 경우”이며, 이 경우 backlog catch-up이 복구하지 못합니다.\n\n- **최대 영향 — 기존 transcript EOF 바인딩:** `bindPersistedTranscriptIfAny()`가 `catchUpFromPersisted`만 넘기고, persisted 경로가 아니면 `setContext()`가 현재 파일 끝으로 커서를 둡니다. 이미 기록된 assistant 출력은 파싱되지 않습니다. 복구 안 됨. `src/runtime/channels/index.mjs:625-629`, `src/runtime/channels/index.mjs:434-449`, `src/runtime/channels/lib/output-forwarder.mjs:117-127`\n\n- **pending → exists 전환 중 replay 누락:** activation bind 경로는 `options.catchUp`이 없어, poll 중 pending transcript가 생성되어도 `replayFromStart`가 false입니다. 생성 직후 이미 쌓인 첫 출력은 EOF 바인딩으로 건너뜁니다. 복구 안 됨. `src/runtime/channels/index.mjs:438-443`\n\n- **없는 transcript에 대한 `fs.watch` 실패:** `startWatch()`는 없는 파일에서 실패하고 닫히지만, re-arm poll이 파일 생성 후 watch를 설치하고 `forwardNewText()`로 backlog를 읽습니다. 60초 내 생성·소유 유지 시 복구됨, 그 뒤는 다음 rebind/trigger 전까지 지연. `src/runtime/channels/index.mjs:357-392`, `src/runtime/channels/index.mjs:492-499`, `src/runtime/channels/lib/output-forwarder.mjs:647-670`\n\n- **pre-connect ownership gate:** binding task가 `backend.connect()` 전 시작되므로 `_isOwner()`가 false여서 flush/rearm이 무시될 수 있습니다. 커서는 전진하지 않아 정상 start에서는 post-connect forward/rearm으로 복구됩니다. `src/runtime/channels/index.mjs:758-812`, `src/runtime/channels/index.mjs:316`, `src/runtime/channels/lib/output-forwarder.mjs:36-41`, `src/runtime/channels/lib/output-forwarder.mjs:351-354`\n\n- **채널 바인딩 부재:** persisted/main channel을 못 찾으면 transcript bind 자체가 없고, 나중에 기존 파일을 처음 bind하면 EOF 규칙으로 이전 출력이 빠질 수 있습니다. 복구 안 됨. `src/runtime/channels/index.mjs:610-624`, `src/runtime/channels/index.mjs:1597-1617`\n\n- **stat과 watch 설치 사이 쓰기:** `startWatch()` 직후 강제 flush가 있어 이 짧은 구간의 backlog는 복구됩니다. `src/runtime/channels/lib/output-forwarder.mjs:665-666`\n\n**Verdict:** not-yet-created transcript 창은 대체로 catch-up 되지만, activation 시 이미 존재하는 새 transcript를 EOF로 바인딩하는 경로는 첫 assistant 출력을 실제로 silently drop할 수 있습니다.",
|
|
35
|
-
"card": {
|
|
36
|
-
"session": "sess_36552_1783069830153_1783069830396_d13a12bb2156913c8a60e9442598d0c8",
|
|
37
|
-
"provider": "openai-oauth",
|
|
38
|
-
"model": "gpt-5.5",
|
|
39
|
-
"wall_ms": 90358,
|
|
40
|
-
"turns": 7,
|
|
41
|
-
"tool_calls": 6,
|
|
42
|
-
"tools_per_turn": 0.9,
|
|
43
|
-
"total_tool_ms": 315,
|
|
44
|
-
"llm_stream_ms": 89636,
|
|
45
|
-
"cache_ratio": 0.722787919558858,
|
|
46
|
-
"cached_tokens": 141824,
|
|
47
|
-
"prompt_tokens": 196218,
|
|
48
|
-
"uncached_tokens": 54394,
|
|
49
|
-
"output_tokens": 8930,
|
|
50
|
-
"cache_weighted_input_10": 68576.4,
|
|
51
|
-
"cache_weighted_input_25": 89850,
|
|
52
|
-
"prompt_growth": 38506,
|
|
53
|
-
"antipatterns": 1,
|
|
54
|
-
"issues": 11,
|
|
55
|
-
"issue_types": [
|
|
56
|
-
"cache",
|
|
57
|
-
"cache_break",
|
|
58
|
-
"service_tier",
|
|
59
|
-
"missed_parallelism",
|
|
60
|
-
"tool_churn_cluster"
|
|
61
|
-
],
|
|
62
|
-
"read_fragmentation_paths": [],
|
|
63
|
-
"grep_sweep_count": 0
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
"id": "r4-impl-usage-summary#1",
|
|
68
|
-
"agent": "worker",
|
|
69
|
-
"ok": true,
|
|
70
|
-
"ms": 17725,
|
|
71
|
-
"sessionId": "sess_57952_1783069830168_1783069830408_4ec1cd0f3324c0260f3de8ee49f265d7",
|
|
72
|
-
"output": "sessionId: sess_57952_1783069830168_1783069830408_4ec1cd0f3324c0260f3de8ee49f265d7\n재영님, 진행 전 계획입니다. 승인해 주시면 바로 구현·검증하겠습니다.\n\n- **구현** `scripts/session-bench.mjs`의 arg parsing 스타일을 확인해 `scripts/usage-today.mjs`를 추가합니다.\n- **동작** `MIXDOG_DATA_DIR` 우선, 기본 `~/.mixdog/data/history/agent-trace.jsonl`에서 오늘 00:00 이후 usage row만 집계합니다.\n- **출력/검증** 모델별 calls/input/cached/output/costUsd와 grand total을 출력하고, `package.json`에 `usage:today`를 추가한 뒤 `node --check`와 1회 실행으로 확인합니다.",
|
|
73
|
-
"card": {
|
|
74
|
-
"session": "sess_57952_1783069830168_1783069830408_4ec1cd0f3324c0260f3de8ee49f265d7",
|
|
75
|
-
"provider": "openai-oauth",
|
|
76
|
-
"model": "gpt-5.5",
|
|
77
|
-
"wall_ms": 7228,
|
|
78
|
-
"turns": 1,
|
|
79
|
-
"tool_calls": 0,
|
|
80
|
-
"tools_per_turn": 0,
|
|
81
|
-
"total_tool_ms": 0,
|
|
82
|
-
"llm_stream_ms": 6268,
|
|
83
|
-
"cache_ratio": 0.2695871946082561,
|
|
84
|
-
"cached_tokens": 2560,
|
|
85
|
-
"prompt_tokens": 9496,
|
|
86
|
-
"uncached_tokens": 6936,
|
|
87
|
-
"output_tokens": 495,
|
|
88
|
-
"cache_weighted_input_10": 7192,
|
|
89
|
-
"cache_weighted_input_25": 7576,
|
|
90
|
-
"prompt_growth": 0,
|
|
91
|
-
"antipatterns": 0,
|
|
92
|
-
"issues": 3,
|
|
93
|
-
"issue_types": [
|
|
94
|
-
"cache",
|
|
95
|
-
"cache_break",
|
|
96
|
-
"service_tier"
|
|
97
|
-
],
|
|
98
|
-
"read_fragmentation_paths": [],
|
|
99
|
-
"grep_sweep_count": 0
|
|
100
|
-
}
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
"id": "r4-explain-compact-engine#1",
|
|
104
|
-
"agent": "explore",
|
|
105
|
-
"ok": true,
|
|
106
|
-
"ms": 84789,
|
|
107
|
-
"sessionId": "sess_48676_1783069830186_1783069830428_0a5bfd5ec7bb592c4472884b507d14db",
|
|
108
|
-
"output": "sessionId: sess_48676_1783069830186_1783069830428_0a5bfd5ec7bb592c4472884b507d14db\n필요한 앵커만 한 번에 묶어서 확인하겠습니다.자동 경로의 호출부만 추가로 고정하겠습니다.recall-fasttrack 래퍼의 실제 호출 앵커만 마지막으로 확인합니다.완료했습니다 — compaction 서브시스템 요약은 아래와 같습니다.\n\n- **진입점**: `compact.mjs`가 `semanticCompactMessages`/`recallFastTrackCompactMessages`를 재수출하고, 실제 구현은 `engine.mjs`의 semantic/recall 엔트리다. `compact.mjs:52-55`, `engine.mjs:278`, `engine.mjs:445`\n\n- **호출부**: 자동 pre-send 경로는 `loop.mjs`가 policy를 계산한 뒤 recall 또는 semantic compact를 호출하고, 수동/API 경로는 `compactSessionMessages()`→`runSessionCompaction()`이다. `loop.mjs:329-353`, `loop.mjs:414-460`, `manager.mjs:1943-1957`, `compaction-runner.mjs:143-149`\n\n- **발화 조건**: 자동은 `auto`가 켜지고 boundary/trigger가 계산된 뒤 `messageTokens + reserve >= trigger`이거나 token 추정 실패/반응형 overflow 재시도면 실행된다. `compact-policy.mjs:89-117`, `compact-policy.mjs:151-175`, `loop.mjs:351-365`\n\n- **수동/러너 조건**: `runSessionCompaction()`은 closed/auto-off/짧은 메시지/무 boundary를 건너뛰고, force가 아니면 `pressureTokens < triggerTokens`에서 “below threshold”로 종료한다. `compaction-runner.mjs:143-176`\n\n- **타입 선택**: compact type은 env/config에서 정규화되며 기본은 semantic, agent-owned 세션은 semantic으로 고정된다. `constants.mjs:42-74`, `compact-policy.mjs:39-52`, `context-meta.mjs:222-230`\n\n- **semantic tail 선택**: semantic은 system/protected prefix와 이전 summary를 분리한 뒤, user turn이 있으면 최근 `tailTurns`를 `preserveRecentBudget` 안에서 보존하고 필요 시 최신 turn suffix로 자른다. `engine.mjs:100-111`, `engine.mjs:134-185`, `engine.mjs:235-245`\n\n- **no-user tail 선택**: user turn이 없으면 tool 결과로 시작하지 않는 cut point만 후보로 삼아 최신부터 budget에 맞는 suffix를 고르고, 비어 있거나 전체가 tail이 되는 경우 head를 남기는 보정을 한다. `engine.mjs:121-127`, `engine.mjs:193-232`\n\n- **recall tail 선택**: recall-fasttrack은 최신 최대 2 user-anchored turns를 보존하고 8k cap을 넘으면 오래된 turn을 버리거나 단일 turn을 truncation하며 no-user tail도 허용한다. `engine.mjs:449-468`, `engine.mjs:593-619`\n\n- **redaction 위치**: compaction이 실제 진행될 때만 base sanitized transcript에 `redactToolCallSecretsInMessages()`를 적용한 후 window selection을 하므로 preserved system/tail도 redacted 상태로 측정·출력된다. `engine.mjs:284-314`, `engine.mjs:389-392`, `engine.mjs:644-651`\n\n- **redaction 범위**: redaction은 tool call argument 값만 shape-preserving으로 scrub하며 secret key/raw secret pair를 `[redacted]`로 바꾸고 role/content/tool ids/order는 유지한다. `text-utils.mjs:219-229`, `text-utils.mjs:261-288`, `text-utils.mjs:291-325`\n\n- **semantic 실패 처리**: provider 없음, 빈 head, prompt/summary fit 실패, empty summary, 최종 budget 초과는 throw되고 runner/loop가 error telemetry로 기록한다. `engine.mjs:278-317`, `engine.mjs:333-386`, `engine.mjs:392-397`, `loop.mjs:486-560`\n\n- **fallback 경로**: recall-fasttrack 실패는 runner에서 semantic fallback을 한 번 시도하고, semantic/non-recall 실패는 `pruneToolOutputsUnanchored()`가 budget 안에 들어가면 복구하며 recall 실패에는 prune fallback을 건너뛴다. `compaction-runner.mjs:231-279`, `compaction-runner.mjs:322-347`, `loop.mjs:500-545`\n\n- **최종 실패/성공 기록**: 복구 실패 시 `post_turn_failed`/`manual_failed` 또는 loop `overflow_failed`를 기록하고, 성공 시 messages 교체·providerState 초기화·compaction counters/lastStage를 갱신한다. `compaction-runner.mjs:348-397`, `compaction-runner.mjs:410-447`, `loop.mjs:552-626`, `loop.mjs:630-656`",
|
|
109
|
-
"card": {
|
|
110
|
-
"session": "sess_48676_1783069830186_1783069830428_0a5bfd5ec7bb592c4472884b507d14db",
|
|
111
|
-
"provider": "openai-oauth",
|
|
112
|
-
"model": "gpt-5.5",
|
|
113
|
-
"wall_ms": 74277,
|
|
114
|
-
"turns": 9,
|
|
115
|
-
"tool_calls": 14,
|
|
116
|
-
"tools_per_turn": 1.6,
|
|
117
|
-
"total_tool_ms": 2165,
|
|
118
|
-
"llm_stream_ms": 72331,
|
|
119
|
-
"cache_ratio": 0.7512216810492917,
|
|
120
|
-
"cached_tokens": 185856,
|
|
121
|
-
"prompt_tokens": 247405,
|
|
122
|
-
"uncached_tokens": 61549,
|
|
123
|
-
"output_tokens": 5622,
|
|
124
|
-
"cache_weighted_input_10": 80134.6,
|
|
125
|
-
"cache_weighted_input_25": 108013,
|
|
126
|
-
"prompt_growth": 44952,
|
|
127
|
-
"antipatterns": 1,
|
|
128
|
-
"issues": 15,
|
|
129
|
-
"issue_types": [
|
|
130
|
-
"cache",
|
|
131
|
-
"cache_break",
|
|
132
|
-
"cache_miss",
|
|
133
|
-
"readonly_stall",
|
|
134
|
-
"broad_tool_result",
|
|
135
|
-
"service_tier",
|
|
136
|
-
"tool_churn_cluster"
|
|
137
|
-
],
|
|
138
|
-
"read_fragmentation_paths": [],
|
|
139
|
-
"grep_sweep_count": 0
|
|
140
|
-
}
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
"id": "r4-debug-forwarding-gap#2",
|
|
144
|
-
"agent": "reviewer",
|
|
145
|
-
"ok": true,
|
|
146
|
-
"ms": 90118,
|
|
147
|
-
"sessionId": "sess_36256_1783069847899_1783069848122_f54e2a821584c50ac4e979c50a601646",
|
|
148
|
-
"output": "sessionId: sess_36256_1783069847899_1783069848122_f54e2a821584c50ac4e979c50a601646\n요청 범위가 읽기 전용 조사라서 바로 코드 경로를 추적해 확인하겠습니다.조사 완료: 활성화부터 첫 전달까지의 경로에는 “지연 후 회수”와 “EOF 바인딩으로 영구 누락”이 섞여 있습니다.\n\n**영향도 순 findings**\n- **영구 누락 가능**: 채널 ID가 없으면 `bindPersistedTranscriptIfAny()`가 반환하고, 이후 첫 inbound에서 이미 존재하는 transcript를 `applyTranscriptBinding()`으로 EOF 바인딩합니다. 그 사이 출력은 catch-up 없이 스킵됩니다. `src/runtime/channels/index.mjs:624`, `src/runtime/channels/index.mjs:1597`, `src/runtime/channels/lib/output-forwarder.mjs:125`\n- **영구 누락 가능**: 활성화 직후 session/transcript discovery가 늦어 stale binding을 쓰다가, 나중에 “이미 존재하는” self transcript로 steal하면 EOF 바인딩되어 이전 출력이 스킵됩니다. 500ms poll 밖이면 회수 안 됩니다. `src/runtime/channels/index.mjs:1526`, `src/runtime/channels/index.mjs:1571`, `src/runtime/channels/index.mjs:1597`\n- **대체로 회수됨**: transcript 파일이 아직 없으면 `fs.watch()` 설치가 실패하지만 pending re-arm이 60초 동안 polling 후 `startWatch()`와 `forwardNewText()`로 backlog를 읽습니다. 60초 초과 또는 재트리거 없음이면 지연/미회수입니다. `src/runtime/channels/index.mjs:340`, `src/runtime/channels/index.mjs:357`, `src/runtime/channels/index.mjs:376`\n- **회수됨**: backend connect 전에는 ownership probe가 false라 `forwardNewText()`가 no-op이지만, connect 후 `forwardNewText()` 또는 re-arm 재설정이 다시 실행되어 backlog를 읽습니다. `src/runtime/channels/lib/output-forwarder.mjs:351`, `src/runtime/channels/index.mjs:776`, `src/runtime/channels/index.mjs:801`\n- **회수됨**: `setContext()` stat과 `fs.watch()` 설치 사이에 쓰인 bytes는 `startWatch()`의 즉시 flush가 커버합니다. `src/runtime/channels/lib/output-forwarder.mjs:111`, `src/runtime/channels/lib/output-forwarder.mjs:665`\n\n**경로 요약**: `writeBridgeState(true)` → ownership claim/refresh → `startOwnedRuntime()` → `bindPersistedTranscriptIfAny()`/`rebindTranscriptContext()` → `OutputForwarder.setContext()` → `startWatch()` → `scheduleWatchFlush()` → `forwardNewText()` → `deliverQueueItem()`.\n\n**Verdict**: not-yet-created transcript와 pre-connect ownership gap은 대부분 catch-up되지만, “채널/세션 바인딩이 늦고 transcript가 이미 존재하는” 경우는 EOF 바인딩으로 첫 출력이 silently dropped 될 수 있습니다.",
|
|
149
|
-
"card": {
|
|
150
|
-
"session": "sess_36256_1783069847899_1783069848122_f54e2a821584c50ac4e979c50a601646",
|
|
151
|
-
"provider": "openai-oauth",
|
|
152
|
-
"model": "gpt-5.5",
|
|
153
|
-
"wall_ms": 79636,
|
|
154
|
-
"turns": 7,
|
|
155
|
-
"tool_calls": 6,
|
|
156
|
-
"tools_per_turn": 0.9,
|
|
157
|
-
"total_tool_ms": 493,
|
|
158
|
-
"llm_stream_ms": 78523,
|
|
159
|
-
"cache_ratio": 0.6874013304367773,
|
|
160
|
-
"cached_tokens": 101888,
|
|
161
|
-
"prompt_tokens": 148222,
|
|
162
|
-
"uncached_tokens": 46334,
|
|
163
|
-
"output_tokens": 6629,
|
|
164
|
-
"cache_weighted_input_10": 56522.8,
|
|
165
|
-
"cache_weighted_input_25": 71806,
|
|
166
|
-
"prompt_growth": 30328,
|
|
167
|
-
"antipatterns": 1,
|
|
168
|
-
"issues": 13,
|
|
169
|
-
"issue_types": [
|
|
170
|
-
"cache",
|
|
171
|
-
"cache_break",
|
|
172
|
-
"cache_miss",
|
|
173
|
-
"broad_tool_result",
|
|
174
|
-
"service_tier",
|
|
175
|
-
"missed_parallelism",
|
|
176
|
-
"tool_churn_cluster"
|
|
177
|
-
],
|
|
178
|
-
"read_fragmentation_paths": [],
|
|
179
|
-
"grep_sweep_count": 0
|
|
180
|
-
}
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
"id": "r4-impl-usage-summary#2",
|
|
184
|
-
"agent": "worker",
|
|
185
|
-
"ok": true,
|
|
186
|
-
"ms": 118432,
|
|
187
|
-
"sessionId": "sess_18484_1783069914981_1783069915210_7f0733a8893fa79343fc8708019b0acd",
|
|
188
|
-
"output": "sessionId: sess_18484_1783069914981_1783069915210_7f0733a8893fa79343fc8708019b0acd\n요청 범위가 명확해 바로 구현하고 검증까지 진행하겠습니다.구현 파일이 이미 작업트리에 있어 요구사항 기준으로 점검한 뒤 필요한 수정과 검증을 진행합니다.검증은 통과했고, diff 요약만 확인합니다.완료했습니다. `usage:today` 스크립트와 `scripts/usage-today.mjs`가 준비되어 오늘 사용량을 모델별/총합으로 출력합니다.\n\n- **Diff 요약**: `package.json`에 `\"usage:today\": \"node scripts/usage-today.mjs\"` 추가, `scripts/usage-today.mjs` 신규 추가.\n- **검증**: `node --check scripts/usage-today.mjs` 통과, `npm run usage:today` 실행 성공.\n- **참고**: 작업 전부터 `src/runtime/channels/lib/event-queue.mjs`, `src/runtime/channels/lib/output-forwarder.mjs`에 별도 수정이 있었습니다.",
|
|
189
|
-
"card": {
|
|
190
|
-
"session": "sess_18484_1783069914981_1783069915210_7f0733a8893fa79343fc8708019b0acd",
|
|
191
|
-
"provider": "openai-oauth",
|
|
192
|
-
"model": "gpt-5.5",
|
|
193
|
-
"wall_ms": 107937,
|
|
194
|
-
"turns": 14,
|
|
195
|
-
"tool_calls": 20,
|
|
196
|
-
"tools_per_turn": 1.4,
|
|
197
|
-
"total_tool_ms": 2983,
|
|
198
|
-
"llm_stream_ms": 105065,
|
|
199
|
-
"cache_ratio": 0.7753208965282127,
|
|
200
|
-
"cached_tokens": 293376,
|
|
201
|
-
"prompt_tokens": 378393,
|
|
202
|
-
"uncached_tokens": 85017,
|
|
203
|
-
"output_tokens": 9176,
|
|
204
|
-
"cache_weighted_input_10": 114354.6,
|
|
205
|
-
"cache_weighted_input_25": 158361,
|
|
206
|
-
"prompt_growth": 30327,
|
|
207
|
-
"antipatterns": 1,
|
|
208
|
-
"issues": 16,
|
|
209
|
-
"issue_types": [
|
|
210
|
-
"cache",
|
|
211
|
-
"cache_break",
|
|
212
|
-
"cache_miss",
|
|
213
|
-
"readonly_stall",
|
|
214
|
-
"service_tier",
|
|
215
|
-
"missed_parallelism",
|
|
216
|
-
"tool_churn_cluster"
|
|
217
|
-
],
|
|
218
|
-
"read_fragmentation_paths": [],
|
|
219
|
-
"grep_sweep_count": 0
|
|
220
|
-
}
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
"id": "r4-explain-compact-engine#2",
|
|
224
|
-
"agent": "explore",
|
|
225
|
-
"ok": true,
|
|
226
|
-
"ms": 69918,
|
|
227
|
-
"sessionId": "sess_51948_1783069931009_1783069931236_da461bb4146fd67343d59e15f87c3b45",
|
|
228
|
-
"output": "sessionId: sess_51948_1783069931009_1783069931236_da461bb4146fd67343d59e15f87c3b45\nMapped.\n\n- **Entry points:** `semanticCompactMessages` and `recallFastTrackCompactMessages` are exported from `engine.mjs` and re-exported by `compact.mjs`. `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:** auto pre-send compaction runs from `agentLoop`; manual `/compact` and clear-before-clear run through `runSessionCompaction`. `src/runtime/agent/orchestrator/session/loop.mjs:329`, `src/runtime/agent/orchestrator/session/loop.mjs:416`, `src/runtime/agent/orchestrator/session/loop.mjs:441`, `src/runtime/agent/orchestrator/session/manager.mjs:1849`, `src/runtime/agent/orchestrator/session/manager.mjs:1950`\n\n- **Fire decision:** worker compaction is enabled by `resolveWorkerCompactPolicy`, then fires when pressure plus reserve reaches `triggerTokens`, token estimate is unavailable, or a reactive overflow retry forces it. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:89`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170`, `src/runtime/agent/orchestrator/session/loop.mjs:351`\n\n- **Reactive path:** provider context overflow sets `reactiveOverflowRetryPending`, loops back, and tags the next compact as `trigger:'reactive'`. `src/runtime/agent/orchestrator/session/loop.mjs:982`, `src/runtime/agent/orchestrator/session/loop.mjs:995`, `src/runtime/agent/orchestrator/session/loop.mjs:1002`\n\n- **Type choice:** policy chooses `semantic` or `recall-fasttrack`; agent-owned sessions are forced semantic, and loop dispatches recall first otherwise semantic. `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:39`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:123`, `src/runtime/agent/orchestrator/session/loop.mjs:414`, `src/runtime/agent/orchestrator/session/loop.mjs:439`\n\n- **Window prep:** engine first sanitizes tool pairs, dedups/reconciles tool results, splits protected system prefix, finds previous summary, and filters summaries out of live history. `src/runtime/agent/orchestrator/session/compact/engine.mjs:100`\n\n- **Semantic tail:** semantic keeps recent user-anchored turns within `preserveRecentBudget`; if no user turns exist, it cuts only at non-tool boundaries to keep tool pairs valid. `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:235`\n\n- **Recall tail:** recall-fasttrack keeps the newest structured turns, drops oldest turns to fit cap, then truncates the oldest surviving content if needed. `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:606`\n\n- **Redaction hook:** actual compaction redacts tool-call argument secrets after the no-op fit check and 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:644`\n\n- **Redaction behavior:** redaction only touches sensitive tool-call argument values or embedded raw secret pairs while preserving message/tool-call shape and order. `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 output:** semantic calls provider with a compact prompt, repairs malformed summaries, emits `[system, summary, tail]`, and rejects empty/no-fit/over-budget results. `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`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:392`\n\n- **Recall output:** recall-fasttrack injects recall/prior text into a fitted summary, caps recall room separately, emits `[system, summary, tail]`, and rejects empty recall unless allowed. `src/runtime/agent/orchestrator/session/compact/engine.mjs:666`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:679`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:684`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:695`\n\n- **Fallbacks:** loop semantic failures can fall back to unanchored tool-output pruning; recall-fasttrack failures do not use that prune fallback and escalate overflow. `src/runtime/agent/orchestrator/session/loop.mjs:500`, `src/runtime/agent/orchestrator/session/loop.mjs:517`, `src/runtime/agent/orchestrator/session/loop.mjs:618`\n\n- **Manual fallback:** session-runner recall-fasttrack failure can degrade to semantic once; non-recall failures can use the same unanchored prune fallback, otherwise error state is recorded. `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`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:348`",
|
|
229
|
-
"card": {
|
|
230
|
-
"session": "sess_51948_1783069931009_1783069931236_da461bb4146fd67343d59e15f87c3b45",
|
|
231
|
-
"provider": "openai-oauth",
|
|
232
|
-
"model": "gpt-5.5",
|
|
233
|
-
"wall_ms": 59444,
|
|
234
|
-
"turns": 8,
|
|
235
|
-
"tool_calls": 11,
|
|
236
|
-
"tools_per_turn": 1.4,
|
|
237
|
-
"total_tool_ms": 917,
|
|
238
|
-
"llm_stream_ms": 58557,
|
|
239
|
-
"cache_ratio": 0.6344514338241921,
|
|
240
|
-
"cached_tokens": 140800,
|
|
241
|
-
"prompt_tokens": 221924,
|
|
242
|
-
"uncached_tokens": 81124,
|
|
243
|
-
"output_tokens": 4388,
|
|
244
|
-
"cache_weighted_input_10": 95204,
|
|
245
|
-
"cache_weighted_input_25": 116324,
|
|
246
|
-
"prompt_growth": 39319,
|
|
247
|
-
"antipatterns": 0,
|
|
248
|
-
"issues": 12,
|
|
249
|
-
"issue_types": [
|
|
250
|
-
"cache",
|
|
251
|
-
"cache_break",
|
|
252
|
-
"cache_miss",
|
|
253
|
-
"broad_tool_result",
|
|
254
|
-
"service_tier"
|
|
255
|
-
],
|
|
256
|
-
"read_fragmentation_paths": [],
|
|
257
|
-
"grep_sweep_count": 0
|
|
258
|
-
}
|
|
259
|
-
},
|
|
260
|
-
{
|
|
261
|
-
"id": "r4-debug-forwarding-gap#3",
|
|
262
|
-
"agent": "reviewer",
|
|
263
|
-
"ok": true,
|
|
264
|
-
"ms": 86359,
|
|
265
|
-
"sessionId": "sess_46144_1783069938017_1783069938263_a5dae16078bdeb9673d932cc9b9574a5",
|
|
266
|
-
"output": "sessionId: sess_46144_1783069938017_1783069938263_a5dae16078bdeb9673d932cc9b9574a5\n요청하신 경로를 기준으로 활성화부터 첫 전달까지의 흐름과 손실 구간을 바로 추적하겠습니다.조사 완료: `bridge-state.json`은 “활성 요청” 신호일 뿐, Discord 연결·소유권·transcript bind·watch 준비 전 창이 실제로 있습니다.\n\n- **기존 transcript EOF 스킵**: bind 시 `replayFromStart`가 아니면 현재 파일 크기로 cursor를 잡아 이미 쓰인 assistant 출력은 건너뜁니다. `src/runtime/channels/lib/output-forwarder.mjs:111` / `src/runtime/channels/index.mjs:624` — **backlog catch-up 불가**.\n\n- **미생성 transcript watch 실패**: `fs.watch`는 없는 파일에 실패하지만 re-arm poll이 생성 후 `startWatch()`와 `forwardNewText()`를 호출합니다. `src/runtime/channels/index.mjs:357` / `src/runtime/channels/lib/output-forwarder.mjs:647` — **60초 안 생성되면 복구, timeout 후에는 지연·추후 bind에서 드롭 가능**.\n\n- **소유권/연결 전 flush 무시**: `forwardNewText()`는 owner가 아니면 읽지 않고 반환하고, connect 후 재호출/재무장합니다. `src/runtime/channels/lib/output-forwarder.mjs:351` / `src/runtime/channels/index.mjs:801` — **보통 backlog catch-up 가능, 지연만 발생**.\n\n- **watch 설치 직전 write 경합**: watch 성공 시 즉시 flush를 예약해 stat 이후 쓰인 bytes를 회수합니다. `src/runtime/channels/lib/output-forwarder.mjs:665` — **backlog catch-up 가능**.\n\nVerdict: 가장 큰 실제 손실 위험은 “이미 존재하는 transcript를 activation 후 EOF로 bind하는 경로”이며, 미생성 transcript 창은 60초 re-arm 안에서는 복구됩니다.",
|
|
267
|
-
"card": {
|
|
268
|
-
"session": "sess_46144_1783069938017_1783069938263_a5dae16078bdeb9673d932cc9b9574a5",
|
|
269
|
-
"provider": "openai-oauth",
|
|
270
|
-
"model": "gpt-5.5",
|
|
271
|
-
"wall_ms": 75840,
|
|
272
|
-
"turns": 5,
|
|
273
|
-
"tool_calls": 8,
|
|
274
|
-
"tools_per_turn": 1.6,
|
|
275
|
-
"total_tool_ms": 626,
|
|
276
|
-
"llm_stream_ms": 75046,
|
|
277
|
-
"cache_ratio": 0.4436709993912701,
|
|
278
|
-
"cached_tokens": 61952,
|
|
279
|
-
"prompt_tokens": 139635,
|
|
280
|
-
"uncached_tokens": 77683,
|
|
281
|
-
"output_tokens": 7952,
|
|
282
|
-
"cache_weighted_input_10": 83878.2,
|
|
283
|
-
"cache_weighted_input_25": 93171,
|
|
284
|
-
"prompt_growth": 35029,
|
|
285
|
-
"antipatterns": 0,
|
|
286
|
-
"issues": 8,
|
|
287
|
-
"issue_types": [
|
|
288
|
-
"cache",
|
|
289
|
-
"cache_break",
|
|
290
|
-
"cache_miss",
|
|
291
|
-
"service_tier"
|
|
292
|
-
],
|
|
293
|
-
"read_fragmentation_paths": [],
|
|
294
|
-
"grep_sweep_count": 0
|
|
295
|
-
}
|
|
296
|
-
},
|
|
297
|
-
{
|
|
298
|
-
"id": "r4-impl-usage-summary#3",
|
|
299
|
-
"agent": "worker",
|
|
300
|
-
"ok": true,
|
|
301
|
-
"ms": 119618,
|
|
302
|
-
"sessionId": "sess_47516_1783070000924_1783070001163_6b4f4d171e302f017c024a040f0956a6",
|
|
303
|
-
"output": "sessionId: sess_47516_1783070000924_1783070001163_6b4f4d171e302f017c024a040f0956a6\n요청 범위가 명확해서 바로 구현하고 검증까지 진행하겠습니다.구현 파일과 npm script가 이미 존재해 요구사항과 맞는지 확인한 뒤 검증을 실행하겠습니다.검증은 통과했고, diff 범위를 확인해 관련 변경만 요약하겠습니다.완료했습니다, 재영님. `usage:today` 스크립트와 `scripts/usage-today.mjs` 구현이 준비되어 검증까지 통과했습니다.\n\n- **Diff 요약**: `package.json`에 `usage:today` 추가, `scripts/usage-today.mjs` 신규 추가.\n\n- **검증**: `node --check scripts/usage-today.mjs` 통과, `npm run usage:today` 실행 성공.\n\n- **참고**: 작업 범위 밖 변경으로 `src/runtime/channels/lib/event-queue.mjs`, `src/runtime/channels/lib/output-forwarder.mjs` 수정분이 이미 보입니다.",
|
|
304
|
-
"card": {
|
|
305
|
-
"session": "sess_47516_1783070000924_1783070001163_6b4f4d171e302f017c024a040f0956a6",
|
|
306
|
-
"provider": "openai-oauth",
|
|
307
|
-
"model": "gpt-5.5",
|
|
308
|
-
"wall_ms": 109123,
|
|
309
|
-
"turns": 14,
|
|
310
|
-
"tool_calls": 21,
|
|
311
|
-
"tools_per_turn": 1.5,
|
|
312
|
-
"total_tool_ms": 2822,
|
|
313
|
-
"llm_stream_ms": 106210,
|
|
314
|
-
"cache_ratio": 0.8669324056243677,
|
|
315
|
-
"cached_tokens": 328192,
|
|
316
|
-
"prompt_tokens": 378567,
|
|
317
|
-
"uncached_tokens": 50375,
|
|
318
|
-
"output_tokens": 10990,
|
|
319
|
-
"cache_weighted_input_10": 83194.20000000001,
|
|
320
|
-
"cache_weighted_input_25": 132423,
|
|
321
|
-
"prompt_growth": 30286,
|
|
322
|
-
"antipatterns": 0,
|
|
323
|
-
"issues": 14,
|
|
324
|
-
"issue_types": [
|
|
325
|
-
"cache",
|
|
326
|
-
"cache_break",
|
|
327
|
-
"cache_miss",
|
|
328
|
-
"readonly_stall",
|
|
329
|
-
"service_tier"
|
|
330
|
-
],
|
|
331
|
-
"read_fragmentation_paths": [],
|
|
332
|
-
"grep_sweep_count": 0
|
|
333
|
-
}
|
|
334
|
-
},
|
|
335
|
-
{
|
|
336
|
-
"id": "r4-explain-compact-engine#3",
|
|
337
|
-
"agent": "explore",
|
|
338
|
-
"ok": true,
|
|
339
|
-
"ms": 71032,
|
|
340
|
-
"sessionId": "sess_39060_1783070024383_1783070024607_f04e5c1bfb6beb27bc3ac82d8dbc7a46",
|
|
341
|
-
"output": "runtime/agent/orchestrator/session/loop/compact-policy.mjs:89`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:92`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:100`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:123`).\n- **발화 조건**: pre-send loop는 `shouldCompactForSession()`가 true일 때만 compaction으로 진입한다 (`src/runtime/agent/orchestrator/session/loop.mjs:353`, `src/runtime/agent/orchestrator/session/loop.mjs:365`, `src/runtime/agent/orchestrator/session/loop.mjs:372`).\n- **임계값 로직**: reactive overflow retry는 무조건 compact, 토큰 추정 실패도 compact, 그 외에는 `messageTokens + reserve >= triggerTokens`가 조건이다 (`src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:170`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:172`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:173`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:174`).\n- **목표 예산**: compact target은 boundary 안에서 target effective + reserve로 계산된다 (`src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:163`, `src/runtime/agent/orchestrator/session/loop/compact-policy.mjs:168`).\n- **수동 runner 조건**: manual은 force로 간주되고, auto runner는 `pressureTokens < triggerTokens`면 “below threshold”로 종료한다 (`src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:145`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:146`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:176`).\n- **공통 전처리**: semantic/recall 모두 tool pair sanitize, tool result dedup, dedup stub reconcile을 먼저 수행한다 (`src/runtime/agent/orchestrator/session/compact/engine.mjs:284`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:625`).\n- **no-op 경로**: sanitized transcript가 budget 안에 있고 force가 아니면 원본 sanitize 결과를 그대로 반환한다 (`src/runtime/agent/orchestrator/session/compact/engine.mjs:286`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:289`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:627`).\n- **redaction 위치**: 실제 compaction에 들어갈 때만 `redactToolCallSecretsInMessages()`를 적용하고, semantic은 window selection 전에 적용한다 (`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:314`).\n- **redaction 보존**: semantic output은 redacted `system`/`tail`을 그대로 내보낸다 (`src/runtime/agent/orchestrator/session/compact/engine.mjs:389`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:392`).\n- **semantic window split**: protected/system prefix, previous summary, non-summary live transcript로 분리한다 (`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- **semantic tail 선택**: user turn이 있으면 최근 `tailTurns`를 budget 안에서 보존하고, 없으면 tool result가 아닌 cut point 기준으로 tail을 고른다 (`src/runtime/agent/orchestrator/session/compact/engine.mjs:240`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:241`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:242`).\n- **user-turn tail**: 최신 turn부터 거꾸로 확장하고, 최신 turn이 너무 크면 fitting suffix만 보존한다 (`src/runtime/agent/orchestrator/session/compact/engine.mjs:141`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:146`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:151`).\n- **no-user tail**: valid cut은 tool result로 시작하지 않으며, budget에 맞는 가장 오래된 suffix cut까지 확장한다 (`src/runtime/agent/orchestrator/session/compact/engine.mjs:121`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:124`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:197`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:200`).\n- **semantic 결과 조립**: `head`는 summary로 대체되고 `system + summary + tail`이 다시 sanitize/reconcile된다 (`src/runtime/agent/orchestrator/session/compact/engine.mjs:244`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:258`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:384`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:392`).\n- **recall tail 정책**: recall-fasttrack은 최신 structured turns를 verbatim 보존하고 오래된 history는 recall summary로 주입한다 (`src/runtime/agent/orchestrator/session/compact/engine.mjs:449`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:452`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:593`).\n- **recall tail 축소**: 최신 `maxUsers` turns를 고르고, cap 초과 시 오래된 turn을 버린 뒤 필요하면 단일 turn을 truncate한다 (`src/runtime/agent/orchestrator/session/compact/engine.mjs:596`, `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`).\n- **recall no-user 허용**: no-user tail도 유효하며 tool-pairing은 sanitize/reconcile로 복구된다 (`src/runtime/agent/orchestrator/session/compact/engine.mjs:613`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:617`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:618`).\n- **recall 입력**: loop path는 memory ingest/dump 결과와 cycle1 text를 합쳐 recall text를 만들고 token cap을 전달한다 (`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- **semantic 실패 지점**: provider 부재, compactable head 부재, prompt fit 실패, empty summary, summary fit 실패, final budget 초과가 throw된다 (`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:385`, `src/runtime/agent/orchestrator/session/compact/engine.mjs:395`).\n- **recall 실패 지점**: compactable prior/recall text가 없거나 recall summary가 fit되지 않거나 final 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- **loop fallback**: non-recall compact 실패는 unanchored tool-output prune으로 한 번 복구를 시도하고, recall 실패에는 이 prune fallback을 적용하지 않는다 (`src/runtime/agent/orchestrator/session/loop.mjs:501`, `src/runtime/agent/orchestrator/session/loop.mjs:511`, `src/runtime/agent/orchestrator/session/loop.mjs:517`, `src/runtime/agent/orchestrator/session/loop.mjs:527`).\n- **loop hard failure**: fallback도 없으면 `overflow_failed` telemetry를 남기고 `agentContextOverflowError()`를 throw한다 (`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- **runner degraded fallback**: manager runner에서 recall-fasttrack 실패 시 semantic이 enabled이고 provider가 있으면 semantic fallback을 한 번 시도한다 (`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- **runner prune fallback**: non-recall 실패는 loop와 동일하게 unanchored prune으로 복구를 시도한다 (`src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:322`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:327`, `src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs:330`).\n- **성공 commit**: compacted transcript로 `session.messages`를 교체하고 providerState를 무효화한다 (`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/loop.mjs:631`, `src/runtime/agent/orchestrator/session/loop.mjs:639`).",
|
|
342
|
-
"card": {
|
|
343
|
-
"session": "sess_39060_1783070024383_1783070024607_f04e5c1bfb6beb27bc3ac82d8dbc7a46",
|
|
344
|
-
"provider": "openai-oauth",
|
|
345
|
-
"model": "gpt-5.5",
|
|
346
|
-
"wall_ms": 60530,
|
|
347
|
-
"turns": 6,
|
|
348
|
-
"tool_calls": 7,
|
|
349
|
-
"tools_per_turn": 1.2,
|
|
350
|
-
"total_tool_ms": 741,
|
|
351
|
-
"llm_stream_ms": 59738,
|
|
352
|
-
"cache_ratio": 0.6792775828126337,
|
|
353
|
-
"cached_tokens": 79360,
|
|
354
|
-
"prompt_tokens": 116830,
|
|
355
|
-
"uncached_tokens": 37470,
|
|
356
|
-
"output_tokens": 4737,
|
|
357
|
-
"cache_weighted_input_10": 45406,
|
|
358
|
-
"cache_weighted_input_25": 57310,
|
|
359
|
-
"prompt_growth": 26262,
|
|
360
|
-
"antipatterns": 1,
|
|
361
|
-
"issues": 9,
|
|
362
|
-
"issue_types": [
|
|
363
|
-
"cache",
|
|
364
|
-
"cache_break",
|
|
365
|
-
"service_tier",
|
|
366
|
-
"tool_churn_cluster"
|
|
367
|
-
],
|
|
368
|
-
"read_fragmentation_paths": [],
|
|
369
|
-
"grep_sweep_count": 0
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
],
|
|
373
|
-
"task_complete": true,
|
|
374
|
-
"task_errors": [],
|
|
375
|
-
"score_complete": true,
|
|
376
|
-
"score_errors": [],
|
|
377
|
-
"group": {
|
|
378
|
-
"n": 9,
|
|
379
|
-
"wall_ms": 73819.2,
|
|
380
|
-
"turns": 7.9,
|
|
381
|
-
"tool_calls": 10.3,
|
|
382
|
-
"tools_per_turn": 1.2,
|
|
383
|
-
"total_tool_ms": 1229.1,
|
|
384
|
-
"llm_stream_ms": 72374.9,
|
|
385
|
-
"cache_ratio": 0.6,
|
|
386
|
-
"cached_tokens": 148423.1,
|
|
387
|
-
"prompt_tokens": 204076.7,
|
|
388
|
-
"uncached_tokens": 55653.6,
|
|
389
|
-
"output_tokens": 6546.6,
|
|
390
|
-
"cache_weighted_input_10": 70495.9,
|
|
391
|
-
"cache_weighted_input_25": 92759.3,
|
|
392
|
-
"prompt_growth": 30556.6,
|
|
393
|
-
"antipatterns": 0.6,
|
|
394
|
-
"issues": 11.2,
|
|
395
|
-
"grep_sweep_count": 0
|
|
396
|
-
},
|
|
397
|
-
"cards": [
|
|
398
|
-
{
|
|
399
|
-
"session": "sess_36552_1783069830153_1783069830396_d13a12bb2156913c8a60e9442598d0c8",
|
|
400
|
-
"provider": "openai-oauth",
|
|
401
|
-
"model": "gpt-5.5",
|
|
402
|
-
"wall_ms": 90358,
|
|
403
|
-
"turns": 7,
|
|
404
|
-
"tool_calls": 6,
|
|
405
|
-
"tools_per_turn": 0.9,
|
|
406
|
-
"total_tool_ms": 315,
|
|
407
|
-
"llm_stream_ms": 89636,
|
|
408
|
-
"cache_ratio": 0.722787919558858,
|
|
409
|
-
"cached_tokens": 141824,
|
|
410
|
-
"prompt_tokens": 196218,
|
|
411
|
-
"uncached_tokens": 54394,
|
|
412
|
-
"output_tokens": 8930,
|
|
413
|
-
"cache_weighted_input_10": 68576.4,
|
|
414
|
-
"cache_weighted_input_25": 89850,
|
|
415
|
-
"prompt_growth": 38506,
|
|
416
|
-
"antipatterns": 1,
|
|
417
|
-
"issues": 11,
|
|
418
|
-
"issue_types": [
|
|
419
|
-
"cache",
|
|
420
|
-
"cache_break",
|
|
421
|
-
"service_tier",
|
|
422
|
-
"missed_parallelism",
|
|
423
|
-
"tool_churn_cluster"
|
|
424
|
-
],
|
|
425
|
-
"read_fragmentation_paths": [],
|
|
426
|
-
"grep_sweep_count": 0
|
|
427
|
-
},
|
|
428
|
-
{
|
|
429
|
-
"session": "sess_57952_1783069830168_1783069830408_4ec1cd0f3324c0260f3de8ee49f265d7",
|
|
430
|
-
"provider": "openai-oauth",
|
|
431
|
-
"model": "gpt-5.5",
|
|
432
|
-
"wall_ms": 7228,
|
|
433
|
-
"turns": 1,
|
|
434
|
-
"tool_calls": 0,
|
|
435
|
-
"tools_per_turn": 0,
|
|
436
|
-
"total_tool_ms": 0,
|
|
437
|
-
"llm_stream_ms": 6268,
|
|
438
|
-
"cache_ratio": 0.2695871946082561,
|
|
439
|
-
"cached_tokens": 2560,
|
|
440
|
-
"prompt_tokens": 9496,
|
|
441
|
-
"uncached_tokens": 6936,
|
|
442
|
-
"output_tokens": 495,
|
|
443
|
-
"cache_weighted_input_10": 7192,
|
|
444
|
-
"cache_weighted_input_25": 7576,
|
|
445
|
-
"prompt_growth": 0,
|
|
446
|
-
"antipatterns": 0,
|
|
447
|
-
"issues": 3,
|
|
448
|
-
"issue_types": [
|
|
449
|
-
"cache",
|
|
450
|
-
"cache_break",
|
|
451
|
-
"service_tier"
|
|
452
|
-
],
|
|
453
|
-
"read_fragmentation_paths": [],
|
|
454
|
-
"grep_sweep_count": 0
|
|
455
|
-
},
|
|
456
|
-
{
|
|
457
|
-
"session": "sess_48676_1783069830186_1783069830428_0a5bfd5ec7bb592c4472884b507d14db",
|
|
458
|
-
"provider": "openai-oauth",
|
|
459
|
-
"model": "gpt-5.5",
|
|
460
|
-
"wall_ms": 74277,
|
|
461
|
-
"turns": 9,
|
|
462
|
-
"tool_calls": 14,
|
|
463
|
-
"tools_per_turn": 1.6,
|
|
464
|
-
"total_tool_ms": 2165,
|
|
465
|
-
"llm_stream_ms": 72331,
|
|
466
|
-
"cache_ratio": 0.7512216810492917,
|
|
467
|
-
"cached_tokens": 185856,
|
|
468
|
-
"prompt_tokens": 247405,
|
|
469
|
-
"uncached_tokens": 61549,
|
|
470
|
-
"output_tokens": 5622,
|
|
471
|
-
"cache_weighted_input_10": 80134.6,
|
|
472
|
-
"cache_weighted_input_25": 108013,
|
|
473
|
-
"prompt_growth": 44952,
|
|
474
|
-
"antipatterns": 1,
|
|
475
|
-
"issues": 15,
|
|
476
|
-
"issue_types": [
|
|
477
|
-
"cache",
|
|
478
|
-
"cache_break",
|
|
479
|
-
"cache_miss",
|
|
480
|
-
"readonly_stall",
|
|
481
|
-
"broad_tool_result",
|
|
482
|
-
"service_tier",
|
|
483
|
-
"tool_churn_cluster"
|
|
484
|
-
],
|
|
485
|
-
"read_fragmentation_paths": [],
|
|
486
|
-
"grep_sweep_count": 0
|
|
487
|
-
},
|
|
488
|
-
{
|
|
489
|
-
"session": "sess_36256_1783069847899_1783069848122_f54e2a821584c50ac4e979c50a601646",
|
|
490
|
-
"provider": "openai-oauth",
|
|
491
|
-
"model": "gpt-5.5",
|
|
492
|
-
"wall_ms": 79636,
|
|
493
|
-
"turns": 7,
|
|
494
|
-
"tool_calls": 6,
|
|
495
|
-
"tools_per_turn": 0.9,
|
|
496
|
-
"total_tool_ms": 493,
|
|
497
|
-
"llm_stream_ms": 78523,
|
|
498
|
-
"cache_ratio": 0.6874013304367773,
|
|
499
|
-
"cached_tokens": 101888,
|
|
500
|
-
"prompt_tokens": 148222,
|
|
501
|
-
"uncached_tokens": 46334,
|
|
502
|
-
"output_tokens": 6629,
|
|
503
|
-
"cache_weighted_input_10": 56522.8,
|
|
504
|
-
"cache_weighted_input_25": 71806,
|
|
505
|
-
"prompt_growth": 30328,
|
|
506
|
-
"antipatterns": 1,
|
|
507
|
-
"issues": 13,
|
|
508
|
-
"issue_types": [
|
|
509
|
-
"cache",
|
|
510
|
-
"cache_break",
|
|
511
|
-
"cache_miss",
|
|
512
|
-
"broad_tool_result",
|
|
513
|
-
"service_tier",
|
|
514
|
-
"missed_parallelism",
|
|
515
|
-
"tool_churn_cluster"
|
|
516
|
-
],
|
|
517
|
-
"read_fragmentation_paths": [],
|
|
518
|
-
"grep_sweep_count": 0
|
|
519
|
-
},
|
|
520
|
-
{
|
|
521
|
-
"session": "sess_18484_1783069914981_1783069915210_7f0733a8893fa79343fc8708019b0acd",
|
|
522
|
-
"provider": "openai-oauth",
|
|
523
|
-
"model": "gpt-5.5",
|
|
524
|
-
"wall_ms": 107937,
|
|
525
|
-
"turns": 14,
|
|
526
|
-
"tool_calls": 20,
|
|
527
|
-
"tools_per_turn": 1.4,
|
|
528
|
-
"total_tool_ms": 2983,
|
|
529
|
-
"llm_stream_ms": 105065,
|
|
530
|
-
"cache_ratio": 0.7753208965282127,
|
|
531
|
-
"cached_tokens": 293376,
|
|
532
|
-
"prompt_tokens": 378393,
|
|
533
|
-
"uncached_tokens": 85017,
|
|
534
|
-
"output_tokens": 9176,
|
|
535
|
-
"cache_weighted_input_10": 114354.6,
|
|
536
|
-
"cache_weighted_input_25": 158361,
|
|
537
|
-
"prompt_growth": 30327,
|
|
538
|
-
"antipatterns": 1,
|
|
539
|
-
"issues": 16,
|
|
540
|
-
"issue_types": [
|
|
541
|
-
"cache",
|
|
542
|
-
"cache_break",
|
|
543
|
-
"cache_miss",
|
|
544
|
-
"readonly_stall",
|
|
545
|
-
"service_tier",
|
|
546
|
-
"missed_parallelism",
|
|
547
|
-
"tool_churn_cluster"
|
|
548
|
-
],
|
|
549
|
-
"read_fragmentation_paths": [],
|
|
550
|
-
"grep_sweep_count": 0
|
|
551
|
-
},
|
|
552
|
-
{
|
|
553
|
-
"session": "sess_51948_1783069931009_1783069931236_da461bb4146fd67343d59e15f87c3b45",
|
|
554
|
-
"provider": "openai-oauth",
|
|
555
|
-
"model": "gpt-5.5",
|
|
556
|
-
"wall_ms": 59444,
|
|
557
|
-
"turns": 8,
|
|
558
|
-
"tool_calls": 11,
|
|
559
|
-
"tools_per_turn": 1.4,
|
|
560
|
-
"total_tool_ms": 917,
|
|
561
|
-
"llm_stream_ms": 58557,
|
|
562
|
-
"cache_ratio": 0.6344514338241921,
|
|
563
|
-
"cached_tokens": 140800,
|
|
564
|
-
"prompt_tokens": 221924,
|
|
565
|
-
"uncached_tokens": 81124,
|
|
566
|
-
"output_tokens": 4388,
|
|
567
|
-
"cache_weighted_input_10": 95204,
|
|
568
|
-
"cache_weighted_input_25": 116324,
|
|
569
|
-
"prompt_growth": 39319,
|
|
570
|
-
"antipatterns": 0,
|
|
571
|
-
"issues": 12,
|
|
572
|
-
"issue_types": [
|
|
573
|
-
"cache",
|
|
574
|
-
"cache_break",
|
|
575
|
-
"cache_miss",
|
|
576
|
-
"broad_tool_result",
|
|
577
|
-
"service_tier"
|
|
578
|
-
],
|
|
579
|
-
"read_fragmentation_paths": [],
|
|
580
|
-
"grep_sweep_count": 0
|
|
581
|
-
},
|
|
582
|
-
{
|
|
583
|
-
"session": "sess_46144_1783069938017_1783069938263_a5dae16078bdeb9673d932cc9b9574a5",
|
|
584
|
-
"provider": "openai-oauth",
|
|
585
|
-
"model": "gpt-5.5",
|
|
586
|
-
"wall_ms": 75840,
|
|
587
|
-
"turns": 5,
|
|
588
|
-
"tool_calls": 8,
|
|
589
|
-
"tools_per_turn": 1.6,
|
|
590
|
-
"total_tool_ms": 626,
|
|
591
|
-
"llm_stream_ms": 75046,
|
|
592
|
-
"cache_ratio": 0.4436709993912701,
|
|
593
|
-
"cached_tokens": 61952,
|
|
594
|
-
"prompt_tokens": 139635,
|
|
595
|
-
"uncached_tokens": 77683,
|
|
596
|
-
"output_tokens": 7952,
|
|
597
|
-
"cache_weighted_input_10": 83878.2,
|
|
598
|
-
"cache_weighted_input_25": 93171,
|
|
599
|
-
"prompt_growth": 35029,
|
|
600
|
-
"antipatterns": 0,
|
|
601
|
-
"issues": 8,
|
|
602
|
-
"issue_types": [
|
|
603
|
-
"cache",
|
|
604
|
-
"cache_break",
|
|
605
|
-
"cache_miss",
|
|
606
|
-
"service_tier"
|
|
607
|
-
],
|
|
608
|
-
"read_fragmentation_paths": [],
|
|
609
|
-
"grep_sweep_count": 0
|
|
610
|
-
},
|
|
611
|
-
{
|
|
612
|
-
"session": "sess_47516_1783070000924_1783070001163_6b4f4d171e302f017c024a040f0956a6",
|
|
613
|
-
"provider": "openai-oauth",
|
|
614
|
-
"model": "gpt-5.5",
|
|
615
|
-
"wall_ms": 109123,
|
|
616
|
-
"turns": 14,
|
|
617
|
-
"tool_calls": 21,
|
|
618
|
-
"tools_per_turn": 1.5,
|
|
619
|
-
"total_tool_ms": 2822,
|
|
620
|
-
"llm_stream_ms": 106210,
|
|
621
|
-
"cache_ratio": 0.8669324056243677,
|
|
622
|
-
"cached_tokens": 328192,
|
|
623
|
-
"prompt_tokens": 378567,
|
|
624
|
-
"uncached_tokens": 50375,
|
|
625
|
-
"output_tokens": 10990,
|
|
626
|
-
"cache_weighted_input_10": 83194.20000000001,
|
|
627
|
-
"cache_weighted_input_25": 132423,
|
|
628
|
-
"prompt_growth": 30286,
|
|
629
|
-
"antipatterns": 0,
|
|
630
|
-
"issues": 14,
|
|
631
|
-
"issue_types": [
|
|
632
|
-
"cache",
|
|
633
|
-
"cache_break",
|
|
634
|
-
"cache_miss",
|
|
635
|
-
"readonly_stall",
|
|
636
|
-
"service_tier"
|
|
637
|
-
],
|
|
638
|
-
"read_fragmentation_paths": [],
|
|
639
|
-
"grep_sweep_count": 0
|
|
640
|
-
},
|
|
641
|
-
{
|
|
642
|
-
"session": "sess_39060_1783070024383_1783070024607_f04e5c1bfb6beb27bc3ac82d8dbc7a46",
|
|
643
|
-
"provider": "openai-oauth",
|
|
644
|
-
"model": "gpt-5.5",
|
|
645
|
-
"wall_ms": 60530,
|
|
646
|
-
"turns": 6,
|
|
647
|
-
"tool_calls": 7,
|
|
648
|
-
"tools_per_turn": 1.2,
|
|
649
|
-
"total_tool_ms": 741,
|
|
650
|
-
"llm_stream_ms": 59738,
|
|
651
|
-
"cache_ratio": 0.6792775828126337,
|
|
652
|
-
"cached_tokens": 79360,
|
|
653
|
-
"prompt_tokens": 116830,
|
|
654
|
-
"uncached_tokens": 37470,
|
|
655
|
-
"output_tokens": 4737,
|
|
656
|
-
"cache_weighted_input_10": 45406,
|
|
657
|
-
"cache_weighted_input_25": 57310,
|
|
658
|
-
"prompt_growth": 26262,
|
|
659
|
-
"antipatterns": 1,
|
|
660
|
-
"issues": 9,
|
|
661
|
-
"issue_types": [
|
|
662
|
-
"cache",
|
|
663
|
-
"cache_break",
|
|
664
|
-
"service_tier",
|
|
665
|
-
"tool_churn_cluster"
|
|
666
|
-
],
|
|
667
|
-
"read_fragmentation_paths": [],
|
|
668
|
-
"grep_sweep_count": 0
|
|
669
|
-
}
|
|
670
|
-
]
|
|
671
|
-
}
|