@cleocode/core 2026.10.9 → 2026.10.10-canary.2
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/build-provenance.json +2 -2
- package/dist/decide/sites/registry.d.ts +26 -0
- package/dist/decide/sites/registry.d.ts.map +1 -1
- package/dist/decide/sites/registry.js +25 -0
- package/dist/decide/sites/registry.js.map +1 -1
- package/dist/docs/doctor.d.ts +15 -5
- package/dist/docs/doctor.d.ts.map +1 -1
- package/dist/docs/doctor.js +182 -83
- package/dist/docs/doctor.js.map +1 -1
- package/dist/docs/triage.d.ts +211 -0
- package/dist/docs/triage.d.ts.map +1 -0
- package/dist/docs/triage.js +473 -0
- package/dist/docs/triage.js.map +1 -0
- package/dist/doctor/system-health.d.ts.map +1 -1
- package/dist/doctor/system-health.js +54 -8
- package/dist/doctor/system-health.js.map +1 -1
- package/dist/hooks/release-gate.d.ts +10 -0
- package/dist/hooks/release-gate.d.ts.map +1 -1
- package/dist/hooks/release-gate.js +9 -3
- package/dist/hooks/release-gate.js.map +1 -1
- package/dist/project-scope.d.ts +1 -0
- package/dist/project-scope.d.ts.map +1 -1
- package/dist/project-scope.js +69 -6
- package/dist/project-scope.js.map +1 -1
- package/dist/resources/run-admission.d.ts +96 -0
- package/dist/resources/run-admission.d.ts.map +1 -1
- package/dist/resources/run-admission.js +155 -0
- package/dist/resources/run-admission.js.map +1 -1
- package/dist/resources/run-governed.d.ts +5 -1
- package/dist/resources/run-governed.d.ts.map +1 -1
- package/dist/resources/run-governed.js +34 -1
- package/dist/resources/run-governed.js.map +1 -1
- package/dist/spawn/agent-identity.d.ts +2 -0
- package/dist/spawn/agent-identity.d.ts.map +1 -1
- package/dist/spawn/agent-identity.js +72 -4
- package/dist/spawn/agent-identity.js.map +1 -1
- package/dist/store/blob-keep.d.ts +15 -0
- package/dist/store/blob-keep.d.ts.map +1 -1
- package/dist/store/blob-keep.js +20 -0
- package/dist/store/blob-keep.js.map +1 -1
- package/dist/store/conduit-doc-history.d.ts +265 -0
- package/dist/store/conduit-doc-history.d.ts.map +1 -0
- package/dist/store/conduit-doc-history.js +468 -0
- package/dist/store/conduit-doc-history.js.map +1 -0
- package/dist/store/row-identity-registry.d.ts +6 -4
- package/dist/store/row-identity-registry.d.ts.map +1 -1
- package/dist/store/row-identity-registry.js +59 -10
- package/dist/store/row-identity-registry.js.map +1 -1
- package/dist/store/schema/cleo-project/conduit.d.ts +554 -7
- package/dist/store/schema/cleo-project/conduit.d.ts.map +1 -1
- package/dist/store/schema/cleo-project/conduit.js +223 -30
- package/dist/store/schema/cleo-project/conduit.js.map +1 -1
- package/dist/store/schema/conduit-schema.d.ts +211 -3
- package/dist/store/schema/conduit-schema.d.ts.map +1 -1
- package/dist/store/schema/conduit-schema.js +53 -14
- package/dist/store/schema/conduit-schema.js.map +1 -1
- package/dist/store/sync/apply/parent-delete.d.ts.map +1 -1
- package/dist/store/sync/apply/parent-delete.js +6 -0
- package/dist/store/sync/apply/parent-delete.js.map +1 -1
- package/dist/store/sync/timestamp-canon.d.ts.map +1 -1
- package/dist/store/sync/timestamp-canon.js +7 -0
- package/dist/store/sync/timestamp-canon.js.map +1 -1
- package/dist/store/table-classification.d.ts.map +1 -1
- package/dist/store/table-classification.js +31 -13
- package/dist/store/table-classification.js.map +1 -1
- package/dist/tasks/gate-runner.d.ts.map +1 -1
- package/dist/tasks/gate-runner.js +44 -5
- package/dist/tasks/gate-runner.js.map +1 -1
- package/dist/tasks/test-run-binding.d.ts +4 -1
- package/dist/tasks/test-run-binding.d.ts.map +1 -1
- package/dist/tasks/test-run-binding.js +38 -2
- package/dist/tasks/test-run-binding.js.map +1 -1
- package/dist/worktree/worktree-adopt.d.ts.map +1 -1
- package/dist/worktree/worktree-adopt.js +45 -1
- package/dist/worktree/worktree-adopt.js.map +1 -1
- package/migrations/drizzle-cleo-project/20261011000000_t13354-conduit-history-rekey/migration.sql +274 -0
- package/package.json +13 -13
- package/schemas/project-info.schema.json +2 -2
- package/templates/git-hooks/commit-msg +2 -0
- package/templates/git-hooks/legacy-hashes.json +1 -0
- package/templates/git-hooks/pre-push +3 -0
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docs triage — batch System One verdicts over the docs store (T13446).
|
|
3
|
+
*
|
|
4
|
+
* Thousands of docs sit in `draft` with empty `topics`/`related_tasks`; manual
|
|
5
|
+
* triage does not scale. This module runs the registered `docs.triage`
|
|
6
|
+
* decision site over a batch of docs (default: drafts, oldest first) and
|
|
7
|
+
* produces PROPOSALS — a keep/update/supersede/archive verdict plus a
|
|
8
|
+
* staleness score per doc. It never mutates a doc: the only write is the
|
|
9
|
+
* opt-in `--record` path, which persists each verdict as a typed D####
|
|
10
|
+
* decision (`confirmationState: 'proposed'`) via `storeDecision`, leaving the
|
|
11
|
+
* docs store untouched.
|
|
12
|
+
*
|
|
13
|
+
* Each doc gets ONE {@link DecisionRequest} with two questions (`verdict` —
|
|
14
|
+
* choice, `staleness` — score) and structured state (slug, kind, status,
|
|
15
|
+
* topics, related tasks, summary, age, body excerpt); every string field is
|
|
16
|
+
* redacted, then clipped, before it leaves the machine. Requests go out
|
|
17
|
+
* through `decideBatch` in chunks the provider's batch capability can hold
|
|
18
|
+
* (layahost: 64 requests / 256 questions). Unconfigured provider ⇒ mode
|
|
19
|
+
* `off`, zero network, and every proposal is the rule fallback (age and
|
|
20
|
+
* link/metadata heuristics). Provider `unauthorized` /
|
|
21
|
+
* `insufficient_credits` answers abort the run: remaining chunks are skipped
|
|
22
|
+
* and the report carries `aborted: true`.
|
|
23
|
+
*
|
|
24
|
+
* Mode comes from `decide.sites.docTriage` (`off | shadow | on`). `shadow`
|
|
25
|
+
* (the registry default) asks and audits but the proposal that acts is the
|
|
26
|
+
* heuristic's; the provider's answers ride along on the proposal for review.
|
|
27
|
+
* `on` uses the decided verdict when it is valid and confident (≥
|
|
28
|
+
* {@link DOC_TRIAGE_MIN_CONFIDENCE}).
|
|
29
|
+
*
|
|
30
|
+
* @task T13446
|
|
31
|
+
* @saga T13339
|
|
32
|
+
*/
|
|
33
|
+
import { asc, eq } from 'drizzle-orm';
|
|
34
|
+
import { decideBatch } from '../decide/client.js';
|
|
35
|
+
import { redactThenClip, resolveDecisionSiteSettings } from '../decide/site.js';
|
|
36
|
+
import { DOC_TRIAGE_DECISION_SITE } from '../decide/sites/registry.js';
|
|
37
|
+
import { redactContent } from '../memory/redaction.js';
|
|
38
|
+
import { getProjectRoot } from '../paths.js';
|
|
39
|
+
import { createAttachmentStore } from '../store/attachment-store.js';
|
|
40
|
+
import { getDb } from '../store/sqlite.js';
|
|
41
|
+
import { ATTACHMENT_LIFECYCLE_STATUSES, attachmentRefs, attachments, } from '../store/tasks-schema.js';
|
|
42
|
+
/** Call-site id for the triage decision; keys the audit line. */
|
|
43
|
+
export const DOC_TRIAGE_SITE = DOC_TRIAGE_DECISION_SITE.id;
|
|
44
|
+
/** Config key selecting the System One mode for docs triage. */
|
|
45
|
+
export const DOC_TRIAGE_MODE_KEY = DOC_TRIAGE_DECISION_SITE.modeKey;
|
|
46
|
+
/** The verdicts offered to the decision — the doc lifecycle actions a reviewer can take. */
|
|
47
|
+
export const DOC_TRIAGE_VERDICTS = ['keep', 'update', 'supersede', 'archive'];
|
|
48
|
+
/** Staleness levels, lowest first (the `staleness` score question's scale). */
|
|
49
|
+
export const DOC_TRIAGE_STALENESS_LEVELS = [
|
|
50
|
+
'current — the doc reflects the system as it is today',
|
|
51
|
+
'minor drift — small details have aged but the substance holds',
|
|
52
|
+
'dated — parts no longer match the system; a refresh is due',
|
|
53
|
+
'stale — substantially outdated or abandoned as a draft',
|
|
54
|
+
'abandoned — untouched for a year or more with no links or metadata signal',
|
|
55
|
+
];
|
|
56
|
+
/** Minimum confidence the decided answers need before `on` mode uses them. */
|
|
57
|
+
export const DOC_TRIAGE_MIN_CONFIDENCE = 0.6;
|
|
58
|
+
/** Default number of docs one triage run scans. */
|
|
59
|
+
export const DOC_TRIAGE_DEFAULT_LIMIT = 25;
|
|
60
|
+
/** Per-chunk size for `decideBatch` — inside the layahost 64-request batch cap. */
|
|
61
|
+
export const DOC_TRIAGE_BATCH_CHUNK = 64;
|
|
62
|
+
/** Whole-chunk deadline handed to `decideBatch`, in ms. */
|
|
63
|
+
export const DOC_TRIAGE_BATCH_TIMEOUT_MS = 120_000;
|
|
64
|
+
/** Per-field character caps for the decision state. */
|
|
65
|
+
const SLUG_MAX_CHARS = 200;
|
|
66
|
+
const KIND_MAX_CHARS = 40;
|
|
67
|
+
const SUMMARY_MAX_CHARS = 400;
|
|
68
|
+
const LIST_MAX_CHARS = 200;
|
|
69
|
+
const EXCERPT_MAX_CHARS = 2_000;
|
|
70
|
+
/** Question names keying the request and its answers. */
|
|
71
|
+
const VERDICT_QUESTION = 'verdict';
|
|
72
|
+
const STALENESS_QUESTION = 'staleness';
|
|
73
|
+
/** Fallback reasons that abort the run (credit exhaustion, bad credentials). */
|
|
74
|
+
const ABORT_REASONS = new Set(['unauthorized', 'insufficient_credits']);
|
|
75
|
+
const VERDICT_CRITERIA = {
|
|
76
|
+
keep: 'The doc is accurate, linked (topics or related tasks set) and still useful as-is.',
|
|
77
|
+
update: 'The doc is worth keeping but needs a content or metadata refresh — empty topics/related_tasks, aged details, or a draft that was never finished.',
|
|
78
|
+
supersede: 'A newer doc covers the same ground; this one should be marked superseded by it.',
|
|
79
|
+
archive: 'The doc is no longer relevant to the project; archive it.',
|
|
80
|
+
};
|
|
81
|
+
/** Parse a nullable JSON-array column (`topics`, `related_tasks`) into strings. */
|
|
82
|
+
function parseStringArray(raw) {
|
|
83
|
+
if (!raw)
|
|
84
|
+
return [];
|
|
85
|
+
try {
|
|
86
|
+
const parsed = JSON.parse(raw);
|
|
87
|
+
return Array.isArray(parsed) ? parsed.filter((v) => typeof v === 'string') : [];
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Select triage candidates from the attachments store: one row per doc with a
|
|
95
|
+
* slug, filtered by lifecycle status (`draft` by default), oldest first.
|
|
96
|
+
*
|
|
97
|
+
* Read-only: this is a drizzle SELECT through the canonical `getDb`
|
|
98
|
+
* chokepoint, never a write.
|
|
99
|
+
*
|
|
100
|
+
* @param opts - Status filter, limit and project root.
|
|
101
|
+
* @returns The candidates, oldest first.
|
|
102
|
+
*/
|
|
103
|
+
export async function listTriageCandidates(opts = {}) {
|
|
104
|
+
const status = opts.status ?? 'draft';
|
|
105
|
+
const limit = opts.limit ?? DOC_TRIAGE_DEFAULT_LIMIT;
|
|
106
|
+
if (!ATTACHMENT_LIFECYCLE_STATUSES.includes(status)) {
|
|
107
|
+
throw new Error(`Invalid lifecycle status '${status}'. Valid: ${ATTACHMENT_LIFECYCLE_STATUSES.join(', ')}`);
|
|
108
|
+
}
|
|
109
|
+
const projectRoot = opts.projectRoot ?? getProjectRoot();
|
|
110
|
+
const db = await getDb(projectRoot);
|
|
111
|
+
const rows = await db
|
|
112
|
+
.select({
|
|
113
|
+
id: attachments.id,
|
|
114
|
+
sha256: attachments.sha256,
|
|
115
|
+
slug: attachments.slug,
|
|
116
|
+
type: attachments.type,
|
|
117
|
+
lifecycleStatus: attachments.lifecycleStatus,
|
|
118
|
+
topics: attachments.topics,
|
|
119
|
+
relatedTasks: attachments.relatedTasks,
|
|
120
|
+
summary: attachments.summary,
|
|
121
|
+
createdAt: attachments.createdAt,
|
|
122
|
+
ownerId: attachmentRefs.ownerId,
|
|
123
|
+
})
|
|
124
|
+
.from(attachments)
|
|
125
|
+
.leftJoin(attachmentRefs, eq(attachmentRefs.attachmentId, attachments.id))
|
|
126
|
+
.where(eq(attachments.lifecycleStatus, status))
|
|
127
|
+
.orderBy(asc(attachments.createdAt))
|
|
128
|
+
.all();
|
|
129
|
+
const seen = new Set();
|
|
130
|
+
const out = [];
|
|
131
|
+
for (const row of rows) {
|
|
132
|
+
if (seen.has(row.id))
|
|
133
|
+
continue;
|
|
134
|
+
seen.add(row.id);
|
|
135
|
+
out.push({
|
|
136
|
+
attachmentId: row.id,
|
|
137
|
+
sha256: row.sha256,
|
|
138
|
+
slug: row.slug ?? null,
|
|
139
|
+
kind: row.type ?? null,
|
|
140
|
+
status: row.lifecycleStatus,
|
|
141
|
+
topics: parseStringArray(row.topics),
|
|
142
|
+
relatedTasks: parseStringArray(row.relatedTasks),
|
|
143
|
+
summary: row.summary ?? null,
|
|
144
|
+
createdAt: row.createdAt,
|
|
145
|
+
ownerId: row.ownerId ?? null,
|
|
146
|
+
});
|
|
147
|
+
if (out.length >= limit)
|
|
148
|
+
break;
|
|
149
|
+
}
|
|
150
|
+
return out;
|
|
151
|
+
}
|
|
152
|
+
/** Whole days between `createdAt` and `now`; never negative. */
|
|
153
|
+
function ageDays(createdAt, now) {
|
|
154
|
+
const then = Date.parse(createdAt);
|
|
155
|
+
if (Number.isNaN(then))
|
|
156
|
+
return 0;
|
|
157
|
+
return Math.max(0, Math.floor((now.getTime() - then) / 86_400_000));
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* The rule fallback: a deterministic verdict from age, lifecycle status and
|
|
161
|
+
* whether the doc carries any topics or related-task links.
|
|
162
|
+
*
|
|
163
|
+
* - Non-draft docs and linked drafts that are still fresh: `keep`.
|
|
164
|
+
* - Drafts missing all metadata, or linked drafts that have drifted: `update`.
|
|
165
|
+
* - Unlinked drafts untouched for a year or more: `archive`.
|
|
166
|
+
*
|
|
167
|
+
* @param doc - The candidate.
|
|
168
|
+
* @param now - The clock reading the age is measured against.
|
|
169
|
+
* @returns The heuristic verdict, staleness level and rationale.
|
|
170
|
+
*/
|
|
171
|
+
export function heuristicDocTriage(doc, now) {
|
|
172
|
+
const age = ageDays(doc.createdAt, now);
|
|
173
|
+
const linked = doc.topics.length > 0 || doc.relatedTasks.length > 0;
|
|
174
|
+
let staleness = age < 30 ? 0 : age < 90 ? 1 : age < 180 ? 2 : age < 365 ? 3 : 4;
|
|
175
|
+
if (!linked)
|
|
176
|
+
staleness = Math.min(staleness + 1, DOC_TRIAGE_STALENESS_LEVELS.length - 1);
|
|
177
|
+
if (doc.status !== 'draft') {
|
|
178
|
+
return {
|
|
179
|
+
verdict: 'keep',
|
|
180
|
+
staleness,
|
|
181
|
+
rationale: `status '${doc.status}' is past the draft gate; triage only proposes on drafts`,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
if (linked && staleness <= 1) {
|
|
185
|
+
return {
|
|
186
|
+
verdict: 'keep',
|
|
187
|
+
staleness,
|
|
188
|
+
rationale: 'draft with topics/related-task links, still fresh',
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
if (!linked && age >= 365) {
|
|
192
|
+
return {
|
|
193
|
+
verdict: 'archive',
|
|
194
|
+
staleness,
|
|
195
|
+
rationale: `draft with no topics or related tasks, untouched for ${age} days`,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
return {
|
|
199
|
+
verdict: 'update',
|
|
200
|
+
staleness,
|
|
201
|
+
rationale: linked
|
|
202
|
+
? `linked draft showing drift (${age} days old)`
|
|
203
|
+
: `draft with empty topics/related_tasks (${age} days old) — needs metadata`,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Build the decision request for one candidate: structured state (every
|
|
208
|
+
* string redacted, then clipped) plus the `verdict` choice and `staleness`
|
|
209
|
+
* score questions.
|
|
210
|
+
*
|
|
211
|
+
* @param doc - The candidate.
|
|
212
|
+
* @param bodyExcerpt - Body text excerpt (already fetched), when readable.
|
|
213
|
+
* @param now - Clock reading for the age field.
|
|
214
|
+
* @returns The request.
|
|
215
|
+
*/
|
|
216
|
+
export function buildDocTriageRequest(doc, bodyExcerpt, now) {
|
|
217
|
+
const redact = (s) => redactContent(s).content;
|
|
218
|
+
return {
|
|
219
|
+
state: {
|
|
220
|
+
slug: redactThenClip(doc.slug ?? doc.attachmentId, SLUG_MAX_CHARS, redact),
|
|
221
|
+
kind: redactThenClip(doc.kind ?? 'unknown', KIND_MAX_CHARS, redact),
|
|
222
|
+
status: doc.status,
|
|
223
|
+
topics: redactThenClip(doc.topics.join(', '), LIST_MAX_CHARS, redact),
|
|
224
|
+
relatedTasks: redactThenClip(doc.relatedTasks.join(', '), LIST_MAX_CHARS, redact),
|
|
225
|
+
summary: redactThenClip(doc.summary ?? '', SUMMARY_MAX_CHARS, redact),
|
|
226
|
+
ageDays: ageDays(doc.createdAt, now),
|
|
227
|
+
...(bodyExcerpt !== null
|
|
228
|
+
? { bodyExcerpt: redactThenClip(bodyExcerpt, EXCERPT_MAX_CHARS, redact) }
|
|
229
|
+
: {}),
|
|
230
|
+
},
|
|
231
|
+
questions: {
|
|
232
|
+
[VERDICT_QUESTION]: {
|
|
233
|
+
type: 'choice',
|
|
234
|
+
instructions: 'Triage verdict for this document. Judge from its status, age, links and content.',
|
|
235
|
+
criteria: VERDICT_CRITERIA,
|
|
236
|
+
},
|
|
237
|
+
[STALENESS_QUESTION]: {
|
|
238
|
+
type: 'score',
|
|
239
|
+
instructions: 'How stale is this document relative to the system it describes?',
|
|
240
|
+
criteria: DOC_TRIAGE_STALENESS_LEVELS,
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
/** Whether `value` is one of the offered verdicts. */
|
|
246
|
+
function isTriageVerdict(value) {
|
|
247
|
+
return DOC_TRIAGE_VERDICTS.includes(value);
|
|
248
|
+
}
|
|
249
|
+
/** Fetch a body excerpt for one candidate from the attachment store. */
|
|
250
|
+
async function fetchExcerpt(doc, projectRoot) {
|
|
251
|
+
try {
|
|
252
|
+
const store = createAttachmentStore();
|
|
253
|
+
const result = await store.get(doc.sha256, projectRoot);
|
|
254
|
+
return result ? result.bytes.toString('utf-8') : null;
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/** An audit sink that counts fallback reasons and spots abort conditions. */
|
|
261
|
+
function collectingAudit() {
|
|
262
|
+
const fallbackReasons = {};
|
|
263
|
+
const state = {};
|
|
264
|
+
return {
|
|
265
|
+
fallbackReasons,
|
|
266
|
+
state,
|
|
267
|
+
sink: {
|
|
268
|
+
write(entry) {
|
|
269
|
+
const reason = entry.fallbackReason;
|
|
270
|
+
if (reason === undefined)
|
|
271
|
+
return;
|
|
272
|
+
fallbackReasons[reason] = (fallbackReasons[reason] ?? 0) + 1;
|
|
273
|
+
if (state.abortReason === undefined && ABORT_REASONS.has(reason)) {
|
|
274
|
+
state.abortReason = reason;
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
},
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
/** Map a numeric confidence onto the brain decision confidence enum. */
|
|
281
|
+
function toConfidenceLevel(confidence) {
|
|
282
|
+
return confidence >= 0.8 ? 'high' : confidence >= 0.5 ? 'medium' : 'low';
|
|
283
|
+
}
|
|
284
|
+
/** Read the provider's `verdict`/`staleness` answers off an outcome, when valid. */
|
|
285
|
+
function decidedAnswers(outcome) {
|
|
286
|
+
if (outcome.source === 'fallback')
|
|
287
|
+
return undefined;
|
|
288
|
+
const verdict = outcome.answers[VERDICT_QUESTION];
|
|
289
|
+
const staleness = outcome.answers[STALENESS_QUESTION];
|
|
290
|
+
if (verdict?.type !== 'choice' || staleness?.type !== 'score')
|
|
291
|
+
return undefined;
|
|
292
|
+
return {
|
|
293
|
+
verdict: isTriageVerdict(verdict.value) ? verdict.value : null,
|
|
294
|
+
verdictConfidence: verdict.confidence,
|
|
295
|
+
staleness: staleness.value >= 0 && staleness.value < DOC_TRIAGE_STALENESS_LEVELS.length
|
|
296
|
+
? staleness.value
|
|
297
|
+
: null,
|
|
298
|
+
stalenessConfidence: staleness.confidence,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Batch-triage docs through the `docs.triage` site.
|
|
303
|
+
*
|
|
304
|
+
* Produces one proposal per scanned doc and NEVER mutates a doc. With
|
|
305
|
+
* `record: true` each proposal is persisted as a typed D#### decision
|
|
306
|
+
* (`confirmationState: 'proposed'`, `decidedBy: 'agent'`) whose text names the
|
|
307
|
+
* doc slug, so the verdicts stay reviewable and reversible. An
|
|
308
|
+
* `unauthorized`/`insufficient_credits` answer aborts the run before the next
|
|
309
|
+
* chunk goes out.
|
|
310
|
+
*
|
|
311
|
+
* @param opts - Status filter, limit, record flag, mode and wiring.
|
|
312
|
+
* @returns The triage report.
|
|
313
|
+
*/
|
|
314
|
+
export async function triageDocs(opts = {}) {
|
|
315
|
+
const projectRoot = opts.projectRoot ?? getProjectRoot();
|
|
316
|
+
const now = opts.now ?? new Date();
|
|
317
|
+
const status = opts.status ?? 'draft';
|
|
318
|
+
const candidates = await listTriageCandidates({ status, limit: opts.limit, projectRoot });
|
|
319
|
+
const collector = collectingAudit();
|
|
320
|
+
const proposals = [];
|
|
321
|
+
let recorded = 0;
|
|
322
|
+
const heuristics = candidates.map((doc) => heuristicDocTriage(doc, now));
|
|
323
|
+
const settings = await resolveDecisionSiteSettings({
|
|
324
|
+
modeKey: DOC_TRIAGE_MODE_KEY,
|
|
325
|
+
mode: opts.mode,
|
|
326
|
+
wiring: opts.decide,
|
|
327
|
+
projectRoot,
|
|
328
|
+
});
|
|
329
|
+
if (settings.mode !== 'off' && candidates.length > 0) {
|
|
330
|
+
const entries = await Promise.all(candidates.map(async (doc, i) => {
|
|
331
|
+
const heuristic = heuristics[i];
|
|
332
|
+
const excerpt = await fetchExcerpt(doc, projectRoot);
|
|
333
|
+
const heuristicAnswers = {
|
|
334
|
+
[VERDICT_QUESTION]: {
|
|
335
|
+
type: 'choice',
|
|
336
|
+
value: heuristic.verdict,
|
|
337
|
+
probabilities: Object.fromEntries(DOC_TRIAGE_VERDICTS.map((v) => [v, v === heuristic.verdict ? 1 : 0])),
|
|
338
|
+
confidence: 0.5,
|
|
339
|
+
},
|
|
340
|
+
[STALENESS_QUESTION]: {
|
|
341
|
+
type: 'score',
|
|
342
|
+
value: heuristic.staleness,
|
|
343
|
+
probabilities: DOC_TRIAGE_STALENESS_LEVELS.map((_, k) => k === heuristic.staleness ? 1 : 0),
|
|
344
|
+
confidence: 0.5,
|
|
345
|
+
},
|
|
346
|
+
};
|
|
347
|
+
return {
|
|
348
|
+
req: buildDocTriageRequest(doc, excerpt, now),
|
|
349
|
+
fallback: () => heuristicAnswers,
|
|
350
|
+
};
|
|
351
|
+
}));
|
|
352
|
+
const outcomes = new Array(entries.length);
|
|
353
|
+
// Audit: every asked question lands in the standard decisions.jsonl trail
|
|
354
|
+
// (the shadow-mode observability every site gets) AND in the collector
|
|
355
|
+
// that drives this report's fallback-reason histogram and abort flag.
|
|
356
|
+
let fileSink = null;
|
|
357
|
+
if (opts.decide?.audit === undefined) {
|
|
358
|
+
try {
|
|
359
|
+
const { createJsonlDecisionAudit } = await import('../decide/audit.js');
|
|
360
|
+
fileSink = createJsonlDecisionAudit(projectRoot);
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
fileSink = null;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
fileSink = opts.decide.audit;
|
|
368
|
+
}
|
|
369
|
+
const base = fileSink;
|
|
370
|
+
const audit = {
|
|
371
|
+
write(entry) {
|
|
372
|
+
collector.sink.write(entry);
|
|
373
|
+
base?.write(entry);
|
|
374
|
+
},
|
|
375
|
+
};
|
|
376
|
+
for (let start = 0; start < entries.length; start += DOC_TRIAGE_BATCH_CHUNK) {
|
|
377
|
+
if (collector.state.abortReason !== undefined)
|
|
378
|
+
break;
|
|
379
|
+
const chunk = entries.slice(start, start + DOC_TRIAGE_BATCH_CHUNK);
|
|
380
|
+
const chunkOutcomes = await decideBatch(DOC_TRIAGE_SITE, chunk, {
|
|
381
|
+
...opts.decide,
|
|
382
|
+
audit,
|
|
383
|
+
timeoutMs: opts.decide?.timeoutMs ?? DOC_TRIAGE_BATCH_TIMEOUT_MS,
|
|
384
|
+
projectRoot,
|
|
385
|
+
});
|
|
386
|
+
for (const [k, outcome] of chunkOutcomes.entries())
|
|
387
|
+
outcomes[start + k] = outcome;
|
|
388
|
+
}
|
|
389
|
+
for (const [i, doc] of candidates.entries()) {
|
|
390
|
+
const heuristic = heuristics[i];
|
|
391
|
+
const outcome = outcomes[i];
|
|
392
|
+
const decided = outcome ? decidedAnswers(outcome) : undefined;
|
|
393
|
+
let verdict = heuristic.verdict;
|
|
394
|
+
let staleness = heuristic.staleness;
|
|
395
|
+
let source = 'rule';
|
|
396
|
+
let confidence = 0.5;
|
|
397
|
+
if (settings.mode === 'on' &&
|
|
398
|
+
decided?.verdict != null &&
|
|
399
|
+
decided.verdictConfidence >= DOC_TRIAGE_MIN_CONFIDENCE) {
|
|
400
|
+
verdict = decided.verdict;
|
|
401
|
+
source = 'system-one';
|
|
402
|
+
confidence = decided.verdictConfidence;
|
|
403
|
+
if (decided.staleness !== null && decided.stalenessConfidence >= DOC_TRIAGE_MIN_CONFIDENCE)
|
|
404
|
+
staleness = decided.staleness;
|
|
405
|
+
}
|
|
406
|
+
proposals.push({
|
|
407
|
+
attachmentId: doc.attachmentId,
|
|
408
|
+
slug: doc.slug,
|
|
409
|
+
kind: doc.kind,
|
|
410
|
+
verdict,
|
|
411
|
+
source,
|
|
412
|
+
confidence,
|
|
413
|
+
staleness,
|
|
414
|
+
stalenessLabel: DOC_TRIAGE_STALENESS_LEVELS[staleness] ?? String(staleness),
|
|
415
|
+
rationale: heuristic.rationale,
|
|
416
|
+
...(decided !== undefined ? { decided } : {}),
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
else {
|
|
421
|
+
for (const [i, doc] of candidates.entries()) {
|
|
422
|
+
const heuristic = heuristics[i];
|
|
423
|
+
proposals.push({
|
|
424
|
+
attachmentId: doc.attachmentId,
|
|
425
|
+
slug: doc.slug,
|
|
426
|
+
kind: doc.kind,
|
|
427
|
+
verdict: heuristic.verdict,
|
|
428
|
+
source: 'rule',
|
|
429
|
+
confidence: 0.5,
|
|
430
|
+
staleness: heuristic.staleness,
|
|
431
|
+
stalenessLabel: DOC_TRIAGE_STALENESS_LEVELS[heuristic.staleness] ?? '',
|
|
432
|
+
rationale: heuristic.rationale,
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
if (opts.record === true && proposals.length > 0) {
|
|
437
|
+
const { storeDecision } = await import('../memory/decisions.js');
|
|
438
|
+
for (const [i, proposal] of proposals.entries()) {
|
|
439
|
+
const ownerId = candidates[i]?.ownerId ?? null;
|
|
440
|
+
const handle = proposal.slug ?? proposal.attachmentId;
|
|
441
|
+
const decidedNote = proposal.decided?.verdict != null
|
|
442
|
+
? ` System One (${settings.mode}) answered '${proposal.decided.verdict}' at confidence ${proposal.decided.verdictConfidence.toFixed(2)}.`
|
|
443
|
+
: '';
|
|
444
|
+
const row = await storeDecision(projectRoot, {
|
|
445
|
+
type: 'process',
|
|
446
|
+
decision: `docs.triage verdict for ${handle}: ${proposal.verdict}`,
|
|
447
|
+
rationale: `${proposal.rationale}. Staleness: ${proposal.stalenessLabel}. ` +
|
|
448
|
+
`Source: ${proposal.source} (confidence ${proposal.confidence.toFixed(2)}).` +
|
|
449
|
+
decidedNote +
|
|
450
|
+
` Site ${DOC_TRIAGE_SITE} (T13446); proposal only — the doc was not mutated.`,
|
|
451
|
+
confidence: toConfidenceLevel(proposal.confidence),
|
|
452
|
+
...(ownerId !== null && /^T\d+$/.test(ownerId) ? { contextTaskId: ownerId } : {}),
|
|
453
|
+
confirmationState: 'proposed',
|
|
454
|
+
decidedBy: 'agent',
|
|
455
|
+
});
|
|
456
|
+
recorded += 1;
|
|
457
|
+
proposals[i] = { ...proposal, decisionId: row.id };
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
const aborted = collector.state.abortReason !== undefined;
|
|
461
|
+
return {
|
|
462
|
+
site: DOC_TRIAGE_SITE,
|
|
463
|
+
mode: settings.mode,
|
|
464
|
+
status,
|
|
465
|
+
scanned: candidates.length,
|
|
466
|
+
recorded,
|
|
467
|
+
aborted,
|
|
468
|
+
...(aborted ? { abortReason: collector.state.abortReason } : {}),
|
|
469
|
+
fallbackReasons: collector.fallbackReasons,
|
|
470
|
+
proposals,
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=triage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/docs/triage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system-health.d.ts","sourceRoot":"","sources":["../../src/doctor/system-health.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"system-health.d.ts","sourceRoot":"","sources":["../../src/doctor/system-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -308,7 +308,39 @@ function memoryFindings(s, rows) {
|
|
|
308
308
|
}
|
|
309
309
|
/** Servers with at least this many copies are flagged. */
|
|
310
310
|
const MCP_FANOUT_WARN = 6;
|
|
311
|
+
/**
|
|
312
|
+
* Servers whose owners asked for a specific remedy instead of the generic
|
|
313
|
+
* "scope it to projects" one. agentmbx: its leases are tied to the processes,
|
|
314
|
+
* so never suggest killing them (agentmbx-lead, 2026-10-10; their T487/T488).
|
|
315
|
+
*/
|
|
316
|
+
const KNOWN_MCP_REMEDIES = {
|
|
317
|
+
agentmbx: {
|
|
318
|
+
remedy: {
|
|
319
|
+
command: 'agentmbx doctor',
|
|
320
|
+
description: 'One stdio agentmbx per session is by design, and its leases are tied to those processes: never kill them. ' +
|
|
321
|
+
'Upgrade agentmbx to the release that ships T487/T488 (pending), which removes duplicate and orphaned processes. ' +
|
|
322
|
+
'`agentmbx doctor` reports stale MCP rows. Restart idle harness sessions you no longer need.',
|
|
323
|
+
},
|
|
324
|
+
// upgrading and restarting sessions are the owner's actions
|
|
325
|
+
needsOwnerChoice: true,
|
|
326
|
+
},
|
|
327
|
+
};
|
|
328
|
+
/**
|
|
329
|
+
* Whether an MCP outside every session was left behind: re-parented to init
|
|
330
|
+
* (pid 1, launchd) or to a Linux user manager (`systemd --user`) once its
|
|
331
|
+
* session exited.
|
|
332
|
+
*/
|
|
333
|
+
function isOrphanParent(parent, ppid) {
|
|
334
|
+
if (ppid <= 1 || parent === undefined)
|
|
335
|
+
return true;
|
|
336
|
+
return /^(systemd|launchd|init)$/.test(commandWords(parent.argv)[0] ?? '');
|
|
337
|
+
}
|
|
311
338
|
function mcpFindings(tree, rows) {
|
|
339
|
+
const sessions = harnessSessions(rows);
|
|
340
|
+
const sessionOf = new Map();
|
|
341
|
+
for (const sess of sessions)
|
|
342
|
+
for (const r of subtree(tree, sess))
|
|
343
|
+
sessionOf.set(r.pid, sess.pid);
|
|
312
344
|
const groups = new Map();
|
|
313
345
|
for (const r of rows) {
|
|
314
346
|
const name = mcpServerName(r);
|
|
@@ -318,37 +350,51 @@ function mcpFindings(tree, rows) {
|
|
|
318
350
|
const parent = tree.byPid.get(r.ppid);
|
|
319
351
|
if (parent && mcpServerName(parent) !== null)
|
|
320
352
|
continue;
|
|
321
|
-
const g = groups.get(name) ?? { count: 0, rss: 0, pids: [] };
|
|
353
|
+
const g = groups.get(name) ?? { count: 0, rss: 0, pids: [], sessions: new Set(), orphans: 0 };
|
|
322
354
|
g.count++;
|
|
323
355
|
g.rss += sumRss(subtree(tree, r));
|
|
324
356
|
if (g.pids.length < 10)
|
|
325
357
|
g.pids.push(r.pid);
|
|
358
|
+
const sess = sessionOf.get(r.pid);
|
|
359
|
+
if (sess !== undefined)
|
|
360
|
+
g.sessions.add(sess);
|
|
361
|
+
else if (isOrphanParent(tree.byPid.get(r.ppid), r.ppid))
|
|
362
|
+
g.orphans++;
|
|
326
363
|
groups.set(name, g);
|
|
327
364
|
}
|
|
328
365
|
const out = [];
|
|
329
366
|
for (const [name, g] of groups) {
|
|
330
367
|
if (g.count < MCP_FANOUT_WARN)
|
|
331
368
|
continue;
|
|
369
|
+
const everySession = sessions.length >= 2 && g.sessions.size === sessions.length;
|
|
370
|
+
const known = KNOWN_MCP_REMEDIES[name];
|
|
332
371
|
out.push({
|
|
333
372
|
id: `mcp-fanout:${name}`,
|
|
334
373
|
category: 'mcp-fanout',
|
|
335
374
|
severity: g.count >= 20 || g.rss >= 2 * GIB ? 'warning' : 'info',
|
|
336
|
-
title: `${g.count} copies of MCP server ${name} (${mib(g.rss)} MiB)
|
|
375
|
+
title: `${g.count} copies of MCP server ${name} (${mib(g.rss)} MiB) in ${g.sessions.size} of ${sessions.length} sessions` +
|
|
376
|
+
(g.orphans > 0 ? `, ${g.orphans} orphaned` : ''),
|
|
337
377
|
evidence: {
|
|
338
378
|
server: name,
|
|
339
379
|
processes: g.count,
|
|
340
380
|
rssMib: mib(g.rss),
|
|
381
|
+
perProcessMib: mib(g.rss / g.count),
|
|
382
|
+
sessionsWithServer: g.sessions.size,
|
|
383
|
+
sessionsTotal: sessions.length,
|
|
384
|
+
inEverySession: everySession,
|
|
385
|
+
orphans: g.orphans,
|
|
341
386
|
samplePids: g.pids.map(String),
|
|
342
387
|
},
|
|
343
388
|
impactBytes: g.rss,
|
|
344
|
-
remedy: {
|
|
389
|
+
remedy: known?.remedy ?? {
|
|
345
390
|
command: `claude mcp remove ${name} --scope user`,
|
|
346
|
-
description:
|
|
347
|
-
'
|
|
348
|
-
|
|
349
|
-
'
|
|
391
|
+
description: `${everySession ? 'Every' : 'Each'} harness session starts its own stdio copy, whether or not it calls the server ` +
|
|
392
|
+
'(the doctor cannot see tool calls). ' +
|
|
393
|
+
`If ${name} is not needed in every session, remove it from user scope and add it to only the projects that use it ` +
|
|
394
|
+
'(`claude mcp add … --scope project`); the name may differ in the harness config (`claude mcp list`). ' +
|
|
395
|
+
'Restarting sessions applies it. Servers with a shared-daemon mode should use one daemon per machine instead.',
|
|
350
396
|
},
|
|
351
|
-
needsOwnerChoice: true,
|
|
397
|
+
needsOwnerChoice: known?.needsOwnerChoice ?? true,
|
|
352
398
|
});
|
|
353
399
|
}
|
|
354
400
|
return out;
|