mewkit 1.10.7 → 1.11.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.
Files changed (35) hide show
  1. package/dist/commands/index-command.d.ts +7 -0
  2. package/dist/commands/index-command.d.ts.map +1 -0
  3. package/dist/commands/index-command.js +67 -0
  4. package/dist/commands/index-command.js.map +1 -0
  5. package/dist/commands/inventory.d.ts +4 -0
  6. package/dist/commands/inventory.d.ts.map +1 -1
  7. package/dist/commands/inventory.js +38 -0
  8. package/dist/commands/inventory.js.map +1 -1
  9. package/dist/commands/trace.d.ts +11 -0
  10. package/dist/commands/trace.d.ts.map +1 -0
  11. package/dist/commands/trace.js +146 -0
  12. package/dist/commands/trace.js.map +1 -0
  13. package/dist/commands/validate.d.ts +3 -1
  14. package/dist/commands/validate.d.ts.map +1 -1
  15. package/dist/commands/validate.js +6 -0
  16. package/dist/commands/validate.js.map +1 -1
  17. package/dist/core/build-inventory.d.ts +4 -0
  18. package/dist/core/build-inventory.d.ts.map +1 -1
  19. package/dist/core/build-inventory.js +4 -0
  20. package/dist/core/build-inventory.js.map +1 -1
  21. package/dist/core/derived-index.d.ts +34 -0
  22. package/dist/core/derived-index.d.ts.map +1 -0
  23. package/dist/core/derived-index.js +137 -0
  24. package/dist/core/derived-index.js.map +1 -0
  25. package/dist/core/substrate.d.ts +47 -0
  26. package/dist/core/substrate.d.ts.map +1 -0
  27. package/dist/core/substrate.js +183 -0
  28. package/dist/core/substrate.js.map +1 -0
  29. package/dist/core/trace-analysis.d.ts +60 -0
  30. package/dist/core/trace-analysis.d.ts.map +1 -0
  31. package/dist/core/trace-analysis.js +167 -0
  32. package/dist/core/trace-analysis.js.map +1 -0
  33. package/dist/index.js +37 -0
  34. package/dist/index.js.map +1 -1
  35. package/package.json +1 -1
@@ -0,0 +1,34 @@
1
+ export declare const SCHEMA_VERSION = 1;
2
+ export declare function dbPath(claudeDir: string): string;
3
+ export interface IndexResult {
4
+ dbPath: string;
5
+ schemaVersion: number;
6
+ traceRows: number;
7
+ costRows: number;
8
+ }
9
+ /** Build/refresh the derived index from the canonical logs. Full re-ingest = deterministic and
10
+ * rebuild-able. Creates the DB (WAL) if absent. Never mutates the source logs. */
11
+ export declare function buildIndex(claudeDir: string): IndexResult;
12
+ export interface QueryResult {
13
+ schemaVersion: number;
14
+ eventsByType: {
15
+ event: string;
16
+ n: number;
17
+ }[];
18
+ runsByTier: {
19
+ run_id: string;
20
+ events: number;
21
+ }[];
22
+ frictionByResponsibility: {
23
+ responsibility: string;
24
+ n: number;
25
+ }[];
26
+ costByModel: {
27
+ model: string;
28
+ entries: number;
29
+ tokens: number;
30
+ }[];
31
+ }
32
+ /** Read-only aggregate/join queries. Opens the DB read-only; only static SELECTs run. */
33
+ export declare function queryIndex(claudeDir: string): QueryResult;
34
+ //# sourceMappingURL=derived-index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived-index.d.ts","sourceRoot":"","sources":["../../src/core/derived-index.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,cAAc,IAAI,CAAC;AAuBhC,wBAAgB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEhD;AA0ED,MAAM,WAAW,WAAW;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED;mFACmF;AACnF,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAezD;AAED,MAAM,WAAW,WAAW;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7C,UAAU,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjD,wBAAwB,EAAE;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAClE,WAAW,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAClE;AAED,yFAAyF;AACzF,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAyBzD"}
@@ -0,0 +1,137 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { DatabaseSync } from "node:sqlite";
4
+ import { parseTraceLog } from "./trace-analysis.js";
5
+ // A DERIVED, disposable SQLite index over the append logs. The JSONL/JSON logs stay the
6
+ // canonical write-of-record; this DB is a rebuild-able read index (delete → reindex → identical).
7
+ // Opt-in: nothing builds it automatically and no hook writes to it. All inserts are parameterized
8
+ // (prepared statements); queries are static aggregates with no user-supplied SQL — no injection
9
+ // surface. The DB lives under .claude/memory/ (already git-ignored, machine-local).
10
+ export const SCHEMA_VERSION = 1;
11
+ const DB_REL = path.join("memory", "index.db");
12
+ /** Forward migrations, applied in order when the DB's PRAGMA user_version is behind. */
13
+ const MIGRATIONS = [
14
+ {
15
+ version: 1,
16
+ sql: `
17
+ CREATE TABLE trace_events (
18
+ id INTEGER PRIMARY KEY,
19
+ ts TEXT, event TEXT, run_id TEXT, model TEXT, density TEXT,
20
+ responsibility TEXT, data TEXT
21
+ );
22
+ CREATE INDEX idx_trace_event ON trace_events(event);
23
+ CREATE INDEX idx_trace_run ON trace_events(run_id);
24
+ CREATE TABLE cost_entries (
25
+ id INTEGER PRIMARY KEY,
26
+ date TEXT, command TEXT, tier TEXT, model TEXT,
27
+ tokens INTEGER, task TEXT, raw TEXT
28
+ );`,
29
+ },
30
+ ];
31
+ export function dbPath(claudeDir) {
32
+ return path.join(claudeDir, DB_REL);
33
+ }
34
+ function userVersion(db) {
35
+ const row = db.prepare("PRAGMA user_version").get();
36
+ const v = row?.["user_version"];
37
+ return typeof v === "number" ? v : 0;
38
+ }
39
+ /** Apply any pending forward migrations and stamp the schema version. */
40
+ function migrate(db) {
41
+ let current = userVersion(db);
42
+ for (const m of MIGRATIONS) {
43
+ if (m.version > current) {
44
+ db.exec(m.sql);
45
+ db.exec(`PRAGMA user_version = ${m.version}`); // integer constant — not user input
46
+ current = m.version;
47
+ }
48
+ }
49
+ }
50
+ function asString(v) {
51
+ if (v === null || v === undefined)
52
+ return null;
53
+ return typeof v === "string" ? v : JSON.stringify(v);
54
+ }
55
+ function asNumber(v) {
56
+ return typeof v === "number" && Number.isFinite(v) ? v : null;
57
+ }
58
+ /** Ingest the trace log (full replace — deterministic rebuild). */
59
+ function ingestTrace(db, claudeDir) {
60
+ const logPath = path.join(claudeDir, "memory", "trace-log.jsonl");
61
+ if (!fs.existsSync(logPath))
62
+ return 0;
63
+ const records = parseTraceLog(fs.readFileSync(logPath, "utf-8"));
64
+ const stmt = db.prepare("INSERT INTO trace_events (ts, event, run_id, model, density, responsibility, data) VALUES (?, ?, ?, ?, ?, ?, ?)");
65
+ for (const r of records) {
66
+ const data = r.data ?? {};
67
+ const resp = typeof data["responsibility"] === "string" ? data["responsibility"] : null;
68
+ stmt.run(asString(r.ts), asString(r.event), asString(r.run_id), asString(r.model), asString(r.density), resp, asString(data));
69
+ }
70
+ return records.length;
71
+ }
72
+ /** Ingest the cost log defensively (the CostEntry union varies; keep common columns + raw JSON). */
73
+ function ingestCost(db, claudeDir) {
74
+ const logPath = path.join(claudeDir, "memory", "cost-log.json");
75
+ if (!fs.existsSync(logPath))
76
+ return 0;
77
+ let arr;
78
+ try {
79
+ arr = JSON.parse(fs.readFileSync(logPath, "utf-8"));
80
+ }
81
+ catch {
82
+ return 0;
83
+ }
84
+ if (!Array.isArray(arr))
85
+ return 0;
86
+ const stmt = db.prepare("INSERT INTO cost_entries (date, command, tier, model, tokens, task, raw) VALUES (?, ?, ?, ?, ?, ?, ?)");
87
+ for (const e of arr) {
88
+ const o = (e && typeof e === "object" ? e : {});
89
+ stmt.run(asString(o["date"] ?? o["ts"]), asString(o["command"]), asString(o["tier"]), asString(o["model"]), asNumber(o["tokens"]), asString(o["task"]), asString(o));
90
+ }
91
+ return arr.length;
92
+ }
93
+ /** Build/refresh the derived index from the canonical logs. Full re-ingest = deterministic and
94
+ * rebuild-able. Creates the DB (WAL) if absent. Never mutates the source logs. */
95
+ export function buildIndex(claudeDir) {
96
+ const target = dbPath(claudeDir);
97
+ fs.mkdirSync(path.dirname(target), { recursive: true });
98
+ const db = new DatabaseSync(target);
99
+ try {
100
+ db.exec("PRAGMA journal_mode = WAL");
101
+ migrate(db);
102
+ db.exec("DELETE FROM trace_events");
103
+ db.exec("DELETE FROM cost_entries");
104
+ const traceRows = ingestTrace(db, claudeDir);
105
+ const costRows = ingestCost(db, claudeDir);
106
+ return { dbPath: target, schemaVersion: userVersion(db), traceRows, costRows };
107
+ }
108
+ finally {
109
+ db.close();
110
+ }
111
+ }
112
+ /** Read-only aggregate/join queries. Opens the DB read-only; only static SELECTs run. */
113
+ export function queryIndex(claudeDir) {
114
+ const target = dbPath(claudeDir);
115
+ if (!fs.existsSync(target))
116
+ throw new Error("no index — run `mewkit index` first");
117
+ const db = new DatabaseSync(target, { readOnly: true });
118
+ try {
119
+ const eventsByType = db
120
+ .prepare("SELECT event, COUNT(*) AS n FROM trace_events GROUP BY event ORDER BY n DESC, event")
121
+ .all();
122
+ const runsByTier = db
123
+ .prepare("SELECT run_id, COUNT(*) AS events FROM trace_events WHERE run_id <> '' GROUP BY run_id ORDER BY events DESC, run_id")
124
+ .all();
125
+ const frictionByResponsibility = db
126
+ .prepare("SELECT responsibility, COUNT(*) AS n FROM trace_events WHERE event = 'friction' AND responsibility IS NOT NULL GROUP BY responsibility ORDER BY n DESC, responsibility")
127
+ .all();
128
+ const costByModel = db
129
+ .prepare("SELECT COALESCE(model,'') AS model, COUNT(*) AS entries, COALESCE(SUM(tokens),0) AS tokens FROM cost_entries GROUP BY model ORDER BY tokens DESC, model")
130
+ .all();
131
+ return { schemaVersion: userVersion(db), eventsByType, runsByTier, frictionByResponsibility, costByModel };
132
+ }
133
+ finally {
134
+ db.close();
135
+ }
136
+ }
137
+ //# sourceMappingURL=derived-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derived-index.js","sourceRoot":"","sources":["../../src/core/derived-index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import type { CheckResult } from "../commands/validate.js";
2
+ import type { Status } from "../commands/doctor-checks.js";
3
+ /** Canonical taxonomy: 11 vendor-neutral responsibilities + 1 MeowKit-specific. Order is the
4
+ * display order; `core` marks the 11 Runtime-Substrate values vs the kit-specific addition. */
5
+ export declare const TAXONOMY: {
6
+ value: string;
7
+ label: string;
8
+ core: boolean;
9
+ }[];
10
+ export type Coverage = "covered" | "partial" | "missing";
11
+ export interface ResponsibilityRow {
12
+ value: string;
13
+ label: string;
14
+ core: boolean;
15
+ coverage: Coverage;
16
+ count: number;
17
+ active: number;
18
+ examples: string[];
19
+ }
20
+ export interface SubstrateAggregate {
21
+ rows: ResponsibilityRow[];
22
+ /** Artifacts whose responsibility value is not in the taxonomy enum (always a problem). */
23
+ invalid: {
24
+ path: string;
25
+ value: string;
26
+ }[];
27
+ /** Registry-sourced artifacts with no responsibility (a hard gap — registry is the seeded set). */
28
+ untaggedRegistry: string[];
29
+ /** Frontmatter-sourced artifacts (skills/agents) with no responsibility (allowed; tag-on-touch). */
30
+ untaggedFrontmatter: string[];
31
+ totalArtifacts: number;
32
+ }
33
+ /** Load the allowed responsibility values from the schema; fall back to the taxonomy. */
34
+ export declare function loadResponsibilityEnum(claudeDir: string): Set<string>;
35
+ /** Build the responsibility×coverage aggregate from the live inventory. */
36
+ export declare function aggregateSubstrate(claudeDir: string): SubstrateAggregate;
37
+ /** Deterministic markdown view — generated, never hand-edited. Stable ordering keeps the
38
+ * regenerate-and-diff drift check clean. */
39
+ export declare function renderSubstrateView(agg: SubstrateAggregate): string;
40
+ /** Validate substrate tagging + the committed view's freshness. Registry untagged / out-of-enum
41
+ * / stale-view are FAIL; frontmatter untagged is WARN (tag-on-touch, reported not hidden). */
42
+ export declare function checkSubstrate(claudeDir: string, opts?: {
43
+ missingViewSeverity?: Status;
44
+ }): CheckResult[];
45
+ /** Write/refresh the committed view from the live registry. Returns the absolute path. */
46
+ export declare function emitSubstrateView(claudeDir: string): string;
47
+ //# sourceMappingURL=substrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"substrate.d.ts","sourceRoot":"","sources":["../../src/core/substrate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAQ3D;gGACgG;AAChG,eAAO,MAAM,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,EAarE,CAAC;AAIF,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,iBAAiB,EAAE,CAAC;IAC1B,2FAA2F;IAC3F,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,mGAAmG;IACnG,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,oGAAoG;IACpG,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;CACvB;AAED,yFAAyF;AACzF,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAYrE;AAQD,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,kBAAkB,CA8CxE;AAED;6CAC6C;AAC7C,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,kBAAkB,GAAG,MAAM,CAgCnE;AAED;+FAC+F;AAC/F,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,mBAAmB,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,WAAW,EAAE,CAwD5G;AAED,0FAA0F;AAC1F,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAI3D"}
@@ -0,0 +1,183 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { buildInventory } from "./build-inventory.js";
4
+ // The responsibility substrate. Aggregates every harness artifact by the vendor-neutral
5
+ // `responsibility` it serves, so coverage is auditable by responsibility rather than by file.
6
+ // The matrix is GENERATED from the registry/frontmatter on every call — a hand-maintained map
7
+ // would lie about state. A committed view (.claude/harness-substrate.md) is regenerated via
8
+ // `inventory --substrate --emit` and drift-checked by `validate`.
9
+ /** Canonical taxonomy: 11 vendor-neutral responsibilities + 1 MeowKit-specific. Order is the
10
+ * display order; `core` marks the 11 Runtime-Substrate values vs the kit-specific addition. */
11
+ export const TAXONOMY = [
12
+ { value: "task-specification", label: "Task specification", core: true },
13
+ { value: "context-selection", label: "Context selection", core: true },
14
+ { value: "tool-access", label: "Tool access", core: true },
15
+ { value: "project-memory", label: "Project memory", core: true },
16
+ { value: "task-state", label: "Task state", core: true },
17
+ { value: "observability", label: "Observability", core: true },
18
+ { value: "failure-attribution", label: "Failure attribution", core: true },
19
+ { value: "verification", label: "Verification", core: true },
20
+ { value: "permissions", label: "Permissions", core: true },
21
+ { value: "entropy-auditing", label: "Entropy auditing", core: true },
22
+ { value: "intervention-recording", label: "Intervention recording", core: true },
23
+ { value: "gate-enforcement", label: "Gate enforcement", core: false },
24
+ ];
25
+ const VIEW_PATH = "harness-substrate.md";
26
+ /** Load the allowed responsibility values from the schema; fall back to the taxonomy. */
27
+ export function loadResponsibilityEnum(claudeDir) {
28
+ const schemaPath = path.join(claudeDir, "schemas", "harness-metadata-schema.json");
29
+ try {
30
+ const schema = JSON.parse(fs.readFileSync(schemaPath, "utf-8"));
31
+ const en = schema.properties?.responsibility?.enum;
32
+ if (Array.isArray(en) && en.length > 0)
33
+ return new Set(en);
34
+ }
35
+ catch {
36
+ /* fall through */
37
+ }
38
+ return new Set(TAXONOMY.map((t) => t.value));
39
+ }
40
+ function coverageOf(count, active) {
41
+ if (count === 0)
42
+ return "missing";
43
+ if (active === 0)
44
+ return "partial"; // served only by deprecated/experimental artifacts
45
+ return "covered";
46
+ }
47
+ /** Build the responsibility×coverage aggregate from the live inventory. */
48
+ export function aggregateSubstrate(claudeDir) {
49
+ const { entries } = buildInventory(claudeDir);
50
+ const allowed = loadResponsibilityEnum(claudeDir);
51
+ const byResp = new Map();
52
+ const invalid = [];
53
+ const untaggedRegistry = [];
54
+ const untaggedFrontmatter = [];
55
+ for (const e of entries) {
56
+ const r = e.responsibility;
57
+ if (!r) {
58
+ if (e.source === "registry")
59
+ untaggedRegistry.push(e.path);
60
+ else
61
+ untaggedFrontmatter.push(e.path);
62
+ continue;
63
+ }
64
+ if (!allowed.has(r)) {
65
+ invalid.push({ path: e.path, value: r });
66
+ continue;
67
+ }
68
+ const list = byResp.get(r) ?? [];
69
+ list.push(e);
70
+ byResp.set(r, list);
71
+ }
72
+ const rows = TAXONOMY.map((t) => {
73
+ const list = byResp.get(t.value) ?? [];
74
+ const active = list.filter((e) => e.status === "active").length;
75
+ return {
76
+ value: t.value,
77
+ label: t.label,
78
+ core: t.core,
79
+ coverage: coverageOf(list.length, active),
80
+ count: list.length,
81
+ active,
82
+ examples: list.slice(0, 3).map((e) => e.id),
83
+ };
84
+ });
85
+ return {
86
+ rows,
87
+ invalid,
88
+ untaggedRegistry,
89
+ untaggedFrontmatter,
90
+ totalArtifacts: entries.length,
91
+ };
92
+ }
93
+ /** Deterministic markdown view — generated, never hand-edited. Stable ordering keeps the
94
+ * regenerate-and-diff drift check clean. */
95
+ export function renderSubstrateView(agg) {
96
+ const icon = { covered: "✅ covered", partial: "🟡 partial", missing: "⬜ missing" };
97
+ const lines = [];
98
+ lines.push("<!-- GENERATED by `mewkit inventory --substrate --emit` — DO NOT EDIT BY HAND. -->");
99
+ lines.push("<!-- Regenerate after tagging; `mewkit validate` fails if this drifts from the registry. -->");
100
+ lines.push("");
101
+ lines.push("# Harness Responsibility Substrate");
102
+ lines.push("");
103
+ lines.push("Coverage of each vendor-neutral substrate responsibility, generated from the harness registry " +
104
+ "+ artifact frontmatter. Eleven core values are the Runtime-Substrate taxonomy (repo-harness " +
105
+ "synthesis, Runtime-Substrate-rooted); `Gate enforcement` is the MeowKit-specific addition.");
106
+ lines.push("");
107
+ lines.push("| Responsibility | Coverage | Tagged | Active | Examples |");
108
+ lines.push("| -------------- | -------- | -----: | -----: | -------- |");
109
+ for (const r of agg.rows) {
110
+ const label = r.core ? r.label : `${r.label} *(kit)*`;
111
+ lines.push(`| ${label} | ${icon[r.coverage]} | ${r.count} | ${r.active} | ${r.examples.join(", ") || "—"} |`);
112
+ }
113
+ lines.push("");
114
+ const missing = agg.rows.filter((r) => r.coverage === "missing").map((r) => r.label);
115
+ lines.push(`**Coverage:** ${agg.rows.filter((r) => r.coverage === "covered").length}/${agg.rows.length} responsibilities have active artifacts.` +
116
+ (missing.length ? ` Missing: ${missing.join(", ")}.` : ""));
117
+ lines.push(`**Untagged:** ${agg.untaggedRegistry.length} registry + ${agg.untaggedFrontmatter.length} frontmatter ` +
118
+ `artifacts carry no responsibility (frontmatter is tag-on-touch; registry should be 100%).`);
119
+ lines.push("");
120
+ return lines.join("\n");
121
+ }
122
+ /** Validate substrate tagging + the committed view's freshness. Registry untagged / out-of-enum
123
+ * / stale-view are FAIL; frontmatter untagged is WARN (tag-on-touch, reported not hidden). */
124
+ export function checkSubstrate(claudeDir, opts = {}) {
125
+ const section = "Substrate";
126
+ const results = [];
127
+ const agg = aggregateSubstrate(claudeDir);
128
+ for (const inv of agg.invalid) {
129
+ results.push({ name: `Substrate: ${inv.path}`, status: "fail", detail: `responsibility="${inv.value}" not in taxonomy enum`, section });
130
+ }
131
+ for (const p of agg.untaggedRegistry) {
132
+ results.push({ name: `Substrate: ${p}`, status: "fail", detail: "registry artifact has no responsibility (seed it)", section });
133
+ }
134
+ if (agg.untaggedFrontmatter.length > 0) {
135
+ results.push({
136
+ name: "Substrate: untagged frontmatter artifacts",
137
+ status: "warn",
138
+ detail: `${agg.untaggedFrontmatter.length} skill/agent artifact(s) untagged — tag-on-touch (allowed, reported).`,
139
+ section,
140
+ });
141
+ }
142
+ // View freshness: regenerate and diff against the committed file.
143
+ const viewPath = path.join(claudeDir, VIEW_PATH);
144
+ const fresh = renderSubstrateView(agg);
145
+ if (!fs.existsSync(viewPath)) {
146
+ const status = opts.missingViewSeverity ?? "fail";
147
+ results.push({
148
+ name: "Substrate view present",
149
+ status,
150
+ detail: status === "warn"
151
+ ? "No .claude/harness-substrate.md — run `mewkit inventory --substrate --emit`"
152
+ : "Missing .claude/harness-substrate.md (run `mewkit inventory --substrate --emit`)",
153
+ section,
154
+ });
155
+ }
156
+ else {
157
+ const committed = fs.readFileSync(viewPath, "utf-8");
158
+ const inSync = committed.trim() === fresh.trim();
159
+ results.push({
160
+ name: "Substrate view in sync",
161
+ status: inSync ? "pass" : "fail",
162
+ detail: inSync ? viewPath : "harness-substrate.md is stale — run `mewkit inventory --substrate --emit`",
163
+ section,
164
+ });
165
+ }
166
+ const fails = results.filter((r) => r.status === "fail").length;
167
+ results.push({
168
+ name: "Substrate coverage",
169
+ status: fails === 0 ? "pass" : "fail",
170
+ detail: fails === 0
171
+ ? `${agg.totalArtifacts} artifacts; ${agg.rows.filter((r) => r.coverage === "covered").length}/${agg.rows.length} responsibilities covered`
172
+ : `${fails} substrate issue(s)`,
173
+ section,
174
+ });
175
+ return results;
176
+ }
177
+ /** Write/refresh the committed view from the live registry. Returns the absolute path. */
178
+ export function emitSubstrateView(claudeDir) {
179
+ const viewPath = path.join(claudeDir, VIEW_PATH);
180
+ fs.writeFileSync(viewPath, renderSubstrateView(aggregateSubstrate(claudeDir)) + "\n");
181
+ return viewPath;
182
+ }
183
+ //# sourceMappingURL=substrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"substrate.js","sourceRoot":"","sources":["../../src/core/substrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /** One JSONL trace record (shape written by hooks/append-trace.sh; fields are best-effort). */
2
+ export interface TraceRecord {
3
+ schema_version?: string;
4
+ ts?: string;
5
+ event?: string;
6
+ run_id?: string;
7
+ model?: string;
8
+ density?: string;
9
+ data?: Record<string, unknown>;
10
+ }
11
+ export type TraceTier = "minimal" | "standard" | "detailed";
12
+ /** Parse JSONL; skip blank/malformed lines rather than throwing (logs are append-only and
13
+ * may contain a partially-written trailing line). */
14
+ export declare function parseTraceLog(content: string): TraceRecord[];
15
+ export interface ScoreResult {
16
+ tier: TraceTier;
17
+ events: number;
18
+ types: number;
19
+ hasVerification: boolean;
20
+ }
21
+ /** Trace-quality tier for a set of records: richer + more diverse + verified ⇒ higher tier. */
22
+ export declare function scoreTier(records: TraceRecord[]): ScoreResult;
23
+ /** Group records by run_id (a "lane") and score each. Records with no run_id share the
24
+ * synthetic "(unattributed)" lane. */
25
+ export declare function scoreByRun(records: TraceRecord[]): Map<string, ScoreResult>;
26
+ /** Shannon entropy (bits) over the event-type distribution — a disorder measure. */
27
+ export declare function shannonEntropy(records: TraceRecord[]): number;
28
+ /** Normalize a friction message for grouping: lowercase, collapse whitespace, strip wrapping
29
+ * quotes and trailing punctuation. Identical-in-meaning lines collapse to one key. */
30
+ export declare function normalizeFriction(msg: string): string;
31
+ export interface FrictionGroup {
32
+ message: string;
33
+ count: number;
34
+ responsibility?: string;
35
+ }
36
+ /** Group friction records by normalized message, descending by count then message. */
37
+ export declare function groupFriction(records: TraceRecord[]): FrictionGroup[];
38
+ export interface AuditResult {
39
+ total: number;
40
+ orphaned: number;
41
+ stale: number;
42
+ unverifiedRuns: number;
43
+ entropy: number;
44
+ repeatedFriction: FrictionGroup[];
45
+ frictionByResponsibility: Record<string, number>;
46
+ }
47
+ /** Entropy / drift audit. `now` + `staleDays` are injected for determinism. */
48
+ export declare function auditTraces(records: TraceRecord[], opts: {
49
+ now: Date;
50
+ staleDays?: number;
51
+ }): AuditResult;
52
+ export interface ProposalItem {
53
+ kind: "friction" | "drift";
54
+ title: string;
55
+ evidenceCount: number;
56
+ responsibility?: string;
57
+ }
58
+ /** Advisory backlog proposals: repeated friction (≥2) + audit drift findings. Never gates. */
59
+ export declare function proposeImprovements(audit: AuditResult): ProposalItem[];
60
+ //# sourceMappingURL=trace-analysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-analysis.d.ts","sourceRoot":"","sources":["../../src/core/trace-analysis.ts"],"names":[],"mappings":"AAIA,+FAA+F;AAC/F,MAAM,WAAW,WAAW;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;AAK5D;sDACsD;AACtD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,EAAE,CAa5D;AAED,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,OAAO,CAAC;CACzB;AAED,+FAA+F;AAC/F,wBAAgB,SAAS,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,WAAW,CAQ7D;AAED;uCACuC;AACvC,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAW3E;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAc7D;AAED;uFACuF;AACvF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAOrD;AAgBD,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,CAYrE;AAED,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,aAAa,EAAE,CAAC;IAClC,wBAAwB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjD;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE;IAAE,GAAG,EAAE,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,WAAW,CA2CxG;AAED,MAAM,WAAW,YAAY;IAC5B,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,EAAE,CAWtE"}