@remnic/core 9.69.77 → 9.69.78

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 (167) hide show
  1. package/dist/access-admin-ops-surface.js +11 -11
  2. package/dist/access-authorization-probe.js +12 -12
  3. package/dist/access-boundary.js +11 -11
  4. package/dist/access-cli.js +48 -48
  5. package/dist/access-extraction-force-flush.js +11 -11
  6. package/dist/access-http-briefing.js +12 -12
  7. package/dist/access-http-query.js +13 -13
  8. package/dist/access-http.js +27 -27
  9. package/dist/access-identity-continuity-surface.js +11 -11
  10. package/dist/access-lcm-surface.js +11 -11
  11. package/dist/access-mcp.js +20 -20
  12. package/dist/access-namespace-preflight.js +11 -11
  13. package/dist/access-observe-write-surface.js +11 -11
  14. package/dist/access-operations-batch.js +12 -12
  15. package/dist/access-operations.js +19 -19
  16. package/dist/access-recall-concurrency.js +11 -11
  17. package/dist/access-recall-response.js +11 -11
  18. package/dist/access-recall-surface.js +11 -11
  19. package/dist/access-service.js +11 -11
  20. package/dist/access-surface-catalog.js +13 -13
  21. package/dist/active-recall.js +2 -2
  22. package/dist/briefing.js +2 -2
  23. package/dist/causal-consolidation.js +3 -3
  24. package/dist/{chunk-NGFRFDSK.js → chunk-2IAAJS3R.js} +2 -2
  25. package/dist/{chunk-FMT52ROU.js → chunk-3NYCO5Q5.js} +8 -8
  26. package/dist/{chunk-RGX4DGOG.js → chunk-3XQYM4RE.js} +2 -2
  27. package/dist/{chunk-CYCE3L2I.js → chunk-54CG7SO6.js} +18 -18
  28. package/dist/{chunk-RRMIACBG.js → chunk-55FCXCXJ.js} +7 -3
  29. package/dist/{chunk-RRMIACBG.js.map → chunk-55FCXCXJ.js.map} +1 -1
  30. package/dist/{chunk-LEP46X5Y.js → chunk-7R4DKXKP.js} +2 -2
  31. package/dist/{chunk-OJ3TV57W.js → chunk-7UUKRS3J.js} +2 -2
  32. package/dist/{chunk-ALOMLIRC.js → chunk-AFZWKVEX.js} +25 -20
  33. package/dist/chunk-AFZWKVEX.js.map +1 -0
  34. package/dist/{chunk-DCPAAAIC.js → chunk-AXDOF4VI.js} +2 -2
  35. package/dist/{chunk-IILMR37Z.js → chunk-B5TUL5KO.js} +10 -10
  36. package/dist/{chunk-GARVFCV6.js → chunk-BIFFCC62.js} +2 -2
  37. package/dist/{chunk-NYZRJW5X.js → chunk-BJX3VQWZ.js} +2 -2
  38. package/dist/{chunk-MQQPONTM.js → chunk-CK5U7JGH.js} +2 -2
  39. package/dist/{chunk-RDUM6BKQ.js → chunk-CRKWSSS4.js} +2 -2
  40. package/dist/{chunk-XNYTMLPS.js → chunk-DGAWEJVI.js} +2 -2
  41. package/dist/{chunk-CDEI5S5W.js → chunk-DZQ734SM.js} +2 -2
  42. package/dist/{chunk-SUSMEKBE.js → chunk-EU3N5MK3.js} +3 -3
  43. package/dist/{chunk-QJAGDPY7.js → chunk-FYAU4S6E.js} +3 -3
  44. package/dist/{chunk-X3NZ2HAO.js → chunk-GZAGLCQH.js} +2 -2
  45. package/dist/{chunk-ZYBLNHUB.js → chunk-H4USONK4.js} +3 -3
  46. package/dist/{chunk-K2SXIWEV.js → chunk-IA3X2Y4K.js} +2 -2
  47. package/dist/{chunk-QIDMGBUY.js → chunk-IMAP236M.js} +2 -2
  48. package/dist/{chunk-3AGCSD42.js → chunk-JA64OVTE.js} +2 -2
  49. package/dist/{chunk-OHRIBMSS.js → chunk-JS3S2HVG.js} +2 -2
  50. package/dist/{chunk-FVK5NQ3V.js → chunk-JVY556FW.js} +2 -2
  51. package/dist/{chunk-LZLJK2IA.js → chunk-L2LBMKSI.js} +5 -5
  52. package/dist/{chunk-AVO2CBIL.js → chunk-MJQ3QF7Y.js} +2 -2
  53. package/dist/{chunk-NHV6WCM5.js → chunk-ML2MVAEZ.js} +1 -1
  54. package/dist/{chunk-GXQ5GDUH.js → chunk-N3MNDVJO.js} +2 -2
  55. package/dist/{chunk-WGXWZE3K.js → chunk-NAYBHNGN.js} +2 -2
  56. package/dist/{chunk-X33QB7LW.js → chunk-NKFLHW7J.js} +2 -2
  57. package/dist/{chunk-A2XDQ3JW.js → chunk-OM5BIPBR.js} +2 -2
  58. package/dist/{chunk-2CH6MMO2.js → chunk-OXE7KNFJ.js} +5 -5
  59. package/dist/{chunk-3K3PITOE.js → chunk-P6GTQGGB.js} +2 -2
  60. package/dist/{chunk-5X7ZTLFS.js → chunk-RIEX7NOZ.js} +2 -2
  61. package/dist/{chunk-ZWWF7PI5.js → chunk-S42HZILI.js} +2 -2
  62. package/dist/{chunk-YUAOU2B2.js → chunk-S55WTPFJ.js} +3 -5
  63. package/dist/chunk-S55WTPFJ.js.map +1 -0
  64. package/dist/{chunk-RMG22TH2.js → chunk-SQDKX4RW.js} +2 -2
  65. package/dist/{chunk-2GKLHU2D.js → chunk-SV72F4DS.js} +2 -2
  66. package/dist/{chunk-6MJGDUC7.js → chunk-T4BE5KJM.js} +3 -3
  67. package/dist/{chunk-7DZHRPCO.js → chunk-T4QGUXCV.js} +2 -2
  68. package/dist/{chunk-UKB7ZDKK.js → chunk-TIQZNDZ5.js} +2 -2
  69. package/dist/{chunk-GATQP7CE.js → chunk-TIVPGSGO.js} +2 -2
  70. package/dist/{chunk-7QXTCONH.js → chunk-TS6WB2CL.js} +2 -2
  71. package/dist/{chunk-7WO66MKJ.js → chunk-UNJOB4DY.js} +2 -2
  72. package/dist/{chunk-DSQWTXHP.js → chunk-W75BBBSY.js} +8 -8
  73. package/dist/{chunk-YL273SOF.js → chunk-WB2I2EQK.js} +2 -2
  74. package/dist/{chunk-RKTT72XV.js → chunk-WGXUEXSV.js} +3 -3
  75. package/dist/cli.js +39 -39
  76. package/dist/coding/export-okf-codegraph.js +1 -1
  77. package/dist/compounding/engine.js +2 -2
  78. package/dist/config.js +2 -2
  79. package/dist/connectors/codex-materialize-runner.js +2 -2
  80. package/dist/connectors/index.js +2 -2
  81. package/dist/convergence-refresh.js +4 -4
  82. package/dist/corpus-watermark.js +4 -4
  83. package/dist/entity-retrieval.js +2 -2
  84. package/dist/external-wiki-access.js +12 -12
  85. package/dist/extraction.js +2 -2
  86. package/dist/harmonic-retrieval.js +1 -1
  87. package/dist/index.js +48 -48
  88. package/dist/lifecycle/seed-graduation.d.ts.map +1 -1
  89. package/dist/location/index.js +4 -4
  90. package/dist/maintenance/memory-governance.js +2 -2
  91. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +2 -2
  92. package/dist/maintenance/rebuild-memory-projection.js +3 -3
  93. package/dist/memory-browse-operations.js +12 -12
  94. package/dist/namespaces/migrate.js +3 -3
  95. package/dist/namespaces/storage.js +2 -2
  96. package/dist/operator-doctor-corpus.js +5 -5
  97. package/dist/operator-toolkit.js +11 -11
  98. package/dist/orchestration/lifecycle-policy-coordinator.d.ts.map +1 -1
  99. package/dist/orchestration/maintenance.js +10 -10
  100. package/dist/orchestrator.js +48 -48
  101. package/dist/recall-navigation-operations.js +12 -12
  102. package/dist/recall-navigation.js +11 -11
  103. package/dist/resume-bundles.js +3 -3
  104. package/dist/semantic-consolidation.js +3 -3
  105. package/dist/semantic-rule-promotion.js +2 -2
  106. package/dist/semantic-rule-verifier.js +2 -2
  107. package/dist/source-agent-qualifier.js +2 -2
  108. package/dist/standup/build.js +2 -2
  109. package/dist/storage.d.ts.map +1 -1
  110. package/dist/storage.js +1 -1
  111. package/dist/support-passport/index.js +14 -14
  112. package/dist/transfer/export-okf.js +2 -2
  113. package/dist/verified-recall.js +2 -2
  114. package/dist/who-knows-cli.js +3 -3
  115. package/dist/who-knows.js +2 -2
  116. package/package.json +2 -2
  117. package/src/lifecycle/seed-graduation.test.ts +124 -0
  118. package/src/lifecycle/seed-graduation.ts +7 -2
  119. package/src/orchestration/lifecycle-policy-coordinator.ts +6 -1
  120. package/src/storage.ts +2 -4
  121. package/dist/chunk-ALOMLIRC.js.map +0 -1
  122. package/dist/chunk-YUAOU2B2.js.map +0 -1
  123. /package/dist/{chunk-NGFRFDSK.js.map → chunk-2IAAJS3R.js.map} +0 -0
  124. /package/dist/{chunk-FMT52ROU.js.map → chunk-3NYCO5Q5.js.map} +0 -0
  125. /package/dist/{chunk-RGX4DGOG.js.map → chunk-3XQYM4RE.js.map} +0 -0
  126. /package/dist/{chunk-CYCE3L2I.js.map → chunk-54CG7SO6.js.map} +0 -0
  127. /package/dist/{chunk-LEP46X5Y.js.map → chunk-7R4DKXKP.js.map} +0 -0
  128. /package/dist/{chunk-OJ3TV57W.js.map → chunk-7UUKRS3J.js.map} +0 -0
  129. /package/dist/{chunk-DCPAAAIC.js.map → chunk-AXDOF4VI.js.map} +0 -0
  130. /package/dist/{chunk-IILMR37Z.js.map → chunk-B5TUL5KO.js.map} +0 -0
  131. /package/dist/{chunk-GARVFCV6.js.map → chunk-BIFFCC62.js.map} +0 -0
  132. /package/dist/{chunk-NYZRJW5X.js.map → chunk-BJX3VQWZ.js.map} +0 -0
  133. /package/dist/{chunk-MQQPONTM.js.map → chunk-CK5U7JGH.js.map} +0 -0
  134. /package/dist/{chunk-RDUM6BKQ.js.map → chunk-CRKWSSS4.js.map} +0 -0
  135. /package/dist/{chunk-XNYTMLPS.js.map → chunk-DGAWEJVI.js.map} +0 -0
  136. /package/dist/{chunk-CDEI5S5W.js.map → chunk-DZQ734SM.js.map} +0 -0
  137. /package/dist/{chunk-SUSMEKBE.js.map → chunk-EU3N5MK3.js.map} +0 -0
  138. /package/dist/{chunk-QJAGDPY7.js.map → chunk-FYAU4S6E.js.map} +0 -0
  139. /package/dist/{chunk-X3NZ2HAO.js.map → chunk-GZAGLCQH.js.map} +0 -0
  140. /package/dist/{chunk-ZYBLNHUB.js.map → chunk-H4USONK4.js.map} +0 -0
  141. /package/dist/{chunk-K2SXIWEV.js.map → chunk-IA3X2Y4K.js.map} +0 -0
  142. /package/dist/{chunk-QIDMGBUY.js.map → chunk-IMAP236M.js.map} +0 -0
  143. /package/dist/{chunk-3AGCSD42.js.map → chunk-JA64OVTE.js.map} +0 -0
  144. /package/dist/{chunk-OHRIBMSS.js.map → chunk-JS3S2HVG.js.map} +0 -0
  145. /package/dist/{chunk-FVK5NQ3V.js.map → chunk-JVY556FW.js.map} +0 -0
  146. /package/dist/{chunk-LZLJK2IA.js.map → chunk-L2LBMKSI.js.map} +0 -0
  147. /package/dist/{chunk-AVO2CBIL.js.map → chunk-MJQ3QF7Y.js.map} +0 -0
  148. /package/dist/{chunk-NHV6WCM5.js.map → chunk-ML2MVAEZ.js.map} +0 -0
  149. /package/dist/{chunk-GXQ5GDUH.js.map → chunk-N3MNDVJO.js.map} +0 -0
  150. /package/dist/{chunk-WGXWZE3K.js.map → chunk-NAYBHNGN.js.map} +0 -0
  151. /package/dist/{chunk-X33QB7LW.js.map → chunk-NKFLHW7J.js.map} +0 -0
  152. /package/dist/{chunk-A2XDQ3JW.js.map → chunk-OM5BIPBR.js.map} +0 -0
  153. /package/dist/{chunk-2CH6MMO2.js.map → chunk-OXE7KNFJ.js.map} +0 -0
  154. /package/dist/{chunk-3K3PITOE.js.map → chunk-P6GTQGGB.js.map} +0 -0
  155. /package/dist/{chunk-5X7ZTLFS.js.map → chunk-RIEX7NOZ.js.map} +0 -0
  156. /package/dist/{chunk-ZWWF7PI5.js.map → chunk-S42HZILI.js.map} +0 -0
  157. /package/dist/{chunk-RMG22TH2.js.map → chunk-SQDKX4RW.js.map} +0 -0
  158. /package/dist/{chunk-2GKLHU2D.js.map → chunk-SV72F4DS.js.map} +0 -0
  159. /package/dist/{chunk-6MJGDUC7.js.map → chunk-T4BE5KJM.js.map} +0 -0
  160. /package/dist/{chunk-7DZHRPCO.js.map → chunk-T4QGUXCV.js.map} +0 -0
  161. /package/dist/{chunk-UKB7ZDKK.js.map → chunk-TIQZNDZ5.js.map} +0 -0
  162. /package/dist/{chunk-GATQP7CE.js.map → chunk-TIVPGSGO.js.map} +0 -0
  163. /package/dist/{chunk-7QXTCONH.js.map → chunk-TS6WB2CL.js.map} +0 -0
  164. /package/dist/{chunk-7WO66MKJ.js.map → chunk-UNJOB4DY.js.map} +0 -0
  165. /package/dist/{chunk-DSQWTXHP.js.map → chunk-W75BBBSY.js.map} +0 -0
  166. /package/dist/{chunk-YL273SOF.js.map → chunk-WB2I2EQK.js.map} +0 -0
  167. /package/dist/{chunk-RKTT72XV.js.map → chunk-WGXUEXSV.js.map} +0 -0
@@ -4,7 +4,7 @@ import {
4
4
  SUPPORT_PASSPORT_MODEL_RESULT_PATH,
5
5
  SupportPassportModelBridge,
6
6
  parseSupportPassportModelJob
7
- } from "../chunk-3K3PITOE.js";
7
+ } from "../chunk-P6GTQGGB.js";
8
8
  import {
9
9
  DEFAULT_SUPPORT_PASSPORT_CONFIG,
10
10
  parseSupportPassportConfig
@@ -14,8 +14,8 @@ import {
14
14
  buildSupportPassportPublicRequestHandler,
15
15
  composeSupportPassportExternalRequestHandlers,
16
16
  normalizeSupportPassportNetworkAddress
17
- } from "../chunk-7QXTCONH.js";
18
- import "../chunk-LEP46X5Y.js";
17
+ } from "../chunk-TS6WB2CL.js";
18
+ import "../chunk-7R4DKXKP.js";
19
19
  import {
20
20
  SUPPORT_PASSPORT_DRAFT_MAX_CONTENT_CHARACTERS,
21
21
  SUPPORT_PASSPORT_DRAFT_MAX_MEMORIES,
@@ -56,7 +56,7 @@ import {
56
56
  notifySupportPassportCommitted,
57
57
  resolveSupportPassportModelRoutePlan,
58
58
  syncDirectoryForDurability
59
- } from "../chunk-FMT52ROU.js";
59
+ } from "../chunk-3NYCO5Q5.js";
60
60
  import "../chunk-W4F3C7N7.js";
61
61
  import "../chunk-MPC7TYTZ.js";
62
62
  import "../chunk-H36X4NRH.js";
@@ -65,7 +65,7 @@ import "../chunk-OGXXGHW6.js";
65
65
  import "../chunk-C3QXITIP.js";
66
66
  import "../chunk-VQ7B2Q6M.js";
67
67
  import "../chunk-PJSK6OJM.js";
68
- import "../chunk-QIDMGBUY.js";
68
+ import "../chunk-IMAP236M.js";
69
69
  import "../chunk-ROBHL3GL.js";
70
70
  import "../chunk-GNVZQ5JN.js";
71
71
  import "../chunk-YN2UN7N3.js";
@@ -87,7 +87,7 @@ import "../chunk-KN6CIN7I.js";
87
87
  import "../chunk-SOBJ6NEY.js";
88
88
  import "../chunk-SSUDD72S.js";
89
89
  import "../chunk-VYDGHJIN.js";
90
- import "../chunk-DCPAAAIC.js";
90
+ import "../chunk-AXDOF4VI.js";
91
91
  import "../chunk-E6UNM67F.js";
92
92
  import "../chunk-6WHJ2EAB.js";
93
93
  import "../chunk-AQEJKOKI.js";
@@ -97,7 +97,7 @@ import "../chunk-UD7UNYRD.js";
97
97
  import "../chunk-5ELENZTA.js";
98
98
  import "../chunk-7G6WUOLB.js";
99
99
  import "../chunk-2YA5N2BY.js";
100
- import "../chunk-NHV6WCM5.js";
100
+ import "../chunk-ML2MVAEZ.js";
101
101
  import "../chunk-CHDGJJV6.js";
102
102
  import "../chunk-EI6V5UXY.js";
103
103
  import "../chunk-KKNZ7PUZ.js";
@@ -121,12 +121,12 @@ import "../chunk-HRATODNO.js";
121
121
  import "../chunk-BMWN7B3Y.js";
122
122
  import "../chunk-NAFPHFDM.js";
123
123
  import "../chunk-RF2SMMPP.js";
124
- import "../chunk-FVK5NQ3V.js";
125
- import "../chunk-RDUM6BKQ.js";
126
- import "../chunk-XNYTMLPS.js";
127
- import "../chunk-GXQ5GDUH.js";
124
+ import "../chunk-JVY556FW.js";
125
+ import "../chunk-CRKWSSS4.js";
126
+ import "../chunk-DGAWEJVI.js";
127
+ import "../chunk-N3MNDVJO.js";
128
128
  import "../chunk-UFGFMWAD.js";
129
- import "../chunk-MQQPONTM.js";
129
+ import "../chunk-CK5U7JGH.js";
130
130
  import "../chunk-3UXOZBHV.js";
131
131
  import "../chunk-PIWFNPQT.js";
132
132
  import "../chunk-2U3R3DDH.js";
@@ -135,7 +135,7 @@ import "../chunk-EUT2WCWS.js";
135
135
  import "../chunk-GKCXTSFF.js";
136
136
  import "../chunk-2LSZVONP.js";
137
137
  import "../chunk-DEUNUKTD.js";
138
- import "../chunk-OJ3TV57W.js";
138
+ import "../chunk-7UUKRS3J.js";
139
139
  import "../chunk-6DTJBTHL.js";
140
140
  import "../chunk-I4G4UWQA.js";
141
141
  import "../chunk-CSAKJVXW.js";
@@ -162,7 +162,7 @@ import "../chunk-236PXYG7.js";
162
162
  import "../chunk-ZCUTSMR2.js";
163
163
  import "../chunk-QDW3E4RD.js";
164
164
  import "../chunk-VZBW6CDG.js";
165
- import "../chunk-YUAOU2B2.js";
165
+ import "../chunk-S55WTPFJ.js";
166
166
  import "../chunk-UHVXE24Y.js";
167
167
  import "../chunk-46WM6JX2.js";
168
168
  import "../chunk-D5F7TKMH.js";
@@ -4,13 +4,13 @@ import {
4
4
  exportOkfBundle,
5
5
  firstHeading,
6
6
  parseIncludeStatus
7
- } from "../chunk-ZWWF7PI5.js";
7
+ } from "../chunk-S42HZILI.js";
8
8
  import {
9
9
  OKF_EXPORT_VERSION
10
10
  } from "../chunk-CLSYE5OZ.js";
11
11
  import "../chunk-D24OXEPB.js";
12
12
  import "../chunk-3UXOZBHV.js";
13
- import "../chunk-YUAOU2B2.js";
13
+ import "../chunk-S55WTPFJ.js";
14
14
  import "../chunk-UHVXE24Y.js";
15
15
  import "../chunk-46WM6JX2.js";
16
16
  import "../chunk-D5F7TKMH.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-UKB7ZDKK.js";
4
+ } from "./chunk-TIQZNDZ5.js";
5
5
  import "./chunk-B7RWBZXW.js";
6
- import "./chunk-YUAOU2B2.js";
6
+ import "./chunk-S55WTPFJ.js";
7
7
  import "./chunk-UHVXE24Y.js";
8
8
  import "./chunk-46WM6JX2.js";
9
9
  import "./chunk-D5F7TKMH.js";
@@ -4,9 +4,9 @@ import {
4
4
  renderWhoKnows,
5
5
  renderWhoKnowsJson,
6
6
  renderWhoKnowsText
7
- } from "./chunk-5X7ZTLFS.js";
8
- import "./chunk-QIDMGBUY.js";
9
- import "./chunk-YUAOU2B2.js";
7
+ } from "./chunk-RIEX7NOZ.js";
8
+ import "./chunk-IMAP236M.js";
9
+ import "./chunk-S55WTPFJ.js";
10
10
  import "./chunk-UHVXE24Y.js";
11
11
  import "./chunk-46WM6JX2.js";
12
12
  import "./chunk-D5F7TKMH.js";
package/dist/who-knows.js CHANGED
@@ -9,8 +9,8 @@ import {
9
9
  loadWhoKnowsEntities,
10
10
  tokenizeTopic,
11
11
  validateWhoKnowsInput
12
- } from "./chunk-QIDMGBUY.js";
13
- import "./chunk-YUAOU2B2.js";
12
+ } from "./chunk-IMAP236M.js";
13
+ import "./chunk-S55WTPFJ.js";
14
14
  import "./chunk-UHVXE24Y.js";
15
15
  import "./chunk-46WM6JX2.js";
16
16
  import "./chunk-D5F7TKMH.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.69.77",
3
+ "version": "9.69.78",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3317,7 +3317,7 @@
3317
3317
  "core"
3318
3318
  ],
3319
3319
  "peerDependencies": {
3320
- "@remnic/coding-graph": "^9.69.77"
3320
+ "@remnic/coding-graph": "^9.69.78"
3321
3321
  },
3322
3322
  "peerDependenciesMeta": {
3323
3323
  "@remnic/coding-graph": {
@@ -39,6 +39,7 @@ function fakeMemory(overrides: {
39
39
  created: string;
40
40
  source?: string;
41
41
  status?: MemoryFrontmatter["status"];
42
+ verificationState?: MemoryFrontmatter["verificationState"];
42
43
  structuredAttributes?: Record<string, string>;
43
44
  lineage?: string[];
44
45
  }): MemoryFile {
@@ -55,6 +56,7 @@ function fakeMemory(overrides: {
55
56
  confidenceTier: "inferred",
56
57
  tags: [],
57
58
  status: overrides.status,
59
+ verificationState: overrides.verificationState,
58
60
  structuredAttributes: overrides.structuredAttributes,
59
61
  lineage: overrides.lineage,
60
62
  },
@@ -369,6 +371,20 @@ test("an independent negated restatement holds the seed even with enough corrobo
369
371
  assert.ok(decision.reasons.includes("contradiction-observed:1"));
370
372
  });
371
373
 
374
+ test("#3118 disputed evidence cannot corroborate a seed", () => {
375
+ const seed = seedMemory({ id: "seed-1" });
376
+ const disputed = fakeMemory({
377
+ id: "ev-1",
378
+ content: RESTATE_TEXT,
379
+ created: "2026-08-02T10:00:00.000Z",
380
+ source: "wearable:limitless",
381
+ verificationState: "disputed",
382
+ });
383
+ const decision = evaluateSeedGraduation(seed, [disputed], { config: ENABLED });
384
+ assert.equal(decision.decision, "hold");
385
+ assert.equal(decision.corroborationCount, 0);
386
+ });
387
+
372
388
  test("a negated seed restated positively is held (polarity symmetry)", () => {
373
389
  const seed = seedMemory({ id: "seed-1", content: CONTRADICT_TEXT });
374
390
  const positive = fakeMemory({
@@ -543,6 +559,34 @@ test("pass: independent corroboration promotes the seed in place with audit attr
543
559
  }
544
560
  });
545
561
 
562
+ test("#3118 disputed seed is skipped by the graduation pass", async () => {
563
+ const { storage, dir } = makeStorage();
564
+ try {
565
+ const seedWrite = await storage.writeMemory("fact", SEED_TEXT, {
566
+ source: "wearable:bee",
567
+ status: "pending_review",
568
+ });
569
+ await storage.writeMemory("fact", RESTATE_TEXT, {
570
+ source: "wearable:limitless",
571
+ });
572
+ const seed = (await storage.readAllMemories()).find((memory) => memory.frontmatter.id === seedWrite.id);
573
+ assert.ok(seed);
574
+ await storage.writeMemoryFrontmatter(seed, { verificationState: "disputed" });
575
+ const summary = await runSeedGraduationPass({
576
+ memories: await storage.readAllMemories(),
577
+ storage,
578
+ config: ENABLED,
579
+ });
580
+ assert.equal(summary.evaluated, 0);
581
+ assert.equal(summary.promoted, 0);
582
+ const held = (await storage.readAllMemories()).find((memory) => memory.frontmatter.id === seedWrite.id);
583
+ assert.equal(held?.frontmatter.status, "pending_review");
584
+ } finally {
585
+ rmSync(dir, { recursive: true, force: true });
586
+ }
587
+ });
588
+
589
+
546
590
  test("pass: contradiction during the window holds the seed in place", async () => {
547
591
  const { storage, dir } = makeStorage();
548
592
  try {
@@ -728,6 +772,86 @@ test("lifecycle pass: enabled independent corroboration promotes through the pol
728
772
  }
729
773
  });
730
774
 
775
+ test("#3118 lifecycle pass reindexes after a graduation", async () => {
776
+ const { storage, dir } = makeStorage();
777
+ try {
778
+ await storage.writeMemory("fact", SEED_TEXT, {
779
+ source: "wearable:bee",
780
+ status: "pending_review",
781
+ });
782
+ await storage.writeMemory("fact", RESTATE_TEXT, {
783
+ source: "wearable:limitless",
784
+ });
785
+ const config = parseConfig({
786
+ memoryDir: dir,
787
+ seedGraduation: { enabled: true, minCorroborations: 1 },
788
+ });
789
+ const deps = coordinatorDeps(storage, config);
790
+ let saves = 0;
791
+ deps.saveContentHashIndexes = async () => {
792
+ saves += 1;
793
+ };
794
+ await new LifecyclePolicyCoordinator(deps).runLifecyclePolicyPass(
795
+ await storage.readAllMemories(),
796
+ storage,
797
+ );
798
+ assert.equal(saves, 1, "graduation must persist content-hash indexes");
799
+ } finally {
800
+ rmSync(dir, { recursive: true, force: true });
801
+ }
802
+ });
803
+
804
+
805
+ test("#3118 index-save failure does not unwind a completed graduation", async () => {
806
+ const { storage, dir } = makeStorage();
807
+ try {
808
+ await storage.writeMemory("fact", SEED_TEXT, {
809
+ source: "wearable:bee",
810
+ status: "pending_review",
811
+ });
812
+ await storage.writeMemory("fact", RESTATE_TEXT, {
813
+ source: "wearable:limitless",
814
+ });
815
+ const config = parseConfig({
816
+ memoryDir: dir,
817
+ seedGraduation: { enabled: true, minCorroborations: 1 },
818
+ });
819
+ const deps = coordinatorDeps(storage, config);
820
+ deps.saveContentHashIndexes = async () => {
821
+ throw new Error("index write failed");
822
+ };
823
+ await new LifecyclePolicyCoordinator(deps).runLifecyclePolicyPass(
824
+ await storage.readAllMemories(),
825
+ storage,
826
+ );
827
+ const seed = (await storage.readAllMemories()).find(
828
+ (memory) => memory.frontmatter.source === "wearable:bee",
829
+ );
830
+ assert.equal(seed?.frontmatter.status, "active", "graduation stays durable if reindex fails");
831
+ } finally {
832
+ rmSync(dir, { recursive: true, force: true });
833
+ }
834
+ });
835
+
836
+ test("#3118 promoteWearableMemory refuses a concurrently disputed seed", async () => {
837
+ const { storage, dir } = makeStorage();
838
+ try {
839
+ const seedWrite = await storage.writeMemory("fact", SEED_TEXT, {
840
+ source: "wearable:bee",
841
+ status: "pending_review",
842
+ });
843
+ const seed = (await storage.readAllMemories()).find((memory) => memory.frontmatter.id === seedWrite.id);
844
+ assert.ok(seed);
845
+ await storage.writeMemoryFrontmatter(seed, { verificationState: "disputed" });
846
+ assert.equal(await storage.promoteWearableMemory(seedWrite.id, { graduatedBy: "independent-corroboration" }), false);
847
+ const held = (await storage.readAllMemories()).find((memory) => memory.frontmatter.id === seedWrite.id);
848
+ assert.equal(held?.frontmatter.status, "pending_review");
849
+ } finally {
850
+ rmSync(dir, { recursive: true, force: true });
851
+ }
852
+ });
853
+
854
+
731
855
  test("lifecycle pass: recall-handle history suppresses echo corroboration", async () => {
732
856
  const { storage, dir } = makeStorage();
733
857
  try {
@@ -132,6 +132,10 @@ function isEvidenceStatus(status: MemoryStatus | undefined): boolean {
132
132
  return status === undefined || status === "active" || status === "pending_review";
133
133
  }
134
134
 
135
+ function isGraduationEvidence(memory: MemoryFile): boolean {
136
+ return isEvidenceStatus(memory.frontmatter.status) && memory.frontmatter.verificationState !== "disputed";
137
+ }
138
+
135
139
  function hasLineageLink(seed: MemoryFile, evidence: MemoryFile): boolean {
136
140
  const seedLineage = seed.frontmatter.lineage;
137
141
  if (seedLineage !== undefined && seedLineage.includes(evidence.frontmatter.id)) return true;
@@ -279,7 +283,7 @@ export function evaluateSeedGraduation(
279
283
  const candidateCreated = createdMs(candidate);
280
284
  if (!Number.isFinite(seedCreated) || !Number.isFinite(candidateCreated)) continue;
281
285
  if (candidateCreated <= seedCreated) continue;
282
- if (!isEvidenceStatus(candidate.frontmatter.status)) continue;
286
+ if (!isGraduationEvidence(candidate)) continue;
283
287
  const candidateText = stripAttributesSuffix(candidate.content);
284
288
  if (hasNegationWord(candidateText) !== seedNegated) {
285
289
  // Polarity-flipped restatement of the seed's core content is a
@@ -417,7 +421,7 @@ export async function runSeedGraduationPass(
417
421
  return { evaluated: 0, promoted: 0, held: 0, contradictionHeld: 0, echoSuppressed: 0, disabled: true };
418
422
  }
419
423
  const corpus = excludeSupportPassportPrivateMemories(input.memories);
420
- const evidencePool = corpus.filter((memory) => isEvidenceStatus(memory.frontmatter.status));
424
+ const evidencePool = corpus.filter((memory) => isGraduationEvidence(memory));
421
425
 
422
426
  let promoted = 0;
423
427
  let held = 0;
@@ -427,6 +431,7 @@ export async function runSeedGraduationPass(
427
431
 
428
432
  for (const seed of corpus) {
429
433
  if (seed.frontmatter.status !== "pending_review") continue;
434
+ if (seed.frontmatter.verificationState === "disputed") continue;
430
435
  // Tombstone-blocked rows need revokeTombstone first; the promotion
431
436
  // method refuses them anyway, so skip before evaluating.
432
437
  if (seed.frontmatter.blockedBy !== undefined) continue;
@@ -261,12 +261,17 @@ export class LifecyclePolicyCoordinator {
261
261
  }
262
262
 
263
263
  const history = this.deps.getHandleHistory?.();
264
- await runSeedGraduationPass({
264
+ const graduation = await runSeedGraduationPass({
265
265
  memories: allMemories,
266
266
  storage,
267
267
  config: this.config.seedGraduation,
268
268
  recalledBySession: history ? (sessionKey) => history.recent(sessionKey) : undefined,
269
269
  });
270
+ if (graduation.promoted > 0) {
271
+ await this.deps.saveContentHashIndexes().catch((err) =>
272
+ log.warn(`content-hash index save failed during seed graduation: ${err}`),
273
+ );
274
+ }
270
275
 
271
276
  // Report how many memories had frontmatter rewritten so callers can record a
272
277
  // catalog write touch for lifecycle-only passes (codex NR-tS).
package/src/storage.ts CHANGED
@@ -2598,13 +2598,11 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
2598
2598
  const memory = memories.find((entry) => entry.frontmatter.id === id);
2599
2599
  if (!memory) return false;
2600
2600
  if (memory.frontmatter.status !== "pending_review") return false;
2601
+ if (memory.frontmatter.verificationState === "disputed") return false;
2601
2602
  // Tombstone-blocked rows need revokeTombstone first (issue #1579 OcuDx/Ocu1l).
2602
2603
  if (memory.frontmatter.blockedBy) return false;
2603
- return this.writeMemoryFrontmatter(memory, {
2604
+ return this.writeMemoryFrontmatterIfUnchanged(memory, {
2604
2605
  status: "active",
2605
- // Keep frontmatter confidence in step with the re-scored trust —
2606
- // new smart writes persist trust as confidence, and a promoted
2607
- // row must not keep its stale borderline value.
2608
2606
  ...(typeof confidence === "number" && Number.isFinite(confidence)
2609
2607
  ? { confidence: Math.min(1, Math.max(0, confidence)) }
2610
2608
  : {}),