Files
state-hub/dashboard/test/wsjf-triage.test.mjs

118 lines
4.0 KiB
JavaScript

import assert from "node:assert/strict";
import test from "node:test";
import {
buildCandidateIndex,
buildPatternRows,
candidateKeysForWorkplan,
formatActionCount,
normalizeTriageReports,
resolveCandidate,
topAction,
truncateSummary,
} from "../src/components/wsjf-triage.js";
test("candidate keys resolve workplan ids and filename slugs", () => {
assert.deepEqual(
candidateKeysForWorkplan({filename: "CUST-WP-0003-whi-kpi-card.md"}).sort(),
["cust-wp-0003", "cust-wp-0003-whi-kpi-card", "whi-kpi-card"],
);
assert.deepEqual(
candidateKeysForWorkplan({filename: "260501-CUST-WP-0028-e2e-sandbox-framework.md"}).sort(),
["cust-wp-0028", "cust-wp-0028-e2e-sandbox-framework", "e2e-sandbox-framework"],
);
});
test("candidate index resolves daily report candidates to workstream ids", () => {
const index = buildCandidateIndex({
workstreams: {
"d9d9a3ec-f736-4041-beac-bb92c7ad314e": {
filename: "CUST-WP-0045-activity-core-daily-triage-runner.md",
},
"9cc32158-2f5c-4ef6-9713-aacce4623d5e": {
filename: "CUST-WP-0003-whi-kpi-card.md",
},
"36162ff0-9b47-47c4-8602-56767f9b7a1c": {
filename: "ADHOC-2026-06-01.md",
},
},
});
assert.equal(resolveCandidate("cust-wp-0045", index).id, "d9d9a3ec-f736-4041-beac-bb92c7ad314e");
assert.equal(resolveCandidate("whi-kpi-card", index).id, "9cc32158-2f5c-4ef6-9713-aacce4623d5e");
assert.equal(resolveCandidate("adhoc-2026-06-01", index).id, "36162ff0-9b47-47c4-8602-56767f9b7a1c");
assert.equal(resolveCandidate("missing-wp-0001", index), null);
});
test("triage events normalize reports and action summaries", () => {
const [report] = normalizeTriageReports([
{
id: "935244fa-b438-488c-a11a-42e1a84e3d59",
summary: "event summary",
created_at: "2026-06-02T12:52:14.460214Z",
author: "activity-core",
detail: {
scheduled_for: "2026-06-02T12:52:01.690214+00:00",
instruction_id: "daily-triage-report",
activity_core_run_id: "f9b97749-c1d0-5746-ab18-89932bef47c1",
report: {
summary: "daily summary",
recommendations: [
{candidate: "cust-wp-0045", action: "work-next", confidence: "high", why: "runner"},
{candidate: "cust-wp-0046", action: "needs-human", confidence: "high", why: "blocked"},
{candidate: "whi-kpi-card", action: "work-next", confidence: "medium", why: "health"},
],
},
},
},
]);
assert.equal(report.summary, "daily summary");
assert.equal(report.date, "2026-06-02");
assert.equal(report.recommendations.length, 3);
assert.equal(report.memory_path, "the-custodian/memory/working/daily-triage-2026-06-02-f9b97749.md");
assert.deepEqual(topAction(report.recommendations), {action: "work-next", count: 2});
assert.equal(formatActionCount(topAction(report.recommendations)), "work-next x2");
});
test("pattern rows aggregate repeated candidates by action", () => {
const reports = normalizeTriageReports([
{
id: "one",
created_at: "2026-06-03T06:00:00Z",
detail: {
report: {
recommendations: [
{candidate: "cust-wp-0046", action: "needs-human"},
{candidate: "cust-wp-0045", action: "work-next"},
],
},
},
},
{
id: "two",
created_at: "2026-06-02T06:00:00Z",
detail: {
report: {
recommendations: [
{candidate: "cust-wp-0046", action: "needs-human"},
{candidate: "cust-wp-0046", action: "revisit"},
],
},
},
},
]);
const [first, second] = buildPatternRows(reports);
assert.equal(first.candidateKey, "cust-wp-0046");
assert.equal(first.count, 3);
assert.equal(first.action, "needs-human");
assert.equal(first.actionCount, 2);
assert.equal(second.candidateKey, "cust-wp-0045");
});
test("summary truncation keeps compact table rows", () => {
assert.equal(truncateSummary("short", 120), "short");
assert.equal(truncateSummary("abcdefghijklmnopqrstuvwxyz", 10), "abcdefg...");
});