agent-recall-core 3.4.21 → 3.4.23

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 (64) hide show
  1. package/dist/helpers/handoff.d.ts +26 -0
  2. package/dist/helpers/handoff.d.ts.map +1 -0
  3. package/dist/helpers/handoff.js +225 -0
  4. package/dist/helpers/handoff.js.map +1 -0
  5. package/dist/helpers/journal-files.d.ts +23 -0
  6. package/dist/helpers/journal-files.d.ts.map +1 -1
  7. package/dist/helpers/journal-files.js +99 -0
  8. package/dist/helpers/journal-files.js.map +1 -1
  9. package/dist/index.d.ts +8 -6
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +6 -4
  12. package/dist/index.js.map +1 -1
  13. package/dist/palace/index-manager.d.ts.map +1 -1
  14. package/dist/palace/index-manager.js +33 -28
  15. package/dist/palace/index-manager.js.map +1 -1
  16. package/dist/palace/insights-index.d.ts +31 -1
  17. package/dist/palace/insights-index.d.ts.map +1 -1
  18. package/dist/palace/insights-index.js +100 -30
  19. package/dist/palace/insights-index.js.map +1 -1
  20. package/dist/palace/rooms.d.ts +21 -3
  21. package/dist/palace/rooms.d.ts.map +1 -1
  22. package/dist/palace/rooms.js +74 -10
  23. package/dist/palace/rooms.js.map +1 -1
  24. package/dist/storage/corrections.d.ts +51 -1
  25. package/dist/storage/corrections.d.ts.map +1 -1
  26. package/dist/storage/corrections.js +111 -0
  27. package/dist/storage/corrections.js.map +1 -1
  28. package/dist/tools-logic/check.d.ts +6 -0
  29. package/dist/tools-logic/check.d.ts.map +1 -1
  30. package/dist/tools-logic/check.js +10 -1
  31. package/dist/tools-logic/check.js.map +1 -1
  32. package/dist/tools-logic/dashboard-export.d.ts +6 -0
  33. package/dist/tools-logic/dashboard-export.d.ts.map +1 -1
  34. package/dist/tools-logic/dashboard-export.js +3 -0
  35. package/dist/tools-logic/dashboard-export.js.map +1 -1
  36. package/dist/tools-logic/palace-write.d.ts.map +1 -1
  37. package/dist/tools-logic/palace-write.js +9 -2
  38. package/dist/tools-logic/palace-write.js.map +1 -1
  39. package/dist/tools-logic/project-status.d.ts.map +1 -1
  40. package/dist/tools-logic/project-status.js +30 -0
  41. package/dist/tools-logic/project-status.js.map +1 -1
  42. package/dist/tools-logic/recall-backend.d.ts +7 -2
  43. package/dist/tools-logic/recall-backend.d.ts.map +1 -1
  44. package/dist/tools-logic/recall-backend.js +36 -2
  45. package/dist/tools-logic/recall-backend.js.map +1 -1
  46. package/dist/tools-logic/session-end.d.ts +6 -0
  47. package/dist/tools-logic/session-end.d.ts.map +1 -1
  48. package/dist/tools-logic/session-end.js +88 -2
  49. package/dist/tools-logic/session-end.js.map +1 -1
  50. package/dist/tools-logic/session-start.d.ts +21 -0
  51. package/dist/tools-logic/session-start.d.ts.map +1 -1
  52. package/dist/tools-logic/session-start.js +151 -15
  53. package/dist/tools-logic/session-start.js.map +1 -1
  54. package/dist/tools-logic/smart-recall.d.ts +6 -0
  55. package/dist/tools-logic/smart-recall.d.ts.map +1 -1
  56. package/dist/tools-logic/smart-recall.js +51 -10
  57. package/dist/tools-logic/smart-recall.js.map +1 -1
  58. package/dist/types.d.ts +1 -1
  59. package/dist/types.js +1 -1
  60. package/dist/vector/embedding.d.ts +1 -1
  61. package/dist/vector/embedding.d.ts.map +1 -1
  62. package/dist/vector/embedding.js +5 -2
  63. package/dist/vector/embedding.js.map +1 -1
  64. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"recall-backend.d.ts","sourceRoot":"","sources":["../../src/tools-logic/recall-backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAI/D;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACpC,SAAS,IAAI,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IACtD,SAAS,IAAI,OAAO;IAId,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,EAAE,CAAC;CAOpC;AASD;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CA8B/D;AAED,mDAAmD;AACnD,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC"}
1
+ {"version":3,"file":"recall-backend.d.ts","sourceRoot":"","sources":["../../src/tools-logic/recall-backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAI/D;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,CACJ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACpC,SAAS,IAAI,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,aAAa;IACtD,SAAS,IAAI,OAAO;IAId,MAAM,CACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,qBAAqB,EAAE,CAAC;CAOpC;AAgBD,gFAAgF;AAChF,wBAAgB,mBAAmB,IAAI,OAAO,CAW7C;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AASD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAmC/D;AAED,uEAAuE;AACvE,wBAAgB,kBAAkB,IAAI,IAAI,CAIzC"}
@@ -18,17 +18,49 @@ export class LocalRecallBackend {
18
18
  }
19
19
  }
20
20
  // ---------------------------------------------------------------------------
21
+ // Circuit breaker
22
+ // ---------------------------------------------------------------------------
23
+ /**
24
+ * Module-level consecutive failure counter for the remote (Supabase) backend.
25
+ * After BREAKER_THRESHOLD failures in a row the breaker trips and
26
+ * getRecallBackend() returns the local backend for the rest of the process.
27
+ * Logged once to stderr so operators can see it; reset with resetRecallBackend().
28
+ */
29
+ const BREAKER_THRESHOLD = 2;
30
+ let _consecutiveRemoteFailures = 0;
31
+ let _breakerTripped = false;
32
+ /** Record a remote search failure. Returns true if the breaker just tripped. */
33
+ export function recordRemoteFailure() {
34
+ _consecutiveRemoteFailures += 1;
35
+ if (!_breakerTripped && _consecutiveRemoteFailures >= BREAKER_THRESHOLD) {
36
+ _breakerTripped = true;
37
+ process.stderr.write("[agent-recall] recall circuit breaker tripped: remote backend failed " +
38
+ `${_consecutiveRemoteFailures}x in a row — using local backend for this process\n`);
39
+ return true;
40
+ }
41
+ return false;
42
+ }
43
+ /** Record a successful remote search (resets the consecutive counter). */
44
+ export function recordRemoteSuccess() {
45
+ _consecutiveRemoteFailures = 0;
46
+ }
47
+ // ---------------------------------------------------------------------------
21
48
  // Backend factory
22
49
  // ---------------------------------------------------------------------------
23
50
  /** Cached backend instance. Reset via resetRecallBackend() in tests. */
24
51
  let _cachedBackend = null;
25
52
  /**
26
53
  * Get the configured RecallBackend.
27
- * Returns SupabaseRecallBackend if configured and reachable, else Local.
54
+ * Returns SupabaseRecallBackend if configured, available, and circuit not tripped.
55
+ * Falls back to LocalVectorRecallBackend or LocalRecallBackend otherwise.
28
56
  * The function is async because the SupabaseRecallBackend module is loaded
29
57
  * via dynamic import (avoids pulling Supabase client when not configured).
30
58
  */
31
59
  export async function getRecallBackend() {
60
+ // If the breaker is tripped, always return local immediately.
61
+ if (_breakerTripped) {
62
+ return new LocalRecallBackend();
63
+ }
32
64
  if (_cachedBackend)
33
65
  return _cachedBackend;
34
66
  try {
@@ -58,8 +90,10 @@ export async function getRecallBackend() {
58
90
  _cachedBackend = new LocalRecallBackend();
59
91
  return _cachedBackend;
60
92
  }
61
- /** Reset cached backend instance (for testing). */
93
+ /** Reset cached backend instance and circuit breaker (for testing). */
62
94
  export function resetRecallBackend() {
63
95
  _cachedBackend = null;
96
+ _consecutiveRemoteFailures = 0;
97
+ _breakerTripped = false;
64
98
  }
65
99
  //# sourceMappingURL=recall-backend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"recall-backend.js","sourceRoot":"","sources":["../../src/tools-logic/recall-backend.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAgB7E;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IAC7B,SAAS;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAAa,EACb,OAA2B,EAC3B,KAAa;QAEb,8CAA8C;QAC9C,2DAA2D;QAC3D,8DAA8D;QAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAQ,CAAC;QACrD,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAqC,CAAC;IAC1F,CAAC;CACF;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,wEAAwE;AACxE,IAAI,cAAc,GAAyB,IAAI,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACpC,IAAI,MAAM,EAAE,CAAC;YACX,wEAAwE;YACxE,wEAAwE;YACxE,iDAAiD;YACjD,8DAA8D;YAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,+BAAsC,CAAQ,CAAC;YACxE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAkB,CAAC;YACvE,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxB,cAAc,GAAG,OAAO,CAAC;gBACzB,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;IAED,6EAA6E;IAC7E,MAAM,aAAa,GAAG,IAAI,wBAAwB,EAAE,CAAC;IACrD,IAAI,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC;QAC9B,cAAc,GAAG,aAAa,CAAC;QAC/B,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,cAAc,GAAG,IAAI,kBAAkB,EAAE,CAAC;IAC1C,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,kBAAkB;IAChC,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"recall-backend.js","sourceRoot":"","sources":["../../src/tools-logic/recall-backend.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAgB7E;;;;GAIG;AACH,MAAM,OAAO,kBAAkB;IAC7B,SAAS;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CACV,KAAa,EACb,OAA2B,EAC3B,KAAa;QAEb,8CAA8C;QAC9C,2DAA2D;QAC3D,8DAA8D;QAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAQ,CAAC;QACrD,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAqC,CAAC;IAC1F,CAAC;CACF;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,IAAI,0BAA0B,GAAG,CAAC,CAAC;AACnC,IAAI,eAAe,GAAG,KAAK,CAAC;AAE5B,gFAAgF;AAChF,MAAM,UAAU,mBAAmB;IACjC,0BAA0B,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,eAAe,IAAI,0BAA0B,IAAI,iBAAiB,EAAE,CAAC;QACxE,eAAe,GAAG,IAAI,CAAC;QACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,uEAAuE;YACvE,GAAG,0BAA0B,qDAAqD,CACnF,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB;IACjC,0BAA0B,GAAG,CAAC,CAAC;AACjC,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,wEAAwE;AACxE,IAAI,cAAc,GAAyB,IAAI,CAAC;AAEhD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,8DAA8D;IAC9D,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,IAAI,kBAAkB,EAAE,CAAC;IAClC,CAAC;IAED,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACpC,IAAI,MAAM,EAAE,CAAC;YACX,wEAAwE;YACxE,wEAAwE;YACxE,iDAAiD;YACjD,8DAA8D;YAC9D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,+BAAsC,CAAQ,CAAC;YACxE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAkB,CAAC;YACvE,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;gBACxB,cAAc,GAAG,OAAO,CAAC;gBACzB,OAAO,OAAO,CAAC;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,gEAAgE;IAClE,CAAC;IAED,6EAA6E;IAC7E,MAAM,aAAa,GAAG,IAAI,wBAAwB,EAAE,CAAC;IACrD,IAAI,aAAa,CAAC,SAAS,EAAE,EAAE,CAAC;QAC9B,cAAc,GAAG,aAAa,CAAC;QAC/B,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,cAAc,GAAG,IAAI,kBAAkB,EAAE,CAAC;IAC1C,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,kBAAkB;IAChC,cAAc,GAAG,IAAI,CAAC;IACtB,0BAA0B,GAAG,CAAC,CAAC;IAC/B,eAAe,GAAG,KAAK,CAAC;AAC1B,CAAC"}
@@ -64,6 +64,10 @@ export interface SessionEndResult {
64
64
  journal_written: boolean;
65
65
  journal_write_error?: string;
66
66
  insights_processed: number;
67
+ /** New insights added to the index (no prior match found). */
68
+ insights_added: number;
69
+ /** Existing insights confirmed (near-duplicate title matched, count++). */
70
+ insights_confirmed: number;
67
71
  awareness_updated: boolean;
68
72
  awareness_error?: string;
69
73
  palace_consolidated: boolean;
@@ -73,6 +77,8 @@ export interface SessionEndResult {
73
77
  quality_warnings?: InsightQualityWarning[];
74
78
  pipeline_closed?: PipelinePhaseAction;
75
79
  pipeline_opened?: PipelinePhaseAction;
80
+ /** Path to the handoff artifact written at session_end. Present on success. */
81
+ handoff_path?: string;
76
82
  }
77
83
  export declare function checkInsightQuality(insights: SessionEndInput["insights"]): InsightQualityWarning[];
78
84
  export declare function sessionEnd(input: SessionEndInput): Promise<SessionEndResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"session-end.d.ts","sourceRoot":"","sources":["../../src/tools-logic/session-end.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAIjF,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,EAAE,CAAC;QACvB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,OAAO,CAAC;KAC/C,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,eAAe,CAAC;IACtB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB;;;OAGG;IACH,WAAW,CAAC,EAAE;QACZ,aAAa,EAAE,MAAM,CAAC;QACtB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;QAC5C,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3B,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;KAC7B,CAAC;IACF;;;OAGG;IACH,UAAU,CAAC,EAAE;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,eAAe,EAAE,CAAC;IACtC,gBAAgB,CAAC,EAAE,qBAAqB,EAAE,CAAC;IAC3C,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,GACpC,qBAAqB,EAAE,CA6CzB;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA0QlF"}
1
+ {"version":3,"file":"session-end.d.ts","sourceRoot":"","sources":["../../src/tools-logic/session-end.ts"],"names":[],"mappings":"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"}
@@ -8,8 +8,10 @@ import * as path from "node:path";
8
8
  import { journalWrite } from "./journal-write.js";
9
9
  import { awarenessUpdate } from "./awareness-update.js";
10
10
  import { promoteConfirmedInsights } from "./insight-promotion.js";
11
+ import { readInsightsIndex, findSimilarInsight } from "../palace/insights-index.js";
11
12
  import { consolidateJournalToPalace } from "../palace/consolidate.js";
12
13
  import { resolveProject } from "../storage/project.js";
14
+ import { readCorrections, recordOutcome } from "../storage/corrections.js";
13
15
  import { ensurePalaceInitialized, listRooms } from "../palace/rooms.js";
14
16
  import { journalDir } from "../storage/paths.js";
15
17
  import { readAwarenessState } from "../palace/awareness.js";
@@ -19,6 +21,7 @@ import { extractKeywords } from "../helpers/auto-name.js";
19
21
  import { autoClassifySig, autoClassifyTheme } from "../helpers/journal-sig-theme.js";
20
22
  import { pipelineOpen } from "./pipeline-open.js";
21
23
  import { pipelineClose } from "./pipeline-close.js";
24
+ import { writeHandoff } from "../helpers/handoff.js";
22
25
  export function checkInsightQuality(insights) {
23
26
  if (!insights || insights.length === 0)
24
27
  return [];
@@ -59,6 +62,8 @@ export async function sessionEnd(input) {
59
62
  success: false,
60
63
  journal_written: false,
61
64
  insights_processed: 0,
65
+ insights_added: 0,
66
+ insights_confirmed: 0,
62
67
  awareness_updated: false,
63
68
  palace_consolidated: false,
64
69
  card: "Summary too short (minimum 10 characters). Nothing saved.",
@@ -69,6 +74,8 @@ export async function sessionEnd(input) {
69
74
  let journalWritten = false;
70
75
  let journalWriteError;
71
76
  let insightsProcessed = 0;
77
+ let insightsAdded = 0;
78
+ let insightsConfirmed = 0;
72
79
  let awarenessUpdated = false;
73
80
  let awarenessError;
74
81
  let palaceConsolidated = false;
@@ -108,9 +115,71 @@ export async function sessionEnd(input) {
108
115
  catch (err) {
109
116
  journalWriteError = err instanceof Error ? err.message : String(err);
110
117
  }
111
- // 2. Update awareness with insights
118
+ // 1b. P0-B: auto-record heeded/recurred outcomes for corrections that were
119
+ // retrieved today (last_retrieved date matches today). This is a default-heeded
120
+ // heuristic with recurrence detection — coarse but closes the learning loop
121
+ // automatically without requiring the agent to remember to call recordOutcome.
122
+ //
123
+ // Heuristic v1: classify "recurred" only when the session summary contains
124
+ // ≥ 2 content words from the correction rule (length ≥ 4, lowercased) AND
125
+ // also contains a recurrence marker. Default to "heeded" when markers absent.
126
+ // Precision improves when check_action wiring lands in a future sprint.
127
+ //
128
+ // Fire-and-forget: outcome tracking must NEVER affect the session_end result.
129
+ if (journalWritten) {
130
+ try {
131
+ // Local-TZ date matching (see session-start.ts guard comment).
132
+ const todayStr = new Date().toLocaleDateString("sv");
133
+ const nowISO = new Date().toISOString();
134
+ const todays = readCorrections(slug).filter((c) => c.last_retrieved && new Date(c.last_retrieved).toLocaleDateString("sv") === todayStr && c.active !== false);
135
+ const recurrenceMarker = /\b(again|recurred|repeated|violat|broke the rule|same mistake)\b/i;
136
+ const summaryLower = input.summary.toLowerCase();
137
+ for (const c of todays) {
138
+ try {
139
+ // Extract content words (≥ 4 chars) from the rule text
140
+ const ruleWords = c.rule
141
+ .toLowerCase()
142
+ .split(/\W+/)
143
+ .filter((w) => w.length >= 4);
144
+ const matchCount = ruleWords.filter((w) => summaryLower.includes(w)).length;
145
+ const hasRecurrenceMarker = recurrenceMarker.test(input.summary);
146
+ const violated = matchCount >= 2 && hasRecurrenceMarker;
147
+ recordOutcome({
148
+ correction_id: c.id,
149
+ project: slug,
150
+ kind: violated ? "recurred" : "heeded",
151
+ at: nowISO,
152
+ evidence: violated
153
+ ? "recurrence markers in session summary"
154
+ : "no recurrence evidence in session summary",
155
+ });
156
+ }
157
+ catch {
158
+ // Per-correction errors are swallowed — don't abort the loop
159
+ }
160
+ }
161
+ }
162
+ catch {
163
+ // Outcome tracking must NEVER break session_end — swallow all errors
164
+ }
165
+ }
166
+ // 2. Update awareness with insights — confirm-first classification
167
+ // Pre-classify each insight against the current index BEFORE passing to
168
+ // awarenessUpdate. This ensures the count tallies are accurate even if
169
+ // awarenessUpdate itself also performs its own similarity check.
112
170
  if (input.insights && input.insights.length > 0) {
113
171
  try {
172
+ // Read the current index once for confirm-first classification
173
+ const currentIndex = readInsightsIndex();
174
+ for (const insight of input.insights) {
175
+ const match = findSimilarInsight(insight.title, currentIndex.insights);
176
+ if (match) {
177
+ insightsConfirmed++;
178
+ }
179
+ else {
180
+ insightsAdded++;
181
+ }
182
+ }
114
183
  const scopedTrajectory = input.trajectory
115
184
  ? `${slug}: ${input.trajectory}`
116
185
  : undefined;
@@ -131,6 +200,9 @@ export async function sessionEnd(input) {
131
200
  }
132
201
  catch (err) {
133
202
  awarenessError = err instanceof Error ? err.message : String(err);
203
+ // Reset tallies on error so they don't misreport
204
+ insightsAdded = 0;
205
+ insightsConfirmed = 0;
134
206
  }
135
207
  }
136
208
  // 3. Consolidate journal to palace
@@ -221,7 +293,7 @@ export async function sessionEnd(input) {
221
293
  ` Journal ${jDir.replace(root, "~/.agent-recall")}/`,
222
294
  ` └─ ${date}.md ${journalWritten ? "[written]" : journalWriteError ? `[FAILED: ${journalWriteError}]` : "[skipped]"}`,
223
295
  "",
224
- ` Awareness ${insightsProcessed} insight${insightsProcessed !== 1 ? "s" : ""} added (${totalInsights} total)`,
296
+ ` Awareness ${insightsAdded} added, ${insightsConfirmed} confirmed (${totalInsights} total)`,
225
297
  ...(awarenessError ? [` [WARN: awareness update failed: ${awarenessError}]`] : []),
226
298
  ...(palaceError ? [` [WARN: palace consolidation failed: ${palaceError}]`] : []),
227
299
  "",
@@ -281,11 +353,24 @@ export async function sessionEnd(input) {
281
353
  ? { ok: true, order: r.order, phase: r.phase, file_path: r.file_path }
282
354
  : { ok: false, error: r.error };
283
355
  }
356
+ // WS-5: Auto-write cross-agent handoff artifact — fire-and-forget.
357
+ // Only fires when the journal was successfully written (meaningful session).
358
+ // Never affects result or throws to caller.
359
+ let handoffPath;
360
+ if (journalWritten) {
361
+ try {
362
+ const h = writeHandoff(slug);
363
+ handoffPath = h.path;
364
+ }
365
+ catch { /* swallow — handoff is best-effort */ }
366
+ }
284
367
  return {
285
368
  success: journalWritten || awarenessUpdated,
286
369
  journal_written: journalWritten,
287
370
  ...(journalWriteError ? { journal_write_error: journalWriteError } : {}),
288
371
  insights_processed: insightsProcessed,
372
+ insights_added: insightsAdded,
373
+ insights_confirmed: insightsConfirmed,
289
374
  awareness_updated: awarenessUpdated,
290
375
  ...(awarenessError ? { awareness_error: awarenessError } : {}),
291
376
  palace_consolidated: palaceConsolidated,
@@ -295,6 +380,7 @@ export async function sessionEnd(input) {
295
380
  quality_warnings: qualityWarnings.length > 0 ? qualityWarnings : undefined,
296
381
  ...(pipelineClosed ? { pipeline_closed: pipelineClosed } : {}),
297
382
  ...(pipelineOpened ? { pipeline_opened: pipelineOpened } : {}),
383
+ ...(handoffPath ? { handoff_path: handoffPath } : {}),
298
384
  };
299
385
  }
300
386
  //# sourceMappingURL=session-end.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-end.js","sourceRoot":"","sources":["../../src/tools-logic/session-end.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-end.js","sourceRoot":"","sources":["../../src/tools-logic/session-end.ts"],"names":[],"mappings":"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"}
@@ -39,6 +39,16 @@ export interface SessionStartResult {
39
39
  yesterday: string | null;
40
40
  older_count: number;
41
41
  };
42
+ /**
43
+ * Capture-log entries written by `journal_capture` that have NOT yet been
44
+ * committed via `session_end`. Surfaced so the agent sees in-flight work
45
+ * instead of "No memory found". Empty array when there are none.
46
+ */
47
+ recent_captures: Array<{
48
+ date: string;
49
+ question: string;
50
+ answer: string;
51
+ }>;
42
52
  watch_for: WatchForPattern[];
43
53
  corrections: CorrectionRecord[];
44
54
  resume: {
@@ -70,6 +80,17 @@ export interface SessionStartResult {
70
80
  closed_count: number;
71
81
  last_synthesis: string | null;
72
82
  } | null;
83
+ /**
84
+ * North-star alignment metric — correction precision (heeded/retrieved).
85
+ * Null when the project has zero retrieval outcome data (no fake claims).
86
+ * Populated automatically once corrections have been surfaced and outcomes recorded.
87
+ */
88
+ alignment: {
89
+ precision: number;
90
+ retrieved: number;
91
+ heeded: number;
92
+ recurred: number;
93
+ } | null;
73
94
  empty_state?: string;
74
95
  }
75
96
  export declare function sessionStart(input: SessionStartInput): Promise<SessionStartResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/tools-logic/session-start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EAAsE,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAC5I,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AASrF,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAA0C,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAU5G,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxF,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpI,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjF,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,IAAI,CAAC;IACT;;;;OAIG;IACH,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B;;;;OAIG;IACH,YAAY,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,uBAAuB,EAAE,MAAM,CAAC;QAChC,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,GAAG,IAAI,CAAC;IACT,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAqOxF"}
1
+ {"version":3,"file":"session-start.d.ts","sourceRoot":"","sources":["../../src/tools-logic/session-start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EAAsE,KAAK,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAC5I,OAAO,EAAuD,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAUvH,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAA0C,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AA4B5G,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxF,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACpI,aAAa,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjF,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF;;;;OAIG;IACH,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3E,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC;KACxB,GAAG,IAAI,CAAC;IACT;;;;OAIG;IACH,cAAc,EAAE,YAAY,EAAE,CAAC;IAC/B;;;;OAIG;IACH,YAAY,EAAE,WAAW,GAAG,IAAI,CAAC;IACjC;;;OAGG;IACH,QAAQ,EAAE;QACR,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;QACnC,uBAAuB,EAAE,MAAM,CAAC;QAChC,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,GAAG,IAAI,CAAC;IACT;;;;OAIG;IACH,SAAS,EAAE;QACT,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;KAClB,GAAG,IAAI,CAAC;IACT,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4VxF"}
@@ -6,17 +6,18 @@
6
6
  */
7
7
  import { resolveProject } from "../storage/project.js";
8
8
  import { resetOwnedFiles } from "../storage/session.js";
9
- import { ensurePalaceInitialized, listRooms, isRoomStale } from "../palace/rooms.js";
9
+ import { ensurePalaceInitialized, listRooms, isRoomStale, countRoomEntries } from "../palace/rooms.js";
10
10
  import { readIdentity } from "../palace/identity.js";
11
11
  import { readAwarenessState, fetchDashboardArchivedTitles } from "../palace/awareness.js";
12
- import { recallInsights } from "../palace/insights-index.js";
12
+ import { recallInsights, readInsightsIndex } from "../palace/insights-index.js";
13
13
  import { journalDirs } from "../storage/paths.js";
14
14
  import { extractSection } from "../helpers/sections.js";
15
15
  import { todayISO } from "../storage/fs-utils.js";
16
16
  import { readAlignmentLog, extractWatchPatterns, computeDecisionCalibration } from "../helpers/alignment-patterns.js";
17
- import { readP0Corrections } from "../storage/corrections.js";
17
+ import { readP0Corrections, recordOutcome, getCorrectionKPIs } from "../storage/corrections.js";
18
18
  import { extractKeywords } from "../helpers/auto-name.js";
19
19
  import { isJournalFile } from "../helpers/journal-filter.js";
20
+ import { hasCaptureLogs, readRecentCaptures } from "../helpers/journal-files.js";
20
21
  import * as fs from "node:fs";
21
22
  import * as path from "node:path";
22
23
  import { getRoot } from "../types.js";
@@ -33,6 +34,23 @@ function sliceAtWord(text, maxLen) {
33
34
  const lastSpace = sliced.lastIndexOf(" ");
34
35
  return lastSpace > maxLen * 0.6 ? sliced.slice(0, lastSpace) : sliced;
35
36
  }
37
+ /**
38
+ * Strip markdown ATX headers from a journal fragment before embedding it into
39
+ * a card field. `extractSection(content, "next")` returns the section heading
40
+ * line ("## Next") followed by the body, so a naive embed leaks
41
+ * "Trajectory: ## Next…" into the card. We drop entire heading lines
42
+ * (`^#+\s.*`) rather than just the `#` markers — otherwise "## Next" collapses
43
+ * to a stray "Next" line in front of the real content. Blank lines are then
44
+ * collapsed and the result trimmed.
45
+ */
46
+ function stripMarkdownHeaders(text) {
47
+ return text
48
+ .split("\n")
49
+ .filter((line) => !/^\s*#+\s/.test(line))
50
+ .join("\n")
51
+ .replace(/\n{2,}/g, "\n")
52
+ .trim();
53
+ }
36
54
  export async function sessionStart(input) {
37
55
  // Reset owned-files state from any previous session in the same process
38
56
  resetOwnedFiles();
@@ -65,10 +83,12 @@ export async function sessionStart(input) {
65
83
  // Tiebreak: most recently confirmed first
66
84
  return (b.lastConfirmed ?? "").localeCompare(a.lastConfirmed ?? "");
67
85
  });
68
- // Filter out insights archived via the dashboard (Supabase sync-back)
69
- const archivedTitles = await fetchDashboardArchivedTitles();
70
- if (archivedTitles.length > 0) {
71
- sortedInsights = sortedInsights.filter(i => !archivedTitles.includes(i.title));
86
+ // Filter out insights archived via the dashboard (Supabase sync-back).
87
+ // Case-insensitive match dedup elsewhere normalizes to lowercase, so the
88
+ // archive filter must too (else "Bug Fix" fails to suppress "bug fix").
89
+ const archivedLower = new Set((await fetchDashboardArchivedTitles()).map((t) => t.toLowerCase()));
90
+ if (archivedLower.size > 0) {
91
+ sortedInsights = sortedInsights.filter(i => !archivedLower.has(i.title.toLowerCase()));
72
92
  }
73
93
  // Cap startup noise: top 3 awareness insights (was 8). Anything below the
74
94
  // top 3 by salience pollutes more than it informs at session-start. Agents
@@ -79,8 +99,49 @@ export async function sessionStart(input) {
79
99
  severity: i.severity ?? "important",
80
100
  trend: i.trend,
81
101
  }));
102
+ // 2b. P0-3 — guarantee a session-1 insight is visible at session-2.
103
+ // Confirmation count must control ORDER/verbosity, never EXISTENCE. The
104
+ // global awareness `topInsights` only receives an index insight once
105
+ // `promoteConfirmedInsights` fires (confirmed_count >= 3), so a brand-new
106
+ // single-confirmation insight stored by session_end can be absent from
107
+ // `topInsights` while living in the project-scoped insights-index. Surface
108
+ // those directly so they appear from confirmation count 1.
109
+ const index = readInsightsIndex();
110
+ const projectIndexInsights = index.insights
111
+ .filter((i) => (i.projects ?? []).includes(slug))
112
+ .filter((i) => !archivedLower.has(i.title.toLowerCase()))
113
+ .sort((a, b) => b.confirmed_count - a.confirmed_count || (b.last_confirmed ?? "").localeCompare(a.last_confirmed ?? ""));
114
+ // RESERVED SLOTS: project-scoped index insights get their own budget (up to 2)
115
+ // ON TOP of the awareness top-3. If we shared one cap, an established project
116
+ // whose global awareness already has 3+ insights would never surface a fresh
117
+ // session-1 insight — the cap would be full before this loop ran. P0-3 requires
118
+ // existence, not just ordering, so the budget must be independent.
119
+ const seenTitles = new Set(insights.map((i) => i.title.toLowerCase()));
120
+ const PROJECT_INSIGHT_BUDGET = 2;
121
+ let projectAdded = 0;
122
+ for (const idx of projectIndexInsights) {
123
+ if (projectAdded >= PROJECT_INSIGHT_BUDGET)
124
+ break;
125
+ if (seenTitles.has(idx.title.toLowerCase()))
126
+ continue;
127
+ insights.push({
128
+ title: sliceAtWord(idx.title, 200),
129
+ confirmed: idx.confirmed_count ?? 1,
130
+ severity: idx.severity ?? "important",
131
+ trend: undefined,
132
+ });
133
+ seenTitles.add(idx.title.toLowerCase());
134
+ projectAdded++;
135
+ }
136
+ // Keep highest-confirmed first (order, not existence, is the threshold's job).
137
+ // Total visible = up to 3 awareness + up to 2 project-scoped = max 5.
138
+ insights.sort((a, b) => b.confirmed - a.confirmed);
82
139
  // 3. Active rooms — top 3 by salience (was 5). Same noise-cap rationale.
83
- const rooms = listRooms(slug).slice(0, 3);
140
+ // Call listRooms ONCE — it internally scans every room via countRoomEntries
141
+ // to enforce the empty-last sort. Reuse the result for both active_rooms and
142
+ // the hasPalaceContent check below (avoids a 2nd full sort + 3rd scan pass).
143
+ const allRooms = listRooms(slug);
144
+ const rooms = allRooms.slice(0, 3);
84
145
  const active_rooms = rooms.map((r) => ({
85
146
  name: r.name,
86
147
  salience: r.salience,
@@ -127,13 +188,15 @@ export async function sessionStart(input) {
127
188
  if (d === today) {
128
189
  const content = fs.readFileSync(path.join(dir, file), "utf-8");
129
190
  const brief = extractSection(content, "brief");
130
- const entry = brief ? sliceAtWord(brief, 400) : sliceAtWord(content.split("\n").slice(0, 3).join(" "), 400);
191
+ const raw = brief ? brief : content.split("\n").slice(0, 3).join(" ");
192
+ const entry = sliceAtWord(stripMarkdownHeaders(raw), 400);
131
193
  todayBrief = todayBrief ? `${todayBrief} | ${entry}` : entry;
132
194
  }
133
195
  else if (d === yesterday && !yesterdayBrief) {
134
196
  const content = fs.readFileSync(path.join(dir, file), "utf-8");
135
197
  const brief = extractSection(content, "brief");
136
- yesterdayBrief = brief ? sliceAtWord(brief, 400) : sliceAtWord(content.split("\n").slice(0, 3).join(" "), 400);
198
+ const raw = brief ? brief : content.split("\n").slice(0, 3).join(" ");
199
+ yesterdayBrief = sliceAtWord(stripMarkdownHeaders(raw), 400);
137
200
  }
138
201
  else if (d < yesterday) {
139
202
  olderCount++;
@@ -154,6 +217,34 @@ export async function sessionStart(input) {
154
217
  }
155
218
  // 7. P0 corrections — always-load behavioral rules (max 10 most recent)
156
219
  const corrections = readP0Corrections(slug).slice(0, 10);
220
+ // P0-B: auto-record "retrieved" outcome for each surfaced correction.
221
+ // Automaticity Law: only automatic instrumentation captures real data.
222
+ // Guard: fire at most once per correction per calendar day — prevents
223
+ // double-counting if session_start is called twice in the same session
224
+ // (e.g. on reconnect or tool retry).
225
+ {
226
+ // Local-TZ date for the 1/day guard (Sprint-0 review: toISOString is UTC,
227
+ // which breaks the guard for users in UTC+5..+14 — e.g. 07:50 local in UTC+8
228
+ // is "yesterday" in UTC). "sv" locale formats as YYYY-MM-DD.
229
+ const todayStr = new Date().toLocaleDateString("sv");
230
+ const nowISO = new Date().toISOString();
231
+ for (const c of corrections) {
232
+ if (c.last_retrieved && new Date(c.last_retrieved).toLocaleDateString("sv") === todayStr)
233
+ continue; // already counted today
234
+ try {
235
+ recordOutcome({
236
+ correction_id: c.id,
237
+ project: slug,
238
+ kind: "retrieved",
239
+ at: nowISO,
240
+ evidence: "surfaced at session_start",
241
+ });
242
+ }
243
+ catch {
244
+ // Outcome tracking must NEVER break orientation — swallow all errors
245
+ }
246
+ }
247
+ }
157
248
  // 8. Resume block — structured re-entry briefing for returning sessions
158
249
  const sessionsCount = olderCount + (yesterdayBrief ? 1 : 0) + (todayBrief ? 1 : 0);
159
250
  let resume = null;
@@ -182,7 +273,9 @@ export async function sessionStart(input) {
182
273
  // session_end writes trajectory under "## Next" — use "next" key to extract it
183
274
  const trajectorySection = extractSection(content, "next") ?? extractSection(content, "trajectory");
184
275
  if (trajectorySection) {
185
- lastTrajectory = sliceAtWord(trajectorySection, 200);
276
+ // Strip the leading "## Next" (or any markdown header) so it never
277
+ // leaks into the rendered card as "Trajectory: ## Next…".
278
+ lastTrajectory = sliceAtWord(stripMarkdownHeaders(trajectorySection), 200);
186
279
  }
187
280
  }
188
281
  resume = {
@@ -191,13 +284,31 @@ export async function sessionStart(input) {
191
284
  sessions_count: sessionsCount,
192
285
  };
193
286
  }
194
- // 9. Empty state detection guide first-time agents on THIS project
195
- // Uses project-scoped signals only: no journals, no corrections, no resume
196
- // cross_project and insights are global a returning user always has those
287
+ // 8c. Recent capturesjournal_capture writes that pre-date any session_end.
288
+ // These live in `*-log.md` / `--capture--` files the orientation path skips,
289
+ // so without this an agent that captured 4 things sees "No memory found".
290
+ const recentCaptures = readRecentCaptures(slug, 5);
291
+ // 9. Empty state detection — guide first-time agents on THIS project.
292
+ // The filesystem is the single source of truth: ANY committed store
293
+ // (resume/journal/corrections) OR uncommitted store (captures) OR real
294
+ // palace content makes the project non-empty. session_end is NOT a
295
+ // prerequisite for visibility.
296
+ //
297
+ // Short-circuit order is cheapest-first: in-memory checks (resume,
298
+ // corrections, briefs) before the fs/palace scans (captures, room content).
299
+ //
300
+ // hasPalaceContent: a freshly-initialized palace has scaffold rooms with
301
+ // zero `### ` entries — those don't count. countRoomEntries() (palace's own
302
+ // public helper) tells a real room from scaffold without touching palace
303
+ // internals, so "non-empty" is precise rather than `active_rooms.length > 0`.
304
+ const hasPalaceContent = allRooms.some((r) => countRoomEntries(slug, r.slug) > 0);
305
+ const hasCaptures = recentCaptures.length > 0 || hasCaptureLogs(slug);
197
306
  const isEmpty = !resume &&
198
307
  corrections.length === 0 &&
199
308
  !todayBrief && !yesterdayBrief &&
200
- olderCount === 0;
309
+ olderCount === 0 &&
310
+ !hasCaptures &&
311
+ !hasPalaceContent;
201
312
  // Trigger backfill if Supabase is configured (non-blocking)
202
313
  const sbConfig = readSupabaseConfig();
203
314
  if (sbConfig) {
@@ -211,6 +322,25 @@ export async function sessionStart(input) {
211
322
  if (readBehaviorPolicies(slug).rules.length > 0)
212
323
  recordPolicyLoad(slug);
213
324
  const behaviorRules = readBehaviorPolicies(slug).rules;
325
+ // North-star alignment metric — correction precision (heeded/retrieved).
326
+ // Wrapped in try/catch so a corrupt or unreadable corrections dir never
327
+ // breaks session orientation. Null when no outcome data exists yet
328
+ // (retrieved === 0) — no fake claims.
329
+ let alignment = null;
330
+ try {
331
+ const kpis = getCorrectionKPIs(slug);
332
+ if (kpis.retrieved > 0) {
333
+ alignment = {
334
+ precision: kpis.precision,
335
+ retrieved: kpis.retrieved,
336
+ heeded: kpis.heeded,
337
+ recurred: kpis.recurred,
338
+ };
339
+ }
340
+ }
341
+ catch {
342
+ // alignment remains null — session_start must always succeed
343
+ }
214
344
  // Dream cron health — surface when broken for ≥2 nights
215
345
  const dreamHealthRaw = getDreamHealth();
216
346
  const dreamHealth = dreamHealthRaw.banner ? dreamHealthRaw : null;
@@ -242,12 +372,18 @@ export async function sessionStart(input) {
242
372
  active_rooms,
243
373
  cross_project,
244
374
  recent: { today: todayBrief, yesterday: yesterdayBrief, older_count: olderCount },
375
+ recent_captures: recentCaptures.map((c) => ({
376
+ date: c.date,
377
+ question: sliceAtWord(c.question, 120),
378
+ answer: sliceAtWord(c.answer, 200),
379
+ })),
245
380
  watch_for,
246
381
  corrections,
247
382
  resume,
248
383
  behavior_rules: behaviorRules,
249
384
  dream_health: dreamHealth,
250
385
  pipeline,
386
+ alignment,
251
387
  empty_state: isEmpty ? "No memory found for this project. Try: bootstrap_scan() to import existing projects, or start working and use remember() to save decisions." : undefined,
252
388
  };
253
389
  }