fivocell 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (568) hide show
  1. package/LICENSE +202 -98
  2. package/README.md +418 -180
  3. package/dist/cli.js +698 -80
  4. package/dist/cli.js.map +1 -1
  5. package/dist/core/__tests__/ab-test-framework.test.d.ts +2 -0
  6. package/dist/core/__tests__/ab-test-framework.test.d.ts.map +1 -0
  7. package/dist/core/__tests__/ab-test-framework.test.js +43 -0
  8. package/dist/core/__tests__/ab-test-framework.test.js.map +1 -0
  9. package/dist/core/__tests__/ai-memory.test.d.ts +2 -0
  10. package/dist/core/__tests__/ai-memory.test.d.ts.map +1 -0
  11. package/dist/core/__tests__/ai-memory.test.js +143 -0
  12. package/dist/core/__tests__/ai-memory.test.js.map +1 -0
  13. package/dist/core/__tests__/ast-extractor.test.d.ts +2 -0
  14. package/dist/core/__tests__/ast-extractor.test.d.ts.map +1 -0
  15. package/dist/core/__tests__/ast-extractor.test.js +30 -0
  16. package/dist/core/__tests__/ast-extractor.test.js.map +1 -0
  17. package/dist/core/__tests__/build-failure-predictor.test.d.ts +2 -0
  18. package/dist/core/__tests__/build-failure-predictor.test.d.ts.map +1 -0
  19. package/dist/core/__tests__/build-failure-predictor.test.js +76 -0
  20. package/dist/core/__tests__/build-failure-predictor.test.js.map +1 -0
  21. package/dist/core/__tests__/chapter3-verify.test.d.ts +2 -0
  22. package/dist/core/__tests__/chapter3-verify.test.d.ts.map +1 -0
  23. package/dist/core/__tests__/chapter3-verify.test.js +315 -0
  24. package/dist/core/__tests__/chapter3-verify.test.js.map +1 -0
  25. package/dist/core/__tests__/chapter4-hostile.test.d.ts +11 -0
  26. package/dist/core/__tests__/chapter4-hostile.test.d.ts.map +1 -0
  27. package/dist/core/__tests__/chapter4-hostile.test.js +269 -0
  28. package/dist/core/__tests__/chapter4-hostile.test.js.map +1 -0
  29. package/dist/core/__tests__/chapter4-verify.test.d.ts +2 -0
  30. package/dist/core/__tests__/chapter4-verify.test.d.ts.map +1 -0
  31. package/dist/core/__tests__/chapter4-verify.test.js +349 -0
  32. package/dist/core/__tests__/chapter4-verify.test.js.map +1 -0
  33. package/dist/core/__tests__/chapter8-hostile.test.d.ts +2 -0
  34. package/dist/core/__tests__/chapter8-hostile.test.d.ts.map +1 -0
  35. package/dist/core/__tests__/chapter8-hostile.test.js +445 -0
  36. package/dist/core/__tests__/chapter8-hostile.test.js.map +1 -0
  37. package/dist/core/__tests__/chapter9-hostile.test.d.ts +2 -0
  38. package/dist/core/__tests__/chapter9-hostile.test.d.ts.map +1 -0
  39. package/dist/core/__tests__/chapter9-hostile.test.js +783 -0
  40. package/dist/core/__tests__/chapter9-hostile.test.js.map +1 -0
  41. package/dist/core/__tests__/circular-dependency-detector.test.d.ts +2 -0
  42. package/dist/core/__tests__/circular-dependency-detector.test.d.ts.map +1 -0
  43. package/dist/core/__tests__/circular-dependency-detector.test.js +55 -0
  44. package/dist/core/__tests__/circular-dependency-detector.test.js.map +1 -0
  45. package/dist/core/__tests__/community-full.test.d.ts +2 -0
  46. package/dist/core/__tests__/community-full.test.d.ts.map +1 -0
  47. package/dist/core/__tests__/community-full.test.js +70 -0
  48. package/dist/core/__tests__/community-full.test.js.map +1 -0
  49. package/dist/core/__tests__/community-live.test.d.ts +2 -0
  50. package/dist/core/__tests__/community-live.test.d.ts.map +1 -0
  51. package/dist/core/__tests__/community-live.test.js +67 -0
  52. package/dist/core/__tests__/community-live.test.js.map +1 -0
  53. package/dist/core/__tests__/complexity-analyzer.test.d.ts +2 -0
  54. package/dist/core/__tests__/complexity-analyzer.test.d.ts.map +1 -0
  55. package/dist/core/__tests__/complexity-analyzer.test.js +54 -0
  56. package/dist/core/__tests__/complexity-analyzer.test.js.map +1 -0
  57. package/dist/core/__tests__/config-attribution.test.d.ts +2 -0
  58. package/dist/core/__tests__/config-attribution.test.d.ts.map +1 -0
  59. package/dist/core/__tests__/config-attribution.test.js +45 -0
  60. package/dist/core/__tests__/config-attribution.test.js.map +1 -0
  61. package/dist/core/__tests__/conflict-detector.test.d.ts +2 -0
  62. package/dist/core/__tests__/conflict-detector.test.d.ts.map +1 -0
  63. package/dist/core/__tests__/conflict-detector.test.js +120 -0
  64. package/dist/core/__tests__/conflict-detector.test.js.map +1 -0
  65. package/dist/core/__tests__/context-restore.test.d.ts +2 -0
  66. package/dist/core/__tests__/context-restore.test.d.ts.map +1 -0
  67. package/dist/core/__tests__/context-restore.test.js +75 -0
  68. package/dist/core/__tests__/context-restore.test.js.map +1 -0
  69. package/dist/core/__tests__/convention-detector.test.d.ts +2 -0
  70. package/dist/core/__tests__/convention-detector.test.d.ts.map +1 -0
  71. package/dist/core/__tests__/convention-detector.test.js +97 -0
  72. package/dist/core/__tests__/convention-detector.test.js.map +1 -0
  73. package/dist/core/__tests__/cost-optimizer.test.d.ts +1 -0
  74. package/dist/core/__tests__/cost-optimizer.test.d.ts.map +1 -0
  75. package/dist/core/__tests__/cost-optimizer.test.js +92 -0
  76. package/dist/core/__tests__/cost-optimizer.test.js.map +1 -0
  77. package/dist/core/__tests__/cross-domain-projections.test.d.ts +2 -0
  78. package/dist/core/__tests__/cross-domain-projections.test.d.ts.map +1 -0
  79. package/dist/core/__tests__/cross-domain-projections.test.js +36 -0
  80. package/dist/core/__tests__/cross-domain-projections.test.js.map +1 -0
  81. package/dist/core/__tests__/cross-project-sync.test.d.ts +2 -0
  82. package/dist/core/__tests__/cross-project-sync.test.d.ts.map +1 -0
  83. package/dist/core/__tests__/cross-project-sync.test.js +67 -0
  84. package/dist/core/__tests__/cross-project-sync.test.js.map +1 -0
  85. package/dist/core/__tests__/dead-code-detector.test.d.ts +2 -0
  86. package/dist/core/__tests__/dead-code-detector.test.d.ts.map +1 -0
  87. package/dist/core/__tests__/dead-code-detector.test.js +41 -0
  88. package/dist/core/__tests__/dead-code-detector.test.js.map +1 -0
  89. package/dist/core/__tests__/dependency-health-checker.test.d.ts +2 -0
  90. package/dist/core/__tests__/dependency-health-checker.test.d.ts.map +1 -0
  91. package/dist/core/__tests__/dependency-health-checker.test.js +50 -0
  92. package/dist/core/__tests__/dependency-health-checker.test.js.map +1 -0
  93. package/dist/core/__tests__/duplication-detector.test.d.ts +2 -0
  94. package/dist/core/__tests__/duplication-detector.test.d.ts.map +1 -0
  95. package/dist/core/__tests__/duplication-detector.test.js +46 -0
  96. package/dist/core/__tests__/duplication-detector.test.js.map +1 -0
  97. package/dist/core/__tests__/error-predictor.test.d.ts +2 -0
  98. package/dist/core/__tests__/error-predictor.test.d.ts.map +1 -0
  99. package/dist/core/__tests__/error-predictor.test.js +65 -0
  100. package/dist/core/__tests__/error-predictor.test.js.map +1 -0
  101. package/dist/core/__tests__/explainability.test.d.ts +2 -0
  102. package/dist/core/__tests__/explainability.test.d.ts.map +1 -0
  103. package/dist/core/__tests__/explainability.test.js +112 -0
  104. package/dist/core/__tests__/explainability.test.js.map +1 -0
  105. package/dist/core/__tests__/failure-memory.test.d.ts +2 -0
  106. package/dist/core/__tests__/failure-memory.test.d.ts.map +1 -0
  107. package/dist/core/__tests__/failure-memory.test.js +124 -0
  108. package/dist/core/__tests__/failure-memory.test.js.map +1 -0
  109. package/dist/core/__tests__/git-branch-pregenerator.test.d.ts +2 -0
  110. package/dist/core/__tests__/git-branch-pregenerator.test.d.ts.map +1 -0
  111. package/dist/core/__tests__/git-branch-pregenerator.test.js +44 -0
  112. package/dist/core/__tests__/git-branch-pregenerator.test.js.map +1 -0
  113. package/dist/core/__tests__/handoff-detector.test.d.ts +2 -0
  114. package/dist/core/__tests__/handoff-detector.test.d.ts.map +1 -0
  115. package/dist/core/__tests__/handoff-detector.test.js +71 -0
  116. package/dist/core/__tests__/handoff-detector.test.js.map +1 -0
  117. package/dist/core/__tests__/interruption-recovery.test.d.ts +2 -0
  118. package/dist/core/__tests__/interruption-recovery.test.d.ts.map +1 -0
  119. package/dist/core/__tests__/interruption-recovery.test.js +66 -0
  120. package/dist/core/__tests__/interruption-recovery.test.js.map +1 -0
  121. package/dist/core/__tests__/knowledge-graph.test.d.ts +1 -0
  122. package/dist/core/__tests__/knowledge-graph.test.d.ts.map +1 -0
  123. package/dist/core/__tests__/knowledge-graph.test.js +124 -0
  124. package/dist/core/__tests__/knowledge-graph.test.js.map +1 -0
  125. package/dist/core/__tests__/knowledge-silo-detector.test.d.ts +2 -0
  126. package/dist/core/__tests__/knowledge-silo-detector.test.d.ts.map +1 -0
  127. package/dist/core/__tests__/knowledge-silo-detector.test.js +77 -0
  128. package/dist/core/__tests__/knowledge-silo-detector.test.js.map +1 -0
  129. package/dist/core/__tests__/language-switch-assistant.test.d.ts +2 -0
  130. package/dist/core/__tests__/language-switch-assistant.test.d.ts.map +1 -0
  131. package/dist/core/__tests__/language-switch-assistant.test.js +34 -0
  132. package/dist/core/__tests__/language-switch-assistant.test.js.map +1 -0
  133. package/dist/core/__tests__/marketplace.test.d.ts +2 -0
  134. package/dist/core/__tests__/marketplace.test.d.ts.map +1 -0
  135. package/dist/core/__tests__/marketplace.test.js +96 -0
  136. package/dist/core/__tests__/marketplace.test.js.map +1 -0
  137. package/dist/core/__tests__/merge-conflict-predictor.test.d.ts +2 -0
  138. package/dist/core/__tests__/merge-conflict-predictor.test.d.ts.map +1 -0
  139. package/dist/core/__tests__/merge-conflict-predictor.test.js +36 -0
  140. package/dist/core/__tests__/merge-conflict-predictor.test.js.map +1 -0
  141. package/dist/core/__tests__/next-action-predictor.test.d.ts +2 -0
  142. package/dist/core/__tests__/next-action-predictor.test.d.ts.map +1 -0
  143. package/dist/core/__tests__/next-action-predictor.test.js +57 -0
  144. package/dist/core/__tests__/next-action-predictor.test.js.map +1 -0
  145. package/dist/core/__tests__/offline-queue.test.d.ts +2 -0
  146. package/dist/core/__tests__/offline-queue.test.d.ts.map +1 -0
  147. package/dist/core/__tests__/offline-queue.test.js +84 -0
  148. package/dist/core/__tests__/offline-queue.test.js.map +1 -0
  149. package/dist/core/__tests__/organization-memory.test.d.ts +2 -0
  150. package/dist/core/__tests__/organization-memory.test.d.ts.map +1 -0
  151. package/dist/core/__tests__/organization-memory.test.js +89 -0
  152. package/dist/core/__tests__/organization-memory.test.js.map +1 -0
  153. package/dist/core/__tests__/pattern-utils.test.d.ts +2 -0
  154. package/dist/core/__tests__/pattern-utils.test.d.ts.map +1 -0
  155. package/dist/core/__tests__/pattern-utils.test.js +52 -0
  156. package/dist/core/__tests__/pattern-utils.test.js.map +1 -0
  157. package/dist/core/__tests__/performance-predictor.test.d.ts +2 -0
  158. package/dist/core/__tests__/performance-predictor.test.d.ts.map +1 -0
  159. package/dist/core/__tests__/performance-predictor.test.js +60 -0
  160. package/dist/core/__tests__/performance-predictor.test.js.map +1 -0
  161. package/dist/core/__tests__/playbook-generator.test.d.ts +2 -0
  162. package/dist/core/__tests__/playbook-generator.test.d.ts.map +1 -0
  163. package/dist/core/__tests__/playbook-generator.test.js +94 -0
  164. package/dist/core/__tests__/playbook-generator.test.js.map +1 -0
  165. package/dist/core/__tests__/pr-review-assistant.test.d.ts +2 -0
  166. package/dist/core/__tests__/pr-review-assistant.test.d.ts.map +1 -0
  167. package/dist/core/__tests__/pr-review-assistant.test.js +35 -0
  168. package/dist/core/__tests__/pr-review-assistant.test.js.map +1 -0
  169. package/dist/core/__tests__/privacy-manager.test.d.ts +2 -0
  170. package/dist/core/__tests__/privacy-manager.test.d.ts.map +1 -0
  171. package/dist/core/__tests__/privacy-manager.test.js +97 -0
  172. package/dist/core/__tests__/privacy-manager.test.js.map +1 -0
  173. package/dist/core/__tests__/project-dna.test.d.ts +2 -0
  174. package/dist/core/__tests__/project-dna.test.d.ts.map +1 -0
  175. package/dist/core/__tests__/project-dna.test.js +135 -0
  176. package/dist/core/__tests__/project-dna.test.js.map +1 -0
  177. package/dist/core/__tests__/regex-extractor.test.d.ts +2 -0
  178. package/dist/core/__tests__/regex-extractor.test.d.ts.map +1 -0
  179. package/dist/core/__tests__/regex-extractor.test.js +49 -0
  180. package/dist/core/__tests__/regex-extractor.test.js.map +1 -0
  181. package/dist/core/__tests__/reputation.test.d.ts +2 -0
  182. package/dist/core/__tests__/reputation.test.d.ts.map +1 -0
  183. package/dist/core/__tests__/reputation.test.js +100 -0
  184. package/dist/core/__tests__/reputation.test.js.map +1 -0
  185. package/dist/core/__tests__/security-predictor.test.d.ts +2 -0
  186. package/dist/core/__tests__/security-predictor.test.d.ts.map +1 -0
  187. package/dist/core/__tests__/security-predictor.test.js +60 -0
  188. package/dist/core/__tests__/security-predictor.test.js.map +1 -0
  189. package/dist/core/__tests__/signal-capture.test.d.ts +2 -0
  190. package/dist/core/__tests__/signal-capture.test.d.ts.map +1 -0
  191. package/dist/core/__tests__/signal-capture.test.js +98 -0
  192. package/dist/core/__tests__/signal-capture.test.js.map +1 -0
  193. package/dist/core/__tests__/solution-index.test.d.ts +2 -0
  194. package/dist/core/__tests__/solution-index.test.d.ts.map +1 -0
  195. package/dist/core/__tests__/solution-index.test.js +78 -0
  196. package/dist/core/__tests__/solution-index.test.js.map +1 -0
  197. package/dist/core/__tests__/standup-generator.test.d.ts +2 -0
  198. package/dist/core/__tests__/standup-generator.test.d.ts.map +1 -0
  199. package/dist/core/__tests__/standup-generator.test.js +46 -0
  200. package/dist/core/__tests__/standup-generator.test.js.map +1 -0
  201. package/dist/core/__tests__/team-composer.test.d.ts +2 -0
  202. package/dist/core/__tests__/team-composer.test.d.ts.map +1 -0
  203. package/dist/core/__tests__/team-composer.test.js +113 -0
  204. package/dist/core/__tests__/team-composer.test.js.map +1 -0
  205. package/dist/core/__tests__/test-anticipator.test.d.ts +2 -0
  206. package/dist/core/__tests__/test-anticipator.test.d.ts.map +1 -0
  207. package/dist/core/__tests__/test-anticipator.test.js +41 -0
  208. package/dist/core/__tests__/test-anticipator.test.js.map +1 -0
  209. package/dist/core/__tests__/time-saved.test.d.ts +1 -0
  210. package/dist/core/__tests__/time-saved.test.d.ts.map +1 -0
  211. package/dist/core/__tests__/time-saved.test.js +93 -0
  212. package/dist/core/__tests__/time-saved.test.js.map +1 -0
  213. package/dist/core/__tests__/validation-run.test.d.ts +7 -0
  214. package/dist/core/__tests__/validation-run.test.d.ts.map +1 -0
  215. package/dist/core/__tests__/validation-run.test.js +510 -0
  216. package/dist/core/__tests__/validation-run.test.js.map +1 -0
  217. package/dist/core/__tests__/workflow-outcome-graph.test.d.ts +2 -0
  218. package/dist/core/__tests__/workflow-outcome-graph.test.d.ts.map +1 -0
  219. package/dist/core/__tests__/workflow-outcome-graph.test.js +89 -0
  220. package/dist/core/__tests__/workflow-outcome-graph.test.js.map +1 -0
  221. package/dist/core/ai-memory.d.ts +84 -0
  222. package/dist/core/ai-memory.d.ts.map +1 -0
  223. package/dist/core/ai-memory.js +238 -0
  224. package/dist/core/ai-memory.js.map +1 -0
  225. package/dist/core/architecture-engine.d.ts +104 -0
  226. package/dist/core/architecture-engine.d.ts.map +1 -0
  227. package/dist/core/architecture-engine.js +216 -0
  228. package/dist/core/architecture-engine.js.map +1 -0
  229. package/dist/core/ast-differ.d.ts +15 -0
  230. package/dist/core/ast-differ.d.ts.map +1 -0
  231. package/dist/core/ast-differ.js +528 -0
  232. package/dist/core/ast-differ.js.map +1 -0
  233. package/dist/core/ast-extractor.d.ts +1 -1
  234. package/dist/core/ast-extractor.d.ts.map +1 -1
  235. package/dist/core/ast-extractor.js +7 -5
  236. package/dist/core/ast-extractor.js.map +1 -1
  237. package/dist/core/backend-engine.d.ts +40 -0
  238. package/dist/core/backend-engine.d.ts.map +1 -0
  239. package/dist/core/backend-engine.js +131 -0
  240. package/dist/core/backend-engine.js.map +1 -0
  241. package/dist/core/blind-spot-engine.d.ts +29 -0
  242. package/dist/core/blind-spot-engine.d.ts.map +1 -0
  243. package/dist/core/blind-spot-engine.js +579 -0
  244. package/dist/core/blind-spot-engine.js.map +1 -0
  245. package/dist/core/build-failure-predictor.d.ts +4 -0
  246. package/dist/core/build-failure-predictor.d.ts.map +1 -1
  247. package/dist/core/build-failure-predictor.js +111 -58
  248. package/dist/core/build-failure-predictor.js.map +1 -1
  249. package/dist/core/cell-store.d.ts +72 -0
  250. package/dist/core/cell-store.d.ts.map +1 -0
  251. package/dist/core/cell-store.js +171 -0
  252. package/dist/core/cell-store.js.map +1 -0
  253. package/dist/core/community-advanced-engine.d.ts +30 -0
  254. package/dist/core/community-advanced-engine.d.ts.map +1 -0
  255. package/dist/core/community-advanced-engine.js +103 -0
  256. package/dist/core/community-advanced-engine.js.map +1 -0
  257. package/dist/core/community-engine.d.ts +62 -0
  258. package/dist/core/community-engine.d.ts.map +1 -0
  259. package/dist/core/community-engine.js +194 -0
  260. package/dist/core/community-engine.js.map +1 -0
  261. package/dist/core/community-full.d.ts +2 -3
  262. package/dist/core/community-full.d.ts.map +1 -1
  263. package/dist/core/community-full.js +2 -5
  264. package/dist/core/community-full.js.map +1 -1
  265. package/dist/core/community-intelligence.d.ts +169 -0
  266. package/dist/core/community-intelligence.d.ts.map +1 -0
  267. package/dist/core/community-intelligence.js +527 -0
  268. package/dist/core/community-intelligence.js.map +1 -0
  269. package/dist/core/community-live.d.ts +1 -0
  270. package/dist/core/community-live.d.ts.map +1 -1
  271. package/dist/core/community-live.js +9 -6
  272. package/dist/core/community-live.js.map +1 -1
  273. package/dist/core/community-prior.d.ts +1 -0
  274. package/dist/core/community-prior.d.ts.map +1 -1
  275. package/dist/core/community-prior.js +18 -10
  276. package/dist/core/community-prior.js.map +1 -1
  277. package/dist/core/confidence-engine.d.ts +2 -3
  278. package/dist/core/confidence-engine.d.ts.map +1 -1
  279. package/dist/core/confidence-engine.js +29 -32
  280. package/dist/core/confidence-engine.js.map +1 -1
  281. package/dist/core/conflict-detector.js +1 -1
  282. package/dist/core/conflict-detector.js.map +1 -1
  283. package/dist/core/convention-detector.d.ts +37 -0
  284. package/dist/core/convention-detector.d.ts.map +1 -0
  285. package/dist/core/convention-detector.js +189 -0
  286. package/dist/core/convention-detector.js.map +1 -0
  287. package/dist/core/cost-optimizer.d.ts +78 -0
  288. package/dist/core/cost-optimizer.d.ts.map +1 -0
  289. package/dist/core/cost-optimizer.js +257 -0
  290. package/dist/core/cost-optimizer.js.map +1 -0
  291. package/dist/core/cross-domain-projections.js +2 -2
  292. package/dist/core/cross-layer-intelligence.d.ts +375 -0
  293. package/dist/core/cross-layer-intelligence.d.ts.map +1 -0
  294. package/dist/core/cross-layer-intelligence.js +690 -0
  295. package/dist/core/cross-layer-intelligence.js.map +1 -0
  296. package/dist/core/developer-profile.d.ts +6 -0
  297. package/dist/core/developer-profile.d.ts.map +1 -0
  298. package/dist/core/developer-profile.js +78 -0
  299. package/dist/core/developer-profile.js.map +1 -0
  300. package/dist/core/error-predictor.d.ts +5 -2
  301. package/dist/core/error-predictor.d.ts.map +1 -1
  302. package/dist/core/error-predictor.js +124 -40
  303. package/dist/core/error-predictor.js.map +1 -1
  304. package/dist/core/explainability.d.ts +33 -0
  305. package/dist/core/explainability.d.ts.map +1 -0
  306. package/dist/core/explainability.js +131 -0
  307. package/dist/core/explainability.js.map +1 -0
  308. package/dist/core/extraction-cascade.d.ts +19 -5
  309. package/dist/core/extraction-cascade.d.ts.map +1 -1
  310. package/dist/core/extraction-cascade.js +86 -15
  311. package/dist/core/extraction-cascade.js.map +1 -1
  312. package/dist/core/failure-memory.d.ts +38 -0
  313. package/dist/core/failure-memory.d.ts.map +1 -0
  314. package/dist/core/failure-memory.js +113 -0
  315. package/dist/core/failure-memory.js.map +1 -0
  316. package/dist/core/frontend-engine.d.ts +40 -0
  317. package/dist/core/frontend-engine.d.ts.map +1 -0
  318. package/dist/core/frontend-engine.js +129 -0
  319. package/dist/core/frontend-engine.js.map +1 -0
  320. package/dist/core/go-extractor.d.ts +5 -0
  321. package/dist/core/go-extractor.d.ts.map +1 -0
  322. package/dist/core/go-extractor.js +68 -0
  323. package/dist/core/go-extractor.js.map +1 -0
  324. package/dist/core/identity-resolver.d.ts.map +1 -1
  325. package/dist/core/identity-resolver.js +16 -31
  326. package/dist/core/identity-resolver.js.map +1 -1
  327. package/dist/core/knowledge-graph-engine.d.ts +62 -0
  328. package/dist/core/knowledge-graph-engine.d.ts.map +1 -0
  329. package/dist/core/knowledge-graph-engine.js +176 -0
  330. package/dist/core/knowledge-graph-engine.js.map +1 -0
  331. package/dist/core/knowledge-graph.d.ts +229 -0
  332. package/dist/core/knowledge-graph.d.ts.map +1 -0
  333. package/dist/core/knowledge-graph.js +713 -0
  334. package/dist/core/knowledge-graph.js.map +1 -0
  335. package/dist/core/language-switch-assistant.d.ts.map +1 -1
  336. package/dist/core/language-switch-assistant.js +4 -1
  337. package/dist/core/language-switch-assistant.js.map +1 -1
  338. package/dist/core/learning-layer.d.ts +11 -0
  339. package/dist/core/learning-layer.d.ts.map +1 -0
  340. package/dist/core/learning-layer.js +25 -0
  341. package/dist/core/learning-layer.js.map +1 -0
  342. package/dist/core/marketplace.d.ts +43 -0
  343. package/dist/core/marketplace.d.ts.map +1 -0
  344. package/dist/core/marketplace.js +133 -0
  345. package/dist/core/marketplace.js.map +1 -0
  346. package/dist/core/memory-store.d.ts +59 -0
  347. package/dist/core/memory-store.d.ts.map +1 -0
  348. package/dist/core/memory-store.js +151 -0
  349. package/dist/core/memory-store.js.map +1 -0
  350. package/dist/core/naming-engine.d.ts +43 -0
  351. package/dist/core/naming-engine.d.ts.map +1 -0
  352. package/dist/core/naming-engine.js +120 -0
  353. package/dist/core/naming-engine.js.map +1 -0
  354. package/dist/core/org-intelligence.d.ts +151 -0
  355. package/dist/core/org-intelligence.d.ts.map +1 -0
  356. package/dist/core/org-intelligence.js +490 -0
  357. package/dist/core/org-intelligence.js.map +1 -0
  358. package/dist/core/organization-memory.d.ts +34 -0
  359. package/dist/core/organization-memory.d.ts.map +1 -0
  360. package/dist/core/organization-memory.js +148 -0
  361. package/dist/core/organization-memory.js.map +1 -0
  362. package/dist/core/outcome-engine.d.ts +21 -0
  363. package/dist/core/outcome-engine.d.ts.map +1 -0
  364. package/dist/core/outcome-engine.js +220 -0
  365. package/dist/core/outcome-engine.js.map +1 -0
  366. package/dist/core/outcome-recorder.d.ts +34 -0
  367. package/dist/core/outcome-recorder.d.ts.map +1 -0
  368. package/dist/core/outcome-recorder.js +109 -0
  369. package/dist/core/outcome-recorder.js.map +1 -0
  370. package/dist/core/outcome-store.d.ts +21 -0
  371. package/dist/core/outcome-store.d.ts.map +1 -0
  372. package/dist/core/outcome-store.js +120 -0
  373. package/dist/core/outcome-store.js.map +1 -0
  374. package/dist/core/outcome-types.d.ts +64 -0
  375. package/dist/core/outcome-types.d.ts.map +1 -0
  376. package/dist/core/outcome-types.js +20 -0
  377. package/dist/core/outcome-types.js.map +1 -0
  378. package/dist/core/pattern-classifier.d.ts +11 -0
  379. package/dist/core/pattern-classifier.d.ts.map +1 -0
  380. package/dist/core/pattern-classifier.js +82 -0
  381. package/dist/core/pattern-classifier.js.map +1 -0
  382. package/dist/core/pattern-lifecycle.d.ts +8 -0
  383. package/dist/core/pattern-lifecycle.d.ts.map +1 -0
  384. package/dist/core/pattern-lifecycle.js +25 -0
  385. package/dist/core/pattern-lifecycle.js.map +1 -0
  386. package/dist/core/pattern-quality.d.ts +6 -0
  387. package/dist/core/pattern-quality.d.ts.map +1 -0
  388. package/dist/core/pattern-quality.js +45 -0
  389. package/dist/core/pattern-quality.js.map +1 -0
  390. package/dist/core/pattern-ranking.d.ts +8 -0
  391. package/dist/core/pattern-ranking.d.ts.map +1 -0
  392. package/dist/core/pattern-ranking.js +40 -0
  393. package/dist/core/pattern-ranking.js.map +1 -0
  394. package/dist/core/pattern-relationships.d.ts +16 -0
  395. package/dist/core/pattern-relationships.d.ts.map +1 -0
  396. package/dist/core/pattern-relationships.js +66 -0
  397. package/dist/core/pattern-relationships.js.map +1 -0
  398. package/dist/core/pattern-search.d.ts +25 -0
  399. package/dist/core/pattern-search.d.ts.map +1 -0
  400. package/dist/core/pattern-search.js +82 -0
  401. package/dist/core/pattern-search.js.map +1 -0
  402. package/dist/core/pattern-store.d.ts +18 -3
  403. package/dist/core/pattern-store.d.ts.map +1 -1
  404. package/dist/core/pattern-store.js +155 -54
  405. package/dist/core/pattern-store.js.map +1 -1
  406. package/dist/core/{enterprise-features.d.ts → pattern-utils.d.ts} +2 -4
  407. package/dist/core/pattern-utils.d.ts.map +1 -0
  408. package/dist/core/{enterprise-features.js → pattern-utils.js} +4 -24
  409. package/dist/core/pattern-utils.js.map +1 -0
  410. package/dist/core/pattern-validator.d.ts +14 -0
  411. package/dist/core/pattern-validator.d.ts.map +1 -0
  412. package/dist/core/pattern-validator.js +47 -0
  413. package/dist/core/pattern-validator.js.map +1 -0
  414. package/dist/core/performance-predictor.d.ts +4 -0
  415. package/dist/core/performance-predictor.d.ts.map +1 -1
  416. package/dist/core/performance-predictor.js +143 -38
  417. package/dist/core/performance-predictor.js.map +1 -1
  418. package/dist/core/platt-calibration.d.ts.map +1 -1
  419. package/dist/core/platt-calibration.js +5 -3
  420. package/dist/core/platt-calibration.js.map +1 -1
  421. package/dist/core/playbook-generator.d.ts +21 -0
  422. package/dist/core/playbook-generator.d.ts.map +1 -0
  423. package/dist/core/playbook-generator.js +161 -0
  424. package/dist/core/playbook-generator.js.map +1 -0
  425. package/dist/core/privacy-manager.d.ts +43 -0
  426. package/dist/core/privacy-manager.d.ts.map +1 -0
  427. package/dist/core/privacy-manager.js +131 -0
  428. package/dist/core/privacy-manager.js.map +1 -0
  429. package/dist/core/productivity-engine.d.ts +57 -0
  430. package/dist/core/productivity-engine.d.ts.map +1 -0
  431. package/dist/core/productivity-engine.js +138 -0
  432. package/dist/core/productivity-engine.js.map +1 -0
  433. package/dist/core/project-dna-types.d.ts +150 -0
  434. package/dist/core/project-dna-types.d.ts.map +1 -0
  435. package/dist/core/project-dna-types.js +3 -0
  436. package/dist/core/project-dna-types.js.map +1 -0
  437. package/dist/core/project-dna.d.ts +122 -0
  438. package/dist/core/project-dna.d.ts.map +1 -0
  439. package/dist/core/project-dna.js +922 -0
  440. package/dist/core/project-dna.js.map +1 -0
  441. package/dist/core/python-extractor.d.ts +5 -0
  442. package/dist/core/python-extractor.d.ts.map +1 -0
  443. package/dist/core/python-extractor.js +68 -0
  444. package/dist/core/python-extractor.js.map +1 -0
  445. package/dist/core/realtime-guardian.d.ts.map +1 -1
  446. package/dist/core/realtime-guardian.js +1 -3
  447. package/dist/core/realtime-guardian.js.map +1 -1
  448. package/dist/core/recommendation-engine.d.ts +9 -0
  449. package/dist/core/recommendation-engine.d.ts.map +1 -0
  450. package/dist/core/recommendation-engine.js +152 -0
  451. package/dist/core/recommendation-engine.js.map +1 -0
  452. package/dist/core/recommendation-store.d.ts +21 -0
  453. package/dist/core/recommendation-store.d.ts.map +1 -0
  454. package/dist/core/recommendation-store.js +125 -0
  455. package/dist/core/recommendation-store.js.map +1 -0
  456. package/dist/core/recommendation-types.d.ts +54 -0
  457. package/dist/core/recommendation-types.d.ts.map +1 -0
  458. package/dist/core/recommendation-types.js +3 -0
  459. package/dist/core/recommendation-types.js.map +1 -0
  460. package/dist/core/regex-extractor.js +1 -1
  461. package/dist/core/regex-extractor.js.map +1 -1
  462. package/dist/core/reputation.d.ts +42 -0
  463. package/dist/core/reputation.d.ts.map +1 -0
  464. package/dist/core/reputation.js +173 -0
  465. package/dist/core/reputation.js.map +1 -0
  466. package/dist/core/scale-tester.d.ts +2 -2
  467. package/dist/core/scale-tester.d.ts.map +1 -1
  468. package/dist/core/scale-tester.js +12 -1
  469. package/dist/core/scale-tester.js.map +1 -1
  470. package/dist/core/search-engine.d.ts +37 -0
  471. package/dist/core/search-engine.d.ts.map +1 -0
  472. package/dist/core/search-engine.js +223 -0
  473. package/dist/core/search-engine.js.map +1 -0
  474. package/dist/core/security-predictor.d.ts +2 -1
  475. package/dist/core/security-predictor.d.ts.map +1 -1
  476. package/dist/core/security-predictor.js +80 -30
  477. package/dist/core/security-predictor.js.map +1 -1
  478. package/dist/core/session-recovery.js +8 -8
  479. package/dist/core/session-recovery.js.map +1 -1
  480. package/dist/core/similarity-engine.d.ts +8 -0
  481. package/dist/core/similarity-engine.d.ts.map +1 -0
  482. package/dist/core/similarity-engine.js +74 -0
  483. package/dist/core/similarity-engine.js.map +1 -0
  484. package/dist/core/structure-engine.d.ts +34 -0
  485. package/dist/core/structure-engine.d.ts.map +1 -0
  486. package/dist/core/structure-engine.js +114 -0
  487. package/dist/core/structure-engine.js.map +1 -0
  488. package/dist/core/syntax-engine.d.ts +101 -0
  489. package/dist/core/syntax-engine.d.ts.map +1 -0
  490. package/dist/core/syntax-engine.js +342 -0
  491. package/dist/core/syntax-engine.js.map +1 -0
  492. package/dist/core/team-advanced-engine.d.ts +19 -0
  493. package/dist/core/team-advanced-engine.d.ts.map +1 -0
  494. package/dist/core/team-advanced-engine.js +91 -0
  495. package/dist/core/team-advanced-engine.js.map +1 -0
  496. package/dist/core/team-engine.d.ts +59 -0
  497. package/dist/core/team-engine.d.ts.map +1 -0
  498. package/dist/core/team-engine.js +141 -0
  499. package/dist/core/team-engine.js.map +1 -0
  500. package/dist/core/time-saved.d.ts +51 -0
  501. package/dist/core/time-saved.d.ts.map +1 -0
  502. package/dist/core/time-saved.js +97 -0
  503. package/dist/core/time-saved.js.map +1 -0
  504. package/dist/core/workflow-outcome-graph.d.ts +46 -0
  505. package/dist/core/workflow-outcome-graph.d.ts.map +1 -0
  506. package/dist/core/workflow-outcome-graph.js +168 -0
  507. package/dist/core/workflow-outcome-graph.js.map +1 -0
  508. package/dist/core/workflow-tracker.d.ts +36 -0
  509. package/dist/core/workflow-tracker.d.ts.map +1 -0
  510. package/dist/core/workflow-tracker.js +99 -0
  511. package/dist/core/workflow-tracker.js.map +1 -0
  512. package/dist/core/ws-client.d.ts +24 -0
  513. package/dist/core/ws-client.d.ts.map +1 -0
  514. package/dist/core/ws-client.js +203 -0
  515. package/dist/core/ws-client.js.map +1 -0
  516. package/dist/daemon/lifecycle.d.ts.map +1 -1
  517. package/dist/daemon/lifecycle.js +9 -10
  518. package/dist/daemon/lifecycle.js.map +1 -1
  519. package/dist/daemon/server.d.ts +4 -2
  520. package/dist/daemon/server.d.ts.map +1 -1
  521. package/dist/daemon/server.js +886 -73
  522. package/dist/daemon/server.js.map +1 -1
  523. package/dist/daemon/watchdog.js +2 -1
  524. package/dist/daemon/watchdog.js.map +1 -1
  525. package/dist/index.d.ts +21 -2
  526. package/dist/index.d.ts.map +1 -1
  527. package/dist/index.js +37 -4
  528. package/dist/index.js.map +1 -1
  529. package/dist/store.d.ts +4 -0
  530. package/dist/store.d.ts.map +1 -0
  531. package/dist/store.js +47 -0
  532. package/dist/store.js.map +1 -0
  533. package/dist/types.d.ts +60 -1
  534. package/dist/types.d.ts.map +1 -1
  535. package/dist/types.js +13 -2
  536. package/dist/types.js.map +1 -1
  537. package/dist/validation/quick-run.d.ts +7 -0
  538. package/dist/validation/quick-run.d.ts.map +1 -0
  539. package/dist/validation/quick-run.js +404 -0
  540. package/dist/validation/quick-run.js.map +1 -0
  541. package/package.json +87 -53
  542. package/CHANGELOG.md +0 -32
  543. package/CONTRIBUTING.md +0 -60
  544. package/dist/core/cell-pro.d.ts +0 -28
  545. package/dist/core/cell-pro.d.ts.map +0 -1
  546. package/dist/core/cell-pro.js +0 -70
  547. package/dist/core/cell-pro.js.map +0 -1
  548. package/dist/core/enterprise-features.d.ts.map +0 -1
  549. package/dist/core/enterprise-features.js.map +0 -1
  550. package/dist/core/enterprise.d.ts +0 -27
  551. package/dist/core/enterprise.d.ts.map +0 -1
  552. package/dist/core/enterprise.js +0 -41
  553. package/dist/core/enterprise.js.map +0 -1
  554. package/extensions/jetbrains/plugin.json +0 -9
  555. package/extensions/shell/copilot-sync.js +0 -59
  556. package/extensions/shell/install.sh +0 -38
  557. package/extensions/shell/watcher.js +0 -113
  558. package/extensions/vscode/.vscodeignore +0 -5
  559. package/extensions/vscode/dist/daemon-client.js +0 -94
  560. package/extensions/vscode/dist/diff-tracker.js +0 -94
  561. package/extensions/vscode/dist/extension.js +0 -100
  562. package/extensions/vscode/dist/status-bar.js +0 -70
  563. package/extensions/vscode/package-lock.json +0 -40
  564. package/extensions/vscode/package.json +0 -27
  565. package/packages/mcp-server/dist/server.d.ts +0 -2
  566. package/packages/mcp-server/dist/server.js +0 -213
  567. package/packages/mcp-server/package-lock.json +0 -970
  568. package/packages/mcp-server/package.json +0 -19
@@ -0,0 +1,269 @@
1
+ "use strict";
2
+ /**
3
+ * CHAPTER 4 — HOSTILE VERIFICATION
4
+ *
5
+ * Three tests the founder specifically demanded:
6
+ *
7
+ * Test 1: Not just language filter — outcome-driven differentiation
8
+ * Test 2: Cold start — new developer with no history
9
+ * Test 3: Behavior change — same dev, different outcomes
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const developer_profile_1 = require("../developer-profile");
13
+ const recommendation_engine_1 = require("../recommendation-engine");
14
+ let hvPass = 0;
15
+ let hvFail = 0;
16
+ const hvErrors = [];
17
+ function check(cond, msg) {
18
+ if (cond) {
19
+ hvPass++;
20
+ console.log(` ✅ ${msg}`);
21
+ }
22
+ else {
23
+ hvFail++;
24
+ const m = ` ❌ FAIL: ${msg}`;
25
+ console.log(m);
26
+ hvErrors.push(m);
27
+ }
28
+ }
29
+ function eq(a, b, msg) {
30
+ if (a === b) {
31
+ hvPass++;
32
+ console.log(` ✅ ${msg} (${JSON.stringify(a)})`);
33
+ }
34
+ else {
35
+ hvFail++;
36
+ const m = ` ❌ FAIL: ${msg} — expected ${JSON.stringify(b)}, got ${JSON.stringify(a)}`;
37
+ console.log(m);
38
+ hvErrors.push(m);
39
+ }
40
+ }
41
+ function gt(a, b, msg) {
42
+ if (a > b) {
43
+ hvPass++;
44
+ console.log(` ✅ ${msg} (${a} > ${b})`);
45
+ }
46
+ else {
47
+ hvFail++;
48
+ const m = ` ❌ FAIL: ${msg} — ${a} not > ${b}`;
49
+ console.log(m);
50
+ hvErrors.push(m);
51
+ }
52
+ }
53
+ function makePattern(id, category, language) {
54
+ return {
55
+ patternId: id, category, description: `Pattern ${id}`, from: 'old', to: 'new',
56
+ conditions: [{ type: 'language', value: language, matchScore: 1 }],
57
+ confidence: { distribution: 'beta', alpha: 5, beta: 2, mean: 0.7, ci95: [0.4, 0.9] },
58
+ signals: { positive: 10, negative: 2, total: 12, lastSignal: Date.now() },
59
+ attribution: { primaryCondition: '', conditionConfidence: 0, sourceFiles: [], note: '' },
60
+ scope: 'global', survivedDays: 30,
61
+ meta: { language, subcategory: 'general', complexity: 'low', risk: 'low', source: 'manual' },
62
+ lifecycle: { firstSeen: Date.now() - 86400000, lastSeen: Date.now(), version: 1, history: [] },
63
+ quality: { score: 80, reuseRate: 0.5, successRate: 0.8, failureRate: 0.2, acceptanceRate: 0.8, daysSinceLastSignal: 1, age: 30 },
64
+ relationships: { related: [], conflicting: [], complementary: [], dependencies: [] },
65
+ ranking: { score: 80, rank: 1, factors: { confidence: 70, quality: 80, usage: 60, recency: 90, acceptance: 80 } },
66
+ };
67
+ }
68
+ function makeOutcome(pid, sr, usage = 10) {
69
+ const sc = Math.round(usage * sr);
70
+ return {
71
+ patternId: pid, usageCount: usage, successCount: sc, failureCount: usage - sc,
72
+ acceptanceCount: Math.round(usage * 0.8), rejectionCount: Math.round(usage * 0.2),
73
+ lastOutcome: sr > 0.5 ? 'PATTERN_SUCCESS' : 'PATTERN_FAILURE',
74
+ lastSuccessTimestamp: sr > 0.5 ? Date.now() : null,
75
+ lastFailureTimestamp: sr <= 0.5 ? Date.now() : null,
76
+ successRate: sr, failureRate: 1 - sr, acceptanceRate: 0.8,
77
+ confidence: 0.5 + sr * 0.4,
78
+ trend: sr > 0.7 ? 'rising' : 'declining',
79
+ health: Math.round(sr * 100),
80
+ firstSeen: Date.now() - 86400000, lastSeen: Date.now(),
81
+ };
82
+ }
83
+ describe('CHAPTER 4 — HOSTILE VERIFICATION', () => {
84
+ afterAll(() => {
85
+ console.log('\n' + '='.repeat(60));
86
+ console.log('HOSTILE VERDICT');
87
+ console.log('='.repeat(60));
88
+ console.log(` Passed: ${hvPass}`);
89
+ console.log(` Failed: ${hvFail}`);
90
+ console.log(` Total: ${hvPass + hvFail}\n`);
91
+ if (hvFail === 0) {
92
+ console.log(' 🔒 CHAPTER 4 — PASSED');
93
+ }
94
+ else {
95
+ console.log(` ❌ ${hvFail} FAILURES:`);
96
+ for (const e of hvErrors)
97
+ console.log(` ${e}`);
98
+ }
99
+ });
100
+ // ======================================================================
101
+ // TEST 1: Not just language filter — outcome-driven differentiation
102
+ // ======================================================================
103
+ //
104
+ // Create 2 developers who BOTH use TypeScript AND Python.
105
+ // Difference: Dev A succeeds at TypeScript, fails at Python.
106
+ // Dev B succeeds at Python, fails at TypeScript.
107
+ //
108
+ // If recs are based on outcomes (not language filter):
109
+ // Dev A should get TypeScript patterns recommended
110
+ // Dev B should get Python patterns recommended
111
+ //
112
+ // If recs are based on language filter ONLY:
113
+ // Both would get same recommendations
114
+ test('HV1: Outcome-driven, not language-filter-only', () => {
115
+ console.log('\n--- TEST 1: Outcome-driven (not language filter) ---\n');
116
+ // All 4 patterns — same 2 languages, same 2 categories
117
+ const patterns = [
118
+ makePattern('ts_test_a', 'testing', 'typescript'),
119
+ makePattern('ts_test_b', 'testing', 'typescript'),
120
+ makePattern('py_data_a', 'data', 'python'),
121
+ makePattern('py_data_b', 'data', 'python'),
122
+ ];
123
+ // Dev A: TypeScript succeeds, Python fails
124
+ const outcomesA = new Map();
125
+ outcomesA.set('ts_test_a', makeOutcome('ts_test_a', 0.9, 20));
126
+ outcomesA.set('ts_test_b', makeOutcome('ts_test_b', 0.85, 15));
127
+ outcomesA.set('py_data_a', makeOutcome('py_data_a', 0.2, 10));
128
+ outcomesA.set('py_data_b', makeOutcome('py_data_b', 0.3, 12));
129
+ // Dev B: Python succeeds, TypeScript fails
130
+ const outcomesB = new Map();
131
+ outcomesB.set('ts_test_a', makeOutcome('ts_test_a', 0.2, 10));
132
+ outcomesB.set('ts_test_b', makeOutcome('ts_test_b', 0.3, 12));
133
+ outcomesB.set('py_data_a', makeOutcome('py_data_a', 0.9, 20));
134
+ outcomesB.set('py_data_b', makeOutcome('py_data_b', 0.85, 15));
135
+ const profileA = (0, developer_profile_1.buildProfile)('dev_A', patterns, outcomesA);
136
+ const profileB = (0, developer_profile_1.buildProfile)('dev_B', patterns, outcomesB);
137
+ console.log(` Dev A: TS success=${outcomesA.get('ts_test_a').successRate}, PY success=${outcomesA.get('py_data_a').successRate}`);
138
+ console.log(` Dev B: TS success=${outcomesB.get('ts_test_a').successRate}, PY success=${outcomesB.get('py_data_a').successRate}`);
139
+ const allProfiles = new Map();
140
+ allProfiles.set('dev_A', profileA);
141
+ allProfiles.set('dev_B', profileB);
142
+ const resultA = (0, recommendation_engine_1.recommendPatterns)('dev_A', patterns, outcomesA, allProfiles);
143
+ const resultB = (0, recommendation_engine_1.recommendPatterns)('dev_B', patterns, outcomesB, allProfiles);
144
+ console.log(`\n Dev A recommendations:`);
145
+ for (const r of resultA.recommendations) {
146
+ console.log(` ${r.patternId} score=${r.score} reasons=${r.reasons.map(x => x.type).join(', ')}`);
147
+ }
148
+ console.log(`\n Dev B recommendations:`);
149
+ for (const r of resultB.recommendations) {
150
+ console.log(` ${r.patternId} score=${r.score} reasons=${r.reasons.map(x => x.type).join(', ')}`);
151
+ }
152
+ // Dev A should have TypeScript patterns
153
+ const aTS = resultA.recommendations.filter(r => r.patternId.startsWith('ts_'));
154
+ const aPY = resultA.recommendations.filter(r => r.patternId.startsWith('py_'));
155
+ console.log(`\n Dev A: TS recommendations=${aTS.length}, PY recommendations=${aPY.length}`);
156
+ gt(aTS.length, aPY.length, 'Dev A gets more TypeScript than Python (outcome-driven)');
157
+ // Dev B should have Python patterns
158
+ const bTS = resultB.recommendations.filter(r => r.patternId.startsWith('ts_'));
159
+ const bPY = resultB.recommendations.filter(r => r.patternId.startsWith('py_'));
160
+ console.log(` Dev B: TS recommendations=${bTS.length}, PY recommendations=${bPY.length}`);
161
+ gt(bPY.length, bTS.length, 'Dev B gets more Python than TypeScript (outcome-driven)');
162
+ // The two result sets must differ
163
+ const idsA = new Set(resultA.recommendations.map(r => r.patternId));
164
+ const idsB = new Set(resultB.recommendations.map(r => r.patternId));
165
+ const same = [...idsA].every(id => idsB.has(id));
166
+ check(!same, 'Dev A and Dev B get different recommendation sets');
167
+ // Each recommendation has an outcome_evidence reason
168
+ for (const r of resultA.recommendations) {
169
+ const hasOutcomeReason = r.reasons.some(x => x.type === 'outcome_evidence');
170
+ check(hasOutcomeReason, `${r.patternId} has outcome_evidence reason`);
171
+ }
172
+ });
173
+ // ======================================================================
174
+ // TEST 2: Cold start — new developer with no history
175
+ // ======================================================================
176
+ test('HV2: Cold start', () => {
177
+ console.log('\n--- TEST 2: Cold Start — new dev, no history ---\n');
178
+ const patterns = [
179
+ makePattern('cold_ts_test', 'testing', 'typescript'),
180
+ makePattern('cold_py_data', 'data', 'python'),
181
+ makePattern('cold_go_ops', 'devops', 'go'),
182
+ makePattern('cold_ts_perf', 'performance', 'typescript'),
183
+ makePattern('cold_py_sec', 'security', 'python'),
184
+ ];
185
+ const outcomes = new Map();
186
+ for (const p of patterns) {
187
+ outcomes.set(p.patternId, makeOutcome(p.patternId, 0.85, 10));
188
+ }
189
+ // Existing developers with profiles
190
+ const existingProfiles = new Map();
191
+ const ex1 = (0, developer_profile_1.buildProfile)('existing_1', patterns.filter(p => p.meta.language === 'typescript'), outcomes);
192
+ const ex2 = (0, developer_profile_1.buildProfile)('existing_2', patterns.filter(p => p.meta.language === 'python'), outcomes);
193
+ existingProfiles.set('existing_1', ex1);
194
+ existingProfiles.set('existing_2', ex2);
195
+ // NEW developer — NO patterns, NO outcomes, entirely cold
196
+ console.log(` Creating new developer 'new_dev' with ZERO patterns...`);
197
+ let result;
198
+ try {
199
+ result = (0, recommendation_engine_1.recommendPatterns)('new_dev', patterns, outcomes, existingProfiles);
200
+ console.log(` Recommendations generated: ${result.recommendations.length}`);
201
+ console.log(` Candidates evaluated: ${result.totalCandidates}`);
202
+ console.log(` Latency: ${result.latencyMs}ms`);
203
+ check(true, 'cold start does not crash');
204
+ }
205
+ catch (e) {
206
+ check(false, `cold start throws: ${e.message}`);
207
+ return;
208
+ }
209
+ // Should return SOME recommendations
210
+ check(result.recommendations.length > 0, `cold start returns ${result.recommendations.length} recommendations`);
211
+ // All recs should have explanations
212
+ for (const r of result.recommendations) {
213
+ check(r.reasons.length >= 1, `${r.patternId} has reasons (cold start)`);
214
+ }
215
+ // Should span multiple categories
216
+ const cats = new Set(result.recommendations.map(r => r.category));
217
+ check(cats.size >= 1, `cold start recs span ${cats.size} categories`);
218
+ console.log(` Categories: ${[...cats].join(', ')}`);
219
+ });
220
+ // ======================================================================
221
+ // TEST 3: Behavior change — same dev, different outcomes
222
+ // ======================================================================
223
+ test('HV3: Behavior change', () => {
224
+ console.log('\n--- TEST 3: Behavior Change — same dev, changed outcomes ---\n');
225
+ const patterns = [
226
+ makePattern('bc_a', 'testing', 'typescript'),
227
+ makePattern('bc_b', 'data', 'python'),
228
+ makePattern('bc_c', 'devops', 'go'),
229
+ ];
230
+ // Phase 1: All patterns successful
231
+ const outcomesPhase1 = new Map();
232
+ outcomesPhase1.set('bc_a', makeOutcome('bc_a', 0.9, 20));
233
+ outcomesPhase1.set('bc_b', makeOutcome('bc_b', 0.85, 15));
234
+ outcomesPhase1.set('bc_c', makeOutcome('bc_c', 0.8, 12));
235
+ const profile1 = (0, developer_profile_1.buildProfile)('bc_dev', patterns, outcomesPhase1);
236
+ const profiles1 = new Map();
237
+ profiles1.set('bc_dev', profile1);
238
+ const phase1 = (0, recommendation_engine_1.recommendPatterns)('bc_dev', patterns, outcomesPhase1, profiles1);
239
+ const p1Ids = phase1.recommendations.map(r => r.patternId);
240
+ const p1Scores = phase1.recommendations.map(r => `${r.patternId}=${r.score}`);
241
+ console.log(` Phase 1 (all successful): ${p1Scores.join(', ')}`);
242
+ // Phase 2: bc_a now has terrible outcomes
243
+ const outcomesPhase2 = new Map();
244
+ outcomesPhase2.set('bc_a', makeOutcome('bc_a', 0.1, 20)); // was 0.9 → now 0.1
245
+ outcomesPhase2.set('bc_b', makeOutcome('bc_b', 0.85, 15)); // same
246
+ outcomesPhase2.set('bc_c', makeOutcome('bc_c', 0.8, 12)); // same
247
+ const profile2 = (0, developer_profile_1.buildProfile)('bc_dev', patterns, outcomesPhase2);
248
+ const profiles2 = new Map();
249
+ profiles2.set('bc_dev', profile2);
250
+ const phase2 = (0, recommendation_engine_1.recommendPatterns)('bc_dev', patterns, outcomesPhase2, profiles2);
251
+ const p2Ids = phase2.recommendations.map(r => r.patternId);
252
+ const p2Scores = phase2.recommendations.map(r => `${r.patternId}=${r.score}`);
253
+ console.log(` Phase 2 (bc_a failed): ${p2Scores.join(', ')}`);
254
+ // Phase 1 ranked bc_a first or second (was 0.9 success)
255
+ // Phase 2 should drop bc_a (0.1 success → filtered by successRate <= 0.5)
256
+ check(p1Ids.includes('bc_a'), 'Phase 1: bc_a in recommendations (was successful)');
257
+ check(!p2Ids.includes('bc_a'), 'Phase 2: bc_a excluded (now failing)');
258
+ check(p1Ids.length > 0, 'Phase 1 returns recommendations');
259
+ check(p2Ids.length > 0, 'Phase 2 returns recommendations');
260
+ // Verify the order changed
261
+ const p1RankA = p1Ids.indexOf('bc_a');
262
+ const p2notFound = !p2Ids.includes('bc_a');
263
+ check(p2notFound, 'bc_a dropped from recommendations after outcomes changed');
264
+ // Show raw scores
265
+ console.log(`\n bc_a score: Phase1=${outcomesPhase1.get('bc_a').successRate}, Phase2=${outcomesPhase2.get('bc_a').successRate}`);
266
+ console.log(` bc_b score: Phase1=${outcomesPhase1.get('bc_b').successRate}, Phase2=${outcomesPhase2.get('bc_b').successRate}`);
267
+ });
268
+ });
269
+ //# sourceMappingURL=chapter4-hostile.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chapter4-hostile.test.js","sourceRoot":"","sources":["../../../src/core/__tests__/chapter4-hostile.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=chapter4-verify.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chapter4-verify.test.d.ts","sourceRoot":"","sources":["../../../src/core/__tests__/chapter4-verify.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,349 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const developer_profile_1 = require("../developer-profile");
37
+ const recommendation_engine_1 = require("../recommendation-engine");
38
+ const recommendation_store_1 = require("../recommendation-store");
39
+ const path = __importStar(require("path"));
40
+ const fs = __importStar(require("fs"));
41
+ function tmpDir() {
42
+ const dir = path.join(require('os').tmpdir(), `oc-ch4-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`);
43
+ fs.mkdirSync(dir, { recursive: true });
44
+ return dir;
45
+ }
46
+ function makePattern(id, category, language, opts) {
47
+ const pos = opts?.pos ?? 10;
48
+ const neg = opts?.neg ?? 2;
49
+ const total = pos + neg;
50
+ return {
51
+ patternId: id,
52
+ category,
53
+ description: `Pattern ${id}`,
54
+ from: 'old_way',
55
+ to: 'new_way',
56
+ conditions: [
57
+ { type: 'language', value: language, matchScore: 1 },
58
+ ],
59
+ confidence: {
60
+ distribution: 'beta',
61
+ alpha: pos + 1,
62
+ beta: neg + 1,
63
+ mean: pos / Math.max(total, 1),
64
+ ci95: [0.3, 0.9],
65
+ },
66
+ signals: {
67
+ positive: pos,
68
+ negative: neg,
69
+ total,
70
+ lastSignal: Date.now(),
71
+ },
72
+ attribution: {
73
+ primaryCondition: '',
74
+ conditionConfidence: 0,
75
+ sourceFiles: [],
76
+ note: '',
77
+ },
78
+ scope: 'global',
79
+ survivedDays: 30,
80
+ meta: {
81
+ language,
82
+ subcategory: 'general',
83
+ complexity: 'low',
84
+ risk: 'low',
85
+ source: 'manual',
86
+ },
87
+ lifecycle: {
88
+ firstSeen: Date.now() - 86400000,
89
+ lastSeen: Date.now(),
90
+ version: 1,
91
+ history: [],
92
+ },
93
+ quality: {
94
+ score: 80,
95
+ reuseRate: 0.5,
96
+ successRate: pos / Math.max(total, 1),
97
+ failureRate: neg / Math.max(total, 1),
98
+ acceptanceRate: pos / Math.max(total, 1),
99
+ daysSinceLastSignal: 1,
100
+ age: 30,
101
+ },
102
+ relationships: {
103
+ related: [],
104
+ conflicting: [],
105
+ complementary: [],
106
+ dependencies: [],
107
+ },
108
+ ranking: {
109
+ score: 80,
110
+ rank: 1,
111
+ factors: { confidence: 70, quality: 80, usage: 60, recency: 90, acceptance: 80 },
112
+ },
113
+ };
114
+ }
115
+ function makeOutcome(patternId, successRate, usageCount = 10) {
116
+ const successCount = Math.round(usageCount * successRate);
117
+ const failureCount = usageCount - successCount;
118
+ return {
119
+ patternId,
120
+ usageCount,
121
+ successCount,
122
+ failureCount,
123
+ acceptanceCount: Math.round(usageCount * 0.8),
124
+ rejectionCount: Math.round(usageCount * 0.2),
125
+ lastOutcome: successRate > 0.5 ? 'PATTERN_SUCCESS' : 'PATTERN_FAILURE',
126
+ lastSuccessTimestamp: successRate > 0.5 ? Date.now() : null,
127
+ lastFailureTimestamp: successRate <= 0.5 ? Date.now() : null,
128
+ successRate,
129
+ failureRate: 1 - successRate,
130
+ acceptanceRate: 0.8,
131
+ confidence: 0.5 + successRate * 0.4,
132
+ trend: successRate > 0.7 ? 'rising' : 'declining',
133
+ health: Math.round(successRate * 100),
134
+ firstSeen: Date.now() - 86400000,
135
+ lastSeen: Date.now(),
136
+ };
137
+ }
138
+ function makeProfile(id, langs, cats) {
139
+ return {
140
+ developerId: id,
141
+ languages: langs,
142
+ frameworks: {},
143
+ projectTypes: [],
144
+ patternsUsed: 10,
145
+ patternAcceptanceRate: 0.85,
146
+ successRate: 0.8,
147
+ failureRate: 0.2,
148
+ topCategories: cats,
149
+ lastUpdated: Date.now(),
150
+ };
151
+ }
152
+ describe('Chapter 4 — Recommendation Engine V2', () => {
153
+ describe('Test 1: 3 developers → 3 different recommendation sets', () => {
154
+ test('each developer gets distinct, language-matched recommendations', () => {
155
+ const categories = ['testing', 'data', 'devops'];
156
+ const languages = ['typescript', 'python', 'go'];
157
+ const allPatterns = [];
158
+ const outcomesMap = new Map();
159
+ for (const cat of categories) {
160
+ for (const lang of languages) {
161
+ for (let i = 0; i < 3; i++) {
162
+ const pid = `${lang}_${cat}_${i}`;
163
+ allPatterns.push(makePattern(pid, cat, lang));
164
+ outcomesMap.set(pid, makeOutcome(pid, 0.9));
165
+ }
166
+ }
167
+ }
168
+ const devAData = allPatterns.filter((p) => p.meta.language === 'typescript' && p.category === 'testing');
169
+ const devBData = allPatterns.filter((p) => p.meta.language === 'python' && p.category === 'data');
170
+ const devCData = allPatterns.filter((p) => p.meta.language === 'go' && p.category === 'devops');
171
+ const profileA = (0, developer_profile_1.buildProfile)('dev-a', devAData, outcomesMap);
172
+ const profileB = (0, developer_profile_1.buildProfile)('dev-b', devBData, outcomesMap);
173
+ const profileC = (0, developer_profile_1.buildProfile)('dev-c', devCData, outcomesMap);
174
+ const allProfiles = new Map();
175
+ allProfiles.set('dev-a', profileA);
176
+ allProfiles.set('dev-b', profileB);
177
+ allProfiles.set('dev-c', profileC);
178
+ const resultA = (0, recommendation_engine_1.recommendPatterns)('dev-a', allPatterns, outcomesMap, allProfiles);
179
+ const resultB = (0, recommendation_engine_1.recommendPatterns)('dev-b', allPatterns, outcomesMap, allProfiles);
180
+ const resultC = (0, recommendation_engine_1.recommendPatterns)('dev-c', allPatterns, outcomesMap, allProfiles);
181
+ const idsA = new Set(resultA.recommendations.map((r) => r.patternId));
182
+ const idsB = new Set(resultB.recommendations.map((r) => r.patternId));
183
+ const idsC = new Set(resultC.recommendations.map((r) => r.patternId));
184
+ expect(idsA.size).toBeGreaterThan(0);
185
+ expect(idsB.size).toBeGreaterThan(0);
186
+ expect(idsC.size).toBeGreaterThan(0);
187
+ const allSame = [...idsA].every((id) => idsB.has(id) && idsC.has(id));
188
+ expect(allSame).toBe(false);
189
+ const langCountA = countByLanguage(resultA);
190
+ const langCountB = countByLanguage(resultB);
191
+ const langCountC = countByLanguage(resultC);
192
+ expect(langCountA.typescript).toBeGreaterThan(langCountA.python ?? 0);
193
+ expect(langCountA.typescript).toBeGreaterThan(langCountA.go ?? 0);
194
+ expect(langCountB.python).toBeGreaterThan(langCountB.typescript ?? 0);
195
+ expect(langCountB.python).toBeGreaterThan(langCountB.go ?? 0);
196
+ expect(langCountC.go).toBeGreaterThan(langCountC.typescript ?? 0);
197
+ expect(langCountC.go).toBeGreaterThan(langCountC.python ?? 0);
198
+ });
199
+ });
200
+ describe('Test 2: Outcome-based scoring', () => {
201
+ test('changing outcomes changes recommendation ranking', () => {
202
+ const patterns = [
203
+ makePattern('p_a', 'testing', 'typescript'),
204
+ makePattern('p_b', 'data', 'python'),
205
+ makePattern('p_c', 'devops', 'go'),
206
+ ];
207
+ const outcomes = new Map();
208
+ outcomes.set('p_a', makeOutcome('p_a', 0.9));
209
+ outcomes.set('p_b', makeOutcome('p_b', 0.8));
210
+ outcomes.set('p_c', makeOutcome('p_c', 0.7));
211
+ const profile = (0, developer_profile_1.buildProfile)('dev', patterns, outcomes);
212
+ const profiles = new Map();
213
+ profiles.set('dev', profile);
214
+ const first = (0, recommendation_engine_1.recommendPatterns)('dev', patterns, outcomes, profiles);
215
+ const firstOrder = first.recommendations.map((r) => r.patternId);
216
+ outcomes.set('p_a', makeOutcome('p_a', 0.2));
217
+ const profile2 = (0, developer_profile_1.buildProfile)('dev', patterns, outcomes);
218
+ profiles.set('dev', profile2);
219
+ const second = (0, recommendation_engine_1.recommendPatterns)('dev', patterns, outcomes, profiles);
220
+ const secondOrder = second.recommendations.map((r) => r.patternId);
221
+ expect(firstOrder).not.toEqual(secondOrder);
222
+ expect(second.recommendations.every((r) => r.patternId !== 'p_a')).toBe(true);
223
+ });
224
+ });
225
+ describe('Test 3: Explanations exist', () => {
226
+ test('every recommendation has at least 1 reason with description', () => {
227
+ const categories = ['testing', 'data', 'devops'];
228
+ const languages = ['typescript', 'python', 'go'];
229
+ const allPatterns = [];
230
+ const outcomesMap = new Map();
231
+ for (const cat of categories) {
232
+ for (const lang of languages) {
233
+ const pid = `${cat}_${lang}`;
234
+ allPatterns.push(makePattern(pid, cat, lang));
235
+ outcomesMap.set(pid, makeOutcome(pid, 0.85));
236
+ }
237
+ }
238
+ const profile = (0, developer_profile_1.buildProfile)('dev-x', allPatterns, outcomesMap);
239
+ const profiles = new Map();
240
+ profiles.set('dev-x', profile);
241
+ const result = (0, recommendation_engine_1.recommendPatterns)('dev-x', allPatterns, outcomesMap, profiles);
242
+ for (const rec of result.recommendations) {
243
+ expect(rec.reasons.length).toBeGreaterThanOrEqual(1);
244
+ for (const reason of rec.reasons) {
245
+ expect(reason.description.length).toBeGreaterThan(0);
246
+ expect(typeof reason.value).toBe('number');
247
+ }
248
+ }
249
+ });
250
+ });
251
+ describe('Test 4: Diversity', () => {
252
+ test('recommendations span at least 3 categories', () => {
253
+ const categories = ['testing', 'data', 'devops', 'security', 'performance'];
254
+ const allPatterns = [];
255
+ const outcomesMap = new Map();
256
+ for (const cat of categories) {
257
+ for (let i = 0; i < 5; i++) {
258
+ const pid = `${cat}_pat_${i}`;
259
+ allPatterns.push(makePattern(pid, cat, 'typescript'));
260
+ outcomesMap.set(pid, makeOutcome(pid, 0.85));
261
+ }
262
+ }
263
+ const profile = (0, developer_profile_1.buildProfile)('dev-y', allPatterns, outcomesMap);
264
+ const profiles = new Map();
265
+ profiles.set('dev-y', profile);
266
+ const result = (0, recommendation_engine_1.recommendPatterns)('dev-y', allPatterns, outcomesMap, profiles);
267
+ const categoriesFound = new Set(result.recommendations.map((r) => r.category));
268
+ expect(categoriesFound.size).toBeGreaterThanOrEqual(3);
269
+ expect(result.recommendations.length).toBeLessThanOrEqual(20);
270
+ });
271
+ });
272
+ describe('Test 5: Scale — 100 developers', () => {
273
+ test('generates recommendations within 2000ms', () => {
274
+ const patterns = [];
275
+ const outcomesMap = new Map();
276
+ for (let i = 0; i < 20; i++) {
277
+ const pid = `scale_pat_${i}`;
278
+ patterns.push(makePattern(pid, i % 2 === 0 ? 'testing' : 'data', i % 3 === 0 ? 'typescript' : 'python'));
279
+ outcomesMap.set(pid, makeOutcome(pid, 0.8, 15));
280
+ }
281
+ const langs = ['typescript', 'python', 'go', 'rust', 'java'];
282
+ const cats = ['testing', 'data', 'devops', 'security', 'performance'];
283
+ const profiles = new Map();
284
+ for (let i = 0; i < 100; i++) {
285
+ const id = `dev_${i}`;
286
+ profiles.set(id, makeProfile(id, { [langs[i % langs.length]]: 5 + (i % 10) }, [cats[i % cats.length]]));
287
+ }
288
+ const start = Date.now();
289
+ const result = (0, recommendation_engine_1.recommendPatterns)('dev_0', patterns, outcomesMap, profiles);
290
+ const elapsed = Date.now() - start;
291
+ expect(elapsed).toBeLessThan(2000);
292
+ expect(result.recommendations.length).toBeGreaterThan(0);
293
+ expect(result.latencyMs).toBeLessThan(2000);
294
+ });
295
+ });
296
+ describe('Test 6: Feedback loop', () => {
297
+ test('records and stores feedback', () => {
298
+ const tmp = tmpDir();
299
+ try {
300
+ const store = new recommendation_store_1.RecommendationStore(tmp);
301
+ (0, recommendation_engine_1.recordFeedback)(store, 'dev-1', 'pat-1', 'shown');
302
+ (0, recommendation_engine_1.recordFeedback)(store, 'dev-1', 'pat-2', 'accepted');
303
+ (0, recommendation_engine_1.recordFeedback)(store, 'dev-2', 'pat-1', 'rejected');
304
+ const allFeedback = store.getFeedback();
305
+ expect(allFeedback.length).toBe(3);
306
+ const dev1Feedback = store.getFeedbackForDeveloper('dev-1');
307
+ expect(dev1Feedback.length).toBe(2);
308
+ const pat1Feedback = store.getFeedbackForPattern('pat-1');
309
+ expect(pat1Feedback.length).toBe(2);
310
+ const shownItem = allFeedback.find((f) => f.action === 'shown');
311
+ expect(shownItem).toBeDefined();
312
+ expect(shownItem.developerId).toBe('dev-1');
313
+ expect(shownItem.patternId).toBe('pat-1');
314
+ expect(shownItem.id.length).toBeGreaterThan(0);
315
+ const store2 = new recommendation_store_1.RecommendationStore(tmp);
316
+ expect(store2.getFeedback().length).toBe(3);
317
+ }
318
+ finally {
319
+ fs.rmSync(tmp, { recursive: true, force: true });
320
+ }
321
+ });
322
+ });
323
+ describe('Test 7: Failure avoidance', () => {
324
+ test('pattern with high failure rate is excluded from recommendations', () => {
325
+ const patterns = [
326
+ makePattern('good_pat', 'testing', 'typescript', { pos: 18, neg: 2 }),
327
+ makePattern('bad_pat', 'testing', 'typescript', { pos: 2, neg: 18 }),
328
+ ];
329
+ const outcomes = new Map();
330
+ outcomes.set('good_pat', makeOutcome('good_pat', 0.9, 20));
331
+ outcomes.set('bad_pat', makeOutcome('bad_pat', 0.1, 20));
332
+ const profile = (0, developer_profile_1.buildProfile)('dev-z', patterns, outcomes);
333
+ const profiles = new Map();
334
+ profiles.set('dev-z', profile);
335
+ const result = (0, recommendation_engine_1.recommendPatterns)('dev-z', patterns, outcomes, profiles);
336
+ expect(result.recommendations.some((r) => r.patternId === 'good_pat')).toBe(true);
337
+ expect(result.recommendations.some((r) => r.patternId === 'bad_pat')).toBe(false);
338
+ });
339
+ });
340
+ });
341
+ function countByLanguage(result) {
342
+ const counts = {};
343
+ for (const rec of result.recommendations) {
344
+ const lang = rec.patternId.split('_')[0];
345
+ counts[lang] = (counts[lang] || 0) + 1;
346
+ }
347
+ return counts;
348
+ }
349
+ //# sourceMappingURL=chapter4-verify.test.js.map