@tyvm/knowhow 0.0.32 → 0.0.34

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 (508) hide show
  1. package/autodoc/plugins/downloader/downloader.mdx +2 -2
  2. package/benchmarks/.dockerignore +7 -0
  3. package/benchmarks/README.md +166 -0
  4. package/benchmarks/docker/Dockerfile +68 -0
  5. package/benchmarks/example-config.yml +27 -0
  6. package/benchmarks/jest.config.js +13 -0
  7. package/benchmarks/package-lock.json +4297 -0
  8. package/benchmarks/package.json +39 -0
  9. package/benchmarks/results/4542435/2025-08-05/lms/lms-openai-gpt-oss-20b.json +2814 -0
  10. package/benchmarks/results/4542435/2025-08-05/lms/lms-qwen-qwen3-30b-a3b-2507.json +2014 -0
  11. package/benchmarks/results/4fb9125/2025-08-07/anthropic/anthropic-claude-sonnet-4-20250514.json +3121 -0
  12. package/benchmarks/results/5766aee/2025-08-02/lms-qwen/qwen3-coder-30b.json +98 -0
  13. package/benchmarks/results/6d73808/2025-08-07/openai/openai-gpt-5.json +3256 -0
  14. package/benchmarks/results/77bf0a6/2025-08-02/lms-qwen/qwen3-30b-a3b-2507.json +4298 -0
  15. package/benchmarks/results/8c0d445/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +3031 -0
  16. package/benchmarks/results/8c0d445/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +2990 -0
  17. package/benchmarks/results/ac6b2ab/2025-08-03/anthropic/anthropic-claude-sonnet-4-20250514.json +3256 -0
  18. package/benchmarks/results/ac6b2ab/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +3007 -0
  19. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-2025-04-14.json +3256 -0
  20. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-mini-2025-04-14.json +3036 -0
  21. package/benchmarks/results/ac6b2ab/2025-08-03/openai/openai-gpt-4.1-nano-2025-04-14.json +3280 -0
  22. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-30b-a3b-2507.json +1920 -0
  23. package/benchmarks/results/adff675/2025-08-04/lms/lms-qwen-qwen3-coder-30b.json +3281 -0
  24. package/benchmarks/results/b502ed9/2025-08-03/lms-qwen/qwen3-coder-30b.json +2896 -0
  25. package/benchmarks/results/d1a8129/2025-08-03/lms/lms-qwen-qwen3-coder-30b.json +3011 -0
  26. package/benchmarks/results/e60471c/2025-08-03/lms/qwen3-30b-a3b-2507.json +3003 -0
  27. package/benchmarks/scripts/build-and-run.sh +47 -0
  28. package/benchmarks/scripts/clone-exercism.sh +92 -0
  29. package/benchmarks/scripts/validate.sh +48 -0
  30. package/benchmarks/src/__tests__/runner.test.ts +27 -0
  31. package/benchmarks/src/cli.ts +90 -0
  32. package/benchmarks/src/evaluators/EvaluatorRegistry.ts +64 -0
  33. package/benchmarks/src/evaluators/JavaScriptEvaluator.ts +183 -0
  34. package/benchmarks/src/evaluators/index.ts +3 -0
  35. package/benchmarks/src/evaluators/types.ts +22 -0
  36. package/benchmarks/src/index.ts +3 -0
  37. package/benchmarks/src/providers.ts +13 -0
  38. package/benchmarks/src/runner.ts +824 -0
  39. package/benchmarks/src/types.ts +63 -0
  40. package/benchmarks/tsconfig.json +19 -0
  41. package/jest.config.js +2 -1
  42. package/leaderboard/README.md +148 -0
  43. package/leaderboard/app/api/benchmark-data/route.ts +131 -0
  44. package/leaderboard/app/api/benchmark-detail/route.ts +172 -0
  45. package/leaderboard/app/details/[model]/[provider]/[language]/page.tsx +501 -0
  46. package/leaderboard/app/exercise/[model]/[provider]/[language]/[exercise]/page.tsx +375 -0
  47. package/leaderboard/app/globals.css +27 -0
  48. package/leaderboard/app/layout.tsx +21 -0
  49. package/leaderboard/app/page.tsx +170 -0
  50. package/leaderboard/components/LeaderboardTable.tsx +168 -0
  51. package/leaderboard/components/PerformanceChart.tsx +109 -0
  52. package/leaderboard/next-env.d.ts +5 -0
  53. package/leaderboard/next.config.js +4 -0
  54. package/leaderboard/package-lock.json +6363 -0
  55. package/leaderboard/package.json +28 -0
  56. package/leaderboard/postcss.config.js +6 -0
  57. package/leaderboard/tailwind.config.js +17 -0
  58. package/leaderboard/tsconfig.json +28 -0
  59. package/leaderboard/types/benchmark.ts +67 -0
  60. package/leaderboard/utils/dataProcessor.ts +33 -0
  61. package/package.json +2 -1
  62. package/src/agents/base/base.ts +147 -21
  63. package/src/agents/base/prompt.ts +28 -0
  64. package/src/agents/index.ts +3 -0
  65. package/src/agents/patcher/patcher.ts +6 -4
  66. package/src/agents/setup/setup.ts +56 -0
  67. package/src/agents/tools/agentCall.ts +6 -2
  68. package/src/agents/tools/aiClient.ts +74 -8
  69. package/src/agents/tools/execCommand.ts +13 -14
  70. package/src/agents/tools/executeScript/README.md +16 -0
  71. package/src/agents/tools/index.ts +2 -0
  72. package/src/agents/tools/list.ts +73 -16
  73. package/src/agents/tools/startAgentTask.ts +109 -0
  74. package/src/agents/tools/textSearch.ts +1 -1
  75. package/src/agents/tools/visionTool.ts +31 -2
  76. package/src/agents/tools/ycmd/client.ts +608 -0
  77. package/src/agents/tools/ycmd/definitions.ts +294 -0
  78. package/src/agents/tools/ycmd/detection.ts +211 -0
  79. package/src/agents/tools/ycmd/index.ts +11 -0
  80. package/src/agents/tools/ycmd/installer.ts +251 -0
  81. package/src/agents/tools/ycmd/server.ts +535 -0
  82. package/src/agents/tools/ycmd/serverManager.ts +316 -0
  83. package/src/agents/tools/ycmd/tools/completion.ts +113 -0
  84. package/src/agents/tools/ycmd/tools/diagnostics.ts +155 -0
  85. package/src/agents/tools/ycmd/tools/getLocations.ts +173 -0
  86. package/src/agents/tools/ycmd/tools/goto.ts +169 -0
  87. package/src/agents/tools/ycmd/tools/refactor.ts +204 -0
  88. package/src/agents/tools/ycmd/tools/signature.ts +174 -0
  89. package/src/agents/tools/ycmd/tools/start.ts +95 -0
  90. package/src/agents/tools/ycmd/utils/pathUtils.ts +59 -0
  91. package/src/ai.ts +15 -0
  92. package/src/chat/CliChatService.ts +277 -0
  93. package/src/chat/modules/AgentModule.ts +980 -0
  94. package/src/chat/modules/AskModule.ts +98 -0
  95. package/src/chat/modules/BaseChatModule.ts +66 -0
  96. package/src/chat/modules/InternalChatModule.ts +174 -0
  97. package/src/chat/modules/SearchModule.ts +166 -0
  98. package/src/chat/modules/SetupModule.ts +185 -0
  99. package/src/chat/modules/SystemModule.ts +120 -0
  100. package/src/chat/modules/VoiceModule.ts +70 -0
  101. package/src/chat/modules/index.js +5 -0
  102. package/src/chat/types.ts +97 -0
  103. package/src/chat.ts +9 -1
  104. package/src/chat2.ts +62 -0
  105. package/src/cli.ts +264 -35
  106. package/src/clients/anthropic.ts +14 -7
  107. package/src/clients/gemini.ts +15 -7
  108. package/src/clients/http.ts +17 -7
  109. package/src/clients/index.ts +117 -4
  110. package/src/clients/knowhow.ts +7 -2
  111. package/src/clients/knowhowMcp.ts +118 -0
  112. package/src/clients/openai.ts +32 -8
  113. package/src/clients/types.ts +1 -0
  114. package/src/clients/xai.ts +17 -5
  115. package/src/config.ts +30 -5
  116. package/src/conversion.ts +4 -1
  117. package/src/embeddings.ts +79 -23
  118. package/src/login.ts +26 -9
  119. package/src/microphone.ts +0 -1
  120. package/src/plugins/downloader/downloader.ts +72 -24
  121. package/src/plugins/downloader/plugin.ts +3 -1
  122. package/src/plugins/plugins.ts +3 -0
  123. package/src/processors/CustomVariables.ts +425 -0
  124. package/src/processors/HarmonyToolProcessor.ts +264 -0
  125. package/src/processors/XmlToolCallProcessor.ts +533 -0
  126. package/src/processors/index.ts +3 -0
  127. package/src/prompts/KnowhowConfigExamples.ts +376 -0
  128. package/src/services/KnowhowClient.ts +49 -3
  129. package/src/services/Mcp.ts +42 -3
  130. package/src/services/McpServer.ts +14 -4
  131. package/src/services/McpWebsocketTransport.ts +21 -7
  132. package/src/services/MessageProcessor.ts +10 -5
  133. package/src/services/index.ts +5 -0
  134. package/src/services/script-execution/ScriptExecutor.ts +34 -1
  135. package/src/services/types.ts +17 -14
  136. package/src/types.ts +17 -0
  137. package/src/utils/index.ts +138 -0
  138. package/tests/XmlToolCallProcessor.test.ts +468 -0
  139. package/tests/manual/ycmd/debug_diagnostics_test.ts +127 -0
  140. package/tests/manual/ycmd/fixtures/debug_diagnostics.ts +26 -0
  141. package/tests/manual/ycmd/fixtures/file_change_test.ts +17 -0
  142. package/tests/manual/ycmd/minimal_advanced_test.ts +108 -0
  143. package/tests/manual/ycmd/simple_diagnostics_test.ts +61 -0
  144. package/tests/manual/ycmd/simple_test.ts +74 -0
  145. package/tests/manual/ycmd/test-typescript-sample.ts +34 -0
  146. package/tests/manual/ycmd/test_advanced_features.ts +407 -0
  147. package/tests/manual/ycmd/test_advanced_with_tools.ts +320 -0
  148. package/tests/manual/ycmd/test_comprehensive_typescript.ts +179 -0
  149. package/tests/manual/ycmd/test_diagnostics_file_changes.ts +249 -0
  150. package/tests/manual/ycmd/test_diagnostics_fix.ts +99 -0
  151. package/tests/manual/ycmd/test_diagnostics_simple.ts +100 -0
  152. package/tests/manual/ycmd/test_diagnostics_timing.ts +120 -0
  153. package/tests/manual/ycmd/test_discover_commands.ts +310 -0
  154. package/tests/manual/ycmd/test_endpoints.ts +115 -0
  155. package/tests/manual/ycmd/test_final_comprehensive.ts +218 -0
  156. package/tests/manual/ycmd/test_final_validation.ts +150 -0
  157. package/tests/manual/ycmd/test_implementation.js +42 -0
  158. package/tests/manual/ycmd/test_individual_ycmd_tool.ts +39 -0
  159. package/tests/manual/ycmd/test_server_manager.ts +52 -0
  160. package/tests/manual/ycmd/test_simple_debug.ts +86 -0
  161. package/tests/manual/ycmd/test_tsserver_workflow.js +83 -0
  162. package/tests/manual/ycmd/test_tsserver_workflow.ts +122 -0
  163. package/tests/manual/ycmd/test_typescript_simple.ts +48 -0
  164. package/tests/manual/ycmd/test_typescript_ycmd.ts +105 -0
  165. package/tests/manual/ycmd/test_workspace_config.ts +90 -0
  166. package/tests/manual/ycmd/test_ycmd_auto_start.ts +137 -0
  167. package/tests/manual/ycmd/test_ycmd_comprehensive.ts +73 -0
  168. package/tests/manual/ycmd/test_ycmd_connection.py +10 -0
  169. package/tests/manual/ycmd/test_ycmd_direct.ts +142 -0
  170. package/tests/manual/ycmd/test_ycmd_experiment.ts +48 -0
  171. package/tests/manual/ycmd/test_ycmd_final.ts +200 -0
  172. package/tests/manual/ycmd/test_ycmd_fixed.py +18 -0
  173. package/tests/manual/ycmd/test_ycmd_integration.ts +112 -0
  174. package/tests/manual/ycmd/test_ycmd_simple.ts +45 -0
  175. package/tests/manual/ycmd/test_ycmd_usage.py +27 -0
  176. package/tests/manual/ycmd/working_simple_test.ts +134 -0
  177. package/ts_build/src/agents/base/base.d.ts +14 -1
  178. package/ts_build/src/agents/base/base.js +91 -17
  179. package/ts_build/src/agents/base/base.js.map +1 -1
  180. package/ts_build/src/agents/base/prompt.d.ts +1 -1
  181. package/ts_build/src/agents/base/prompt.js +28 -0
  182. package/ts_build/src/agents/base/prompt.js.map +1 -1
  183. package/ts_build/src/agents/index.d.ts +2 -0
  184. package/ts_build/src/agents/index.js +2 -0
  185. package/ts_build/src/agents/index.js.map +1 -1
  186. package/ts_build/src/agents/patcher/patcher.js +6 -3
  187. package/ts_build/src/agents/patcher/patcher.js.map +1 -1
  188. package/ts_build/src/agents/setup/setup.d.ts +8 -0
  189. package/ts_build/src/agents/setup/setup.js +59 -0
  190. package/ts_build/src/agents/setup/setup.js.map +1 -0
  191. package/ts_build/src/agents/tools/agentCall.js +5 -2
  192. package/ts_build/src/agents/tools/agentCall.js.map +1 -1
  193. package/ts_build/src/agents/tools/aiClient.d.ts +6 -5
  194. package/ts_build/src/agents/tools/aiClient.js +37 -6
  195. package/ts_build/src/agents/tools/aiClient.js.map +1 -1
  196. package/ts_build/src/agents/tools/execCommand.d.ts +2 -2
  197. package/ts_build/src/agents/tools/execCommand.js +5 -6
  198. package/ts_build/src/agents/tools/execCommand.js.map +1 -1
  199. package/ts_build/src/agents/tools/executeScript/index.d.ts +1 -1
  200. package/ts_build/src/agents/tools/index.d.ts +2 -0
  201. package/ts_build/src/agents/tools/index.js +2 -0
  202. package/ts_build/src/agents/tools/index.js.map +1 -1
  203. package/ts_build/src/agents/tools/list.js +66 -16
  204. package/ts_build/src/agents/tools/list.js.map +1 -1
  205. package/ts_build/src/agents/tools/startAgentTask.d.ts +13 -0
  206. package/ts_build/src/agents/tools/startAgentTask.js +74 -0
  207. package/ts_build/src/agents/tools/startAgentTask.js.map +1 -0
  208. package/ts_build/src/agents/tools/startChatTask.d.ts +13 -0
  209. package/ts_build/src/agents/tools/startChatTask.js +73 -0
  210. package/ts_build/src/agents/tools/startChatTask.js.map +1 -0
  211. package/ts_build/src/agents/tools/textSearch.js +1 -1
  212. package/ts_build/src/agents/tools/textSearch.js.map +1 -1
  213. package/ts_build/src/agents/tools/visionTool.d.ts +1 -1
  214. package/ts_build/src/agents/tools/visionTool.js +23 -3
  215. package/ts_build/src/agents/tools/visionTool.js.map +1 -1
  216. package/ts_build/src/agents/tools/ycmd/client.d.ts +93 -0
  217. package/ts_build/src/agents/tools/ycmd/client.js +355 -0
  218. package/ts_build/src/agents/tools/ycmd/client.js.map +1 -0
  219. package/ts_build/src/agents/tools/ycmd/definitions.d.ts +345 -0
  220. package/ts_build/src/agents/tools/ycmd/definitions.js +298 -0
  221. package/ts_build/src/agents/tools/ycmd/definitions.js.map +1 -0
  222. package/ts_build/src/agents/tools/ycmd/detection.d.ts +11 -0
  223. package/ts_build/src/agents/tools/ycmd/detection.js +175 -0
  224. package/ts_build/src/agents/tools/ycmd/detection.js.map +1 -0
  225. package/ts_build/src/agents/tools/ycmd/index.d.ts +8 -0
  226. package/ts_build/src/agents/tools/ycmd/index.js +20 -0
  227. package/ts_build/src/agents/tools/ycmd/index.js.map +1 -0
  228. package/ts_build/src/agents/tools/ycmd/installer.d.ts +19 -0
  229. package/ts_build/src/agents/tools/ycmd/installer.js +196 -0
  230. package/ts_build/src/agents/tools/ycmd/installer.js.map +1 -0
  231. package/ts_build/src/agents/tools/ycmd/server.d.ts +35 -0
  232. package/ts_build/src/agents/tools/ycmd/server.js +363 -0
  233. package/ts_build/src/agents/tools/ycmd/server.js.map +1 -0
  234. package/ts_build/src/agents/tools/ycmd/serverManager.d.ts +39 -0
  235. package/ts_build/src/agents/tools/ycmd/serverManager.js +210 -0
  236. package/ts_build/src/agents/tools/ycmd/serverManager.js.map +1 -0
  237. package/ts_build/src/agents/tools/ycmd/tools/completion.d.ts +22 -0
  238. package/ts_build/src/agents/tools/ycmd/tools/completion.js +72 -0
  239. package/ts_build/src/agents/tools/ycmd/tools/completion.js.map +1 -0
  240. package/ts_build/src/agents/tools/ycmd/tools/diagnostics.d.ts +42 -0
  241. package/ts_build/src/agents/tools/ycmd/tools/diagnostics.js +88 -0
  242. package/ts_build/src/agents/tools/ycmd/tools/diagnostics.js.map +1 -0
  243. package/ts_build/src/agents/tools/ycmd/tools/getLocations.d.ts +22 -0
  244. package/ts_build/src/agents/tools/ycmd/tools/getLocations.js +142 -0
  245. package/ts_build/src/agents/tools/ycmd/tools/getLocations.js.map +1 -0
  246. package/ts_build/src/agents/tools/ycmd/tools/goto.d.ts +20 -0
  247. package/ts_build/src/agents/tools/ycmd/tools/goto.js +101 -0
  248. package/ts_build/src/agents/tools/ycmd/tools/goto.js.map +1 -0
  249. package/ts_build/src/agents/tools/ycmd/tools/refactor.d.ts +32 -0
  250. package/ts_build/src/agents/tools/ycmd/tools/refactor.js +123 -0
  251. package/ts_build/src/agents/tools/ycmd/tools/refactor.js.map +1 -0
  252. package/ts_build/src/agents/tools/ycmd/tools/signature.d.ts +25 -0
  253. package/ts_build/src/agents/tools/ycmd/tools/signature.js +110 -0
  254. package/ts_build/src/agents/tools/ycmd/tools/signature.js.map +1 -0
  255. package/ts_build/src/agents/tools/ycmd/tools/start.d.ts +17 -0
  256. package/ts_build/src/agents/tools/ycmd/tools/start.js +65 -0
  257. package/ts_build/src/agents/tools/ycmd/tools/start.js.map +1 -0
  258. package/ts_build/src/agents/tools/ycmd/utils/pathUtils.d.ts +4 -0
  259. package/ts_build/src/agents/tools/ycmd/utils/pathUtils.js +67 -0
  260. package/ts_build/src/agents/tools/ycmd/utils/pathUtils.js.map +1 -0
  261. package/ts_build/src/ai.d.ts +1 -0
  262. package/ts_build/src/ai.js +40 -1
  263. package/ts_build/src/ai.js.map +1 -1
  264. package/ts_build/src/chat/ChatCommandHandler.d.ts +36 -0
  265. package/ts_build/src/chat/ChatCommandHandler.js +268 -0
  266. package/ts_build/src/chat/ChatCommandHandler.js.map +1 -0
  267. package/ts_build/src/chat/ChatInputManager.d.ts +22 -0
  268. package/ts_build/src/chat/ChatInputManager.js +85 -0
  269. package/ts_build/src/chat/ChatInputManager.js.map +1 -0
  270. package/ts_build/src/chat/ChatManager.d.ts +49 -0
  271. package/ts_build/src/chat/ChatManager.js +271 -0
  272. package/ts_build/src/chat/ChatManager.js.map +1 -0
  273. package/ts_build/src/chat/ChatSession.d.ts +32 -0
  274. package/ts_build/src/chat/ChatSession.js +3 -0
  275. package/ts_build/src/chat/ChatSession.js.map +1 -0
  276. package/ts_build/src/chat/ChatSessionManager.d.ts +19 -0
  277. package/ts_build/src/chat/ChatSessionManager.js +188 -0
  278. package/ts_build/src/chat/ChatSessionManager.js.map +1 -0
  279. package/ts_build/src/chat/ChatStateManager.d.ts +58 -0
  280. package/ts_build/src/chat/ChatStateManager.js +156 -0
  281. package/ts_build/src/chat/ChatStateManager.js.map +1 -0
  282. package/ts_build/src/chat/CliChatService.d.ts +35 -0
  283. package/ts_build/src/chat/CliChatService.js +201 -0
  284. package/ts_build/src/chat/CliChatService.js.map +1 -0
  285. package/ts_build/src/chat/InterruptibleInput.d.ts +20 -0
  286. package/ts_build/src/chat/InterruptibleInput.js +109 -0
  287. package/ts_build/src/chat/InterruptibleInput.js.map +1 -0
  288. package/ts_build/src/chat/interfaces/ChatModule.d.ts +6 -0
  289. package/ts_build/src/chat/interfaces/ChatModule.js +3 -0
  290. package/ts_build/src/chat/interfaces/ChatModule.js.map +1 -0
  291. package/ts_build/src/chat/modules/AgentModule.d.ts +56 -0
  292. package/ts_build/src/chat/modules/AgentModule.js +705 -0
  293. package/ts_build/src/chat/modules/AgentModule.js.map +1 -0
  294. package/ts_build/src/chat/modules/AskModule.d.ts +10 -0
  295. package/ts_build/src/chat/modules/AskModule.js +63 -0
  296. package/ts_build/src/chat/modules/AskModule.js.map +1 -0
  297. package/ts_build/src/chat/modules/BaseChatModule.d.ts +14 -0
  298. package/ts_build/src/chat/modules/BaseChatModule.js +32 -0
  299. package/ts_build/src/chat/modules/BaseChatModule.js.map +1 -0
  300. package/ts_build/src/chat/modules/InternalChatModule.d.ts +24 -0
  301. package/ts_build/src/chat/modules/InternalChatModule.js +127 -0
  302. package/ts_build/src/chat/modules/InternalChatModule.js.map +1 -0
  303. package/ts_build/src/chat/modules/SearchModule.d.ts +12 -0
  304. package/ts_build/src/chat/modules/SearchModule.js +119 -0
  305. package/ts_build/src/chat/modules/SearchModule.js.map +1 -0
  306. package/ts_build/src/chat/modules/SetupModule.d.ts +15 -0
  307. package/ts_build/src/chat/modules/SetupModule.js +147 -0
  308. package/ts_build/src/chat/modules/SetupModule.js.map +1 -0
  309. package/ts_build/src/chat/modules/SystemModule.d.ts +14 -0
  310. package/ts_build/src/chat/modules/SystemModule.js +90 -0
  311. package/ts_build/src/chat/modules/SystemModule.js.map +1 -0
  312. package/ts_build/src/chat/modules/VoiceModule.d.ts +11 -0
  313. package/ts_build/src/chat/modules/VoiceModule.js +57 -0
  314. package/ts_build/src/chat/modules/VoiceModule.js.map +1 -0
  315. package/ts_build/src/chat/types.d.ts +83 -0
  316. package/ts_build/src/chat/types.js +3 -0
  317. package/ts_build/src/chat/types.js.map +1 -0
  318. package/ts_build/src/chat.js +7 -1
  319. package/ts_build/src/chat.js.map +1 -1
  320. package/ts_build/src/chat2.d.ts +3 -0
  321. package/ts_build/src/chat2.js +47 -0
  322. package/ts_build/src/chat2.js.map +1 -0
  323. package/ts_build/src/cli.js +218 -37
  324. package/ts_build/src/cli.js.map +1 -1
  325. package/ts_build/src/clients/anthropic.d.ts +5 -2
  326. package/ts_build/src/clients/anthropic.js +12 -7
  327. package/ts_build/src/clients/anthropic.js.map +1 -1
  328. package/ts_build/src/clients/gemini.d.ts +6 -3
  329. package/ts_build/src/clients/gemini.js +13 -7
  330. package/ts_build/src/clients/gemini.js.map +1 -1
  331. package/ts_build/src/clients/http.d.ts +1 -0
  332. package/ts_build/src/clients/http.js +12 -5
  333. package/ts_build/src/clients/http.js.map +1 -1
  334. package/ts_build/src/clients/index.d.ts +10 -0
  335. package/ts_build/src/clients/index.js +74 -4
  336. package/ts_build/src/clients/index.js.map +1 -1
  337. package/ts_build/src/clients/knowhow.d.ts +3 -1
  338. package/ts_build/src/clients/knowhow.js +8 -2
  339. package/ts_build/src/clients/knowhow.js.map +1 -1
  340. package/ts_build/src/clients/knowhowMcp.d.ts +20 -0
  341. package/ts_build/src/clients/knowhowMcp.js +86 -0
  342. package/ts_build/src/clients/knowhowMcp.js.map +1 -0
  343. package/ts_build/src/clients/openai.d.ts +5 -2
  344. package/ts_build/src/clients/openai.js +29 -8
  345. package/ts_build/src/clients/openai.js.map +1 -1
  346. package/ts_build/src/clients/types.d.ts +1 -0
  347. package/ts_build/src/clients/xai.d.ts +5 -2
  348. package/ts_build/src/clients/xai.js +15 -5
  349. package/ts_build/src/clients/xai.js.map +1 -1
  350. package/ts_build/src/config.js +24 -3
  351. package/ts_build/src/config.js.map +1 -1
  352. package/ts_build/src/conversion.js +6 -4
  353. package/ts_build/src/conversion.js.map +1 -1
  354. package/ts_build/src/embeddings.d.ts +2 -1
  355. package/ts_build/src/embeddings.js +62 -17
  356. package/ts_build/src/embeddings.js.map +1 -1
  357. package/ts_build/src/login.d.ts +1 -1
  358. package/ts_build/src/login.js +21 -7
  359. package/ts_build/src/login.js.map +1 -1
  360. package/ts_build/src/microphone.js.map +1 -1
  361. package/ts_build/src/plugins/downloader/downloader.d.ts +4 -5
  362. package/ts_build/src/plugins/downloader/downloader.js +55 -26
  363. package/ts_build/src/plugins/downloader/downloader.js.map +1 -1
  364. package/ts_build/src/plugins/downloader/plugin.js +5 -3
  365. package/ts_build/src/plugins/downloader/plugin.js.map +1 -1
  366. package/ts_build/src/plugins/plugins.js +3 -0
  367. package/ts_build/src/plugins/plugins.js.map +1 -1
  368. package/ts_build/src/processors/CustomVariables.d.ts +32 -0
  369. package/ts_build/src/processors/CustomVariables.js +297 -0
  370. package/ts_build/src/processors/CustomVariables.js.map +1 -0
  371. package/ts_build/src/processors/HarmonyToolProcessor.d.ts +15 -0
  372. package/ts_build/src/processors/HarmonyToolProcessor.js +154 -0
  373. package/ts_build/src/processors/HarmonyToolProcessor.js.map +1 -0
  374. package/ts_build/src/processors/XmlToolCallProcessor.d.ts +14 -0
  375. package/ts_build/src/processors/XmlToolCallProcessor.js +357 -0
  376. package/ts_build/src/processors/XmlToolCallProcessor.js.map +1 -0
  377. package/ts_build/src/processors/index.d.ts +3 -0
  378. package/ts_build/src/processors/index.js +7 -1
  379. package/ts_build/src/processors/index.js.map +1 -1
  380. package/ts_build/src/prompts/KnowhowConfigExamples.d.ts +2 -0
  381. package/ts_build/src/prompts/KnowhowConfigExamples.js +379 -0
  382. package/ts_build/src/prompts/KnowhowConfigExamples.js.map +1 -0
  383. package/ts_build/src/services/KnowhowClient.d.ts +22 -0
  384. package/ts_build/src/services/KnowhowClient.js +14 -2
  385. package/ts_build/src/services/KnowhowClient.js.map +1 -1
  386. package/ts_build/src/services/Mcp.d.ts +1 -0
  387. package/ts_build/src/services/Mcp.js +20 -3
  388. package/ts_build/src/services/Mcp.js.map +1 -1
  389. package/ts_build/src/services/McpServer.d.ts +1 -1
  390. package/ts_build/src/services/McpServer.js +8 -4
  391. package/ts_build/src/services/McpServer.js.map +1 -1
  392. package/ts_build/src/services/McpWebsocketTransport.js +17 -7
  393. package/ts_build/src/services/McpWebsocketTransport.js.map +1 -1
  394. package/ts_build/src/services/MessageProcessor.d.ts +1 -1
  395. package/ts_build/src/services/MessageProcessor.js +4 -4
  396. package/ts_build/src/services/MessageProcessor.js.map +1 -1
  397. package/ts_build/src/services/index.d.ts +2 -0
  398. package/ts_build/src/services/index.js +4 -0
  399. package/ts_build/src/services/index.js.map +1 -1
  400. package/ts_build/src/services/script-execution/ScriptExecutor.d.ts +1 -0
  401. package/ts_build/src/services/script-execution/ScriptExecutor.js +23 -0
  402. package/ts_build/src/services/script-execution/ScriptExecutor.js.map +1 -1
  403. package/ts_build/src/services/types.d.ts +2 -6
  404. package/ts_build/src/services/types.js +4 -4
  405. package/ts_build/src/services/types.js.map +1 -1
  406. package/ts_build/src/types.d.ts +11 -0
  407. package/ts_build/src/types.js +8 -0
  408. package/ts_build/src/types.js.map +1 -1
  409. package/ts_build/src/utils/index.d.ts +2 -0
  410. package/ts_build/src/utils/index.js +102 -1
  411. package/ts_build/src/utils/index.js.map +1 -1
  412. package/ts_build/tests/XmlToolCallProcessor.test.d.ts +1 -0
  413. package/ts_build/tests/XmlToolCallProcessor.test.js +376 -0
  414. package/ts_build/tests/XmlToolCallProcessor.test.js.map +1 -0
  415. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.d.ts +1 -0
  416. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js +114 -0
  417. package/ts_build/tests/manual/ycmd/debug_diagnostics_test.js.map +1 -0
  418. package/ts_build/tests/manual/ycmd/minimal_advanced_test.d.ts +2 -0
  419. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js +104 -0
  420. package/ts_build/tests/manual/ycmd/minimal_advanced_test.js.map +1 -0
  421. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.d.ts +1 -0
  422. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js +74 -0
  423. package/ts_build/tests/manual/ycmd/simple_diagnostics_test.js.map +1 -0
  424. package/ts_build/tests/manual/ycmd/simple_test.d.ts +2 -0
  425. package/ts_build/tests/manual/ycmd/simple_test.js +82 -0
  426. package/ts_build/tests/manual/ycmd/simple_test.js.map +1 -0
  427. package/ts_build/tests/manual/ycmd/test-typescript-sample.d.ts +14 -0
  428. package/ts_build/tests/manual/ycmd/test-typescript-sample.js +20 -0
  429. package/ts_build/tests/manual/ycmd/test-typescript-sample.js.map +1 -0
  430. package/ts_build/tests/manual/ycmd/test_advanced_features.d.ts +2 -0
  431. package/ts_build/tests/manual/ycmd/test_advanced_features.js +297 -0
  432. package/ts_build/tests/manual/ycmd/test_advanced_features.js.map +1 -0
  433. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.d.ts +3 -0
  434. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js +262 -0
  435. package/ts_build/tests/manual/ycmd/test_advanced_with_tools.js.map +1 -0
  436. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.d.ts +2 -0
  437. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js +186 -0
  438. package/ts_build/tests/manual/ycmd/test_comprehensive_typescript.js.map +1 -0
  439. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.d.ts +1 -0
  440. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js +174 -0
  441. package/ts_build/tests/manual/ycmd/test_diagnostics_file_changes.js.map +1 -0
  442. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.d.ts +2 -0
  443. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js +106 -0
  444. package/ts_build/tests/manual/ycmd/test_diagnostics_fix.js.map +1 -0
  445. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.d.ts +1 -0
  446. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js +104 -0
  447. package/ts_build/tests/manual/ycmd/test_diagnostics_simple.js.map +1 -0
  448. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.d.ts +1 -0
  449. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js +119 -0
  450. package/ts_build/tests/manual/ycmd/test_diagnostics_timing.js.map +1 -0
  451. package/ts_build/tests/manual/ycmd/test_discover_commands.d.ts +2 -0
  452. package/ts_build/tests/manual/ycmd/test_discover_commands.js +243 -0
  453. package/ts_build/tests/manual/ycmd/test_discover_commands.js.map +1 -0
  454. package/ts_build/tests/manual/ycmd/test_endpoints.d.ts +2 -0
  455. package/ts_build/tests/manual/ycmd/test_endpoints.js +120 -0
  456. package/ts_build/tests/manual/ycmd/test_endpoints.js.map +1 -0
  457. package/ts_build/tests/manual/ycmd/test_final_comprehensive.d.ts +2 -0
  458. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js +221 -0
  459. package/ts_build/tests/manual/ycmd/test_final_comprehensive.js.map +1 -0
  460. package/ts_build/tests/manual/ycmd/test_final_validation.d.ts +2 -0
  461. package/ts_build/tests/manual/ycmd/test_final_validation.js +160 -0
  462. package/ts_build/tests/manual/ycmd/test_final_validation.js.map +1 -0
  463. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.d.ts +2 -0
  464. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js +37 -0
  465. package/ts_build/tests/manual/ycmd/test_individual_ycmd_tool.js.map +1 -0
  466. package/ts_build/tests/manual/ycmd/test_server_manager.d.ts +1 -0
  467. package/ts_build/tests/manual/ycmd/test_server_manager.js +38 -0
  468. package/ts_build/tests/manual/ycmd/test_server_manager.js.map +1 -0
  469. package/ts_build/tests/manual/ycmd/test_simple_debug.d.ts +2 -0
  470. package/ts_build/tests/manual/ycmd/test_simple_debug.js +99 -0
  471. package/ts_build/tests/manual/ycmd/test_simple_debug.js.map +1 -0
  472. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.d.ts +1 -0
  473. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js +128 -0
  474. package/ts_build/tests/manual/ycmd/test_tsserver_workflow.js.map +1 -0
  475. package/ts_build/tests/manual/ycmd/test_typescript_simple.d.ts +1 -0
  476. package/ts_build/tests/manual/ycmd/test_typescript_simple.js +66 -0
  477. package/ts_build/tests/manual/ycmd/test_typescript_simple.js.map +1 -0
  478. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.d.ts +1 -0
  479. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js +105 -0
  480. package/ts_build/tests/manual/ycmd/test_typescript_ycmd.js.map +1 -0
  481. package/ts_build/tests/manual/ycmd/test_workspace_config.d.ts +1 -0
  482. package/ts_build/tests/manual/ycmd/test_workspace_config.js +89 -0
  483. package/ts_build/tests/manual/ycmd/test_workspace_config.js.map +1 -0
  484. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.d.ts +2 -0
  485. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js +130 -0
  486. package/ts_build/tests/manual/ycmd/test_ycmd_auto_start.js.map +1 -0
  487. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.d.ts +1 -0
  488. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js +83 -0
  489. package/ts_build/tests/manual/ycmd/test_ycmd_comprehensive.js.map +1 -0
  490. package/ts_build/tests/manual/ycmd/test_ycmd_direct.d.ts +2 -0
  491. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js +149 -0
  492. package/ts_build/tests/manual/ycmd/test_ycmd_direct.js.map +1 -0
  493. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.d.ts +15 -0
  494. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js +58 -0
  495. package/ts_build/tests/manual/ycmd/test_ycmd_experiment.js.map +1 -0
  496. package/ts_build/tests/manual/ycmd/test_ycmd_final.d.ts +2 -0
  497. package/ts_build/tests/manual/ycmd/test_ycmd_final.js +195 -0
  498. package/ts_build/tests/manual/ycmd/test_ycmd_final.js.map +1 -0
  499. package/ts_build/tests/manual/ycmd/test_ycmd_integration.d.ts +3 -0
  500. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js +110 -0
  501. package/ts_build/tests/manual/ycmd/test_ycmd_integration.js.map +1 -0
  502. package/ts_build/tests/manual/ycmd/test_ycmd_simple.d.ts +2 -0
  503. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js +36 -0
  504. package/ts_build/tests/manual/ycmd/test_ycmd_simple.js.map +1 -0
  505. package/ts_build/tests/manual/ycmd/working_simple_test.d.ts +2 -0
  506. package/ts_build/tests/manual/ycmd/working_simple_test.js +134 -0
  507. package/ts_build/tests/manual/ycmd/working_simple_test.js.map +1 -0
  508. package/tsconfig.json +3 -1
@@ -0,0 +1,2990 @@
1
+ {
2
+ "config": {
3
+ "language": "javascript",
4
+ "maxExercises": 10,
5
+ "model": "gpt-4.1",
6
+ "provider": "openai",
7
+ "limits": {
8
+ "maxTurns": 30,
9
+ "maxTime": 300,
10
+ "maxCost": 1
11
+ },
12
+ "outputFile": "results.json"
13
+ },
14
+ "exercises": [
15
+ {
16
+ "exerciseName": "accumulate",
17
+ "status": "success",
18
+ "turns": 7,
19
+ "testResult": {
20
+ "passed": 5,
21
+ "failed": 0,
22
+ "total": 5,
23
+ "skipped": 0,
24
+ "success": true,
25
+ "output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":5,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":5,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754203633452,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"accumulate()\"],\"duration\":3,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"accumulate() accumulation empty\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"accumulation empty\"},{\"ancestorTitles\":[\"accumulate()\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"accumulate() accumulate squares\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"accumulate squares\"},{\"ancestorTitles\":[\"accumulate()\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"accumulate() accumulate upcases\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"accumulate upcases\"},{\"ancestorTitles\":[\"accumulate()\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"accumulate() accumulate reversed strings\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"accumulate reversed strings\"},{\"ancestorTitles\":[\"accumulate()\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"accumulate() accumulate recursively\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"accumulate recursively\"}],\"endTime\":1754203633644,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/accumulate/accumulate.spec.js\",\"startTime\":1754203633461,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
26
+ "details": {
27
+ "numFailedTestSuites": 0,
28
+ "numFailedTests": 0,
29
+ "numPassedTestSuites": 1,
30
+ "numPassedTests": 5,
31
+ "numPendingTestSuites": 0,
32
+ "numPendingTests": 0,
33
+ "numRuntimeErrorTestSuites": 0,
34
+ "numTodoTests": 0,
35
+ "numTotalTestSuites": 1,
36
+ "numTotalTests": 5,
37
+ "openHandles": [],
38
+ "snapshot": {
39
+ "added": 0,
40
+ "didUpdate": false,
41
+ "failure": false,
42
+ "filesAdded": 0,
43
+ "filesRemoved": 0,
44
+ "filesRemovedList": [],
45
+ "filesUnmatched": 0,
46
+ "filesUpdated": 0,
47
+ "matched": 0,
48
+ "total": 0,
49
+ "unchecked": 0,
50
+ "uncheckedKeysByFile": [],
51
+ "unmatched": 0,
52
+ "updated": 0
53
+ },
54
+ "startTime": 1754203633452,
55
+ "success": true,
56
+ "testResults": [
57
+ {
58
+ "assertionResults": [
59
+ {
60
+ "ancestorTitles": [
61
+ "accumulate()"
62
+ ],
63
+ "duration": 3,
64
+ "failureDetails": [],
65
+ "failureMessages": [],
66
+ "fullName": "accumulate() accumulation empty",
67
+ "invocations": 1,
68
+ "location": null,
69
+ "numPassingAsserts": 1,
70
+ "retryReasons": [],
71
+ "status": "passed",
72
+ "title": "accumulation empty"
73
+ },
74
+ {
75
+ "ancestorTitles": [
76
+ "accumulate()"
77
+ ],
78
+ "duration": 1,
79
+ "failureDetails": [],
80
+ "failureMessages": [],
81
+ "fullName": "accumulate() accumulate squares",
82
+ "invocations": 1,
83
+ "location": null,
84
+ "numPassingAsserts": 1,
85
+ "retryReasons": [],
86
+ "status": "passed",
87
+ "title": "accumulate squares"
88
+ },
89
+ {
90
+ "ancestorTitles": [
91
+ "accumulate()"
92
+ ],
93
+ "duration": 0,
94
+ "failureDetails": [],
95
+ "failureMessages": [],
96
+ "fullName": "accumulate() accumulate upcases",
97
+ "invocations": 1,
98
+ "location": null,
99
+ "numPassingAsserts": 1,
100
+ "retryReasons": [],
101
+ "status": "passed",
102
+ "title": "accumulate upcases"
103
+ },
104
+ {
105
+ "ancestorTitles": [
106
+ "accumulate()"
107
+ ],
108
+ "duration": 0,
109
+ "failureDetails": [],
110
+ "failureMessages": [],
111
+ "fullName": "accumulate() accumulate reversed strings",
112
+ "invocations": 1,
113
+ "location": null,
114
+ "numPassingAsserts": 1,
115
+ "retryReasons": [],
116
+ "status": "passed",
117
+ "title": "accumulate reversed strings"
118
+ },
119
+ {
120
+ "ancestorTitles": [
121
+ "accumulate()"
122
+ ],
123
+ "duration": 0,
124
+ "failureDetails": [],
125
+ "failureMessages": [],
126
+ "fullName": "accumulate() accumulate recursively",
127
+ "invocations": 1,
128
+ "location": null,
129
+ "numPassingAsserts": 1,
130
+ "retryReasons": [],
131
+ "status": "passed",
132
+ "title": "accumulate recursively"
133
+ }
134
+ ],
135
+ "endTime": 1754203633644,
136
+ "message": "",
137
+ "name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/accumulate/accumulate.spec.js",
138
+ "startTime": 1754203633461,
139
+ "status": "passed",
140
+ "summary": ""
141
+ }
142
+ ],
143
+ "wasInterrupted": false
144
+ }
145
+ },
146
+ "timeElapsed": 18.082,
147
+ "cost": 0.107503969664,
148
+ "startTime": "2025-08-03T06:46:55.571Z",
149
+ "endTime": "2025-08-03T06:47:13.653Z",
150
+ "finalOutput": "The accumulate function has been implemented in accumulate.js using a manual loop (without Array.map or similar standard library methods). I also unskipped all the tests in accumulate.spec.js. All tests now pass successfully:\n\n- The solution supports all the required behavior, including accumulating squares, upcasing strings, reversing, and recursive accumulation.\n\nYou can review accumulate.js to see the final implementation:\n\n```javascript\nexport const accumulate = (collection, fn) => {\n const result = [];\n for (let i = 0; i < collection.length; i++) {\n result.push(fn(collection[i]));\n }\n return result;\n};\n```\n\nTask complete! Let me know if you need further enhancements or explanations."
151
+ },
152
+ {
153
+ "exerciseName": "acronym",
154
+ "status": "success",
155
+ "turns": 10,
156
+ "testResult": {
157
+ "passed": 9,
158
+ "failed": 0,
159
+ "total": 9,
160
+ "skipped": 0,
161
+ "success": true,
162
+ "output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":9,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":9,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754203662734,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from title cased phrases\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"title cased phrases\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from other title cased phrases\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"other title cased phrases\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from phrases with punctuation\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"phrases with punctuation\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from phrases with all uppercase words\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"phrases with all uppercase words\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from phrases with punctuation without whitespace\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"phrases with punctuation without whitespace\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from long phrases\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"long phrases\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from phrases with consecutive delimiters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"phrases with consecutive delimiters\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from phrases with apostrophes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"phrases with apostrophes\"},{\"ancestorTitles\":[\"Acronyms are produced from\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Acronyms are produced from phrases with underscore emphasis\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"phrases with underscore emphasis\"}],\"endTime\":1754203662816,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/acronym/acronym.spec.js\",\"startTime\":1754203662743,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
163
+ "details": {
164
+ "numFailedTestSuites": 0,
165
+ "numFailedTests": 0,
166
+ "numPassedTestSuites": 1,
167
+ "numPassedTests": 9,
168
+ "numPendingTestSuites": 0,
169
+ "numPendingTests": 0,
170
+ "numRuntimeErrorTestSuites": 0,
171
+ "numTodoTests": 0,
172
+ "numTotalTestSuites": 1,
173
+ "numTotalTests": 9,
174
+ "openHandles": [],
175
+ "snapshot": {
176
+ "added": 0,
177
+ "didUpdate": false,
178
+ "failure": false,
179
+ "filesAdded": 0,
180
+ "filesRemoved": 0,
181
+ "filesRemovedList": [],
182
+ "filesUnmatched": 0,
183
+ "filesUpdated": 0,
184
+ "matched": 0,
185
+ "total": 0,
186
+ "unchecked": 0,
187
+ "uncheckedKeysByFile": [],
188
+ "unmatched": 0,
189
+ "updated": 0
190
+ },
191
+ "startTime": 1754203662734,
192
+ "success": true,
193
+ "testResults": [
194
+ {
195
+ "assertionResults": [
196
+ {
197
+ "ancestorTitles": [
198
+ "Acronyms are produced from"
199
+ ],
200
+ "duration": 1,
201
+ "failureDetails": [],
202
+ "failureMessages": [],
203
+ "fullName": "Acronyms are produced from title cased phrases",
204
+ "invocations": 1,
205
+ "location": null,
206
+ "numPassingAsserts": 1,
207
+ "retryReasons": [],
208
+ "status": "passed",
209
+ "title": "title cased phrases"
210
+ },
211
+ {
212
+ "ancestorTitles": [
213
+ "Acronyms are produced from"
214
+ ],
215
+ "duration": 0,
216
+ "failureDetails": [],
217
+ "failureMessages": [],
218
+ "fullName": "Acronyms are produced from other title cased phrases",
219
+ "invocations": 1,
220
+ "location": null,
221
+ "numPassingAsserts": 1,
222
+ "retryReasons": [],
223
+ "status": "passed",
224
+ "title": "other title cased phrases"
225
+ },
226
+ {
227
+ "ancestorTitles": [
228
+ "Acronyms are produced from"
229
+ ],
230
+ "duration": 0,
231
+ "failureDetails": [],
232
+ "failureMessages": [],
233
+ "fullName": "Acronyms are produced from phrases with punctuation",
234
+ "invocations": 1,
235
+ "location": null,
236
+ "numPassingAsserts": 1,
237
+ "retryReasons": [],
238
+ "status": "passed",
239
+ "title": "phrases with punctuation"
240
+ },
241
+ {
242
+ "ancestorTitles": [
243
+ "Acronyms are produced from"
244
+ ],
245
+ "duration": 0,
246
+ "failureDetails": [],
247
+ "failureMessages": [],
248
+ "fullName": "Acronyms are produced from phrases with all uppercase words",
249
+ "invocations": 1,
250
+ "location": null,
251
+ "numPassingAsserts": 1,
252
+ "retryReasons": [],
253
+ "status": "passed",
254
+ "title": "phrases with all uppercase words"
255
+ },
256
+ {
257
+ "ancestorTitles": [
258
+ "Acronyms are produced from"
259
+ ],
260
+ "duration": 1,
261
+ "failureDetails": [],
262
+ "failureMessages": [],
263
+ "fullName": "Acronyms are produced from phrases with punctuation without whitespace",
264
+ "invocations": 1,
265
+ "location": null,
266
+ "numPassingAsserts": 1,
267
+ "retryReasons": [],
268
+ "status": "passed",
269
+ "title": "phrases with punctuation without whitespace"
270
+ },
271
+ {
272
+ "ancestorTitles": [
273
+ "Acronyms are produced from"
274
+ ],
275
+ "duration": 0,
276
+ "failureDetails": [],
277
+ "failureMessages": [],
278
+ "fullName": "Acronyms are produced from long phrases",
279
+ "invocations": 1,
280
+ "location": null,
281
+ "numPassingAsserts": 1,
282
+ "retryReasons": [],
283
+ "status": "passed",
284
+ "title": "long phrases"
285
+ },
286
+ {
287
+ "ancestorTitles": [
288
+ "Acronyms are produced from"
289
+ ],
290
+ "duration": 0,
291
+ "failureDetails": [],
292
+ "failureMessages": [],
293
+ "fullName": "Acronyms are produced from phrases with consecutive delimiters",
294
+ "invocations": 1,
295
+ "location": null,
296
+ "numPassingAsserts": 1,
297
+ "retryReasons": [],
298
+ "status": "passed",
299
+ "title": "phrases with consecutive delimiters"
300
+ },
301
+ {
302
+ "ancestorTitles": [
303
+ "Acronyms are produced from"
304
+ ],
305
+ "duration": 0,
306
+ "failureDetails": [],
307
+ "failureMessages": [],
308
+ "fullName": "Acronyms are produced from phrases with apostrophes",
309
+ "invocations": 1,
310
+ "location": null,
311
+ "numPassingAsserts": 1,
312
+ "retryReasons": [],
313
+ "status": "passed",
314
+ "title": "phrases with apostrophes"
315
+ },
316
+ {
317
+ "ancestorTitles": [
318
+ "Acronyms are produced from"
319
+ ],
320
+ "duration": 0,
321
+ "failureDetails": [],
322
+ "failureMessages": [],
323
+ "fullName": "Acronyms are produced from phrases with underscore emphasis",
324
+ "invocations": 1,
325
+ "location": null,
326
+ "numPassingAsserts": 1,
327
+ "retryReasons": [],
328
+ "status": "passed",
329
+ "title": "phrases with underscore emphasis"
330
+ }
331
+ ],
332
+ "endTime": 1754203662816,
333
+ "message": "",
334
+ "name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/acronym/acronym.spec.js",
335
+ "startTime": 1754203662743,
336
+ "status": "passed",
337
+ "summary": ""
338
+ }
339
+ ],
340
+ "wasInterrupted": false
341
+ }
342
+ },
343
+ "timeElapsed": 29.187,
344
+ "cost": 0.185561933824,
345
+ "startTime": "2025-08-03T06:47:13.653Z",
346
+ "endTime": "2025-08-03T06:47:42.840Z",
347
+ "finalOutput": "The acronym exercise is complete and all requirements are fulfilled.\n\n- Implemented the `parse` function in `acronym.js` to satisfy the problem statement, including handling of punctuation and delimiters.\n- Unskipped all tests in `acronym.spec.js` to ensure full coverage.\n- Ran the test suite: all 9 cases pass successfully.\n- Performed lint checks and no issues were found.\n\nYou now have a robust acronym generator that meets the provided specifications and passes all tests."
348
+ },
349
+ {
350
+ "exerciseName": "affine-cipher",
351
+ "status": "success",
352
+ "turns": 30,
353
+ "testResult": {
354
+ "passed": 13,
355
+ "failed": 3,
356
+ "total": 16,
357
+ "skipped": 0,
358
+ "success": false,
359
+ "output": "{\"numFailedTestSuites\":1,\"numFailedTests\":3,\"numPassedTestSuites\":0,\"numPassedTests\":13,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":16,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754203755280,\"success\":false,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode yes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode yes\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode no\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode no\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode OMG\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode OMG\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode O M G\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode O M G\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode mindblowingly\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode mindblowingly\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":2,\"failureDetails\":[{\"matcherResult\":{\"actual\":\"jqgjc rw123jqg jcrw\",\"expected\":\"jqgjc rw123 jqgjc rw\",\"message\":\"expect(received).toBe(expected) // Object.is equality\\n\\nExpected: \\\"jqgjc rw123 jqgjc rw\\\"\\nReceived: \\\"jqgjc rw123jqg jcrw\\\"\",\"name\":\"toBe\",\"pass\":false}}],\"failureMessages\":[\"Error: expect(received).toBe(expected) // Object.is equality\\n\\nExpected: \\\"jqgjc rw123 jqgjc rw\\\"\\nReceived: \\\"jqgjc rw123jqg jcrw\\\"\\n at Object.toBe (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/affine-cipher.spec.js:27:65)\\n at Promise.then.completed (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/utils.js:298:28)\\n at new Promise (<anonymous>)\\n at callAsyncCircusFn (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/utils.js:231:10)\\n at _callCircusTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:316:40)\\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\\n at _runTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:252:3)\\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:126:9)\\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:121:9)\\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:121:9)\\n at run (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:71:3)\\n at runAndTransformResultsToJestFormat (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\\n at jestAdapter (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\\n at runTestInternal (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-runner/build/runTest.js:367:16)\\n at runTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-runner/build/runTest.js:444:34)\"],\"fullName\":\"Affine cipher encode encode numbers\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":0,\"retryReasons\":[],\"status\":\"failed\",\"title\":\"encode numbers\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode deep thought\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode deep thought\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode all the letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode all the letters\"},{\"ancestorTitles\":[\"Affine cipher\",\"encode\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher encode encode with a not coprime to m\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode with a not coprime to m\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher decode decode exercism\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode exercism\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher decode decode a sentence\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode a sentence\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher decode decode numbers\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode numbers\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":1,\"failureDetails\":[{\"matcherResult\":{\"actual\":\"thequickbrownfoxPuSVYo\\\\erthelazyJoM\",\"expected\":\"thequickbrownfoxjumpsoverthelazydog\",\"message\":\"expect(received).toBe(expected) // Object.is equality\\n\\nExpected: \\\"thequickbrownfoxjumpsoverthelazydog\\\"\\nReceived: \\\"thequickbrownfoxPuSVYo\\\\\\\\erthelazyJoM\\\"\",\"name\":\"toBe\",\"pass\":false}}],\"failureMessages\":[\"Error: expect(received).toBe(expected) // Object.is equality\\n\\nExpected: \\\"thequickbrownfoxjumpsoverthelazydog\\\"\\nReceived: \\\"thequickbrownfoxPuSVYo\\\\\\\\erthelazyJoM\\\"\\n at Object.toBe (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/affine-cipher.spec.js:73:9)\\n at Promise.then.completed (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/utils.js:298:28)\\n at new Promise (<anonymous>)\\n at callAsyncCircusFn (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/utils.js:231:10)\\n at _callCircusTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:316:40)\\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\\n at _runTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:252:3)\\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:126:9)\\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:121:9)\\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:121:9)\\n at run (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:71:3)\\n at runAndTransformResultsToJestFormat (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\\n at jestAdapter (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\\n at runTestInternal (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-runner/build/runTest.js:367:16)\\n at runTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-runner/build/runTest.js:444:34)\"],\"fullName\":\"Affine cipher decode decode all the letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":0,\"retryReasons\":[],\"status\":\"failed\",\"title\":\"decode all the letters\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[{\"matcherResult\":{\"actual\":\"thequickbrownfoxPuSVYo\\\\erthelazyJoM\",\"expected\":\"thequickbrownfoxjumpsoverthelazydog\",\"message\":\"expect(received).toBe(expected) // Object.is equality\\n\\nExpected: \\\"thequickbrownfoxjumpsoverthelazydog\\\"\\nReceived: \\\"thequickbrownfoxPuSVYo\\\\\\\\erthelazyJoM\\\"\",\"name\":\"toBe\",\"pass\":false}}],\"failureMessages\":[\"Error: expect(received).toBe(expected) // Object.is equality\\n\\nExpected: \\\"thequickbrownfoxjumpsoverthelazydog\\\"\\nReceived: \\\"thequickbrownfoxPuSVYo\\\\\\\\erthelazyJoM\\\"\\n at Object.toBe (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/affine-cipher.spec.js:79:9)\\n at Promise.then.completed (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/utils.js:298:28)\\n at new Promise (<anonymous>)\\n at callAsyncCircusFn (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/utils.js:231:10)\\n at _callCircusTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:316:40)\\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\\n at _runTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:252:3)\\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:126:9)\\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:121:9)\\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:121:9)\\n at run (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:71:3)\\n at runAndTransformResultsToJestFormat (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\\n at jestAdapter (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\\n at runTestInternal (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-runner/build/runTest.js:367:16)\\n at runTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-runner/build/runTest.js:444:34)\"],\"fullName\":\"Affine cipher decode decode with no spaces in input\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":0,\"retryReasons\":[],\"status\":\"failed\",\"title\":\"decode with no spaces in input\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher decode decode with too many spaces\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode with too many spaces\"},{\"ancestorTitles\":[\"Affine cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Affine cipher decode decode with a not coprime to m\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode with a not coprime to m\"}],\"endTime\":1754203755574,\"message\":\" ● Affine cipher › encode › encode numbers\\n\\n expect(received).toBe(expected) // Object.is equality\\n\\n Expected: \\\"jqgjc rw123 jqgjc rw\\\"\\n Received: \\\"jqgjc rw123jqg jcrw\\\"\\n\\n 25 |\\n 26 | test('encode numbers', () => {\\n > 27 | expect(encode('Testing,1 2 3, testing.', { a: 3, b: 4 })).toBe(\\n | ^\\n 28 | 'jqgjc rw123 jqgjc rw',\\n 29 | );\\n 30 | });\\n\\n at Object.toBe (affine-cipher.spec.js:27:65)\\n\\n ● Affine cipher › decode › decode all the letters\\n\\n expect(received).toBe(expected) // Object.is equality\\n\\n Expected: \\\"thequickbrownfoxjumpsoverthelazydog\\\"\\n Received: \\\"thequickbrownfoxPuSVYo\\\\\\\\erthelazyJoM\\\"\\n\\n 71 | expect(\\n 72 | decode('swxtj npvyk lruol iejdc blaxk swxmh qzglf', { a: 17, b: 33 }),\\n > 73 | ).toBe('thequickbrownfoxjumpsoverthelazydog');\\n | ^\\n 74 | });\\n 75 |\\n 76 | test('decode with no spaces in input', () => {\\n\\n at Object.toBe (affine-cipher.spec.js:73:9)\\n\\n ● Affine cipher › decode › decode with no spaces in input\\n\\n expect(received).toBe(expected) // Object.is equality\\n\\n Expected: \\\"thequickbrownfoxjumpsoverthelazydog\\\"\\n Received: \\\"thequickbrownfoxPuSVYo\\\\\\\\erthelazyJoM\\\"\\n\\n 77 | expect(\\n 78 | decode('swxtjnpvyklruoliejdcblaxkswxmhqzglf', { a: 17, b: 33 }),\\n > 79 | ).toBe('thequickbrownfoxjumpsoverthelazydog');\\n | ^\\n 80 | });\\n 81 |\\n 82 | test('decode with too many spaces', () => {\\n\\n at Object.toBe (affine-cipher.spec.js:79:9)\\n\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/affine-cipher.spec.js\",\"startTime\":1754203755297,\"status\":\"failed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
360
+ "details": {
361
+ "numFailedTestSuites": 1,
362
+ "numFailedTests": 3,
363
+ "numPassedTestSuites": 0,
364
+ "numPassedTests": 13,
365
+ "numPendingTestSuites": 0,
366
+ "numPendingTests": 0,
367
+ "numRuntimeErrorTestSuites": 0,
368
+ "numTodoTests": 0,
369
+ "numTotalTestSuites": 1,
370
+ "numTotalTests": 16,
371
+ "openHandles": [],
372
+ "snapshot": {
373
+ "added": 0,
374
+ "didUpdate": false,
375
+ "failure": false,
376
+ "filesAdded": 0,
377
+ "filesRemoved": 0,
378
+ "filesRemovedList": [],
379
+ "filesUnmatched": 0,
380
+ "filesUpdated": 0,
381
+ "matched": 0,
382
+ "total": 0,
383
+ "unchecked": 0,
384
+ "uncheckedKeysByFile": [],
385
+ "unmatched": 0,
386
+ "updated": 0
387
+ },
388
+ "startTime": 1754203755280,
389
+ "success": false,
390
+ "testResults": [
391
+ {
392
+ "assertionResults": [
393
+ {
394
+ "ancestorTitles": [
395
+ "Affine cipher",
396
+ "encode"
397
+ ],
398
+ "duration": 0,
399
+ "failureDetails": [],
400
+ "failureMessages": [],
401
+ "fullName": "Affine cipher encode encode yes",
402
+ "invocations": 1,
403
+ "location": null,
404
+ "numPassingAsserts": 1,
405
+ "retryReasons": [],
406
+ "status": "passed",
407
+ "title": "encode yes"
408
+ },
409
+ {
410
+ "ancestorTitles": [
411
+ "Affine cipher",
412
+ "encode"
413
+ ],
414
+ "duration": 0,
415
+ "failureDetails": [],
416
+ "failureMessages": [],
417
+ "fullName": "Affine cipher encode encode no",
418
+ "invocations": 1,
419
+ "location": null,
420
+ "numPassingAsserts": 1,
421
+ "retryReasons": [],
422
+ "status": "passed",
423
+ "title": "encode no"
424
+ },
425
+ {
426
+ "ancestorTitles": [
427
+ "Affine cipher",
428
+ "encode"
429
+ ],
430
+ "duration": 0,
431
+ "failureDetails": [],
432
+ "failureMessages": [],
433
+ "fullName": "Affine cipher encode encode OMG",
434
+ "invocations": 1,
435
+ "location": null,
436
+ "numPassingAsserts": 1,
437
+ "retryReasons": [],
438
+ "status": "passed",
439
+ "title": "encode OMG"
440
+ },
441
+ {
442
+ "ancestorTitles": [
443
+ "Affine cipher",
444
+ "encode"
445
+ ],
446
+ "duration": 0,
447
+ "failureDetails": [],
448
+ "failureMessages": [],
449
+ "fullName": "Affine cipher encode encode O M G",
450
+ "invocations": 1,
451
+ "location": null,
452
+ "numPassingAsserts": 1,
453
+ "retryReasons": [],
454
+ "status": "passed",
455
+ "title": "encode O M G"
456
+ },
457
+ {
458
+ "ancestorTitles": [
459
+ "Affine cipher",
460
+ "encode"
461
+ ],
462
+ "duration": 0,
463
+ "failureDetails": [],
464
+ "failureMessages": [],
465
+ "fullName": "Affine cipher encode encode mindblowingly",
466
+ "invocations": 1,
467
+ "location": null,
468
+ "numPassingAsserts": 1,
469
+ "retryReasons": [],
470
+ "status": "passed",
471
+ "title": "encode mindblowingly"
472
+ },
473
+ {
474
+ "ancestorTitles": [
475
+ "Affine cipher",
476
+ "encode"
477
+ ],
478
+ "duration": 2,
479
+ "failureDetails": [
480
+ {
481
+ "matcherResult": {
482
+ "actual": "jqgjc rw123jqg jcrw",
483
+ "expected": "jqgjc rw123 jqgjc rw",
484
+ "message": "expect(received).toBe(expected) // Object.is equality\n\nExpected: \"jqgjc rw123 jqgjc rw\"\nReceived: \"jqgjc rw123jqg jcrw\"",
485
+ "name": "toBe",
486
+ "pass": false
487
+ }
488
+ }
489
+ ],
490
+ "failureMessages": [
491
+ "Error: expect(received).toBe(expected) // Object.is equality\n\nExpected: \"jqgjc rw123 jqgjc rw\"\nReceived: \"jqgjc rw123jqg jcrw\"\n at Object.toBe (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/affine-cipher.spec.js:27:65)\n at Promise.then.completed (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at _runTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:121:9)\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-runner/build/runTest.js:444:34)"
492
+ ],
493
+ "fullName": "Affine cipher encode encode numbers",
494
+ "invocations": 1,
495
+ "location": null,
496
+ "numPassingAsserts": 0,
497
+ "retryReasons": [],
498
+ "status": "failed",
499
+ "title": "encode numbers"
500
+ },
501
+ {
502
+ "ancestorTitles": [
503
+ "Affine cipher",
504
+ "encode"
505
+ ],
506
+ "duration": 0,
507
+ "failureDetails": [],
508
+ "failureMessages": [],
509
+ "fullName": "Affine cipher encode encode deep thought",
510
+ "invocations": 1,
511
+ "location": null,
512
+ "numPassingAsserts": 1,
513
+ "retryReasons": [],
514
+ "status": "passed",
515
+ "title": "encode deep thought"
516
+ },
517
+ {
518
+ "ancestorTitles": [
519
+ "Affine cipher",
520
+ "encode"
521
+ ],
522
+ "duration": 1,
523
+ "failureDetails": [],
524
+ "failureMessages": [],
525
+ "fullName": "Affine cipher encode encode all the letters",
526
+ "invocations": 1,
527
+ "location": null,
528
+ "numPassingAsserts": 1,
529
+ "retryReasons": [],
530
+ "status": "passed",
531
+ "title": "encode all the letters"
532
+ },
533
+ {
534
+ "ancestorTitles": [
535
+ "Affine cipher",
536
+ "encode"
537
+ ],
538
+ "duration": 1,
539
+ "failureDetails": [],
540
+ "failureMessages": [],
541
+ "fullName": "Affine cipher encode encode with a not coprime to m",
542
+ "invocations": 1,
543
+ "location": null,
544
+ "numPassingAsserts": 1,
545
+ "retryReasons": [],
546
+ "status": "passed",
547
+ "title": "encode with a not coprime to m"
548
+ },
549
+ {
550
+ "ancestorTitles": [
551
+ "Affine cipher",
552
+ "decode"
553
+ ],
554
+ "duration": 0,
555
+ "failureDetails": [],
556
+ "failureMessages": [],
557
+ "fullName": "Affine cipher decode decode exercism",
558
+ "invocations": 1,
559
+ "location": null,
560
+ "numPassingAsserts": 1,
561
+ "retryReasons": [],
562
+ "status": "passed",
563
+ "title": "decode exercism"
564
+ },
565
+ {
566
+ "ancestorTitles": [
567
+ "Affine cipher",
568
+ "decode"
569
+ ],
570
+ "duration": 0,
571
+ "failureDetails": [],
572
+ "failureMessages": [],
573
+ "fullName": "Affine cipher decode decode a sentence",
574
+ "invocations": 1,
575
+ "location": null,
576
+ "numPassingAsserts": 1,
577
+ "retryReasons": [],
578
+ "status": "passed",
579
+ "title": "decode a sentence"
580
+ },
581
+ {
582
+ "ancestorTitles": [
583
+ "Affine cipher",
584
+ "decode"
585
+ ],
586
+ "duration": 0,
587
+ "failureDetails": [],
588
+ "failureMessages": [],
589
+ "fullName": "Affine cipher decode decode numbers",
590
+ "invocations": 1,
591
+ "location": null,
592
+ "numPassingAsserts": 1,
593
+ "retryReasons": [],
594
+ "status": "passed",
595
+ "title": "decode numbers"
596
+ },
597
+ {
598
+ "ancestorTitles": [
599
+ "Affine cipher",
600
+ "decode"
601
+ ],
602
+ "duration": 1,
603
+ "failureDetails": [
604
+ {
605
+ "matcherResult": {
606
+ "actual": "thequickbrownfoxPuSVYo\\erthelazyJoM",
607
+ "expected": "thequickbrownfoxjumpsoverthelazydog",
608
+ "message": "expect(received).toBe(expected) // Object.is equality\n\nExpected: \"thequickbrownfoxjumpsoverthelazydog\"\nReceived: \"thequickbrownfoxPuSVYo\\\\erthelazyJoM\"",
609
+ "name": "toBe",
610
+ "pass": false
611
+ }
612
+ }
613
+ ],
614
+ "failureMessages": [
615
+ "Error: expect(received).toBe(expected) // Object.is equality\n\nExpected: \"thequickbrownfoxjumpsoverthelazydog\"\nReceived: \"thequickbrownfoxPuSVYo\\\\erthelazyJoM\"\n at Object.toBe (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/affine-cipher.spec.js:73:9)\n at Promise.then.completed (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at _runTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:121:9)\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-runner/build/runTest.js:444:34)"
616
+ ],
617
+ "fullName": "Affine cipher decode decode all the letters",
618
+ "invocations": 1,
619
+ "location": null,
620
+ "numPassingAsserts": 0,
621
+ "retryReasons": [],
622
+ "status": "failed",
623
+ "title": "decode all the letters"
624
+ },
625
+ {
626
+ "ancestorTitles": [
627
+ "Affine cipher",
628
+ "decode"
629
+ ],
630
+ "duration": 0,
631
+ "failureDetails": [
632
+ {
633
+ "matcherResult": {
634
+ "actual": "thequickbrownfoxPuSVYo\\erthelazyJoM",
635
+ "expected": "thequickbrownfoxjumpsoverthelazydog",
636
+ "message": "expect(received).toBe(expected) // Object.is equality\n\nExpected: \"thequickbrownfoxjumpsoverthelazydog\"\nReceived: \"thequickbrownfoxPuSVYo\\\\erthelazyJoM\"",
637
+ "name": "toBe",
638
+ "pass": false
639
+ }
640
+ }
641
+ ],
642
+ "failureMessages": [
643
+ "Error: expect(received).toBe(expected) // Object.is equality\n\nExpected: \"thequickbrownfoxjumpsoverthelazydog\"\nReceived: \"thequickbrownfoxPuSVYo\\\\erthelazyJoM\"\n at Object.toBe (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/affine-cipher.spec.js:79:9)\n at Promise.then.completed (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/utils.js:298:28)\n at new Promise (<anonymous>)\n at callAsyncCircusFn (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/utils.js:231:10)\n at _callCircusTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:316:40)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at _runTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:252:3)\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:126:9)\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:121:9)\n at _runTestsForDescribeBlock (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:121:9)\n at run (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/run.js:71:3)\n at runAndTransformResultsToJestFormat (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapterInit.js:122:21)\n at jestAdapter (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-circus/build/legacy-code-todo-rewrite/jestAdapter.js:79:19)\n at runTestInternal (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-runner/build/runTest.js:367:16)\n at runTest (/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/node_modules/jest-runner/build/runTest.js:444:34)"
644
+ ],
645
+ "fullName": "Affine cipher decode decode with no spaces in input",
646
+ "invocations": 1,
647
+ "location": null,
648
+ "numPassingAsserts": 0,
649
+ "retryReasons": [],
650
+ "status": "failed",
651
+ "title": "decode with no spaces in input"
652
+ },
653
+ {
654
+ "ancestorTitles": [
655
+ "Affine cipher",
656
+ "decode"
657
+ ],
658
+ "duration": 0,
659
+ "failureDetails": [],
660
+ "failureMessages": [],
661
+ "fullName": "Affine cipher decode decode with too many spaces",
662
+ "invocations": 1,
663
+ "location": null,
664
+ "numPassingAsserts": 1,
665
+ "retryReasons": [],
666
+ "status": "passed",
667
+ "title": "decode with too many spaces"
668
+ },
669
+ {
670
+ "ancestorTitles": [
671
+ "Affine cipher",
672
+ "decode"
673
+ ],
674
+ "duration": 0,
675
+ "failureDetails": [],
676
+ "failureMessages": [],
677
+ "fullName": "Affine cipher decode decode with a not coprime to m",
678
+ "invocations": 1,
679
+ "location": null,
680
+ "numPassingAsserts": 1,
681
+ "retryReasons": [],
682
+ "status": "passed",
683
+ "title": "decode with a not coprime to m"
684
+ }
685
+ ],
686
+ "endTime": 1754203755574,
687
+ "message": " ● Affine cipher › encode › encode numbers\n\n expect(received).toBe(expected) // Object.is equality\n\n Expected: \"jqgjc rw123 jqgjc rw\"\n Received: \"jqgjc rw123jqg jcrw\"\n\n 25 |\n 26 | test('encode numbers', () => {\n > 27 | expect(encode('Testing,1 2 3, testing.', { a: 3, b: 4 })).toBe(\n | ^\n 28 | 'jqgjc rw123 jqgjc rw',\n 29 | );\n 30 | });\n\n at Object.toBe (affine-cipher.spec.js:27:65)\n\n ● Affine cipher › decode › decode all the letters\n\n expect(received).toBe(expected) // Object.is equality\n\n Expected: \"thequickbrownfoxjumpsoverthelazydog\"\n Received: \"thequickbrownfoxPuSVYo\\\\erthelazyJoM\"\n\n 71 | expect(\n 72 | decode('swxtj npvyk lruol iejdc blaxk swxmh qzglf', { a: 17, b: 33 }),\n > 73 | ).toBe('thequickbrownfoxjumpsoverthelazydog');\n | ^\n 74 | });\n 75 |\n 76 | test('decode with no spaces in input', () => {\n\n at Object.toBe (affine-cipher.spec.js:73:9)\n\n ● Affine cipher › decode › decode with no spaces in input\n\n expect(received).toBe(expected) // Object.is equality\n\n Expected: \"thequickbrownfoxjumpsoverthelazydog\"\n Received: \"thequickbrownfoxPuSVYo\\\\erthelazyJoM\"\n\n 77 | expect(\n 78 | decode('swxtjnpvyklruoliejdcblaxkswxmhqzglf', { a: 17, b: 33 }),\n > 79 | ).toBe('thequickbrownfoxjumpsoverthelazydog');\n | ^\n 80 | });\n 81 |\n 82 | test('decode with too many spaces', () => {\n\n at Object.toBe (affine-cipher.spec.js:79:9)\n",
688
+ "name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/affine-cipher/affine-cipher.spec.js",
689
+ "startTime": 1754203755297,
690
+ "status": "failed",
691
+ "summary": ""
692
+ }
693
+ ],
694
+ "wasInterrupted": false
695
+ }
696
+ },
697
+ "timeElapsed": 92.748,
698
+ "cost": 1.00051766976,
699
+ "startTime": "2025-08-03T06:47:42.840Z",
700
+ "endTime": "2025-08-03T06:49:15.588Z",
701
+ "finalOutput": "Task terminated due to limits reached. Turn: 30/30, Cost: $1.0005/$1.0000"
702
+ },
703
+ {
704
+ "exerciseName": "all-your-base",
705
+ "status": "success",
706
+ "turns": 28,
707
+ "testResult": {
708
+ "passed": 18,
709
+ "failed": 0,
710
+ "total": 18,
711
+ "skipped": 0,
712
+ "success": true,
713
+ "output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":18,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":18,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754203865487,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"All Your Base\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base binary to multiple decimal\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"binary to multiple decimal\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base decimal to binary\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decimal to binary\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base trinary to hexadecimal\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"trinary to hexadecimal\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base hexadecimal to trinary\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"hexadecimal to trinary\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base 15-bit integer\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"15-bit integer\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":3,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base empty list\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"empty list\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base single zero\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"single zero\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base multiple zeros\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"multiple zeros\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base leading zeros\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"leading zeros\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base negative digit\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"negative digit\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base invalid positive digit\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"invalid positive digit\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base first base is one\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"first base is one\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base second base is one\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"second base is one\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base first base is zero\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"first base is zero\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base second base is zero\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"second base is zero\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base first base is negative\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"first base is negative\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base second base is negative\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"second base is negative\"},{\"ancestorTitles\":[\"All Your Base\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"All Your Base both bases are negative\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"both bases are negative\"}],\"endTime\":1754203865704,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/all-your-base/all-your-base.spec.js\",\"startTime\":1754203865496,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
714
+ "details": {
715
+ "numFailedTestSuites": 0,
716
+ "numFailedTests": 0,
717
+ "numPassedTestSuites": 1,
718
+ "numPassedTests": 18,
719
+ "numPendingTestSuites": 0,
720
+ "numPendingTests": 0,
721
+ "numRuntimeErrorTestSuites": 0,
722
+ "numTodoTests": 0,
723
+ "numTotalTestSuites": 1,
724
+ "numTotalTests": 18,
725
+ "openHandles": [],
726
+ "snapshot": {
727
+ "added": 0,
728
+ "didUpdate": false,
729
+ "failure": false,
730
+ "filesAdded": 0,
731
+ "filesRemoved": 0,
732
+ "filesRemovedList": [],
733
+ "filesUnmatched": 0,
734
+ "filesUpdated": 0,
735
+ "matched": 0,
736
+ "total": 0,
737
+ "unchecked": 0,
738
+ "uncheckedKeysByFile": [],
739
+ "unmatched": 0,
740
+ "updated": 0
741
+ },
742
+ "startTime": 1754203865487,
743
+ "success": true,
744
+ "testResults": [
745
+ {
746
+ "assertionResults": [
747
+ {
748
+ "ancestorTitles": [
749
+ "All Your Base"
750
+ ],
751
+ "duration": 1,
752
+ "failureDetails": [],
753
+ "failureMessages": [],
754
+ "fullName": "All Your Base binary to multiple decimal",
755
+ "invocations": 1,
756
+ "location": null,
757
+ "numPassingAsserts": 1,
758
+ "retryReasons": [],
759
+ "status": "passed",
760
+ "title": "binary to multiple decimal"
761
+ },
762
+ {
763
+ "ancestorTitles": [
764
+ "All Your Base"
765
+ ],
766
+ "duration": 0,
767
+ "failureDetails": [],
768
+ "failureMessages": [],
769
+ "fullName": "All Your Base decimal to binary",
770
+ "invocations": 1,
771
+ "location": null,
772
+ "numPassingAsserts": 1,
773
+ "retryReasons": [],
774
+ "status": "passed",
775
+ "title": "decimal to binary"
776
+ },
777
+ {
778
+ "ancestorTitles": [
779
+ "All Your Base"
780
+ ],
781
+ "duration": 0,
782
+ "failureDetails": [],
783
+ "failureMessages": [],
784
+ "fullName": "All Your Base trinary to hexadecimal",
785
+ "invocations": 1,
786
+ "location": null,
787
+ "numPassingAsserts": 1,
788
+ "retryReasons": [],
789
+ "status": "passed",
790
+ "title": "trinary to hexadecimal"
791
+ },
792
+ {
793
+ "ancestorTitles": [
794
+ "All Your Base"
795
+ ],
796
+ "duration": 0,
797
+ "failureDetails": [],
798
+ "failureMessages": [],
799
+ "fullName": "All Your Base hexadecimal to trinary",
800
+ "invocations": 1,
801
+ "location": null,
802
+ "numPassingAsserts": 1,
803
+ "retryReasons": [],
804
+ "status": "passed",
805
+ "title": "hexadecimal to trinary"
806
+ },
807
+ {
808
+ "ancestorTitles": [
809
+ "All Your Base"
810
+ ],
811
+ "duration": 0,
812
+ "failureDetails": [],
813
+ "failureMessages": [],
814
+ "fullName": "All Your Base 15-bit integer",
815
+ "invocations": 1,
816
+ "location": null,
817
+ "numPassingAsserts": 1,
818
+ "retryReasons": [],
819
+ "status": "passed",
820
+ "title": "15-bit integer"
821
+ },
822
+ {
823
+ "ancestorTitles": [
824
+ "All Your Base"
825
+ ],
826
+ "duration": 3,
827
+ "failureDetails": [],
828
+ "failureMessages": [],
829
+ "fullName": "All Your Base empty list",
830
+ "invocations": 1,
831
+ "location": null,
832
+ "numPassingAsserts": 1,
833
+ "retryReasons": [],
834
+ "status": "passed",
835
+ "title": "empty list"
836
+ },
837
+ {
838
+ "ancestorTitles": [
839
+ "All Your Base"
840
+ ],
841
+ "duration": 0,
842
+ "failureDetails": [],
843
+ "failureMessages": [],
844
+ "fullName": "All Your Base single zero",
845
+ "invocations": 1,
846
+ "location": null,
847
+ "numPassingAsserts": 1,
848
+ "retryReasons": [],
849
+ "status": "passed",
850
+ "title": "single zero"
851
+ },
852
+ {
853
+ "ancestorTitles": [
854
+ "All Your Base"
855
+ ],
856
+ "duration": 0,
857
+ "failureDetails": [],
858
+ "failureMessages": [],
859
+ "fullName": "All Your Base multiple zeros",
860
+ "invocations": 1,
861
+ "location": null,
862
+ "numPassingAsserts": 1,
863
+ "retryReasons": [],
864
+ "status": "passed",
865
+ "title": "multiple zeros"
866
+ },
867
+ {
868
+ "ancestorTitles": [
869
+ "All Your Base"
870
+ ],
871
+ "duration": 1,
872
+ "failureDetails": [],
873
+ "failureMessages": [],
874
+ "fullName": "All Your Base leading zeros",
875
+ "invocations": 1,
876
+ "location": null,
877
+ "numPassingAsserts": 1,
878
+ "retryReasons": [],
879
+ "status": "passed",
880
+ "title": "leading zeros"
881
+ },
882
+ {
883
+ "ancestorTitles": [
884
+ "All Your Base"
885
+ ],
886
+ "duration": 0,
887
+ "failureDetails": [],
888
+ "failureMessages": [],
889
+ "fullName": "All Your Base negative digit",
890
+ "invocations": 1,
891
+ "location": null,
892
+ "numPassingAsserts": 1,
893
+ "retryReasons": [],
894
+ "status": "passed",
895
+ "title": "negative digit"
896
+ },
897
+ {
898
+ "ancestorTitles": [
899
+ "All Your Base"
900
+ ],
901
+ "duration": 0,
902
+ "failureDetails": [],
903
+ "failureMessages": [],
904
+ "fullName": "All Your Base invalid positive digit",
905
+ "invocations": 1,
906
+ "location": null,
907
+ "numPassingAsserts": 1,
908
+ "retryReasons": [],
909
+ "status": "passed",
910
+ "title": "invalid positive digit"
911
+ },
912
+ {
913
+ "ancestorTitles": [
914
+ "All Your Base"
915
+ ],
916
+ "duration": 0,
917
+ "failureDetails": [],
918
+ "failureMessages": [],
919
+ "fullName": "All Your Base first base is one",
920
+ "invocations": 1,
921
+ "location": null,
922
+ "numPassingAsserts": 1,
923
+ "retryReasons": [],
924
+ "status": "passed",
925
+ "title": "first base is one"
926
+ },
927
+ {
928
+ "ancestorTitles": [
929
+ "All Your Base"
930
+ ],
931
+ "duration": 0,
932
+ "failureDetails": [],
933
+ "failureMessages": [],
934
+ "fullName": "All Your Base second base is one",
935
+ "invocations": 1,
936
+ "location": null,
937
+ "numPassingAsserts": 1,
938
+ "retryReasons": [],
939
+ "status": "passed",
940
+ "title": "second base is one"
941
+ },
942
+ {
943
+ "ancestorTitles": [
944
+ "All Your Base"
945
+ ],
946
+ "duration": 0,
947
+ "failureDetails": [],
948
+ "failureMessages": [],
949
+ "fullName": "All Your Base first base is zero",
950
+ "invocations": 1,
951
+ "location": null,
952
+ "numPassingAsserts": 1,
953
+ "retryReasons": [],
954
+ "status": "passed",
955
+ "title": "first base is zero"
956
+ },
957
+ {
958
+ "ancestorTitles": [
959
+ "All Your Base"
960
+ ],
961
+ "duration": 0,
962
+ "failureDetails": [],
963
+ "failureMessages": [],
964
+ "fullName": "All Your Base second base is zero",
965
+ "invocations": 1,
966
+ "location": null,
967
+ "numPassingAsserts": 1,
968
+ "retryReasons": [],
969
+ "status": "passed",
970
+ "title": "second base is zero"
971
+ },
972
+ {
973
+ "ancestorTitles": [
974
+ "All Your Base"
975
+ ],
976
+ "duration": 0,
977
+ "failureDetails": [],
978
+ "failureMessages": [],
979
+ "fullName": "All Your Base first base is negative",
980
+ "invocations": 1,
981
+ "location": null,
982
+ "numPassingAsserts": 1,
983
+ "retryReasons": [],
984
+ "status": "passed",
985
+ "title": "first base is negative"
986
+ },
987
+ {
988
+ "ancestorTitles": [
989
+ "All Your Base"
990
+ ],
991
+ "duration": 0,
992
+ "failureDetails": [],
993
+ "failureMessages": [],
994
+ "fullName": "All Your Base second base is negative",
995
+ "invocations": 1,
996
+ "location": null,
997
+ "numPassingAsserts": 1,
998
+ "retryReasons": [],
999
+ "status": "passed",
1000
+ "title": "second base is negative"
1001
+ },
1002
+ {
1003
+ "ancestorTitles": [
1004
+ "All Your Base"
1005
+ ],
1006
+ "duration": 1,
1007
+ "failureDetails": [],
1008
+ "failureMessages": [],
1009
+ "fullName": "All Your Base both bases are negative",
1010
+ "invocations": 1,
1011
+ "location": null,
1012
+ "numPassingAsserts": 1,
1013
+ "retryReasons": [],
1014
+ "status": "passed",
1015
+ "title": "both bases are negative"
1016
+ }
1017
+ ],
1018
+ "endTime": 1754203865704,
1019
+ "message": "",
1020
+ "name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/all-your-base/all-your-base.spec.js",
1021
+ "startTime": 1754203865496,
1022
+ "status": "passed",
1023
+ "summary": ""
1024
+ }
1025
+ ],
1026
+ "wasInterrupted": false
1027
+ }
1028
+ },
1029
+ "timeElapsed": 110.126,
1030
+ "cost": 1.026641678208,
1031
+ "startTime": "2025-08-03T06:49:15.588Z",
1032
+ "endTime": "2025-08-03T06:51:05.714Z",
1033
+ "finalOutput": "Task terminated due to limits reached. Turn: 28/30, Cost: $1.0266/$1.0000"
1034
+ },
1035
+ {
1036
+ "exerciseName": "allergies",
1037
+ "status": "success",
1038
+ "turns": 12,
1039
+ "testResult": {
1040
+ "passed": 50,
1041
+ "failed": 0,
1042
+ "total": 50,
1043
+ "skipped": 0,
1044
+ "success": true,
1045
+ "output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":50,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":50,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754203882891,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Allergies\",\"testing for eggs allergy\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for eggs allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for eggs allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for eggs allergy allergic only to eggs\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to eggs\"},{\"ancestorTitles\":[\"Allergies\",\"testing for eggs allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for eggs allergy allergic to eggs and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to eggs and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for eggs allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for eggs allergy allergic to something, but not eggs\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not eggs\"},{\"ancestorTitles\":[\"Allergies\",\"testing for eggs allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for eggs allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for peanuts allergy\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for peanuts allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for peanuts allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for peanuts allergy allergic only to peanuts\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to peanuts\"},{\"ancestorTitles\":[\"Allergies\",\"testing for peanuts allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for peanuts allergy allergic to peanuts and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to peanuts and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for peanuts allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for peanuts allergy allergic to something, but not peanuts\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not peanuts\"},{\"ancestorTitles\":[\"Allergies\",\"testing for peanuts allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for peanuts allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for shellfish allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for shellfish allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for shellfish allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for shellfish allergy allergic only to shellfish\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to shellfish\"},{\"ancestorTitles\":[\"Allergies\",\"testing for shellfish allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for shellfish allergy allergic to shellfish and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to shellfish and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for shellfish allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for shellfish allergy allergic to something, but not shellfish\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not shellfish\"},{\"ancestorTitles\":[\"Allergies\",\"testing for shellfish allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for shellfish allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for strawberries allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for strawberries allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for strawberries allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for strawberries allergy allergic only to strawberries\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to strawberries\"},{\"ancestorTitles\":[\"Allergies\",\"testing for strawberries allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for strawberries allergy allergic to strawberries and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to strawberries and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for strawberries allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for strawberries allergy allergic to something, but not strawberries\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not strawberries\"},{\"ancestorTitles\":[\"Allergies\",\"testing for strawberries allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for strawberries allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for tomatoes allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for tomatoes allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for tomatoes allergy\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for tomatoes allergy allergic only to tomatoes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to tomatoes\"},{\"ancestorTitles\":[\"Allergies\",\"testing for tomatoes allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for tomatoes allergy allergic to tomatoes and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to tomatoes and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for tomatoes allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for tomatoes allergy allergic to something, but not tomatoes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not tomatoes\"},{\"ancestorTitles\":[\"Allergies\",\"testing for tomatoes allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for tomatoes allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for chocolate allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for chocolate allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for chocolate allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for chocolate allergy allergic only to chocolate\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to chocolate\"},{\"ancestorTitles\":[\"Allergies\",\"testing for chocolate allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for chocolate allergy allergic to chocolate and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to chocolate and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for chocolate allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for chocolate allergy allergic to something, but not chocolate\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not chocolate\"},{\"ancestorTitles\":[\"Allergies\",\"testing for chocolate allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for chocolate allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for pollen allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for pollen allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for pollen allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for pollen allergy allergic only to pollen\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to pollen\"},{\"ancestorTitles\":[\"Allergies\",\"testing for pollen allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for pollen allergy allergic to pollen and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to pollen and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for pollen allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for pollen allergy allergic to something, but not pollen\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not pollen\"},{\"ancestorTitles\":[\"Allergies\",\"testing for pollen allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for pollen allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for cats allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for cats allergy not allergic to anything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"not allergic to anything\"},{\"ancestorTitles\":[\"Allergies\",\"testing for cats allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for cats allergy allergic only to cats\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic only to cats\"},{\"ancestorTitles\":[\"Allergies\",\"testing for cats allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for cats allergy allergic to cats and something else\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to cats and something else\"},{\"ancestorTitles\":[\"Allergies\",\"testing for cats allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for cats allergy allergic to something, but not cats\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to something, but not cats\"},{\"ancestorTitles\":[\"Allergies\",\"testing for cats allergy\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies testing for cats allergy allergic to everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"allergic to everything\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: no allergies\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"no allergies\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: just eggs\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"just eggs\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: just peanuts\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"just peanuts\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: just strawberries\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"just strawberries\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: eggs and peanuts\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"eggs and peanuts\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: more than eggs but not peanuts\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"more than eggs but not peanuts\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: lots of stuff\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"lots of stuff\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: everything\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"everything\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: no allergen score parts\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"no allergen score parts\"},{\"ancestorTitles\":[\"Allergies\",\"list when:\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Allergies list when: no allergen score parts without highest valid score\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"no allergen score parts without highest valid score\"}],\"endTime\":1754203882970,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/allergies/allergies.spec.js\",\"startTime\":1754203882900,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
1046
+ "details": {
1047
+ "numFailedTestSuites": 0,
1048
+ "numFailedTests": 0,
1049
+ "numPassedTestSuites": 1,
1050
+ "numPassedTests": 50,
1051
+ "numPendingTestSuites": 0,
1052
+ "numPendingTests": 0,
1053
+ "numRuntimeErrorTestSuites": 0,
1054
+ "numTodoTests": 0,
1055
+ "numTotalTestSuites": 1,
1056
+ "numTotalTests": 50,
1057
+ "openHandles": [],
1058
+ "snapshot": {
1059
+ "added": 0,
1060
+ "didUpdate": false,
1061
+ "failure": false,
1062
+ "filesAdded": 0,
1063
+ "filesRemoved": 0,
1064
+ "filesRemovedList": [],
1065
+ "filesUnmatched": 0,
1066
+ "filesUpdated": 0,
1067
+ "matched": 0,
1068
+ "total": 0,
1069
+ "unchecked": 0,
1070
+ "uncheckedKeysByFile": [],
1071
+ "unmatched": 0,
1072
+ "updated": 0
1073
+ },
1074
+ "startTime": 1754203882891,
1075
+ "success": true,
1076
+ "testResults": [
1077
+ {
1078
+ "assertionResults": [
1079
+ {
1080
+ "ancestorTitles": [
1081
+ "Allergies",
1082
+ "testing for eggs allergy"
1083
+ ],
1084
+ "duration": 1,
1085
+ "failureDetails": [],
1086
+ "failureMessages": [],
1087
+ "fullName": "Allergies testing for eggs allergy not allergic to anything",
1088
+ "invocations": 1,
1089
+ "location": null,
1090
+ "numPassingAsserts": 1,
1091
+ "retryReasons": [],
1092
+ "status": "passed",
1093
+ "title": "not allergic to anything"
1094
+ },
1095
+ {
1096
+ "ancestorTitles": [
1097
+ "Allergies",
1098
+ "testing for eggs allergy"
1099
+ ],
1100
+ "duration": 0,
1101
+ "failureDetails": [],
1102
+ "failureMessages": [],
1103
+ "fullName": "Allergies testing for eggs allergy allergic only to eggs",
1104
+ "invocations": 1,
1105
+ "location": null,
1106
+ "numPassingAsserts": 1,
1107
+ "retryReasons": [],
1108
+ "status": "passed",
1109
+ "title": "allergic only to eggs"
1110
+ },
1111
+ {
1112
+ "ancestorTitles": [
1113
+ "Allergies",
1114
+ "testing for eggs allergy"
1115
+ ],
1116
+ "duration": 0,
1117
+ "failureDetails": [],
1118
+ "failureMessages": [],
1119
+ "fullName": "Allergies testing for eggs allergy allergic to eggs and something else",
1120
+ "invocations": 1,
1121
+ "location": null,
1122
+ "numPassingAsserts": 1,
1123
+ "retryReasons": [],
1124
+ "status": "passed",
1125
+ "title": "allergic to eggs and something else"
1126
+ },
1127
+ {
1128
+ "ancestorTitles": [
1129
+ "Allergies",
1130
+ "testing for eggs allergy"
1131
+ ],
1132
+ "duration": 0,
1133
+ "failureDetails": [],
1134
+ "failureMessages": [],
1135
+ "fullName": "Allergies testing for eggs allergy allergic to something, but not eggs",
1136
+ "invocations": 1,
1137
+ "location": null,
1138
+ "numPassingAsserts": 1,
1139
+ "retryReasons": [],
1140
+ "status": "passed",
1141
+ "title": "allergic to something, but not eggs"
1142
+ },
1143
+ {
1144
+ "ancestorTitles": [
1145
+ "Allergies",
1146
+ "testing for eggs allergy"
1147
+ ],
1148
+ "duration": 0,
1149
+ "failureDetails": [],
1150
+ "failureMessages": [],
1151
+ "fullName": "Allergies testing for eggs allergy allergic to everything",
1152
+ "invocations": 1,
1153
+ "location": null,
1154
+ "numPassingAsserts": 1,
1155
+ "retryReasons": [],
1156
+ "status": "passed",
1157
+ "title": "allergic to everything"
1158
+ },
1159
+ {
1160
+ "ancestorTitles": [
1161
+ "Allergies",
1162
+ "testing for peanuts allergy"
1163
+ ],
1164
+ "duration": 1,
1165
+ "failureDetails": [],
1166
+ "failureMessages": [],
1167
+ "fullName": "Allergies testing for peanuts allergy not allergic to anything",
1168
+ "invocations": 1,
1169
+ "location": null,
1170
+ "numPassingAsserts": 1,
1171
+ "retryReasons": [],
1172
+ "status": "passed",
1173
+ "title": "not allergic to anything"
1174
+ },
1175
+ {
1176
+ "ancestorTitles": [
1177
+ "Allergies",
1178
+ "testing for peanuts allergy"
1179
+ ],
1180
+ "duration": 0,
1181
+ "failureDetails": [],
1182
+ "failureMessages": [],
1183
+ "fullName": "Allergies testing for peanuts allergy allergic only to peanuts",
1184
+ "invocations": 1,
1185
+ "location": null,
1186
+ "numPassingAsserts": 1,
1187
+ "retryReasons": [],
1188
+ "status": "passed",
1189
+ "title": "allergic only to peanuts"
1190
+ },
1191
+ {
1192
+ "ancestorTitles": [
1193
+ "Allergies",
1194
+ "testing for peanuts allergy"
1195
+ ],
1196
+ "duration": 0,
1197
+ "failureDetails": [],
1198
+ "failureMessages": [],
1199
+ "fullName": "Allergies testing for peanuts allergy allergic to peanuts and something else",
1200
+ "invocations": 1,
1201
+ "location": null,
1202
+ "numPassingAsserts": 1,
1203
+ "retryReasons": [],
1204
+ "status": "passed",
1205
+ "title": "allergic to peanuts and something else"
1206
+ },
1207
+ {
1208
+ "ancestorTitles": [
1209
+ "Allergies",
1210
+ "testing for peanuts allergy"
1211
+ ],
1212
+ "duration": 0,
1213
+ "failureDetails": [],
1214
+ "failureMessages": [],
1215
+ "fullName": "Allergies testing for peanuts allergy allergic to something, but not peanuts",
1216
+ "invocations": 1,
1217
+ "location": null,
1218
+ "numPassingAsserts": 1,
1219
+ "retryReasons": [],
1220
+ "status": "passed",
1221
+ "title": "allergic to something, but not peanuts"
1222
+ },
1223
+ {
1224
+ "ancestorTitles": [
1225
+ "Allergies",
1226
+ "testing for peanuts allergy"
1227
+ ],
1228
+ "duration": 0,
1229
+ "failureDetails": [],
1230
+ "failureMessages": [],
1231
+ "fullName": "Allergies testing for peanuts allergy allergic to everything",
1232
+ "invocations": 1,
1233
+ "location": null,
1234
+ "numPassingAsserts": 1,
1235
+ "retryReasons": [],
1236
+ "status": "passed",
1237
+ "title": "allergic to everything"
1238
+ },
1239
+ {
1240
+ "ancestorTitles": [
1241
+ "Allergies",
1242
+ "testing for shellfish allergy"
1243
+ ],
1244
+ "duration": 0,
1245
+ "failureDetails": [],
1246
+ "failureMessages": [],
1247
+ "fullName": "Allergies testing for shellfish allergy not allergic to anything",
1248
+ "invocations": 1,
1249
+ "location": null,
1250
+ "numPassingAsserts": 1,
1251
+ "retryReasons": [],
1252
+ "status": "passed",
1253
+ "title": "not allergic to anything"
1254
+ },
1255
+ {
1256
+ "ancestorTitles": [
1257
+ "Allergies",
1258
+ "testing for shellfish allergy"
1259
+ ],
1260
+ "duration": 0,
1261
+ "failureDetails": [],
1262
+ "failureMessages": [],
1263
+ "fullName": "Allergies testing for shellfish allergy allergic only to shellfish",
1264
+ "invocations": 1,
1265
+ "location": null,
1266
+ "numPassingAsserts": 1,
1267
+ "retryReasons": [],
1268
+ "status": "passed",
1269
+ "title": "allergic only to shellfish"
1270
+ },
1271
+ {
1272
+ "ancestorTitles": [
1273
+ "Allergies",
1274
+ "testing for shellfish allergy"
1275
+ ],
1276
+ "duration": 0,
1277
+ "failureDetails": [],
1278
+ "failureMessages": [],
1279
+ "fullName": "Allergies testing for shellfish allergy allergic to shellfish and something else",
1280
+ "invocations": 1,
1281
+ "location": null,
1282
+ "numPassingAsserts": 1,
1283
+ "retryReasons": [],
1284
+ "status": "passed",
1285
+ "title": "allergic to shellfish and something else"
1286
+ },
1287
+ {
1288
+ "ancestorTitles": [
1289
+ "Allergies",
1290
+ "testing for shellfish allergy"
1291
+ ],
1292
+ "duration": 0,
1293
+ "failureDetails": [],
1294
+ "failureMessages": [],
1295
+ "fullName": "Allergies testing for shellfish allergy allergic to something, but not shellfish",
1296
+ "invocations": 1,
1297
+ "location": null,
1298
+ "numPassingAsserts": 1,
1299
+ "retryReasons": [],
1300
+ "status": "passed",
1301
+ "title": "allergic to something, but not shellfish"
1302
+ },
1303
+ {
1304
+ "ancestorTitles": [
1305
+ "Allergies",
1306
+ "testing for shellfish allergy"
1307
+ ],
1308
+ "duration": 0,
1309
+ "failureDetails": [],
1310
+ "failureMessages": [],
1311
+ "fullName": "Allergies testing for shellfish allergy allergic to everything",
1312
+ "invocations": 1,
1313
+ "location": null,
1314
+ "numPassingAsserts": 1,
1315
+ "retryReasons": [],
1316
+ "status": "passed",
1317
+ "title": "allergic to everything"
1318
+ },
1319
+ {
1320
+ "ancestorTitles": [
1321
+ "Allergies",
1322
+ "testing for strawberries allergy"
1323
+ ],
1324
+ "duration": 0,
1325
+ "failureDetails": [],
1326
+ "failureMessages": [],
1327
+ "fullName": "Allergies testing for strawberries allergy not allergic to anything",
1328
+ "invocations": 1,
1329
+ "location": null,
1330
+ "numPassingAsserts": 1,
1331
+ "retryReasons": [],
1332
+ "status": "passed",
1333
+ "title": "not allergic to anything"
1334
+ },
1335
+ {
1336
+ "ancestorTitles": [
1337
+ "Allergies",
1338
+ "testing for strawberries allergy"
1339
+ ],
1340
+ "duration": 0,
1341
+ "failureDetails": [],
1342
+ "failureMessages": [],
1343
+ "fullName": "Allergies testing for strawberries allergy allergic only to strawberries",
1344
+ "invocations": 1,
1345
+ "location": null,
1346
+ "numPassingAsserts": 1,
1347
+ "retryReasons": [],
1348
+ "status": "passed",
1349
+ "title": "allergic only to strawberries"
1350
+ },
1351
+ {
1352
+ "ancestorTitles": [
1353
+ "Allergies",
1354
+ "testing for strawberries allergy"
1355
+ ],
1356
+ "duration": 0,
1357
+ "failureDetails": [],
1358
+ "failureMessages": [],
1359
+ "fullName": "Allergies testing for strawberries allergy allergic to strawberries and something else",
1360
+ "invocations": 1,
1361
+ "location": null,
1362
+ "numPassingAsserts": 1,
1363
+ "retryReasons": [],
1364
+ "status": "passed",
1365
+ "title": "allergic to strawberries and something else"
1366
+ },
1367
+ {
1368
+ "ancestorTitles": [
1369
+ "Allergies",
1370
+ "testing for strawberries allergy"
1371
+ ],
1372
+ "duration": 0,
1373
+ "failureDetails": [],
1374
+ "failureMessages": [],
1375
+ "fullName": "Allergies testing for strawberries allergy allergic to something, but not strawberries",
1376
+ "invocations": 1,
1377
+ "location": null,
1378
+ "numPassingAsserts": 1,
1379
+ "retryReasons": [],
1380
+ "status": "passed",
1381
+ "title": "allergic to something, but not strawberries"
1382
+ },
1383
+ {
1384
+ "ancestorTitles": [
1385
+ "Allergies",
1386
+ "testing for strawberries allergy"
1387
+ ],
1388
+ "duration": 0,
1389
+ "failureDetails": [],
1390
+ "failureMessages": [],
1391
+ "fullName": "Allergies testing for strawberries allergy allergic to everything",
1392
+ "invocations": 1,
1393
+ "location": null,
1394
+ "numPassingAsserts": 1,
1395
+ "retryReasons": [],
1396
+ "status": "passed",
1397
+ "title": "allergic to everything"
1398
+ },
1399
+ {
1400
+ "ancestorTitles": [
1401
+ "Allergies",
1402
+ "testing for tomatoes allergy"
1403
+ ],
1404
+ "duration": 0,
1405
+ "failureDetails": [],
1406
+ "failureMessages": [],
1407
+ "fullName": "Allergies testing for tomatoes allergy not allergic to anything",
1408
+ "invocations": 1,
1409
+ "location": null,
1410
+ "numPassingAsserts": 1,
1411
+ "retryReasons": [],
1412
+ "status": "passed",
1413
+ "title": "not allergic to anything"
1414
+ },
1415
+ {
1416
+ "ancestorTitles": [
1417
+ "Allergies",
1418
+ "testing for tomatoes allergy"
1419
+ ],
1420
+ "duration": 1,
1421
+ "failureDetails": [],
1422
+ "failureMessages": [],
1423
+ "fullName": "Allergies testing for tomatoes allergy allergic only to tomatoes",
1424
+ "invocations": 1,
1425
+ "location": null,
1426
+ "numPassingAsserts": 1,
1427
+ "retryReasons": [],
1428
+ "status": "passed",
1429
+ "title": "allergic only to tomatoes"
1430
+ },
1431
+ {
1432
+ "ancestorTitles": [
1433
+ "Allergies",
1434
+ "testing for tomatoes allergy"
1435
+ ],
1436
+ "duration": 0,
1437
+ "failureDetails": [],
1438
+ "failureMessages": [],
1439
+ "fullName": "Allergies testing for tomatoes allergy allergic to tomatoes and something else",
1440
+ "invocations": 1,
1441
+ "location": null,
1442
+ "numPassingAsserts": 1,
1443
+ "retryReasons": [],
1444
+ "status": "passed",
1445
+ "title": "allergic to tomatoes and something else"
1446
+ },
1447
+ {
1448
+ "ancestorTitles": [
1449
+ "Allergies",
1450
+ "testing for tomatoes allergy"
1451
+ ],
1452
+ "duration": 0,
1453
+ "failureDetails": [],
1454
+ "failureMessages": [],
1455
+ "fullName": "Allergies testing for tomatoes allergy allergic to something, but not tomatoes",
1456
+ "invocations": 1,
1457
+ "location": null,
1458
+ "numPassingAsserts": 1,
1459
+ "retryReasons": [],
1460
+ "status": "passed",
1461
+ "title": "allergic to something, but not tomatoes"
1462
+ },
1463
+ {
1464
+ "ancestorTitles": [
1465
+ "Allergies",
1466
+ "testing for tomatoes allergy"
1467
+ ],
1468
+ "duration": 0,
1469
+ "failureDetails": [],
1470
+ "failureMessages": [],
1471
+ "fullName": "Allergies testing for tomatoes allergy allergic to everything",
1472
+ "invocations": 1,
1473
+ "location": null,
1474
+ "numPassingAsserts": 1,
1475
+ "retryReasons": [],
1476
+ "status": "passed",
1477
+ "title": "allergic to everything"
1478
+ },
1479
+ {
1480
+ "ancestorTitles": [
1481
+ "Allergies",
1482
+ "testing for chocolate allergy"
1483
+ ],
1484
+ "duration": 0,
1485
+ "failureDetails": [],
1486
+ "failureMessages": [],
1487
+ "fullName": "Allergies testing for chocolate allergy not allergic to anything",
1488
+ "invocations": 1,
1489
+ "location": null,
1490
+ "numPassingAsserts": 1,
1491
+ "retryReasons": [],
1492
+ "status": "passed",
1493
+ "title": "not allergic to anything"
1494
+ },
1495
+ {
1496
+ "ancestorTitles": [
1497
+ "Allergies",
1498
+ "testing for chocolate allergy"
1499
+ ],
1500
+ "duration": 0,
1501
+ "failureDetails": [],
1502
+ "failureMessages": [],
1503
+ "fullName": "Allergies testing for chocolate allergy allergic only to chocolate",
1504
+ "invocations": 1,
1505
+ "location": null,
1506
+ "numPassingAsserts": 1,
1507
+ "retryReasons": [],
1508
+ "status": "passed",
1509
+ "title": "allergic only to chocolate"
1510
+ },
1511
+ {
1512
+ "ancestorTitles": [
1513
+ "Allergies",
1514
+ "testing for chocolate allergy"
1515
+ ],
1516
+ "duration": 0,
1517
+ "failureDetails": [],
1518
+ "failureMessages": [],
1519
+ "fullName": "Allergies testing for chocolate allergy allergic to chocolate and something else",
1520
+ "invocations": 1,
1521
+ "location": null,
1522
+ "numPassingAsserts": 1,
1523
+ "retryReasons": [],
1524
+ "status": "passed",
1525
+ "title": "allergic to chocolate and something else"
1526
+ },
1527
+ {
1528
+ "ancestorTitles": [
1529
+ "Allergies",
1530
+ "testing for chocolate allergy"
1531
+ ],
1532
+ "duration": 0,
1533
+ "failureDetails": [],
1534
+ "failureMessages": [],
1535
+ "fullName": "Allergies testing for chocolate allergy allergic to something, but not chocolate",
1536
+ "invocations": 1,
1537
+ "location": null,
1538
+ "numPassingAsserts": 1,
1539
+ "retryReasons": [],
1540
+ "status": "passed",
1541
+ "title": "allergic to something, but not chocolate"
1542
+ },
1543
+ {
1544
+ "ancestorTitles": [
1545
+ "Allergies",
1546
+ "testing for chocolate allergy"
1547
+ ],
1548
+ "duration": 0,
1549
+ "failureDetails": [],
1550
+ "failureMessages": [],
1551
+ "fullName": "Allergies testing for chocolate allergy allergic to everything",
1552
+ "invocations": 1,
1553
+ "location": null,
1554
+ "numPassingAsserts": 1,
1555
+ "retryReasons": [],
1556
+ "status": "passed",
1557
+ "title": "allergic to everything"
1558
+ },
1559
+ {
1560
+ "ancestorTitles": [
1561
+ "Allergies",
1562
+ "testing for pollen allergy"
1563
+ ],
1564
+ "duration": 0,
1565
+ "failureDetails": [],
1566
+ "failureMessages": [],
1567
+ "fullName": "Allergies testing for pollen allergy not allergic to anything",
1568
+ "invocations": 1,
1569
+ "location": null,
1570
+ "numPassingAsserts": 1,
1571
+ "retryReasons": [],
1572
+ "status": "passed",
1573
+ "title": "not allergic to anything"
1574
+ },
1575
+ {
1576
+ "ancestorTitles": [
1577
+ "Allergies",
1578
+ "testing for pollen allergy"
1579
+ ],
1580
+ "duration": 0,
1581
+ "failureDetails": [],
1582
+ "failureMessages": [],
1583
+ "fullName": "Allergies testing for pollen allergy allergic only to pollen",
1584
+ "invocations": 1,
1585
+ "location": null,
1586
+ "numPassingAsserts": 1,
1587
+ "retryReasons": [],
1588
+ "status": "passed",
1589
+ "title": "allergic only to pollen"
1590
+ },
1591
+ {
1592
+ "ancestorTitles": [
1593
+ "Allergies",
1594
+ "testing for pollen allergy"
1595
+ ],
1596
+ "duration": 0,
1597
+ "failureDetails": [],
1598
+ "failureMessages": [],
1599
+ "fullName": "Allergies testing for pollen allergy allergic to pollen and something else",
1600
+ "invocations": 1,
1601
+ "location": null,
1602
+ "numPassingAsserts": 1,
1603
+ "retryReasons": [],
1604
+ "status": "passed",
1605
+ "title": "allergic to pollen and something else"
1606
+ },
1607
+ {
1608
+ "ancestorTitles": [
1609
+ "Allergies",
1610
+ "testing for pollen allergy"
1611
+ ],
1612
+ "duration": 0,
1613
+ "failureDetails": [],
1614
+ "failureMessages": [],
1615
+ "fullName": "Allergies testing for pollen allergy allergic to something, but not pollen",
1616
+ "invocations": 1,
1617
+ "location": null,
1618
+ "numPassingAsserts": 1,
1619
+ "retryReasons": [],
1620
+ "status": "passed",
1621
+ "title": "allergic to something, but not pollen"
1622
+ },
1623
+ {
1624
+ "ancestorTitles": [
1625
+ "Allergies",
1626
+ "testing for pollen allergy"
1627
+ ],
1628
+ "duration": 0,
1629
+ "failureDetails": [],
1630
+ "failureMessages": [],
1631
+ "fullName": "Allergies testing for pollen allergy allergic to everything",
1632
+ "invocations": 1,
1633
+ "location": null,
1634
+ "numPassingAsserts": 1,
1635
+ "retryReasons": [],
1636
+ "status": "passed",
1637
+ "title": "allergic to everything"
1638
+ },
1639
+ {
1640
+ "ancestorTitles": [
1641
+ "Allergies",
1642
+ "testing for cats allergy"
1643
+ ],
1644
+ "duration": 0,
1645
+ "failureDetails": [],
1646
+ "failureMessages": [],
1647
+ "fullName": "Allergies testing for cats allergy not allergic to anything",
1648
+ "invocations": 1,
1649
+ "location": null,
1650
+ "numPassingAsserts": 1,
1651
+ "retryReasons": [],
1652
+ "status": "passed",
1653
+ "title": "not allergic to anything"
1654
+ },
1655
+ {
1656
+ "ancestorTitles": [
1657
+ "Allergies",
1658
+ "testing for cats allergy"
1659
+ ],
1660
+ "duration": 0,
1661
+ "failureDetails": [],
1662
+ "failureMessages": [],
1663
+ "fullName": "Allergies testing for cats allergy allergic only to cats",
1664
+ "invocations": 1,
1665
+ "location": null,
1666
+ "numPassingAsserts": 1,
1667
+ "retryReasons": [],
1668
+ "status": "passed",
1669
+ "title": "allergic only to cats"
1670
+ },
1671
+ {
1672
+ "ancestorTitles": [
1673
+ "Allergies",
1674
+ "testing for cats allergy"
1675
+ ],
1676
+ "duration": 0,
1677
+ "failureDetails": [],
1678
+ "failureMessages": [],
1679
+ "fullName": "Allergies testing for cats allergy allergic to cats and something else",
1680
+ "invocations": 1,
1681
+ "location": null,
1682
+ "numPassingAsserts": 1,
1683
+ "retryReasons": [],
1684
+ "status": "passed",
1685
+ "title": "allergic to cats and something else"
1686
+ },
1687
+ {
1688
+ "ancestorTitles": [
1689
+ "Allergies",
1690
+ "testing for cats allergy"
1691
+ ],
1692
+ "duration": 0,
1693
+ "failureDetails": [],
1694
+ "failureMessages": [],
1695
+ "fullName": "Allergies testing for cats allergy allergic to something, but not cats",
1696
+ "invocations": 1,
1697
+ "location": null,
1698
+ "numPassingAsserts": 1,
1699
+ "retryReasons": [],
1700
+ "status": "passed",
1701
+ "title": "allergic to something, but not cats"
1702
+ },
1703
+ {
1704
+ "ancestorTitles": [
1705
+ "Allergies",
1706
+ "testing for cats allergy"
1707
+ ],
1708
+ "duration": 0,
1709
+ "failureDetails": [],
1710
+ "failureMessages": [],
1711
+ "fullName": "Allergies testing for cats allergy allergic to everything",
1712
+ "invocations": 1,
1713
+ "location": null,
1714
+ "numPassingAsserts": 1,
1715
+ "retryReasons": [],
1716
+ "status": "passed",
1717
+ "title": "allergic to everything"
1718
+ },
1719
+ {
1720
+ "ancestorTitles": [
1721
+ "Allergies",
1722
+ "list when:"
1723
+ ],
1724
+ "duration": 0,
1725
+ "failureDetails": [],
1726
+ "failureMessages": [],
1727
+ "fullName": "Allergies list when: no allergies",
1728
+ "invocations": 1,
1729
+ "location": null,
1730
+ "numPassingAsserts": 1,
1731
+ "retryReasons": [],
1732
+ "status": "passed",
1733
+ "title": "no allergies"
1734
+ },
1735
+ {
1736
+ "ancestorTitles": [
1737
+ "Allergies",
1738
+ "list when:"
1739
+ ],
1740
+ "duration": 0,
1741
+ "failureDetails": [],
1742
+ "failureMessages": [],
1743
+ "fullName": "Allergies list when: just eggs",
1744
+ "invocations": 1,
1745
+ "location": null,
1746
+ "numPassingAsserts": 1,
1747
+ "retryReasons": [],
1748
+ "status": "passed",
1749
+ "title": "just eggs"
1750
+ },
1751
+ {
1752
+ "ancestorTitles": [
1753
+ "Allergies",
1754
+ "list when:"
1755
+ ],
1756
+ "duration": 0,
1757
+ "failureDetails": [],
1758
+ "failureMessages": [],
1759
+ "fullName": "Allergies list when: just peanuts",
1760
+ "invocations": 1,
1761
+ "location": null,
1762
+ "numPassingAsserts": 1,
1763
+ "retryReasons": [],
1764
+ "status": "passed",
1765
+ "title": "just peanuts"
1766
+ },
1767
+ {
1768
+ "ancestorTitles": [
1769
+ "Allergies",
1770
+ "list when:"
1771
+ ],
1772
+ "duration": 0,
1773
+ "failureDetails": [],
1774
+ "failureMessages": [],
1775
+ "fullName": "Allergies list when: just strawberries",
1776
+ "invocations": 1,
1777
+ "location": null,
1778
+ "numPassingAsserts": 1,
1779
+ "retryReasons": [],
1780
+ "status": "passed",
1781
+ "title": "just strawberries"
1782
+ },
1783
+ {
1784
+ "ancestorTitles": [
1785
+ "Allergies",
1786
+ "list when:"
1787
+ ],
1788
+ "duration": 1,
1789
+ "failureDetails": [],
1790
+ "failureMessages": [],
1791
+ "fullName": "Allergies list when: eggs and peanuts",
1792
+ "invocations": 1,
1793
+ "location": null,
1794
+ "numPassingAsserts": 1,
1795
+ "retryReasons": [],
1796
+ "status": "passed",
1797
+ "title": "eggs and peanuts"
1798
+ },
1799
+ {
1800
+ "ancestorTitles": [
1801
+ "Allergies",
1802
+ "list when:"
1803
+ ],
1804
+ "duration": 0,
1805
+ "failureDetails": [],
1806
+ "failureMessages": [],
1807
+ "fullName": "Allergies list when: more than eggs but not peanuts",
1808
+ "invocations": 1,
1809
+ "location": null,
1810
+ "numPassingAsserts": 1,
1811
+ "retryReasons": [],
1812
+ "status": "passed",
1813
+ "title": "more than eggs but not peanuts"
1814
+ },
1815
+ {
1816
+ "ancestorTitles": [
1817
+ "Allergies",
1818
+ "list when:"
1819
+ ],
1820
+ "duration": 0,
1821
+ "failureDetails": [],
1822
+ "failureMessages": [],
1823
+ "fullName": "Allergies list when: lots of stuff",
1824
+ "invocations": 1,
1825
+ "location": null,
1826
+ "numPassingAsserts": 1,
1827
+ "retryReasons": [],
1828
+ "status": "passed",
1829
+ "title": "lots of stuff"
1830
+ },
1831
+ {
1832
+ "ancestorTitles": [
1833
+ "Allergies",
1834
+ "list when:"
1835
+ ],
1836
+ "duration": 0,
1837
+ "failureDetails": [],
1838
+ "failureMessages": [],
1839
+ "fullName": "Allergies list when: everything",
1840
+ "invocations": 1,
1841
+ "location": null,
1842
+ "numPassingAsserts": 1,
1843
+ "retryReasons": [],
1844
+ "status": "passed",
1845
+ "title": "everything"
1846
+ },
1847
+ {
1848
+ "ancestorTitles": [
1849
+ "Allergies",
1850
+ "list when:"
1851
+ ],
1852
+ "duration": 0,
1853
+ "failureDetails": [],
1854
+ "failureMessages": [],
1855
+ "fullName": "Allergies list when: no allergen score parts",
1856
+ "invocations": 1,
1857
+ "location": null,
1858
+ "numPassingAsserts": 1,
1859
+ "retryReasons": [],
1860
+ "status": "passed",
1861
+ "title": "no allergen score parts"
1862
+ },
1863
+ {
1864
+ "ancestorTitles": [
1865
+ "Allergies",
1866
+ "list when:"
1867
+ ],
1868
+ "duration": 0,
1869
+ "failureDetails": [],
1870
+ "failureMessages": [],
1871
+ "fullName": "Allergies list when: no allergen score parts without highest valid score",
1872
+ "invocations": 1,
1873
+ "location": null,
1874
+ "numPassingAsserts": 1,
1875
+ "retryReasons": [],
1876
+ "status": "passed",
1877
+ "title": "no allergen score parts without highest valid score"
1878
+ }
1879
+ ],
1880
+ "endTime": 1754203882970,
1881
+ "message": "",
1882
+ "name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/allergies/allergies.spec.js",
1883
+ "startTime": 1754203882900,
1884
+ "status": "passed",
1885
+ "summary": ""
1886
+ }
1887
+ ],
1888
+ "wasInterrupted": false
1889
+ }
1890
+ },
1891
+ "timeElapsed": 17.285,
1892
+ "cost": 0.291009891456,
1893
+ "startTime": "2025-08-03T06:51:05.714Z",
1894
+ "endTime": "2025-08-03T06:51:22.999Z",
1895
+ "finalOutput": "The allergies exercise is now fully implemented and passing all tests.\n\nWhat was done:\n- Implemented the Allergies class in allergies.js to handle score masking, allergen lookups, and lists.\n- Used relevant bit masking to ignore scores not tied to the main allergen set.\n- All test cases in allergies.spec.js are now enabled and passing.\n- Code has been linted for both allergies.js and allergies.spec.js.\n\nYou are ready to submit! If you need any additional explanation or changes, let me know."
1896
+ },
1897
+ {
1898
+ "exerciseName": "alphametics",
1899
+ "status": "success",
1900
+ "turns": 23,
1901
+ "testResult": {
1902
+ "passed": 9,
1903
+ "failed": 0,
1904
+ "total": 9,
1905
+ "skipped": 0,
1906
+ "success": true,
1907
+ "output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":9,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":9,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754203999155,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Solve the alphametics puzzle\"],\"duration\":2,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Solve the alphametics puzzle puzzle with three letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"puzzle with three letters\"},{\"ancestorTitles\":[\"Solve the alphametics puzzle\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Solve the alphametics puzzle solution must have unique value for each letter\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"solution must have unique value for each letter\"},{\"ancestorTitles\":[\"Solve the alphametics puzzle\"],\"duration\":8,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Solve the alphametics puzzle leading zero solution is invalid\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"leading zero solution is invalid\"},{\"ancestorTitles\":[\"Solve the alphametics puzzle\"],\"duration\":6,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Solve the alphametics puzzle puzzle with four letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"puzzle with four letters\"},{\"ancestorTitles\":[\"Solve the alphametics puzzle\"],\"duration\":138,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Solve the alphametics puzzle puzzle with six letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"puzzle with six letters\"},{\"ancestorTitles\":[\"Solve the alphametics puzzle\"],\"duration\":396,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Solve the alphametics puzzle puzzle with seven letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"puzzle with seven letters\"},{\"ancestorTitles\":[\"Solve the alphametics puzzle\"],\"duration\":2308,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Solve the alphametics puzzle puzzle with eight letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"puzzle with eight letters\"},{\"ancestorTitles\":[\"Solve the alphametics puzzle\"],\"duration\":3188,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Solve the alphametics puzzle puzzle with ten letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"puzzle with ten letters\"},{\"ancestorTitles\":[\"Solve the alphametics puzzle\"],\"duration\":18363,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Solve the alphametics puzzle puzzle with ten letters and 199 addends\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"puzzle with ten letters and 199 addends\"}],\"endTime\":1754204023705,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/alphametics/alphametics.spec.js\",\"startTime\":1754203999171,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
1908
+ "details": {
1909
+ "numFailedTestSuites": 0,
1910
+ "numFailedTests": 0,
1911
+ "numPassedTestSuites": 1,
1912
+ "numPassedTests": 9,
1913
+ "numPendingTestSuites": 0,
1914
+ "numPendingTests": 0,
1915
+ "numRuntimeErrorTestSuites": 0,
1916
+ "numTodoTests": 0,
1917
+ "numTotalTestSuites": 1,
1918
+ "numTotalTests": 9,
1919
+ "openHandles": [],
1920
+ "snapshot": {
1921
+ "added": 0,
1922
+ "didUpdate": false,
1923
+ "failure": false,
1924
+ "filesAdded": 0,
1925
+ "filesRemoved": 0,
1926
+ "filesRemovedList": [],
1927
+ "filesUnmatched": 0,
1928
+ "filesUpdated": 0,
1929
+ "matched": 0,
1930
+ "total": 0,
1931
+ "unchecked": 0,
1932
+ "uncheckedKeysByFile": [],
1933
+ "unmatched": 0,
1934
+ "updated": 0
1935
+ },
1936
+ "startTime": 1754203999155,
1937
+ "success": true,
1938
+ "testResults": [
1939
+ {
1940
+ "assertionResults": [
1941
+ {
1942
+ "ancestorTitles": [
1943
+ "Solve the alphametics puzzle"
1944
+ ],
1945
+ "duration": 2,
1946
+ "failureDetails": [],
1947
+ "failureMessages": [],
1948
+ "fullName": "Solve the alphametics puzzle puzzle with three letters",
1949
+ "invocations": 1,
1950
+ "location": null,
1951
+ "numPassingAsserts": 1,
1952
+ "retryReasons": [],
1953
+ "status": "passed",
1954
+ "title": "puzzle with three letters"
1955
+ },
1956
+ {
1957
+ "ancestorTitles": [
1958
+ "Solve the alphametics puzzle"
1959
+ ],
1960
+ "duration": 0,
1961
+ "failureDetails": [],
1962
+ "failureMessages": [],
1963
+ "fullName": "Solve the alphametics puzzle solution must have unique value for each letter",
1964
+ "invocations": 1,
1965
+ "location": null,
1966
+ "numPassingAsserts": 1,
1967
+ "retryReasons": [],
1968
+ "status": "passed",
1969
+ "title": "solution must have unique value for each letter"
1970
+ },
1971
+ {
1972
+ "ancestorTitles": [
1973
+ "Solve the alphametics puzzle"
1974
+ ],
1975
+ "duration": 8,
1976
+ "failureDetails": [],
1977
+ "failureMessages": [],
1978
+ "fullName": "Solve the alphametics puzzle leading zero solution is invalid",
1979
+ "invocations": 1,
1980
+ "location": null,
1981
+ "numPassingAsserts": 1,
1982
+ "retryReasons": [],
1983
+ "status": "passed",
1984
+ "title": "leading zero solution is invalid"
1985
+ },
1986
+ {
1987
+ "ancestorTitles": [
1988
+ "Solve the alphametics puzzle"
1989
+ ],
1990
+ "duration": 6,
1991
+ "failureDetails": [],
1992
+ "failureMessages": [],
1993
+ "fullName": "Solve the alphametics puzzle puzzle with four letters",
1994
+ "invocations": 1,
1995
+ "location": null,
1996
+ "numPassingAsserts": 1,
1997
+ "retryReasons": [],
1998
+ "status": "passed",
1999
+ "title": "puzzle with four letters"
2000
+ },
2001
+ {
2002
+ "ancestorTitles": [
2003
+ "Solve the alphametics puzzle"
2004
+ ],
2005
+ "duration": 138,
2006
+ "failureDetails": [],
2007
+ "failureMessages": [],
2008
+ "fullName": "Solve the alphametics puzzle puzzle with six letters",
2009
+ "invocations": 1,
2010
+ "location": null,
2011
+ "numPassingAsserts": 1,
2012
+ "retryReasons": [],
2013
+ "status": "passed",
2014
+ "title": "puzzle with six letters"
2015
+ },
2016
+ {
2017
+ "ancestorTitles": [
2018
+ "Solve the alphametics puzzle"
2019
+ ],
2020
+ "duration": 396,
2021
+ "failureDetails": [],
2022
+ "failureMessages": [],
2023
+ "fullName": "Solve the alphametics puzzle puzzle with seven letters",
2024
+ "invocations": 1,
2025
+ "location": null,
2026
+ "numPassingAsserts": 1,
2027
+ "retryReasons": [],
2028
+ "status": "passed",
2029
+ "title": "puzzle with seven letters"
2030
+ },
2031
+ {
2032
+ "ancestorTitles": [
2033
+ "Solve the alphametics puzzle"
2034
+ ],
2035
+ "duration": 2308,
2036
+ "failureDetails": [],
2037
+ "failureMessages": [],
2038
+ "fullName": "Solve the alphametics puzzle puzzle with eight letters",
2039
+ "invocations": 1,
2040
+ "location": null,
2041
+ "numPassingAsserts": 1,
2042
+ "retryReasons": [],
2043
+ "status": "passed",
2044
+ "title": "puzzle with eight letters"
2045
+ },
2046
+ {
2047
+ "ancestorTitles": [
2048
+ "Solve the alphametics puzzle"
2049
+ ],
2050
+ "duration": 3188,
2051
+ "failureDetails": [],
2052
+ "failureMessages": [],
2053
+ "fullName": "Solve the alphametics puzzle puzzle with ten letters",
2054
+ "invocations": 1,
2055
+ "location": null,
2056
+ "numPassingAsserts": 1,
2057
+ "retryReasons": [],
2058
+ "status": "passed",
2059
+ "title": "puzzle with ten letters"
2060
+ },
2061
+ {
2062
+ "ancestorTitles": [
2063
+ "Solve the alphametics puzzle"
2064
+ ],
2065
+ "duration": 18363,
2066
+ "failureDetails": [],
2067
+ "failureMessages": [],
2068
+ "fullName": "Solve the alphametics puzzle puzzle with ten letters and 199 addends",
2069
+ "invocations": 1,
2070
+ "location": null,
2071
+ "numPassingAsserts": 1,
2072
+ "retryReasons": [],
2073
+ "status": "passed",
2074
+ "title": "puzzle with ten letters and 199 addends"
2075
+ }
2076
+ ],
2077
+ "endTime": 1754204023705,
2078
+ "message": "",
2079
+ "name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/alphametics/alphametics.spec.js",
2080
+ "startTime": 1754203999171,
2081
+ "status": "passed",
2082
+ "summary": ""
2083
+ }
2084
+ ],
2085
+ "wasInterrupted": false
2086
+ }
2087
+ },
2088
+ "timeElapsed": 140.721,
2089
+ "cost": 0.5704617903360001,
2090
+ "startTime": "2025-08-03T06:51:22.999Z",
2091
+ "endTime": "2025-08-03T06:53:43.720Z",
2092
+ "finalOutput": "The alphametics solver has been implemented in alphametics.js. All tests in alphametics.spec.js are now passing, including for large puzzles like 'SEND + MORE == MONEY' and the extended test cases. The implementation uses a brute-force permutation approach to assign digits to letters, taking care of the constraints (unique digits, no leading zero). If you need further optimizations or explanations of the code, let me know!"
2093
+ },
2094
+ {
2095
+ "exerciseName": "anagram",
2096
+ "status": "success",
2097
+ "turns": 16,
2098
+ "testResult": {
2099
+ "passed": 18,
2100
+ "failed": 0,
2101
+ "total": 18,
2102
+ "skipped": 0,
2103
+ "success": true,
2104
+ "output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":18,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":18,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754204063733,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Anagram\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram no matches\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"no matches\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects two anagrams\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects two anagrams\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram does not detect anagram subsets\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"does not detect anagram subsets\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects anagram\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects anagram\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects three anagrams\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects three anagrams\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects multiple anagrams with different case\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects multiple anagrams with different case\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram does not detect non-anagrams with identical checksum\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"does not detect non-anagrams with identical checksum\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects anagrams case-insensitively\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects anagrams case-insensitively\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects anagrams using case-insensitive subject\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects anagrams using case-insensitive subject\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram detects anagrams using case-insensitive possible matches\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"detects anagrams using case-insensitive possible matches\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram does not detect an anagram if the original word is repeated\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"does not detect an anagram if the original word is repeated\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram anagrams must use all letters exactly once\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"anagrams must use all letters exactly once\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram words are not anagrams of themselves\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"words are not anagrams of themselves\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram words are not anagrams of themselves even if letter case is partially different\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"words are not anagrams of themselves even if letter case is partially different\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram words are not anagrams of themselves even if letter case is completely different\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"words are not anagrams of themselves even if letter case is completely different\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram words other than themselves can be anagrams\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"words other than themselves can be anagrams\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram handles case of greek letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"handles case of greek letters\"},{\"ancestorTitles\":[\"Anagram\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Anagram different characters may have the same bytes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"different characters may have the same bytes\"}],\"endTime\":1754204063820,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/anagram/anagram.spec.js\",\"startTime\":1754204063742,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
2105
+ "details": {
2106
+ "numFailedTestSuites": 0,
2107
+ "numFailedTests": 0,
2108
+ "numPassedTestSuites": 1,
2109
+ "numPassedTests": 18,
2110
+ "numPendingTestSuites": 0,
2111
+ "numPendingTests": 0,
2112
+ "numRuntimeErrorTestSuites": 0,
2113
+ "numTodoTests": 0,
2114
+ "numTotalTestSuites": 1,
2115
+ "numTotalTests": 18,
2116
+ "openHandles": [],
2117
+ "snapshot": {
2118
+ "added": 0,
2119
+ "didUpdate": false,
2120
+ "failure": false,
2121
+ "filesAdded": 0,
2122
+ "filesRemoved": 0,
2123
+ "filesRemovedList": [],
2124
+ "filesUnmatched": 0,
2125
+ "filesUpdated": 0,
2126
+ "matched": 0,
2127
+ "total": 0,
2128
+ "unchecked": 0,
2129
+ "uncheckedKeysByFile": [],
2130
+ "unmatched": 0,
2131
+ "updated": 0
2132
+ },
2133
+ "startTime": 1754204063733,
2134
+ "success": true,
2135
+ "testResults": [
2136
+ {
2137
+ "assertionResults": [
2138
+ {
2139
+ "ancestorTitles": [
2140
+ "Anagram"
2141
+ ],
2142
+ "duration": 1,
2143
+ "failureDetails": [],
2144
+ "failureMessages": [],
2145
+ "fullName": "Anagram no matches",
2146
+ "invocations": 1,
2147
+ "location": null,
2148
+ "numPassingAsserts": 1,
2149
+ "retryReasons": [],
2150
+ "status": "passed",
2151
+ "title": "no matches"
2152
+ },
2153
+ {
2154
+ "ancestorTitles": [
2155
+ "Anagram"
2156
+ ],
2157
+ "duration": 1,
2158
+ "failureDetails": [],
2159
+ "failureMessages": [],
2160
+ "fullName": "Anagram detects two anagrams",
2161
+ "invocations": 1,
2162
+ "location": null,
2163
+ "numPassingAsserts": 1,
2164
+ "retryReasons": [],
2165
+ "status": "passed",
2166
+ "title": "detects two anagrams"
2167
+ },
2168
+ {
2169
+ "ancestorTitles": [
2170
+ "Anagram"
2171
+ ],
2172
+ "duration": 0,
2173
+ "failureDetails": [],
2174
+ "failureMessages": [],
2175
+ "fullName": "Anagram does not detect anagram subsets",
2176
+ "invocations": 1,
2177
+ "location": null,
2178
+ "numPassingAsserts": 1,
2179
+ "retryReasons": [],
2180
+ "status": "passed",
2181
+ "title": "does not detect anagram subsets"
2182
+ },
2183
+ {
2184
+ "ancestorTitles": [
2185
+ "Anagram"
2186
+ ],
2187
+ "duration": 0,
2188
+ "failureDetails": [],
2189
+ "failureMessages": [],
2190
+ "fullName": "Anagram detects anagram",
2191
+ "invocations": 1,
2192
+ "location": null,
2193
+ "numPassingAsserts": 1,
2194
+ "retryReasons": [],
2195
+ "status": "passed",
2196
+ "title": "detects anagram"
2197
+ },
2198
+ {
2199
+ "ancestorTitles": [
2200
+ "Anagram"
2201
+ ],
2202
+ "duration": 0,
2203
+ "failureDetails": [],
2204
+ "failureMessages": [],
2205
+ "fullName": "Anagram detects three anagrams",
2206
+ "invocations": 1,
2207
+ "location": null,
2208
+ "numPassingAsserts": 1,
2209
+ "retryReasons": [],
2210
+ "status": "passed",
2211
+ "title": "detects three anagrams"
2212
+ },
2213
+ {
2214
+ "ancestorTitles": [
2215
+ "Anagram"
2216
+ ],
2217
+ "duration": 0,
2218
+ "failureDetails": [],
2219
+ "failureMessages": [],
2220
+ "fullName": "Anagram detects multiple anagrams with different case",
2221
+ "invocations": 1,
2222
+ "location": null,
2223
+ "numPassingAsserts": 1,
2224
+ "retryReasons": [],
2225
+ "status": "passed",
2226
+ "title": "detects multiple anagrams with different case"
2227
+ },
2228
+ {
2229
+ "ancestorTitles": [
2230
+ "Anagram"
2231
+ ],
2232
+ "duration": 0,
2233
+ "failureDetails": [],
2234
+ "failureMessages": [],
2235
+ "fullName": "Anagram does not detect non-anagrams with identical checksum",
2236
+ "invocations": 1,
2237
+ "location": null,
2238
+ "numPassingAsserts": 1,
2239
+ "retryReasons": [],
2240
+ "status": "passed",
2241
+ "title": "does not detect non-anagrams with identical checksum"
2242
+ },
2243
+ {
2244
+ "ancestorTitles": [
2245
+ "Anagram"
2246
+ ],
2247
+ "duration": 0,
2248
+ "failureDetails": [],
2249
+ "failureMessages": [],
2250
+ "fullName": "Anagram detects anagrams case-insensitively",
2251
+ "invocations": 1,
2252
+ "location": null,
2253
+ "numPassingAsserts": 1,
2254
+ "retryReasons": [],
2255
+ "status": "passed",
2256
+ "title": "detects anagrams case-insensitively"
2257
+ },
2258
+ {
2259
+ "ancestorTitles": [
2260
+ "Anagram"
2261
+ ],
2262
+ "duration": 0,
2263
+ "failureDetails": [],
2264
+ "failureMessages": [],
2265
+ "fullName": "Anagram detects anagrams using case-insensitive subject",
2266
+ "invocations": 1,
2267
+ "location": null,
2268
+ "numPassingAsserts": 1,
2269
+ "retryReasons": [],
2270
+ "status": "passed",
2271
+ "title": "detects anagrams using case-insensitive subject"
2272
+ },
2273
+ {
2274
+ "ancestorTitles": [
2275
+ "Anagram"
2276
+ ],
2277
+ "duration": 0,
2278
+ "failureDetails": [],
2279
+ "failureMessages": [],
2280
+ "fullName": "Anagram detects anagrams using case-insensitive possible matches",
2281
+ "invocations": 1,
2282
+ "location": null,
2283
+ "numPassingAsserts": 1,
2284
+ "retryReasons": [],
2285
+ "status": "passed",
2286
+ "title": "detects anagrams using case-insensitive possible matches"
2287
+ },
2288
+ {
2289
+ "ancestorTitles": [
2290
+ "Anagram"
2291
+ ],
2292
+ "duration": 0,
2293
+ "failureDetails": [],
2294
+ "failureMessages": [],
2295
+ "fullName": "Anagram does not detect an anagram if the original word is repeated",
2296
+ "invocations": 1,
2297
+ "location": null,
2298
+ "numPassingAsserts": 1,
2299
+ "retryReasons": [],
2300
+ "status": "passed",
2301
+ "title": "does not detect an anagram if the original word is repeated"
2302
+ },
2303
+ {
2304
+ "ancestorTitles": [
2305
+ "Anagram"
2306
+ ],
2307
+ "duration": 0,
2308
+ "failureDetails": [],
2309
+ "failureMessages": [],
2310
+ "fullName": "Anagram anagrams must use all letters exactly once",
2311
+ "invocations": 1,
2312
+ "location": null,
2313
+ "numPassingAsserts": 1,
2314
+ "retryReasons": [],
2315
+ "status": "passed",
2316
+ "title": "anagrams must use all letters exactly once"
2317
+ },
2318
+ {
2319
+ "ancestorTitles": [
2320
+ "Anagram"
2321
+ ],
2322
+ "duration": 0,
2323
+ "failureDetails": [],
2324
+ "failureMessages": [],
2325
+ "fullName": "Anagram words are not anagrams of themselves",
2326
+ "invocations": 1,
2327
+ "location": null,
2328
+ "numPassingAsserts": 1,
2329
+ "retryReasons": [],
2330
+ "status": "passed",
2331
+ "title": "words are not anagrams of themselves"
2332
+ },
2333
+ {
2334
+ "ancestorTitles": [
2335
+ "Anagram"
2336
+ ],
2337
+ "duration": 1,
2338
+ "failureDetails": [],
2339
+ "failureMessages": [],
2340
+ "fullName": "Anagram words are not anagrams of themselves even if letter case is partially different",
2341
+ "invocations": 1,
2342
+ "location": null,
2343
+ "numPassingAsserts": 1,
2344
+ "retryReasons": [],
2345
+ "status": "passed",
2346
+ "title": "words are not anagrams of themselves even if letter case is partially different"
2347
+ },
2348
+ {
2349
+ "ancestorTitles": [
2350
+ "Anagram"
2351
+ ],
2352
+ "duration": 0,
2353
+ "failureDetails": [],
2354
+ "failureMessages": [],
2355
+ "fullName": "Anagram words are not anagrams of themselves even if letter case is completely different",
2356
+ "invocations": 1,
2357
+ "location": null,
2358
+ "numPassingAsserts": 1,
2359
+ "retryReasons": [],
2360
+ "status": "passed",
2361
+ "title": "words are not anagrams of themselves even if letter case is completely different"
2362
+ },
2363
+ {
2364
+ "ancestorTitles": [
2365
+ "Anagram"
2366
+ ],
2367
+ "duration": 0,
2368
+ "failureDetails": [],
2369
+ "failureMessages": [],
2370
+ "fullName": "Anagram words other than themselves can be anagrams",
2371
+ "invocations": 1,
2372
+ "location": null,
2373
+ "numPassingAsserts": 1,
2374
+ "retryReasons": [],
2375
+ "status": "passed",
2376
+ "title": "words other than themselves can be anagrams"
2377
+ },
2378
+ {
2379
+ "ancestorTitles": [
2380
+ "Anagram"
2381
+ ],
2382
+ "duration": 0,
2383
+ "failureDetails": [],
2384
+ "failureMessages": [],
2385
+ "fullName": "Anagram handles case of greek letters",
2386
+ "invocations": 1,
2387
+ "location": null,
2388
+ "numPassingAsserts": 1,
2389
+ "retryReasons": [],
2390
+ "status": "passed",
2391
+ "title": "handles case of greek letters"
2392
+ },
2393
+ {
2394
+ "ancestorTitles": [
2395
+ "Anagram"
2396
+ ],
2397
+ "duration": 0,
2398
+ "failureDetails": [],
2399
+ "failureMessages": [],
2400
+ "fullName": "Anagram different characters may have the same bytes",
2401
+ "invocations": 1,
2402
+ "location": null,
2403
+ "numPassingAsserts": 1,
2404
+ "retryReasons": [],
2405
+ "status": "passed",
2406
+ "title": "different characters may have the same bytes"
2407
+ }
2408
+ ],
2409
+ "endTime": 1754204063820,
2410
+ "message": "",
2411
+ "name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/anagram/anagram.spec.js",
2412
+ "startTime": 1754204063742,
2413
+ "status": "passed",
2414
+ "summary": ""
2415
+ }
2416
+ ],
2417
+ "wasInterrupted": false
2418
+ }
2419
+ },
2420
+ "timeElapsed": 40.122,
2421
+ "cost": 0.4995238193919999,
2422
+ "startTime": "2025-08-03T06:53:43.720Z",
2423
+ "endTime": "2025-08-03T06:54:23.842Z",
2424
+ "finalOutput": "The 'Anagram' exercise has been fully solved:\n\n- The implementation for `findAnagrams` is complete in `anagram.js`.\n- All tests in `anagram.spec.js` are passing after being unskipped.\n- The code was also linted for style and correctness, with no issues found.\n\nYou now have a working and clean solution to the anagram exercise."
2425
+ },
2426
+ {
2427
+ "exerciseName": "armstrong-numbers",
2428
+ "status": "success",
2429
+ "turns": 12,
2430
+ "testResult": {
2431
+ "passed": 11,
2432
+ "failed": 0,
2433
+ "total": 11,
2434
+ "skipped": 0,
2435
+ "success": true,
2436
+ "output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":11,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":11,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754204081604,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Zero is an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Zero is an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Single-digit numbers are Armstrong numbers\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Single-digit numbers are Armstrong numbers\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers There are no two-digit Armstrong numbers\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"There are no two-digit Armstrong numbers\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Three-digit number that is an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Three-digit number that is an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Three-digit number that is not an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Three-digit number that is not an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Four-digit number that is an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Four-digit number that is an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Four-digit number that is not an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Four-digit number that is not an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Seven-digit number that is an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Seven-digit number that is an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Seven-digit number that is not an Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Seven-digit number that is not an Armstrong number\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers Armstrong number containing seven zeroes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"Armstrong number containing seven zeroes\"},{\"ancestorTitles\":[\"Armstrong Numbers\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Armstrong Numbers The largest and last Armstrong number\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"The largest and last Armstrong number\"}],\"endTime\":1754204081683,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/armstrong-numbers/armstrong-numbers.spec.js\",\"startTime\":1754204081614,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
2437
+ "details": {
2438
+ "numFailedTestSuites": 0,
2439
+ "numFailedTests": 0,
2440
+ "numPassedTestSuites": 1,
2441
+ "numPassedTests": 11,
2442
+ "numPendingTestSuites": 0,
2443
+ "numPendingTests": 0,
2444
+ "numRuntimeErrorTestSuites": 0,
2445
+ "numTodoTests": 0,
2446
+ "numTotalTestSuites": 1,
2447
+ "numTotalTests": 11,
2448
+ "openHandles": [],
2449
+ "snapshot": {
2450
+ "added": 0,
2451
+ "didUpdate": false,
2452
+ "failure": false,
2453
+ "filesAdded": 0,
2454
+ "filesRemoved": 0,
2455
+ "filesRemovedList": [],
2456
+ "filesUnmatched": 0,
2457
+ "filesUpdated": 0,
2458
+ "matched": 0,
2459
+ "total": 0,
2460
+ "unchecked": 0,
2461
+ "uncheckedKeysByFile": [],
2462
+ "unmatched": 0,
2463
+ "updated": 0
2464
+ },
2465
+ "startTime": 1754204081604,
2466
+ "success": true,
2467
+ "testResults": [
2468
+ {
2469
+ "assertionResults": [
2470
+ {
2471
+ "ancestorTitles": [
2472
+ "Armstrong Numbers"
2473
+ ],
2474
+ "duration": 1,
2475
+ "failureDetails": [],
2476
+ "failureMessages": [],
2477
+ "fullName": "Armstrong Numbers Zero is an Armstrong number",
2478
+ "invocations": 1,
2479
+ "location": null,
2480
+ "numPassingAsserts": 1,
2481
+ "retryReasons": [],
2482
+ "status": "passed",
2483
+ "title": "Zero is an Armstrong number"
2484
+ },
2485
+ {
2486
+ "ancestorTitles": [
2487
+ "Armstrong Numbers"
2488
+ ],
2489
+ "duration": 0,
2490
+ "failureDetails": [],
2491
+ "failureMessages": [],
2492
+ "fullName": "Armstrong Numbers Single-digit numbers are Armstrong numbers",
2493
+ "invocations": 1,
2494
+ "location": null,
2495
+ "numPassingAsserts": 1,
2496
+ "retryReasons": [],
2497
+ "status": "passed",
2498
+ "title": "Single-digit numbers are Armstrong numbers"
2499
+ },
2500
+ {
2501
+ "ancestorTitles": [
2502
+ "Armstrong Numbers"
2503
+ ],
2504
+ "duration": 0,
2505
+ "failureDetails": [],
2506
+ "failureMessages": [],
2507
+ "fullName": "Armstrong Numbers There are no two-digit Armstrong numbers",
2508
+ "invocations": 1,
2509
+ "location": null,
2510
+ "numPassingAsserts": 1,
2511
+ "retryReasons": [],
2512
+ "status": "passed",
2513
+ "title": "There are no two-digit Armstrong numbers"
2514
+ },
2515
+ {
2516
+ "ancestorTitles": [
2517
+ "Armstrong Numbers"
2518
+ ],
2519
+ "duration": 1,
2520
+ "failureDetails": [],
2521
+ "failureMessages": [],
2522
+ "fullName": "Armstrong Numbers Three-digit number that is an Armstrong number",
2523
+ "invocations": 1,
2524
+ "location": null,
2525
+ "numPassingAsserts": 1,
2526
+ "retryReasons": [],
2527
+ "status": "passed",
2528
+ "title": "Three-digit number that is an Armstrong number"
2529
+ },
2530
+ {
2531
+ "ancestorTitles": [
2532
+ "Armstrong Numbers"
2533
+ ],
2534
+ "duration": 0,
2535
+ "failureDetails": [],
2536
+ "failureMessages": [],
2537
+ "fullName": "Armstrong Numbers Three-digit number that is not an Armstrong number",
2538
+ "invocations": 1,
2539
+ "location": null,
2540
+ "numPassingAsserts": 1,
2541
+ "retryReasons": [],
2542
+ "status": "passed",
2543
+ "title": "Three-digit number that is not an Armstrong number"
2544
+ },
2545
+ {
2546
+ "ancestorTitles": [
2547
+ "Armstrong Numbers"
2548
+ ],
2549
+ "duration": 0,
2550
+ "failureDetails": [],
2551
+ "failureMessages": [],
2552
+ "fullName": "Armstrong Numbers Four-digit number that is an Armstrong number",
2553
+ "invocations": 1,
2554
+ "location": null,
2555
+ "numPassingAsserts": 1,
2556
+ "retryReasons": [],
2557
+ "status": "passed",
2558
+ "title": "Four-digit number that is an Armstrong number"
2559
+ },
2560
+ {
2561
+ "ancestorTitles": [
2562
+ "Armstrong Numbers"
2563
+ ],
2564
+ "duration": 0,
2565
+ "failureDetails": [],
2566
+ "failureMessages": [],
2567
+ "fullName": "Armstrong Numbers Four-digit number that is not an Armstrong number",
2568
+ "invocations": 1,
2569
+ "location": null,
2570
+ "numPassingAsserts": 1,
2571
+ "retryReasons": [],
2572
+ "status": "passed",
2573
+ "title": "Four-digit number that is not an Armstrong number"
2574
+ },
2575
+ {
2576
+ "ancestorTitles": [
2577
+ "Armstrong Numbers"
2578
+ ],
2579
+ "duration": 0,
2580
+ "failureDetails": [],
2581
+ "failureMessages": [],
2582
+ "fullName": "Armstrong Numbers Seven-digit number that is an Armstrong number",
2583
+ "invocations": 1,
2584
+ "location": null,
2585
+ "numPassingAsserts": 1,
2586
+ "retryReasons": [],
2587
+ "status": "passed",
2588
+ "title": "Seven-digit number that is an Armstrong number"
2589
+ },
2590
+ {
2591
+ "ancestorTitles": [
2592
+ "Armstrong Numbers"
2593
+ ],
2594
+ "duration": 0,
2595
+ "failureDetails": [],
2596
+ "failureMessages": [],
2597
+ "fullName": "Armstrong Numbers Seven-digit number that is not an Armstrong number",
2598
+ "invocations": 1,
2599
+ "location": null,
2600
+ "numPassingAsserts": 1,
2601
+ "retryReasons": [],
2602
+ "status": "passed",
2603
+ "title": "Seven-digit number that is not an Armstrong number"
2604
+ },
2605
+ {
2606
+ "ancestorTitles": [
2607
+ "Armstrong Numbers"
2608
+ ],
2609
+ "duration": 1,
2610
+ "failureDetails": [],
2611
+ "failureMessages": [],
2612
+ "fullName": "Armstrong Numbers Armstrong number containing seven zeroes",
2613
+ "invocations": 1,
2614
+ "location": null,
2615
+ "numPassingAsserts": 1,
2616
+ "retryReasons": [],
2617
+ "status": "passed",
2618
+ "title": "Armstrong number containing seven zeroes"
2619
+ },
2620
+ {
2621
+ "ancestorTitles": [
2622
+ "Armstrong Numbers"
2623
+ ],
2624
+ "duration": 0,
2625
+ "failureDetails": [],
2626
+ "failureMessages": [],
2627
+ "fullName": "Armstrong Numbers The largest and last Armstrong number",
2628
+ "invocations": 1,
2629
+ "location": null,
2630
+ "numPassingAsserts": 1,
2631
+ "retryReasons": [],
2632
+ "status": "passed",
2633
+ "title": "The largest and last Armstrong number"
2634
+ }
2635
+ ],
2636
+ "endTime": 1754204081683,
2637
+ "message": "",
2638
+ "name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/armstrong-numbers/armstrong-numbers.spec.js",
2639
+ "startTime": 1754204081614,
2640
+ "status": "passed",
2641
+ "summary": ""
2642
+ }
2643
+ ],
2644
+ "wasInterrupted": false
2645
+ }
2646
+ },
2647
+ "timeElapsed": 17.871,
2648
+ "cost": 0.21396392652800003,
2649
+ "startTime": "2025-08-03T06:54:23.842Z",
2650
+ "endTime": "2025-08-03T06:54:41.713Z",
2651
+ "finalOutput": "All requirements for the Armstrong numbers exercise have been completed:\n\n- Implemented the isArmstrongNumber function in armstrong-numbers.js.\n- Unskipped all test cases in armstrong-numbers.spec.js.\n- All test cases pass, including large BigInt Armstrong numbers.\n- Code style was checked with linting and is clean.\n\nYou can now consider this exercise complete."
2652
+ },
2653
+ {
2654
+ "exerciseName": "atbash-cipher",
2655
+ "status": "success",
2656
+ "turns": 11,
2657
+ "testResult": {
2658
+ "passed": 14,
2659
+ "failed": 0,
2660
+ "total": 14,
2661
+ "skipped": 0,
2662
+ "success": true,
2663
+ "output": "{\"numFailedTestSuites\":0,\"numFailedTests\":0,\"numPassedTestSuites\":1,\"numPassedTests\":14,\"numPendingTestSuites\":0,\"numPendingTests\":0,\"numRuntimeErrorTestSuites\":0,\"numTodoTests\":0,\"numTotalTestSuites\":1,\"numTotalTests\":14,\"openHandles\":[],\"snapshot\":{\"added\":0,\"didUpdate\":false,\"failure\":false,\"filesAdded\":0,\"filesRemoved\":0,\"filesRemovedList\":[],\"filesUnmatched\":0,\"filesUpdated\":0,\"matched\":0,\"total\":0,\"unchecked\":0,\"uncheckedKeysByFile\":[],\"unmatched\":0,\"updated\":0},\"startTime\":1754204100968,\"success\":true,\"testResults\":[{\"assertionResults\":[{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode yes\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode yes\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode no\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode no\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode OMG\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode OMG\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode spaces\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode spaces\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode mindblowingly\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode mindblowingly\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode numbers\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode numbers\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode deep thought\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode deep thought\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"encode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher encode encode all the letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"encode all the letters\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher decode decode exercism\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode exercism\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher decode decode a sentence\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode a sentence\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher decode decode numbers\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode numbers\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"decode\"],\"duration\":1,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher decode decode all the letters\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode all the letters\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher decode decode with too many spaces\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode with too many spaces\"},{\"ancestorTitles\":[\"Atbash Cipher\",\"decode\"],\"duration\":0,\"failureDetails\":[],\"failureMessages\":[],\"fullName\":\"Atbash Cipher decode decode with no spaces\",\"invocations\":1,\"location\":null,\"numPassingAsserts\":1,\"retryReasons\":[],\"status\":\"passed\",\"title\":\"decode with no spaces\"}],\"endTime\":1754204101051,\"message\":\"\",\"name\":\"/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/atbash-cipher/atbash-cipher.spec.js\",\"startTime\":1754204100978,\"status\":\"passed\",\"summary\":\"\"}],\"wasInterrupted\":false}\n",
2664
+ "details": {
2665
+ "numFailedTestSuites": 0,
2666
+ "numFailedTests": 0,
2667
+ "numPassedTestSuites": 1,
2668
+ "numPassedTests": 14,
2669
+ "numPendingTestSuites": 0,
2670
+ "numPendingTests": 0,
2671
+ "numRuntimeErrorTestSuites": 0,
2672
+ "numTodoTests": 0,
2673
+ "numTotalTestSuites": 1,
2674
+ "numTotalTests": 14,
2675
+ "openHandles": [],
2676
+ "snapshot": {
2677
+ "added": 0,
2678
+ "didUpdate": false,
2679
+ "failure": false,
2680
+ "filesAdded": 0,
2681
+ "filesRemoved": 0,
2682
+ "filesRemovedList": [],
2683
+ "filesUnmatched": 0,
2684
+ "filesUpdated": 0,
2685
+ "matched": 0,
2686
+ "total": 0,
2687
+ "unchecked": 0,
2688
+ "uncheckedKeysByFile": [],
2689
+ "unmatched": 0,
2690
+ "updated": 0
2691
+ },
2692
+ "startTime": 1754204100968,
2693
+ "success": true,
2694
+ "testResults": [
2695
+ {
2696
+ "assertionResults": [
2697
+ {
2698
+ "ancestorTitles": [
2699
+ "Atbash Cipher",
2700
+ "encode"
2701
+ ],
2702
+ "duration": 0,
2703
+ "failureDetails": [],
2704
+ "failureMessages": [],
2705
+ "fullName": "Atbash Cipher encode encode yes",
2706
+ "invocations": 1,
2707
+ "location": null,
2708
+ "numPassingAsserts": 1,
2709
+ "retryReasons": [],
2710
+ "status": "passed",
2711
+ "title": "encode yes"
2712
+ },
2713
+ {
2714
+ "ancestorTitles": [
2715
+ "Atbash Cipher",
2716
+ "encode"
2717
+ ],
2718
+ "duration": 0,
2719
+ "failureDetails": [],
2720
+ "failureMessages": [],
2721
+ "fullName": "Atbash Cipher encode encode no",
2722
+ "invocations": 1,
2723
+ "location": null,
2724
+ "numPassingAsserts": 1,
2725
+ "retryReasons": [],
2726
+ "status": "passed",
2727
+ "title": "encode no"
2728
+ },
2729
+ {
2730
+ "ancestorTitles": [
2731
+ "Atbash Cipher",
2732
+ "encode"
2733
+ ],
2734
+ "duration": 0,
2735
+ "failureDetails": [],
2736
+ "failureMessages": [],
2737
+ "fullName": "Atbash Cipher encode encode OMG",
2738
+ "invocations": 1,
2739
+ "location": null,
2740
+ "numPassingAsserts": 1,
2741
+ "retryReasons": [],
2742
+ "status": "passed",
2743
+ "title": "encode OMG"
2744
+ },
2745
+ {
2746
+ "ancestorTitles": [
2747
+ "Atbash Cipher",
2748
+ "encode"
2749
+ ],
2750
+ "duration": 0,
2751
+ "failureDetails": [],
2752
+ "failureMessages": [],
2753
+ "fullName": "Atbash Cipher encode encode spaces",
2754
+ "invocations": 1,
2755
+ "location": null,
2756
+ "numPassingAsserts": 1,
2757
+ "retryReasons": [],
2758
+ "status": "passed",
2759
+ "title": "encode spaces"
2760
+ },
2761
+ {
2762
+ "ancestorTitles": [
2763
+ "Atbash Cipher",
2764
+ "encode"
2765
+ ],
2766
+ "duration": 0,
2767
+ "failureDetails": [],
2768
+ "failureMessages": [],
2769
+ "fullName": "Atbash Cipher encode encode mindblowingly",
2770
+ "invocations": 1,
2771
+ "location": null,
2772
+ "numPassingAsserts": 1,
2773
+ "retryReasons": [],
2774
+ "status": "passed",
2775
+ "title": "encode mindblowingly"
2776
+ },
2777
+ {
2778
+ "ancestorTitles": [
2779
+ "Atbash Cipher",
2780
+ "encode"
2781
+ ],
2782
+ "duration": 1,
2783
+ "failureDetails": [],
2784
+ "failureMessages": [],
2785
+ "fullName": "Atbash Cipher encode encode numbers",
2786
+ "invocations": 1,
2787
+ "location": null,
2788
+ "numPassingAsserts": 1,
2789
+ "retryReasons": [],
2790
+ "status": "passed",
2791
+ "title": "encode numbers"
2792
+ },
2793
+ {
2794
+ "ancestorTitles": [
2795
+ "Atbash Cipher",
2796
+ "encode"
2797
+ ],
2798
+ "duration": 0,
2799
+ "failureDetails": [],
2800
+ "failureMessages": [],
2801
+ "fullName": "Atbash Cipher encode encode deep thought",
2802
+ "invocations": 1,
2803
+ "location": null,
2804
+ "numPassingAsserts": 1,
2805
+ "retryReasons": [],
2806
+ "status": "passed",
2807
+ "title": "encode deep thought"
2808
+ },
2809
+ {
2810
+ "ancestorTitles": [
2811
+ "Atbash Cipher",
2812
+ "encode"
2813
+ ],
2814
+ "duration": 0,
2815
+ "failureDetails": [],
2816
+ "failureMessages": [],
2817
+ "fullName": "Atbash Cipher encode encode all the letters",
2818
+ "invocations": 1,
2819
+ "location": null,
2820
+ "numPassingAsserts": 1,
2821
+ "retryReasons": [],
2822
+ "status": "passed",
2823
+ "title": "encode all the letters"
2824
+ },
2825
+ {
2826
+ "ancestorTitles": [
2827
+ "Atbash Cipher",
2828
+ "decode"
2829
+ ],
2830
+ "duration": 0,
2831
+ "failureDetails": [],
2832
+ "failureMessages": [],
2833
+ "fullName": "Atbash Cipher decode decode exercism",
2834
+ "invocations": 1,
2835
+ "location": null,
2836
+ "numPassingAsserts": 1,
2837
+ "retryReasons": [],
2838
+ "status": "passed",
2839
+ "title": "decode exercism"
2840
+ },
2841
+ {
2842
+ "ancestorTitles": [
2843
+ "Atbash Cipher",
2844
+ "decode"
2845
+ ],
2846
+ "duration": 0,
2847
+ "failureDetails": [],
2848
+ "failureMessages": [],
2849
+ "fullName": "Atbash Cipher decode decode a sentence",
2850
+ "invocations": 1,
2851
+ "location": null,
2852
+ "numPassingAsserts": 1,
2853
+ "retryReasons": [],
2854
+ "status": "passed",
2855
+ "title": "decode a sentence"
2856
+ },
2857
+ {
2858
+ "ancestorTitles": [
2859
+ "Atbash Cipher",
2860
+ "decode"
2861
+ ],
2862
+ "duration": 0,
2863
+ "failureDetails": [],
2864
+ "failureMessages": [],
2865
+ "fullName": "Atbash Cipher decode decode numbers",
2866
+ "invocations": 1,
2867
+ "location": null,
2868
+ "numPassingAsserts": 1,
2869
+ "retryReasons": [],
2870
+ "status": "passed",
2871
+ "title": "decode numbers"
2872
+ },
2873
+ {
2874
+ "ancestorTitles": [
2875
+ "Atbash Cipher",
2876
+ "decode"
2877
+ ],
2878
+ "duration": 1,
2879
+ "failureDetails": [],
2880
+ "failureMessages": [],
2881
+ "fullName": "Atbash Cipher decode decode all the letters",
2882
+ "invocations": 1,
2883
+ "location": null,
2884
+ "numPassingAsserts": 1,
2885
+ "retryReasons": [],
2886
+ "status": "passed",
2887
+ "title": "decode all the letters"
2888
+ },
2889
+ {
2890
+ "ancestorTitles": [
2891
+ "Atbash Cipher",
2892
+ "decode"
2893
+ ],
2894
+ "duration": 0,
2895
+ "failureDetails": [],
2896
+ "failureMessages": [],
2897
+ "fullName": "Atbash Cipher decode decode with too many spaces",
2898
+ "invocations": 1,
2899
+ "location": null,
2900
+ "numPassingAsserts": 1,
2901
+ "retryReasons": [],
2902
+ "status": "passed",
2903
+ "title": "decode with too many spaces"
2904
+ },
2905
+ {
2906
+ "ancestorTitles": [
2907
+ "Atbash Cipher",
2908
+ "decode"
2909
+ ],
2910
+ "duration": 0,
2911
+ "failureDetails": [],
2912
+ "failureMessages": [],
2913
+ "fullName": "Atbash Cipher decode decode with no spaces",
2914
+ "invocations": 1,
2915
+ "location": null,
2916
+ "numPassingAsserts": 1,
2917
+ "retryReasons": [],
2918
+ "status": "passed",
2919
+ "title": "decode with no spaces"
2920
+ }
2921
+ ],
2922
+ "endTime": 1754204101051,
2923
+ "message": "",
2924
+ "name": "/Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/atbash-cipher/atbash-cipher.spec.js",
2925
+ "startTime": 1754204100978,
2926
+ "status": "passed",
2927
+ "summary": ""
2928
+ }
2929
+ ],
2930
+ "wasInterrupted": false
2931
+ }
2932
+ },
2933
+ "timeElapsed": 19.363,
2934
+ "cost": 0.21449992281600003,
2935
+ "startTime": "2025-08-03T06:54:41.713Z",
2936
+ "endTime": "2025-08-03T06:55:01.076Z",
2937
+ "finalOutput": "The Atbash Cipher implementation is complete and all tests pass successfully.\n\nSummary of what was done:\n- Implemented the 'encode' and 'decode' functions in atbash-cipher.js.\n- The encode function:\n - Substitutes each letter using the Atbash rule, preserves digits, strips punctuation, and outputs in groups of 5 characters with spaces.\n- The decode function:\n - Ignores all whitespace and punctuation, reverses letters by the Atbash rule, preserves digits, and does not group output.\n- All previously skipped tests were unskipped, and all tests pass.\n- Checked and linted the implementation for code correctness and style.\n\nYou can now use this Atbash cipher implementation as required."
2938
+ },
2939
+ {
2940
+ "exerciseName": "bank-account",
2941
+ "status": "success",
2942
+ "turns": 30,
2943
+ "testResult": {
2944
+ "passed": 0,
2945
+ "failed": 0,
2946
+ "total": 0,
2947
+ "success": false,
2948
+ "output": "Command failed: npx jest --json --verbose\n● Multiple configurations found:\n\n * /Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/bank-account/jest.config.js\n * /Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/bank-account/jest.config.cjs\n\n Implicit config resolution does not allow multiple configuration files.\n Either remove unused config files or select one explicitly with `--config`.\n\n Configuration Documentation:\n https://jestjs.io/docs/configuration\n\n",
2949
+ "errorMessage": "Command failed: npx jest --json --verbose\n● Multiple configurations found:\n\n * /Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/bank-account/jest.config.js\n * /Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/bank-account/jest.config.cjs\n\n Implicit config resolution does not allow multiple configuration files.\n Either remove unused config files or select one explicitly with `--config`.\n\n Configuration Documentation:\n https://jestjs.io/docs/configuration\n\n",
2950
+ "details": {
2951
+ "status": 1,
2952
+ "signal": null,
2953
+ "output": [
2954
+ null,
2955
+ "",
2956
+ "● Multiple configurations found:\n\n * /Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/bank-account/jest.config.js\n * /Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/bank-account/jest.config.cjs\n\n Implicit config resolution does not allow multiple configuration files.\n Either remove unused config files or select one explicitly with `--config`.\n\n Configuration Documentation:\n https://jestjs.io/docs/configuration\n\n"
2957
+ ],
2958
+ "pid": 3832,
2959
+ "stdout": "",
2960
+ "stderr": "● Multiple configurations found:\n\n * /Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/bank-account/jest.config.js\n * /Users/micah/dev/knowhow/packages/knowhow/benchmarks/exercises/filtered/bank-account/jest.config.cjs\n\n Implicit config resolution does not allow multiple configuration files.\n Either remove unused config files or select one explicitly with `--config`.\n\n Configuration Documentation:\n https://jestjs.io/docs/configuration\n\n"
2961
+ }
2962
+ },
2963
+ "timeElapsed": 46.665,
2964
+ "cost": 0.7939257059839997,
2965
+ "startTime": "2025-08-03T06:55:01.076Z",
2966
+ "endTime": "2025-08-03T06:55:47.741Z",
2967
+ "finalOutput": "Task terminated due to limits reached. Turn: 30/30, Cost: $0.7939/$1.0000"
2968
+ }
2969
+ ],
2970
+ "summary": {
2971
+ "totalExercises": 10,
2972
+ "successCount": 10,
2973
+ "testableExercises": 10,
2974
+ "testsPassedCount": 8,
2975
+ "testsFailedCount": 2,
2976
+ "testPassRate": 0.8,
2977
+ "agentSuccessRate": 1,
2978
+ "failureCount": 0,
2979
+ "timeoutCount": 0,
2980
+ "costLimitCount": 0,
2981
+ "turnLimitCount": 0,
2982
+ "totalTime": 532.17,
2983
+ "totalCost": 4.903610307968,
2984
+ "averageTurns": 17.9,
2985
+ "averageTime": 53.217,
2986
+ "successRate": 0.8
2987
+ },
2988
+ "startTime": "2025-08-03T06:46:55.484Z",
2989
+ "endTime": "2025-08-03T06:55:47.741Z"
2990
+ }