@moda-ai/cli 1.55.37 → 1.55.38
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/dist/{agent-4pyeecf7.js → agent-9r58v0bc.js} +8 -8
- package/dist/{cli-s72pph9c.js → cli-3n040fp2.js} +1 -1
- package/dist/{cli-wh83c3ss.js → cli-93926afn.js} +4 -4
- package/dist/{cli-ef9eagsc.js → cli-9g5kzsg6.js} +1 -1
- package/dist/{cli-4d92a450.js → cli-b7nyw498.js} +1 -1
- package/dist/{cli-npkb08xt.js → cli-dmnayt2r.js} +8 -8
- package/dist/{cli-nqgyz74b.js → cli-n311b8g0.js} +1 -1
- package/dist/{cli-xkcy9wns.js → cli-nh23q6ay.js} +5 -5
- package/dist/{cli-wg6e2a1g.js → cli-rcjhfts4.js} +7 -6
- package/dist/{cli-gjzr7jq5.js → cli-sk1p71wr.js} +1 -1
- package/dist/{cli-x605txan.js → cli-skvvwp2q.js} +5 -5
- package/dist/{cli-w3ckvma5.js → cli-tdcx8yz9.js} +3 -3
- package/dist/{cli-cdx6yd7m.js → cli-xheg54qc.js} +63 -7
- package/dist/{cli-nzx7rqjs.js → cli-xk630wjq.js} +1 -1
- package/dist/{cli-cr44672e.js → cli-xtyszvq1.js} +5 -5
- package/dist/cli.js +162 -34
- package/dist/{doctor-w8z3wj1e.js → doctor-xq5bjvpq.js} +7 -7
- package/dist/{fix-667fyx00.js → fix-kvszavm1.js} +4 -4
- package/dist/{harness-github-actions-7s41s1vg.js → harness-github-actions-drbkcb8d.js} +5 -5
- package/dist/{harness-fb0083ap.js → harness-qatnwxrz.js} +5 -5
- package/dist/{index-4w5szrnw.js → index-y5jnz2t2.js} +11 -11
- package/dist/{production-intelligence-v2wq2aqv.js → production-intelligence-j55vaw6t.js} +61 -4
- package/dist/{profile-commands-3hw4trwk.js → profile-commands-skdxe17v.js} +3 -3
- package/dist/{prompt-attribution-g7md8hzc.js → prompt-attribution-zq38actx.js} +5 -5
- package/dist/prompt-source-mcp.js +5 -5
- package/dist/{prompts-ab-59r52mxw.js → prompts-ab-yd2dawe3.js} +7 -7
- package/dist/{prompts-90v9eg2k.js → prompts-cwqn8a57.js} +5 -5
- package/dist/{prompts-propose-cbenbk8w.js → prompts-propose-11dj9ked.js} +7 -7
- package/dist/{provision-8c4s6vgg.js → provision-ghca9d54.js} +5 -5
- package/dist/{registry-qvjyvbk8.js → registry-76sngjw6.js} +3 -3
- package/dist/{skills-z7w5x7jj.js → skills-btn9r48v.js} +5 -5
- package/dist/{sync-r32tgpar.js → sync-ye7nxeen.js} +7 -7
- package/package.json +1 -1
- package/skills/integration/index.json +2 -2
- package/skills/moda-cli/SKILL.md +3 -1
- package/skills/moda-cli/references/commands.md +1 -0
- package/skills/moda-cli/references/dashboard-parity.md +3 -0
- package/skills/moda-cli/references/detections.md +53 -0
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
contextTarget,
|
|
7
7
|
frustrationAnchorIndex,
|
|
8
8
|
frustrationsFromEmotions
|
|
9
|
-
} from "./cli-
|
|
9
|
+
} from "./cli-n311b8g0.js";
|
|
10
10
|
import {
|
|
11
11
|
renderMarkdownForTerminal,
|
|
12
12
|
shouldColorTerminalOutput,
|
|
@@ -16,7 +16,7 @@ import {
|
|
|
16
16
|
import {
|
|
17
17
|
callControlAPI,
|
|
18
18
|
callDataAPI
|
|
19
|
-
} from "./cli-
|
|
19
|
+
} from "./cli-3n040fp2.js";
|
|
20
20
|
import {
|
|
21
21
|
EXIT_DEGRADED,
|
|
22
22
|
EXIT_OK,
|
|
@@ -26,7 +26,7 @@ import {
|
|
|
26
26
|
resolveModaBaseUrl,
|
|
27
27
|
safeWriteStderr,
|
|
28
28
|
shellArg
|
|
29
|
-
} from "./cli-
|
|
29
|
+
} from "./cli-rcjhfts4.js";
|
|
30
30
|
import {
|
|
31
31
|
CliAuthError,
|
|
32
32
|
CliInputError,
|
|
@@ -494,12 +494,58 @@ async function loadOverviewBriefing(options) {
|
|
|
494
494
|
promptSync: localSyncBrief(options.cwd, ".moda/prompts.lock.json", "Prompt versions"),
|
|
495
495
|
skillSync: localSkillBrief(options.cwd),
|
|
496
496
|
metrics: overviewMetrics(overview),
|
|
497
|
+
detectors: overviewDetectors(overview),
|
|
497
498
|
topFinding,
|
|
498
499
|
evidenceRefs,
|
|
499
500
|
nextCommand,
|
|
500
501
|
rawOverview: overview
|
|
501
502
|
};
|
|
502
503
|
}
|
|
504
|
+
var DETECTOR_LABELS = {
|
|
505
|
+
emotion: "Emotion",
|
|
506
|
+
frustration: "Frustration",
|
|
507
|
+
custom_signal: "Custom signals",
|
|
508
|
+
laziness: "Laziness",
|
|
509
|
+
hallucination: "Hallucination",
|
|
510
|
+
tool_failure: "Tool failures"
|
|
511
|
+
};
|
|
512
|
+
function overviewDetectors(overview) {
|
|
513
|
+
const list = valueAt(overview, ["processing", "detectors"]);
|
|
514
|
+
if (!Array.isArray(list))
|
|
515
|
+
return [];
|
|
516
|
+
return list.flatMap((item) => {
|
|
517
|
+
const row = asRecord(item);
|
|
518
|
+
const family = asString(row?.family);
|
|
519
|
+
if (!row || !family)
|
|
520
|
+
return [];
|
|
521
|
+
const enabled = row.enabled === true ? true : row.enabled === false ? false : null;
|
|
522
|
+
const reason = asString(row.reason);
|
|
523
|
+
return [{ family, enabled, setting: asString(row.setting) ?? null, ...reason ? { reason } : {} }];
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
function detectorWarnings(detectors) {
|
|
527
|
+
const hasEmotion = detectors.some((detector) => detector.family === "emotion");
|
|
528
|
+
return detectors.flatMap((detector) => {
|
|
529
|
+
if (detector.family === "frustration" && hasEmotion)
|
|
530
|
+
return [];
|
|
531
|
+
const label = detector.family === "emotion" && detectors.some((d) => d.family === "frustration") ? "Emotion (including frustration)" : DETECTOR_LABELS[detector.family] ?? detector.family;
|
|
532
|
+
if (detector.enabled === false) {
|
|
533
|
+
const why = detector.reason === "dogfood_tenant" ? "is skipped for this internal (dogfood) tenant" : `is switched off for this tenant (${detector.setting ?? "processing setting"} = false)`;
|
|
534
|
+
return [`${label} detection ${why}, so zero ${label.toLowerCase()} detections do NOT mean traces are clean.`];
|
|
535
|
+
}
|
|
536
|
+
if (detector.enabled === null) {
|
|
537
|
+
return [`Could not confirm whether ${label.toLowerCase()} detection runs for this tenant; treat zero detections with caution.`];
|
|
538
|
+
}
|
|
539
|
+
return [];
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
function detectorStateText(detector) {
|
|
543
|
+
if (detector.enabled === null)
|
|
544
|
+
return "unknown";
|
|
545
|
+
if (detector.enabled === false)
|
|
546
|
+
return detector.reason === "dogfood_tenant" ? "off (dogfood tenant)" : `off (${detector.setting ?? "setting"})`;
|
|
547
|
+
return detector.setting ? `on (${detector.setting})` : "on (no tenant switch)";
|
|
548
|
+
}
|
|
503
549
|
async function investigateProduction(options) {
|
|
504
550
|
const warnings = [];
|
|
505
551
|
const sourceStatus = {};
|
|
@@ -1325,7 +1371,8 @@ function overviewAgentOptions(briefing) {
|
|
|
1325
1371
|
findings: briefing.topFinding ? [agentFinding(briefing.topFinding)] : [],
|
|
1326
1372
|
evidenceRefs: briefing.evidenceRefs.map(agentEvidence),
|
|
1327
1373
|
recommendedActions: briefing.topFinding ? briefing.topFinding.recommendedActions.map(agentAction) : [],
|
|
1328
|
-
nextCommands: [nextCommand(briefing.nextCommand)]
|
|
1374
|
+
nextCommands: [nextCommand(briefing.nextCommand)],
|
|
1375
|
+
...detectorWarnings(briefing.detectors).length > 0 ? { warnings: detectorWarnings(briefing.detectors) } : {}
|
|
1329
1376
|
};
|
|
1330
1377
|
}
|
|
1331
1378
|
function askAgentOptions(result) {
|
|
@@ -1402,6 +1449,15 @@ function renderOverviewBriefingHuman(briefing) {
|
|
|
1402
1449
|
for (const [label, value] of overviewSignalPairs(briefing.metrics)) {
|
|
1403
1450
|
lines.push(` ${label.padEnd(18)} ${String(value)}`);
|
|
1404
1451
|
}
|
|
1452
|
+
if (briefing.detectors.length > 0) {
|
|
1453
|
+
lines.push("");
|
|
1454
|
+
lines.push("Detectors");
|
|
1455
|
+
for (const detector of briefing.detectors) {
|
|
1456
|
+
lines.push(` ${(DETECTOR_LABELS[detector.family] ?? detector.family).padEnd(18)} ${detectorStateText(detector)}`);
|
|
1457
|
+
}
|
|
1458
|
+
for (const warning of detectorWarnings(briefing.detectors))
|
|
1459
|
+
lines.push(` Warning: ${warning}`);
|
|
1460
|
+
}
|
|
1405
1461
|
lines.push("");
|
|
1406
1462
|
lines.push("Top signal");
|
|
1407
1463
|
if (briefing.topFinding) {
|
|
@@ -1852,6 +1908,7 @@ export {
|
|
|
1852
1908
|
renderAskHuman,
|
|
1853
1909
|
loadOverviewBriefing,
|
|
1854
1910
|
investigateProduction,
|
|
1911
|
+
detectorWarnings,
|
|
1855
1912
|
daysBackFlag,
|
|
1856
1913
|
askResultFromStreamOutcome,
|
|
1857
1914
|
askModa
|
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
probeApiKey,
|
|
3
3
|
redactApiKey,
|
|
4
4
|
resolveApiKeyCredential
|
|
5
|
-
} from "./cli-
|
|
5
|
+
} from "./cli-9g5kzsg6.js";
|
|
6
6
|
import {
|
|
7
7
|
authFetch,
|
|
8
8
|
clearAuthSession,
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
loadAuthSession,
|
|
11
11
|
login,
|
|
12
12
|
revokeCliSessionToken
|
|
13
|
-
} from "./cli-
|
|
13
|
+
} from "./cli-sk1p71wr.js";
|
|
14
14
|
import {
|
|
15
15
|
DEFAULT_INGEST_URL,
|
|
16
16
|
EXIT_AUTH_REQUIRED,
|
|
@@ -35,7 +35,7 @@ import {
|
|
|
35
35
|
setActiveProfile,
|
|
36
36
|
shellArg,
|
|
37
37
|
upsertProfile
|
|
38
|
-
} from "./cli-
|
|
38
|
+
} from "./cli-rcjhfts4.js";
|
|
39
39
|
import {
|
|
40
40
|
CliInputError
|
|
41
41
|
} from "./cli-k4tqwah4.js";
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
inventoryFiles,
|
|
3
3
|
safePromptEvidencePath
|
|
4
|
-
} from "./cli-
|
|
4
|
+
} from "./cli-skvvwp2q.js";
|
|
5
5
|
import"./cli-xq45etg1.js";
|
|
6
6
|
import"./cli-97fnztpy.js";
|
|
7
7
|
import"./cli-cesds766.js";
|
|
8
8
|
import {
|
|
9
9
|
require_typescript
|
|
10
10
|
} from "./cli-qpq84eee.js";
|
|
11
|
-
import"./cli-
|
|
12
|
-
import"./cli-
|
|
13
|
-
import"./cli-
|
|
14
|
-
import"./cli-
|
|
11
|
+
import"./cli-b7nyw498.js";
|
|
12
|
+
import"./cli-xheg54qc.js";
|
|
13
|
+
import"./cli-3n040fp2.js";
|
|
14
|
+
import"./cli-rcjhfts4.js";
|
|
15
15
|
import"./cli-k4tqwah4.js";
|
|
16
16
|
import"./cli-9kfxkxmk.js";
|
|
17
17
|
import"./cli-ns5fcnkz.js";
|
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
checkPromptMapping,
|
|
4
4
|
discoverHarnessPromptSources,
|
|
5
5
|
safePromptEvidencePath
|
|
6
|
-
} from "./cli-
|
|
6
|
+
} from "./cli-skvvwp2q.js";
|
|
7
7
|
import"./cli-xq45etg1.js";
|
|
8
8
|
import"./cli-97fnztpy.js";
|
|
9
9
|
import"./cli-cesds766.js";
|
|
@@ -11,10 +11,10 @@ import {
|
|
|
11
11
|
inspectCodeSelectors,
|
|
12
12
|
inspectPythonSelectors
|
|
13
13
|
} from "./cli-qpq84eee.js";
|
|
14
|
-
import"./cli-
|
|
15
|
-
import"./cli-
|
|
16
|
-
import"./cli-
|
|
17
|
-
import"./cli-
|
|
14
|
+
import"./cli-b7nyw498.js";
|
|
15
|
+
import"./cli-xheg54qc.js";
|
|
16
|
+
import"./cli-3n040fp2.js";
|
|
17
|
+
import"./cli-rcjhfts4.js";
|
|
18
18
|
import"./cli-k4tqwah4.js";
|
|
19
19
|
import"./cli-9kfxkxmk.js";
|
|
20
20
|
import"./cli-ns5fcnkz.js";
|
|
@@ -23,14 +23,14 @@ import {
|
|
|
23
23
|
runPromptAb,
|
|
24
24
|
selectProblemCases,
|
|
25
25
|
waitLabel
|
|
26
|
-
} from "./cli-
|
|
27
|
-
import"./cli-
|
|
28
|
-
import"./cli-
|
|
26
|
+
} from "./cli-nh23q6ay.js";
|
|
27
|
+
import"./cli-dmnayt2r.js";
|
|
28
|
+
import"./cli-xk630wjq.js";
|
|
29
29
|
import"./cli-mm48br00.js";
|
|
30
|
-
import"./cli-
|
|
31
|
-
import"./cli-
|
|
32
|
-
import"./cli-
|
|
33
|
-
import"./cli-
|
|
30
|
+
import"./cli-b7nyw498.js";
|
|
31
|
+
import"./cli-xheg54qc.js";
|
|
32
|
+
import"./cli-3n040fp2.js";
|
|
33
|
+
import"./cli-rcjhfts4.js";
|
|
34
34
|
import"./cli-k4tqwah4.js";
|
|
35
35
|
import"./cli-9kfxkxmk.js";
|
|
36
36
|
import"./cli-ns5fcnkz.js";
|
|
@@ -11,14 +11,14 @@ import {
|
|
|
11
11
|
runPromptSync,
|
|
12
12
|
runPromptsCommand,
|
|
13
13
|
writePromptSyncProgress
|
|
14
|
-
} from "./cli-
|
|
14
|
+
} from "./cli-dmnayt2r.js";
|
|
15
15
|
import {
|
|
16
16
|
promptSourceHashPayload
|
|
17
17
|
} from "./cli-mm48br00.js";
|
|
18
|
-
import"./cli-
|
|
19
|
-
import"./cli-
|
|
20
|
-
import"./cli-
|
|
21
|
-
import"./cli-
|
|
18
|
+
import"./cli-b7nyw498.js";
|
|
19
|
+
import"./cli-xheg54qc.js";
|
|
20
|
+
import"./cli-3n040fp2.js";
|
|
21
|
+
import"./cli-rcjhfts4.js";
|
|
22
22
|
import"./cli-k4tqwah4.js";
|
|
23
23
|
import"./cli-9kfxkxmk.js";
|
|
24
24
|
import"./cli-ns5fcnkz.js";
|
|
@@ -7,20 +7,20 @@ import {
|
|
|
7
7
|
formatVerdict,
|
|
8
8
|
rerunWithYes,
|
|
9
9
|
resolvePromptArmSpec
|
|
10
|
-
} from "./cli-
|
|
11
|
-
import"./cli-
|
|
12
|
-
import"./cli-
|
|
10
|
+
} from "./cli-nh23q6ay.js";
|
|
11
|
+
import"./cli-dmnayt2r.js";
|
|
12
|
+
import"./cli-xk630wjq.js";
|
|
13
13
|
import"./cli-mm48br00.js";
|
|
14
|
-
import"./cli-
|
|
15
|
-
import"./cli-
|
|
14
|
+
import"./cli-b7nyw498.js";
|
|
15
|
+
import"./cli-xheg54qc.js";
|
|
16
16
|
import {
|
|
17
17
|
callControlAPI
|
|
18
|
-
} from "./cli-
|
|
18
|
+
} from "./cli-3n040fp2.js";
|
|
19
19
|
import {
|
|
20
20
|
resolveApiTenantId,
|
|
21
21
|
shellArg,
|
|
22
22
|
validateConfig
|
|
23
|
-
} from "./cli-
|
|
23
|
+
} from "./cli-rcjhfts4.js";
|
|
24
24
|
import {
|
|
25
25
|
CliInputError
|
|
26
26
|
} from "./cli-k4tqwah4.js";
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
selectTenantAndCreateKey
|
|
3
|
-
} from "./cli-
|
|
4
|
-
import"./cli-
|
|
3
|
+
} from "./cli-tdcx8yz9.js";
|
|
4
|
+
import"./cli-9g5kzsg6.js";
|
|
5
5
|
import {
|
|
6
6
|
loadAuthSession
|
|
7
|
-
} from "./cli-
|
|
7
|
+
} from "./cli-sk1p71wr.js";
|
|
8
8
|
import {
|
|
9
9
|
stringOption
|
|
10
|
-
} from "./cli-
|
|
10
|
+
} from "./cli-b7nyw498.js";
|
|
11
11
|
import {
|
|
12
12
|
resolveIngestUrl,
|
|
13
13
|
resolveModaBaseUrl
|
|
14
|
-
} from "./cli-
|
|
14
|
+
} from "./cli-rcjhfts4.js";
|
|
15
15
|
import {
|
|
16
16
|
CliAuthError
|
|
17
17
|
} from "./cli-k4tqwah4.js";
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
assertFlags
|
|
3
|
-
} from "./cli-
|
|
3
|
+
} from "./cli-xheg54qc.js";
|
|
4
4
|
import {
|
|
5
5
|
callControlAPI
|
|
6
|
-
} from "./cli-
|
|
6
|
+
} from "./cli-3n040fp2.js";
|
|
7
7
|
import {
|
|
8
8
|
explicitOutputMode,
|
|
9
9
|
resolveApiKey
|
|
10
|
-
} from "./cli-
|
|
10
|
+
} from "./cli-rcjhfts4.js";
|
|
11
11
|
import {
|
|
12
12
|
CliInputError
|
|
13
13
|
} from "./cli-k4tqwah4.js";
|
|
@@ -3,14 +3,14 @@ import {
|
|
|
3
3
|
pullSkills,
|
|
4
4
|
runSkillSync,
|
|
5
5
|
runSkillsCommand
|
|
6
|
-
} from "./cli-
|
|
6
|
+
} from "./cli-93926afn.js";
|
|
7
7
|
import"./cli-qm5b1vck.js";
|
|
8
8
|
import"./cli-rjav0vj1.js";
|
|
9
9
|
import"./cli-hcwdz9sd.js";
|
|
10
|
-
import"./cli-
|
|
11
|
-
import"./cli-
|
|
12
|
-
import"./cli-
|
|
13
|
-
import"./cli-
|
|
10
|
+
import"./cli-b7nyw498.js";
|
|
11
|
+
import"./cli-xheg54qc.js";
|
|
12
|
+
import"./cli-3n040fp2.js";
|
|
13
|
+
import"./cli-rcjhfts4.js";
|
|
14
14
|
import"./cli-k4tqwah4.js";
|
|
15
15
|
import"./cli-ns5fcnkz.js";
|
|
16
16
|
import"./cli-0v6na3yp.js";
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import {
|
|
2
2
|
runSkillsCommand
|
|
3
|
-
} from "./cli-
|
|
3
|
+
} from "./cli-93926afn.js";
|
|
4
4
|
import"./cli-qm5b1vck.js";
|
|
5
5
|
import"./cli-rjav0vj1.js";
|
|
6
6
|
import"./cli-hcwdz9sd.js";
|
|
7
7
|
import {
|
|
8
8
|
runPromptsCommand
|
|
9
|
-
} from "./cli-
|
|
9
|
+
} from "./cli-dmnayt2r.js";
|
|
10
10
|
import"./cli-mm48br00.js";
|
|
11
11
|
import {
|
|
12
12
|
runHarnessCommand
|
|
13
|
-
} from "./cli-
|
|
13
|
+
} from "./cli-skvvwp2q.js";
|
|
14
14
|
import"./cli-xq45etg1.js";
|
|
15
15
|
import"./cli-97fnztpy.js";
|
|
16
16
|
import"./cli-cesds766.js";
|
|
17
17
|
import"./cli-qpq84eee.js";
|
|
18
|
-
import"./cli-
|
|
19
|
-
import"./cli-
|
|
20
|
-
import"./cli-
|
|
21
|
-
import"./cli-
|
|
18
|
+
import"./cli-b7nyw498.js";
|
|
19
|
+
import"./cli-xheg54qc.js";
|
|
20
|
+
import"./cli-3n040fp2.js";
|
|
21
|
+
import"./cli-rcjhfts4.js";
|
|
22
22
|
import {
|
|
23
23
|
CliInputError
|
|
24
24
|
} from "./cli-k4tqwah4.js";
|
package/package.json
CHANGED
package/skills/moda-cli/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: moda-cli
|
|
3
|
-
version: 3.0.
|
|
3
|
+
version: 3.0.4
|
|
4
4
|
description: Investigate a production AI agent with the Moda CLI (`moda`) - find where something happened in real traces (traces search, then traces get), check agent health, rank what to fix (investigate, problems), and dig into tool failures, user frustration, and hallucinations. Also prompt registry sync/promote, replays, custom signals, and false-positive marking. Use when the user mentions Moda, production traces or conversations of their agent, agent failures, or asks what to fix.
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -65,6 +65,8 @@ Details: `references/output-protocol.md`.
|
|
|
65
65
|
| How often is tool T called / what is its schema? | `moda tools list` (every tool: calls, failed calls, success rate; `--sort=failure_rate`) | `moda tools get <T>` (registered schema, observed payload fields, usage over time, top failure categories) |
|
|
66
66
|
| What frustrates users? | `moda detections list --family=frustration --limit=10` | `moda traces get <anchor.conversation_id> --msg-index=<anchor.msg_index>` |
|
|
67
67
|
| Other emotions, laziness, hallucinations | `moda detections list --family=emotion:<f>`, `moda detections list --family=laziness`, `moda detections list --family=hallucination --kind=contradicted` | context on the row's anchor |
|
|
68
|
+
| Counts that match the dashboard, dashboard filters | `moda detections list --family=<f> --group-by=trace` (`--trajectory`, `--elicitor`, `--signal`, `--rule`, `--sort`, ...) | `references/detections.md` 5a |
|
|
69
|
+
| Is an empty result really clean? | `moda overview` → `detectors` (is the detector on?); `traces` rows → `processing_status` (pending = not fully processed; detections may be incomplete) | `references/detections.md` 5b |
|
|
68
70
|
| Read one whole trace | `moda traces get <id> --all` (pages of up to 500 messages) | `moda traces spans <id>` for raw spans |
|
|
69
71
|
| Read several traces or turns | `moda traces get <id1>@<msg_index> <id2>@<msg_index> ...` (up to 25; or one per line via `--ids-from=-`) | Same for `moda traces spans <id1> <id2> ...` |
|
|
70
72
|
| One user's experience | `moda users`, `moda user <user_id>` | `moda traces search "<words>" --user-id=<id>` |
|
|
@@ -35,6 +35,7 @@ Loaded on demand from the moda-cli skill. This table can lag the CLI: `moda <com
|
|
|
35
35
|
| `moda review <kind> <target>` | Write: kinds `problem\|problem-detection\|quote\|tool\|laziness\|hallucination\|custom-signal`; `--reason` optional; problem-detection needs `--conversation-id` + `--attribution-id`; quote needs `--family`, `--turn`, `--quote`; tool needs `--tool` plus `--tool-use-id` or `--msg-index`; custom-signal needs `--conversation-id`; `--verdict=clear` removes a mark (not for problem) |
|
|
36
36
|
| `moda reviews list [conversation_id]` | Current false-positive marks: all (`--kind=quote\|tool\|laziness\|hallucination\|custom-signal`, `--all` to include removed, `--limit`) or one trace with its problem detection reviews. Problem dismissals are read with `moda problems get <problem_id> --feedback`, detection reviews with `moda reviews list <conversation_id> --kind=problem-detection` |
|
|
37
37
|
| `moda detections list --family=laziness` | Laziness detections per trace (`--days-back`, `--limit` 1-50, `--conversation-id`, `--family`) |
|
|
38
|
+
| `moda detections list --family=<f> --group-by=trace` | The dashboard's per-trace list for emotion, frustration and hallucination: totals count traces. Dashboard filters imply it: emotion/frustration `--search --status --elicitor --trajectory --signal --sort --order`; hallucination `--search --status --rule --source --sort --order`; laziness (always per trace) `--search --status --sort --order`. See detections.md 5a |
|
|
38
39
|
| `moda problems linear <problem_id>` | The Problem's linked Linear issue (key, state, URL) or `link: null`; needs Linear connected (Integrations → Linear) |
|
|
39
40
|
| `moda problems link <problem_id>` | Write: file the Problem as a Linear issue (`--team-id`, `--title`, `--priority=0-4`), or link an existing one with `--issue=ENG-123\|URL` (exclusive with the others). Idempotent per Problem |
|
|
40
41
|
| `moda reviews list <conversation_id> --kind=problem-detection` | Problem detections on a trace with review state (`--attribution-id=UUID` narrows to one) |
|
|
@@ -11,6 +11,9 @@ Writes listed here accept `--dry-run`: it validates the call, prints the exact r
|
|
|
11
11
|
|---|---|
|
|
12
12
|
| Traces list: sort, page | `moda traces --sort=recent\|longest\|slowest --offset=N` |
|
|
13
13
|
| Trace detail: whole transcript | `moda traces get <id> --all` (ordered, with tool calls/results) |
|
|
14
|
+
| Traces list: Processed, Use case confidence, Indexed columns | `moda traces` rows: `processing_status`, `error_message`, `membership_score`, `indexed_at`; `moda traces get <id>`: `trace_state` |
|
|
15
|
+
| Signals tabs: per-trace list, filters, sort | `moda detections list --family=<f> --group-by=trace` plus `--trajectory --elicitor --signal --status --search --sort --order` (emotion), `--rule --source` (hallucination) |
|
|
16
|
+
| Settings: which detectors run | `moda overview` → `detectors` (read-only; switching one is dashboard-only) |
|
|
14
17
|
| Users page / user profile | `moda users [--window --cohort --sort --order --health-status]`, `moda user <id>` |
|
|
15
18
|
| Tool catalog: every tool, its schema and usage | `moda tools list [--sort=calls\|failure_rate\|failures\|traces\|last_seen --search --direction --offset]`, `moda tools get <tool_name>` |
|
|
16
19
|
| Problems: unexplained remainder | `moda problems unexplained [--family=emotion\|tool_failure\|laziness\|… --cursor]` |
|
|
@@ -44,6 +44,59 @@ slice centered on the anchor. `--window=N` (1–5, default `1`) is the
|
|
|
44
44
|
half-width; `--window=1` ⇒ 3 messages total (anchor ± 1), the canonical
|
|
45
45
|
"three lines" view.
|
|
46
46
|
|
|
47
|
+
### 5a. Per-trace lists and dashboard filters (`--group-by=trace`)
|
|
48
|
+
|
|
49
|
+
By default emotion and frustration rows are one per (trace, family)
|
|
50
|
+
detection, and hallucination rows are one per scored message, so their
|
|
51
|
+
`pagination.total` is NOT the dashboard's trace count. Every list response
|
|
52
|
+
says which counting it uses in `counting` (`per_detection`, `per_message` or
|
|
53
|
+
`per_trace`), and the agent summary repeats it.
|
|
54
|
+
|
|
55
|
+
`--group-by=trace` reads the dashboard Signals tab's own list: one row per
|
|
56
|
+
trace in `traces[]`, the dashboard's filters and sort, and a total that
|
|
57
|
+
counts traces exactly as the dashboard does. Any filter below implies it.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
moda detections list --family=emotion --group-by=trace # emotion tab, per trace
|
|
61
|
+
moda detections list --family=frustration --trajectory=building # implies --group-by=trace
|
|
62
|
+
moda detections list --family=emotion:sadness --elicitor=bot --status=detected
|
|
63
|
+
moda detections list --family=emotion --signal=sarcasm,anger --sort=risk_score --order=desc
|
|
64
|
+
moda detections list --family=hallucination --rule=<rule_id> --status=all # rule ids: summary.rule_breakdown
|
|
65
|
+
moda detections list --family=hallucination --source=judge --sort=last_detected_at
|
|
66
|
+
moda detections list --family=laziness --status=strong --sort=strong_count # laziness is always per trace
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
| family | flags (values) |
|
|
70
|
+
|---|---|
|
|
71
|
+
| emotion, frustration | `--search` (trace ID or cause), `--status=all\|detected`, `--elicitor=bot\|external\|self\|ambiguous`, `--trajectory=none\|building\|peak\|resolved\|sustained`, `--signal=<s>[,<s>]`, `--sort=score\|risk_score\|detected_at\|message_count`, `--order=asc\|desc` |
|
|
72
|
+
| hallucination | `--search` (trace ID), `--status=contradicted\|all`, `--rule=<rule_id>`, `--source=rule\|classifier\|gpu\|judge\|human`, `--sort=contradicted_count\|verified_count\|last_detected_at`, `--order` |
|
|
73
|
+
| laziness | `--search` (trace ID), `--status=all\|strong`, `--sort=detections_count\|strong_count\|last_detected_at`, `--order` |
|
|
74
|
+
|
|
75
|
+
The per-trace list has no user scope and no single-trace read: `--user-id`,
|
|
76
|
+
`--conversation-id`, `--include-window` (and `--kind` for hallucinations) are
|
|
77
|
+
rejected with it; drop the trace filters to use them. `summary` in a per-trace
|
|
78
|
+
response covers the whole window and ignores the list filters (except
|
|
79
|
+
hallucination `--rule`, which scopes the summary too, as on the dashboard).
|
|
80
|
+
|
|
81
|
+
### 5b. Detector switched off, or trace not processed
|
|
82
|
+
|
|
83
|
+
An empty detection list is not proof a trace is clean:
|
|
84
|
+
|
|
85
|
+
- **Detector off.** `moda overview` lists every detector under `detectors`
|
|
86
|
+
(`enabled: true|false|null`, the `setting` it reads). The emotion stage
|
|
87
|
+
(every emotion family, frustration included) reads `signals.frustration`;
|
|
88
|
+
custom signals read `signals.custom_signals`; laziness, hallucination and
|
|
89
|
+
tool failures have no tenant switch. `detections list --family=emotion|frustration`
|
|
90
|
+
and `--family=custom_signal` carry the same state in `processing` and warn
|
|
91
|
+
when it is off.
|
|
92
|
+
- **Not processed yet.** `traces list` rows carry `processing_status`
|
|
93
|
+
(`pending` until the pipeline completes the trace, then `complete`),
|
|
94
|
+
`error_message`, `indexed_at` and `membership_score` (use-case confidence
|
|
95
|
+
for `cluster_id`), the same values as the dashboard trace list.
|
|
96
|
+
`traces get` (including `--all`) carries them in `trace_state`. Both warn on
|
|
97
|
+
pending or errored traces: a pending trace may already have some detections,
|
|
98
|
+
but its detections may be incomplete.
|
|
99
|
+
|
|
47
100
|
### 6. Tool failure investigation
|
|
48
101
|
|
|
49
102
|
```bash
|