@dzhechkov/harness-core 0.3.113 → 0.3.115

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/index.d.ts CHANGED
@@ -85,4 +85,5 @@ export * from './safla-delta.js';
85
85
  export * from './architecture.js';
86
86
  export * from './project-skills.js';
87
87
  export * from './rake-analyzer.js';
88
+ export * from './session-retro.js';
88
89
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -51,4 +51,5 @@ export * from './safla-delta.js';
51
51
  export * from './architecture.js';
52
52
  export * from './project-skills.js';
53
53
  export * from './rake-analyzer.js';
54
+ export * from './session-retro.js';
54
55
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,mFAAmF;AACnF,MAAM,CAAC,MAAM,oBAAoB,GAC9B,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAyB,CAAC,OAAO,CAAC;AAErF,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAElH,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC1H,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,SAAS,EAAE,aAAa,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,aAAa,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,aAAa,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,UAAU,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEthB,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAEtK,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,oBAAoB,EACpB,eAAe,EACf,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAyB1B,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAC3H,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEjH,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEhO,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEvN,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEhF,OAAO,EACL,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EACjB,UAAU,EACV,kBAAkB,EAClB,mBAAmB,EACnB,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,WAAW,EACX,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAK7C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,oBAAoB,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAExG,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAElG,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,qBAAqB,EACrB,yBAAyB,EACzB,gCAAgC,EAChC,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAC1B,iCAAiC,EACjC,uBAAuB,EACvB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,+BAA+B,EAC/B,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAW3B,OAAO,EAAE,gBAAgB,EAAE,4BAA4B,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,SAAS,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACxN,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EACL,YAAY,EACZ,UAAU,EACV,cAAc,EACd,SAAS,EACT,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAS3B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EACL,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,cAAc,EACd,QAAQ,GACT,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAkBzE,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,gBAAgB,EAChB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,WAAW,EACX,YAAY,EACZ,eAAe,EACf,UAAU,EACV,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,UAAU,EACV,sBAAsB,EACtB,qBAAqB,EACrB,0BAA0B,EAC1B,kCAAkC,GACnC,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,4BAA4B,EAC5B,sBAAsB,EACtB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC;AAYpB,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Per-session retro & co-learning loop (feature session-retro-colearn, ADR-001).
3
+ *
4
+ * At session end, `dz retro` mines the CURRENT session transcript for recurring PROCESS rakes, drills the
5
+ * user (socratic + checklist), and teaches/reinforces the agent — from the same mistake ("учиться вместе").
6
+ * The recurrence ledger IS the `dz teach` store (domain `retro`), so agent-recall and user-recurrence read
7
+ * ONE store (Step-0 recall: a feedback loop needs collect + rank + apply, not two write-only logs).
8
+ *
9
+ * parse/detect/render are PURE + deterministic (sorted, no clock/random); the stream/find helpers do disk
10
+ * I/O with TOP-LEVEL node:fs (harness-core is ESM — a lazy require() is undefined at runtime; the R1 footgun)
11
+ * and NEVER slurp a whole transcript (they reach ~95 MB — read + split lines, parse line-by-line).
12
+ *
13
+ * SAFETY PROPERTY (ADR-001 §3, load-bearing): a rake seen for the FIRST time (effective count < threshold)
14
+ * is taught silently but NOT drilled — no nagging on a one-off. Drills are for recurrent patterns only.
15
+ */
16
+ export interface SessionEvent {
17
+ readonly kind: 'user' | 'assistant' | 'tool';
18
+ readonly text: string;
19
+ readonly tool?: string;
20
+ readonly file?: string;
21
+ readonly ok?: boolean;
22
+ }
23
+ export interface ProcessSignature {
24
+ readonly id: string;
25
+ readonly label: string;
26
+ readonly socratic: string;
27
+ readonly checklist: string;
28
+ readonly skill?: string;
29
+ }
30
+ export interface ProcessHit {
31
+ readonly signature: string;
32
+ readonly label: string;
33
+ readonly withinSession: number;
34
+ readonly evidence: readonly string[];
35
+ }
36
+ export interface RetroItem {
37
+ readonly hit: ProcessHit;
38
+ readonly ledgerCount: number;
39
+ readonly effective: number;
40
+ readonly status: 'drill' | 'accrue';
41
+ readonly drill?: string;
42
+ }
43
+ export interface Retro {
44
+ readonly items: readonly RetroItem[];
45
+ readonly drilled: number;
46
+ readonly accrued: number;
47
+ readonly totalEvents: number;
48
+ }
49
+ export declare const RETRO_DOMAIN = "retro";
50
+ export declare const DEFAULT_DRILL_THRESHOLD = 2;
51
+ export declare const PROCESS_SIGNATURES: readonly ProcessSignature[];
52
+ /**
53
+ * Detect PROCESS rakes over the event stream. PURE + deterministic. Conservative (high-precision): prefer a
54
+ * miss to a false accusation (a wrong "you claimed done without testing" erodes trust worse than a miss).
55
+ * Returns ONE aggregated hit per signature that fired, `withinSession` = occurrence count.
56
+ */
57
+ export declare function detectProcessRakes(events: readonly SessionEvent[]): ProcessHit[];
58
+ /** The stable store-key lesson for a signature (so teach/reinforce dedups on it and the ledger counts it). */
59
+ export declare function retroLessonText(sig: string): string;
60
+ /** Render the mix drill: a socratic predict-then-reveal prompt, a marker, then the concrete checklist. */
61
+ export declare function renderDrill(sig: ProcessSignature, effective: number): string;
62
+ /**
63
+ * Build the retro. PURE. A hit is DRILLED only when `ledgerCount + withinSession >= threshold` (recurrent);
64
+ * otherwise it ACCRUES (taught silently, no drill) — the load-bearing anti-noise property (ADR-001 §3).
65
+ */
66
+ export declare function buildRetro(hits: readonly ProcessHit[], ledger: ReadonlyMap<string, number>, totalEvents: number, drillThreshold?: number): Retro;
67
+ /** Human render of the retro. Deterministic. */
68
+ export declare function renderRetro(retro: Retro): string;
69
+ /**
70
+ * Parse a Claude Code JSONL transcript into a normalized event stream. Bad/`null`/malformed lines are
71
+ * skipped (never throws — cross-model QE caught a crash on a `null` line and a `[null]` content block).
72
+ * Text blocks WITHIN one message are merged into a SINGLE assistant/user event, so a multi-block turn
73
+ * ("Done." + "Fixed.") counts as ONE claim, not two (else the anti-noise guarantee is defeated).
74
+ */
75
+ export declare function streamSessionEvents(path: string): SessionEvent[];
76
+ /** Find the most recently modified session transcript (roam state, then ~/.claude/projects). Null if none. */
77
+ export declare function findLatestTranscript(repoRoot: string): string | null;
78
+ //# sourceMappingURL=session-retro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-retro.d.ts","sourceRoot":"","sources":["../src/session-retro.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,eAAO,MAAM,YAAY,UAAU,CAAC;AACpC,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,eAAO,MAAM,kBAAkB,EAAE,SAAS,gBAAgB,EA4BzD,CAAC;AA0BF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,UAAU,EAAE,CA8FhF;AAID,8GAA8G;AAC9G,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnD;AAED,0GAA0G;AAC1G,wBAAgB,WAAW,CAAC,GAAG,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ5E;AAED;;;GAGG;AACH,wBAAgB,UAAU,CACxB,IAAI,EAAE,SAAS,UAAU,EAAE,EAC3B,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,WAAW,EAAE,MAAM,EACnB,cAAc,GAAE,MAAgC,GAC/C,KAAK,CAmBP;AAED,gDAAgD;AAChD,wBAAgB,WAAW,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAYhD;AA8BD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAyChE;AAED,8GAA8G;AAC9G,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmBpE"}
@@ -0,0 +1,365 @@
1
+ /**
2
+ * Per-session retro & co-learning loop (feature session-retro-colearn, ADR-001).
3
+ *
4
+ * At session end, `dz retro` mines the CURRENT session transcript for recurring PROCESS rakes, drills the
5
+ * user (socratic + checklist), and teaches/reinforces the agent — from the same mistake ("учиться вместе").
6
+ * The recurrence ledger IS the `dz teach` store (domain `retro`), so agent-recall and user-recurrence read
7
+ * ONE store (Step-0 recall: a feedback loop needs collect + rank + apply, not two write-only logs).
8
+ *
9
+ * parse/detect/render are PURE + deterministic (sorted, no clock/random); the stream/find helpers do disk
10
+ * I/O with TOP-LEVEL node:fs (harness-core is ESM — a lazy require() is undefined at runtime; the R1 footgun)
11
+ * and NEVER slurp a whole transcript (they reach ~95 MB — read + split lines, parse line-by-line).
12
+ *
13
+ * SAFETY PROPERTY (ADR-001 §3, load-bearing): a rake seen for the FIRST time (effective count < threshold)
14
+ * is taught silently but NOT drilled — no nagging on a one-off. Drills are for recurrent patterns only.
15
+ */
16
+ import { existsSync, readFileSync, readdirSync, statSync, openSync, readSync, closeSync } from 'node:fs';
17
+ import { join } from 'node:path';
18
+ import { homedir } from 'node:os';
19
+ export const RETRO_DOMAIN = 'retro';
20
+ export const DEFAULT_DRILL_THRESHOLD = 2;
21
+ export const PROCESS_SIGNATURES = [
22
+ {
23
+ id: 'claimed-done-without-verify',
24
+ label: 'claimed done/fixed without running a verification',
25
+ socratic: 'Before you typed "done" — what exact command would have PROVEN it? Predict it, then check whether you actually ran it.',
26
+ checklist: 'Run the verification (test / build / repro) and READ its output BEFORE claiming done. No completion claim without fresh evidence.',
27
+ skill: 'validate',
28
+ },
29
+ {
30
+ id: 'n-fix-cycles',
31
+ label: 'multiple fix→break→fix cycles on one file (no root cause)',
32
+ socratic: 'After the 2nd failed fix — did you find the ROOT cause, or keep patching symptoms? Predict the real cause before the next change.',
33
+ checklist: 'Stop after 2 failed attempts. Revert, find the root cause (trace the bad value to its source), then ONE fix.',
34
+ skill: 'systematic-debugging',
35
+ },
36
+ {
37
+ id: 'ignored-user-correction',
38
+ label: 'the user had to correct the same point repeatedly',
39
+ socratic: 'When the user said "нет/wrong" the 2nd time — what did you keep assuming? Predict the misread before re-reading their message.',
40
+ checklist: 'On the 2nd correction, STOP and re-read the user\'s messages literally. Restate the ask back before acting.',
41
+ },
42
+ {
43
+ id: 'committed-without-verify',
44
+ label: 'git commit after a code change without running tests/build first',
45
+ socratic: 'Before that `git commit` — did the tests/build actually pass in THIS session, or did you assume? Predict what a fresh run would show.',
46
+ checklist: 'Run the tests/build (and read the output) BEFORE `git commit`. A green commit you did not verify is a guess.',
47
+ skill: 'validate',
48
+ },
49
+ ];
50
+ for (const s of PROCESS_SIGNATURES)
51
+ Object.freeze(s);
52
+ Object.freeze(PROCESS_SIGNATURES);
53
+ const byStr = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
54
+ // NB: `\b` is an ASCII word boundary — it does NOT anchor Cyrillic (the R2 cross-model-QE lesson), so the
55
+ // Russian alternatives use a leading letter-class lookbehind only (no TRAILING lookahead — it would reject
56
+ // inflected stems like "прошли/проходят/исправила"; cross-model QE caught the truncated-stem miss).
57
+ const DONE_RE = /(?<![a-zа-яё])(done|fixed|works now|passes|passing|готово|исправил\w*|работает|прошл\w*|проход\w*)/i;
58
+ const VERIFY_RE = /\b(test|tests|vitest|pytest|jest|npm test|pnpm test|npm run|tsc|typecheck|noEmit|cargo test|go test|build|repro|coverage|lint)\b/i;
59
+ // Negation immediately before a done-claim ("not done", "isn't fixed", "не готово") — suppress the accusation.
60
+ const NEG_RE = /\b(not|isn'?t|aren'?t|wasn'?t|won'?t|can'?t|couldn'?t|didn'?t|no longer)\b|(?<![a-zа-яё])(не|нет|ещё не|еще не)(?![a-zа-яё])/i;
61
+ // Explicit corrections only — dropped bare "again/wrong" (matched "thanks again" / "don't get me wrong").
62
+ const CORRECTION_RE = /(?<![a-zа-яё])(нет,|не так|неверно|не то|переделай)(?![a-zа-яё])|\b(that'?s not right|not right|that'?s wrong|incorrect|redo this|you misread)\b/i;
63
+ const WINDOW = 8;
64
+ // A verification is a real test/build INVOCATION at a command boundary — NOT any Bash text containing
65
+ // "test" (cross-model QE: `echo 'tests not run'` was spoofing it). Used for committed-without-verify.
66
+ const VERIFY_CMD_RE = /(?:^|&&|\|\||;|\|)\s*(?:npm|pnpm|yarn|npx|bun|deno|cargo|go|make)\b[^&|;]*\b(?:test|build|tsc|typecheck|noemit|check|lint|coverage)\b|(?:^|&&|;|\s)(?:vitest|jest|pytest|tsc)\b/i;
67
+ // A code change (not a docs/config-only edit) — a docs commit without a test is not a rake (cross-model QE).
68
+ const CODE_FILE_RE = /\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|rb|c|h|cc|cpp|css|scss|sh|sql|vue|svelte)$/i;
69
+ // A real `git commit` command (allows -C/flags), anchored to a command boundary so `echo 'git commit'`
70
+ // and `git log --grep commit` do NOT count (cross-model QE).
71
+ const GIT_COMMIT_RE = /(?:^|&&|\|\||;|\|)\s*git(?:\s+-[A-Za-z-]+(?:\s+\S+)?)*\s+commit\b/;
72
+ /**
73
+ * Detect PROCESS rakes over the event stream. PURE + deterministic. Conservative (high-precision): prefer a
74
+ * miss to a false accusation (a wrong "you claimed done without testing" erodes trust worse than a miss).
75
+ * Returns ONE aggregated hit per signature that fired, `withinSession` = occurrence count.
76
+ */
77
+ export function detectProcessRakes(events) {
78
+ const counts = new Map();
79
+ const bump = (sig, ev) => {
80
+ const c = counts.get(sig) ?? { n: 0, evidence: [] };
81
+ c.n += 1;
82
+ if (c.evidence.length < 3)
83
+ c.evidence.push(ev.replace(/\s+/g, ' ').trim().slice(0, 120));
84
+ counts.set(sig, c);
85
+ };
86
+ // NB: no `didnt-read-before-edit` signature — the harness ENFORCES read-before-edit (an Edit fails
87
+ // without a prior Read), so a genuine violation is near-impossible; that signal was pure artifact
88
+ // (cross-session / bounded-window reads, 88 false hits on the dogfood) and was dropped after cross-model QE.
89
+ const editsPerFile = new Map();
90
+ const failedAfterEdit = new Set(); // files that had a TEST failure after being edited
91
+ let lastEditedFile;
92
+ let changedSinceCommit = false; // a CODE Edit/Write happened since the last commit
93
+ let verifiedSinceCommit = false; // a test/build ran AFTER the last code change
94
+ const TESTFAIL_RE = /\b(fail(ed|ing|s)?|assertion|assert|expected|not ok|panic|traceback|error ts\d|\d+ failed)\b/i;
95
+ for (let i = 0; i < events.length; i++) {
96
+ const e = events[i];
97
+ // A code change marks the commit cycle dirty AND invalidates any earlier verification (it is now
98
+ // stale — a test that ran BEFORE this edit did not verify it; cross-model QE High).
99
+ if (e.kind === 'tool' && (e.tool === 'Edit' || e.tool === 'Write') && e.file && CODE_FILE_RE.test(e.file)) {
100
+ changedSinceCommit = true;
101
+ verifiedSinceCommit = false;
102
+ }
103
+ if (e.kind === 'tool' && e.tool === 'Edit' && e.file) {
104
+ editsPerFile.set(e.file, (editsPerFile.get(e.file) ?? 0) + 1);
105
+ lastEditedFile = e.file;
106
+ const edits = editsPerFile.get(e.file);
107
+ if (edits >= 3 && failedAfterEdit.has(e.file)) {
108
+ bump('n-fix-cycles', `${edits} edits to ${e.file} with a failing test between`);
109
+ failedAfterEdit.delete(e.file);
110
+ }
111
+ }
112
+ // committed-without-verify: check `git commit` FIRST (so a commit message containing "test" is not
113
+ // mistaken for a verification run), then reset the commit cycle. Only fires when code changed and no
114
+ // test/build ran since the last commit — a real rake the harness does NOT prevent (ties to `validate`).
115
+ if (e.kind === 'tool' && e.tool === 'Bash') {
116
+ const commitM = GIT_COMMIT_RE.exec(e.text);
117
+ if (commitM) {
118
+ // A compound `pnpm test && git commit` verifies IN-LINE before the commit — not a rake (cross-model QE).
119
+ const inlineVerified = VERIFY_CMD_RE.test(e.text.slice(0, commitM.index));
120
+ if (changedSinceCommit && !verifiedSinceCommit && !inlineVerified)
121
+ bump('committed-without-verify', e.text.slice(0, 100));
122
+ changedSinceCommit = false;
123
+ verifiedSinceCommit = false;
124
+ }
125
+ else if (VERIFY_CMD_RE.test(e.text)) {
126
+ verifiedSinceCommit = true;
127
+ }
128
+ }
129
+ // Only a TEST/BUILD failure (not a generic Read error) arms the most-recently-edited file, so an
130
+ // UNRELATED failure no longer globally triggers a fix-cycle (cross-model QE High).
131
+ if (e.kind === 'tool' && e.ok === false && lastEditedFile !== undefined && TESTFAIL_RE.test(e.text))
132
+ failedAfterEdit.add(lastEditedFile);
133
+ // claimed-done-without-verify: a done-claim that (a) FOLLOWS a code change in the window AND (b) has NO
134
+ // verification tool in the window. The change-in-window gate cuts prose "done"/"tests pass" that made
135
+ // no edit (measured over-firing on the dogfood — NFR-2 conservative).
136
+ if (e.kind === 'assistant') {
137
+ const m = DONE_RE.exec(e.text);
138
+ if (m) {
139
+ const before = e.text.slice(Math.max(0, m.index - 30), m.index);
140
+ const negated = NEG_RE.test(before) || NEG_RE.test(e.text.slice(m.index, m.index + 6));
141
+ if (!negated) {
142
+ let verified = false, changed = false;
143
+ for (let j = Math.max(0, i - WINDOW); j < i; j++) {
144
+ const p = events[j];
145
+ if (p.kind !== 'tool')
146
+ continue;
147
+ if (VERIFY_RE.test(`${p.tool ?? ''} ${p.text}`))
148
+ verified = true;
149
+ if (p.tool === 'Edit' || p.tool === 'Write')
150
+ changed = true;
151
+ }
152
+ if (changed && !verified)
153
+ bump('claimed-done-without-verify', e.text.slice(0, 120));
154
+ }
155
+ }
156
+ }
157
+ // ignored-user-correction: 2nd+ correction within a short window of user turns.
158
+ if (e.kind === 'user' && CORRECTION_RE.test(e.text)) {
159
+ let priorCorrections = 0;
160
+ for (let j = Math.max(0, i - WINDOW * 2); j < i; j++) {
161
+ const p = events[j];
162
+ if (p.kind === 'user' && CORRECTION_RE.test(p.text))
163
+ priorCorrections++;
164
+ }
165
+ if (priorCorrections >= 1)
166
+ bump('ignored-user-correction', e.text);
167
+ }
168
+ }
169
+ const hits = [];
170
+ for (const sig of PROCESS_SIGNATURES) {
171
+ const c = counts.get(sig.id);
172
+ if (c)
173
+ hits.push({ signature: sig.id, label: sig.label, withinSession: c.n, evidence: c.evidence });
174
+ }
175
+ return hits.sort((a, b) => b.withinSession - a.withinSession || byStr(a.signature, b.signature));
176
+ }
177
+ const sigById = (id) => PROCESS_SIGNATURES.find((s) => s.id === id);
178
+ /** The stable store-key lesson for a signature (so teach/reinforce dedups on it and the ledger counts it). */
179
+ export function retroLessonText(sig) {
180
+ const s = sigById(sig);
181
+ return `Process rake [${sig}]: ${s ? s.label : sig}. ${s?.checklist ?? ''}`.trim();
182
+ }
183
+ /** Render the mix drill: a socratic predict-then-reveal prompt, a marker, then the concrete checklist. */
184
+ export function renderDrill(sig, effective) {
185
+ const skill = sig.skill ? ` (see the \`${sig.skill}\` skill)` : '';
186
+ return [
187
+ ` 🔁 ${sig.label} — ${effective}× (recurring)`,
188
+ ` ${sig.socratic}`,
189
+ ` --- reveal (cover this, predict first) ---`,
190
+ ` ✅ ${sig.checklist}${skill}`,
191
+ ].join('\n');
192
+ }
193
+ /**
194
+ * Build the retro. PURE. A hit is DRILLED only when `ledgerCount + withinSession >= threshold` (recurrent);
195
+ * otherwise it ACCRUES (taught silently, no drill) — the load-bearing anti-noise property (ADR-001 §3).
196
+ */
197
+ export function buildRetro(hits, ledger, totalEvents, drillThreshold = DEFAULT_DRILL_THRESHOLD) {
198
+ const items = hits.map((hit) => {
199
+ const ledgerCount = ledger.get(hit.signature) ?? 0;
200
+ const effective = ledgerCount + hit.withinSession;
201
+ if (effective >= drillThreshold) {
202
+ const sig = sigById(hit.signature);
203
+ const drill = sig ? renderDrill(sig, effective) : undefined;
204
+ return drill !== undefined
205
+ ? { hit, ledgerCount, effective, status: 'drill', drill }
206
+ : { hit, ledgerCount, effective, status: 'drill' };
207
+ }
208
+ return { hit, ledgerCount, effective, status: 'accrue' };
209
+ });
210
+ return {
211
+ items,
212
+ drilled: items.filter((i) => i.status === 'drill').length,
213
+ accrued: items.filter((i) => i.status === 'accrue').length,
214
+ totalEvents,
215
+ };
216
+ }
217
+ /** Human render of the retro. Deterministic. */
218
+ export function renderRetro(retro) {
219
+ if (retro.items.length === 0)
220
+ return `retro: no process rakes detected in ${retro.totalEvents} event(s). Clean session.`;
221
+ const lines = [`retro: ${retro.drilled} recurring rake(s) to drill, ${retro.accrued} accruing (from ${retro.totalEvents} events):`, ''];
222
+ for (const it of retro.items) {
223
+ if (it.status === 'drill' && it.drill) {
224
+ lines.push(it.drill);
225
+ lines.push('');
226
+ }
227
+ }
228
+ const accruing = retro.items.filter((i) => i.status === 'accrue');
229
+ if (accruing.length > 0) {
230
+ lines.push(' accruing (first time — taught, not drilled yet):');
231
+ for (const it of accruing)
232
+ lines.push(` · ${it.hit.label} (×${it.hit.withinSession} this session)`);
233
+ }
234
+ return lines.join('\n');
235
+ }
236
+ /** Cap the read at the last N bytes for very large transcripts (a retro is about the RECENT session), so
237
+ * memory stays bounded rather than slurping a multi-hundred-MB file whole (cross-model QE). */
238
+ const MAX_READ_BYTES = 48 * 1024 * 1024;
239
+ function readBounded(path) {
240
+ let size = 0;
241
+ try {
242
+ size = statSync(path).size;
243
+ }
244
+ catch {
245
+ return '';
246
+ }
247
+ if (size <= MAX_READ_BYTES) {
248
+ try {
249
+ return readFileSync(path, 'utf8');
250
+ }
251
+ catch {
252
+ return '';
253
+ }
254
+ }
255
+ // Read only the tail; drop the first (partial) line.
256
+ const fd = openSync(path, 'r');
257
+ try {
258
+ const buf = Buffer.allocUnsafe(MAX_READ_BYTES);
259
+ const bytes = readSync(fd, buf, 0, MAX_READ_BYTES, size - MAX_READ_BYTES);
260
+ const tail = buf.toString('utf8', 0, bytes);
261
+ const nl = tail.indexOf('\n');
262
+ return nl >= 0 ? tail.slice(nl + 1) : tail;
263
+ }
264
+ catch {
265
+ return '';
266
+ }
267
+ finally {
268
+ closeSync(fd);
269
+ }
270
+ }
271
+ const isObj = (x) => x !== null && typeof x === 'object';
272
+ /**
273
+ * Parse a Claude Code JSONL transcript into a normalized event stream. Bad/`null`/malformed lines are
274
+ * skipped (never throws — cross-model QE caught a crash on a `null` line and a `[null]` content block).
275
+ * Text blocks WITHIN one message are merged into a SINGLE assistant/user event, so a multi-block turn
276
+ * ("Done." + "Fixed.") counts as ONE claim, not two (else the anti-noise guarantee is defeated).
277
+ */
278
+ export function streamSessionEvents(path) {
279
+ const out = [];
280
+ const raw = readBounded(path);
281
+ if (raw === '')
282
+ return out;
283
+ for (const line of raw.split('\n')) {
284
+ const t = line.trim();
285
+ if (t === '')
286
+ continue;
287
+ let obj;
288
+ try {
289
+ obj = JSON.parse(t);
290
+ }
291
+ catch {
292
+ continue;
293
+ }
294
+ if (!isObj(obj))
295
+ continue;
296
+ const msg = obj.message;
297
+ if (!isObj(msg))
298
+ continue;
299
+ const role = typeof msg.role === 'string' ? msg.role : '';
300
+ const content = msg.content;
301
+ if (typeof content === 'string') {
302
+ if (content.trim() !== '')
303
+ out.push({ kind: role === 'assistant' ? 'assistant' : 'user', text: content });
304
+ continue;
305
+ }
306
+ if (!Array.isArray(content))
307
+ continue;
308
+ const textParts = [];
309
+ for (const b of content) {
310
+ if (!isObj(b))
311
+ continue; // guard a `[null]` block (cross-model QE)
312
+ if (b.type === 'text' && typeof b.text === 'string') {
313
+ textParts.push(b.text);
314
+ }
315
+ else if (b.type === 'tool_use') {
316
+ const input = isObj(b.input) ? b.input : undefined;
317
+ const file = input?.file_path ?? input?.path;
318
+ const name = typeof b.name === 'string' ? b.name : undefined;
319
+ // Capture the Bash COMMAND as the event text so a real verification (`pnpm tsc`, `npm test`) is
320
+ // visible — dropping it made the "done without verify" check blind (cross-model QE).
321
+ const text = (name === 'Bash' && typeof input?.command === 'string') ? input.command : (name ?? '');
322
+ out.push({ kind: 'tool', text, ...(name ? { tool: name } : {}), ...(file ? { file } : {}) });
323
+ }
324
+ else if (b.type === 'tool_result') {
325
+ const c = b.content;
326
+ const text = typeof c === 'string' ? c : JSON.stringify(c ?? '');
327
+ out.push({ kind: 'tool', text: text.slice(0, 2000), ok: b.is_error !== true });
328
+ }
329
+ }
330
+ if (textParts.length > 0)
331
+ out.push({ kind: role === 'assistant' ? 'assistant' : 'user', text: textParts.join('\n') });
332
+ }
333
+ return out;
334
+ }
335
+ /** Find the most recently modified session transcript (roam state, then ~/.claude/projects). Null if none. */
336
+ export function findLatestTranscript(repoRoot) {
337
+ let best = null;
338
+ const consider = (p) => {
339
+ try {
340
+ const st = statSync(p);
341
+ // tie-break on path so equal mtimes are deterministic (cross-model QE).
342
+ if (st.isFile() && (best === null || st.mtimeMs > best.mtime || (st.mtimeMs === best.mtime && p < best.path)))
343
+ best = { path: p, mtime: st.mtimeMs };
344
+ }
345
+ catch { /* skip */ }
346
+ };
347
+ const scanDir = (dir) => {
348
+ try {
349
+ if (existsSync(dir))
350
+ for (const e of readdirSync(dir))
351
+ if (e.endsWith('.jsonl'))
352
+ consider(join(dir, e));
353
+ }
354
+ catch { /* ignore */ }
355
+ };
356
+ scanDir(join(repoRoot, 'roam', 'claude-state'));
357
+ // ~/.claude/projects/<encoded-repoRoot>/<uuid>.jsonl (the contract's second source).
358
+ try {
359
+ const enc = repoRoot.replace(/\//g, '-');
360
+ scanDir(join(homedir(), '.claude', 'projects', enc));
361
+ }
362
+ catch { /* ignore */ }
363
+ return best === null ? null : best.path;
364
+ }
365
+ //# sourceMappingURL=session-retro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-retro.js","sourceRoot":"","sources":["../src/session-retro.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dzhechkov/harness-core",
3
- "version": "0.3.113",
3
+ "version": "0.3.115",
4
4
  "description": "Shared harness logic - skill loading, additive apply, and the init/sync/verify/doctor operations.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -30,13 +30,13 @@
30
30
  "@dzhechkov/adapter-openclaude": "^0.1.0",
31
31
  "@dzhechkov/adapter-opencode": "^0.2.0",
32
32
  "yaml": "^2.0.0",
33
- "@dzhechkov/adapter-agents-md": "0.1.1",
34
33
  "@dzhechkov/adapter-copilot": "0.1.1",
34
+ "@dzhechkov/adapter-cursor": "0.1.1",
35
+ "@dzhechkov/adapter-agents-md": "0.1.1",
35
36
  "@dzhechkov/adapter-gemini": "0.1.1",
36
37
  "@dzhechkov/adapter-windsurf": "0.1.1",
37
38
  "@dzhechkov/core": "0.2.14",
38
- "@dzhechkov/memory": "0.2.9",
39
- "@dzhechkov/adapter-cursor": "0.1.1"
39
+ "@dzhechkov/memory": "0.2.9"
40
40
  },
41
41
  "peerDependenciesMeta": {
42
42
  "@ruvector/rvf": {
package/src/index.ts CHANGED
@@ -266,3 +266,4 @@ export * from './safla-delta.js';
266
266
  export * from './architecture.js';
267
267
  export * from './project-skills.js';
268
268
  export * from './rake-analyzer.js';
269
+ export * from './session-retro.js';
@@ -0,0 +1,378 @@
1
+ /**
2
+ * Per-session retro & co-learning loop (feature session-retro-colearn, ADR-001).
3
+ *
4
+ * At session end, `dz retro` mines the CURRENT session transcript for recurring PROCESS rakes, drills the
5
+ * user (socratic + checklist), and teaches/reinforces the agent — from the same mistake ("учиться вместе").
6
+ * The recurrence ledger IS the `dz teach` store (domain `retro`), so agent-recall and user-recurrence read
7
+ * ONE store (Step-0 recall: a feedback loop needs collect + rank + apply, not two write-only logs).
8
+ *
9
+ * parse/detect/render are PURE + deterministic (sorted, no clock/random); the stream/find helpers do disk
10
+ * I/O with TOP-LEVEL node:fs (harness-core is ESM — a lazy require() is undefined at runtime; the R1 footgun)
11
+ * and NEVER slurp a whole transcript (they reach ~95 MB — read + split lines, parse line-by-line).
12
+ *
13
+ * SAFETY PROPERTY (ADR-001 §3, load-bearing): a rake seen for the FIRST time (effective count < threshold)
14
+ * is taught silently but NOT drilled — no nagging on a one-off. Drills are for recurrent patterns only.
15
+ */
16
+
17
+ import { existsSync, readFileSync, readdirSync, statSync, openSync, readSync, closeSync } from 'node:fs';
18
+ import { join } from 'node:path';
19
+ import { homedir } from 'node:os';
20
+
21
+ export interface SessionEvent {
22
+ readonly kind: 'user' | 'assistant' | 'tool';
23
+ readonly text: string;
24
+ readonly tool?: string; // tool_use name (Read/Edit/Write/Bash) for a call
25
+ readonly file?: string; // file path arg for a Read/Edit/Write
26
+ readonly ok?: boolean; // for a tool RESULT: false ⇒ error/failure
27
+ }
28
+
29
+ export interface ProcessSignature {
30
+ readonly id: string;
31
+ readonly label: string;
32
+ readonly socratic: string; // the "predict first" prompt
33
+ readonly checklist: string; // the reveal
34
+ readonly skill?: string; // a shipped skill that addresses it
35
+ }
36
+
37
+ export interface ProcessHit {
38
+ readonly signature: string;
39
+ readonly label: string;
40
+ readonly withinSession: number; // occurrences in THIS session
41
+ readonly evidence: readonly string[];
42
+ }
43
+
44
+ export interface RetroItem {
45
+ readonly hit: ProcessHit;
46
+ readonly ledgerCount: number; // prior-session occurrences from the store
47
+ readonly effective: number; // ledgerCount + withinSession
48
+ readonly status: 'drill' | 'accrue';
49
+ readonly drill?: string;
50
+ }
51
+
52
+ export interface Retro {
53
+ readonly items: readonly RetroItem[];
54
+ readonly drilled: number;
55
+ readonly accrued: number;
56
+ readonly totalEvents: number;
57
+ }
58
+
59
+ export const RETRO_DOMAIN = 'retro';
60
+ export const DEFAULT_DRILL_THRESHOLD = 2;
61
+
62
+ export const PROCESS_SIGNATURES: readonly ProcessSignature[] = [
63
+ {
64
+ id: 'claimed-done-without-verify',
65
+ label: 'claimed done/fixed without running a verification',
66
+ socratic: 'Before you typed "done" — what exact command would have PROVEN it? Predict it, then check whether you actually ran it.',
67
+ checklist: 'Run the verification (test / build / repro) and READ its output BEFORE claiming done. No completion claim without fresh evidence.',
68
+ skill: 'validate',
69
+ },
70
+ {
71
+ id: 'n-fix-cycles',
72
+ label: 'multiple fix→break→fix cycles on one file (no root cause)',
73
+ socratic: 'After the 2nd failed fix — did you find the ROOT cause, or keep patching symptoms? Predict the real cause before the next change.',
74
+ checklist: 'Stop after 2 failed attempts. Revert, find the root cause (trace the bad value to its source), then ONE fix.',
75
+ skill: 'systematic-debugging',
76
+ },
77
+ {
78
+ id: 'ignored-user-correction',
79
+ label: 'the user had to correct the same point repeatedly',
80
+ socratic: 'When the user said "нет/wrong" the 2nd time — what did you keep assuming? Predict the misread before re-reading their message.',
81
+ checklist: 'On the 2nd correction, STOP and re-read the user\'s messages literally. Restate the ask back before acting.',
82
+ },
83
+ {
84
+ id: 'committed-without-verify',
85
+ label: 'git commit after a code change without running tests/build first',
86
+ socratic: 'Before that `git commit` — did the tests/build actually pass in THIS session, or did you assume? Predict what a fresh run would show.',
87
+ checklist: 'Run the tests/build (and read the output) BEFORE `git commit`. A green commit you did not verify is a guess.',
88
+ skill: 'validate',
89
+ },
90
+ ];
91
+ for (const s of PROCESS_SIGNATURES) Object.freeze(s);
92
+ Object.freeze(PROCESS_SIGNATURES);
93
+
94
+ const byStr = (a: string, b: string): number => (a < b ? -1 : a > b ? 1 : 0);
95
+
96
+ // NB: `\b` is an ASCII word boundary — it does NOT anchor Cyrillic (the R2 cross-model-QE lesson), so the
97
+ // Russian alternatives use a leading letter-class lookbehind only (no TRAILING lookahead — it would reject
98
+ // inflected stems like "прошли/проходят/исправила"; cross-model QE caught the truncated-stem miss).
99
+ const DONE_RE = /(?<![a-zа-яё])(done|fixed|works now|passes|passing|готово|исправил\w*|работает|прошл\w*|проход\w*)/i;
100
+ const VERIFY_RE = /\b(test|tests|vitest|pytest|jest|npm test|pnpm test|npm run|tsc|typecheck|noEmit|cargo test|go test|build|repro|coverage|lint)\b/i;
101
+ // Negation immediately before a done-claim ("not done", "isn't fixed", "не готово") — suppress the accusation.
102
+ const NEG_RE = /\b(not|isn'?t|aren'?t|wasn'?t|won'?t|can'?t|couldn'?t|didn'?t|no longer)\b|(?<![a-zа-яё])(не|нет|ещё не|еще не)(?![a-zа-яё])/i;
103
+ // Explicit corrections only — dropped bare "again/wrong" (matched "thanks again" / "don't get me wrong").
104
+ const CORRECTION_RE = /(?<![a-zа-яё])(нет,|не так|неверно|не то|переделай)(?![a-zа-яё])|\b(that'?s not right|not right|that'?s wrong|incorrect|redo this|you misread)\b/i;
105
+ const WINDOW = 8;
106
+
107
+ // A verification is a real test/build INVOCATION at a command boundary — NOT any Bash text containing
108
+ // "test" (cross-model QE: `echo 'tests not run'` was spoofing it). Used for committed-without-verify.
109
+ const VERIFY_CMD_RE = /(?:^|&&|\|\||;|\|)\s*(?:npm|pnpm|yarn|npx|bun|deno|cargo|go|make)\b[^&|;]*\b(?:test|build|tsc|typecheck|noemit|check|lint|coverage)\b|(?:^|&&|;|\s)(?:vitest|jest|pytest|tsc)\b/i;
110
+ // A code change (not a docs/config-only edit) — a docs commit without a test is not a rake (cross-model QE).
111
+ const CODE_FILE_RE = /\.(ts|tsx|js|jsx|mjs|cjs|py|go|rs|java|rb|c|h|cc|cpp|css|scss|sh|sql|vue|svelte)$/i;
112
+ // A real `git commit` command (allows -C/flags), anchored to a command boundary so `echo 'git commit'`
113
+ // and `git log --grep commit` do NOT count (cross-model QE).
114
+ const GIT_COMMIT_RE = /(?:^|&&|\|\||;|\|)\s*git(?:\s+-[A-Za-z-]+(?:\s+\S+)?)*\s+commit\b/;
115
+
116
+ /**
117
+ * Detect PROCESS rakes over the event stream. PURE + deterministic. Conservative (high-precision): prefer a
118
+ * miss to a false accusation (a wrong "you claimed done without testing" erodes trust worse than a miss).
119
+ * Returns ONE aggregated hit per signature that fired, `withinSession` = occurrence count.
120
+ */
121
+ export function detectProcessRakes(events: readonly SessionEvent[]): ProcessHit[] {
122
+ const counts = new Map<string, { n: number; evidence: string[] }>();
123
+ const bump = (sig: string, ev: string): void => {
124
+ const c = counts.get(sig) ?? { n: 0, evidence: [] };
125
+ c.n += 1;
126
+ if (c.evidence.length < 3) c.evidence.push(ev.replace(/\s+/g, ' ').trim().slice(0, 120));
127
+ counts.set(sig, c);
128
+ };
129
+
130
+ // NB: no `didnt-read-before-edit` signature — the harness ENFORCES read-before-edit (an Edit fails
131
+ // without a prior Read), so a genuine violation is near-impossible; that signal was pure artifact
132
+ // (cross-session / bounded-window reads, 88 false hits on the dogfood) and was dropped after cross-model QE.
133
+ const editsPerFile = new Map<string, number>();
134
+ const failedAfterEdit = new Set<string>(); // files that had a TEST failure after being edited
135
+ let lastEditedFile: string | undefined;
136
+ let changedSinceCommit = false; // a CODE Edit/Write happened since the last commit
137
+ let verifiedSinceCommit = false; // a test/build ran AFTER the last code change
138
+ const TESTFAIL_RE = /\b(fail(ed|ing|s)?|assertion|assert|expected|not ok|panic|traceback|error ts\d|\d+ failed)\b/i;
139
+
140
+ for (let i = 0; i < events.length; i++) {
141
+ const e = events[i]!;
142
+
143
+ // A code change marks the commit cycle dirty AND invalidates any earlier verification (it is now
144
+ // stale — a test that ran BEFORE this edit did not verify it; cross-model QE High).
145
+ if (e.kind === 'tool' && (e.tool === 'Edit' || e.tool === 'Write') && e.file && CODE_FILE_RE.test(e.file)) {
146
+ changedSinceCommit = true;
147
+ verifiedSinceCommit = false;
148
+ }
149
+
150
+ if (e.kind === 'tool' && e.tool === 'Edit' && e.file) {
151
+ editsPerFile.set(e.file, (editsPerFile.get(e.file) ?? 0) + 1);
152
+ lastEditedFile = e.file;
153
+ const edits = editsPerFile.get(e.file)!;
154
+ if (edits >= 3 && failedAfterEdit.has(e.file)) { bump('n-fix-cycles', `${edits} edits to ${e.file} with a failing test between`); failedAfterEdit.delete(e.file); }
155
+ }
156
+
157
+ // committed-without-verify: check `git commit` FIRST (so a commit message containing "test" is not
158
+ // mistaken for a verification run), then reset the commit cycle. Only fires when code changed and no
159
+ // test/build ran since the last commit — a real rake the harness does NOT prevent (ties to `validate`).
160
+ if (e.kind === 'tool' && e.tool === 'Bash') {
161
+ const commitM = GIT_COMMIT_RE.exec(e.text);
162
+ if (commitM) {
163
+ // A compound `pnpm test && git commit` verifies IN-LINE before the commit — not a rake (cross-model QE).
164
+ const inlineVerified = VERIFY_CMD_RE.test(e.text.slice(0, commitM.index));
165
+ if (changedSinceCommit && !verifiedSinceCommit && !inlineVerified) bump('committed-without-verify', e.text.slice(0, 100));
166
+ changedSinceCommit = false;
167
+ verifiedSinceCommit = false;
168
+ } else if (VERIFY_CMD_RE.test(e.text)) {
169
+ verifiedSinceCommit = true;
170
+ }
171
+ }
172
+
173
+ // Only a TEST/BUILD failure (not a generic Read error) arms the most-recently-edited file, so an
174
+ // UNRELATED failure no longer globally triggers a fix-cycle (cross-model QE High).
175
+ if (e.kind === 'tool' && e.ok === false && lastEditedFile !== undefined && TESTFAIL_RE.test(e.text)) failedAfterEdit.add(lastEditedFile);
176
+
177
+ // claimed-done-without-verify: a done-claim that (a) FOLLOWS a code change in the window AND (b) has NO
178
+ // verification tool in the window. The change-in-window gate cuts prose "done"/"tests pass" that made
179
+ // no edit (measured over-firing on the dogfood — NFR-2 conservative).
180
+ if (e.kind === 'assistant') {
181
+ const m = DONE_RE.exec(e.text);
182
+ if (m) {
183
+ const before = e.text.slice(Math.max(0, m.index - 30), m.index);
184
+ const negated = NEG_RE.test(before) || NEG_RE.test(e.text.slice(m.index, m.index + 6));
185
+ if (!negated) {
186
+ let verified = false, changed = false;
187
+ for (let j = Math.max(0, i - WINDOW); j < i; j++) {
188
+ const p = events[j]!;
189
+ if (p.kind !== 'tool') continue;
190
+ if (VERIFY_RE.test(`${p.tool ?? ''} ${p.text}`)) verified = true;
191
+ if (p.tool === 'Edit' || p.tool === 'Write') changed = true;
192
+ }
193
+ if (changed && !verified) bump('claimed-done-without-verify', e.text.slice(0, 120));
194
+ }
195
+ }
196
+ }
197
+
198
+ // ignored-user-correction: 2nd+ correction within a short window of user turns.
199
+ if (e.kind === 'user' && CORRECTION_RE.test(e.text)) {
200
+ let priorCorrections = 0;
201
+ for (let j = Math.max(0, i - WINDOW * 2); j < i; j++) {
202
+ const p = events[j]!;
203
+ if (p.kind === 'user' && CORRECTION_RE.test(p.text)) priorCorrections++;
204
+ }
205
+ if (priorCorrections >= 1) bump('ignored-user-correction', e.text);
206
+ }
207
+ }
208
+
209
+ const hits: ProcessHit[] = [];
210
+ for (const sig of PROCESS_SIGNATURES) {
211
+ const c = counts.get(sig.id);
212
+ if (c) hits.push({ signature: sig.id, label: sig.label, withinSession: c.n, evidence: c.evidence });
213
+ }
214
+ return hits.sort((a, b) => b.withinSession - a.withinSession || byStr(a.signature, b.signature));
215
+ }
216
+
217
+ const sigById = (id: string): ProcessSignature | undefined => PROCESS_SIGNATURES.find((s) => s.id === id);
218
+
219
+ /** The stable store-key lesson for a signature (so teach/reinforce dedups on it and the ledger counts it). */
220
+ export function retroLessonText(sig: string): string {
221
+ const s = sigById(sig);
222
+ return `Process rake [${sig}]: ${s ? s.label : sig}. ${s?.checklist ?? ''}`.trim();
223
+ }
224
+
225
+ /** Render the mix drill: a socratic predict-then-reveal prompt, a marker, then the concrete checklist. */
226
+ export function renderDrill(sig: ProcessSignature, effective: number): string {
227
+ const skill = sig.skill ? ` (see the \`${sig.skill}\` skill)` : '';
228
+ return [
229
+ ` 🔁 ${sig.label} — ${effective}× (recurring)`,
230
+ ` ${sig.socratic}`,
231
+ ` --- reveal (cover this, predict first) ---`,
232
+ ` ✅ ${sig.checklist}${skill}`,
233
+ ].join('\n');
234
+ }
235
+
236
+ /**
237
+ * Build the retro. PURE. A hit is DRILLED only when `ledgerCount + withinSession >= threshold` (recurrent);
238
+ * otherwise it ACCRUES (taught silently, no drill) — the load-bearing anti-noise property (ADR-001 §3).
239
+ */
240
+ export function buildRetro(
241
+ hits: readonly ProcessHit[],
242
+ ledger: ReadonlyMap<string, number>,
243
+ totalEvents: number,
244
+ drillThreshold: number = DEFAULT_DRILL_THRESHOLD,
245
+ ): Retro {
246
+ const items: RetroItem[] = hits.map((hit) => {
247
+ const ledgerCount = ledger.get(hit.signature) ?? 0;
248
+ const effective = ledgerCount + hit.withinSession;
249
+ if (effective >= drillThreshold) {
250
+ const sig = sigById(hit.signature);
251
+ const drill = sig ? renderDrill(sig, effective) : undefined;
252
+ return drill !== undefined
253
+ ? { hit, ledgerCount, effective, status: 'drill' as const, drill }
254
+ : { hit, ledgerCount, effective, status: 'drill' as const };
255
+ }
256
+ return { hit, ledgerCount, effective, status: 'accrue' as const };
257
+ });
258
+ return {
259
+ items,
260
+ drilled: items.filter((i) => i.status === 'drill').length,
261
+ accrued: items.filter((i) => i.status === 'accrue').length,
262
+ totalEvents,
263
+ };
264
+ }
265
+
266
+ /** Human render of the retro. Deterministic. */
267
+ export function renderRetro(retro: Retro): string {
268
+ if (retro.items.length === 0) return `retro: no process rakes detected in ${retro.totalEvents} event(s). Clean session.`;
269
+ const lines = [`retro: ${retro.drilled} recurring rake(s) to drill, ${retro.accrued} accruing (from ${retro.totalEvents} events):`, ''];
270
+ for (const it of retro.items) {
271
+ if (it.status === 'drill' && it.drill) { lines.push(it.drill); lines.push(''); }
272
+ }
273
+ const accruing = retro.items.filter((i) => i.status === 'accrue');
274
+ if (accruing.length > 0) {
275
+ lines.push(' accruing (first time — taught, not drilled yet):');
276
+ for (const it of accruing) lines.push(` · ${it.hit.label} (×${it.hit.withinSession} this session)`);
277
+ }
278
+ return lines.join('\n');
279
+ }
280
+
281
+ // ── Streaming I/O (top-level fs; never throws; NEVER slurps into structured memory beyond the line split) ──
282
+
283
+ interface RawContentBlock { type?: string; text?: string; name?: string; input?: { file_path?: string; path?: string; command?: string }; content?: unknown; is_error?: boolean }
284
+ interface RawLine { type?: string; message?: { role?: string; content?: RawContentBlock[] | string } }
285
+
286
+ /** Cap the read at the last N bytes for very large transcripts (a retro is about the RECENT session), so
287
+ * memory stays bounded rather than slurping a multi-hundred-MB file whole (cross-model QE). */
288
+ const MAX_READ_BYTES = 48 * 1024 * 1024;
289
+
290
+ function readBounded(path: string): string {
291
+ let size = 0;
292
+ try { size = statSync(path).size; } catch { return ''; }
293
+ if (size <= MAX_READ_BYTES) {
294
+ try { return readFileSync(path, 'utf8'); } catch { return ''; }
295
+ }
296
+ // Read only the tail; drop the first (partial) line.
297
+ const fd = openSync(path, 'r');
298
+ try {
299
+ const buf = Buffer.allocUnsafe(MAX_READ_BYTES);
300
+ const bytes = readSync(fd, buf, 0, MAX_READ_BYTES, size - MAX_READ_BYTES);
301
+ const tail = buf.toString('utf8', 0, bytes);
302
+ const nl = tail.indexOf('\n');
303
+ return nl >= 0 ? tail.slice(nl + 1) : tail;
304
+ } catch { return ''; } finally { closeSync(fd); }
305
+ }
306
+
307
+ const isObj = (x: unknown): x is Record<string, unknown> => x !== null && typeof x === 'object';
308
+
309
+ /**
310
+ * Parse a Claude Code JSONL transcript into a normalized event stream. Bad/`null`/malformed lines are
311
+ * skipped (never throws — cross-model QE caught a crash on a `null` line and a `[null]` content block).
312
+ * Text blocks WITHIN one message are merged into a SINGLE assistant/user event, so a multi-block turn
313
+ * ("Done." + "Fixed.") counts as ONE claim, not two (else the anti-noise guarantee is defeated).
314
+ */
315
+ export function streamSessionEvents(path: string): SessionEvent[] {
316
+ const out: SessionEvent[] = [];
317
+ const raw = readBounded(path);
318
+ if (raw === '') return out;
319
+ for (const line of raw.split('\n')) {
320
+ const t = line.trim();
321
+ if (t === '') continue;
322
+ let obj: unknown;
323
+ try { obj = JSON.parse(t); } catch { continue; }
324
+ if (!isObj(obj)) continue;
325
+ const msg = (obj as RawLine).message;
326
+ if (!isObj(msg)) continue;
327
+ const role = typeof msg.role === 'string' ? msg.role : '';
328
+ const content = (msg as { content?: RawContentBlock[] | string }).content;
329
+ if (typeof content === 'string') {
330
+ if (content.trim() !== '') out.push({ kind: role === 'assistant' ? 'assistant' : 'user', text: content });
331
+ continue;
332
+ }
333
+ if (!Array.isArray(content)) continue;
334
+ const textParts: string[] = [];
335
+ for (const b of content) {
336
+ if (!isObj(b)) continue; // guard a `[null]` block (cross-model QE)
337
+ if (b.type === 'text' && typeof b.text === 'string') {
338
+ textParts.push(b.text);
339
+ } else if (b.type === 'tool_use') {
340
+ const input = isObj(b.input) ? (b.input as { file_path?: string; path?: string; command?: string }) : undefined;
341
+ const file = input?.file_path ?? input?.path;
342
+ const name = typeof b.name === 'string' ? b.name : undefined;
343
+ // Capture the Bash COMMAND as the event text so a real verification (`pnpm tsc`, `npm test`) is
344
+ // visible — dropping it made the "done without verify" check blind (cross-model QE).
345
+ const text = (name === 'Bash' && typeof input?.command === 'string') ? input.command : (name ?? '');
346
+ out.push({ kind: 'tool', text, ...(name ? { tool: name } : {}), ...(file ? { file } : {}) });
347
+ } else if (b.type === 'tool_result') {
348
+ const c = b.content;
349
+ const text = typeof c === 'string' ? c : JSON.stringify(c ?? '');
350
+ out.push({ kind: 'tool', text: text.slice(0, 2000), ok: b.is_error !== true });
351
+ }
352
+ }
353
+ if (textParts.length > 0) out.push({ kind: role === 'assistant' ? 'assistant' : 'user', text: textParts.join('\n') });
354
+ }
355
+ return out;
356
+ }
357
+
358
+ /** Find the most recently modified session transcript (roam state, then ~/.claude/projects). Null if none. */
359
+ export function findLatestTranscript(repoRoot: string): string | null {
360
+ let best: { path: string; mtime: number } | null = null;
361
+ const consider = (p: string): void => {
362
+ try {
363
+ const st = statSync(p);
364
+ // tie-break on path so equal mtimes are deterministic (cross-model QE).
365
+ if (st.isFile() && (best === null || st.mtimeMs > best.mtime || (st.mtimeMs === best.mtime && p < best.path))) best = { path: p, mtime: st.mtimeMs };
366
+ } catch { /* skip */ }
367
+ };
368
+ const scanDir = (dir: string): void => {
369
+ try { if (existsSync(dir)) for (const e of readdirSync(dir)) if (e.endsWith('.jsonl')) consider(join(dir, e)); } catch { /* ignore */ }
370
+ };
371
+ scanDir(join(repoRoot, 'roam', 'claude-state'));
372
+ // ~/.claude/projects/<encoded-repoRoot>/<uuid>.jsonl (the contract's second source).
373
+ try {
374
+ const enc = repoRoot.replace(/\//g, '-');
375
+ scanDir(join(homedir(), '.claude', 'projects', enc));
376
+ } catch { /* ignore */ }
377
+ return best === null ? null : (best as { path: string }).path;
378
+ }