kenaz 0.3.3 → 0.3.6

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 (451) hide show
  1. package/core/.agents/skills/typesafe-ai/LICENSE +21 -21
  2. package/core/.agents/skills/typesafe-ai/SKILL.md +149 -149
  3. package/core/.claude/commands/Ansuz.md +15 -2
  4. package/core/.claude/hooks/__tests__/task-2395-project-registration.test.js +84 -0
  5. package/core/.claude/hooks/handoff-staleness.js +2 -2
  6. package/core/.claude/hooks/session-init.ps1 +49 -49
  7. package/core/.claude/hooks/turn-context.js +50 -2
  8. package/core/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -26
  9. package/core/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -97
  10. package/core/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -101
  11. package/core/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -31
  12. package/core/.claude/skills/ui-ux-pro-max/data/products.csv +96 -96
  13. package/core/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  14. package/core/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  15. package/core/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  16. package/core/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  17. package/core/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  18. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  19. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  20. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  21. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  22. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  23. package/core/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  24. package/core/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  25. package/core/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  26. package/core/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  27. package/core/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -68
  28. package/core/.claude/skills/ui-ux-pro-max/data/typography.csv +57 -57
  29. package/core/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  30. package/core/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  31. package/core/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  32. package/core/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -253
  33. package/core/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  34. package/core/.claude/skills/ui-ux-pro-max/scripts/search.py +106 -106
  35. package/core/.collaboration/core/task-api.js +1 -4
  36. package/core/.formation/README.md +21 -146
  37. package/core/.formation/bifrost/codex-doctor.js +37 -2
  38. package/core/.formation/bifrost/codex-doctor.test.js +18 -0
  39. package/core/.formation/bifrost/launch.js +1 -1
  40. package/core/.formation/bifrost/openai/codex-hook-shim.js +6 -0
  41. package/core/.formation/bifrost/openai/codex-hook-shim.test.js +11 -1
  42. package/core/.formation/bifrost/setup-codex.js +3 -0
  43. package/core/.formation/native/claude/README.md +1 -1
  44. package/core/.formation/role-map.yaml +3 -3
  45. package/core/.formation/spec/task_operations.parity.test.js +0 -1
  46. package/core/.formation/spec/task_operations.yaml +3 -3
  47. package/core/.formation/tests/hello.txt +2 -2
  48. package/core/.formation/tools/__tests__/subagent-bifrost-guard.test.js +4 -4
  49. package/core/.formation/tools/dashboard-models-chain.test.js +0 -6
  50. package/core/.formation/tools/dispatch-detail/cross-project-worktree.md +1 -9
  51. package/core/.formation/tools/dispatch-detail/worktree-subagent-mode.md +2 -2
  52. package/core/.formation/tools/dispatch.js +33 -554
  53. package/core/.formation/tools/mcp-allowlist.test.js +0 -1
  54. package/core/.formation/tools/post-complete/task2345.test.js +0 -5
  55. package/core/.formation/tools/pre-dispatch-snapshot.test.js +0 -100
  56. package/core/.formation/tools/prompt.js +33 -1623
  57. package/core/.formation/tools/prompt.test.js +26 -594
  58. package/core/.formation/unit/do.yaml +2 -4
  59. package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -163
  60. package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -393
  61. package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -102
  62. package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -412
  63. package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -144
  64. package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -86
  65. package/core/.kenaz/muninn_episode_write.ps1 +17 -17
  66. package/core/.kenaz/specialist/field_report_watermark.json +1 -1
  67. package/core/.kenaz/specialist/memory_guard_fired.json +1 -1
  68. package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -1
  69. package/core/.kenaz/specialist/t1777_probe.txt +1 -1
  70. package/core/.matrix/index.matrix +5 -5
  71. package/core/.rule/general/agent-workflow.yaml +4 -4
  72. package/core/.rule/general/file-size-threshold.yaml +16 -4
  73. package/core/.rule/general/rust-verify-target.yaml +0 -1
  74. package/core/.rule/general/system-invariants.yaml +8 -25
  75. package/core/.specialist/Ansuz/SYSTEM_DOC.md +17 -42
  76. package/core/.specialist/Ansuz/capability.yaml +7 -14
  77. package/core/.specialist/Ansuz/concepts/formation_quick_ref.yaml +4 -11
  78. package/core/.specialist/Ansuz/elixir.yaml +3 -4
  79. package/core/.specialist/Ansuz/identity_contract.yaml +1 -1
  80. package/core/.specialist/Ansuz/knowledge.yaml +7 -10
  81. package/core/.specialist/Ansuz/rule.yaml +2 -2
  82. package/core/.specialist/Ansuz/tools/verify-and-land.js +22 -0
  83. package/core/.specialist/Ansuz/tools/verify-and-land.test.js +59 -5
  84. package/core/.specialist/Ansuz/workflow.yaml +7 -11
  85. package/core/.specialist/Forseti/core.yaml +1 -1
  86. package/core/.specialist/Heimdall/SKILL.md +1 -1
  87. package/core/.specialist/Heimdall/core.yaml +2 -2
  88. package/core/.specialist/Huginn/rule.yaml +1 -1
  89. package/core/.specialist/tools/README.md +2 -2
  90. package/core/.specialist/tools/__tests__/freya-cli-contract.test.js +0 -1
  91. package/core/.system/collaboration/README.md +1 -1
  92. package/core/.system/formation/LEGACY_SKILLS.md +2 -0
  93. package/core/.system/formation/POST_COMPLETE.md +2 -0
  94. package/core/.system/formation/README.md +2 -0
  95. package/core/KENAZ_CORE_VERSION +1 -1
  96. package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -355
  97. package/core/dev/JEV_INTEGRATION_PLAN.md +189 -189
  98. package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -13
  99. package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -9
  100. package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -14
  101. package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -67
  102. package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -52
  103. package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -31
  104. package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -39
  105. package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -33
  106. package/core/dev/jev-eval/README.md +99 -99
  107. package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -58
  108. package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -32
  109. package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -48
  110. package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -52
  111. package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -47
  112. package/core/dev/pipeline/tasks/.gitkeep +1 -1
  113. package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -27
  114. package/core/dev/scripts/check-file-size.js +44 -17
  115. package/core/dev/scripts/init_git.sh +0 -0
  116. package/core/dev/scripts/init_project.sh +0 -0
  117. package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -536
  118. package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -1978
  119. package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -140
  120. package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -173
  121. package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -168
  122. package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -126
  123. package/core/dev/scripts/multi_agent_scheduler.sh +0 -0
  124. package/core/dev/scripts/run_once.sh +0 -0
  125. package/core/dev/scripts/setup_mcp.sh +0 -0
  126. package/core/dev/scripts/setup_rag.sh +0 -0
  127. package/core/dev/scripts/start_dev_agent.sh +0 -0
  128. package/core/dev/scripts/start_multi_agent.sh +0 -0
  129. package/core/dev/scripts/sync_task_queue.sh +0 -0
  130. package/core/k-cli/README.md +1 -94
  131. package/core/k-cli/test/TEST_SPEC.md +5 -22
  132. package/core/k-cli/test/run.sh +1 -67
  133. package/core/plugins/kenaz/commands/Amelia.md +1 -1
  134. package/core/plugins/kenaz/commands/Ansuz.md +16 -3
  135. package/core/plugins/kenaz/scripts/kenaz-mode.js +11 -1
  136. package/core/plugins/kenaz/scripts/sync.js +6 -2
  137. package/core/plugins/kenaz/scripts/ygg.js +13 -1
  138. package/core/plugins/kenaz/skills/product_manager/SKILL.md +12 -12
  139. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -26
  140. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -97
  141. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -101
  142. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -31
  143. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +96 -96
  144. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  145. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  146. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  147. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  148. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  149. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  150. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  151. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  152. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  153. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  154. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  155. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  156. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  157. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  158. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -68
  159. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +57 -57
  160. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  161. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  162. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  163. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -253
  164. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  165. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -106
  166. package/lib/cli.js +11 -4
  167. package/package.json +11 -7
  168. package/vendor/install-kenaz-cli.js +18 -7
  169. package/core/.formation/legion/forge.yaml +0 -299
  170. package/core/.formation/legion/hive.yaml +0 -238
  171. package/core/.formation/squad/blitz.yaml +0 -192
  172. package/core/.formation/squad/strategy-tribunal.yaml +0 -354
  173. package/core/.formation/squad/strategy.yaml +0 -349
  174. package/core/.formation/squad/sweep.yaml +0 -208
  175. package/core/.formation/tools/broadcast.js +0 -103
  176. package/core/.formation/tools/dispatch-dryrun.test.js +0 -54
  177. package/core/.formation/tools/dispatch-notifier.js +0 -84
  178. package/core/.formation/tools/formations.js +0 -1203
  179. package/core/.formation/tools/headless-branch-recovery.test.js +0 -64
  180. package/core/.formation/tools/headless-dryrun.test.js +0 -79
  181. package/core/.formation/tools/headless-v2.js +0 -659
  182. package/core/.formation/tools/headless.js +0 -1071
  183. package/core/.formation/tools/legacy-scheduler.js +0 -1994
  184. package/core/.formation/tools/logger.js +0 -273
  185. package/core/.formation/tools/memory-loader.js +0 -422
  186. package/core/.formation/tools/process-state.js +0 -33
  187. package/core/.formation/tools/remote-conflict.js +0 -98
  188. package/core/.formation/tools/runner.js +0 -1332
  189. package/core/.formation/tools/task-utils.js +0 -344
  190. package/core/.formation/tools/task2028-headless-worktree.test.js +0 -112
  191. package/core/.formation/tools/tests/headless-mcp-args-plumbing.test.js +0 -123
  192. package/core/.formation/tools/worktree-leak.test.js +0 -162
  193. package/core/k-cli/dist/alaya/run.js +0 -91
  194. package/core/k-cli/dist/core/output.js +0 -24
  195. package/core/k-cli/dist/core/process.js +0 -38
  196. package/core/k-cli/dist/core/project.js +0 -80
  197. package/core/k-cli/dist/core/spawn.js +0 -268
  198. package/core/k-cli/dist/core/types.js +0 -2
  199. package/core/k-cli/dist/dashboard/update.js +0 -53
  200. package/core/k-cli/dist/dashboard/version.js +0 -20
  201. package/core/k-cli/dist/dispatch/run.js +0 -241
  202. package/core/k-cli/dist/dispatch/status.js +0 -103
  203. package/core/k-cli/dist/index.js +0 -283
  204. package/core/k-cli/dist/project/initialize.js +0 -301
  205. package/core/k-cli/dist/project/install.js +0 -89
  206. package/core/k-cli/dist/project/status.js +0 -138
  207. package/core/k-cli/dist/specialist/list.js +0 -100
  208. package/core/k-cli/dist/specialist/run.js +0 -93
  209. package/core/k-cli/dist/task/create.js +0 -194
  210. package/core/k-cli/dist/task/delete.js +0 -98
  211. package/core/k-cli/dist/task/get.js +0 -55
  212. package/core/k-cli/dist/task/list.js +0 -58
  213. package/core/k-cli/dist/task/submit.js +0 -156
  214. package/core/k-cli/dist/ygg/run.js +0 -51
  215. package/core/k-cli/node_modules/.bin/yaml +0 -16
  216. package/core/k-cli/node_modules/.bin/yaml.cmd +0 -17
  217. package/core/k-cli/node_modules/.bin/yaml.ps1 +0 -28
  218. package/core/k-cli/node_modules/.package-lock.json +0 -23
  219. package/core/k-cli/node_modules/yaml/LICENSE +0 -13
  220. package/core/k-cli/node_modules/yaml/README.md +0 -172
  221. package/core/k-cli/node_modules/yaml/bin.mjs +0 -11
  222. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-collection.js +0 -88
  223. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-doc.js +0 -43
  224. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-node.js +0 -109
  225. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-scalar.js +0 -86
  226. package/core/k-cli/node_modules/yaml/browser/dist/compose/composer.js +0 -217
  227. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-map.js +0 -115
  228. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +0 -198
  229. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +0 -49
  230. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-end.js +0 -37
  231. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +0 -207
  232. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +0 -223
  233. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-props.js +0 -146
  234. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-contains-newline.js +0 -34
  235. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +0 -26
  236. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +0 -15
  237. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-map-includes.js +0 -13
  238. package/core/k-cli/node_modules/yaml/browser/dist/doc/Document.js +0 -335
  239. package/core/k-cli/node_modules/yaml/browser/dist/doc/anchors.js +0 -71
  240. package/core/k-cli/node_modules/yaml/browser/dist/doc/applyReviver.js +0 -55
  241. package/core/k-cli/node_modules/yaml/browser/dist/doc/createNode.js +0 -88
  242. package/core/k-cli/node_modules/yaml/browser/dist/doc/directives.js +0 -176
  243. package/core/k-cli/node_modules/yaml/browser/dist/errors.js +0 -57
  244. package/core/k-cli/node_modules/yaml/browser/dist/index.js +0 -17
  245. package/core/k-cli/node_modules/yaml/browser/dist/log.js +0 -11
  246. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Alias.js +0 -114
  247. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Collection.js +0 -147
  248. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Node.js +0 -38
  249. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Pair.js +0 -36
  250. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Scalar.js +0 -24
  251. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLMap.js +0 -144
  252. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +0 -113
  253. package/core/k-cli/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +0 -63
  254. package/core/k-cli/node_modules/yaml/browser/dist/nodes/identity.js +0 -36
  255. package/core/k-cli/node_modules/yaml/browser/dist/nodes/toJS.js +0 -37
  256. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-scalar.js +0 -214
  257. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-stringify.js +0 -61
  258. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-visit.js +0 -97
  259. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst.js +0 -98
  260. package/core/k-cli/node_modules/yaml/browser/dist/parse/lexer.js +0 -717
  261. package/core/k-cli/node_modules/yaml/browser/dist/parse/line-counter.js +0 -39
  262. package/core/k-cli/node_modules/yaml/browser/dist/parse/parser.js +0 -967
  263. package/core/k-cli/node_modules/yaml/browser/dist/public-api.js +0 -102
  264. package/core/k-cli/node_modules/yaml/browser/dist/schema/Schema.js +0 -37
  265. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/map.js +0 -17
  266. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/null.js +0 -15
  267. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/seq.js +0 -17
  268. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/string.js +0 -14
  269. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/bool.js +0 -19
  270. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/float.js +0 -43
  271. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/int.js +0 -38
  272. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/schema.js +0 -23
  273. package/core/k-cli/node_modules/yaml/browser/dist/schema/json/schema.js +0 -62
  274. package/core/k-cli/node_modules/yaml/browser/dist/schema/tags.js +0 -96
  275. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +0 -58
  276. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +0 -26
  277. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +0 -46
  278. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +0 -71
  279. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +0 -64
  280. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +0 -74
  281. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +0 -78
  282. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +0 -39
  283. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +0 -93
  284. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +0 -101
  285. package/core/k-cli/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +0 -146
  286. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringify.js +0 -129
  287. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +0 -153
  288. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyComment.js +0 -20
  289. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +0 -85
  290. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +0 -24
  291. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyPair.js +0 -150
  292. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyString.js +0 -336
  293. package/core/k-cli/node_modules/yaml/browser/dist/util.js +0 -11
  294. package/core/k-cli/node_modules/yaml/browser/dist/visit.js +0 -233
  295. package/core/k-cli/node_modules/yaml/browser/index.js +0 -5
  296. package/core/k-cli/node_modules/yaml/browser/package.json +0 -3
  297. package/core/k-cli/node_modules/yaml/dist/cli.d.ts +0 -8
  298. package/core/k-cli/node_modules/yaml/dist/cli.mjs +0 -201
  299. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.d.ts +0 -11
  300. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.js +0 -90
  301. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.d.ts +0 -7
  302. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.js +0 -45
  303. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.d.ts +0 -29
  304. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.js +0 -112
  305. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.d.ts +0 -5
  306. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.js +0 -88
  307. package/core/k-cli/node_modules/yaml/dist/compose/composer.d.ts +0 -63
  308. package/core/k-cli/node_modules/yaml/dist/compose/composer.js +0 -222
  309. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.d.ts +0 -6
  310. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.js +0 -117
  311. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +0 -11
  312. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.js +0 -200
  313. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +0 -6
  314. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.js +0 -51
  315. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.d.ts +0 -6
  316. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.js +0 -39
  317. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +0 -7
  318. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.js +0 -209
  319. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +0 -10
  320. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.js +0 -225
  321. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.d.ts +0 -23
  322. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.js +0 -148
  323. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.d.ts +0 -2
  324. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.js +0 -36
  325. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +0 -2
  326. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.js +0 -28
  327. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +0 -3
  328. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.js +0 -17
  329. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.d.ts +0 -4
  330. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.js +0 -15
  331. package/core/k-cli/node_modules/yaml/dist/doc/Document.d.ts +0 -141
  332. package/core/k-cli/node_modules/yaml/dist/doc/Document.js +0 -337
  333. package/core/k-cli/node_modules/yaml/dist/doc/anchors.d.ts +0 -24
  334. package/core/k-cli/node_modules/yaml/dist/doc/anchors.js +0 -76
  335. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.d.ts +0 -9
  336. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.js +0 -57
  337. package/core/k-cli/node_modules/yaml/dist/doc/createNode.d.ts +0 -17
  338. package/core/k-cli/node_modules/yaml/dist/doc/createNode.js +0 -90
  339. package/core/k-cli/node_modules/yaml/dist/doc/directives.d.ts +0 -49
  340. package/core/k-cli/node_modules/yaml/dist/doc/directives.js +0 -178
  341. package/core/k-cli/node_modules/yaml/dist/errors.d.ts +0 -21
  342. package/core/k-cli/node_modules/yaml/dist/errors.js +0 -62
  343. package/core/k-cli/node_modules/yaml/dist/index.d.ts +0 -25
  344. package/core/k-cli/node_modules/yaml/dist/index.js +0 -50
  345. package/core/k-cli/node_modules/yaml/dist/log.d.ts +0 -3
  346. package/core/k-cli/node_modules/yaml/dist/log.js +0 -19
  347. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.d.ts +0 -29
  348. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.js +0 -116
  349. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.d.ts +0 -73
  350. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.js +0 -151
  351. package/core/k-cli/node_modules/yaml/dist/nodes/Node.d.ts +0 -53
  352. package/core/k-cli/node_modules/yaml/dist/nodes/Node.js +0 -40
  353. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.d.ts +0 -22
  354. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.js +0 -39
  355. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.d.ts +0 -43
  356. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.js +0 -27
  357. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.d.ts +0 -53
  358. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.js +0 -147
  359. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +0 -60
  360. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.js +0 -115
  361. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +0 -4
  362. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.js +0 -65
  363. package/core/k-cli/node_modules/yaml/dist/nodes/identity.d.ts +0 -23
  364. package/core/k-cli/node_modules/yaml/dist/nodes/identity.js +0 -53
  365. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.d.ts +0 -29
  366. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.js +0 -39
  367. package/core/k-cli/node_modules/yaml/dist/options.d.ts +0 -350
  368. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.d.ts +0 -64
  369. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.js +0 -218
  370. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.d.ts +0 -8
  371. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.js +0 -63
  372. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.d.ts +0 -39
  373. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.js +0 -99
  374. package/core/k-cli/node_modules/yaml/dist/parse/cst.d.ts +0 -109
  375. package/core/k-cli/node_modules/yaml/dist/parse/cst.js +0 -112
  376. package/core/k-cli/node_modules/yaml/dist/parse/lexer.d.ts +0 -87
  377. package/core/k-cli/node_modules/yaml/dist/parse/lexer.js +0 -719
  378. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.d.ts +0 -22
  379. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.js +0 -41
  380. package/core/k-cli/node_modules/yaml/dist/parse/parser.d.ts +0 -84
  381. package/core/k-cli/node_modules/yaml/dist/parse/parser.js +0 -972
  382. package/core/k-cli/node_modules/yaml/dist/public-api.d.ts +0 -44
  383. package/core/k-cli/node_modules/yaml/dist/public-api.js +0 -107
  384. package/core/k-cli/node_modules/yaml/dist/schema/Schema.d.ts +0 -17
  385. package/core/k-cli/node_modules/yaml/dist/schema/Schema.js +0 -39
  386. package/core/k-cli/node_modules/yaml/dist/schema/common/map.d.ts +0 -2
  387. package/core/k-cli/node_modules/yaml/dist/schema/common/map.js +0 -19
  388. package/core/k-cli/node_modules/yaml/dist/schema/common/null.d.ts +0 -4
  389. package/core/k-cli/node_modules/yaml/dist/schema/common/null.js +0 -17
  390. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.d.ts +0 -2
  391. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.js +0 -19
  392. package/core/k-cli/node_modules/yaml/dist/schema/common/string.d.ts +0 -2
  393. package/core/k-cli/node_modules/yaml/dist/schema/common/string.js +0 -16
  394. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.d.ts +0 -4
  395. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.js +0 -21
  396. package/core/k-cli/node_modules/yaml/dist/schema/core/float.d.ts +0 -4
  397. package/core/k-cli/node_modules/yaml/dist/schema/core/float.js +0 -47
  398. package/core/k-cli/node_modules/yaml/dist/schema/core/int.d.ts +0 -4
  399. package/core/k-cli/node_modules/yaml/dist/schema/core/int.js +0 -42
  400. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.d.ts +0 -1
  401. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.js +0 -25
  402. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.d.ts +0 -2
  403. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.js +0 -64
  404. package/core/k-cli/node_modules/yaml/dist/schema/json-schema.d.ts +0 -69
  405. package/core/k-cli/node_modules/yaml/dist/schema/tags.d.ts +0 -48
  406. package/core/k-cli/node_modules/yaml/dist/schema/tags.js +0 -99
  407. package/core/k-cli/node_modules/yaml/dist/schema/types.d.ts +0 -92
  408. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +0 -2
  409. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.js +0 -70
  410. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +0 -7
  411. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.js +0 -29
  412. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +0 -4
  413. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.js +0 -50
  414. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +0 -5
  415. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.js +0 -76
  416. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +0 -9
  417. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.js +0 -68
  418. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +0 -22
  419. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.js +0 -77
  420. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +0 -10
  421. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +0 -82
  422. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +0 -1
  423. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.js +0 -41
  424. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +0 -28
  425. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.js +0 -96
  426. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +0 -6
  427. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +0 -105
  428. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +0 -34
  429. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.js +0 -151
  430. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.d.ts +0 -21
  431. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.js +0 -132
  432. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +0 -17
  433. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.js +0 -155
  434. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.d.ts +0 -10
  435. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.js +0 -24
  436. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +0 -4
  437. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.js +0 -87
  438. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +0 -2
  439. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.js +0 -26
  440. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.d.ts +0 -3
  441. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.js +0 -152
  442. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.d.ts +0 -9
  443. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.js +0 -338
  444. package/core/k-cli/node_modules/yaml/dist/test-events.d.ts +0 -4
  445. package/core/k-cli/node_modules/yaml/dist/test-events.js +0 -134
  446. package/core/k-cli/node_modules/yaml/dist/util.d.ts +0 -16
  447. package/core/k-cli/node_modules/yaml/dist/util.js +0 -28
  448. package/core/k-cli/node_modules/yaml/dist/visit.d.ts +0 -102
  449. package/core/k-cli/node_modules/yaml/dist/visit.js +0 -236
  450. package/core/k-cli/node_modules/yaml/package.json +0 -97
  451. package/core/k-cli/node_modules/yaml/util.js +0 -2
@@ -1,144 +1,144 @@
1
- diff --git a/src/storage/index/hash_index.cpp b/src/storage/index/hash_index.cpp
2
- index b65b3da86..2e952966e 100644
3
- --- a/src/storage/index/hash_index.cpp
4
- +++ b/src/storage/index/hash_index.cpp
5
- @@ -770,13 +770,15 @@ void PrimaryKeyIndex::checkpoint(main::ClientContext*, storage::PageAllocator& p
6
- indexChanged = true;
7
- }
8
- }
9
- + // Assign both header pages under one condition: the constructor rejects an overflow
10
- + // header page without index header pages.
11
- if (indexChanged) {
12
- writeHeaders(pageAllocator);
13
- hashIndexDiskArrays->checkpoint(getDiskArrayFirstHeaderPage(), pageAllocator);
14
- - }
15
- - if (overflowFile) {
16
- - overflowFile->checkpoint(pageAllocator);
17
- - updateOverflowHeaderPageIfNeeded(storageInfo.get(), overflowFile.get());
18
- + if (overflowFile) {
19
- + overflowFile->checkpoint(pageAllocator);
20
- + updateOverflowHeaderPageIfNeeded(storageInfo.get(), overflowFile.get());
21
- + }
22
- }
23
- // Make sure that changes which bypassed the WAL are written.
24
- // There is no other mechanism for enforcing that they are flushed
25
- diff --git a/test/storage/CMakeLists.txt b/test/storage/CMakeLists.txt
26
- index 581979387..3cabd5c2b 100644
27
- --- a/test/storage/CMakeLists.txt
28
- +++ b/test/storage/CMakeLists.txt
29
- @@ -3,6 +3,7 @@ add_lbug_test(compression_test compression_test.cpp compress_chunk_test.cpp)
30
- add_lbug_test(alp_exception_chunk_test alp_exception_chunk_test.cpp)
31
- add_lbug_test(column_chunk_metadata_test column_chunk_metadata_test.cpp)
32
- add_lbug_test(local_hash_index_test local_hash_index_test.cpp)
33
- +add_lbug_test(pk_index_checkpoint_test pk_index_checkpoint_test.cpp)
34
- add_lbug_test(disk_array_collection_test disk_array_collection_test.cpp)
35
- add_lbug_test(buffer_manager_test buffer_manager_test.cpp)
36
- add_lbug_test(rel_tests rel_scan_test.cpp rel_delete_test.cpp)
37
- diff --git a/test/storage/pk_index_checkpoint_test.cpp b/test/storage/pk_index_checkpoint_test.cpp
38
- new file mode 100644
39
- index 000000000..1e577c45f
40
- --- /dev/null
41
- +++ b/test/storage/pk_index_checkpoint_test.cpp
42
- @@ -0,0 +1,102 @@
43
- +#include "catalog/catalog.h"
44
- +#include "catalog/catalog_entry/node_table_catalog_entry.h"
45
- +#include "graph_test/private_graph_test.h"
46
- +#include "storage/index/hash_index.h"
47
- +#include "storage/storage_manager.h"
48
- +#include "storage/table/node_table.h"
49
- +#include "test_helper/test_helper.h"
50
- +#include "transaction/transaction.h"
51
- +
52
- +using namespace lbug::common;
53
- +using namespace lbug::catalog;
54
- +using namespace lbug::storage;
55
- +using namespace lbug::transaction;
56
- +
57
- +namespace lbug {
58
- +namespace testing {
59
- +
60
- +// Regression tests for #464: checkpointing an empty STRING primary-key index must not persist an
61
- +// overflow header page without the index header pages, which the constructor rejects on reopen.
62
- +class PKIndexCheckpointTest : public EmptyDBTest {
63
- +protected:
64
- + void SetUp() override {
65
- + EmptyDBTest::SetUp();
66
- + createDBAndConn();
67
- + }
68
- +
69
- + void assertQuery(const std::string& query) const {
70
- + auto result = conn->query(query);
71
- + ASSERT_TRUE(result->isSuccess()) << query << ": " << result->toString();
72
- + }
73
- +
74
- + const PrimaryKeyIndexStorageInfo& getPKStorageInfo(const std::string& tableName) const {
75
- + auto* entry = database->getCatalog()
76
- + ->getTableCatalogEntry(&DUMMY_CHECKPOINT_TRANSACTION, tableName)
77
- + ->ptrCast<NodeTableCatalogEntry>();
78
- + auto& nodeTable =
79
- + database->getStorageManager()->getTable(entry->getTableID())->cast<NodeTable>();
80
- + return nodeTable.getPKIndex()->getStorageInfo().constCast<PrimaryKeyIndexStorageInfo>();
81
- + }
82
- +
83
- + // Both header pointers are assigned together, so an unset index header page implies an unset
84
- + // overflow header page.
85
- + void assertHeaderPagesConsistent(const std::string& tableName) const {
86
- + const auto& info = getPKStorageInfo(tableName);
87
- + if (info.firstHeaderPage == INVALID_PAGE_IDX) {
88
- + EXPECT_EQ(info.overflowHeaderPage, INVALID_PAGE_IDX)
89
- + << "overflow header page persisted without index header pages";
90
- + }
91
- + }
92
- +
93
- + void reopen() {
94
- + conn.reset();
95
- + createDBAndConn();
96
- + }
97
- +};
98
- +
99
- +TEST_F(PKIndexCheckpointTest, EmptyStringPKCheckpointAfterAlter) {
100
- + if (inMemMode) {
101
- + GTEST_SKIP();
102
- + }
103
- + assertQuery("CREATE NODE TABLE t(id STRING PRIMARY KEY);");
104
- + assertQuery("ALTER TABLE t ADD v INT64;");
105
- + assertQuery("CHECKPOINT;");
106
- + assertHeaderPagesConsistent("t");
107
- +
108
- + ASSERT_NO_THROW(reopen());
109
- + auto result = conn->query("MATCH (n:t) RETURN count(*);");
110
- + ASSERT_TRUE(result->isSuccess()) << result->toString();
111
- + EXPECT_EQ(TestHelper::convertResultToString(*result), std::vector<std::string>{"0"});
112
- + assertHeaderPagesConsistent("t");
113
- +}
114
- +
115
- +TEST_F(PKIndexCheckpointTest, InsertAfterEmptyStringPKCheckpoint) {
116
- + if (inMemMode) {
117
- + GTEST_SKIP();
118
- + }
119
- + assertQuery("CREATE NODE TABLE t(id STRING PRIMARY KEY);");
120
- + assertQuery("ALTER TABLE t ADD v INT64;");
121
- + assertQuery("CHECKPOINT;");
122
- + assertQuery("CREATE (:t {id: 'a-key-longer-than-twelve-bytes', v: 1});");
123
- + assertQuery("CREATE (:t {id: 'short', v: 2});");
124
- + assertQuery("CHECKPOINT;");
125
- + assertHeaderPagesConsistent("t");
126
- +
127
- + ASSERT_NO_THROW(reopen());
128
- + auto result = conn->query("MATCH (n:t) WHERE n.id = 'a-key-longer-than-twelve-bytes' "
129
- + "RETURN n.v;");
130
- + ASSERT_TRUE(result->isSuccess()) << result->toString();
131
- + EXPECT_EQ(TestHelper::convertResultToString(*result), std::vector<std::string>{"1"});
132
- + result = conn->query("MATCH (n:t) WHERE n.id = 'short' RETURN n.v;");
133
- + ASSERT_TRUE(result->isSuccess()) << result->toString();
134
- + EXPECT_EQ(TestHelper::convertResultToString(*result), std::vector<std::string>{"2"});
135
- + // The primary key must still reject duplicates after reopen.
136
- + result = conn->query("CREATE (:t {id: 'a-key-longer-than-twelve-bytes', v: 3});");
137
- + EXPECT_FALSE(result->isSuccess());
138
- + const auto& info = getPKStorageInfo("t");
139
- + EXPECT_NE(info.firstHeaderPage, INVALID_PAGE_IDX);
140
- + EXPECT_NE(info.overflowHeaderPage, INVALID_PAGE_IDX);
141
- +}
142
- +
143
- +} // namespace testing
144
- +} // namespace lbug
1
+ diff --git a/src/storage/index/hash_index.cpp b/src/storage/index/hash_index.cpp
2
+ index b65b3da86..2e952966e 100644
3
+ --- a/src/storage/index/hash_index.cpp
4
+ +++ b/src/storage/index/hash_index.cpp
5
+ @@ -770,13 +770,15 @@ void PrimaryKeyIndex::checkpoint(main::ClientContext*, storage::PageAllocator& p
6
+ indexChanged = true;
7
+ }
8
+ }
9
+ + // Assign both header pages under one condition: the constructor rejects an overflow
10
+ + // header page without index header pages.
11
+ if (indexChanged) {
12
+ writeHeaders(pageAllocator);
13
+ hashIndexDiskArrays->checkpoint(getDiskArrayFirstHeaderPage(), pageAllocator);
14
+ - }
15
+ - if (overflowFile) {
16
+ - overflowFile->checkpoint(pageAllocator);
17
+ - updateOverflowHeaderPageIfNeeded(storageInfo.get(), overflowFile.get());
18
+ + if (overflowFile) {
19
+ + overflowFile->checkpoint(pageAllocator);
20
+ + updateOverflowHeaderPageIfNeeded(storageInfo.get(), overflowFile.get());
21
+ + }
22
+ }
23
+ // Make sure that changes which bypassed the WAL are written.
24
+ // There is no other mechanism for enforcing that they are flushed
25
+ diff --git a/test/storage/CMakeLists.txt b/test/storage/CMakeLists.txt
26
+ index 581979387..3cabd5c2b 100644
27
+ --- a/test/storage/CMakeLists.txt
28
+ +++ b/test/storage/CMakeLists.txt
29
+ @@ -3,6 +3,7 @@ add_lbug_test(compression_test compression_test.cpp compress_chunk_test.cpp)
30
+ add_lbug_test(alp_exception_chunk_test alp_exception_chunk_test.cpp)
31
+ add_lbug_test(column_chunk_metadata_test column_chunk_metadata_test.cpp)
32
+ add_lbug_test(local_hash_index_test local_hash_index_test.cpp)
33
+ +add_lbug_test(pk_index_checkpoint_test pk_index_checkpoint_test.cpp)
34
+ add_lbug_test(disk_array_collection_test disk_array_collection_test.cpp)
35
+ add_lbug_test(buffer_manager_test buffer_manager_test.cpp)
36
+ add_lbug_test(rel_tests rel_scan_test.cpp rel_delete_test.cpp)
37
+ diff --git a/test/storage/pk_index_checkpoint_test.cpp b/test/storage/pk_index_checkpoint_test.cpp
38
+ new file mode 100644
39
+ index 000000000..1e577c45f
40
+ --- /dev/null
41
+ +++ b/test/storage/pk_index_checkpoint_test.cpp
42
+ @@ -0,0 +1,102 @@
43
+ +#include "catalog/catalog.h"
44
+ +#include "catalog/catalog_entry/node_table_catalog_entry.h"
45
+ +#include "graph_test/private_graph_test.h"
46
+ +#include "storage/index/hash_index.h"
47
+ +#include "storage/storage_manager.h"
48
+ +#include "storage/table/node_table.h"
49
+ +#include "test_helper/test_helper.h"
50
+ +#include "transaction/transaction.h"
51
+ +
52
+ +using namespace lbug::common;
53
+ +using namespace lbug::catalog;
54
+ +using namespace lbug::storage;
55
+ +using namespace lbug::transaction;
56
+ +
57
+ +namespace lbug {
58
+ +namespace testing {
59
+ +
60
+ +// Regression tests for #464: checkpointing an empty STRING primary-key index must not persist an
61
+ +// overflow header page without the index header pages, which the constructor rejects on reopen.
62
+ +class PKIndexCheckpointTest : public EmptyDBTest {
63
+ +protected:
64
+ + void SetUp() override {
65
+ + EmptyDBTest::SetUp();
66
+ + createDBAndConn();
67
+ + }
68
+ +
69
+ + void assertQuery(const std::string& query) const {
70
+ + auto result = conn->query(query);
71
+ + ASSERT_TRUE(result->isSuccess()) << query << ": " << result->toString();
72
+ + }
73
+ +
74
+ + const PrimaryKeyIndexStorageInfo& getPKStorageInfo(const std::string& tableName) const {
75
+ + auto* entry = database->getCatalog()
76
+ + ->getTableCatalogEntry(&DUMMY_CHECKPOINT_TRANSACTION, tableName)
77
+ + ->ptrCast<NodeTableCatalogEntry>();
78
+ + auto& nodeTable =
79
+ + database->getStorageManager()->getTable(entry->getTableID())->cast<NodeTable>();
80
+ + return nodeTable.getPKIndex()->getStorageInfo().constCast<PrimaryKeyIndexStorageInfo>();
81
+ + }
82
+ +
83
+ + // Both header pointers are assigned together, so an unset index header page implies an unset
84
+ + // overflow header page.
85
+ + void assertHeaderPagesConsistent(const std::string& tableName) const {
86
+ + const auto& info = getPKStorageInfo(tableName);
87
+ + if (info.firstHeaderPage == INVALID_PAGE_IDX) {
88
+ + EXPECT_EQ(info.overflowHeaderPage, INVALID_PAGE_IDX)
89
+ + << "overflow header page persisted without index header pages";
90
+ + }
91
+ + }
92
+ +
93
+ + void reopen() {
94
+ + conn.reset();
95
+ + createDBAndConn();
96
+ + }
97
+ +};
98
+ +
99
+ +TEST_F(PKIndexCheckpointTest, EmptyStringPKCheckpointAfterAlter) {
100
+ + if (inMemMode) {
101
+ + GTEST_SKIP();
102
+ + }
103
+ + assertQuery("CREATE NODE TABLE t(id STRING PRIMARY KEY);");
104
+ + assertQuery("ALTER TABLE t ADD v INT64;");
105
+ + assertQuery("CHECKPOINT;");
106
+ + assertHeaderPagesConsistent("t");
107
+ +
108
+ + ASSERT_NO_THROW(reopen());
109
+ + auto result = conn->query("MATCH (n:t) RETURN count(*);");
110
+ + ASSERT_TRUE(result->isSuccess()) << result->toString();
111
+ + EXPECT_EQ(TestHelper::convertResultToString(*result), std::vector<std::string>{"0"});
112
+ + assertHeaderPagesConsistent("t");
113
+ +}
114
+ +
115
+ +TEST_F(PKIndexCheckpointTest, InsertAfterEmptyStringPKCheckpoint) {
116
+ + if (inMemMode) {
117
+ + GTEST_SKIP();
118
+ + }
119
+ + assertQuery("CREATE NODE TABLE t(id STRING PRIMARY KEY);");
120
+ + assertQuery("ALTER TABLE t ADD v INT64;");
121
+ + assertQuery("CHECKPOINT;");
122
+ + assertQuery("CREATE (:t {id: 'a-key-longer-than-twelve-bytes', v: 1});");
123
+ + assertQuery("CREATE (:t {id: 'short', v: 2});");
124
+ + assertQuery("CHECKPOINT;");
125
+ + assertHeaderPagesConsistent("t");
126
+ +
127
+ + ASSERT_NO_THROW(reopen());
128
+ + auto result = conn->query("MATCH (n:t) WHERE n.id = 'a-key-longer-than-twelve-bytes' "
129
+ + "RETURN n.v;");
130
+ + ASSERT_TRUE(result->isSuccess()) << result->toString();
131
+ + EXPECT_EQ(TestHelper::convertResultToString(*result), std::vector<std::string>{"1"});
132
+ + result = conn->query("MATCH (n:t) WHERE n.id = 'short' RETURN n.v;");
133
+ + ASSERT_TRUE(result->isSuccess()) << result->toString();
134
+ + EXPECT_EQ(TestHelper::convertResultToString(*result), std::vector<std::string>{"2"});
135
+ + // The primary key must still reject duplicates after reopen.
136
+ + result = conn->query("CREATE (:t {id: 'a-key-longer-than-twelve-bytes', v: 3});");
137
+ + EXPECT_FALSE(result->isSuccess());
138
+ + const auto& info = getPKStorageInfo("t");
139
+ + EXPECT_NE(info.firstHeaderPage, INVALID_PAGE_IDX);
140
+ + EXPECT_NE(info.overflowHeaderPage, INVALID_PAGE_IDX);
141
+ +}
142
+ +
143
+ +} // namespace testing
144
+ +} // namespace lbug
@@ -1,86 +1,86 @@
1
- @@ -290,6 +290,12 @@ NodeGroupScanResult CSRNodeGroup::scanCommittedInMemSequential(const Transaction
2
- const ChunkedNodeGroup* chunkedGroup = nullptr;
3
- {
4
- const auto lock = chunkedGroups.lock();
5
- + // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel) can yield an
6
- + // out-of-range chunk group index. Guard against it instead of dereferencing
7
- + // a null/out-of-bounds group. See LadybugDB/ladybug#611.
8
- + if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
9
- + return NODE_GROUP_SCAN_EMPTY_RESULT;
10
- + }
11
- chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
12
- }
13
- chunkedGroup->scan(transaction, tableState, nodeGroupScanState, startRowInChunk, numRows);
14
- @@ -315,8 +321,15 @@ NodeGroupScanResult CSRNodeGroup::scanCommittedInMemRandom(const Transaction* tr
15
- auto [chunkIdx, rowInChunk] =
16
- StorageUtils::getQuotientRemainder(rowIdx, StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
17
- if (chunkIdx != currentChunkIdx) {
18
- - currentChunkIdx = chunkIdx;
19
- const auto lock = chunkedGroups.lock();
20
- + // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel) can yield an
21
- + // out-of-range chunk group index. Skip such rows instead of dereferencing
22
- + // a null/out-of-bounds group. See LadybugDB/ladybug#611.
23
- + if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
24
- + nextRow++;
25
- + continue;
26
- + }
27
- + currentChunkIdx = chunkIdx;
28
- chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
29
- }
30
- DASSERT(chunkedGroup);
31
- @@ -409,6 +422,11 @@ void CSRNodeGroup::update(const Transaction* transaction, CSRNodeGroupScanSource
32
- auto [chunkIdx, rowInChunk] = StorageUtils::getQuotientRemainder(rowIdxInGroup,
33
- StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
34
- const auto lock = chunkedGroups.lock();
35
- + // A stale CSR index entry can yield an out-of-range chunk group index; treat
36
- + // the update as a no-op in that case. See LadybugDB/ladybug#611.
37
- + if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
38
- + return;
39
- + }
40
- const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
41
- return chunkedGroup->update(transaction, rowInChunk, columnID, propertyVector);
42
- }
43
- @@ -431,6 +449,11 @@ bool CSRNodeGroup::delete_(const Transaction* transaction, CSRNodeGroupScanSourc
44
- auto [chunkIdx, rowInChunk] = StorageUtils::getQuotientRemainder(rowIdxInGroup,
45
- StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
46
- const auto lock = chunkedGroups.lock();
47
- + // A stale CSR index entry can yield an out-of-range chunk group index; treat
48
- + // the delete as a no-op in that case. See LadybugDB/ladybug#611.
49
- + if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
50
- + return false;
51
- + }
52
- const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
53
- return chunkedGroup->delete_(transaction, rowInChunk);
54
- }
55
- @@ -913,6 +936,15 @@ void CSRNodeGroup::collectInMemRegionChangesAndUpdateHeaderLength(const UniqLock
56
- const auto row = rows[i];
57
- auto [chunkIdx, rowInChunk] = StorageUtils::getQuotientRemainder(row,
58
- StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
59
- + // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel from a
60
- + // prior checkpoint pass) can yield an out-of-range chunk group index.
61
- + // Treat it as already deleted and skip. See LadybugDB/ladybug#611.
62
- + if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
63
- + csrIndex->indices[nodeOffset].turnToNonSequential();
64
- + csrIndex->indices[nodeOffset].setInvalid(i);
65
- + numInMemDeletionsInCSR++;
66
- + continue;
67
- + }
68
- const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
69
- if (chunkedGroup->isDeleted(txn, rowInChunk)) {
70
- csrIndex->indices[nodeOffset].turnToNonSequential();
71
- @@ -1117,6 +1149,15 @@ void CSRNodeGroup::populateCSRLengthInMemOnly(const UniqLock& lock, offset_t num
72
- const auto row = rows[i];
73
- auto [chunkIdx, rowInChunk] =
74
- StorageUtils::getQuotientRemainder(row, StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
75
- + // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel from a prior
76
- + // checkpoint pass) can yield an out-of-range chunk group index. Treat it
77
- + // as already deleted. See LadybugDB/ladybug#611.
78
- + if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
79
- + csrIndex->indices[offset].turnToNonSequential();
80
- + csrIndex->indices[offset].setInvalid(i);
81
- + lengthAfterDelete--;
82
- + continue;
83
- + }
84
- const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
85
- const auto isDeleted = chunkedGroup->isDeleted(txn, rowInChunk);
86
- if (isDeleted) {
1
+ @@ -290,6 +290,12 @@ NodeGroupScanResult CSRNodeGroup::scanCommittedInMemSequential(const Transaction
2
+ const ChunkedNodeGroup* chunkedGroup = nullptr;
3
+ {
4
+ const auto lock = chunkedGroups.lock();
5
+ + // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel) can yield an
6
+ + // out-of-range chunk group index. Guard against it instead of dereferencing
7
+ + // a null/out-of-bounds group. See LadybugDB/ladybug#611.
8
+ + if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
9
+ + return NODE_GROUP_SCAN_EMPTY_RESULT;
10
+ + }
11
+ chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
12
+ }
13
+ chunkedGroup->scan(transaction, tableState, nodeGroupScanState, startRowInChunk, numRows);
14
+ @@ -315,8 +321,15 @@ NodeGroupScanResult CSRNodeGroup::scanCommittedInMemRandom(const Transaction* tr
15
+ auto [chunkIdx, rowInChunk] =
16
+ StorageUtils::getQuotientRemainder(rowIdx, StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
17
+ if (chunkIdx != currentChunkIdx) {
18
+ - currentChunkIdx = chunkIdx;
19
+ const auto lock = chunkedGroups.lock();
20
+ + // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel) can yield an
21
+ + // out-of-range chunk group index. Skip such rows instead of dereferencing
22
+ + // a null/out-of-bounds group. See LadybugDB/ladybug#611.
23
+ + if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
24
+ + nextRow++;
25
+ + continue;
26
+ + }
27
+ + currentChunkIdx = chunkIdx;
28
+ chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
29
+ }
30
+ DASSERT(chunkedGroup);
31
+ @@ -409,6 +422,11 @@ void CSRNodeGroup::update(const Transaction* transaction, CSRNodeGroupScanSource
32
+ auto [chunkIdx, rowInChunk] = StorageUtils::getQuotientRemainder(rowIdxInGroup,
33
+ StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
34
+ const auto lock = chunkedGroups.lock();
35
+ + // A stale CSR index entry can yield an out-of-range chunk group index; treat
36
+ + // the update as a no-op in that case. See LadybugDB/ladybug#611.
37
+ + if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
38
+ + return;
39
+ + }
40
+ const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
41
+ return chunkedGroup->update(transaction, rowInChunk, columnID, propertyVector);
42
+ }
43
+ @@ -431,6 +449,11 @@ bool CSRNodeGroup::delete_(const Transaction* transaction, CSRNodeGroupScanSourc
44
+ auto [chunkIdx, rowInChunk] = StorageUtils::getQuotientRemainder(rowIdxInGroup,
45
+ StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
46
+ const auto lock = chunkedGroups.lock();
47
+ + // A stale CSR index entry can yield an out-of-range chunk group index; treat
48
+ + // the delete as a no-op in that case. See LadybugDB/ladybug#611.
49
+ + if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
50
+ + return false;
51
+ + }
52
+ const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
53
+ return chunkedGroup->delete_(transaction, rowInChunk);
54
+ }
55
+ @@ -913,6 +936,15 @@ void CSRNodeGroup::collectInMemRegionChangesAndUpdateHeaderLength(const UniqLock
56
+ const auto row = rows[i];
57
+ auto [chunkIdx, rowInChunk] = StorageUtils::getQuotientRemainder(row,
58
+ StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
59
+ + // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel from a
60
+ + // prior checkpoint pass) can yield an out-of-range chunk group index.
61
+ + // Treat it as already deleted and skip. See LadybugDB/ladybug#611.
62
+ + if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
63
+ + csrIndex->indices[nodeOffset].turnToNonSequential();
64
+ + csrIndex->indices[nodeOffset].setInvalid(i);
65
+ + numInMemDeletionsInCSR++;
66
+ + continue;
67
+ + }
68
+ const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
69
+ if (chunkedGroup->isDeleted(txn, rowInChunk)) {
70
+ csrIndex->indices[nodeOffset].turnToNonSequential();
71
+ @@ -1117,6 +1149,15 @@ void CSRNodeGroup::populateCSRLengthInMemOnly(const UniqLock& lock, offset_t num
72
+ const auto row = rows[i];
73
+ auto [chunkIdx, rowInChunk] =
74
+ StorageUtils::getQuotientRemainder(row, StorageConfig::CHUNKED_NODE_GROUP_CAPACITY);
75
+ + // A stale CSR index entry (e.g. an INVALID_ROW_IDX sentinel from a prior
76
+ + // checkpoint pass) can yield an out-of-range chunk group index. Treat it
77
+ + // as already deleted. See LadybugDB/ladybug#611.
78
+ + if (chunkIdx >= chunkedGroups.getNumGroups(lock)) {
79
+ + csrIndex->indices[offset].turnToNonSequential();
80
+ + csrIndex->indices[offset].setInvalid(i);
81
+ + lengthAfterDelete--;
82
+ + continue;
83
+ + }
84
+ const auto chunkedGroup = chunkedGroups.getGroup(lock, chunkIdx);
85
+ const auto isDeleted = chunkedGroup->isDeleted(txn, rowInChunk);
86
+ if (isDeleted) {
@@ -1,17 +1,17 @@
1
- $episodeStart = @{
2
- task_id = 'SESSION_ansuz-prompt-1785056865691'
3
- scope = 'Bifrost adapter invariant, dispatch routing symmetry'
4
- agent_role = 'ansuz'
5
- agent_skill = 'session-observer'
6
- projectPath = 'C:\Users\user\Documents\GitHub\KenazAI'
7
- } | ConvertTo-Json
8
-
9
- $response = Invoke-WebRequest -Uri 'http://127.0.0.1:18080/api/hippocampus/episode_start' `
10
- -Method POST `
11
- -ContentType 'application/json' `
12
- -Body $episodeStart `
13
- -ErrorAction Stop
14
-
15
- $episode = $response.Content | ConvertFrom-Json
16
- Write-Output "Episode created: $($episode.episode_id)"
17
- $episode.episode_id
1
+ $episodeStart = @{
2
+ task_id = 'SESSION_ansuz-prompt-1785056865691'
3
+ scope = 'Bifrost adapter invariant, dispatch routing symmetry'
4
+ agent_role = 'ansuz'
5
+ agent_skill = 'session-observer'
6
+ projectPath = 'C:\Users\user\Documents\GitHub\KenazAI'
7
+ } | ConvertTo-Json
8
+
9
+ $response = Invoke-WebRequest -Uri 'http://127.0.0.1:18080/api/hippocampus/episode_start' `
10
+ -Method POST `
11
+ -ContentType 'application/json' `
12
+ -Body $episodeStart `
13
+ -ErrorAction Stop
14
+
15
+ $episode = $response.Content | ConvertFrom-Json
16
+ Write-Output "Episode created: $($episode.episode_id)"
17
+ $episode.episode_id
@@ -1 +1 @@
1
- {"last_seen_max_id":2368}
1
+ {"last_seen_max_id":2144}
@@ -1 +1 @@
1
- {"566fcb6b-3fdb-4c39-801c-824eaeeadfbc":{"files":["feedback_heredoc_template_literal_escapes.md","feedback_never_cd_into_agent_worktrees.md","feedback_rust_merge_restarts_live_dashboard.md","feedback_eprintln_not_in_backend_log.md","feedback_msys_pathconv_mangles_rev_path.md","reference_dashboard_release_procedure.md","feedback_next_cache_after_frontend_deletions.md","feedback_never_truncate_tsc_output.md","feedback_cargo_feature_change_verify_tauri_dev.md","reference_worktree_rust_verify_recipe.md","feedback_agent_tool_worktree_collision.md","feedback_mark_landed_after_scoped_merge.md","feedback_worktree_remove_junction_empties_main.md","feedback_no_concurrent_next_build_vs_live_dev.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse memory & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness"],"lastFiredAtMs":1791567819597},"t-mg":{"files":["feedback_rust_merge_restarts_live_dashboard.md"],"areas":[],"lastFiredAtMs":1791544419180}}
1
+ {"28d36a7a-fcf1-488c-a1ed-d794ac52615f":{"files":["reference_worktree_rust_verify_recipe.md","feedback_mcp_default_project_drift.md","feedback_mark_landed_after_scoped_merge.md","feedback_heredoc_template_literal_escapes.md","reference_dashboard_release_procedure.md"],"lastFiredAtMs":1790248806590,"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge"]},"30cd222d-1a83-4617-a267-65ce8ec74a3e":{"files":["feedback_mcp_default_project_drift.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790249042951},"a0067f0e-60c1-4713-bdcb-8a34cd5205fd":{"files":["feedback_heredoc_template_literal_escapes.md","feedback_mcp_default_project_drift.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790259958980},"ee35d32d-321b-47e3-8a30-a8e096995cdd":{"files":["reference_worktree_rust_verify_recipe.md","feedback_never_cd_into_agent_worktrees.md","feedback_agent_tool_worktree_collision.md","feedback_mark_landed_after_scoped_merge.md","feedback_heredoc_template_literal_escapes.md","feedback_mcp_default_project_drift.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness"],"lastFiredAtMs":1790276539381},"1531340e-bf07-4bd6-909c-f22394d60876":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process"],"lastFiredAtMs":1790279018827},"73e6ee82-700b-4cbf-b002-c0b9b79dbab4":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process"],"lastFiredAtMs":1790365961440},"0722c428-a54f-47dc-9c1c-e12c1199dfe3":{"files":["feedback_never_cd_into_agent_worktrees.md","feedback_heredoc_template_literal_escapes.md","feedback_mark_landed_after_scoped_merge.md","feedback_agent_tool_worktree_collision.md","rune_synapse_incremental_index_blind_gap.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process"],"lastFiredAtMs":1790418630509},"f17d4fd3-7d6c-4e5e-9369-2b72a9266f90":{"files":["feedback_never_cd_into_agent_worktrees.md","feedback_heredoc_template_literal_escapes.md","rune_synapse_incremental_index_blind_gap.md","reference_dashboard_release_procedure.md","feedback_scoped_checkout_clobbers_worktree_state.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release"],"lastFiredAtMs":1790457931617},"6794bd6e-562a-4b58-a746-b5bdcaca0e7c":{"files":["feedback_mark_landed_after_scoped_merge.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge"],"lastFiredAtMs":1790455100260},"75239ce3-f0a2-4792-81f5-d842d132528f":{"files":["feedback_never_cd_into_agent_worktrees.md","feedback_mark_landed_after_scoped_merge.md","feedback_agent_tool_worktree_collision.md","feedback_heredoc_template_literal_escapes.md","reference_dashboard_release_procedure.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release"],"lastFiredAtMs":1790507402115},"804ea3d7-3de3-4586-b955-e6c8c684ff15":{"files":["feedback_heredoc_template_literal_escapes.md","feedback_never_cd_into_agent_worktrees.md","feedback_mcp_default_project_drift.md","feedback_mark_landed_after_scoped_merge.md","reference_worktree_rust_verify_recipe.md","reference_dashboard_release_procedure.md","feedback_agent_tool_worktree_collision.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness"],"lastFiredAtMs":1790581324936},"3e9b8a3f-882d-45d4-bbe5-a258b2bb3ce4":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790542391812},"3e15f2bf-f80a-4e4d-8960-bcd1a640fdff":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790543837477},"61843060-69da-46a7-b86f-e5a0b342cea8":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790581238348},"5b87c0bf-873f-4d27-a261-fbde5ea03299":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790619871099},"9c6a266c-9db4-4810-a341-5ffcd1de8726":{"files":["reference_dashboard_release_procedure.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790621819503},"12bd9885-66a8-4c0c-9811-0b327d551fc0":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790629466743},"bb010604-4dca-4993-9de0-aecb4754ad8e":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790666206918},"4b12601f-6069-452b-a58c-bf8263400324":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790666901610},"4df219ec-ba5e-4f76-97c5-a43137f300de":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release"],"lastFiredAtMs":1790713272079},"3eecd2fc-56d7-4ee8-9a4f-2290da3fd123":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790718864114},"a806aaa3-3eaa-46bf-a9f2-f30cfa33acaa":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":[],"lastFiredAtMs":1790786463472},"c699f823-b467-4f50-ab73-e7351250a897":{"files":["reference_dashboard_release_procedure.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release"],"lastFiredAtMs":1790790894539},"2a1ccb2b-e66f-4b3a-a4e6-2ec48622defe":{"files":["rune_synapse_incremental_index_blind_gap.md","feedback_mcp_default_project_drift.md","reference_worktree_rust_verify_recipe.md","feedback_never_cd_into_agent_worktrees.md","feedback_heredoc_template_literal_escapes.md","feedback_agent_tool_worktree_collision.md","feedback_mark_landed_after_scoped_merge.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Yggdrasil, Alaya, relay & products","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Tauri, Rust build & release","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Ansuz cognition & process","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Hooks & Claude Code harness"],"lastFiredAtMs":1790868373263},"9782d641-82fa-4c35-acf6-97758550adbb":{"files":["feedback_heredoc_template_literal_escapes.md"],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall","C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Worktree, dispatch & merge"],"lastFiredAtMs":1790806751702},"cd5fc5ea-1d77-4c15-8b09-3bcb5da02559":{"files":[],"areas":["C:\\Users\\user\\.claude\\projects\\c--Users-user-Documents-GitHub-KenazAI\\memory\\KNOWLEDGE.md::Synapse, KuzuDB & recall"],"lastFiredAtMs":1790863308920}}