kenaz 0.3.1 → 0.3.3

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 (395) 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 +19 -30
  4. package/core/.claude/hooks/_ansuz-conversation.js +1 -0
  5. package/core/.claude/hooks/_ansuz-conversation.test.js +6 -0
  6. package/core/.claude/hooks/_run-user-prompt.js +0 -4
  7. package/core/.claude/hooks/_run-user-prompt.test.js +2 -3
  8. package/core/.claude/hooks/session-init.ps1 +49 -49
  9. package/core/.claude/settings.json +0 -37
  10. package/core/.claude/skills/ui-ux-pro-max/data/charts.csv +26 -26
  11. package/core/.claude/skills/ui-ux-pro-max/data/colors.csv +97 -97
  12. package/core/.claude/skills/ui-ux-pro-max/data/icons.csv +101 -101
  13. package/core/.claude/skills/ui-ux-pro-max/data/landing.csv +31 -31
  14. package/core/.claude/skills/ui-ux-pro-max/data/products.csv +96 -96
  15. package/core/.claude/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  16. package/core/.claude/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  17. package/core/.claude/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  18. package/core/.claude/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  19. package/core/.claude/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  20. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  21. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  22. package/core/.claude/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  23. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  24. package/core/.claude/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  25. package/core/.claude/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  26. package/core/.claude/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  27. package/core/.claude/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  28. package/core/.claude/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  29. package/core/.claude/skills/ui-ux-pro-max/data/styles.csv +68 -68
  30. package/core/.claude/skills/ui-ux-pro-max/data/typography.csv +57 -57
  31. package/core/.claude/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  32. package/core/.claude/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  33. package/core/.claude/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  34. package/core/.claude/skills/ui-ux-pro-max/scripts/core.py +253 -253
  35. package/core/.claude/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  36. package/core/.claude/skills/ui-ux-pro-max/scripts/search.py +106 -106
  37. package/core/.collaboration/core/task-api.js +3 -8
  38. package/core/.formation/bifrost/codex-doctor.js +1 -0
  39. package/core/.formation/bifrost/setup-codex.js +14 -5
  40. package/core/.formation/bifrost/setup-codex.test.js +20 -0
  41. package/core/.formation/tests/hello.txt +2 -2
  42. package/core/.formation/tools/prompt.js +58 -5
  43. package/core/.formation/tools/prompt.test.js +29 -0
  44. package/core/.kenaz/claude-hooks-manifest.json +16 -16
  45. package/core/.kenaz/knowledge/ladybug_2c51da1e_shadow_file_frame_group.patch +163 -163
  46. package/core/.kenaz/knowledge/ladybug_30cf85690e_shadow_page_read_during_checkpoint.patch +393 -393
  47. package/core/.kenaz/knowledge/ladybug_7a17858d3a_node_group_delete_lock.patch +102 -102
  48. package/core/.kenaz/knowledge/ladybug_926a0ba1_column_checkpoint.patch +412 -412
  49. package/core/.kenaz/knowledge/ladybug_a346c4c4b6_pk_index_header_pages.patch +144 -144
  50. package/core/.kenaz/knowledge/ladybug_ba5f38815b_csr_node_group.patch +86 -86
  51. package/core/.kenaz/muninn_episode_write.ps1 +17 -17
  52. package/core/.kenaz/specialist/field_report_watermark.json +1 -1
  53. package/core/.kenaz/specialist/memory_guard_fired.json +1 -1
  54. package/core/.kenaz/specialist/memory_guard_trigger_cache.json +1 -1
  55. package/core/.kenaz/specialist/t1777_probe.txt +1 -1
  56. package/core/.matrix/index.matrix +5 -5
  57. package/core/.specialist/Ansuz/RULES.md +6 -10
  58. package/core/.specialist/tools/__tests__/task-2218-boot-session-id.test.js +17 -1
  59. package/core/.specialist/tools/__tests__/task-2222-session-identity-interleave.test.js +17 -1
  60. package/core/.specialist/tools/__tests__/task-2254-handoff-archive-contract.test.js +6 -5
  61. package/core/.specialist/tools/ansuz-boot-fast.js +44 -100
  62. package/core/.specialist/tools/ansuz-boot-fast.test.js +45 -1
  63. package/core/KENAZ_CORE_VERSION +1 -1
  64. package/core/dev/ANSUZ_STARTUP_INJECTION_REVIEW.md +355 -355
  65. package/core/dev/JEV_INTEGRATION_PLAN.md +189 -189
  66. package/core/dev/design/matrix_format_EXAMPLE_memory.matrix +13 -13
  67. package/core/dev/design/matrix_format_EXAMPLE_project_status.matrix +9 -9
  68. package/core/dev/design/matrix_format_EXAMPLE_tasks.matrix +14 -14
  69. package/core/dev/design/matrix_v2_EXAMPLE.matrix +67 -67
  70. package/core/dev/jev-eval/ACTIVE_CORRECTION.md +52 -52
  71. package/core/dev/jev-eval/CONTEXT_REVIEW.md +31 -31
  72. package/core/dev/jev-eval/EVALUATION_STATUS.md +39 -39
  73. package/core/dev/jev-eval/HISTORICAL_CORPUS.md +33 -33
  74. package/core/dev/jev-eval/README.md +99 -99
  75. package/core/dev/jev-eval/THALAMUS_RANKING.md +58 -58
  76. package/core/dev/jev-eval/reports/annotation-pilot-2026-09-20.json +32 -32
  77. package/core/dev/jev-eval/reports/context-review-2026-09-20.json +48 -48
  78. package/core/dev/jev-eval/reports/history-corpus-2026-09-20.json +52 -52
  79. package/core/dev/pipeline/SELF_ENHANCEMENT_STATUS.json.bak +47 -47
  80. package/core/dev/pipeline/tasks/.gitkeep +1 -1
  81. package/core/dev/pipeline/test_results/TASK_TEST_PARALLEL_002_result.txt +27 -27
  82. package/core/dev/plans/ANSUZ_SLIM_PLAN.md +68 -0
  83. package/core/dev/scripts/init_git.sh +0 -0
  84. package/core/dev/scripts/init_project.sh +0 -0
  85. package/core/dev/scripts/legacy/dev_agent_scheduler.ps1.bak +536 -536
  86. package/core/dev/scripts/legacy/multi_agent_scheduler.ps1.bak +1978 -1978
  87. package/core/dev/scripts/matrix/src/cli/commands/list-tags.ts.wip +140 -140
  88. package/core/dev/scripts/matrix/src/cli/commands/manage-tags.ts.wip +173 -173
  89. package/core/dev/scripts/matrix/src/cli/commands/stats.ts.wip +168 -168
  90. package/core/dev/scripts/matrix/src/cli/commands/tokens.ts.wip +126 -126
  91. package/core/dev/scripts/multi_agent_scheduler.sh +0 -0
  92. package/core/dev/scripts/run_once.sh +0 -0
  93. package/core/dev/scripts/setup_mcp.sh +0 -0
  94. package/core/dev/scripts/setup_rag.sh +0 -0
  95. package/core/dev/scripts/start_dev_agent.sh +0 -0
  96. package/core/dev/scripts/start_multi_agent.sh +0 -0
  97. package/core/dev/scripts/sync_task_queue.sh +0 -0
  98. package/core/k-cli/dist/alaya/run.js +91 -0
  99. package/core/k-cli/dist/core/output.js +24 -0
  100. package/core/k-cli/dist/core/process.js +38 -0
  101. package/core/k-cli/dist/core/project.js +80 -0
  102. package/core/k-cli/dist/core/spawn.js +268 -0
  103. package/core/k-cli/dist/core/types.js +2 -0
  104. package/core/k-cli/dist/dashboard/update.js +53 -0
  105. package/core/k-cli/dist/dashboard/version.js +20 -0
  106. package/core/k-cli/dist/dispatch/run.js +241 -0
  107. package/core/k-cli/dist/dispatch/status.js +103 -0
  108. package/core/k-cli/dist/index.js +283 -0
  109. package/core/k-cli/dist/project/initialize.js +301 -0
  110. package/core/k-cli/dist/project/install.js +89 -0
  111. package/core/k-cli/dist/project/status.js +138 -0
  112. package/core/k-cli/dist/specialist/list.js +100 -0
  113. package/core/k-cli/dist/specialist/run.js +93 -0
  114. package/core/k-cli/dist/task/create.js +194 -0
  115. package/core/k-cli/dist/task/delete.js +98 -0
  116. package/core/k-cli/dist/task/get.js +55 -0
  117. package/core/k-cli/dist/task/list.js +58 -0
  118. package/core/k-cli/dist/task/submit.js +156 -0
  119. package/core/k-cli/dist/ygg/run.js +51 -0
  120. package/core/k-cli/node_modules/.bin/yaml +16 -0
  121. package/core/k-cli/node_modules/.bin/yaml.cmd +17 -0
  122. package/core/k-cli/node_modules/.bin/yaml.ps1 +28 -0
  123. package/core/k-cli/node_modules/.package-lock.json +23 -0
  124. package/core/k-cli/node_modules/yaml/LICENSE +13 -0
  125. package/core/k-cli/node_modules/yaml/README.md +172 -0
  126. package/core/k-cli/node_modules/yaml/bin.mjs +11 -0
  127. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
  128. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
  129. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
  130. package/core/k-cli/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
  131. package/core/k-cli/node_modules/yaml/browser/dist/compose/composer.js +217 -0
  132. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
  133. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
  134. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
  135. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
  136. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
  137. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +223 -0
  138. package/core/k-cli/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
  139. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
  140. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
  141. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
  142. package/core/k-cli/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
  143. package/core/k-cli/node_modules/yaml/browser/dist/doc/Document.js +335 -0
  144. package/core/k-cli/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
  145. package/core/k-cli/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
  146. package/core/k-cli/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
  147. package/core/k-cli/node_modules/yaml/browser/dist/doc/directives.js +176 -0
  148. package/core/k-cli/node_modules/yaml/browser/dist/errors.js +57 -0
  149. package/core/k-cli/node_modules/yaml/browser/dist/index.js +17 -0
  150. package/core/k-cli/node_modules/yaml/browser/dist/log.js +11 -0
  151. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Alias.js +114 -0
  152. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
  153. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
  154. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
  155. package/core/k-cli/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
  156. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
  157. package/core/k-cli/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
  158. package/core/k-cli/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
  159. package/core/k-cli/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
  160. package/core/k-cli/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
  161. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
  162. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
  163. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
  164. package/core/k-cli/node_modules/yaml/browser/dist/parse/cst.js +98 -0
  165. package/core/k-cli/node_modules/yaml/browser/dist/parse/lexer.js +717 -0
  166. package/core/k-cli/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
  167. package/core/k-cli/node_modules/yaml/browser/dist/parse/parser.js +967 -0
  168. package/core/k-cli/node_modules/yaml/browser/dist/public-api.js +102 -0
  169. package/core/k-cli/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
  170. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
  171. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
  172. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
  173. package/core/k-cli/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
  174. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
  175. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
  176. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
  177. package/core/k-cli/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
  178. package/core/k-cli/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
  179. package/core/k-cli/node_modules/yaml/browser/dist/schema/tags.js +96 -0
  180. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
  181. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
  182. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
  183. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
  184. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +64 -0
  185. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
  186. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
  187. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
  188. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
  189. package/core/k-cli/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
  190. package/core/k-cli/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
  191. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
  192. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
  193. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
  194. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
  195. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +24 -0
  196. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
  197. package/core/k-cli/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
  198. package/core/k-cli/node_modules/yaml/browser/dist/util.js +11 -0
  199. package/core/k-cli/node_modules/yaml/browser/dist/visit.js +233 -0
  200. package/core/k-cli/node_modules/yaml/browser/index.js +5 -0
  201. package/core/k-cli/node_modules/yaml/browser/package.json +3 -0
  202. package/core/k-cli/node_modules/yaml/dist/cli.d.ts +8 -0
  203. package/core/k-cli/node_modules/yaml/dist/cli.mjs +201 -0
  204. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
  205. package/core/k-cli/node_modules/yaml/dist/compose/compose-collection.js +90 -0
  206. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
  207. package/core/k-cli/node_modules/yaml/dist/compose/compose-doc.js +45 -0
  208. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
  209. package/core/k-cli/node_modules/yaml/dist/compose/compose-node.js +112 -0
  210. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
  211. package/core/k-cli/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
  212. package/core/k-cli/node_modules/yaml/dist/compose/composer.d.ts +63 -0
  213. package/core/k-cli/node_modules/yaml/dist/compose/composer.js +222 -0
  214. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
  215. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
  216. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
  217. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
  218. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
  219. package/core/k-cli/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
  220. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
  221. package/core/k-cli/node_modules/yaml/dist/compose/resolve-end.js +39 -0
  222. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
  223. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
  224. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
  225. package/core/k-cli/node_modules/yaml/dist/compose/resolve-flow-scalar.js +225 -0
  226. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
  227. package/core/k-cli/node_modules/yaml/dist/compose/resolve-props.js +148 -0
  228. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
  229. package/core/k-cli/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
  230. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
  231. package/core/k-cli/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
  232. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
  233. package/core/k-cli/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
  234. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
  235. package/core/k-cli/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
  236. package/core/k-cli/node_modules/yaml/dist/doc/Document.d.ts +141 -0
  237. package/core/k-cli/node_modules/yaml/dist/doc/Document.js +337 -0
  238. package/core/k-cli/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
  239. package/core/k-cli/node_modules/yaml/dist/doc/anchors.js +76 -0
  240. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
  241. package/core/k-cli/node_modules/yaml/dist/doc/applyReviver.js +57 -0
  242. package/core/k-cli/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
  243. package/core/k-cli/node_modules/yaml/dist/doc/createNode.js +90 -0
  244. package/core/k-cli/node_modules/yaml/dist/doc/directives.d.ts +49 -0
  245. package/core/k-cli/node_modules/yaml/dist/doc/directives.js +178 -0
  246. package/core/k-cli/node_modules/yaml/dist/errors.d.ts +21 -0
  247. package/core/k-cli/node_modules/yaml/dist/errors.js +62 -0
  248. package/core/k-cli/node_modules/yaml/dist/index.d.ts +25 -0
  249. package/core/k-cli/node_modules/yaml/dist/index.js +50 -0
  250. package/core/k-cli/node_modules/yaml/dist/log.d.ts +3 -0
  251. package/core/k-cli/node_modules/yaml/dist/log.js +19 -0
  252. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
  253. package/core/k-cli/node_modules/yaml/dist/nodes/Alias.js +116 -0
  254. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
  255. package/core/k-cli/node_modules/yaml/dist/nodes/Collection.js +151 -0
  256. package/core/k-cli/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
  257. package/core/k-cli/node_modules/yaml/dist/nodes/Node.js +40 -0
  258. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
  259. package/core/k-cli/node_modules/yaml/dist/nodes/Pair.js +39 -0
  260. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.d.ts +43 -0
  261. package/core/k-cli/node_modules/yaml/dist/nodes/Scalar.js +27 -0
  262. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
  263. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
  264. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
  265. package/core/k-cli/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
  266. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
  267. package/core/k-cli/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
  268. package/core/k-cli/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
  269. package/core/k-cli/node_modules/yaml/dist/nodes/identity.js +53 -0
  270. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
  271. package/core/k-cli/node_modules/yaml/dist/nodes/toJS.js +39 -0
  272. package/core/k-cli/node_modules/yaml/dist/options.d.ts +350 -0
  273. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
  274. package/core/k-cli/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
  275. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
  276. package/core/k-cli/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
  277. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
  278. package/core/k-cli/node_modules/yaml/dist/parse/cst-visit.js +99 -0
  279. package/core/k-cli/node_modules/yaml/dist/parse/cst.d.ts +109 -0
  280. package/core/k-cli/node_modules/yaml/dist/parse/cst.js +112 -0
  281. package/core/k-cli/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
  282. package/core/k-cli/node_modules/yaml/dist/parse/lexer.js +719 -0
  283. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
  284. package/core/k-cli/node_modules/yaml/dist/parse/line-counter.js +41 -0
  285. package/core/k-cli/node_modules/yaml/dist/parse/parser.d.ts +84 -0
  286. package/core/k-cli/node_modules/yaml/dist/parse/parser.js +972 -0
  287. package/core/k-cli/node_modules/yaml/dist/public-api.d.ts +44 -0
  288. package/core/k-cli/node_modules/yaml/dist/public-api.js +107 -0
  289. package/core/k-cli/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
  290. package/core/k-cli/node_modules/yaml/dist/schema/Schema.js +39 -0
  291. package/core/k-cli/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
  292. package/core/k-cli/node_modules/yaml/dist/schema/common/map.js +19 -0
  293. package/core/k-cli/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
  294. package/core/k-cli/node_modules/yaml/dist/schema/common/null.js +17 -0
  295. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
  296. package/core/k-cli/node_modules/yaml/dist/schema/common/seq.js +19 -0
  297. package/core/k-cli/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
  298. package/core/k-cli/node_modules/yaml/dist/schema/common/string.js +16 -0
  299. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
  300. package/core/k-cli/node_modules/yaml/dist/schema/core/bool.js +21 -0
  301. package/core/k-cli/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
  302. package/core/k-cli/node_modules/yaml/dist/schema/core/float.js +47 -0
  303. package/core/k-cli/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
  304. package/core/k-cli/node_modules/yaml/dist/schema/core/int.js +42 -0
  305. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
  306. package/core/k-cli/node_modules/yaml/dist/schema/core/schema.js +25 -0
  307. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
  308. package/core/k-cli/node_modules/yaml/dist/schema/json/schema.js +64 -0
  309. package/core/k-cli/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
  310. package/core/k-cli/node_modules/yaml/dist/schema/tags.d.ts +48 -0
  311. package/core/k-cli/node_modules/yaml/dist/schema/tags.js +99 -0
  312. package/core/k-cli/node_modules/yaml/dist/schema/types.d.ts +92 -0
  313. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
  314. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
  315. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
  316. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
  317. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
  318. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
  319. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
  320. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
  321. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
  322. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/merge.js +68 -0
  323. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
  324. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
  325. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
  326. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
  327. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
  328. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
  329. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
  330. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
  331. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
  332. package/core/k-cli/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
  333. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
  334. package/core/k-cli/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
  335. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
  336. package/core/k-cli/node_modules/yaml/dist/stringify/stringify.js +132 -0
  337. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
  338. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
  339. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
  340. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
  341. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
  342. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
  343. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
  344. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyNumber.js +26 -0
  345. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
  346. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
  347. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
  348. package/core/k-cli/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
  349. package/core/k-cli/node_modules/yaml/dist/test-events.d.ts +4 -0
  350. package/core/k-cli/node_modules/yaml/dist/test-events.js +134 -0
  351. package/core/k-cli/node_modules/yaml/dist/util.d.ts +16 -0
  352. package/core/k-cli/node_modules/yaml/dist/util.js +28 -0
  353. package/core/k-cli/node_modules/yaml/dist/visit.d.ts +102 -0
  354. package/core/k-cli/node_modules/yaml/dist/visit.js +236 -0
  355. package/core/k-cli/node_modules/yaml/package.json +97 -0
  356. package/core/k-cli/node_modules/yaml/util.js +2 -0
  357. package/core/plugins/kenaz/commands/Ansuz.md +19 -30
  358. package/core/plugins/kenaz/commands/kenaz.md +1 -1
  359. package/core/plugins/kenaz/hooks/hooks.json +1 -5
  360. package/core/plugins/kenaz/hooks/kenaz-hook.js +0 -4
  361. package/core/plugins/kenaz/scripts/kenaz-mode.js +10 -4
  362. package/core/plugins/kenaz/scripts/kenaz.test.js +1 -1
  363. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/charts.csv +26 -26
  364. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/colors.csv +97 -97
  365. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/icons.csv +101 -101
  366. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/landing.csv +31 -31
  367. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/products.csv +96 -96
  368. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/react-performance.csv +45 -45
  369. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/astro.csv +54 -54
  370. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/flutter.csv +53 -53
  371. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -56
  372. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -53
  373. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nextjs.csv +53 -53
  374. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -51
  375. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -59
  376. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react-native.csv +52 -52
  377. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/react.csv +54 -54
  378. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/shadcn.csv +61 -61
  379. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/svelte.csv +54 -54
  380. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/swiftui.csv +51 -51
  381. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/stacks/vue.csv +50 -50
  382. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/styles.csv +68 -68
  383. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/typography.csv +57 -57
  384. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ui-reasoning.csv +101 -101
  385. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/ux-guidelines.csv +99 -99
  386. package/core/plugins/kenaz/skills/ui-ux-pro-max/data/web-interface.csv +31 -31
  387. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/core.py +253 -253
  388. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/design_system.py +1067 -1067
  389. package/core/plugins/kenaz/skills/ui-ux-pro-max/scripts/search.py +106 -106
  390. package/lib/cli.js +50 -3
  391. package/lib/cli.test.js +35 -0
  392. package/lib/dashboard.js +10 -0
  393. package/package.json +6 -6
  394. package/core/.specialist/tools/__tests__/task-1863-boot-lease-reuse.test.js +0 -99
  395. package/core/.specialist/tools/__tests__/task-1977-banner-cap.test.js +0 -129
@@ -55,6 +55,21 @@ const check = (name, cond, detail) => {
55
55
  cond ? pass++ : fail++;
56
56
  };
57
57
 
58
+ // TASK_2381: boot only adopts a hint that names THIS session (a transcript for that id under this
59
+ // cwd's ~/.claude/projects dir) and prefers CLAUDE_CODE_SESSION_ID. Tests run inside Claude Code,
60
+ // so the child gets a sandbox HOME and no inherited session id.
61
+ function sandboxHome(sandbox) { return path.join(sandbox, '_home'); }
62
+ function ownTranscript(sandbox, id) {
63
+ const dir = path.join(sandboxHome(sandbox), '.claude', 'projects', path.resolve(sandbox).replace(/[^a-zA-Z0-9]/g, '-'));
64
+ fs.mkdirSync(dir, { recursive: true });
65
+ fs.writeFileSync(path.join(dir, id + '.jsonl'), '');
66
+ }
67
+ function bootEnv(sandbox) {
68
+ const env = { ...process.env, CLAUDE_PROJECT_DIR: sandbox, HOME: sandboxHome(sandbox), USERPROFILE: sandboxHome(sandbox) };
69
+ delete env.CLAUDE_CODE_SESSION_ID;
70
+ return env;
71
+ }
72
+
58
73
  function freshSandbox(tag) {
59
74
  const dir = path.join(os.tmpdir(), 'kenaz_t2222_' + tag + '_' + process.pid);
60
75
  for (const d of [
@@ -78,10 +93,11 @@ function fireHook(sandbox, sessionId, transcriptPath) {
78
93
  timeout: 10000,
79
94
  });
80
95
  if (r.status !== 0) throw new Error('hook failed: ' + r.stderr);
96
+ ownTranscript(sandbox, sessionId); // the hooked session really exists in this cwd (TASK_2381 hint gate)
81
97
  }
82
98
 
83
99
  function boot(sandbox, extraArgs) {
84
- const env = { ...process.env, CLAUDE_PROJECT_DIR: sandbox };
100
+ const env = bootEnv(sandbox);
85
101
  return spawnSync(process.execPath, [
86
102
  BOOT,
87
103
  '--project-path=' + sandbox,
@@ -1,4 +1,4 @@
1
- // TASK_2254 -- boot archives every handoff slot (rename into handoff_archive/);
1
+ // TASK_2254 (amended TASK_2392: boot no longer archives; handoff is frozen) -- readLatestHandoff contract;
2
2
  // post-complete readLatestHandoff must still find the newest one afterwards.
3
3
  // Drives the REAL ansuz-boot-fast.js (subprocess) and the REAL exported
4
4
  // post-complete.readLatestHandoff against a temp project root.
@@ -31,17 +31,18 @@ function boot(sb) {
31
31
  { encoding: 'utf8', env: { ...process.env, CLAUDE_PROJECT_DIR: sb }, windowsHide: true, cwd: sb, timeout: 30000 });
32
32
  }
33
33
 
34
- test('boot archives slots, readLatestHandoff still finds the newest archived one', () => {
34
+ test('TASK_2392: boot no longer archives slots (handoff frozen); readLatestHandoff still finds the newest live one', () => {
35
35
  const sb = sandbox();
36
36
  try {
37
37
  slot(sb, 'a.json', 'OLD', '2026-10-01T00:00:00.000Z');
38
38
  slot(sb, 'b.json', 'NEWEST', '2026-10-03T00:00:00.000Z');
39
39
  slot(sb, 'c.json', 'MID', '2026-10-02T00:00:00.000Z');
40
40
  assert.strictEqual(readLatestHandoff(sb).isbar.situation.current_topic, 'NEWEST');
41
- boot(sb);
42
- assert.strictEqual(fs.readdirSync(path.join(sb, '.kenaz/specialist/handoffs')).length, 0);
41
+ const r = boot(sb);
42
+ assert.ok(!/Handoff/.test(r.stdout), 'banner must not print handoff lines: ' + r.stdout);
43
+ assert.strictEqual(fs.readdirSync(path.join(sb, '.kenaz/specialist/handoffs')).length, 3);
43
44
  const h = readLatestHandoff(sb);
44
- assert.ok(h, 'handoff lost after boot archived it');
45
+ assert.ok(h, 'handoff lost');
45
46
  assert.strictEqual(h.isbar.situation.current_topic, 'NEWEST');
46
47
  } finally { fs.rmSync(sb, { recursive: true, force: true }); }
47
48
  });
@@ -855,20 +855,50 @@ function isOutsideAnyProject(source, cwd, base) {
855
855
  return rel.startsWith('..') || path.isAbsolute(rel);
856
856
  }
857
857
 
858
+ // TASK_2392: pending peer mail for the banner. Read-only GET /api/peer/status (counts only, never
859
+ // bodies, nothing is marked delivered -- turn-context.js still does the real pull). Fail-open: [] when
860
+ // the Dashboard is down. statusJson is injectable for tests.
861
+ function formatPeerMailLines(status) {
862
+ if (!status || typeof status !== 'object') return [];
863
+ const out = [];
864
+ const n = Number(status.pending_count);
865
+ if (Number.isFinite(n) && n > 0) out.push('📨 Peer mail: ' + n + ' pending (delivered on your next prompt)');
866
+ try {
867
+ const { formatWaitingLines } = require(path.join(__dirname, '..', '..', '.claude', 'hooks', '_peer-waiting-line.js'));
868
+ for (const l of formatWaitingLines(status)) out.push(l);
869
+ } catch (_) { /* hook helper absent in this install layout */ }
870
+ return out;
871
+ }
872
+
873
+ function fetchPendingPeerLines(baseUrl, timeoutMs, projectDir) {
874
+ return new Promise(function (resolve) {
875
+ let root = projectDir;
876
+ try { root = require(path.join(__dirname, '..', '..', '.claude', 'hooks', '_peer-project-root.js')).resolvePeerProjectRoot(projectDir) || projectDir; } catch (_) {}
877
+ let url;
878
+ try { url = new URL('/api/peer/status?limit=1&projectPath=' + encodeURIComponent(root), baseUrl); } catch (_) { resolve([]); return; }
879
+ const req = http.request(
880
+ { hostname: url.hostname, port: url.port || 80, path: url.pathname + url.search, method: 'GET', timeout: timeoutMs },
881
+ function (res) {
882
+ let data = '';
883
+ res.on('data', function (d) { data += d; });
884
+ res.on('end', function () { try { resolve(formatPeerMailLines(JSON.parse(data))); } catch (_) { resolve([]); } });
885
+ },
886
+ );
887
+ req.on('timeout', function () { req.destroy(); resolve([]); });
888
+ req.on('error', function () { resolve([]); });
889
+ req.end();
890
+ });
891
+ }
892
+
858
893
  async function main() {
859
894
  if (isOutsideAnyProject(PIN_SOURCE, process.cwd(), BASE)) {
860
895
  process.stdout.write('ᚨ Ansuz: not inside a Kenaz project (cwd=' + process.cwd() + ').' + String.fromCharCode(10) +
861
896
  'cd into a project, or run /kenaz init to set this directory up.' + String.fromCharCode(10));
862
897
  return;
863
898
  }
864
- const tasks = countTasks();
865
- const handoff = loadAndArchiveHandoff();
866
- const multiHandoffs = loadMultiSlotHandoffs();
867
- const c = tasks.counts;
868
- const pct = Math.round(tasks.cancel_rate * 100);
869
-
870
- // TASK_1757: register own lease (side-effect; silent on failure)
871
- var slScript = resolveStreamLeaseScript();
899
+ // TASK_2392 (Ansuz slim step 3): the handoff archive, the stream lease registration, the Multi-Ansuz list,
900
+ // the ANOMALY block and the extra info lines are frozen. Their functions stay below and stay callable;
901
+ // only the call sites are gone. Banner = session id, pin, open cards, wishes, pending peer mail.
872
902
  // TASK_1764: derive stable conversation_id from transcript_path basename (stable across resume).
873
903
  // TASK_1863: --conversation-id= overrides the transcript-derived id (same injectable-seam
874
904
  // pattern as --mcp-base-url) so the lease-reuse behavior is testable in a sandbox
@@ -953,9 +983,6 @@ async function main() {
953
983
  }
954
984
  if (_txPath) _convId = path.basename(_txPath, '.jsonl');
955
985
  } catch (_ce) {}
956
- var ownSid = registerOwnLease(slScript, _convId);
957
- // Peer awareness: only computed if registration succeeded or slScript found
958
- var peerData = slScript ? getPeerAwareness(slScript, ownSid) : null;
959
986
 
960
987
  const lines = [];
961
988
  lines.push('═══ ᚨ Ansuz · 快速 Boot (gateless) ═══');
@@ -963,7 +990,7 @@ async function main() {
963
990
  // is a single global slot, so it mints a new ansuz-prompt-<ts> slot whenever that
964
991
  // pointer is missing or belongs to another session. Ansuz passes this id
965
992
  // explicitly as session_id instead (elixir HANDOFF mandate).
966
- if (_convId) lines.push('[session] conversation_id=' + _convId + ' (pass as session_id to ansuz_handoff_snapshot)');
993
+ if (_convId) lines.push('[session] conversation_id=' + _convId + '');
967
994
 
968
995
  // -- TASK_1702 R2: pin banner -------------------------------------------
969
996
  if (IS_PINNED) {
@@ -982,56 +1009,8 @@ async function main() {
982
1009
  }
983
1010
  }
984
1011
 
985
- // knowledge index
986
- const knowledge = readKnowledgeIndex(BASE, 10);
987
- if (knowledge.length > 0) {
988
- lines.push('[knowledge] ' + projName + ' .kenaz/knowledge/:');
989
- for (const k of knowledge) {
990
- lines.push(' ' + k.filename + (k.heading ? ' -- ' + k.heading : ''));
991
- }
992
- }
993
1012
  }
994
1013
 
995
- // TASK_1757: peer awareness banner (zero-noise when no peers)
996
- if (peerData && (peerData.peers.length > 0 || peerData.orphans.length > 0)) {
997
- lines.push('[Multi-Ansuz] Other sessions detected:');
998
- for (const peer of peerData.peers) {
999
- var ageMs = peerData.sl.heartbeatAgeMs(peer);
1000
- var ageSec = ageMs === Infinity ? 'inf' : Math.round(ageMs / 1000) + 's';
1001
- var tasks_s = (peer.claimed_tasks && peer.claimed_tasks.length) ? ' tasks=' + peer.claimed_tasks.join(',') : '';
1002
- var scope_s = (peer.scope_leases && peer.scope_leases.length) ? ' scope=' + peer.scope_leases.join(',') : '';
1003
- lines.push(' [live] ' + (peer.label || peer.session_id) + ' pid=' + peer.pid + ' heartbeat=' + ageSec + ' ago' + tasks_s + scope_s);
1004
- }
1005
- for (const orphan of peerData.orphans) {
1006
- var oAge = peerData.sl.heartbeatAgeMs(orphan);
1007
- // TASK_1791: classification basis is heartbeat freshness, NOT pid liveness -- the
1008
- // registered pid exits by design (lease-touch.js renews the heartbeat). Suggest
1009
- // targeted reap (reap --session-id): bulk `reap` only acts at >=24h heartbeat age.
1010
- // TASK_1792: stale threshold raised 45min -> 8h (stream-lease LIVENESS_THRESHOLD_MS,
1011
- // rendered dynamically below). Heartbeats only advance on UserPromptSubmit, so a live
1012
- // peer running long dispatch chains can idle for hours without a prompt; at 45min this
1013
- // banner printed an executable clear command against live sessions. Only leases idle
1014
- // beyond 8h -- far past any realistic no-prompt working stretch -- get a clear
1015
- // suggestion now. isSessionLive is also heartbeat-only since TASK_1792 (pid recycling
1016
- // made dead sessions probe live forever), so [stale] here == reapable, no dead zone.
1017
- var oAgeStr = peerData.sl.fmtAge ? peerData.sl.fmtAge(oAge) : (oAge === Infinity ? 'inf' : Math.round(oAge / 1000) + 's');
1018
- var oThrStr = (peerData.sl.fmtAge && peerData.sl.LIVENESS_THRESHOLD_MS) ? peerData.sl.fmtAge(peerData.sl.LIVENESS_THRESHOLD_MS) : '8.0h';
1019
- lines.push(' [stale] ' + (orphan.label || orphan.session_id) + ' last-heartbeat=' + oAgeStr + ' ago (no heartbeat within ' + oThrStr + ') -- clear: node .specialist/tools/stream-lease.js reap --session-id=' + orphan.session_id);
1020
- }
1021
- }
1022
- lines.push(
1023
- `📊 任務 — total ${tasks.total} | active ${c.active} | backlog ${c.backlog} | ` +
1024
- `blocked ${c.blocked} | done ${c.done} | cancelled ${c.cancel} (${pct}%)`,
1025
- );
1026
- if (tasks.cancel_rate >= 0.7 && tasks.total >= 50) {
1027
- lines.push(
1028
- `⚠️ ANOMALY: HIGH_CANCEL_RATE — ${pct}% of ${tasks.total} tasks cancelled (${c.cancel}/${tasks.total})`,
1029
- );
1030
- }
1031
- // TASK_2044: Cortex auto-sync failure (TASK_2048: global_memory.db only, meta_graph retired).
1032
- // Both omitted when healthy (zero-noise).
1033
- const cortexAnomaly = cortexSyncAnomalyLine();
1034
- if (cortexAnomaly) lines.push(cortexAnomaly);
1035
1014
  // TASK_1997 R4: open-wish count. mcpBase reuses the same override seam as
1036
1015
  // the --mcp-base-url= / KENAZ_MCP_BASE_URL seam.
1037
1016
  const mcpBase =
@@ -1042,47 +1021,10 @@ async function main() {
1042
1021
  // line above) so the query is scoped to the bound project when pinned.
1043
1022
  const wishesLine = formatWishesLine(await fetchOpenWishes(mcpBase, WISH_TIMEOUT_MS, IS_PINNED ? BASE : null));
1044
1023
  if (wishesLine) lines.push(wishesLine);
1045
- // TASK_2006 R4: field-report auto-triage banner (omitted when N=0).
1046
- const fieldReportLine = fieldReportBannerLine();
1047
- if (fieldReportLine) lines.push(fieldReportLine);
1048
- const heimdallLine = formatHeimdallTriageLine(countOpenNeedsTriageCards(resolveTasksDir(), { heimdall: true }));
1049
- if (heimdallLine) lines.push(heimdallLine);
1050
- const heimdallScanLine = formatHeimdallScanLine(countCommitsSinceHeimdallScan(BASE));
1051
- if (heimdallScanLine) lines.push(heimdallScanLine);
1052
1024
  for (const l of openCardLines()) lines.push(l);
1053
- if (handoff.loaded) {
1054
- const s = handoff.summary;
1055
- // TASK_1988 banner cut: topic + unfinished only. first_action is derived
1056
- // from the same commit line as topic ("Continue from: <topic>") and
1057
- // pending_decisions repeats the open task's title -- both were pure bytes.
1058
- lines.push(`📜 上一世 Handoff${handoff.archived ? ' (已歸檔)' : ''}: ${fmt(s.topic)}`);
1059
- if (s.unfinished) lines.push(` unfinished: ${fmt(s.unfinished)}`);
1060
- } else if (multiHandoffs.length === 0) {
1061
- // TASK_1837: "無" only when BOTH the (retired) legacy slot and the multi-slot
1062
- // directory are empty — previously this printed "上一世 Handoff: 無" from the
1063
- // legacy file alone and then listed N per-session slots right below it.
1064
- lines.push('📜 上一世 Handoff: 無');
1065
- }
1066
- // TASK_1757: multi-slot handoffs -- TASK_1977 R3: cap fan-out to at most
1067
- // HANDOFF_MAX_FULL_SLOTS full slots (newest first, topic-deduped); fold
1068
- // the rest into one summary line. All slots were already archived above
1069
- // regardless of this selection.
1070
- const handoffSelection = selectHandoffSlotsForBanner(multiHandoffs);
1071
- for (const mh of handoffSelection.printed) {
1072
- // TASK_1988: one line per slot (topic; unfinished when it adds something).
1073
- const unf = mh.unfinished && fmt(mh.unfinished) !== fmt(mh.topic) ? ' — unfinished: ' + fmt(mh.unfinished) : '';
1074
- lines.push(`📜 Handoff [${String(mh.slot_file).slice(0, 8)}]: ${fmt(mh.topic)}${unf}`);
1075
- }
1076
- if (handoffSelection.summaryLine) lines.push(`📜 ${handoffSelection.summaryLine}`);
1077
- // -- TASK_1742 advisory banner --
1078
- const adv = readHuginnAdvisory(BASE);
1079
- if (adv.entries.length > 0) {
1080
- lines.push('[Huginn Advisory] ' + adv.unread + '/' + adv.entries.length + ' unread (last 14d) -- advisory->task requires live baseline verification');
1081
- for (const e of adv.entries.slice(0, 3)) {
1082
- lines.push(' ' + e.ts.slice(0, 10) + ' ' + (e.title || '(untitled)'));
1083
- }
1084
- }
1085
- lines.push('(快速 boot · 無 gate · 完整 ceremony 用 /Ansuz --full)');
1025
+ const peerLines = await fetchPendingPeerLines(mcpBase, WISH_TIMEOUT_MS, IS_PINNED ? BASE : process.env.CLAUDE_PROJECT_DIR || process.cwd());
1026
+ for (const l of peerLines) lines.push(l);
1027
+ lines.push('(boot 完成:依 Open cards 提議程;小修正直接做,中型工作開卡派工)');
1086
1028
  process.stdout.write(lines.join(String.fromCharCode(10)) + String.fromCharCode(10));
1087
1029
  }
1088
1030
 
@@ -1103,6 +1045,8 @@ module.exports = {
1103
1045
  hintNamesThisSession,
1104
1046
  fetchOpenWishes,
1105
1047
  formatWishesLine,
1048
+ formatPeerMailLines,
1049
+ fetchPendingPeerLines,
1106
1050
  scanFieldReportCardIds,
1107
1051
  computeNewFieldReportCount,
1108
1052
  countOpenNeedsTriageCards,
@@ -30,7 +30,7 @@ const {
30
30
  resolveBackendLogPath, readBackendLogTailSync,
31
31
  formatCortexSyncAnomaly, cortexSyncAnomalyLine,
32
32
  readProjectsJsonSync,
33
- getProjectName,
33
+ getProjectName, formatPeerMailLines, fetchPendingPeerLines,
34
34
  } = require('./ansuz-boot-fast');
35
35
 
36
36
  async function server(t, handler) {
@@ -703,3 +703,47 @@ test('countCommitsSinceHeimdallScan counts records newer than the last scan', ()
703
703
  assert.equal(formatHeimdallScanLine(0), null);
704
704
  } finally { fs.rmSync(dir, { recursive: true, force: true }); }
705
705
  });
706
+
707
+ // ── TASK_2392: slim banner (session id, open cards, wishes, pending peer mail) ──
708
+
709
+ test('formatPeerMailLines: pending_count > 0 -> one line; 0 / missing -> none', () => {
710
+ assert.deepEqual(formatPeerMailLines({ pending_count: 0 }), []);
711
+ assert.deepEqual(formatPeerMailLines(null), []);
712
+ const l = formatPeerMailLines({ pending_count: 2 });
713
+ assert.equal(l.length, 1);
714
+ assert.match(l[0], /Peer mail: 2 pending/);
715
+ });
716
+
717
+ test('formatPeerMailLines: waiting_roots from another room are appended (counts only)', () => {
718
+ const l = formatPeerMailLines({ pending_count: 0, waiting_roots: [{ label: 'Room', project_id: 'p1', path: 'C:/x', count: 3 }] });
719
+ assert.equal(l.length, 1);
720
+ assert.match(l[0], /\[peer\] 3 message\(s\)/);
721
+ });
722
+
723
+ test('fetchPendingPeerLines: reads /api/peer/status; unreachable -> []', async (t) => {
724
+ let seen = '';
725
+ const base = await server(t, (req, res) => { seen = req.url; res.end(JSON.stringify({ pending_count: 4 })); });
726
+ const lines = await fetchPendingPeerLines(base, 1000, os.tmpdir());
727
+ assert.match(seen, /^\/api\/peer\/status\?limit=1&projectPath=/);
728
+ assert.match(lines[0], /4 pending/);
729
+ assert.deepEqual(await fetchPendingPeerLines('http://127.0.0.1:1', 300, os.tmpdir()), []);
730
+ });
731
+
732
+ test('boot subprocess prints the slim banner: no handoff / Multi-Ansuz / ANOMALY / lease side effects', (t) => {
733
+ const { spawnSync } = require('node:child_process');
734
+ const sb = fs.mkdtempSync(path.join(os.tmpdir(), 't2392_'));
735
+ t.after(() => fs.rmSync(sb, { recursive: true, force: true }));
736
+ for (const d of ['backlog', 'active', 'done', 'blocked', 'cancel']) fs.mkdirSync(path.join(sb, '.kenaz', 'tasks', d), { recursive: true });
737
+ fs.mkdirSync(path.join(sb, '.kenaz', 'specialist', 'handoffs'), { recursive: true });
738
+ fs.writeFileSync(path.join(sb, '.kenaz', 'tasks', 'backlog', 'TASK_9_demo.yaml'), 'id: TASK_9\ntitle: demo card\nstatus: backlog\npriority: P1\n');
739
+ fs.writeFileSync(path.join(sb, '.kenaz', 'specialist', 'handoffs', 'a.json'), JSON.stringify({ topic: 'T', generated_at: '2026-10-01T00:00:00Z' }));
740
+ const r = spawnSync(process.execPath, [path.join(__dirname, 'ansuz-boot-fast.js'), '--project-path=' + sb, '--conversation-id=sess-2392', '--mcp-base-url=http://127.0.0.1:1'],
741
+ { encoding: 'utf8', cwd: sb, env: { ...process.env, CLAUDE_PROJECT_DIR: sb }, timeout: 30000 });
742
+ assert.equal(r.status, 0, r.stderr);
743
+ assert.match(r.stdout, /\[session\] conversation_id=sess-2392/);
744
+ assert.match(r.stdout, /Open cards:/);
745
+ assert.match(r.stdout, /TASK_9 \[backlog P1\] demo card/);
746
+ assert.doesNotMatch(r.stdout, /Handoff|Multi-Ansuz|ANOMALY|📊/);
747
+ assert.equal(fs.readdirSync(path.join(sb, '.kenaz', 'specialist', 'handoffs')).length, 1, 'handoff slot not archived');
748
+ assert.equal(fs.existsSync(path.join(sb, '.kenaz', 'specialist', 'sessions', 'leases')), false, 'no lease registered');
749
+ });
@@ -1 +1 @@
1
- 0.3.1
1
+ 0.3.3