@mmnto/cli 1.106.0 → 1.107.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/doctor-qbd.d.ts +40 -0
- package/dist/commands/doctor-qbd.d.ts.map +1 -0
- package/dist/commands/doctor-qbd.js +156 -0
- package/dist/commands/doctor-qbd.js.map +1 -0
- package/dist/commands/doctor-qbd.test.d.ts +13 -0
- package/dist/commands/doctor-qbd.test.d.ts.map +1 -0
- package/dist/commands/doctor-qbd.test.js +548 -0
- package/dist/commands/doctor-qbd.test.js.map +1 -0
- package/dist/commands/init-templates.js +3 -3
- package/dist/commands/init-templates.js.map +1 -1
- package/dist/commands/mail-degraded-e4.test.d.ts +5 -1
- package/dist/commands/mail-degraded-e4.test.d.ts.map +1 -1
- package/dist/commands/mail-degraded-e4.test.js +129 -2
- package/dist/commands/mail-degraded-e4.test.js.map +1 -1
- package/dist/commands/mail.d.ts +1 -0
- package/dist/commands/mail.d.ts.map +1 -1
- package/dist/commands/mail.js +16 -3
- package/dist/commands/mail.js.map +1 -1
- package/dist/commands/orient.d.ts.map +1 -1
- package/dist/commands/orient.js +23 -0
- package/dist/commands/orient.js.map +1 -1
- package/dist/commands/qbd-seam.d.ts +77 -0
- package/dist/commands/qbd-seam.d.ts.map +1 -0
- package/dist/commands/qbd-seam.js +150 -0
- package/dist/commands/qbd-seam.js.map +1 -0
- package/dist/commands/qbd-seam.test.d.ts +16 -0
- package/dist/commands/qbd-seam.test.d.ts.map +1 -0
- package/dist/commands/qbd-seam.test.js +339 -0
- package/dist/commands/qbd-seam.test.js.map +1 -0
- package/dist/commands/review-fan.d.ts.map +1 -1
- package/dist/commands/review-fan.js +26 -0
- package/dist/commands/review-fan.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +15 -0
- package/dist/commands/search.js.map +1 -1
- package/dist/commands/shield-classify.d.ts.map +1 -1
- package/dist/commands/shield-classify.js +2 -0
- package/dist/commands/shield-classify.js.map +1 -1
- package/dist/commands/shield-classify.test.js +12 -0
- package/dist/commands/shield-classify.test.js.map +1 -1
- package/dist/commands/shield.d.ts.map +1 -1
- package/dist/commands/shield.js +34 -0
- package/dist/commands/shield.js.map +1 -1
- package/dist/commands/spec.d.ts.map +1 -1
- package/dist/commands/spec.js +16 -0
- package/dist/commands/spec.js.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `totem doctor --compliance` — query-before-derive section (mmnto-ai/totem#2510).
|
|
3
|
+
*
|
|
4
|
+
* Renders ONE number: of the derive-class actions in an agent session (spec
|
|
5
|
+
* synthesis, orientation derivation, review grounding), what fraction was
|
|
6
|
+
* preceded by a corpus query correlated to that action — plus its trend and the
|
|
7
|
+
* pre-registered threshold it will be judged against.
|
|
8
|
+
*
|
|
9
|
+
* Sensor, not actuator (Tenet 13): this section renders and returns. It never
|
|
10
|
+
* throws for a compliance verdict and never influences the exit code. Nothing
|
|
11
|
+
* in Totem blocks on this number in v1, by charter.
|
|
12
|
+
*
|
|
13
|
+
* Reads alongside the existing ADR-029 recall-compliance section rather than
|
|
14
|
+
* replacing it: that metric is search-before-COMMIT at commit granularity; this
|
|
15
|
+
* one is query-before-DERIVE at event granularity with explicit correlation IDs.
|
|
16
|
+
* Different denominators, different claims, both printed under `--compliance`.
|
|
17
|
+
*/
|
|
18
|
+
export interface QbdComplianceCliOptions {
|
|
19
|
+
/** Test seam — production callers omit and the command uses `process.cwd()`. */
|
|
20
|
+
cwdForTest?: string;
|
|
21
|
+
/** Test seam — inject raw ledger NDJSON instead of reading from disk. */
|
|
22
|
+
ledgerContentForTest?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Test seam — point global-profile resolution at a temp home. Without it a
|
|
25
|
+
* test in a config-less directory resolves the developer's REAL `~/.totem/`
|
|
26
|
+
* profile and reads (or, on the write side, writes) their live ledger.
|
|
27
|
+
*/
|
|
28
|
+
homeDirForTest?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Render the query-before-derive compliance section.
|
|
32
|
+
*
|
|
33
|
+
* Degraded-read contract (ADR-115 § 2): a scan that hit malformed lines,
|
|
34
|
+
* correlation-contract violations, or unjoinable correlation IDs renders under
|
|
35
|
+
* an explicit `DEGRADED` / `UNVERIFIED` envelope with per-item counts. A broken
|
|
36
|
+
* ledger scan must never render like a clean 100% or a clean 0% — that
|
|
37
|
+
* indistinguishability IS the defect class, not an acceptable degradation.
|
|
38
|
+
*/
|
|
39
|
+
export declare function doctorQbdComplianceCommand(options?: QbdComplianceCliOptions): Promise<void>;
|
|
40
|
+
//# sourceMappingURL=doctor-qbd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-qbd.d.ts","sourceRoot":"","sources":["../../src/commands/doctor-qbd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAOH,MAAM,WAAW,uBAAuB;IACtC,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;GAQG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAgMf"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `totem doctor --compliance` — query-before-derive section (mmnto-ai/totem#2510).
|
|
3
|
+
*
|
|
4
|
+
* Renders ONE number: of the derive-class actions in an agent session (spec
|
|
5
|
+
* synthesis, orientation derivation, review grounding), what fraction was
|
|
6
|
+
* preceded by a corpus query correlated to that action — plus its trend and the
|
|
7
|
+
* pre-registered threshold it will be judged against.
|
|
8
|
+
*
|
|
9
|
+
* Sensor, not actuator (Tenet 13): this section renders and returns. It never
|
|
10
|
+
* throws for a compliance verdict and never influences the exit code. Nothing
|
|
11
|
+
* in Totem blocks on this number in v1, by charter.
|
|
12
|
+
*
|
|
13
|
+
* Reads alongside the existing ADR-029 recall-compliance section rather than
|
|
14
|
+
* replacing it: that metric is search-before-COMMIT at commit granularity; this
|
|
15
|
+
* one is query-before-DERIVE at event granularity with explicit correlation IDs.
|
|
16
|
+
* Different denominators, different claims, both printed under `--compliance`.
|
|
17
|
+
*/
|
|
18
|
+
const TAG = 'Compliance';
|
|
19
|
+
/** Ledger location, relative to the resolved totemDir. */
|
|
20
|
+
const LEDGER_RELATIVE_PATH = ['ledger', 'events.ndjson'];
|
|
21
|
+
/**
|
|
22
|
+
* Render the query-before-derive compliance section.
|
|
23
|
+
*
|
|
24
|
+
* Degraded-read contract (ADR-115 § 2): a scan that hit malformed lines,
|
|
25
|
+
* correlation-contract violations, or unjoinable correlation IDs renders under
|
|
26
|
+
* an explicit `DEGRADED` / `UNVERIFIED` envelope with per-item counts. A broken
|
|
27
|
+
* ledger scan must never render like a clean 100% or a clean 0% — that
|
|
28
|
+
* indistinguishability IS the defect class, not an acceptable degradation.
|
|
29
|
+
*/
|
|
30
|
+
export async function doctorQbdComplianceCommand(options = {}) {
|
|
31
|
+
const fs = await import('node:fs');
|
|
32
|
+
const path = await import('node:path');
|
|
33
|
+
const { computeQbdCompliance, formatQbdRate, QBD_PRE_REGISTERED_WINDOW_SESSIONS, QBD_PRE_REGISTRATION_STATEMENT, sanitizeForTerminal, scanQbdLedger, } = await import('@mmnto/totem');
|
|
34
|
+
const { bold, log } = await import('../ui.js');
|
|
35
|
+
const cwd = options.cwdForTest ?? process.cwd();
|
|
36
|
+
// Resolve the ledger through the SAME helper the write seams use, so the
|
|
37
|
+
// reader can never look somewhere the writers do not write (they diverged
|
|
38
|
+
// once already: seams joined `cwd`, which misses the project ledger whenever
|
|
39
|
+
// a command runs from a subdirectory).
|
|
40
|
+
//
|
|
41
|
+
// There is deliberately NO `?? path.join(cwd, '.totem')` fallback. The writers
|
|
42
|
+
// SKIP when config is unresolved, so a reader that fell back to `<cwd>/.totem`
|
|
43
|
+
// would read a ledger no writer ever writes — reviving the exact divergence
|
|
44
|
+
// the comment above claims is closed, and letting a stale directory render as
|
|
45
|
+
// if it were this project's data. Unresolved is its own honest state.
|
|
46
|
+
const { resolveQbdLedgerDirDetailed } = await import('./qbd-seam.js');
|
|
47
|
+
const resolved = await resolveQbdLedgerDirDetailed(cwd, options.homeDirForTest);
|
|
48
|
+
if (resolved.dir === undefined) {
|
|
49
|
+
log.info(TAG, bold('Query-before-derive compliance'));
|
|
50
|
+
log.dim(TAG, `SKIP — ${resolved.reason ?? 'no ledger could be resolved'}. Nothing is recorded from here either, so there is nothing to read.`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const totemDir = resolved.dir;
|
|
54
|
+
const ledgerPath = path.join(totemDir, ...LEDGER_RELATIVE_PATH);
|
|
55
|
+
// totemDir is repo-controlled config — sanitize before it reaches a terminal.
|
|
56
|
+
const displayPath = sanitizeForTerminal(path.join(totemDir, ...LEDGER_RELATIVE_PATH));
|
|
57
|
+
log.info(TAG, bold('Query-before-derive compliance'));
|
|
58
|
+
let content;
|
|
59
|
+
if (options.ledgerContentForTest !== undefined) {
|
|
60
|
+
content = options.ledgerContentForTest;
|
|
61
|
+
}
|
|
62
|
+
else if (!fs.existsSync(ledgerPath)) {
|
|
63
|
+
// Absent ledger → skip idiom. NOT a fail, and emphatically NOT 0%.
|
|
64
|
+
log.dim(TAG, `SKIP — no ${displayPath} found. Query-before-derive rows are written by \`totem search\`, the MCP search_knowledge tool, and the derive-class commands (spec / orient / review); run some, then re-run totem doctor --compliance.`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
try {
|
|
69
|
+
content = fs.readFileSync(ledgerPath, 'utf-8');
|
|
70
|
+
// totem-context: an unreadable ledger is the honest-absent path for this read-only sensor — degrade to the skip idiom, never crash the doctor pipeline.
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
// Name the errno. EACCES (permissions), EISDIR (a directory where the
|
|
74
|
+
// file belongs), and ENOTDIR (a component is a file) are three different
|
|
75
|
+
// problems with three different fixes; collapsing them into "unreadable"
|
|
76
|
+
// tells the reader nothing actionable.
|
|
77
|
+
const code = typeof err === 'object' && err !== null
|
|
78
|
+
? (err.code ?? 'unknown')
|
|
79
|
+
: 'unknown';
|
|
80
|
+
log.dim(TAG, `SKIP — ${displayPath} present but unreadable (${code}).`);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const scan = scanQbdLedger(content);
|
|
85
|
+
const report = computeQbdCompliance(scan);
|
|
86
|
+
// ── Degraded envelope FIRST, so the number is never read bare ──
|
|
87
|
+
if (report.degraded) {
|
|
88
|
+
log.warn(TAG, `DEGRADED — the ledger scan hit rows it could not trust; the compliance number below is UNVERIFIED`);
|
|
89
|
+
const a = report.anomalies;
|
|
90
|
+
if (a.malformedJson > 0)
|
|
91
|
+
log.warn(TAG, ` ${a.malformedJson} malformed JSON line(s)`);
|
|
92
|
+
if (a.correlationContractViolations > 0) {
|
|
93
|
+
log.warn(TAG, ` ${a.correlationContractViolations} correlation-contract violation(s) — an ID that could not have been minted when its row was written (backfill)`);
|
|
94
|
+
}
|
|
95
|
+
if (a.unclassifiedInvalid > 0) {
|
|
96
|
+
log.warn(TAG, ` ${a.unclassifiedInvalid} unclassifiable invalid row(s)`);
|
|
97
|
+
}
|
|
98
|
+
if (a.orphanCorrelations > 0) {
|
|
99
|
+
log.warn(TAG, ` ${a.orphanCorrelations} derive(s) citing a correlation ID with no preceding query row`);
|
|
100
|
+
}
|
|
101
|
+
if (a.crossSessionCorrelations > 0) {
|
|
102
|
+
log.warn(TAG, ` ${a.crossSessionCorrelations} derive(s) correlated to a query from another session or seat`);
|
|
103
|
+
}
|
|
104
|
+
if (a.duplicateCorrelations > 0) {
|
|
105
|
+
log.warn(TAG, ` ${a.duplicateCorrelations} derive(s) re-citing a correlation ID an earlier derive already spent (one query grounds one derive)`);
|
|
106
|
+
}
|
|
107
|
+
if (a.backdatedRows > 0) {
|
|
108
|
+
log.warn(TAG, ` ${a.backdatedRows} row(s) with timestamps regressing in an append-only ledger (backdated append)`);
|
|
109
|
+
}
|
|
110
|
+
for (const detail of a.details)
|
|
111
|
+
log.dim(TAG, ` · ${sanitizeForTerminal(detail)}`);
|
|
112
|
+
// Remediation. Degraded is sticky by design — one bad row degrades the whole
|
|
113
|
+
// read, and neither the row nor the verdict expires — so without this the
|
|
114
|
+
// envelope is a permanent unactionable banner. Say which file to open.
|
|
115
|
+
log.dim(TAG, ` to clear: inspect the cited line numbers in ${displayPath} (append-only — repair by appending corrections, never by rewriting history), then re-run.`);
|
|
116
|
+
}
|
|
117
|
+
// Seat-plumbing hint — deliberately OUTSIDE the degraded envelope: one-sided
|
|
118
|
+
// seat plumbing is a config smell, not evidence of tampering.
|
|
119
|
+
if (report.anomalies.seatMismatchHints > 0) {
|
|
120
|
+
log.dim(TAG, `note: ${report.anomalies.seatMismatchHints} uncorrelated derive(s) had an in-window query from a DIFFERENT seat — likely one-sided seat plumbing (e.g. a seated CLI and an unseated MCP server), which drives this number down with no other tell. Seat plumbing is tracked separately in mmnto-ai/totem#2530.`);
|
|
121
|
+
}
|
|
122
|
+
// Advisory — deliberately OUTSIDE the degraded envelope: an event type this
|
|
123
|
+
// build does not know is ordinary version skew, not evidence of tampering.
|
|
124
|
+
if (report.anomalies.unknownTypeRows > 0) {
|
|
125
|
+
log.dim(TAG, `note: ${report.anomalies.unknownTypeRows} row(s) carry an event type this build does not know (version skew — not counted against integrity)`);
|
|
126
|
+
}
|
|
127
|
+
// Every DERIVED line carries the qualifier, not just the headline figure.
|
|
128
|
+
// The verdict line is the one that carries the pre-registered consequence —
|
|
129
|
+
// rendering `verdict: PASS` unqualified beside an UNVERIFIED number is the
|
|
130
|
+
// same indistinguishability the envelope exists to prevent. Trend too: it is
|
|
131
|
+
// computed from the same untrusted rows.
|
|
132
|
+
const unverified = report.degraded ? ' (UNVERIFIED)' : '';
|
|
133
|
+
// ── The number ──
|
|
134
|
+
log.info(TAG, `compliance${unverified}: ${formatQbdRate(report.window)} over ${report.evaluatedSessions} instrumented session(s)`);
|
|
135
|
+
// ── Pre-registration, verbatim (charter requirement) ──
|
|
136
|
+
log.dim(TAG, `pre-registered threshold + window: ${QBD_PRE_REGISTRATION_STATEMENT}`);
|
|
137
|
+
if (report.verdict === 'PENDING') {
|
|
138
|
+
log.dim(TAG, `verdict${unverified}: PENDING — ${report.instrumentedSessions}/${QBD_PRE_REGISTERED_WINDOW_SESSIONS} instrumented sessions recorded; the threshold is not evaluable until the window fills`);
|
|
139
|
+
}
|
|
140
|
+
else if (report.verdict === 'PASS') {
|
|
141
|
+
log.success(TAG, `verdict${unverified}: PASS — at or above the pre-registered floor over the window`);
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
log.warn(TAG, `verdict${unverified}: FAIL — below the pre-registered floor over the window. Per the #2510 pre-registration the adherence claims' Goal: prefixes are recorded as FALSIFIED for this window, and this number leads the next signoff.`);
|
|
145
|
+
}
|
|
146
|
+
// ── Trend ──
|
|
147
|
+
if (report.trend === null) {
|
|
148
|
+
log.dim(TAG, `trend${unverified}: insufficient data (needs at least 4 instrumented sessions)`);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
log.dim(TAG, `trend${unverified}: earlier ${formatQbdRate(report.trend.earlier)} → recent ${formatQbdRate(report.trend.recent)}`);
|
|
152
|
+
}
|
|
153
|
+
// ── Honest limitation (#2510 falsifier 4) ──
|
|
154
|
+
log.dim(TAG, 'limitation: this senses query-before-derive ADJACENCY, not influence — a query whose results the derive never read still counts as compliant (ritual-query / Goodhart). Named, not solved.');
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=doctor-qbd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-qbd.js","sourceRoot":"","sources":["../../src/commands/doctor-qbd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render tests for the `totem doctor --compliance` query-before-derive section
|
|
3
|
+
* (mmnto-ai/totem#2510).
|
|
4
|
+
*
|
|
5
|
+
* The degraded-read block follows the ADR-115 § 2 convention: this is a
|
|
6
|
+
* READ-ONLY path, so the backstop is an explicit `DEGRADED` / `UNVERIFIED`
|
|
7
|
+
* envelope in the rendered output — never a nonzero exit — and the per-item
|
|
8
|
+
* accounting is asserted by the specific failing class being NAMED. The control
|
|
9
|
+
* assertion pins that a clean ledger renders no envelope at all, so the envelope
|
|
10
|
+
* cannot rot into decoration that is always present.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=doctor-qbd.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor-qbd.test.d.ts","sourceRoot":"","sources":["../../src/commands/doctor-qbd.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|