@productbrain/cli 0.1.0-beta.3377 → 0.1.0-beta.3391
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/commands/conflicts.d.ts +30 -1
- package/dist/commands/conflicts.d.ts.map +1 -1
- package/dist/commands/conflicts.js +130 -7
- package/dist/commands/conflicts.js.map +1 -1
- package/dist/commands/conflicts.test.js +111 -9
- package/dist/commands/conflicts.test.js.map +1 -1
- package/dist/commands/direction.d.ts +10 -0
- package/dist/commands/direction.d.ts.map +1 -0
- package/dist/commands/direction.js +79 -0
- package/dist/commands/direction.js.map +1 -0
- package/dist/commands/promote.d.ts.map +1 -1
- package/dist/commands/promote.js +6 -0
- package/dist/commands/promote.js.map +1 -1
- package/dist/formatters/conflicts.d.ts +26 -1
- package/dist/formatters/conflicts.d.ts.map +1 -1
- package/dist/formatters/conflicts.js +46 -8
- package/dist/formatters/conflicts.js.map +1 -1
- package/dist/formatters/conflicts.test.js +62 -9
- package/dist/formatters/conflicts.test.js.map +1 -1
- package/dist/formatters/direction.d.ts +48 -0
- package/dist/formatters/direction.d.ts.map +1 -0
- package/dist/formatters/direction.js +75 -0
- package/dist/formatters/direction.js.map +1 -0
- package/dist/formatters/direction.test.d.ts +2 -0
- package/dist/formatters/direction.test.d.ts.map +1 -0
- package/dist/formatters/direction.test.js +70 -0
- package/dist/formatters/direction.test.js.map +1 -0
- package/dist/formatters/promote.d.ts +7 -0
- package/dist/formatters/promote.d.ts.map +1 -1
- package/dist/formatters/promote.js +9 -0
- package/dist/formatters/promote.js.map +1 -1
- package/dist/formatters/scoreboard.d.ts.map +1 -1
- package/dist/formatters/scoreboard.js +39 -0
- package/dist/formatters/scoreboard.js.map +1 -1
- package/dist/formatters/scoreboard.test.js +118 -0
- package/dist/formatters/scoreboard.test.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/lib/commanderOptions.d.ts +8 -0
- package/dist/lib/commanderOptions.d.ts.map +1 -0
- package/dist/lib/commanderOptions.js +10 -0
- package/dist/lib/commanderOptions.js.map +1 -0
- package/dist/scoreboard/diagnose.d.ts +23 -7
- package/dist/scoreboard/diagnose.d.ts.map +1 -1
- package/dist/scoreboard/diagnose.js.map +1 -1
- package/dist/scoreboard/diagnose.test.js +6 -0
- package/dist/scoreboard/diagnose.test.js.map +1 -1
- package/package.json +1 -1
|
@@ -20,13 +20,34 @@ export interface ConflictListItem {
|
|
|
20
20
|
explanation: string;
|
|
21
21
|
createdAt: number;
|
|
22
22
|
dangling: boolean;
|
|
23
|
+
/** C2 (WP-468): review fix (PR #528 P2) — the API has returned these since C2 shipped;
|
|
24
|
+
* the pretty renderer never rendered them. `null` = unverdicted / not currently snoozed. */
|
|
25
|
+
humanVerdict?: 'real' | 'false_alarm' | null;
|
|
26
|
+
snoozedUntil?: number | null;
|
|
27
|
+
/** Present only in `--all` mode — per-row debt guidance for a verdicted/snoozed row. */
|
|
28
|
+
guidance?: string | null;
|
|
29
|
+
/** Review fix (PR #528 round 2, P2): stamped on every row in `--all` mode — true when the
|
|
30
|
+
* server's 200-row debt-pile scan was capped, so lower-confidence rows beyond it are hidden.
|
|
31
|
+
* Was previously undisclosed: the header rendered an exact-looking "Open conflicts (200)"
|
|
32
|
+
* with no way for an operator to know more debt existed past the cap. */
|
|
33
|
+
listTruncated?: boolean;
|
|
23
34
|
}
|
|
35
|
+
/** Which server-side view produced the list — threads through to the empty-state message and
|
|
36
|
+
* per-row guidance rendering (review fix, PR #528 P2). */
|
|
37
|
+
export type ConflictListMode = 'actionable' | 'all';
|
|
24
38
|
/** Age is derived at render time from the existing createdAt field — never a stored field. */
|
|
25
39
|
export declare function formatConflictAge(createdAt: number, now?: number): string;
|
|
26
40
|
export declare function formatConflictItem(item: ConflictListItem, now?: number): string;
|
|
27
|
-
export declare function formatConflictsList(items: ConflictListItem[],
|
|
41
|
+
export declare function formatConflictsList(items: ConflictListItem[], options?: {
|
|
42
|
+
mode?: ConflictListMode;
|
|
43
|
+
now?: number;
|
|
44
|
+
}): string;
|
|
28
45
|
export type ConflictVerdict = 'real' | 'false_alarm';
|
|
29
46
|
export declare function formatConflictResolve(value: unknown, verdict: ConflictVerdict): string;
|
|
47
|
+
/** `pb conflicts snooze` render — bounded, logged debt (Q6: never phrased as a dismissal). */
|
|
48
|
+
export declare function formatConflictSnooze(value: unknown): string;
|
|
49
|
+
/** `pb conflicts reverdict` render — a logged amendment, names the prior value (point 3). */
|
|
50
|
+
export declare function formatConflictReverdict(value: unknown, verdict: ConflictVerdict): string;
|
|
30
51
|
export interface HumanBar {
|
|
31
52
|
meets: boolean;
|
|
32
53
|
lowerBound: number | null;
|
|
@@ -38,6 +59,10 @@ export interface ConflictsSummary {
|
|
|
38
59
|
real: number;
|
|
39
60
|
falseAlarm: number;
|
|
40
61
|
humanBar: HumanBar;
|
|
62
|
+
/** Review fix (PR #528 round 3, P2): true when the resolved/open-verdicted scan truncated —
|
|
63
|
+
* reviewed/real/falseAlarm/humanBar then describe a SAMPLE, not the full population, the same
|
|
64
|
+
* honesty rule already applied to the scoreboard panel and getContradictionEnforcementStatus. */
|
|
65
|
+
truncated?: boolean;
|
|
41
66
|
[key: string]: unknown;
|
|
42
67
|
}
|
|
43
68
|
export declare function formatConflictsSummary(value: ConflictsSummary): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/formatters/conflicts.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"conflicts.d.ts","sourceRoot":"","sources":["../../src/formatters/conflicts.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB;iGAC6F;IAC7F,YAAY,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAAC;IAC7C,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,wFAAwF;IACxF,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;8EAG0E;IAC1E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;2DAC2D;AAC3D,MAAM,MAAM,gBAAgB,GAAG,YAAY,GAAG,KAAK,CAAC;AAMpD,8FAA8F;AAC9F,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,MAAM,CAUrF;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAQ/E;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,gBAAgB,EAAE,EACzB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,gBAAgB,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GACtD,MAAM,CAiBR;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,aAAa,CAAC;AAErD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAOtF;AAED,8FAA8F;AAC9F,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAM3D;AAED,6FAA6F;AAC7F,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAMxF;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,iGAAiG;AACjG,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB;;sGAEkG;IAClG,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAStE"}
|
|
@@ -19,16 +19,53 @@ export function formatConflictAge(createdAt, now = Date.now()) {
|
|
|
19
19
|
}
|
|
20
20
|
export function formatConflictItem(item, now) {
|
|
21
21
|
const dangle = item.dangling ? ' [dangling]' : '';
|
|
22
|
-
|
|
22
|
+
const base = `[${item.confidence.toFixed(2)}] ${singleLine(item.id)} · ${singleLine(item.entryAName)} ↔ ${singleLine(item.entryBName)} · ${singleLine(item.conflictType)} · ${formatConflictAge(item.createdAt, now)}${dangle}`;
|
|
23
|
+
// Review fix (PR #528 P2): the API has returned guidance/humanVerdict/snoozedUntil since C2
|
|
24
|
+
// shipped — render them so a verdicted-real or snoozed debt row reads as debt, not as a
|
|
25
|
+
// plain unreviewed advisory (the `--all` guidance text was computed server-side and dropped).
|
|
26
|
+
if (item.guidance)
|
|
27
|
+
return `${base}\n ↳ ${singleLine(item.guidance)}`;
|
|
28
|
+
return base;
|
|
23
29
|
}
|
|
24
|
-
export function formatConflictsList(items,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
:
|
|
30
|
+
export function formatConflictsList(items, options = {}) {
|
|
31
|
+
const { mode = 'actionable', now } = options;
|
|
32
|
+
if (items.length === 0) {
|
|
33
|
+
// Review fix (PR #528 P2): an empty ACTIONABLE result must never claim "no open conflicts"
|
|
34
|
+
// when snoozed/verdicted debt rows still exist — only the 'all' read means the workspace is
|
|
35
|
+
// genuinely clean of every open row.
|
|
36
|
+
return mode === 'all'
|
|
37
|
+
? 'No open conflicts.'
|
|
38
|
+
: 'No actionable conflicts (open, unverdicted, unsnoozed). Run `pb conflicts list --all` to see verdicted/snoozed debt.';
|
|
39
|
+
}
|
|
40
|
+
// Review fix (PR #528 round 2, P2): every row carries the SAME listTruncated stamp in --all
|
|
41
|
+
// mode (checking [0] is sufficient, never re-derived per-row).
|
|
42
|
+
const truncated = mode === 'all' && items[0]?.listTruncated === true;
|
|
43
|
+
const header = mode === 'all'
|
|
44
|
+
? `Open conflicts (${items.length}${truncated ? '+' : ''})`
|
|
45
|
+
: `Actionable conflicts (${items.length})`;
|
|
46
|
+
return [header, '', ...items.map((item) => formatConflictItem(item, now))].join('\n');
|
|
28
47
|
}
|
|
29
48
|
export function formatConflictResolve(value, verdict) {
|
|
30
49
|
if (value && typeof value === 'object' && 'ok' in value && value.ok === true) {
|
|
31
|
-
return
|
|
50
|
+
return verdict === 'real'
|
|
51
|
+
? 'Verdict recorded: real — the row stays open (visible until the content changes).'
|
|
52
|
+
: 'Verdict recorded: noise — the row is resolved.';
|
|
53
|
+
}
|
|
54
|
+
return JSON.stringify(value, null, 2);
|
|
55
|
+
}
|
|
56
|
+
/** `pb conflicts snooze` render — bounded, logged debt (Q6: never phrased as a dismissal). */
|
|
57
|
+
export function formatConflictSnooze(value) {
|
|
58
|
+
if (value && typeof value === 'object' && 'snoozedUntil' in value) {
|
|
59
|
+
const v = value;
|
|
60
|
+
return `Snoozed until ${new Date(v.snoozedUntil).toISOString()} (snooze #${v.snoozeCount}) — this is logged debt, not a verdict.`;
|
|
61
|
+
}
|
|
62
|
+
return JSON.stringify(value, null, 2);
|
|
63
|
+
}
|
|
64
|
+
/** `pb conflicts reverdict` render — a logged amendment, names the prior value (point 3). */
|
|
65
|
+
export function formatConflictReverdict(value, verdict) {
|
|
66
|
+
if (value && typeof value === 'object' && 'priorVerdict' in value) {
|
|
67
|
+
const v = value;
|
|
68
|
+
return `Reverdicted: ${v.priorVerdict} → ${verdict} (logged amendment).`;
|
|
32
69
|
}
|
|
33
70
|
return JSON.stringify(value, null, 2);
|
|
34
71
|
}
|
|
@@ -36,9 +73,10 @@ export function formatConflictsSummary(value) {
|
|
|
36
73
|
const lowerBoundText = value.humanBar.lowerBound === null
|
|
37
74
|
? 'null (no reviewed rows yet)'
|
|
38
75
|
: value.humanBar.lowerBound.toFixed(3);
|
|
76
|
+
const sampledSuffix = value.truncated ? ' (sampled — scan cap reached)' : '';
|
|
39
77
|
return [
|
|
40
|
-
`Verdict summary: reviewed ${value.reviewed}, real ${value.real}, falseAlarm ${value.falseAlarm}`,
|
|
41
|
-
`Wilson bar (human cohort): lowerBound ${lowerBoundText}, meets ${value.humanBar.meets}`,
|
|
78
|
+
`Verdict summary: reviewed ${value.reviewed}, real ${value.real}, falseAlarm ${value.falseAlarm}${sampledSuffix}`,
|
|
79
|
+
`Wilson bar (human cohort): lowerBound ${lowerBoundText}, meets ${value.humanBar.meets}${sampledSuffix}`,
|
|
42
80
|
].join('\n');
|
|
43
81
|
}
|
|
44
82
|
//# sourceMappingURL=conflicts.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/formatters/conflicts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"conflicts.js","sourceRoot":"","sources":["../../src/formatters/conflicts.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,34 +17,53 @@ function item(overrides = {}) {
|
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
19
|
describe('conflicts formatters', () => {
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
// Review fix (PR #528 P2): the empty-state message is now MODE-AWARE — an empty ACTIONABLE
|
|
21
|
+
// result must never claim "no open conflicts" when verdicted/snoozed debt rows still exist.
|
|
22
|
+
it('renders an honest empty state for the actionable (default) mode — never "no open conflicts" when debt may still exist', () => {
|
|
23
|
+
expect(formatConflictsList([], { now: NOW })).toContain('No actionable conflicts');
|
|
24
|
+
expect(formatConflictsList([], { now: NOW })).not.toBe('No open conflicts.');
|
|
25
|
+
});
|
|
26
|
+
it('renders "No open conflicts." only for the all-mode empty state (the workspace is genuinely clean)', () => {
|
|
27
|
+
expect(formatConflictsList([], { mode: 'all', now: NOW })).toBe('No open conflicts.');
|
|
22
28
|
});
|
|
23
29
|
it('renders workspace rows with entry names, confidence, and relative age', () => {
|
|
24
|
-
const output = formatConflictsList([item()], NOW);
|
|
25
|
-
expect(output).toContain('
|
|
30
|
+
const output = formatConflictsList([item()], { now: NOW });
|
|
31
|
+
expect(output).toContain('Actionable conflicts (1)');
|
|
26
32
|
expect(output).toContain('DEC-1');
|
|
27
33
|
expect(output).toContain('DEC-2');
|
|
28
34
|
expect(output).toContain('0.85');
|
|
29
35
|
expect(output).toContain('3d ago');
|
|
30
36
|
});
|
|
31
37
|
it('marks dangling rows (a partner entry was deleted)', () => {
|
|
32
|
-
const output = formatConflictsList([item({ dangling: true })], NOW);
|
|
38
|
+
const output = formatConflictsList([item({ dangling: true })], { now: NOW });
|
|
33
39
|
expect(output).toContain('[dangling]');
|
|
34
40
|
});
|
|
35
41
|
it('renders the non-underscore id — the field that survives the CLI JSON envelope\'s stripConvexInternals (TEN-340)', () => {
|
|
36
|
-
const output = formatConflictsList([item({ id: 'issue-target-1' })], NOW);
|
|
42
|
+
const output = formatConflictsList([item({ id: 'issue-target-1' })], { now: NOW });
|
|
37
43
|
expect(output).toContain('issue-target-1');
|
|
38
44
|
});
|
|
45
|
+
// C2 (WP-468) review fix (PR #528 P2): the server-computed per-row guidance for a
|
|
46
|
+
// verdicted/snoozed debt row must actually render in the `--all` pretty output.
|
|
47
|
+
it('renders per-row guidance text for a verdicted/snoozed debt row in --all mode', () => {
|
|
48
|
+
const output = formatConflictsList([item({ humanVerdict: 'real', guidance: 'confirmed contradiction (real) — supersede or archive one side' })], { mode: 'all', now: NOW });
|
|
49
|
+
expect(output).toContain('Open conflicts (1)');
|
|
50
|
+
expect(output).toContain('confirmed contradiction (real)');
|
|
51
|
+
});
|
|
52
|
+
it('renders a plain row (no guidance line) for an actionable row with no guidance field', () => {
|
|
53
|
+
const output = formatConflictsList([item()], { now: NOW });
|
|
54
|
+
expect(output).not.toContain('↳');
|
|
55
|
+
});
|
|
39
56
|
it('derives age purely from createdAt at render time — sub-minute, sub-hour, sub-day tiers', () => {
|
|
40
57
|
expect(formatConflictAge(NOW - 30_000, NOW)).toBe('30s ago');
|
|
41
58
|
expect(formatConflictAge(NOW - 5 * 60_000, NOW)).toBe('5m ago');
|
|
42
59
|
expect(formatConflictAge(NOW - 2 * 60 * 60_000, NOW)).toBe('2h ago');
|
|
43
60
|
expect(formatConflictAge(NOW - 4 * 24 * 60 * 60_000, NOW)).toBe('4d ago');
|
|
44
61
|
});
|
|
45
|
-
it('renders a resolve receipt naming the recorded CLI-vocabulary verdict', () => {
|
|
46
|
-
expect(formatConflictResolve({ ok: true }, 'real')).
|
|
47
|
-
expect(formatConflictResolve({ ok: true }, '
|
|
62
|
+
it('renders a resolve receipt naming the recorded CLI-vocabulary verdict — real stays open, noise resolves (C2)', () => {
|
|
63
|
+
expect(formatConflictResolve({ ok: true }, 'real')).toContain('real');
|
|
64
|
+
expect(formatConflictResolve({ ok: true }, 'real')).toContain('stays open');
|
|
65
|
+
expect(formatConflictResolve({ ok: true }, 'false_alarm')).toContain('noise');
|
|
66
|
+
expect(formatConflictResolve({ ok: true }, 'false_alarm')).toContain('resolved');
|
|
48
67
|
});
|
|
49
68
|
it('renders the summary with raw counts and the humanBar Wilson-bound fields exactly as returned', () => {
|
|
50
69
|
const output = formatConflictsSummary({
|
|
@@ -79,5 +98,39 @@ describe('conflicts formatters', () => {
|
|
|
79
98
|
expect(output).toContain('null');
|
|
80
99
|
expect(output).not.toContain('lowerBound 0,');
|
|
81
100
|
});
|
|
101
|
+
// Review fix (PR #528 round 3, P2): when the verdict scan truncated, reviewed/real/falseAlarm
|
|
102
|
+
// and the Wilson bar describe only the SAMPLED cohort — must render a qualifier, matching the
|
|
103
|
+
// scoreboard panel's existing verdictsSuffix pattern.
|
|
104
|
+
it('renders a truncation qualifier on both lines when the verdict scan truncated', () => {
|
|
105
|
+
const output = formatConflictsSummary({
|
|
106
|
+
reviewed: 1300,
|
|
107
|
+
real: 1200,
|
|
108
|
+
falseAlarm: 100,
|
|
109
|
+
open: 0,
|
|
110
|
+
resolvedWithoutVerdict: 0,
|
|
111
|
+
precision: 0.92,
|
|
112
|
+
truncated: true,
|
|
113
|
+
humanBar: { meets: true, lowerBound: 0.9, reviewed: 1300 },
|
|
114
|
+
escalatedCohort: { byModel: {}, crossTab: [] },
|
|
115
|
+
});
|
|
116
|
+
expect(output).toContain('sampled — scan cap reached');
|
|
117
|
+
const lines = output.split('\n');
|
|
118
|
+
expect(lines[0]).toContain('sampled — scan cap reached');
|
|
119
|
+
expect(lines[1]).toContain('sampled — scan cap reached');
|
|
120
|
+
});
|
|
121
|
+
it('renders NO truncation qualifier when the verdict scan did not truncate', () => {
|
|
122
|
+
const output = formatConflictsSummary({
|
|
123
|
+
reviewed: 2,
|
|
124
|
+
real: 1,
|
|
125
|
+
falseAlarm: 1,
|
|
126
|
+
open: 0,
|
|
127
|
+
resolvedWithoutVerdict: 0,
|
|
128
|
+
precision: 0.5,
|
|
129
|
+
truncated: false,
|
|
130
|
+
humanBar: { meets: false, lowerBound: 0.05, reviewed: 2 },
|
|
131
|
+
escalatedCohort: { byModel: {}, crossTab: [] },
|
|
132
|
+
});
|
|
133
|
+
expect(output).not.toContain('sampled');
|
|
134
|
+
});
|
|
82
135
|
});
|
|
83
136
|
//# sourceMappingURL=conflicts.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conflicts.test.js","sourceRoot":"","sources":["../../src/formatters/conflicts.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,GAAG,GAAG,iBAAiB,CAAC;AAE9B,SAAS,IAAI,CAAC,YAAuC,EAAE;IACrD,OAAO;QACL,EAAE,EAAE,SAAS;QACb,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,OAAO;QACnB,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,OAAO;QACnB,YAAY,EAAE,eAAe;QAC7B,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,eAAe;QAC5B,SAAS,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QACxC,QAAQ,EAAE,KAAK;QACf,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC
|
|
1
|
+
{"version":3,"file":"conflicts.test.js","sourceRoot":"","sources":["../../src/formatters/conflicts.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,GAEvB,MAAM,gBAAgB,CAAC;AAExB,MAAM,GAAG,GAAG,iBAAiB,CAAC;AAE9B,SAAS,IAAI,CAAC,YAAuC,EAAE;IACrD,OAAO;QACL,EAAE,EAAE,SAAS;QACb,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,OAAO;QACnB,QAAQ,EAAE,OAAO;QACjB,UAAU,EAAE,OAAO;QACnB,YAAY,EAAE,eAAe;QAC7B,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,eAAe;QAC5B,SAAS,EAAE,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QACxC,QAAQ,EAAE,KAAK;QACf,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,2FAA2F;IAC3F,4FAA4F;IAC5F,EAAE,CAAC,uHAAuH,EAAE,GAAG,EAAE;QAC/H,MAAM,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACnF,MAAM,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mGAAmG,EAAE,GAAG,EAAE;QAC3G,MAAM,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7E,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iHAAiH,EAAE,GAAG,EAAE;QACzH,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACnF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,kFAAkF;IAClF,gFAAgF;IAChF,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,MAAM,GAAG,mBAAmB,CAChC,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,gEAAgE,EAAE,CAAC,CAAC,EAC5G,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAC1B,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,MAAM,MAAM,GAAG,mBAAmB,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;QAChG,MAAM,CAAC,iBAAiB,CAAC,GAAG,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChE,MAAM,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,CAAC,iBAAiB,CAAC,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6GAA6G,EAAE,GAAG,EAAE;QACrH,MAAM,CAAC,qBAAqB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACtE,MAAM,CAAC,qBAAqB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC5E,MAAM,CAAC,qBAAqB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC9E,MAAM,CAAC,qBAAqB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8FAA8F,EAAE,GAAG,EAAE;QACtG,MAAM,MAAM,GAAG,sBAAsB,CAAC;YACpC,QAAQ,EAAE,CAAC;YACX,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,CAAC;YACP,sBAAsB,EAAE,CAAC;YACzB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;YACzD,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gGAAgG,EAAE,GAAG,EAAE;QACxG,MAAM,MAAM,GAAG,sBAAsB,CAAC;YACpC,QAAQ,EAAE,CAAC;YACX,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,CAAC;YACP,sBAAsB,EAAE,CAAC;YACzB,SAAS,EAAE,CAAC;YACZ,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;YACzD,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,8FAA8F;IAC9F,8FAA8F;IAC9F,sDAAsD;IACtD,EAAE,CAAC,8EAA8E,EAAE,GAAG,EAAE;QACtF,MAAM,MAAM,GAAG,sBAAsB,CAAC;YACpC,QAAQ,EAAE,IAAI;YACd,IAAI,EAAE,IAAI;YACV,UAAU,EAAE,GAAG;YACf,IAAI,EAAE,CAAC;YACP,sBAAsB,EAAE,CAAC;YACzB,SAAS,EAAE,IAAI;YACf,SAAS,EAAE,IAAI;YACf,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC1D,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACzD,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,MAAM,GAAG,sBAAsB,CAAC;YACpC,QAAQ,EAAE,CAAC;YACX,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,CAAC;YACP,sBAAsB,EAAE,CAAC;YACzB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,KAAK;YAChB,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;YACzD,eAAe,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;SAC/C,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `pb direction` — human-formatted rendering for the upward direction trace (WP-582 B1,
|
|
3
|
+
* FEAT-1403). Mirrors formatters/conflicts.ts's shape: kernel purity, no state-machine logic
|
|
4
|
+
* here — every field is rendered exactly as the stored directionTraceSnapshots row carries it.
|
|
5
|
+
*/
|
|
6
|
+
export type DirectionTraceChallengedState = 'reachedVisionOnly' | 'noPath' | 'truncated';
|
|
7
|
+
export interface DirectionTraceSampleRow {
|
|
8
|
+
entryId: string;
|
|
9
|
+
name: string;
|
|
10
|
+
state: DirectionTraceChallengedState;
|
|
11
|
+
updatedAt: number;
|
|
12
|
+
candidateStrategyNames: string[];
|
|
13
|
+
deferred?: {
|
|
14
|
+
reason: string;
|
|
15
|
+
deferredAt: number;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export interface DirectionTraceCounts {
|
|
19
|
+
reached: number;
|
|
20
|
+
reachedVisionOnly: number;
|
|
21
|
+
reachedUnclassified: number;
|
|
22
|
+
noPath: number;
|
|
23
|
+
truncated: number;
|
|
24
|
+
total: number;
|
|
25
|
+
}
|
|
26
|
+
export interface DirectionTraceSnapshot {
|
|
27
|
+
computedAt: number;
|
|
28
|
+
counts: DirectionTraceCounts;
|
|
29
|
+
sample: DirectionTraceSampleRow[];
|
|
30
|
+
sampleTruncated?: boolean;
|
|
31
|
+
sampleTotalChallenged?: number;
|
|
32
|
+
originsTruncated?: boolean;
|
|
33
|
+
baselineAt: number;
|
|
34
|
+
baselineCounts: DirectionTraceCounts;
|
|
35
|
+
}
|
|
36
|
+
export declare const DIRECTION_LIST_DEFAULT_LIMIT = 5;
|
|
37
|
+
export declare function formatDirectionList(snapshot: DirectionTraceSnapshot | null, options?: {
|
|
38
|
+
all?: boolean;
|
|
39
|
+
}): string;
|
|
40
|
+
export declare function formatDirectionRefresh(result: {
|
|
41
|
+
counts: DirectionTraceCounts;
|
|
42
|
+
}): string;
|
|
43
|
+
export declare function formatDirectionDefer(result: {
|
|
44
|
+
entryId: string;
|
|
45
|
+
reason: string;
|
|
46
|
+
count?: number;
|
|
47
|
+
}): string;
|
|
48
|
+
//# sourceMappingURL=direction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direction.d.ts","sourceRoot":"","sources":["../../src/formatters/direction.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAIH,MAAM,MAAM,6BAA6B,GAAG,mBAAmB,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEzF,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,6BAA6B,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,QAAQ,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,sBAAsB;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,EAAE,uBAAuB,EAAE,CAAC;IAIlC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAI/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,oBAAoB,CAAC;CACtC;AAoBD,eAAO,MAAM,4BAA4B,IAAI,CAAC;AAE9C,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,IAAI,EAAE,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,MAAM,CAgDpH;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,oBAAoB,CAAA;CAAE,GAAG,MAAM,CAIvF;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAGxG"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { stripControlChars } from '../lib/strip.js';
|
|
2
|
+
function singleLine(value) {
|
|
3
|
+
return stripControlChars(value).replace(/\s+/g, ' ').trim();
|
|
4
|
+
}
|
|
5
|
+
const STATE_LABEL = {
|
|
6
|
+
reachedVisionOnly: 'vision-only',
|
|
7
|
+
noPath: 'no path',
|
|
8
|
+
truncated: 'truncated (inconclusive)',
|
|
9
|
+
};
|
|
10
|
+
function formatSampleRow(row) {
|
|
11
|
+
const deferredNote = row.deferred ? ` [deferred: ${singleLine(row.deferred.reason)}]` : '';
|
|
12
|
+
const candidatesNote = row.candidateStrategyNames.length > 0
|
|
13
|
+
? ` · candidates: ${row.candidateStrategyNames.map(singleLine).join(', ')}`
|
|
14
|
+
: '';
|
|
15
|
+
return `${singleLine(row.entryId)} · ${singleLine(row.name)} · ${STATE_LABEL[row.state]}${candidatesNote}${deferredNote}`;
|
|
16
|
+
}
|
|
17
|
+
export const DIRECTION_LIST_DEFAULT_LIMIT = 5;
|
|
18
|
+
export function formatDirectionList(snapshot, options = {}) {
|
|
19
|
+
if (!snapshot) {
|
|
20
|
+
return 'Direction trace: not computed yet · `pb direction refresh`';
|
|
21
|
+
}
|
|
22
|
+
const { counts, sample } = snapshot;
|
|
23
|
+
const computedAtIso = new Date(snapshot.computedAt).toISOString();
|
|
24
|
+
const baselineIso = new Date(snapshot.baselineAt).toISOString();
|
|
25
|
+
const lines = [
|
|
26
|
+
`Direction trace (computed ${computedAtIso}) — baseline accepted ${baselineIso}:`,
|
|
27
|
+
` reached ${counts.reached} · vision-only ${counts.reachedVisionOnly} · unclassified ${counts.reachedUnclassified} · ` +
|
|
28
|
+
`no-path ${counts.noPath} · truncated ${counts.truncated} · total ${counts.total}`,
|
|
29
|
+
` (baseline: reached ${snapshot.baselineCounts.reached} of ${snapshot.baselineCounts.total} — a newly-honest signal, not an improvement)`,
|
|
30
|
+
];
|
|
31
|
+
if (sample.length === 0) {
|
|
32
|
+
// Codex P2 review (PR #529): an empty sample is honestly "every bet reaches a strategy" ONLY
|
|
33
|
+
// when reached === total. `reachedUnclassified` is deliberately excluded from the sample (the
|
|
34
|
+
// shape's own contract) but is NOT `reached` — a workspace where every non-reached bet landed
|
|
35
|
+
// on an unclassified strategy-collection terminal would previously render the same falsely
|
|
36
|
+
// reassuring "every bet reaches a strategy" line despite `counts.reachedUnclassified > 0`.
|
|
37
|
+
if (counts.reached === counts.total) {
|
|
38
|
+
lines.push('', 'No challenged bets — every active bet reaches a strategy.');
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
lines.push('', `No challenged bets in the sample, but ${counts.reachedUnclassified} bet${counts.reachedUnclassified === 1 ? '' : 's'} ` +
|
|
42
|
+
'reached an unclassified strategy-collection terminal (excluded from "challenged" by design — see `counts` above).');
|
|
43
|
+
}
|
|
44
|
+
if (snapshot.originsTruncated) {
|
|
45
|
+
lines.push('', '⚠ Origin enumeration capped at 1000 active bets — `counts.total` may under-count the true denominator.');
|
|
46
|
+
}
|
|
47
|
+
return lines.join('\n');
|
|
48
|
+
}
|
|
49
|
+
const shown = options.all ? sample : sample.slice(0, DIRECTION_LIST_DEFAULT_LIMIT);
|
|
50
|
+
lines.push('', `Challenged bets${options.all ? '' : ` (top ${shown.length} of ${sample.length}, most-recently-updated first — \`--all\` for the rest)`}:`);
|
|
51
|
+
for (const row of shown)
|
|
52
|
+
lines.push(` ${formatSampleRow(row)}`);
|
|
53
|
+
if (snapshot.sampleTruncated) {
|
|
54
|
+
// Codex P2 review (PR #529): the prior text claimed "recompute narrows this only by deferring
|
|
55
|
+
// or resolving some" — false. Deferring a bet logs bounded debt on the ENTRY but never removes
|
|
56
|
+
// it from the challenged set (readBetDeferFlags still surfaces it, `deferred` just annotates
|
|
57
|
+
// the row), and "resolving" means linking a real strategy via `pb relate` (out of this
|
|
58
|
+
// command's control entirely) — recompute alone never narrows a truncated sample.
|
|
59
|
+
lines.push('', `⚠ Snapshot capped: showing ${sample.length} of ${snapshot.sampleTotalChallenged ?? '?'} total challenged bets — link real strategies (\`pb relate\`) to the shown bets to narrow this; deferring only logs debt, it does not remove a bet from the challenged set.`);
|
|
60
|
+
}
|
|
61
|
+
if (snapshot.originsTruncated) {
|
|
62
|
+
lines.push('', '⚠ Origin enumeration capped at 1000 active bets — `counts.total` may under-count the true denominator.');
|
|
63
|
+
}
|
|
64
|
+
return lines.join('\n');
|
|
65
|
+
}
|
|
66
|
+
export function formatDirectionRefresh(result) {
|
|
67
|
+
const { counts } = result;
|
|
68
|
+
return `Direction trace refreshed — reached ${counts.reached} · vision-only ${counts.reachedVisionOnly} · ` +
|
|
69
|
+
`unclassified ${counts.reachedUnclassified} · no-path ${counts.noPath} · truncated ${counts.truncated} · total ${counts.total}`;
|
|
70
|
+
}
|
|
71
|
+
export function formatDirectionDefer(result) {
|
|
72
|
+
const countNote = typeof result.count === 'number' ? ` (deferred ${result.count} time${result.count === 1 ? '' : 's'} — bounded debt` : ' (bounded debt';
|
|
73
|
+
return `Deferred ${singleLine(result.entryId)}: ${singleLine(result.reason)}${countNote}, never an ack, never auto-related)`;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=direction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direction.js","sourceRoot":"","sources":["../../src/formatters/direction.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direction.test.d.ts","sourceRoot":"","sources":["../../src/formatters/direction.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { formatDirectionList } from './direction.js';
|
|
3
|
+
const NOW = 1_800_000_000_000;
|
|
4
|
+
function baseCounts(overrides = {}) {
|
|
5
|
+
return {
|
|
6
|
+
reached: 10, reachedVisionOnly: 0, reachedUnclassified: 0, noPath: 0, truncated: 0, total: 10,
|
|
7
|
+
...overrides,
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function snapshot(overrides = {}) {
|
|
11
|
+
return {
|
|
12
|
+
computedAt: NOW,
|
|
13
|
+
counts: baseCounts(),
|
|
14
|
+
sample: [],
|
|
15
|
+
baselineAt: NOW - 1000,
|
|
16
|
+
baselineCounts: baseCounts(),
|
|
17
|
+
...overrides,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
describe('direction formatters', () => {
|
|
21
|
+
it('renders the honest "every bet reaches a strategy" line only when reached === total', () => {
|
|
22
|
+
const output = formatDirectionList(snapshot({ counts: baseCounts({ reached: 10, total: 10 }) }));
|
|
23
|
+
expect(output).toContain('No challenged bets — every active bet reaches a strategy.');
|
|
24
|
+
});
|
|
25
|
+
it('does NOT claim "every bet reaches a strategy" when the empty sample hides unclassified terminals (Codex P1/P2, PR #529 T8)', () => {
|
|
26
|
+
// reachedUnclassified is excluded from the sample by design, but a bet reaching an
|
|
27
|
+
// unclassified terminal has NOT reached a strategy — the old unconditional "sample.length
|
|
28
|
+
// === 0" branch rendered the same falsely reassuring line regardless.
|
|
29
|
+
const output = formatDirectionList(snapshot({
|
|
30
|
+
counts: baseCounts({ reached: 4, reachedUnclassified: 6, total: 10 }),
|
|
31
|
+
}));
|
|
32
|
+
expect(output).not.toContain('every active bet reaches a strategy');
|
|
33
|
+
expect(output).toContain('6 bets reached an unclassified strategy-collection terminal');
|
|
34
|
+
});
|
|
35
|
+
it('singularizes the unclassified-terminal count message for exactly one bet', () => {
|
|
36
|
+
const output = formatDirectionList(snapshot({
|
|
37
|
+
counts: baseCounts({ reached: 9, reachedUnclassified: 1, total: 10 }),
|
|
38
|
+
}));
|
|
39
|
+
expect(output).toContain('1 bet reached an unclassified strategy-collection terminal');
|
|
40
|
+
});
|
|
41
|
+
it('does not claim deferring narrows a truncated sample (Codex P2, PR #529 T9)', () => {
|
|
42
|
+
const output = formatDirectionList(snapshot({
|
|
43
|
+
counts: baseCounts({ reached: 0, noPath: 300, total: 300 }),
|
|
44
|
+
sample: Array.from({ length: 200 }, (_, i) => ({
|
|
45
|
+
entryId: `WP-${i}`,
|
|
46
|
+
name: `Bet ${i}`,
|
|
47
|
+
state: 'noPath',
|
|
48
|
+
updatedAt: NOW - i,
|
|
49
|
+
candidateStrategyNames: [],
|
|
50
|
+
})),
|
|
51
|
+
sampleTruncated: true,
|
|
52
|
+
sampleTotalChallenged: 300,
|
|
53
|
+
}));
|
|
54
|
+
expect(output).toContain('⚠ Snapshot capped');
|
|
55
|
+
expect(output).not.toContain('recompute narrows this only by deferring or resolving some');
|
|
56
|
+
expect(output).toContain('deferring only logs debt, it does not remove a bet from the challenged set');
|
|
57
|
+
});
|
|
58
|
+
it('renders an originsTruncated warning distinct from sampleTruncated (Codex P2, PR #529 T2)', () => {
|
|
59
|
+
const output = formatDirectionList(snapshot({
|
|
60
|
+
counts: baseCounts({ reached: 1000, total: 1000 }),
|
|
61
|
+
originsTruncated: true,
|
|
62
|
+
}));
|
|
63
|
+
expect(output).toContain('⚠ Origin enumeration capped at 1000 active bets');
|
|
64
|
+
});
|
|
65
|
+
it('omits the originsTruncated warning when the flag is absent or false', () => {
|
|
66
|
+
const output = formatDirectionList(snapshot({ counts: baseCounts({ reached: 10, total: 10 }) }));
|
|
67
|
+
expect(output).not.toContain('Origin enumeration capped');
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=direction.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"direction.test.js","sourceRoot":"","sources":["../../src/formatters/direction.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAA+B,MAAM,gBAAgB,CAAC;AAElF,MAAM,GAAG,GAAG,iBAAiB,CAAC;AAE9B,SAAS,UAAU,CAAC,YAAuD,EAAE;IAC3E,OAAO;QACL,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;QAC7F,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,YAA6C,EAAE;IAC/D,OAAO;QACL,UAAU,EAAE,GAAG;QACf,MAAM,EAAE,UAAU,EAAE;QACpB,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,GAAG,GAAG,IAAI;QACtB,cAAc,EAAE,UAAU,EAAE;QAC5B,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjG,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,2DAA2D,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4HAA4H,EAAE,GAAG,EAAE;QACpI,mFAAmF;QACnF,0FAA0F;QAC1F,sEAAsE;QACtE,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC;YAC1C,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;SACtE,CAAC,CAAC,CAAC;QACJ,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QACpE,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,6DAA6D,CAAC,CAAC;IAC1F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC;YAC1C,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,mBAAmB,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;SACtE,CAAC,CAAC,CAAC;QACJ,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4DAA4D,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC;YAC1C,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAC3D,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7C,OAAO,EAAE,MAAM,CAAC,EAAE;gBAClB,IAAI,EAAE,OAAO,CAAC,EAAE;gBAChB,KAAK,EAAE,QAAiB;gBACxB,SAAS,EAAE,GAAG,GAAG,CAAC;gBAClB,sBAAsB,EAAE,EAAE;aAC3B,CAAC,CAAC;YACH,eAAe,EAAE,IAAI;YACrB,qBAAqB,EAAE,GAAG;SAC3B,CAAC,CAAC,CAAC;QACJ,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,4DAA4D,CAAC,CAAC;QAC3F,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4EAA4E,CAAC,CAAC;IACzG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAClG,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC;YAC1C,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;YAClD,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC,CAAC;QACJ,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,iDAAiD,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,MAAM,GAAG,mBAAmB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACjG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -67,6 +67,13 @@ export type CommitEntryResult = {
|
|
|
67
67
|
explanation: string;
|
|
68
68
|
}>;
|
|
69
69
|
};
|
|
70
|
+
/**
|
|
71
|
+
* WP-582 B1 (FEAT-1403): the direction-trace promote-time advisory, via D0's
|
|
72
|
+
* publishSeam.finalizePublish accumulator. Present only for a bet/work_package promote
|
|
73
|
+
* whose trace did NOT reach a `strategy` canonicalKey (a real strategy path renders no
|
|
74
|
+
* advisory at all — the array is absent, never empty).
|
|
75
|
+
*/
|
|
76
|
+
publishAdvisories?: string[];
|
|
70
77
|
};
|
|
71
78
|
export declare function formatPromoteReceipt(data: PromoteReceiptData): string;
|
|
72
79
|
//# sourceMappingURL=promote.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/formatters/promote.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,MAAM,iBAAiB,GACzB;IACE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,GAMD;IACE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9B,GACD;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,YAAY,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3F;;;;;;;OAOG;IACH,qBAAqB,CAAC,EAAE;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,KAAK,CAAC;YACrB,YAAY,EAAE,MAAM,CAAC;YACrB,cAAc,EAAE,MAAM,CAAC;YACvB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;KACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"promote.d.ts","sourceRoot":"","sources":["../../src/formatters/promote.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oCAAoC;IACpC,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,MAAM,iBAAiB,GACzB;IACE,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,GAMD;IACE,MAAM,EAAE,mBAAmB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9B,GACD;IACE,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,YAAY,CAAC,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3F;;;;;;;OAOG;IACH,qBAAqB,CAAC,EAAE;QACtB,MAAM,EAAE,MAAM,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,KAAK,CAAC;YACrB,YAAY,EAAE,MAAM,CAAC;YACrB,cAAc,EAAE,MAAM,CAAC;YACvB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,WAAW,EAAE,MAAM,CAAC;SACrB,CAAC,CAAC;KACJ,CAAC;IACF;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B,CAAC;AAEN,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAwErE"}
|
|
@@ -62,6 +62,15 @@ export function formatPromoteReceipt(data) {
|
|
|
62
62
|
lines.push(` - ${c.chainEntryId} (${c.chainEntryName}): ${c.explanation}`);
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
|
+
// WP-582 B1 (FEAT-1403): direction-trace advisory — never a paste-ready `pb relate`, only
|
|
66
|
+
// the question + candidate strategy names (TEN-2906).
|
|
67
|
+
if (r.publishAdvisories && r.publishAdvisories.length > 0) {
|
|
68
|
+
lines.push('');
|
|
69
|
+
lines.push(' ⚠ Direction advisory (entry committed):');
|
|
70
|
+
for (const advisory of r.publishAdvisories) {
|
|
71
|
+
lines.push(` ${advisory}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
65
74
|
lines.push('');
|
|
66
75
|
lines.push(` View: pb get ${displayId}`);
|
|
67
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/formatters/promote.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"promote.js","sourceRoot":"","sources":["../../src/formatters/promote.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scoreboard.d.ts","sourceRoot":"","sources":["../../src/formatters/scoreboard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"scoreboard.d.ts","sourceRoot":"","sources":["../../src/formatters/scoreboard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAwHnE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAuBhE"}
|