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
@@ -48,10 +48,8 @@ collaboration:
48
48
  - 根據 acceptance_criteria 驗證成果
49
49
  # TASK_1819: 此處原有的 worktree_path_rule 欄位已移除 — 它是死欄位,
50
50
  # prompt.js 的 appendWorkflow 只讀 step/run/note/actions,從未渲染它,
51
- # 且其範例路徑早已過時。實際生效的 worktree 路徑規則由 runner.js 在
52
- # spawn 時注入(spawnClaude/spawnBifrost 的 "[WORKTREE] All file
53
- # operations MUST use paths under: <worktreeDir>" 前綴,含具體路徑),
54
- # Agent-tool 派工另由 prompt.js SUBAGENT_PREFIX 規則 11 覆蓋。
51
+ # 且其範例路徑早已過時。實際生效的 worktree 路徑規則由
52
+ # prompt.js SUBAGENT_PREFIX 規則 11 覆蓋(原 runner.js 注入已隨 headless 路徑移除)。
55
53
 
56
54
  # 注意(TASK_1819):下方 run 的 git add -A 只會在隔離模式(worktree /
57
55
  # subagent)原樣渲染;serial 共用工作樹模式下 prompt.js appendWorkflow
@@ -1,163 +1,163 @@
1
- diff --git a/src/include/storage/file_handle.h b/src/include/storage/file_handle.h
2
- index bff124907..ec9cf3e6a 100644
3
- --- a/src/include/storage/file_handle.h
4
- +++ b/src/include/storage/file_handle.h
5
- @@ -104,6 +104,9 @@ class FileHandle {
6
- common::page_idx_t getNumPages() const { return numPages; }
7
- common::FileInfo* getFileInfo() const { return fileInfo.get(); }
8
- void resetFileInfo() { fileInfo.reset(); }
9
- + void setFileInfo(std::unique_ptr<common::FileInfo> fileInfo_) {
10
- + fileInfo = std::move(fileInfo_);
11
- + }
12
-
13
- uint64_t getPageSize() const {
14
- return isLargePaged() ? common::TEMP_PAGE_SIZE : common::LBUG_PAGE_SIZE;
15
- diff --git a/src/storage/file_handle.cpp b/src/storage/file_handle.cpp
16
- index 5f141f805..ae4f4f327 100644
17
- --- a/src/storage/file_handle.cpp
18
- +++ b/src/storage/file_handle.cpp
19
- @@ -72,6 +72,10 @@ page_idx_t FileHandle::addNewPages(page_idx_t numNewPages) {
20
- page_idx_t FileHandle::addNewPageWithoutLock() {
21
- if (numPages == pageCapacity) {
22
- addNewPageGroupWithoutLock();
23
- + } else if (numPages >= static_cast<page_idx_t>(pageStates.size())) {
24
- + // Reusing retained capacity after a truncate: re-expose the already-allocated slots.
25
- + // ConcurrentVector::resize never deallocates, so this is cheap and leak-free.
26
- + pageStates.resize(pageCapacity);
27
- }
28
- pageStates[numPages].resetToEvicted();
29
- const auto pageIdx = numPages++;
30
- @@ -133,14 +137,13 @@ void FileHandle::removePageIdxAndTruncateIfNecessary(page_idx_t pageIdx) {
31
- return;
32
- }
33
- numPages = pageIdx;
34
- - pageStates.resize(numPages);
35
- - const auto numPageGroups = getNumPageGroups();
36
- - if (numPageGroups == frameGroupIdxes.size()) {
37
- - return;
38
- + // Keep frameGroupIdxes and pageCapacity at their high-water mark so truncated page groups
39
- + // reuse their already-allocated VM frame groups when the file grows again. Shrinking them
40
- + // here permanently leaks a VMRegion frame group per truncated page group
41
- + // (VMRegion::addNewFrameGroup only grows up to max_db_size).
42
- + if (pageStates.size() > numPages) {
43
- + pageStates.resize(numPages);
44
- }
45
- - DASSERT(numPageGroups < frameGroupIdxes.size());
46
- - frameGroupIdxes.resize(numPageGroups);
47
- - pageCapacity = numPageGroups * StorageConstants::PAGE_GROUP_SIZE;
48
- }
49
-
50
- void FileHandle::removePageFromFrameIfNecessary(page_idx_t pageIdx) {
51
- diff --git a/src/storage/shadow_file.cpp b/src/storage/shadow_file.cpp
52
- index eaac734ab..9811166c6 100644
53
- --- a/src/storage/shadow_file.cpp
54
- +++ b/src/storage/shadow_file.cpp
55
- @@ -191,31 +191,62 @@ void ShadowFile::flushAll(main::ClientContext& context) const {
56
-
57
- void ShadowFile::clear(BufferManager& bm) {
58
- DASSERT(shadowingFH);
59
- - // TODO(Guodong): We should remove shadow file here. This requires changes:
60
- - // 1. We need to make shadow file not going through BM.
61
- - // 2. We need to remove fileHandles held in BM, so that BM only keeps FH for the data file.
62
- + // Evict pages, truncate to zero pages (which also truncates the on-disk file), then unlink
63
- + // the path and drop the stale fd so no leftover .shadow file exists at rest (a present
64
- + // .shadow is treated as "checkpoint in progress" by recovery/startup probes). The
65
- + // retained FileHandle keeps its VM frame groups (see reset()); the file is re-created
66
- + // lazily by getOrCreateShadowingFH on the next checkpoint, which also re-reserves the
67
- + // header page.
68
- bm.removeFilePagesFromFrames(*shadowingFH);
69
- shadowingFH->resetToZeroPagesAndPageCapacity();
70
- + shadowingFH->resetFileInfo();
71
- + vfs->removeFileIfExists(shadowFilePath);
72
- shadowPagesMap.clear();
73
- shadowPageRecords.clear();
74
- - // Reserve header page.
75
- - shadowingFH->addNewPage();
76
- }
77
-
78
- void ShadowFile::reset() {
79
- - shadowingFH->resetFileInfo();
80
- - shadowingFH = nullptr;
81
- - vfs->removeFileIfExists(shadowFilePath);
82
- + // Keep the shadowing FileHandle (and its VM frame groups) alive across checkpoints:
83
- + // each FileHandle allocates VMRegion frame groups that count against max_db_size and
84
- + // are never reclaimed, so orphaning the handle here exhausted max_db_size after a
85
- + // handful of checkpoints (see #924). Evict pages, truncate to zero pages (which also
86
- + // truncates the on-disk file), drop the stale fd, and unlink the path so
87
- + // recovery/startup probes — which treat a present .shadow file as "checkpoint in
88
- + // progress" — don't trip on it. getOrCreateShadowingFH re-opens the path into the
89
- + // same retained handle on the next checkpoint, so subsequent shadow pages land in a
90
- + // real on-disk file visible to recovery (which replays by path).
91
- + if (shadowingFH == nullptr) {
92
- + return;
93
- + }
94
- + // If clear() already ran (the normal checkpoint flow calls both), the file was truncated,
95
- + // unlinked and the fd dropped; just make sure the in-memory maps are empty.
96
- + if (shadowingFH->getFileInfo() != nullptr) {
97
- + bm.removeFilePagesFromFrames(*shadowingFH);
98
- + shadowingFH->resetToZeroPagesAndPageCapacity();
99
- + shadowingFH->resetFileInfo();
100
- + vfs->removeFileIfExists(shadowFilePath);
101
- + }
102
- + shadowPagesMap.clear();
103
- + shadowPageRecords.clear();
104
- }
105
-
106
- FileHandle* ShadowFile::getOrCreateShadowingFH() {
107
- if (!shadowingFH) {
108
- shadowingFH = bm.getFileHandle(shadowFilePath,
109
- FileHandle::O_PERSISTENT_FILE_CREATE_NOT_EXISTS, vfs, nullptr);
110
- - if (shadowingFH->getNumPages() == 0) {
111
- - // Reserve the first page for the header.
112
- - shadowingFH->addNewPage();
113
- - }
114
- + } else if (shadowingFH->getFileInfo() == nullptr) {
115
- + // reset() unlinked the on-disk file and dropped the stale fd (which pointed at the
116
- + // unlinked inode): re-open the same retained FileHandle in place so its identity
117
- + // (fileIndex, frame groups) is preserved and no new VM accounting is consumed.
118
- + // Matches constructPersistentFileHandle's flags for O_PERSISTENT_FILE_CREATE_NOT_EXISTS.
119
- + shadowingFH->setFileInfo(vfs->openFile(shadowFilePath,
120
- + FileOpenFlags(
121
- + FileFlags::WRITE | FileFlags::READ_ONLY | FileFlags::CREATE_IF_NOT_EXISTS),
122
- + nullptr));
123
- + }
124
- + if (shadowingFH->getNumPages() == 0) {
125
- + // Reserve the first page for the header.
126
- + shadowingFH->addNewPage();
127
- }
128
- return shadowingFH;
129
- }
130
- diff --git a/test/api/system_config_test.cpp b/test/api/system_config_test.cpp
131
- index 638b0a685..e398ddc4b 100644
132
- --- a/test/api/system_config_test.cpp
133
- +++ b/test/api/system_config_test.cpp
134
- @@ -101,6 +101,29 @@ TEST_F(SystemConfigTest, testMaxDBSize) {
135
- }
136
- }
137
-
138
- +TEST_F(SystemConfigTest, testRepeatedCheckpointsDoNotExhaustMaxDBSize) {
139
- + // Regression test for https://github.com/LadybugDB/ladybug/issues/924: each CHECKPOINT
140
- + // used to permanently consume ~1 VM frame group of max_db_size accounting (the shadowing
141
- + // FileHandle was orphaned on every checkpoint), so ~7 checkpoints exhausted a 64 MiB cap.
142
- + if (databasePath == "" || databasePath == ":memory:") {
143
- + GTEST_SKIP();
144
- + }
145
- + systemConfig->maxDBSize = 64 * 1024 * 1024;
146
- + auto db = std::make_unique<Database>(databasePath, *systemConfig);
147
- + auto con = std::make_unique<Connection>(db.get());
148
- + assertQuery(*con->query("CREATE NODE TABLE Node(id STRING, payload STRING, PRIMARY KEY(id))"));
149
- + for (auto i = 0; i < 50; ++i) {
150
- + auto res = con->query("MERGE (n:Node {id: 'node-" + std::to_string(i % 10) +
151
- + "'}) ON CREATE SET n.payload = 'x' ON MATCH SET n.payload = 'x'");
152
- + ASSERT_TRUE(res->isSuccess()) << res->toString();
153
- + auto checkpoint = con->query("CHECKPOINT");
154
- + ASSERT_TRUE(checkpoint->isSuccess()) << checkpoint->toString();
155
- + }
156
- + auto count = con->query("MATCH (n:Node) RETURN COUNT(*)");
157
- + ASSERT_TRUE(count->isSuccess()) << count->toString();
158
- + ASSERT_EQ(TestHelper::convertResultToString(*count), std::vector<std::string>{"10"});
159
- +}
160
- +
161
- TEST_F(SystemConfigTest, testBufferPoolSize) {
162
- systemConfig->bufferPoolSize = 1024;
163
- try {
1
+ diff --git a/src/include/storage/file_handle.h b/src/include/storage/file_handle.h
2
+ index bff124907..ec9cf3e6a 100644
3
+ --- a/src/include/storage/file_handle.h
4
+ +++ b/src/include/storage/file_handle.h
5
+ @@ -104,6 +104,9 @@ class FileHandle {
6
+ common::page_idx_t getNumPages() const { return numPages; }
7
+ common::FileInfo* getFileInfo() const { return fileInfo.get(); }
8
+ void resetFileInfo() { fileInfo.reset(); }
9
+ + void setFileInfo(std::unique_ptr<common::FileInfo> fileInfo_) {
10
+ + fileInfo = std::move(fileInfo_);
11
+ + }
12
+
13
+ uint64_t getPageSize() const {
14
+ return isLargePaged() ? common::TEMP_PAGE_SIZE : common::LBUG_PAGE_SIZE;
15
+ diff --git a/src/storage/file_handle.cpp b/src/storage/file_handle.cpp
16
+ index 5f141f805..ae4f4f327 100644
17
+ --- a/src/storage/file_handle.cpp
18
+ +++ b/src/storage/file_handle.cpp
19
+ @@ -72,6 +72,10 @@ page_idx_t FileHandle::addNewPages(page_idx_t numNewPages) {
20
+ page_idx_t FileHandle::addNewPageWithoutLock() {
21
+ if (numPages == pageCapacity) {
22
+ addNewPageGroupWithoutLock();
23
+ + } else if (numPages >= static_cast<page_idx_t>(pageStates.size())) {
24
+ + // Reusing retained capacity after a truncate: re-expose the already-allocated slots.
25
+ + // ConcurrentVector::resize never deallocates, so this is cheap and leak-free.
26
+ + pageStates.resize(pageCapacity);
27
+ }
28
+ pageStates[numPages].resetToEvicted();
29
+ const auto pageIdx = numPages++;
30
+ @@ -133,14 +137,13 @@ void FileHandle::removePageIdxAndTruncateIfNecessary(page_idx_t pageIdx) {
31
+ return;
32
+ }
33
+ numPages = pageIdx;
34
+ - pageStates.resize(numPages);
35
+ - const auto numPageGroups = getNumPageGroups();
36
+ - if (numPageGroups == frameGroupIdxes.size()) {
37
+ - return;
38
+ + // Keep frameGroupIdxes and pageCapacity at their high-water mark so truncated page groups
39
+ + // reuse their already-allocated VM frame groups when the file grows again. Shrinking them
40
+ + // here permanently leaks a VMRegion frame group per truncated page group
41
+ + // (VMRegion::addNewFrameGroup only grows up to max_db_size).
42
+ + if (pageStates.size() > numPages) {
43
+ + pageStates.resize(numPages);
44
+ }
45
+ - DASSERT(numPageGroups < frameGroupIdxes.size());
46
+ - frameGroupIdxes.resize(numPageGroups);
47
+ - pageCapacity = numPageGroups * StorageConstants::PAGE_GROUP_SIZE;
48
+ }
49
+
50
+ void FileHandle::removePageFromFrameIfNecessary(page_idx_t pageIdx) {
51
+ diff --git a/src/storage/shadow_file.cpp b/src/storage/shadow_file.cpp
52
+ index eaac734ab..9811166c6 100644
53
+ --- a/src/storage/shadow_file.cpp
54
+ +++ b/src/storage/shadow_file.cpp
55
+ @@ -191,31 +191,62 @@ void ShadowFile::flushAll(main::ClientContext& context) const {
56
+
57
+ void ShadowFile::clear(BufferManager& bm) {
58
+ DASSERT(shadowingFH);
59
+ - // TODO(Guodong): We should remove shadow file here. This requires changes:
60
+ - // 1. We need to make shadow file not going through BM.
61
+ - // 2. We need to remove fileHandles held in BM, so that BM only keeps FH for the data file.
62
+ + // Evict pages, truncate to zero pages (which also truncates the on-disk file), then unlink
63
+ + // the path and drop the stale fd so no leftover .shadow file exists at rest (a present
64
+ + // .shadow is treated as "checkpoint in progress" by recovery/startup probes). The
65
+ + // retained FileHandle keeps its VM frame groups (see reset()); the file is re-created
66
+ + // lazily by getOrCreateShadowingFH on the next checkpoint, which also re-reserves the
67
+ + // header page.
68
+ bm.removeFilePagesFromFrames(*shadowingFH);
69
+ shadowingFH->resetToZeroPagesAndPageCapacity();
70
+ + shadowingFH->resetFileInfo();
71
+ + vfs->removeFileIfExists(shadowFilePath);
72
+ shadowPagesMap.clear();
73
+ shadowPageRecords.clear();
74
+ - // Reserve header page.
75
+ - shadowingFH->addNewPage();
76
+ }
77
+
78
+ void ShadowFile::reset() {
79
+ - shadowingFH->resetFileInfo();
80
+ - shadowingFH = nullptr;
81
+ - vfs->removeFileIfExists(shadowFilePath);
82
+ + // Keep the shadowing FileHandle (and its VM frame groups) alive across checkpoints:
83
+ + // each FileHandle allocates VMRegion frame groups that count against max_db_size and
84
+ + // are never reclaimed, so orphaning the handle here exhausted max_db_size after a
85
+ + // handful of checkpoints (see #924). Evict pages, truncate to zero pages (which also
86
+ + // truncates the on-disk file), drop the stale fd, and unlink the path so
87
+ + // recovery/startup probes — which treat a present .shadow file as "checkpoint in
88
+ + // progress" — don't trip on it. getOrCreateShadowingFH re-opens the path into the
89
+ + // same retained handle on the next checkpoint, so subsequent shadow pages land in a
90
+ + // real on-disk file visible to recovery (which replays by path).
91
+ + if (shadowingFH == nullptr) {
92
+ + return;
93
+ + }
94
+ + // If clear() already ran (the normal checkpoint flow calls both), the file was truncated,
95
+ + // unlinked and the fd dropped; just make sure the in-memory maps are empty.
96
+ + if (shadowingFH->getFileInfo() != nullptr) {
97
+ + bm.removeFilePagesFromFrames(*shadowingFH);
98
+ + shadowingFH->resetToZeroPagesAndPageCapacity();
99
+ + shadowingFH->resetFileInfo();
100
+ + vfs->removeFileIfExists(shadowFilePath);
101
+ + }
102
+ + shadowPagesMap.clear();
103
+ + shadowPageRecords.clear();
104
+ }
105
+
106
+ FileHandle* ShadowFile::getOrCreateShadowingFH() {
107
+ if (!shadowingFH) {
108
+ shadowingFH = bm.getFileHandle(shadowFilePath,
109
+ FileHandle::O_PERSISTENT_FILE_CREATE_NOT_EXISTS, vfs, nullptr);
110
+ - if (shadowingFH->getNumPages() == 0) {
111
+ - // Reserve the first page for the header.
112
+ - shadowingFH->addNewPage();
113
+ - }
114
+ + } else if (shadowingFH->getFileInfo() == nullptr) {
115
+ + // reset() unlinked the on-disk file and dropped the stale fd (which pointed at the
116
+ + // unlinked inode): re-open the same retained FileHandle in place so its identity
117
+ + // (fileIndex, frame groups) is preserved and no new VM accounting is consumed.
118
+ + // Matches constructPersistentFileHandle's flags for O_PERSISTENT_FILE_CREATE_NOT_EXISTS.
119
+ + shadowingFH->setFileInfo(vfs->openFile(shadowFilePath,
120
+ + FileOpenFlags(
121
+ + FileFlags::WRITE | FileFlags::READ_ONLY | FileFlags::CREATE_IF_NOT_EXISTS),
122
+ + nullptr));
123
+ + }
124
+ + if (shadowingFH->getNumPages() == 0) {
125
+ + // Reserve the first page for the header.
126
+ + shadowingFH->addNewPage();
127
+ }
128
+ return shadowingFH;
129
+ }
130
+ diff --git a/test/api/system_config_test.cpp b/test/api/system_config_test.cpp
131
+ index 638b0a685..e398ddc4b 100644
132
+ --- a/test/api/system_config_test.cpp
133
+ +++ b/test/api/system_config_test.cpp
134
+ @@ -101,6 +101,29 @@ TEST_F(SystemConfigTest, testMaxDBSize) {
135
+ }
136
+ }
137
+
138
+ +TEST_F(SystemConfigTest, testRepeatedCheckpointsDoNotExhaustMaxDBSize) {
139
+ + // Regression test for https://github.com/LadybugDB/ladybug/issues/924: each CHECKPOINT
140
+ + // used to permanently consume ~1 VM frame group of max_db_size accounting (the shadowing
141
+ + // FileHandle was orphaned on every checkpoint), so ~7 checkpoints exhausted a 64 MiB cap.
142
+ + if (databasePath == "" || databasePath == ":memory:") {
143
+ + GTEST_SKIP();
144
+ + }
145
+ + systemConfig->maxDBSize = 64 * 1024 * 1024;
146
+ + auto db = std::make_unique<Database>(databasePath, *systemConfig);
147
+ + auto con = std::make_unique<Connection>(db.get());
148
+ + assertQuery(*con->query("CREATE NODE TABLE Node(id STRING, payload STRING, PRIMARY KEY(id))"));
149
+ + for (auto i = 0; i < 50; ++i) {
150
+ + auto res = con->query("MERGE (n:Node {id: 'node-" + std::to_string(i % 10) +
151
+ + "'}) ON CREATE SET n.payload = 'x' ON MATCH SET n.payload = 'x'");
152
+ + ASSERT_TRUE(res->isSuccess()) << res->toString();
153
+ + auto checkpoint = con->query("CHECKPOINT");
154
+ + ASSERT_TRUE(checkpoint->isSuccess()) << checkpoint->toString();
155
+ + }
156
+ + auto count = con->query("MATCH (n:Node) RETURN COUNT(*)");
157
+ + ASSERT_TRUE(count->isSuccess()) << count->toString();
158
+ + ASSERT_EQ(TestHelper::convertResultToString(*count), std::vector<std::string>{"10"});
159
+ +}
160
+ +
161
+ TEST_F(SystemConfigTest, testBufferPoolSize) {
162
+ systemConfig->bufferPoolSize = 1024;
163
+ try {