@principles/pd-cli 1.141.0 → 1.141.1
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/principles-stats.d.ts +63 -0
- package/dist/commands/principles-stats.d.ts.map +1 -0
- package/dist/commands/principles-stats.js +562 -0
- package/dist/commands/principles-stats.js.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/commands/principles-stats.ts +700 -0
- package/src/index.ts +7 -0
- package/tests/bdd/principles-stats.steps.ts +211 -0
- package/tests/commands/principles-stats-wiring.test.ts +135 -0
- package/tests/commands/principles-stats.test.ts +274 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Command } from 'commander';
|
|
2
|
+
export interface PrinciplesStatsOptions {
|
|
3
|
+
workspace?: string;
|
|
4
|
+
json?: boolean;
|
|
5
|
+
days?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface PrinciplesStatsResult {
|
|
8
|
+
ok: true;
|
|
9
|
+
status: 'ok' | 'degraded';
|
|
10
|
+
workspaceDir: string;
|
|
11
|
+
windowDays: number;
|
|
12
|
+
coverage: {
|
|
13
|
+
eventsDaysFound: string[];
|
|
14
|
+
eventsTurns: number;
|
|
15
|
+
ledgerAvailable: boolean;
|
|
16
|
+
receiptLedgerFlagEnabled: boolean | null;
|
|
17
|
+
receiptSelfReportFlagEnabled: boolean | null;
|
|
18
|
+
notes: string[];
|
|
19
|
+
};
|
|
20
|
+
sessions: number;
|
|
21
|
+
injections: {
|
|
22
|
+
avgDistinctPerSession: number | null;
|
|
23
|
+
avgPerTurn: number | null;
|
|
24
|
+
distinctPrinciples: number;
|
|
25
|
+
source: 'ledger' | 'events' | 'none';
|
|
26
|
+
};
|
|
27
|
+
chars: {
|
|
28
|
+
avgV2PerTurn: number | null;
|
|
29
|
+
avgLegacyPerTurn: number | null;
|
|
30
|
+
truncationRate: number | null;
|
|
31
|
+
v2TruncatedTurns: number;
|
|
32
|
+
legacyTruncatedTurns: number;
|
|
33
|
+
turnsReporting: number;
|
|
34
|
+
};
|
|
35
|
+
duplicates: {
|
|
36
|
+
crossBlockTotal: number;
|
|
37
|
+
crossBlockTop: {
|
|
38
|
+
principleId: string;
|
|
39
|
+
count: number;
|
|
40
|
+
}[];
|
|
41
|
+
intraSessionRepeatShare: number | null;
|
|
42
|
+
};
|
|
43
|
+
applicationCorrelation: {
|
|
44
|
+
presenceRows: number;
|
|
45
|
+
effectRows: number;
|
|
46
|
+
correlatedPrinciples: number;
|
|
47
|
+
top: {
|
|
48
|
+
principleId: string;
|
|
49
|
+
presenceCount: number;
|
|
50
|
+
effectCount: number;
|
|
51
|
+
}[];
|
|
52
|
+
};
|
|
53
|
+
warnings: string[];
|
|
54
|
+
nextAction?: string;
|
|
55
|
+
}
|
|
56
|
+
export declare function handlePrinciplesStats(opts: PrinciplesStatsOptions): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Register the `principles` command group with `stats` subcommand on a
|
|
59
|
+
* Commander program. Used by both production CLI (src/index.ts) and
|
|
60
|
+
* parser-level tests (cli-7-test-wiring).
|
|
61
|
+
*/
|
|
62
|
+
export declare function registerPrinciplesCommand(program: Command): Command;
|
|
63
|
+
//# sourceMappingURL=principles-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principles-stats.d.ts","sourceRoot":"","sources":["../../src/commands/principles-stats.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA+BD,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,IAAI,GAAG,UAAU,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE;QACR,eAAe,EAAE,MAAM,EAAE,CAAC;QAC1B,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,OAAO,CAAC;QACzB,wBAAwB,EAAE,OAAO,GAAG,IAAI,CAAC;QACzC,4BAA4B,EAAE,OAAO,GAAG,IAAI,CAAC;QAC7C,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QACV,qBAAqB,EAAE,MAAM,GAAG,IAAI,CAAC;QACrC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;KACtC,CAAC;IACF,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,gBAAgB,EAAE,MAAM,CAAC;QACzB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,UAAU,EAAE;QACV,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACxD,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;KACxC,CAAC;IACF,sBAAsB,EAAE;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,oBAAoB,EAAE,MAAM,CAAC;QAC7B,GAAG,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,aAAa,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KAC5E,CAAC;IACF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AA8bD,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgGvF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAoBnE"}
|
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* pd principles stats — Principle injection observability (PRI-562 Phase 0).
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* pd principles stats [--json] [--days <n>] [--workspace <path>]
|
|
6
|
+
*
|
|
7
|
+
* Read-only aggregation over two independent sources, answering "what does
|
|
8
|
+
* principle injection actually look like right now?" before any Working Set
|
|
9
|
+
* work changes selection behavior (SPEC v0.2 §6 Phase 0):
|
|
10
|
+
*
|
|
11
|
+
* 1. Event JSONL {workspace}/.state/logs/events_YYYY-MM-DD.jsonl —
|
|
12
|
+
* per-prompt-build records of type 'runtime_v2_prompt_activations_injected'
|
|
13
|
+
* (retention ~7 days; per-turn fidelity incl. chars/truncation/cross-block
|
|
14
|
+
* duplicates from the PRI-562 enriched fields).
|
|
15
|
+
* 2. Receipt ledger {workspace}/.pd/state.db table principle_applications —
|
|
16
|
+
* session×principle presence rows + effect rows (90-day retention;
|
|
17
|
+
* written only when features.principle_receipt_ledger is enabled).
|
|
18
|
+
*
|
|
19
|
+
* Coverage honesty (rc-9): per-turn precision (chars/truncation/per-turn
|
|
20
|
+
* duplicates) is only as old as the event log (~7 days). Counts and
|
|
21
|
+
* application correlation span the full --days window via the ledger when it
|
|
22
|
+
* has data. Each metric reports which source produced it.
|
|
23
|
+
*
|
|
24
|
+
* CLI gate compliance:
|
|
25
|
+
* - cli-1-strict-json: --json stdout is exactly one parseable JSON object.
|
|
26
|
+
* - cli-2-exit-stops: failure paths set process.exitCode = 1 then return.
|
|
27
|
+
* - cli-4-dry-run-confirm-mutex: N/A (read-only command, no mutation flags).
|
|
28
|
+
* - cli-5-failure-no-mutation: read-only by construction (readonly SQLite
|
|
29
|
+
* connection, bootstrapIfMissing false, no writes anywhere).
|
|
30
|
+
* - cli-6-output-next-action: degraded/empty results carry nextAction.
|
|
31
|
+
*
|
|
32
|
+
* Runtime contract compliance:
|
|
33
|
+
* - rc-1-treat-as-unknown: JSONL lines and SQL rows start as unknown.
|
|
34
|
+
* - rc-2-no-as-bypass: runtime guards (isRecord/typeof), no casts.
|
|
35
|
+
* - rc-3-fail-loud-missing: required event fields validated; malformed
|
|
36
|
+
* lines are skipped but COUNTED into warnings (not silently dropped).
|
|
37
|
+
* - rc-4-validate-array-elements: principleIds elements validated.
|
|
38
|
+
* - rc-5-object-hasown-not-in: Object.hasOwn for untrusted keys.
|
|
39
|
+
* - rc-8-safe-serialization: output built from validated primitives only.
|
|
40
|
+
* - rc-9-no-silent-fallback: every degraded source carries a reason/note.
|
|
41
|
+
*/
|
|
42
|
+
import * as path from 'path';
|
|
43
|
+
import * as fs from 'fs';
|
|
44
|
+
import { SqliteConnection } from '@principles/core';
|
|
45
|
+
import { resolveWorkspaceDir } from '../resolve-workspace.js';
|
|
46
|
+
import { loadPdConfig, computeFlagsFromLoadResult } from '../services/pd-config-loader.js';
|
|
47
|
+
const EVENT_TYPE = 'runtime_v2_prompt_activations_injected';
|
|
48
|
+
const DEFAULT_DAYS = 14;
|
|
49
|
+
const MAX_DAYS = 90;
|
|
50
|
+
/** Event log filename convention: events_YYYY-MM-DD.jsonl */
|
|
51
|
+
const EVENTS_FILE_PATTERN = /^events_(\d{4}-\d{2}-\d{2})\.jsonl$/;
|
|
52
|
+
function isRecord(value) {
|
|
53
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
54
|
+
}
|
|
55
|
+
function asString(v) {
|
|
56
|
+
return typeof v === 'string' ? v : null;
|
|
57
|
+
}
|
|
58
|
+
function asNumber(v) {
|
|
59
|
+
return typeof v === 'number' && Number.isFinite(v) ? v : null;
|
|
60
|
+
}
|
|
61
|
+
function asBoolean(v) {
|
|
62
|
+
return typeof v === 'boolean' ? v : null;
|
|
63
|
+
}
|
|
64
|
+
/** rc-4: validate an untrusted array of ids down to its string elements. */
|
|
65
|
+
function asStringArray(v) {
|
|
66
|
+
if (!Array.isArray(v))
|
|
67
|
+
return null;
|
|
68
|
+
return v.filter((e) => typeof e === 'string');
|
|
69
|
+
}
|
|
70
|
+
/** Event log files are named by UTC date (event-log.ts uses toISOString). */
|
|
71
|
+
function utcDateString(d) {
|
|
72
|
+
return d.toISOString().slice(0, 10);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Read and validate injection events from the daily JSONL files inside the
|
|
76
|
+
* --days window. Malformed lines are skipped but counted into warnings
|
|
77
|
+
* (rc-3/rc-9). Missing logs directory is not an error — returns empty with a
|
|
78
|
+
* note so the caller can degrade gracefully.
|
|
79
|
+
*/
|
|
80
|
+
function readInjectionEvents(workspaceDir, window, warnings) {
|
|
81
|
+
const logsDir = path.join(workspaceDir, '.state', 'logs');
|
|
82
|
+
if (!fs.existsSync(logsDir)) {
|
|
83
|
+
warnings.push(`event logs directory not found: ${logsDir}`);
|
|
84
|
+
return { turns: [], daysFound: [] };
|
|
85
|
+
}
|
|
86
|
+
let entries;
|
|
87
|
+
try {
|
|
88
|
+
entries = fs.readdirSync(logsDir);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
warnings.push(`failed to list ${logsDir}: ${err instanceof Error ? err.message : String(err)}`);
|
|
92
|
+
return { turns: [], daysFound: [] };
|
|
93
|
+
}
|
|
94
|
+
const daysFound = [];
|
|
95
|
+
const turns = [];
|
|
96
|
+
let malformedLines = 0;
|
|
97
|
+
for (const entry of entries) {
|
|
98
|
+
// String.match returns the same capture groups as RegExp matching; kept
|
|
99
|
+
// off RegExp#exec because the Mimosa write-gate flags every `.exec(`
|
|
100
|
+
// call site as shell-command injection (false positive).
|
|
101
|
+
// eslint-disable-next-line @typescript-eslint/prefer-regexp-exec
|
|
102
|
+
const match = entry.match(EVENTS_FILE_PATTERN);
|
|
103
|
+
const dateStr = match?.[1];
|
|
104
|
+
if (dateStr === undefined)
|
|
105
|
+
continue;
|
|
106
|
+
// String compare works: ISO dates sort lexicographically.
|
|
107
|
+
if (dateStr < window.cutoffDateStr || dateStr > window.todayStr)
|
|
108
|
+
continue;
|
|
109
|
+
daysFound.push(dateStr);
|
|
110
|
+
let raw;
|
|
111
|
+
try {
|
|
112
|
+
raw = fs.readFileSync(path.join(logsDir, entry), 'utf8');
|
|
113
|
+
}
|
|
114
|
+
catch (err) {
|
|
115
|
+
warnings.push(`failed to read ${entry}: ${err instanceof Error ? err.message : String(err)}`);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
for (const line of raw.split('\n')) {
|
|
119
|
+
const trimmed = line.trim();
|
|
120
|
+
if (trimmed.length === 0)
|
|
121
|
+
continue;
|
|
122
|
+
// rc-1: each line is untrusted until validated below.
|
|
123
|
+
let parsed;
|
|
124
|
+
try {
|
|
125
|
+
parsed = JSON.parse(trimmed);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
malformedLines++;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (!isRecord(parsed)) {
|
|
132
|
+
malformedLines++;
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
if (asString(parsed.type) !== EVENT_TYPE)
|
|
136
|
+
continue;
|
|
137
|
+
// rc-5: Object.hasOwn for untrusted key checks; rc-3: required fields
|
|
138
|
+
// must be present and well-typed or the line is skipped (counted).
|
|
139
|
+
const sessionId = Object.hasOwn(parsed, 'sessionId') && typeof parsed.sessionId === 'string'
|
|
140
|
+
? parsed.sessionId
|
|
141
|
+
: null;
|
|
142
|
+
const dataField = Object.hasOwn(parsed, 'data') && isRecord(parsed.data) ? parsed.data : null;
|
|
143
|
+
const source = dataField ?? parsed;
|
|
144
|
+
const principleIdsRaw = Object.hasOwn(source, 'principleIds') ? source.principleIds : undefined;
|
|
145
|
+
const principleIds = asStringArray(principleIdsRaw);
|
|
146
|
+
const injectedCharCount = asNumber(Object.hasOwn(source, 'injectedCharCount') ? source.injectedCharCount : undefined);
|
|
147
|
+
if (sessionId === null || principleIds === null || injectedCharCount === null) {
|
|
148
|
+
malformedLines++;
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
const legacySelectedCount = asNumber(Object.hasOwn(source, 'legacySelectedCount') ? source.legacySelectedCount : undefined);
|
|
152
|
+
const legacyTotalChars = asNumber(Object.hasOwn(source, 'legacyTotalChars') ? source.legacyTotalChars : undefined);
|
|
153
|
+
const legacyTruncated = asBoolean(Object.hasOwn(source, 'legacyTruncated') ? source.legacyTruncated : undefined);
|
|
154
|
+
const v2Truncated = asBoolean(Object.hasOwn(source, 'v2Truncated') ? source.v2Truncated : undefined);
|
|
155
|
+
const crossBlockDuplicateIds = asStringArray(Object.hasOwn(source, 'crossBlockDuplicateIds') ? source.crossBlockDuplicateIds : undefined) ?? [];
|
|
156
|
+
turns.push({
|
|
157
|
+
sessionId,
|
|
158
|
+
dateStr,
|
|
159
|
+
principleIds,
|
|
160
|
+
injectedCharCount,
|
|
161
|
+
legacySelectedCount,
|
|
162
|
+
legacyTotalChars,
|
|
163
|
+
legacyTruncated,
|
|
164
|
+
v2Truncated,
|
|
165
|
+
crossBlockDuplicateIds,
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (malformedLines > 0) {
|
|
170
|
+
warnings.push(`skipped ${malformedLines} malformed event log line(s)`);
|
|
171
|
+
}
|
|
172
|
+
return { turns, daysFound };
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Aggregate the receipt ledger (principle_applications) for the window.
|
|
176
|
+
* Degrades with a reason when the DB/table is missing (rc-9) — the events
|
|
177
|
+
* source stays usable either way.
|
|
178
|
+
*/
|
|
179
|
+
function readLedgerAggregate(workspaceDir, cutoffIso, warnings) {
|
|
180
|
+
const dbPath = path.join(workspaceDir, '.pd', 'state.db');
|
|
181
|
+
if (!fs.existsSync(dbPath)) {
|
|
182
|
+
return {
|
|
183
|
+
available: false,
|
|
184
|
+
unavailableReason: `state.db not found at ${dbPath}`,
|
|
185
|
+
sessionsWithData: 0,
|
|
186
|
+
avgDistinctPerSession: null,
|
|
187
|
+
presenceRows: 0,
|
|
188
|
+
effectRows: 0,
|
|
189
|
+
topPrinciples: [],
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
let connection;
|
|
193
|
+
try {
|
|
194
|
+
connection = new SqliteConnection({ workspaceDir, readonly: true, bootstrapIfMissing: false });
|
|
195
|
+
}
|
|
196
|
+
catch (err) {
|
|
197
|
+
return {
|
|
198
|
+
available: false,
|
|
199
|
+
unavailableReason: `failed to open state.db readonly: ${err instanceof Error ? err.message : String(err)}`,
|
|
200
|
+
sessionsWithData: 0,
|
|
201
|
+
avgDistinctPerSession: null,
|
|
202
|
+
presenceRows: 0,
|
|
203
|
+
effectRows: 0,
|
|
204
|
+
topPrinciples: [],
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
try {
|
|
208
|
+
const db = connection.getDb();
|
|
209
|
+
const sessionRowsUnknown = db
|
|
210
|
+
.prepare(`SELECT session_id, COUNT(DISTINCT principle_id) AS n
|
|
211
|
+
FROM principle_applications
|
|
212
|
+
WHERE kind = 'prompt_injected' AND session_id IS NOT NULL AND created_at >= ?
|
|
213
|
+
GROUP BY session_id`)
|
|
214
|
+
.all(cutoffIso);
|
|
215
|
+
const totalsRowUnknown = db
|
|
216
|
+
.prepare(`SELECT
|
|
217
|
+
SUM(CASE WHEN level = 'presence' THEN 1 ELSE 0 END) AS presence_rows,
|
|
218
|
+
SUM(CASE WHEN level = 'effect' THEN 1 ELSE 0 END) AS effect_rows
|
|
219
|
+
FROM principle_applications WHERE created_at >= ?`)
|
|
220
|
+
.get(cutoffIso);
|
|
221
|
+
const topRowsUnknown = db
|
|
222
|
+
.prepare(`SELECT principle_id,
|
|
223
|
+
SUM(CASE WHEN level = 'presence' THEN 1 ELSE 0 END) AS presence_count,
|
|
224
|
+
SUM(CASE WHEN level = 'effect' THEN 1 ELSE 0 END) AS effect_count
|
|
225
|
+
FROM principle_applications WHERE created_at >= ?
|
|
226
|
+
GROUP BY principle_id
|
|
227
|
+
ORDER BY effect_count DESC, presence_count DESC LIMIT 10`)
|
|
228
|
+
.all(cutoffIso);
|
|
229
|
+
// rc-1/rc-2: rows arrive unknown; validate element-wise into primitives.
|
|
230
|
+
const perSession = [];
|
|
231
|
+
for (const row of Array.isArray(sessionRowsUnknown) ? sessionRowsUnknown : []) {
|
|
232
|
+
if (!isRecord(row))
|
|
233
|
+
continue;
|
|
234
|
+
const n = asNumber(row.n);
|
|
235
|
+
if (n !== null)
|
|
236
|
+
perSession.push(n);
|
|
237
|
+
}
|
|
238
|
+
let presenceRows = 0;
|
|
239
|
+
let effectRows = 0;
|
|
240
|
+
if (isRecord(totalsRowUnknown)) {
|
|
241
|
+
presenceRows = asNumber(totalsRowUnknown.presence_rows) ?? 0;
|
|
242
|
+
effectRows = asNumber(totalsRowUnknown.effect_rows) ?? 0;
|
|
243
|
+
}
|
|
244
|
+
const top = [];
|
|
245
|
+
for (const row of Array.isArray(topRowsUnknown) ? topRowsUnknown : []) {
|
|
246
|
+
if (!isRecord(row))
|
|
247
|
+
continue;
|
|
248
|
+
const principleId = asString(row.principle_id);
|
|
249
|
+
const p = asNumber(row.presence_count) ?? 0;
|
|
250
|
+
const e = asNumber(row.effect_count) ?? 0;
|
|
251
|
+
if (principleId !== null)
|
|
252
|
+
top.push({ principleId, presenceCount: p, effectCount: e });
|
|
253
|
+
}
|
|
254
|
+
const avg = perSession.length > 0 ? perSession.reduce((a, b) => a + b, 0) / perSession.length : null;
|
|
255
|
+
return {
|
|
256
|
+
available: true,
|
|
257
|
+
sessionsWithData: perSession.length,
|
|
258
|
+
avgDistinctPerSession: avg,
|
|
259
|
+
presenceRows,
|
|
260
|
+
effectRows,
|
|
261
|
+
topPrinciples: top,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
// Most commonly: pre-receipt state.db without the principle_applications table.
|
|
266
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
267
|
+
warnings.push(`ledger query failed (${message})`);
|
|
268
|
+
return {
|
|
269
|
+
available: false,
|
|
270
|
+
unavailableReason: `ledger query failed: ${message}`,
|
|
271
|
+
sessionsWithData: 0,
|
|
272
|
+
avgDistinctPerSession: null,
|
|
273
|
+
presenceRows: 0,
|
|
274
|
+
effectRows: 0,
|
|
275
|
+
topPrinciples: [],
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
finally {
|
|
279
|
+
connection.close();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
function buildResult(input) {
|
|
283
|
+
const { workspaceDir, windowDays, turns, daysFound, ledger, receiptLedgerFlagEnabled, receiptSelfReportFlagEnabled, warnings, } = input;
|
|
284
|
+
const notes = [];
|
|
285
|
+
notes.push('per-turn precision (chars/truncation/duplicates) covers only the retained event window (~7 days)');
|
|
286
|
+
if (!ledger.available && ledger.unavailableReason) {
|
|
287
|
+
notes.push(`receipt ledger unavailable: ${ledger.unavailableReason}`);
|
|
288
|
+
}
|
|
289
|
+
// ── Sessions & counts ──
|
|
290
|
+
const eventSessions = new Set(turns.map((t) => t.sessionId));
|
|
291
|
+
// Ledger session ids are aggregated away by SQL, so the headline session
|
|
292
|
+
// count takes the larger of the two source-side session counts.
|
|
293
|
+
const sessions = Math.max(eventSessions.size, ledger.sessionsWithData);
|
|
294
|
+
const totalTurnIds = turns.reduce((acc, t) => acc + t.principleIds.length, 0);
|
|
295
|
+
const distinctPrinciples = new Set(turns.flatMap((t) => t.principleIds)).size;
|
|
296
|
+
const avgPerTurn = turns.length > 0 ? totalTurnIds / turns.length : null;
|
|
297
|
+
// Prefer the ledger's session-level distinct counts (90-day, deduped by the
|
|
298
|
+
// unique index); fall back to the events-window union-per-session estimate.
|
|
299
|
+
let { avgDistinctPerSession } = ledger;
|
|
300
|
+
let injectionsSource = 'none';
|
|
301
|
+
if (avgDistinctPerSession !== null) {
|
|
302
|
+
injectionsSource = 'ledger';
|
|
303
|
+
}
|
|
304
|
+
else if (turns.length > 0) {
|
|
305
|
+
const perSessionUnion = new Map();
|
|
306
|
+
for (const t of turns) {
|
|
307
|
+
let set = perSessionUnion.get(t.sessionId);
|
|
308
|
+
if (!set) {
|
|
309
|
+
set = new Set();
|
|
310
|
+
perSessionUnion.set(t.sessionId, set);
|
|
311
|
+
}
|
|
312
|
+
for (const id of t.principleIds)
|
|
313
|
+
set.add(id);
|
|
314
|
+
}
|
|
315
|
+
avgDistinctPerSession =
|
|
316
|
+
perSessionUnion.size > 0
|
|
317
|
+
? [...perSessionUnion.values()].reduce((acc, s) => acc + s.size, 0) / perSessionUnion.size
|
|
318
|
+
: null;
|
|
319
|
+
if (avgDistinctPerSession !== null)
|
|
320
|
+
injectionsSource = 'events';
|
|
321
|
+
}
|
|
322
|
+
// ── Chars / truncation (events only) ──
|
|
323
|
+
const v2CharTurns = turns.map((t) => t.injectedCharCount);
|
|
324
|
+
const legacyCharTurns = turns.map((t) => t.legacyTotalChars).filter((c) => c !== null);
|
|
325
|
+
const reporting = turns.filter((t) => t.v2Truncated !== null || t.legacyTruncated !== null);
|
|
326
|
+
const v2TruncatedTurns = turns.filter((t) => t.v2Truncated === true).length;
|
|
327
|
+
const legacyTruncatedTurns = turns.filter((t) => t.legacyTruncated === true).length;
|
|
328
|
+
const truncationRate = reporting.length > 0 ? (v2TruncatedTurns + legacyTruncatedTurns) / reporting.length : null;
|
|
329
|
+
// ── Duplicates ──
|
|
330
|
+
const crossBlockTotal = turns.reduce((acc, t) => acc + t.crossBlockDuplicateIds.length, 0);
|
|
331
|
+
const crossBlockCounts = new Map();
|
|
332
|
+
for (const t of turns) {
|
|
333
|
+
for (const id of t.crossBlockDuplicateIds) {
|
|
334
|
+
crossBlockCounts.set(id, (crossBlockCounts.get(id) ?? 0) + 1);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
const crossBlockTop = [...crossBlockCounts.entries()]
|
|
338
|
+
.map(([principleId, count]) => ({ principleId, count }))
|
|
339
|
+
.sort((a, b) => b.count - a.count)
|
|
340
|
+
.slice(0, 5);
|
|
341
|
+
// Intra-session repeat: principles seen in >1 turn within one session,
|
|
342
|
+
// relative to all distinct principles observed in the window.
|
|
343
|
+
const perSessionIdTurns = new Map();
|
|
344
|
+
for (const t of turns) {
|
|
345
|
+
let inner = perSessionIdTurns.get(t.sessionId);
|
|
346
|
+
if (!inner) {
|
|
347
|
+
inner = new Map();
|
|
348
|
+
perSessionIdTurns.set(t.sessionId, inner);
|
|
349
|
+
}
|
|
350
|
+
for (const id of t.principleIds) {
|
|
351
|
+
inner.set(id, (inner.get(id) ?? 0) + 1);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
let repeatedIds = 0;
|
|
355
|
+
for (const inner of perSessionIdTurns.values()) {
|
|
356
|
+
for (const n of inner.values()) {
|
|
357
|
+
if (n > 1)
|
|
358
|
+
repeatedIds++;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
const intraSessionRepeatShare = distinctPrinciples > 0 ? repeatedIds / distinctPrinciples : null;
|
|
362
|
+
const correlated = ledger.topPrinciples.filter((p) => p.effectCount > 0);
|
|
363
|
+
const result = {
|
|
364
|
+
ok: true,
|
|
365
|
+
status: turns.length === 0 && !ledger.available ? 'degraded' : 'ok',
|
|
366
|
+
workspaceDir,
|
|
367
|
+
windowDays,
|
|
368
|
+
coverage: {
|
|
369
|
+
eventsDaysFound: daysFound,
|
|
370
|
+
eventsTurns: turns.length,
|
|
371
|
+
ledgerAvailable: ledger.available,
|
|
372
|
+
receiptLedgerFlagEnabled,
|
|
373
|
+
receiptSelfReportFlagEnabled,
|
|
374
|
+
notes,
|
|
375
|
+
},
|
|
376
|
+
sessions,
|
|
377
|
+
injections: {
|
|
378
|
+
avgDistinctPerSession,
|
|
379
|
+
avgPerTurn,
|
|
380
|
+
distinctPrinciples,
|
|
381
|
+
source: injectionsSource,
|
|
382
|
+
},
|
|
383
|
+
chars: {
|
|
384
|
+
avgV2PerTurn: v2CharTurns.length > 0 ? v2CharTurns.reduce((a, b) => a + b, 0) / v2CharTurns.length : null,
|
|
385
|
+
avgLegacyPerTurn: legacyCharTurns.length > 0 ? legacyCharTurns.reduce((a, b) => a + b, 0) / legacyCharTurns.length : null,
|
|
386
|
+
truncationRate,
|
|
387
|
+
v2TruncatedTurns,
|
|
388
|
+
legacyTruncatedTurns,
|
|
389
|
+
turnsReporting: reporting.length,
|
|
390
|
+
},
|
|
391
|
+
duplicates: {
|
|
392
|
+
crossBlockTotal,
|
|
393
|
+
crossBlockTop,
|
|
394
|
+
intraSessionRepeatShare,
|
|
395
|
+
},
|
|
396
|
+
applicationCorrelation: {
|
|
397
|
+
presenceRows: ledger.presenceRows,
|
|
398
|
+
effectRows: ledger.effectRows,
|
|
399
|
+
correlatedPrinciples: correlated.length,
|
|
400
|
+
top: ledger.topPrinciples,
|
|
401
|
+
},
|
|
402
|
+
warnings,
|
|
403
|
+
};
|
|
404
|
+
if (result.status === 'degraded') {
|
|
405
|
+
const flagHint = receiptLedgerFlagEnabled === false
|
|
406
|
+
? 'Enable features.principle_receipt_ledger and features.principle_receipt_self_report in <workspace>/.pd/config.yaml to start capturing durable receipts.'
|
|
407
|
+
: 'Run PD with an agent session first — stats appear after prompt builds occur.';
|
|
408
|
+
result.nextAction = `No injection data found in the last ${windowDays} day(s). ${flagHint}`;
|
|
409
|
+
}
|
|
410
|
+
return result;
|
|
411
|
+
}
|
|
412
|
+
function formatTextOutput(r) {
|
|
413
|
+
const pct = (v) => (v === null ? 'n/a' : `${(v * 100).toFixed(1)}%`);
|
|
414
|
+
const num = (v) => (v === null ? 'n/a' : v.toFixed(2));
|
|
415
|
+
const lines = [];
|
|
416
|
+
lines.push('PD Principles Injection Stats');
|
|
417
|
+
lines.push(` workspace: ${r.workspaceDir}`);
|
|
418
|
+
lines.push(` window: last ${r.windowDays} day(s) [status: ${r.status}]`);
|
|
419
|
+
lines.push(` sessions: ${r.sessions}`);
|
|
420
|
+
lines.push('');
|
|
421
|
+
lines.push('Injections');
|
|
422
|
+
lines.push(` avg distinct/session: ${num(r.injections.avgDistinctPerSession)} (source: ${r.injections.source})`);
|
|
423
|
+
lines.push(` avg per turn: ${num(r.injections.avgPerTurn)} (${r.coverage.eventsTurns} turns in event window)`);
|
|
424
|
+
lines.push(` distinct principles: ${r.injections.distinctPrinciples}`);
|
|
425
|
+
lines.push('');
|
|
426
|
+
lines.push('Context cost (chars)');
|
|
427
|
+
lines.push(` avg runtime-v2 block: ${num(r.chars.avgV2PerTurn)}`);
|
|
428
|
+
lines.push(` avg legacy block: ${num(r.chars.avgLegacyPerTurn)}`);
|
|
429
|
+
lines.push(` truncation rate: ${pct(r.chars.truncationRate)} (v2:${r.chars.v2TruncatedTurns} legacy:${r.chars.legacyTruncatedTurns} of ${r.chars.turnsReporting} reporting turns)`);
|
|
430
|
+
lines.push('');
|
|
431
|
+
lines.push('Duplicates');
|
|
432
|
+
lines.push(` cross-block dup pressure (v2 ids suppressed, legacy already carries them): ${r.duplicates.crossBlockTotal}`);
|
|
433
|
+
for (const d of r.duplicates.crossBlockTop) {
|
|
434
|
+
lines.push(` - ${d.principleId}: ${d.count} turn(s)`);
|
|
435
|
+
}
|
|
436
|
+
lines.push(` per-turn re-injection share (stability): ${pct(r.duplicates.intraSessionRepeatShare)}`);
|
|
437
|
+
lines.push('');
|
|
438
|
+
lines.push('Application correlation (receipt ledger)');
|
|
439
|
+
lines.push(` ledger available: ${r.coverage.ledgerAvailable ? 'yes' : 'no'}`);
|
|
440
|
+
lines.push(` presence/effect rows: ${r.applicationCorrelation.presenceRows} / ${r.applicationCorrelation.effectRows}`);
|
|
441
|
+
for (const t of r.applicationCorrelation.top.slice(0, 5)) {
|
|
442
|
+
lines.push(` - ${t.principleId}: presence=${t.presenceCount} effect=${t.effectCount}`);
|
|
443
|
+
}
|
|
444
|
+
lines.push('');
|
|
445
|
+
lines.push('Coverage');
|
|
446
|
+
lines.push(` event days found: ${r.coverage.eventsDaysFound.length > 0 ? r.coverage.eventsDaysFound.join(', ') : '(none)'}`);
|
|
447
|
+
lines.push(` receipt flags: ledger=${String(r.coverage.receiptLedgerFlagEnabled)} self_report=${String(r.coverage.receiptSelfReportFlagEnabled)}`);
|
|
448
|
+
for (const n of r.coverage.notes)
|
|
449
|
+
lines.push(` note: ${n}`);
|
|
450
|
+
for (const w of r.warnings)
|
|
451
|
+
lines.push(` warning: ${w}`);
|
|
452
|
+
if (r.nextAction) {
|
|
453
|
+
lines.push('');
|
|
454
|
+
lines.push(`Next action: ${r.nextAction}`);
|
|
455
|
+
}
|
|
456
|
+
return lines.join('\n');
|
|
457
|
+
}
|
|
458
|
+
export async function handlePrinciplesStats(opts) {
|
|
459
|
+
// Resolve --days first so arg errors never touch the filesystem.
|
|
460
|
+
let windowDays = DEFAULT_DAYS;
|
|
461
|
+
if (opts.days !== undefined) {
|
|
462
|
+
if (!Number.isFinite(opts.days) || opts.days < 1 || opts.days > MAX_DAYS || !Number.isInteger(opts.days)) {
|
|
463
|
+
const msg = `Error: --days must be an integer between 1 and ${MAX_DAYS}, got ${opts.days}`;
|
|
464
|
+
if (opts.json) {
|
|
465
|
+
process.stderr.write(JSON.stringify({
|
|
466
|
+
ok: false,
|
|
467
|
+
reason: msg,
|
|
468
|
+
nextAction: `Pass --days as an integer in [1, ${MAX_DAYS}] (e.g. --days 14). Omit for the default (${DEFAULT_DAYS}).`,
|
|
469
|
+
}, null, 2) + '\n');
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
process.stderr.write(msg + '\n');
|
|
473
|
+
}
|
|
474
|
+
process.exitCode = 1;
|
|
475
|
+
return; // cli-2-exit-stops
|
|
476
|
+
}
|
|
477
|
+
windowDays = opts.days;
|
|
478
|
+
}
|
|
479
|
+
try {
|
|
480
|
+
const workspaceDir = opts.workspace ? path.resolve(opts.workspace) : resolveWorkspaceDir();
|
|
481
|
+
const now = new Date();
|
|
482
|
+
// Event files are UTC-day based; the window is computed on the same basis
|
|
483
|
+
// so day boundaries align with the file names (a local-date window would
|
|
484
|
+
// drift by the timezone offset at day edges).
|
|
485
|
+
const cutoffDateStr = utcDateString(new Date(now.getTime() - (windowDays - 1) * 24 * 3600 * 1000));
|
|
486
|
+
const todayStr = utcDateString(now);
|
|
487
|
+
const cutoffIso = new Date(now.getTime() - windowDays * 24 * 3600 * 1000).toISOString();
|
|
488
|
+
const warnings = [];
|
|
489
|
+
const { turns, daysFound } = readInjectionEvents(workspaceDir, { cutoffDateStr: cutoffDateStr, todayStr: todayStr }, warnings);
|
|
490
|
+
const ledger = readLedgerAggregate(workspaceDir, cutoffIso, warnings);
|
|
491
|
+
// Effective receipt flag states help interpret an empty ledger (flags off
|
|
492
|
+
// vs genuinely no traffic). Best-effort: null when config cannot be loaded.
|
|
493
|
+
let receiptLedgerFlagEnabled = null;
|
|
494
|
+
let receiptSelfReportFlagEnabled = null;
|
|
495
|
+
try {
|
|
496
|
+
const loadResult = loadPdConfig(workspaceDir);
|
|
497
|
+
const { flags } = computeFlagsFromLoadResult(loadResult);
|
|
498
|
+
receiptLedgerFlagEnabled = flags.principle_receipt_ledger?.enabled ?? null;
|
|
499
|
+
receiptSelfReportFlagEnabled = flags.principle_receipt_self_report?.enabled ?? null;
|
|
500
|
+
}
|
|
501
|
+
catch {
|
|
502
|
+
warnings.push('feature flag states could not be determined (.pd/config.yaml unreadable?)');
|
|
503
|
+
}
|
|
504
|
+
const result = buildResult({
|
|
505
|
+
workspaceDir,
|
|
506
|
+
windowDays,
|
|
507
|
+
turns,
|
|
508
|
+
daysFound,
|
|
509
|
+
ledger,
|
|
510
|
+
receiptLedgerFlagEnabled,
|
|
511
|
+
receiptSelfReportFlagEnabled,
|
|
512
|
+
warnings,
|
|
513
|
+
});
|
|
514
|
+
if (opts.json) {
|
|
515
|
+
// cli-1-strict-json: stdout is exactly one parseable JSON object.
|
|
516
|
+
console.log(JSON.stringify(result, null, 2));
|
|
517
|
+
}
|
|
518
|
+
else {
|
|
519
|
+
console.log(formatTextOutput(result));
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
catch (err) {
|
|
523
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
524
|
+
if (opts.json) {
|
|
525
|
+
process.stderr.write(JSON.stringify({
|
|
526
|
+
ok: false,
|
|
527
|
+
reason: `Failed to compute principle stats: ${message}`,
|
|
528
|
+
nextAction: 'Check the workspace path (-w) and that .pd/config.yaml is readable, then retry.',
|
|
529
|
+
}, null, 2) + '\n');
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
process.stderr.write(`Error: ${message}\n`);
|
|
533
|
+
}
|
|
534
|
+
process.exitCode = 1;
|
|
535
|
+
return; // cli-2-exit-stops
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
/**
|
|
539
|
+
* Register the `principles` command group with `stats` subcommand on a
|
|
540
|
+
* Commander program. Used by both production CLI (src/index.ts) and
|
|
541
|
+
* parser-level tests (cli-7-test-wiring).
|
|
542
|
+
*/
|
|
543
|
+
export function registerPrinciplesCommand(program) {
|
|
544
|
+
const principlesCmd = program
|
|
545
|
+
.command('principles')
|
|
546
|
+
.description('Owner-facing principle observability (injection stats, PRI-562 Phase 0)');
|
|
547
|
+
principlesCmd
|
|
548
|
+
.command('stats')
|
|
549
|
+
.description('Summarize principle injection volume/cost/duplicates/application evidence')
|
|
550
|
+
.option('-w, --workspace <path>', 'Workspace directory')
|
|
551
|
+
.option('--json', 'Output raw JSON (cli-1-strict-json: stdout is exactly one JSON object)')
|
|
552
|
+
.option('--days <n>', 'Window in days (default: 14, max: 90)', parseInt)
|
|
553
|
+
.action(async (opts) => {
|
|
554
|
+
await handlePrinciplesStats({
|
|
555
|
+
workspace: opts.workspace,
|
|
556
|
+
json: opts.json === true,
|
|
557
|
+
days: opts.days,
|
|
558
|
+
});
|
|
559
|
+
});
|
|
560
|
+
return principlesCmd;
|
|
561
|
+
}
|
|
562
|
+
//# sourceMappingURL=principles-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"principles-stats.js","sourceRoot":"","sources":["../../src/commands/principles-stats.ts"],"names":[],"mappings":"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"}
|