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,114 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"round": "1",
|
|
3
|
-
"runner": "codex",
|
|
4
|
-
"opts": {
|
|
5
|
-
"provider": "openai-oauth",
|
|
6
|
-
"model": "gpt-5.5",
|
|
7
|
-
"effort": "high",
|
|
8
|
-
"fast": false,
|
|
9
|
-
"env": {}
|
|
10
|
-
},
|
|
11
|
-
"tasks": 3,
|
|
12
|
-
"completed": 3,
|
|
13
|
-
"completion_rate": 100,
|
|
14
|
-
"sessions": [
|
|
15
|
-
"019f24e5-98ee-7cf0-afb0-a1a80ac81702",
|
|
16
|
-
"019f24e5-98f3-7f12-9638-7a899028c7e3",
|
|
17
|
-
"019f24e5-98f3-7f22-902c-934f0f7cbfb0"
|
|
18
|
-
],
|
|
19
|
-
"results": [
|
|
20
|
-
{
|
|
21
|
-
"id": "review-session-runtime",
|
|
22
|
-
"agent": "reviewer",
|
|
23
|
-
"ok": true,
|
|
24
|
-
"ms": 300087,
|
|
25
|
-
"sessionId": "019f24e5-98ee-7cf0-afb0-a1a80ac81702",
|
|
26
|
-
"card": {
|
|
27
|
-
"session": "019f24e5-98ee-7cf0-afb0-a1a80ac81702",
|
|
28
|
-
"wall_ms": 300087,
|
|
29
|
-
"uncached_in": 157635,
|
|
30
|
-
"cached_in": 1071360,
|
|
31
|
-
"out_tokens": 8581,
|
|
32
|
-
"cache_ratio": 0.872,
|
|
33
|
-
"completed": 1
|
|
34
|
-
},
|
|
35
|
-
"output": "- High: `src/session-runtime/plugin-mcp.mjs:40` project `.mcp.json` stdio entries can set `cwd` to `..` or an absolute path outside the project, bypassing the stricter project-root guard in `normalizeMcpServerInput` and letting repo-local MCP config run with access scoped outside the opened repo.\n- Medium: `src/session-runtime/workflow.mjs:276` invalid persisted `effort` values throw from read paths like `summarizeWorkflowRoutes`/`agentRouteFromConfig` instead of being ignored, so one bad config entry can break onboarding status or agent listing.\n- Low: `src/session-runtime/provider-models.mjs:42` cached `{id, provider}` fallback metadata is returned before honoring `allowFetch`, so a prior non-fetch lookup prevents a later forced lookup from ever retrieving real model capabilities.\n\nVerdict: no broken imports found, but fix the project MCP cwd escape before trusting repo-local MCP configs."
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"id": "review-channels-lib",
|
|
39
|
-
"agent": "reviewer",
|
|
40
|
-
"ok": true,
|
|
41
|
-
"ms": 172813,
|
|
42
|
-
"sessionId": "019f24e5-98f3-7f12-9638-7a899028c7e3",
|
|
43
|
-
"card": {
|
|
44
|
-
"session": "019f24e5-98f3-7f12-9638-7a899028c7e3",
|
|
45
|
-
"wall_ms": 172813,
|
|
46
|
-
"uncached_in": 136264,
|
|
47
|
-
"cached_in": 1237376,
|
|
48
|
-
"out_tokens": 8502,
|
|
49
|
-
"cache_ratio": 0.901,
|
|
50
|
-
"completed": 1
|
|
51
|
-
},
|
|
52
|
-
"output": "- High `src/runtime/channels/lib/webhook/deliveries.mjs:255`: delivery rows are appended asynchronously but the in-memory dedup state advances immediately, so crashes, append failures, out-of-order status writes, or compaction can lose/reorder `received/pending/done` rows and allow duplicate webhook dispatch or permanent dedup blockage.\n- High `src/runtime/channels/lib/event-queue.mjs:239`: queued events are moved to processed at `:241` after a fire-and-forget `injectFn`; if parent IPC drops/fails, the claimed event is acknowledged anyway and the message is lost.\n- Medium `src/runtime/channels/lib/output-forwarder.mjs:316`: actual backend send does not re-check `_isOwner()` at send time, so an ownership handoff during an in-flight drain can let the old owner send while the new owner tails the same transcript, causing double-forwarding.\n- Medium `src/runtime/channels/lib/output-forwarder.mjs:690`: `closeWatcher()` clears `sendRetryTimer` but leaves queued failed items in `finalLane/streamLane`, so transcript rebind/watch error during backoff can strand unsent messages until unrelated new activity kicks the drain.\n- Medium `src/runtime/channels/lib/webhook.mjs:530`: `startNgrok()` schedules `waitAndStart` timers that `stop()` at `:585` never cancels, so reload/stop during the delay can spawn a stale ngrok process after shutdown.\n- Low `src/runtime/channels/lib/inbound-routing.mjs:35`: stale dedup marker files are treated as non-duplicates but never refreshed/replaced, so cross-process duplicate inbound messages after TTL can bypass dedup repeatedly.\n\nVerdict: Not clean yet; I found real message-loss, double-forwarding, and lifecycle leak risks worth fixing before shipping."
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"id": "review-compact",
|
|
56
|
-
"agent": "reviewer",
|
|
57
|
-
"ok": true,
|
|
58
|
-
"ms": 140945,
|
|
59
|
-
"sessionId": "019f24e5-98f3-7f22-902c-934f0f7cbfb0",
|
|
60
|
-
"card": {
|
|
61
|
-
"session": "019f24e5-98f3-7f22-902c-934f0f7cbfb0",
|
|
62
|
-
"wall_ms": 140945,
|
|
63
|
-
"uncached_in": 102061,
|
|
64
|
-
"cached_in": 416512,
|
|
65
|
-
"out_tokens": 7120,
|
|
66
|
-
"cache_ratio": 0.803,
|
|
67
|
-
"completed": 1
|
|
68
|
-
},
|
|
69
|
-
"output": "- High `src/runtime/agent/orchestrator/session/compact/engine.mjs:588` - `recallTailStartIndex()` relies on object identity, so when `fitSingleRecallTurnToCap()` clones/truncates the first tail user message, `indexOf()` fails and the fallback can misplace the tail, duplicating summarized user content and dropping/reordering recent messages.\n- High `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:269` - `redactMessageToolCallSecrets()` returns unchanged unless `m.toolCalls` exists, leaving Anthropic-style `content` / `assistantBlocks` `tool_use` inputs unredacted in preserved tails.\n- High `src/runtime/agent/orchestrator/session/compact/text-utils.mjs:12` - the sensitive-key regex misses common camelCase token keys like `accessToken`, `idToken`, and `sessionToken`, so those secrets survive both prompt summaries and verbatim tail redaction.\n- Medium `src/runtime/agent/orchestrator/session/compact/budget.mjs:79` - `drainSessionCycle1()` swallows `cycle1` errors and returns a “successful” partial drain, so callers can proceed with raw pending rows while diagnostics lose the actual failure.\n- Medium `src/runtime/agent/orchestrator/session/compact/summary-schema.mjs:68` - semantic schema validation only checks top-level `##` anchors, while `truncateSummaryBySections()` can drop required `### Done/In Progress/Blocked` progress structure and still treat the summary as valid.\n\nVerdict: Needs fixes before compaction can be considered secure and loss-safe."
|
|
70
|
-
}
|
|
71
|
-
],
|
|
72
|
-
"task_complete": true,
|
|
73
|
-
"task_errors": [],
|
|
74
|
-
"score_complete": true,
|
|
75
|
-
"score_errors": [],
|
|
76
|
-
"group": {
|
|
77
|
-
"n": 3,
|
|
78
|
-
"wall_ms": 204615,
|
|
79
|
-
"uncached_in": 131986.7,
|
|
80
|
-
"cached_in": 908416,
|
|
81
|
-
"out_tokens": 8067.7,
|
|
82
|
-
"cache_ratio": 0.9,
|
|
83
|
-
"completed": 1
|
|
84
|
-
},
|
|
85
|
-
"cards": [
|
|
86
|
-
{
|
|
87
|
-
"session": "019f24e5-98ee-7cf0-afb0-a1a80ac81702",
|
|
88
|
-
"wall_ms": 300087,
|
|
89
|
-
"uncached_in": 157635,
|
|
90
|
-
"cached_in": 1071360,
|
|
91
|
-
"out_tokens": 8581,
|
|
92
|
-
"cache_ratio": 0.872,
|
|
93
|
-
"completed": 1
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
"session": "019f24e5-98f3-7f12-9638-7a899028c7e3",
|
|
97
|
-
"wall_ms": 172813,
|
|
98
|
-
"uncached_in": 136264,
|
|
99
|
-
"cached_in": 1237376,
|
|
100
|
-
"out_tokens": 8502,
|
|
101
|
-
"cache_ratio": 0.901,
|
|
102
|
-
"completed": 1
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
"session": "019f24e5-98f3-7f22-902c-934f0f7cbfb0",
|
|
106
|
-
"wall_ms": 140945,
|
|
107
|
-
"uncached_in": 102061,
|
|
108
|
-
"cached_in": 416512,
|
|
109
|
-
"out_tokens": 7120,
|
|
110
|
-
"cache_ratio": 0.803,
|
|
111
|
-
"completed": 1
|
|
112
|
-
}
|
|
113
|
-
]
|
|
114
|
-
}
|
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"round": "3",
|
|
3
|
-
"runner": "lead",
|
|
4
|
-
"opts": {
|
|
5
|
-
"provider": null,
|
|
6
|
-
"model": null,
|
|
7
|
-
"effort": null,
|
|
8
|
-
"fast": false,
|
|
9
|
-
"env": {
|
|
10
|
-
"MIXDOG_DATA_DIR": "C:\\Users\\tempe\\.mixdog\\bench-data"
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
"tasks": 3,
|
|
14
|
-
"completed": 3,
|
|
15
|
-
"completion_rate": 100,
|
|
16
|
-
"sessions": [
|
|
17
|
-
"sess_44376_1783036165596_1783036165772_a77d5225c11eaee87b9509c9611c40c3",
|
|
18
|
-
"sess_53612_1783036165611_1783036165786_6799f6b975f8c1531cf1766d5802f647",
|
|
19
|
-
"sess_40692_1783036165624_1783036165796_a84440b9682c554ba565b3270485c54d"
|
|
20
|
-
],
|
|
21
|
-
"results": [
|
|
22
|
-
{
|
|
23
|
-
"id": "lead-review-session-runtime",
|
|
24
|
-
"agent": "reviewer",
|
|
25
|
-
"ok": true,
|
|
26
|
-
"ms": 396471,
|
|
27
|
-
"sessionId": "sess_44376_1783036165596_1783036165772_a77d5225c11eaee87b9509c9611c40c3",
|
|
28
|
-
"output": "sessionId: sess_44376_1783036165596_1783036165772_a77d5225c11eaee87b9509c9611c40c3\n4개 리뷰 모두 완료. 보고 전에 핵심 발견들을 직접 교차 검증하겠습니다.리뷰 4건을 모두 회수하고 핵심 주장(특히 High 2건)을 직접 교차 검증했습니다. review-mcp의 High 1건은 오탐으로 판정해 제외했습니다.\n\n**발견 사항 (심각도순)**\n\n- **High** `src/session-runtime/provider-usage.mjs:54` — in-flight `providerSetupPromise`가 `invalidateProviderCaches()` 이후에도 `.then`에서 `providerSetupCache`를 재기록해, 로그인/키 변경 직후 무효화된 provider·auth 스냅샷이 되살아나는 레이스 (provider-models의 `providerModelsLoadSeq` 같은 시퀀스 가드 부재, `mixdog-session-runtime.mjs:1050-1062`에서 확인).\n\n- **Medium** `src/session-runtime/provider-models.mjs:211` — `collectSearchProviderModels` force 경로가 시퀀스 가드 없이 `searchProviderModelsCache`를 덮어써, 무효화 이전에 시작된 새로고침이 stale 검색 모델 목록을 복원할 수 있음 (같은 파일 227행의 가드 패턴과 비대칭).\n\n- **Medium** `src/session-runtime/config-helpers.mjs:49,66` — preset에 `provider`가 없으면 `resolveDefaultProvider(config)` 대신 하드코딩 `DEFAULT_PROVIDER`('anthropic-oauth')로 떨어져, `config.defaultProvider` 설정을 무시하고 잘못된 provider로 라우팅 (79행의 비-preset 경로와 모순).\n\n- **Low** `src/session-runtime/effort.mjs:87` — reasoning 메타데이터가 전혀 없는 모델이 provider 전체 effort 옵션으로 폴백해, 비-reasoning 모델(quick/static 행)에 effort 선택·저장이 노출됨.\n\n**기각한 보고**: `native-search.mjs:207`의 \"openai nativeTools 무시\" High는 오탐 — `openai`는 registry에서 `OpenAIDirectProvider`(openai-ws.mjs)로 라우팅되고, 이는 `buildRequestBody`(openai-oauth.mjs:546-550)를 통해 `nativeTools`를 전달하며, compat 프리셋 provider들은 애초에 `SEARCH_CAPABLE_PROVIDERS`에 없습니다. tool-catalog/workflow/warmup-schedulers/mcp 계열 파일들은 깨진 import·미정의 식별자 없이 깨끗했습니다.\n\n**평결**: 깨진 import나 데이터 손실 경로는 없으며, 실질 리스크는 캐시 무효화 레이스 1건(High)과 폴백 불일치 2건 수준입니다.",
|
|
29
|
-
"card": {
|
|
30
|
-
"session": "sess_44376_1783036165596_1783036165772_a77d5225c11eaee87b9509c9611c40c3",
|
|
31
|
-
"provider": "anthropic-oauth",
|
|
32
|
-
"model": "claude-fable-5",
|
|
33
|
-
"wall_ms": 385974,
|
|
34
|
-
"turns": 72,
|
|
35
|
-
"tool_calls": 99,
|
|
36
|
-
"tools_per_turn": 1.4,
|
|
37
|
-
"total_tool_ms": 5723,
|
|
38
|
-
"llm_stream_ms": 625711,
|
|
39
|
-
"cache_ratio": 0.797586432611301,
|
|
40
|
-
"cached_tokens": 1938608,
|
|
41
|
-
"prompt_tokens": 2430593,
|
|
42
|
-
"uncached_tokens": 116796,
|
|
43
|
-
"output_tokens": 12031,
|
|
44
|
-
"cache_weighted_input_10": 310656.80000000005,
|
|
45
|
-
"cache_weighted_input_25": 601448,
|
|
46
|
-
"prompt_growth": 78094,
|
|
47
|
-
"antipatterns": 2,
|
|
48
|
-
"issues": 23,
|
|
49
|
-
"issue_types": [
|
|
50
|
-
"readonly_stall",
|
|
51
|
-
"cache",
|
|
52
|
-
"cache_break",
|
|
53
|
-
"tool_error",
|
|
54
|
-
"broad_tool_result",
|
|
55
|
-
"service_tier",
|
|
56
|
-
"missed_parallelism",
|
|
57
|
-
"tool_churn_cluster"
|
|
58
|
-
],
|
|
59
|
-
"read_fragmentation_paths": [],
|
|
60
|
-
"grep_sweep_count": 0
|
|
61
|
-
}
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"id": "lead-review-channels-lib",
|
|
65
|
-
"agent": "reviewer",
|
|
66
|
-
"ok": true,
|
|
67
|
-
"ms": 287195,
|
|
68
|
-
"sessionId": "sess_53612_1783036165611_1783036165786_6799f6b975f8c1531cf1766d5802f647",
|
|
69
|
-
"output": "sessionId: sess_53612_1783036165611_1783036165786_6799f6b975f8c1531cf1766d5802f647\n핵심 High 항목들을 직접 교차 검증하겠습니다.4개 리뷰 스코프 결과를 받아 High 항목을 코드로 직접 교차 검증했습니다(event-queue 배칭, output-forwarder drain, webhook fail-open, PowerShell 인젝션, cron 덮어쓰기 모두 확인됨).\n\n**High**\n- `event-queue.mjs:198` — 저순위 배칭이 `item.name`만으로 그룹핑 후 `claimedPairs[0].item`(:219)으로 발송해, 같은 이름의 다른 채널/지시 이벤트가 첫 채널로 병합·오배송되고 나머지는 유실됨.\n- `output-forwarder.mjs:575` — `forwardFinalText()`가 finally에서 `sending`만 해제하고 drain을 재기동하지 않아, 전송 중 큐잉된 항목의 `_kickDrain()`이 :436에서 no-op 되어 다음 활동 전까지 좌초됨.\n- `webhook.mjs:338` — `secret`/`parser` 없는 config 등록 엔드포인트는 경고만 남기고 통과(fail-open)해 무서명 POST가 특권 디스패치로 주입 가능.\n- `webhook/deliveries.mjs:255` — 전송 dedup 상태가 durable write 전에 성공 처리되어, flush 전 크래시 시 재시작 후 재배달/이중 디스패치 가능.\n- `runtime-paths.mjs:247` — UI-heartbeat-stale 판정 시 `prev=null`로 처리돼 좀비 워커가 `ui_heartbeat_at` 없이 오너 상태를 즉시 재게시, 테이크오버를 차단할 수 있음.\n- `runtime-paths.mjs:73` — 오너 생존 판정이 PID만 신뢰해 PID 재사용 시 stale `active-instance.json`이 무기한 고정되어 인수 불가.\n- `voice-runtime-fetcher.mjs:432` — PowerShell `-Command`에 JSON 이중따옴표 경로를 삽입해 경로 내 `$()`/백틱이 설치 중 명령 실행으로 이어지는 인젝션.\n- `voice-runtime-fetcher.mjs:174` — 락 해제가 `lockPath`를 무조건 삭제해, age 기반 재클레임 후 구 설치자가 새 오너의 락을 지워 동시 설치/손상 허용.\n- `scheduler.mjs:368` — 중복 스케줄 이름이 `cronJobs` 엔트리를 덮어써 이전 `ScheduledTask`가 누수, `destroyCronJobs()` 후에도 이중 발화.\n\n**Medium**\n- `event-queue.mjs:77` — 시작 시 `in-progress/` 전체를 나이/오너 확인 없이 재큐잉해, 핸드오프 중 구 오너가 처리 중인 파일이 중복 주입될 수 있음.\n- `backend-dispatch.mjs:17` — `dispatchReply()`가 부분 전송 실패 시 `resumeToken`을 버려, 재시도 때 이미 전송된 청크를 재발송(이중 게시).\n- `webhook.mjs:139` — 요청 바디 스트림에 `error`/`aborted` 핸들러가 없어 클라이언트 리셋 시 요청이 미해결로 남거나 스트림 에러가 unhandled로 표면화.\n- `session-control.mjs:15` — 동시 `controlClaudeSession()` 호출이 하나의 컨트롤 파일을 공유해 나중 명령이 미판독 명령을 덮어씀(첫 호출 타임아웃/유실).\n- `status-snapshot.mjs:218` — `stopSnapshotWriter()`가 전역 스냅샷을 무조건 unlink해 핸드오프 중 구 오너가 새 오너의 스냅샷을 삭제.\n- `session-discovery.mjs:26` — parent PID 캐시가 만료 없이 PID만으로 키잉되어 PID 재사용 시 stale 세션/트랜스크립트에 바인딩.\n- `webhook/signature.mjs:32` — Stripe 검증이 첫 `v1=` 서명만 확인해 시크릿 로테이션 중 유효 전송이 거부됨.\n- `whisper-server.m",
|
|
70
|
-
"card": {
|
|
71
|
-
"session": "sess_53612_1783036165611_1783036165786_6799f6b975f8c1531cf1766d5802f647",
|
|
72
|
-
"provider": "anthropic-oauth",
|
|
73
|
-
"model": "claude-fable-5",
|
|
74
|
-
"wall_ms": 276579,
|
|
75
|
-
"turns": 49,
|
|
76
|
-
"tool_calls": 67,
|
|
77
|
-
"tools_per_turn": 1.4,
|
|
78
|
-
"total_tool_ms": 4244,
|
|
79
|
-
"llm_stream_ms": 672149,
|
|
80
|
-
"cache_ratio": 0.6616259058956849,
|
|
81
|
-
"cached_tokens": 1003052,
|
|
82
|
-
"prompt_tokens": 1516041,
|
|
83
|
-
"uncached_tokens": 139818,
|
|
84
|
-
"output_tokens": 14174,
|
|
85
|
-
"cache_weighted_input_10": 240123.2,
|
|
86
|
-
"cache_weighted_input_25": 390581,
|
|
87
|
-
"prompt_growth": 75338,
|
|
88
|
-
"antipatterns": 1,
|
|
89
|
-
"issues": 16,
|
|
90
|
-
"issue_types": [
|
|
91
|
-
"cache",
|
|
92
|
-
"cache_break",
|
|
93
|
-
"broad_tool_result",
|
|
94
|
-
"readonly_stall",
|
|
95
|
-
"service_tier",
|
|
96
|
-
"missed_parallelism",
|
|
97
|
-
"tool_churn_cluster"
|
|
98
|
-
],
|
|
99
|
-
"read_fragmentation_paths": [],
|
|
100
|
-
"grep_sweep_count": 0
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
"id": "lead-review-compact",
|
|
105
|
-
"agent": "reviewer",
|
|
106
|
-
"ok": true,
|
|
107
|
-
"ms": 426500,
|
|
108
|
-
"sessionId": "sess_40692_1783036165624_1783036165796_a84440b9682c554ba565b3270485c54d",
|
|
109
|
-
"output": "sessionId: sess_40692_1783036165624_1783036165796_a84440b9682c554ba565b3270485c54d\n세 결과를 받았으니 핵심 앵커들을 직접 확인해 검증하겠습니다.주요 주장들을 앵커에서 직접 검증하겠습니다.리뷰 완료 — 에이전트 결과를 앵커에서 직접 검증했고, 아래는 확인된 이슈만 심각도순으로 정리한 것입니다.\n\n- **High** `text-utils.mjs:295` — `redactMessageToolCallSecrets`가 `m.toolCalls`만 스크럽하고 content 배열의 `tool_use` 블록 `input`은 건너뜀(해당 형태 존재는 `context-utils.mjs:551` 주석이 확인) → 보존 tail에 시크릿이 미리댁션 상태로 잔존.\n\n- **High** `engine.mjs:93` — `splitTurnStartIndexForBudget`가 tool-role 인덱스를 컷 지점으로 반환 가능(비교: `findValidCutIndices`는 tool 제외) → 고아 tool result가 head에서도 tail에서도 빠져 무음 손실.\n\n- **High** `text-utils.mjs:29` — camel 정규식의 `s?$`가 주석(\"`maxOutputTokens`는 매치 안 됨\")과 모순, `maxOutputTokens`/`budgetTokens`/`completionTokens`가 `[redacted]`로 치환돼 보존 tool-call 인자가 손상됨.\n\n- **Medium** `summary.mjs:427` (동일 패턴 `:577`) — prior 요약을 remainingTokens 전체로 먼저 이진탐색 최대화한 뒤 recall을 끼워 넣어, 토큰 압박 시 신규 recall 블록이 전부 탈락하고 stale prior만 남음.\n\n- **Medium** `budget.mjs:203` — `pruneToolOutputText`가 maxChars 무시하고 고정 1000/600 슬라이스 사용; `maxToolOutputChars < ~1700`이면 프루닝 결과가 원본보다 커져 예산 회복 실패(head/tail 중복 포함).\n\n- **Medium** `engine.mjs:588` — `recallTailStartIndex`가 객체 동일성(`indexOf`) 의존, fitting이 첫 tail 메시지를 클론하면 `live.length - tail.length` 폴백이 잘못된 경계를 선택해 head/tail 분할이 어긋남.\n\n- **Low** `summary-schema.mjs:71` — 검증이 최상위 `##` 앵커만 확인해 `### Done/In Progress/Blocked` 누락이 통과하고, `:309`의 섹션 중간절단이 서브헤딩을 잘라도 여전히 유효 판정됨.\n\n- **Low** `summary.mjs:400` — `stripNestedSummaryHeaderLines`가 `:318`의 `semantic=true provider=... model=...` 라인을 안 지워 반복 컴팩션 시 합성 메타데이터가 prior 본문에 누적.\n\n- **Low** `text-utils.mjs:118` — `truncateMiddle`이 UTF-16 코드유닛 단위로 잘라 서로게이트 쌍 분리 가능(같은 패턴 `budget.mjs:203-204`).\n\n핵심 컴팩션 경로 자체는 견고하나, 시크릿 리댁션 우회와 턴 분할 시 tool result 무음 손실 두 건은 실사용 전 수정이 필요합니다.",
|
|
110
|
-
"card": {
|
|
111
|
-
"session": "sess_40692_1783036165624_1783036165796_a84440b9682c554ba565b3270485c54d",
|
|
112
|
-
"provider": "anthropic-oauth",
|
|
113
|
-
"model": "claude-fable-5",
|
|
114
|
-
"wall_ms": 416022,
|
|
115
|
-
"turns": 33,
|
|
116
|
-
"tool_calls": 45,
|
|
117
|
-
"tools_per_turn": 1.4,
|
|
118
|
-
"total_tool_ms": 1888,
|
|
119
|
-
"llm_stream_ms": 569465,
|
|
120
|
-
"cache_ratio": 0.767026954989235,
|
|
121
|
-
"cached_tokens": 667631,
|
|
122
|
-
"prompt_tokens": 870414,
|
|
123
|
-
"uncached_tokens": 53129,
|
|
124
|
-
"output_tokens": 10398,
|
|
125
|
-
"cache_weighted_input_10": 119892.1,
|
|
126
|
-
"cache_weighted_input_25": 220036.75,
|
|
127
|
-
"prompt_growth": 49784,
|
|
128
|
-
"antipatterns": 2,
|
|
129
|
-
"issues": 12,
|
|
130
|
-
"issue_types": [
|
|
131
|
-
"cache",
|
|
132
|
-
"cache_break",
|
|
133
|
-
"broad_tool_result",
|
|
134
|
-
"readonly_stall",
|
|
135
|
-
"service_tier",
|
|
136
|
-
"duplicate_tool",
|
|
137
|
-
"missed_parallelism",
|
|
138
|
-
"tool_churn_cluster"
|
|
139
|
-
],
|
|
140
|
-
"read_fragmentation_paths": [],
|
|
141
|
-
"grep_sweep_count": 0
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
],
|
|
145
|
-
"task_complete": true,
|
|
146
|
-
"task_errors": [],
|
|
147
|
-
"score_complete": true,
|
|
148
|
-
"score_errors": [],
|
|
149
|
-
"group": {
|
|
150
|
-
"n": 3,
|
|
151
|
-
"wall_ms": 359525,
|
|
152
|
-
"turns": 51.3,
|
|
153
|
-
"tool_calls": 70.3,
|
|
154
|
-
"tools_per_turn": 1.4,
|
|
155
|
-
"total_tool_ms": 3951.7,
|
|
156
|
-
"llm_stream_ms": 622441.7,
|
|
157
|
-
"cache_ratio": 0.7,
|
|
158
|
-
"cached_tokens": 1203097,
|
|
159
|
-
"prompt_tokens": 1605682.7,
|
|
160
|
-
"uncached_tokens": 103247.7,
|
|
161
|
-
"output_tokens": 12201,
|
|
162
|
-
"cache_weighted_input_10": 223557.4,
|
|
163
|
-
"cache_weighted_input_25": 404021.9,
|
|
164
|
-
"prompt_growth": 67738.7,
|
|
165
|
-
"antipatterns": 1.7,
|
|
166
|
-
"issues": 17,
|
|
167
|
-
"grep_sweep_count": 0
|
|
168
|
-
},
|
|
169
|
-
"cards": [
|
|
170
|
-
{
|
|
171
|
-
"session": "sess_44376_1783036165596_1783036165772_a77d5225c11eaee87b9509c9611c40c3",
|
|
172
|
-
"provider": "anthropic-oauth",
|
|
173
|
-
"model": "claude-fable-5",
|
|
174
|
-
"wall_ms": 385974,
|
|
175
|
-
"turns": 72,
|
|
176
|
-
"tool_calls": 99,
|
|
177
|
-
"tools_per_turn": 1.4,
|
|
178
|
-
"total_tool_ms": 5723,
|
|
179
|
-
"llm_stream_ms": 625711,
|
|
180
|
-
"cache_ratio": 0.797586432611301,
|
|
181
|
-
"cached_tokens": 1938608,
|
|
182
|
-
"prompt_tokens": 2430593,
|
|
183
|
-
"uncached_tokens": 116796,
|
|
184
|
-
"output_tokens": 12031,
|
|
185
|
-
"cache_weighted_input_10": 310656.80000000005,
|
|
186
|
-
"cache_weighted_input_25": 601448,
|
|
187
|
-
"prompt_growth": 78094,
|
|
188
|
-
"antipatterns": 2,
|
|
189
|
-
"issues": 23,
|
|
190
|
-
"issue_types": [
|
|
191
|
-
"readonly_stall",
|
|
192
|
-
"cache",
|
|
193
|
-
"cache_break",
|
|
194
|
-
"tool_error",
|
|
195
|
-
"broad_tool_result",
|
|
196
|
-
"service_tier",
|
|
197
|
-
"missed_parallelism",
|
|
198
|
-
"tool_churn_cluster"
|
|
199
|
-
],
|
|
200
|
-
"read_fragmentation_paths": [],
|
|
201
|
-
"grep_sweep_count": 0
|
|
202
|
-
},
|
|
203
|
-
{
|
|
204
|
-
"session": "sess_53612_1783036165611_1783036165786_6799f6b975f8c1531cf1766d5802f647",
|
|
205
|
-
"provider": "anthropic-oauth",
|
|
206
|
-
"model": "claude-fable-5",
|
|
207
|
-
"wall_ms": 276579,
|
|
208
|
-
"turns": 49,
|
|
209
|
-
"tool_calls": 67,
|
|
210
|
-
"tools_per_turn": 1.4,
|
|
211
|
-
"total_tool_ms": 4244,
|
|
212
|
-
"llm_stream_ms": 672149,
|
|
213
|
-
"cache_ratio": 0.6616259058956849,
|
|
214
|
-
"cached_tokens": 1003052,
|
|
215
|
-
"prompt_tokens": 1516041,
|
|
216
|
-
"uncached_tokens": 139818,
|
|
217
|
-
"output_tokens": 14174,
|
|
218
|
-
"cache_weighted_input_10": 240123.2,
|
|
219
|
-
"cache_weighted_input_25": 390581,
|
|
220
|
-
"prompt_growth": 75338,
|
|
221
|
-
"antipatterns": 1,
|
|
222
|
-
"issues": 16,
|
|
223
|
-
"issue_types": [
|
|
224
|
-
"cache",
|
|
225
|
-
"cache_break",
|
|
226
|
-
"broad_tool_result",
|
|
227
|
-
"readonly_stall",
|
|
228
|
-
"service_tier",
|
|
229
|
-
"missed_parallelism",
|
|
230
|
-
"tool_churn_cluster"
|
|
231
|
-
],
|
|
232
|
-
"read_fragmentation_paths": [],
|
|
233
|
-
"grep_sweep_count": 0
|
|
234
|
-
},
|
|
235
|
-
{
|
|
236
|
-
"session": "sess_40692_1783036165624_1783036165796_a84440b9682c554ba565b3270485c54d",
|
|
237
|
-
"provider": "anthropic-oauth",
|
|
238
|
-
"model": "claude-fable-5",
|
|
239
|
-
"wall_ms": 416022,
|
|
240
|
-
"turns": 33,
|
|
241
|
-
"tool_calls": 45,
|
|
242
|
-
"tools_per_turn": 1.4,
|
|
243
|
-
"total_tool_ms": 1888,
|
|
244
|
-
"llm_stream_ms": 569465,
|
|
245
|
-
"cache_ratio": 0.767026954989235,
|
|
246
|
-
"cached_tokens": 667631,
|
|
247
|
-
"prompt_tokens": 870414,
|
|
248
|
-
"uncached_tokens": 53129,
|
|
249
|
-
"output_tokens": 10398,
|
|
250
|
-
"cache_weighted_input_10": 119892.1,
|
|
251
|
-
"cache_weighted_input_25": 220036.75,
|
|
252
|
-
"prompt_growth": 49784,
|
|
253
|
-
"antipatterns": 2,
|
|
254
|
-
"issues": 12,
|
|
255
|
-
"issue_types": [
|
|
256
|
-
"cache",
|
|
257
|
-
"cache_break",
|
|
258
|
-
"broad_tool_result",
|
|
259
|
-
"readonly_stall",
|
|
260
|
-
"service_tier",
|
|
261
|
-
"duplicate_tool",
|
|
262
|
-
"missed_parallelism",
|
|
263
|
-
"tool_churn_cluster"
|
|
264
|
-
],
|
|
265
|
-
"read_fragmentation_paths": [],
|
|
266
|
-
"grep_sweep_count": 0
|
|
267
|
-
}
|
|
268
|
-
]
|
|
269
|
-
}
|
|
@@ -1,269 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"round": "2",
|
|
3
|
-
"runner": "lead",
|
|
4
|
-
"opts": {
|
|
5
|
-
"provider": null,
|
|
6
|
-
"model": null,
|
|
7
|
-
"effort": null,
|
|
8
|
-
"fast": false,
|
|
9
|
-
"env": {
|
|
10
|
-
"MIXDOG_DATA_DIR": "C:\\Users\\tempe\\.mixdog\\bench-data"
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
"tasks": 3,
|
|
14
|
-
"completed": 3,
|
|
15
|
-
"completion_rate": 100,
|
|
16
|
-
"sessions": [
|
|
17
|
-
"sess_53852_1783031527627_1783031527803_63b5825893a6df65a914d155c7e3b5f6",
|
|
18
|
-
"sess_58092_1783031527640_1783031527814_6d4d5de210251154f047e52f1dce8d64",
|
|
19
|
-
"sess_59856_1783031527716_1783031527890_0e354b9f1f4e092cf6c6fadc6d121893"
|
|
20
|
-
],
|
|
21
|
-
"results": [
|
|
22
|
-
{
|
|
23
|
-
"id": "lead-review-session-runtime",
|
|
24
|
-
"agent": "reviewer",
|
|
25
|
-
"ok": true,
|
|
26
|
-
"ms": 707369,
|
|
27
|
-
"sessionId": "sess_53852_1783031527627_1783031527803_63b5825893a6df65a914d155c7e3b5f6",
|
|
28
|
-
"output": "sessionId: sess_53852_1783031527627_1783031527803_63b5825893a6df65a914d155c7e3b5f6\n결과가 모두 모였습니다. 핵심 발견을 직접 교차 확인하겠습니다.모든 스코프 리뷰가 끝났고, 보고된 발견들을 코드에서 직접 교차 확인했습니다. 결과는 아래와 같습니다.\n\n**High**\n- `src/session-runtime/model-capabilities.mjs:115-118` — `saveModelSettings`가 `route.effort` 부재/null 시 저장된 effort를 삭제하고 `route.fast` 부재 시 `fast=false`를 강제 기록해, 부분 route 저장이 기존 per-model 설정을 지움 (데이터 손실 경로, 코드로 확인).\n\n**Medium**\n- `src/session-runtime/config-lifecycle.mjs:190` — `reloadFullConfig`가 config 저장 debounce만 flush하고 outputStyle/backend debounce는 방치해, 디스크의 stale 값으로 in-memory 상태가 일시 회귀하는 레이스.\n- `src/session-runtime/provider-usage.mjs:51` — `cachedProviderSetup({force:true})`가 진행 중인 비강제 setup promise를 그대로 반환해 강제 갱신이 stale 결과를 캐시하는 레이스.\n- `src/session-runtime/workflow.mjs:276` — `normalizeWorkflowRoute`가 잘못 저장된 `effort` 값에서 `normalizeEffortInput` 예외를 그대로 던짐 (`normalizeSearchRouteConfig`는 :252-255에서 try/catch로 방어하는 것과 대조; route 해석 전체가 중단됨).\n- `src/session-runtime/config-lifecycle.mjs:84` — `adoptConfig`가 `.effective` 대신 `.command`만 전달해 `MIXDOG_SHELL` 환경변수 전용 쉘 설정이 무시됨.\n- `src/session-runtime/config-helpers.mjs:49,66` — preset의 provider 부재 시 `resolveDefaultProvider(config)` 대신 하드코딩 `DEFAULT_PROVIDER`로 폴백해 `config.defaultProvider`가 무시됨 (:79의 올바른 경로와 불일치).\n- `src/session-runtime/model-capabilities.mjs:93-97` — 카탈로그의 `supportsWebSearch:true`가 OpenAI 헬퍼(:37)에서만 반영되고 xAI/Gemini/Anthropic 경로에서는 무시되어 검색 가능 모델이 휴리스틱에 걸러짐.\n\n**Low**\n- `src/session-runtime/mcp-glue.mjs:161` — Windows에서 MCP stdio `cwd` 포함 검사가 대소문자 구분 `startsWith`라 드라이브/경로 케이싱이 다른 정상 cwd를 거부.\n\n깨진 import나 미정의 식별자는 4개 스코프 모두에서 발견되지 않았습니다.\n\n**판정: 치명적 결함은 없으나, 설정 유실 1건(High)과 debounce/캐시 레이스 및 폴백 불일치 6건(Medium)은 수정 가치가 있는 실질 버그입니다.**",
|
|
29
|
-
"card": {
|
|
30
|
-
"session": "sess_53852_1783031527627_1783031527803_63b5825893a6df65a914d155c7e3b5f6",
|
|
31
|
-
"provider": "anthropic-oauth",
|
|
32
|
-
"model": "claude-fable-5",
|
|
33
|
-
"wall_ms": 405393,
|
|
34
|
-
"turns": 51,
|
|
35
|
-
"tool_calls": 62,
|
|
36
|
-
"tools_per_turn": 1.2,
|
|
37
|
-
"total_tool_ms": 2829,
|
|
38
|
-
"llm_stream_ms": 810182,
|
|
39
|
-
"cache_ratio": 0.7786143540118918,
|
|
40
|
-
"cached_tokens": 1027820,
|
|
41
|
-
"prompt_tokens": 1320063,
|
|
42
|
-
"uncached_tokens": 104234,
|
|
43
|
-
"output_tokens": 19565,
|
|
44
|
-
"cache_weighted_input_10": 207016,
|
|
45
|
-
"cache_weighted_input_25": 361189,
|
|
46
|
-
"prompt_growth": 44706,
|
|
47
|
-
"antipatterns": 3,
|
|
48
|
-
"issues": 19,
|
|
49
|
-
"issue_types": [
|
|
50
|
-
"cache",
|
|
51
|
-
"cache_break",
|
|
52
|
-
"broad_tool_result",
|
|
53
|
-
"readonly_stall",
|
|
54
|
-
"service_tier",
|
|
55
|
-
"missed_parallelism",
|
|
56
|
-
"tool_churn_cluster"
|
|
57
|
-
],
|
|
58
|
-
"read_fragmentation_paths": [],
|
|
59
|
-
"grep_sweep_count": 0
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"id": "lead-review-channels-lib",
|
|
64
|
-
"agent": "reviewer",
|
|
65
|
-
"ok": true,
|
|
66
|
-
"ms": 1236093,
|
|
67
|
-
"sessionId": "sess_58092_1783031527640_1783031527814_6d4d5de210251154f047e52f1dce8d64",
|
|
68
|
-
"output": "sessionId: sess_58092_1783031527640_1783031527814_6d4d5de210251154f047e52f1dce8d64\n모든 owned-path 쓰기에 CAS 가드 적용을 완료했습니다. 마지막 리뷰 지적(`applyTranscriptBinding` 바인드 광고, inbound 폴백)까지 `onlyIfOwned`로 전환했고, last-wins로 남긴 곳은 의도된 명시적 claim 2곳뿐입니다(`index.mjs:191` 부트 publish, `owner-heartbeat.mjs:37` claimBridgeOwnership). `node --check` 통과.\n\n**최종 상태**\n\n- **High 3건 수정 완료**: 큐 ack 레이스(inject 실패 시 즉시 requeue + 5회 예산 dead-letter), rule-webhook 프롬프트 인젝션(보간 값 펜싱+마커 스크럽, 스모크 테스트 통과), 소유권 re-steal(TOCTOU CAS 가드 — heartbeat·refresh 틱·startOwnedRuntime·바인드 경로 전부, 스모크 테스트 통과).\n- **리뷰 3라운드 클린**: 최초 리뷰 지적 2건 + 델타 지적 1건 모두 반영, 잔여 지적 없음.\n- **남은 리스크**: Medium/Low 발견 항목(webhook pending dedup 창, forwarder.userMessageId 데드 코드, whisper teardown 등)은 미수정 상태로 대기 중입니다.\n\nMedium 이하도 이어서 수정할까요, 아니면 여기서 커밋 준비를 할까요?",
|
|
69
|
-
"card": {
|
|
70
|
-
"session": "sess_58092_1783031527640_1783031527814_6d4d5de210251154f047e52f1dce8d64",
|
|
71
|
-
"provider": "anthropic-oauth",
|
|
72
|
-
"model": "claude-fable-5",
|
|
73
|
-
"wall_ms": 1133164,
|
|
74
|
-
"turns": 101,
|
|
75
|
-
"tool_calls": 132,
|
|
76
|
-
"tools_per_turn": 1.3,
|
|
77
|
-
"total_tool_ms": 14183,
|
|
78
|
-
"llm_stream_ms": 1412476,
|
|
79
|
-
"cache_ratio": 0.8478726440507455,
|
|
80
|
-
"cached_tokens": 4364020,
|
|
81
|
-
"prompt_tokens": 5147023,
|
|
82
|
-
"uncached_tokens": 108137,
|
|
83
|
-
"output_tokens": 99445,
|
|
84
|
-
"cache_weighted_input_10": 544539,
|
|
85
|
-
"cache_weighted_input_25": 1199142,
|
|
86
|
-
"prompt_growth": 98685,
|
|
87
|
-
"antipatterns": 1,
|
|
88
|
-
"issues": 24,
|
|
89
|
-
"issue_types": [
|
|
90
|
-
"cache",
|
|
91
|
-
"cache_break",
|
|
92
|
-
"tool_error",
|
|
93
|
-
"broad_tool_result",
|
|
94
|
-
"readonly_stall",
|
|
95
|
-
"service_tier",
|
|
96
|
-
"missed_parallelism",
|
|
97
|
-
"tool_churn_cluster"
|
|
98
|
-
],
|
|
99
|
-
"read_fragmentation_paths": [],
|
|
100
|
-
"grep_sweep_count": 0
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
"id": "lead-review-compact",
|
|
105
|
-
"agent": "reviewer",
|
|
106
|
-
"ok": true,
|
|
107
|
-
"ms": 1297273,
|
|
108
|
-
"sessionId": "sess_59856_1783031527716_1783031527890_0e354b9f1f4e092cf6c6fadc6d121893",
|
|
109
|
-
"output": "sessionId: sess_59856_1783031527716_1783031527890_0e354b9f1f4e092cf6c6fadc6d121893\n이어서 Medium 4건 처리합니다. 먼저 cycle1 오류 처리 방향을 정하기 위해 호출부를 확인합니다.M4가 실패했으니 messages.mjs의 현재 상태를 확인합니다.Medium 4건 중 3건 수정 완료, 1건은 구조적 사유로 보류합니다.\n\n- **camelCase 시크릿 redaction**: `SENSITIVE_TOOL_ARG_KEY_FULL`이 `accessToken`·`authToken`·`bearerToken` 등 camelCase 경계도 인식하도록 확장 — 유출 5종 차단, `maxTokens`/`fileName` 같은 비민감 키는 과잉 redaction 없음 확인 (`text-utils.mjs`).\n\n- **cycle1 오류 표면화**: `drainSessionCycle1`이 `error` 필드를 반환하고 두 호출부(`compaction-runner.mjs:115`, `recall-fasttrack.mjs:128`)가 이를 diagnostics/stderr로 전파 — 조용한 성공 위장 제거.\n\n- **코드펜스 헤딩 오인**: `summaryHeadingLines`/`parseSummarySections`가 ``` 펜스 상태를 추적해 펜스 안 `## ...`를 무시 — 가짜 헤딩 검증 통과·실제 요약 오판·repair 시 내용 유실 3케이스 모두 확인 (`summary-schema.mjs`).\n\n- **prefix 주입(보류)**: `meta` 필드 기반 검증은 불가 판정 — 생성처 여러 곳(`manager.mjs:727`, `loop.mjs:261` 등)이 meta를 일관되게 안 붙이고, `messages.mjs:37-40` 주석대로 tail rebuild 시 meta가 유실되는 전제라 content-prefix 검출이 의도된 설계입니다. 근본 대응은 신뢰 마커의 세션 단위 서명 등 구조 변경이 필요해 별도 과제로 제안드립니다.\n\n- **회귀 확인**: 기존 `node --test` 스위트 전체 통과, 수정 파일 `node --check` 통과.\n\n**남은 항목**: Low 2건(smart-arrival 헤더 스트립 누락 `summary.mjs:405`, 중복 앨리어스 헤딩 유실 `summary-schema.mjs:198`)이 미수정입니다. 이것까지 마무리할까요, 재영님?",
|
|
110
|
-
"card": {
|
|
111
|
-
"session": "sess_59856_1783031527716_1783031527890_0e354b9f1f4e092cf6c6fadc6d121893",
|
|
112
|
-
"provider": "anthropic-oauth",
|
|
113
|
-
"model": "claude-fable-5",
|
|
114
|
-
"wall_ms": 1296782,
|
|
115
|
-
"turns": 52,
|
|
116
|
-
"tool_calls": 53,
|
|
117
|
-
"tools_per_turn": 1,
|
|
118
|
-
"total_tool_ms": 8033,
|
|
119
|
-
"llm_stream_ms": 1082501,
|
|
120
|
-
"cache_ratio": 0.8836128270522455,
|
|
121
|
-
"cached_tokens": 2080515,
|
|
122
|
-
"prompt_tokens": 2354555,
|
|
123
|
-
"uncached_tokens": 71814,
|
|
124
|
-
"output_tokens": 119391,
|
|
125
|
-
"cache_weighted_input_10": 279865.5,
|
|
126
|
-
"cache_weighted_input_25": 591942.75,
|
|
127
|
-
"prompt_growth": 68618,
|
|
128
|
-
"antipatterns": 3,
|
|
129
|
-
"issues": 13,
|
|
130
|
-
"issue_types": [
|
|
131
|
-
"cache",
|
|
132
|
-
"cache_break",
|
|
133
|
-
"tool_error",
|
|
134
|
-
"broad_tool_result",
|
|
135
|
-
"readonly_stall",
|
|
136
|
-
"service_tier",
|
|
137
|
-
"missed_parallelism",
|
|
138
|
-
"tool_churn_cluster"
|
|
139
|
-
],
|
|
140
|
-
"read_fragmentation_paths": [],
|
|
141
|
-
"grep_sweep_count": 0
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
],
|
|
145
|
-
"task_complete": true,
|
|
146
|
-
"task_errors": [],
|
|
147
|
-
"score_complete": true,
|
|
148
|
-
"score_errors": [],
|
|
149
|
-
"group": {
|
|
150
|
-
"n": 3,
|
|
151
|
-
"wall_ms": 945113,
|
|
152
|
-
"turns": 68,
|
|
153
|
-
"tool_calls": 82.3,
|
|
154
|
-
"tools_per_turn": 1.2,
|
|
155
|
-
"total_tool_ms": 8348.3,
|
|
156
|
-
"llm_stream_ms": 1101719.7,
|
|
157
|
-
"cache_ratio": 0.8,
|
|
158
|
-
"cached_tokens": 2490785,
|
|
159
|
-
"prompt_tokens": 2940547,
|
|
160
|
-
"uncached_tokens": 94728.3,
|
|
161
|
-
"output_tokens": 79467,
|
|
162
|
-
"cache_weighted_input_10": 343806.8,
|
|
163
|
-
"cache_weighted_input_25": 717424.6,
|
|
164
|
-
"prompt_growth": 70669.7,
|
|
165
|
-
"antipatterns": 2.3,
|
|
166
|
-
"issues": 18.7,
|
|
167
|
-
"grep_sweep_count": 0
|
|
168
|
-
},
|
|
169
|
-
"cards": [
|
|
170
|
-
{
|
|
171
|
-
"session": "sess_53852_1783031527627_1783031527803_63b5825893a6df65a914d155c7e3b5f6",
|
|
172
|
-
"provider": "anthropic-oauth",
|
|
173
|
-
"model": "claude-fable-5",
|
|
174
|
-
"wall_ms": 405393,
|
|
175
|
-
"turns": 51,
|
|
176
|
-
"tool_calls": 62,
|
|
177
|
-
"tools_per_turn": 1.2,
|
|
178
|
-
"total_tool_ms": 2829,
|
|
179
|
-
"llm_stream_ms": 810182,
|
|
180
|
-
"cache_ratio": 0.7786143540118918,
|
|
181
|
-
"cached_tokens": 1027820,
|
|
182
|
-
"prompt_tokens": 1320063,
|
|
183
|
-
"uncached_tokens": 104234,
|
|
184
|
-
"output_tokens": 19565,
|
|
185
|
-
"cache_weighted_input_10": 207016,
|
|
186
|
-
"cache_weighted_input_25": 361189,
|
|
187
|
-
"prompt_growth": 44706,
|
|
188
|
-
"antipatterns": 3,
|
|
189
|
-
"issues": 19,
|
|
190
|
-
"issue_types": [
|
|
191
|
-
"cache",
|
|
192
|
-
"cache_break",
|
|
193
|
-
"broad_tool_result",
|
|
194
|
-
"readonly_stall",
|
|
195
|
-
"service_tier",
|
|
196
|
-
"missed_parallelism",
|
|
197
|
-
"tool_churn_cluster"
|
|
198
|
-
],
|
|
199
|
-
"read_fragmentation_paths": [],
|
|
200
|
-
"grep_sweep_count": 0
|
|
201
|
-
},
|
|
202
|
-
{
|
|
203
|
-
"session": "sess_58092_1783031527640_1783031527814_6d4d5de210251154f047e52f1dce8d64",
|
|
204
|
-
"provider": "anthropic-oauth",
|
|
205
|
-
"model": "claude-fable-5",
|
|
206
|
-
"wall_ms": 1133164,
|
|
207
|
-
"turns": 101,
|
|
208
|
-
"tool_calls": 132,
|
|
209
|
-
"tools_per_turn": 1.3,
|
|
210
|
-
"total_tool_ms": 14183,
|
|
211
|
-
"llm_stream_ms": 1412476,
|
|
212
|
-
"cache_ratio": 0.8478726440507455,
|
|
213
|
-
"cached_tokens": 4364020,
|
|
214
|
-
"prompt_tokens": 5147023,
|
|
215
|
-
"uncached_tokens": 108137,
|
|
216
|
-
"output_tokens": 99445,
|
|
217
|
-
"cache_weighted_input_10": 544539,
|
|
218
|
-
"cache_weighted_input_25": 1199142,
|
|
219
|
-
"prompt_growth": 98685,
|
|
220
|
-
"antipatterns": 1,
|
|
221
|
-
"issues": 24,
|
|
222
|
-
"issue_types": [
|
|
223
|
-
"cache",
|
|
224
|
-
"cache_break",
|
|
225
|
-
"tool_error",
|
|
226
|
-
"broad_tool_result",
|
|
227
|
-
"readonly_stall",
|
|
228
|
-
"service_tier",
|
|
229
|
-
"missed_parallelism",
|
|
230
|
-
"tool_churn_cluster"
|
|
231
|
-
],
|
|
232
|
-
"read_fragmentation_paths": [],
|
|
233
|
-
"grep_sweep_count": 0
|
|
234
|
-
},
|
|
235
|
-
{
|
|
236
|
-
"session": "sess_59856_1783031527716_1783031527890_0e354b9f1f4e092cf6c6fadc6d121893",
|
|
237
|
-
"provider": "anthropic-oauth",
|
|
238
|
-
"model": "claude-fable-5",
|
|
239
|
-
"wall_ms": 1296782,
|
|
240
|
-
"turns": 52,
|
|
241
|
-
"tool_calls": 53,
|
|
242
|
-
"tools_per_turn": 1,
|
|
243
|
-
"total_tool_ms": 8033,
|
|
244
|
-
"llm_stream_ms": 1082501,
|
|
245
|
-
"cache_ratio": 0.8836128270522455,
|
|
246
|
-
"cached_tokens": 2080515,
|
|
247
|
-
"prompt_tokens": 2354555,
|
|
248
|
-
"uncached_tokens": 71814,
|
|
249
|
-
"output_tokens": 119391,
|
|
250
|
-
"cache_weighted_input_10": 279865.5,
|
|
251
|
-
"cache_weighted_input_25": 591942.75,
|
|
252
|
-
"prompt_growth": 68618,
|
|
253
|
-
"antipatterns": 3,
|
|
254
|
-
"issues": 13,
|
|
255
|
-
"issue_types": [
|
|
256
|
-
"cache",
|
|
257
|
-
"cache_break",
|
|
258
|
-
"tool_error",
|
|
259
|
-
"broad_tool_result",
|
|
260
|
-
"readonly_stall",
|
|
261
|
-
"service_tier",
|
|
262
|
-
"missed_parallelism",
|
|
263
|
-
"tool_churn_cluster"
|
|
264
|
-
],
|
|
265
|
-
"read_fragmentation_paths": [],
|
|
266
|
-
"grep_sweep_count": 0
|
|
267
|
-
}
|
|
268
|
-
]
|
|
269
|
-
}
|